Vai al contenuto
PLC Forum


Contatore


Messaggi consigliati

Inserito:

devo usare un contatore per numerare le accensioni e gli spegnimenti di una pompa per monitorarne la durata l´usura ecc... ho visto che il campo di un contatore e´ da 0 a 999, dato che di sicuro i ciclo di una pompa e´ maggiore di 999 attacchi/stacchi come posso ottenere un numeratore sull´ordine dei 1000000 ?

grazie a tutti.

Davide


Inserita:

Non dici niente relativamente al tipo di ingrsso, da cui si presuppine che sia un ingresso standard.

Per crearti il conteggio che soddisfi le dimensioni necessarie devi grearti una variabile in doppia parola, poi ogni volta che riconosci (comandi) un'accensione incrementi di uno la tua variabile.

Inserita:

Supponendo che usi un PLC SIEMENS S7,

e usi un contatto digitale in ingresso per rilevare

la marcia o l'arresto della pompa (1=marcia;0=arresto)

ti posso suggerire il seguente codice AWL:

U E 0.0 //contatto pompa

FP M 0.0 //Merker di appoggio 1 ciclo fronte di salita

O

U E 0.0

FN M 0.1 //Merker di appoggio 1 ciclo fronte di discesa

SPBN M001 //salta se RLC = 0

L MD 20 //doppia word che contiene il numero di avvaimenti/arresti

L L#1 //numero Dword costante

+D //addizione di due numeri Dword

T MD 20 //trasferimento del risultato in MD 20

M001: NOP 0 //se sopra RLC = 0 salta quì e non fa niente

Spero che ti sia d'aiuto! :rolleyes:

Ciao!

Inserita:

grazie mille a tutti............come sempre molto gentili e competenti!

grazie davide

Inserita:

ho risolto cosi´ il contatore attacchi stacchi della pompa, puo´ andare?

spero di non aver scritto delle bestialita´.....in caso chiedo perdono :unsure:

grazie a tutti come sempre.

Davide

Network 1

________

| SR |

M(0.0) | |

E0.0--------|P | ----- - ----- | S |

| |

| |

E0.0 -----------| R Q|----JMP(M0.1)

|_______ |

Network 2

__Label_____

---------------|

M0.1 |

---------------|

__________ |

___________

| ADD_R |

M(0.0) | |

E0.0--------|P | ----- - ----- |EN OUT |----DW20

| |

C#1------|IN1 |

| ENO |---- = A4.0

DW10------|IN2 |

|__________ |

___________

| MOVE |

| |

E0.0------- |EN OUT |----DW10

| |

| |

| |---- = A4.0

DW20------|IN |

|__________ |

Simboli Descr tipo

E0.0 segnale pompa bool

M0.0 merker pompa bool

M0.1 merker JMP bool

C#1 valore da sommare

per ogni attacco +1 word

DW10 numero attacchi al

ciclo precedente double word

DW20 numero attacchi al

ciclo attuale double word

Inserita:

Così è difficile comprendere!

Metti il codice in AWL!

Ciao!

Inserita:

ho risolto cosi´ il contatore attacchi stacchi della pompa, puo´ andare?

spero di non aver scritto delle bestialita´.....in caso chiedo perdono :unsure:

grazie a tutti come sempre.

Davide

linguaggio :FUP

Network 1

.........................................(SR)

................M(0.0)

E0.0--------|P | ------------S

.

.

E0.0 ------------------------ R.......Q-----JMP(M0.1)

Network 2

....Label...

.....M0.1...

...............

................................................(ADD_R)........

..............M(0.0)

E0.0--------|P |-------------------EN........ OUT----DW20

.

..............................C#1-------IN1

...........................................................ENO------ = A4.0

..............................DW10-----IN2

..................................................( MOVE)

.

..............................E0.0--------EN...........OUT----DW10

.

.

.

................................DW20-----IN

..................................................................---- = A4.0

Simboli Descr tipo

E0.0 segnale pompa bool

M0.0 merker pompa bool

M0.1 merker JMP bool

C#1 valore da sommare

per ogni attacco +1 word

DW10 numero attacchi al

ciclo precedente double word

DW20 numero attacchi al

ciclo attuale double word

Inserita:

AWL non lo conosco purtroppo......conosco solo FUP :(

Inserita:

Da KOP o FUP è sempre possibile andare in AWL, fai cosi:

in step 7 nell'editor KOP/FUP/AWL -> menu visualizza -> voce AWL!

ti compare il codice AWL, lo copi e lo incolli sul post!

Ciao!

Inserita:

l´ho fatto che conta solo gli attacchi della pompa.

I0.0 contatto pompa

M0.0 merker pompa

M0.1 merker JMP

ID1 costante uguale a +1

ID10 numero attacchi ciclo precedente

ID20 numero attacchi ciclo attuale

Network1

A I 0.0

FP M 0.0

S M 0.1

A I 0.0

R M 0.1

A M 0.1

JC M001

network2

M001: A I 0.0

JNB _001

L ID 1

L ID 10

+R

T ID 20

AN OV

SAVE

CLR

_001: A BR

= Q 4.0

Network3

A I 0.0

JNB _002

L ID 20

T ID 10

SET

SAVE

CLR

_002: A BR

= I 0.0

Matteo Montanari
Inserita: (modificato)

Hai utilizzato un +R senza avere numeri decimali, quindi risulta essere sprecato, utilizza un +D, la "quantità" di dati è la stessa (4 byte) ma almeno non "spechi" nulla

se vuoi fare il fronte di salita con un set/reset, nel ramo di reset devi utilizzare la "funzione" inversa che nel ramo di set

la creazione del fronte di salita (o discesa) è uguale normalmente viene fatta in questo modo:

   I    aux     fs
-[ ]----[/]----( )-

   I            aux
-[ ]-----------( )-
ed utilizzi 2 rami, per riportarli tutti in un unico ramo:
   I    aux     fs     aux
-[ ]----[/]----(#)----[s]
   I                   [ ]             
-[/]------------------[r]

Modificato: da keosmm
Inserita:

non male il livello di complicazione ! , supponendo invece che usi un plc non-siemens

marcia pompa poscoil inizio marcia

inizio marcia add(dw) avviamenti + 1 = avviamenti

che vuol dire quando la pompa va in marcia genero un one-shot, questo flag addiziona 1 ad una variabile a 32 bit

la capacita' di conteggio e' di 2.147.483.648 avviamenti, puoi aggiunge una riga che dice

se avviamenti => 2.147.483.648 avviamenti = 0 , cioe' ricominciare da capo

Inserita:

Il codice che hai postato non serve a niente se non a fare confusione!

comunque non preoccuparti! Non capisco cosa è il numero di cicli prcedente e cosa ti serve, ti puoi spegare meglio?

precedente a cosa?

Se non sbaglio la definizione del tuo problema è la seguente:

hai una pompa che si attiva con un uscita del PLC,

con un contatto in ingresso controlli lo stato della pompa (0=pompa OFF; 1=pompa ON),

devi contare solo il numero di inserzioni della pompa

è giusto così?

Inserita:

ehm.... ;) mi sono dimenticato di mettere una negazione al segnale I0.0 prima di entrare nel´ingresso R.

... :unsure: ho complicato tutto ma usando step 7 da una sett non mi era venuto in mente altro...

cosa vuol dire che devo usare un +D per non sprecare? in Fup a cosa corrisponde +D?

grazie e ciao!

Inserita:

+D è addizione di due numeri interi doppia word!

+R è addizione di due numeri in virgola mobile!

Matteo Montanari
Inserita: (modificato)
U E 0.0 //contatto pompa

FP M 0.0 //Merker di appoggio 1 ciclo fronte di salita

O

U E 0.0

FN M 0.1 //Merker di appoggio 1 ciclo fronte di discesa

SPBN M001 //salta se RLC = 0

L MD 20 //doppia word che contiene il numero di avvaimenti/arresti

L L#1 //numero Dword costante

+D //addizione di due numeri Dword

T MD 20 //trasferimento del risultato in MD 20

M001: NOP 0 //se sopra RLC = 0 salta quì e non fa niente

la traduzione a "contatti" di quanto riportato da "elsabz" è abbastanza semplice da realizzare, almeno per qualcuno che ha dimestichezza con AWL o nel passaggio tra vari linguaggi...

riportando quanto ti ho suggerito "sopra"

"U E 0.0 //contatto pompa

FP M 0.0 //Merker di appoggio 1 ciclo fronte di salita"

  I    aux1    fs     aux2
-[ ]----[/]----(#)----[s]
  I                    [ ]             
-[/]------------------[r]
"U E 0.0 //contatto pompa FN M 0.1 //Merker di appoggio 1 ciclo fronte di discesa"
  I    aux2    fd     aux2
-[/]----[/]----(#)----[s]
  I                    [ ]             
-[ ]------------------[r]
ora hai i due fronti (salita e discesa) attivi quando metti in moto la pompa e quando la fermi con entrambi i "segnali" incrementi il contatore di un unità: "L MD 20 //doppia word che contiene il numero di avvaimenti/arresti L L#1 //numero Dword costante +D //addizione di due numeri Dword T MD 20 //trasferimento del risultato in MD 20"
  fs               ADD_DI
-[ ]--o--------[           ]----
  fd   |   VD0  [           ]             
-[ ]--|     1  [           ] VD0

anzichè utilizzare "ID 10 o ID 20" che sono canali di ingresso ti conviene utilizzare o memorie (MD0) oppure data memory (VD0, come nell'esempio) in quanto un domani potresti mettere la scheda di ingresso (o di uscita) ed avere dei problemi nella gestione del software

Modificato: da keosmm
Inserita:

si il problema e´ quello :( .

:blink: il numero precedente e´ il numero di volte che la pompa si e´ accesa fino al ciclo precedente a quello in atto (n-1) quello in atto e´ l´n-esimo.

mi sono dimenticao di negare l´ingresso a R nel SR.

Inserita:

Faresti meglio ad usare il mnemonico tedesco!

È il più usato è quindi più comprensibile da tutti!

Inserita:

Per mè stai facendo confusione già a livello di definizione del problema!

Il contatore delle inserzione è uno solo (doppia word) e per fare questo conteggio ti serve solo questo!

Inserita:

ma usando il solo rilevamento fronte di salita io conto solo gli attacchi quindi ne utilizzo solo uno di contatori..

Inserita:

Hai detto che devi soltanto contare gli attacchi della pompa, o sbaglio?

Inserita:

Una traduzione del codice ancora più semplice potrebbe essere la seguente:

Segmento 1:

A I 0.0

FP M 0.0

O(

A I 0.0

FN M 0.0

)

JCN M001

Segmento 2:

L MD 20

L L#1

+D

T MD 20

NOP 0

Segmento 3: (in AWL per forza)

M001: NOP 0

Se copi il codice nell'editor in modalità AWL e poi passi in KOP dovrebbe funzionare!

Matteo Montanari
Inserita:

allora modifica l'esempio in questo modo:

 fs               ADD_DI                  MOV_DW
-[ ]--o--------[           ]------------[           ]
 fd    |   VD4  [           ]            [           ]            
-[ ]--|     1  [           ] VD0    VD0 [           ] VD4
per me non ha senso utilizzare una variabile per visualizzare un valore (n-1) a meno che non ti serva da qualche altra parte, in questo caso specifico, come anche nel tuo esempio viene aggironata continuamente e quindi assume sempre lo stesso valore, per tanto utilizza la varibile (VD0) stessa. io utilizzarei il medesimo contatore per eseguire il conteggio, volendo lo puoi azzerare quando cambi il ciclo, ed eventualmente memorizzare il valore in un altra area di dati:
 fs               ADD_DI 
-[ ]--o--------[           ]
 fd    |   VD0  [           ] 
-[ ]--|     1  [           ] VD0
 fsNuovoCiclo    MOV_DW                   MOV_DW
-[ ]-----------[           ]------------[           ]
                [           ]            [           ]            
           VD0  [           ] VD4      0 [           ] VD0

in questo caso su VD0 hai il conteggio del ciclo attuale (che si incementa), su VD4 hai il conteggio del ciclo precedente (che rimane fisso)

Inserita:

ora provo...intanto grazie mille.

quello che avevo scritto io andrebbe bene o no?

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...