Vai al contenuto
PLC Forum


Ricerca di un allarme attivo


MaxT1978

Messaggi consigliati

Buongiorno a tutti,

in un altro topic ("spostamento dati") si discuteva che con i nuovi PLC 1200 e 1500 si cerca di svincolarsi dagli indirizzamenti assoluti (giustamente), ma anche dall'uso di puntatori, che appunto si appoggiano per forza alla struttura della memoria e quindi agli indirizzi assoluti. Apro questo topic per chiedervi un metodo efficiente per fare la seguente operazione:

- descrivo gli stati di una valvola con un udt e tra questi stati c'è anche quello di allarme generico;

- ho un DB che contiene n stati di valvole e voglio sapere se c'è almeno una valvola in allarme.

Francamente un modo efficiente, secondo me è di risolverlo con un loop tra gli stati delle valvole del DB. Quindi col 1500 si farebbe con le istruzioni PEEK e POKE calcolandosi preventivamente la lunghezza dell'UDT. Come fareste, altrimenti, senza usare i puntatori?

Vi ringrazio fin d'ora.

MaxT1978

Link al commento
Condividi su altri siti


Io farei un array di UDT di valvole, poi con un ciclo for next scorrerei tutto l'array controllando il bit di allarme, se un bit è a uno so che ho una valvola in allarme.

Link al commento
Condividi su altri siti

5 ore fa, MaxT1978 ha scritto:

Quindi col 1500 si farebbe con le istruzioni PEEK e POKE calcolandosi preventivamente la lunghezza dell'UDT.

Tieni presente che la lunghezza dovrà essere sempre riportata ad un multiplo di 8.
Ma, se ci si vuole svincolare dagli indirizzi assoluti, si deve riportare tutto in un array, o facendo come suggerito da Acquaman (organizzando i dati da subito in un array), oppure usando istruzioni tipo Gather, Gather_Blk, o Serialize.
 

Ti potresti anche creare una funzione alla quale passare tutto l'array come IN/OUT, dichiarando all'interno della funzione questo parametro come array senza dimensione (basta mettere, tra le quadre, il carattere * - Esempio: MyArray [*] of UDT_Valvole).
Con le istruzioni Lower_Bound e Upper_Bound rilevi i limiti dell'array, e li usi per il ciclo FOR.
In questo modo, la funzione andrà sempre bene, anche se cambia la dimensione dell'array.

Link al commento
Condividi su altri siti

Intanto vi ringrazio per le risposte e il confronto.

19 hours ago, acquaman said:

Io farei un array di UDT di valvole, poi con un ciclo for next scorrerei tutto l'array controllando il bit di allarme, se un bit è a uno so che ho una valvola in allarme.

Questo è quello che farei io, però Batta mi da delle indicazioni in più rispetto a un incognita che avevo nel farlo.

16 hours ago, batta said:

Tieni presente che la lunghezza dovrà essere sempre riportata ad un multiplo di 8.
Ma, se ci si vuole svincolare dagli indirizzi assoluti, si deve riportare tutto in un array, o facendo come suggerito da Acquaman (organizzando i dati da subito in un array), oppure usando istruzioni tipo Gather, Gather_Blk, o Serialize.
 

Ti potresti anche creare una funzione alla quale passare tutto l'array come IN/OUT, dichiarando all'interno della funzione questo parametro come array senza dimensione (basta mettere, tra le quadre, il carattere * - Esempio: MyArray [*] of UDT_Valvole).
Con le istruzioni Lower_Bound e Upper_Bound rilevi i limiti dell'array, e li usi per il ciclo FOR.
In questo modo, la funzione andrà sempre bene, anche se cambia la dimensione dell'array.

In TIA, non credo che ci sia nemmeno dalla 17, non c'è l'istruzione "sizeof" come vorrebbe lo standard 61131-3 (che Siemens d'accordo non rispetta, ma almeno le basi...) e quindi avevo già letto che si poteva passare tramite l'istruzione "serialize", ma non conoscevo il particolare del multiplo di 8 (per la gestione a byte della memoria probabilmente). Ma quindi se gli stati  della valvola sono per esempio 5, è meglio aggiungere 3 spare per arrivare al primo multiplo di 8, corretto?

Non conoscevo le istruzioni Gather e Gather_Blk, ma ci do' un'occhiata. Grazie anche per l'ultimo suggerimento per trattare array di dimensione variabile all'interno di una funzione.

MaxT1978

Link al commento
Condividi su altri siti

2 ore fa, MaxT1978 ha scritto:

non c'è l'istruzione "sizeof" come vorrebbe lo standard 61131-3 (che Siemens d'accordo non rispetta, ma almeno le basi...)

Non ci sarà sizeof, ma perché dici che Siemens non rispetta nemmeno le basi dello standard 61131-3?
Tra l'altro, non sono nemmeno sicuro che SizeOf faccia parte dello standard IEC 61131-3.
 

2 ore fa, MaxT1978 ha scritto:

Ma quindi se gli stati  della valvola sono per esempio 5, è meglio aggiungere 3 spare per arrivare al primo multiplo di 8, corretto?

Meglio aggiungerli, che te li troveresti come riserve già pronte in caso di bisogno.
Comunque, con l'istruzione Serialize verrebbero aggiunti in automatico.

Che poi risulta anche più comodo. Se lo stato delle valvole lo metti in un array di byte, un byte per ogni valvola, è poi facile fare il controllo. Se in quell'array di byte, nel primo byte ci fosse un pezzo della prima valvola ed un pezzo della seconda, come faresti il controllo?

 

Modificato: da batta
Link al commento
Condividi su altri siti

 

1 hour ago, batta said:

Non ci sarà sizeof, ma perché dici che Siemens non rispetta nemmeno le basi dello standard 61131-3?

non ho fatto una ricerca, ma manca il concetto di programmazione agli oggetti; inoltre è stato introdotto dalla v15 l'istruzione REF; stringhe più lunghe di 256 caratteri sono state introdotte con TIA e non mi ricordo da che vs,...
Inoltre REF la puoi usare solo su memoria ottimizzata e quindi non puoi usare l'istruzione che ha il concetto di SIZEOF, ma se Siemens ha implementato REF per essere compatibile con lo standard, allora ne ha traviato il significato perchè non è quello il concetto espresso nel 61131. 

Comunque anche se non compatibile o solo in parte con lo standard, l'importante sarebbe che Siemens, sempre di più, aggiungesse istruzioni che permettono una programmazione più di alto livello.

 

1 hour ago, batta said:

Meglio aggiungerli, che te li troveresti come riserve già pronte in caso di bisogno.
Comunque, con l'istruzione Serialize verrebbero aggiunti in automatico.

Che poi risulta anche più comodo. Se lo stato delle valvole lo metti in un array di byte, un byte per ogni valvola, è poi facile fare il controllo.

 

Ok, adesso mi torna. 

 

 

quote: Se in quell'array di byte, nel primo byte ci fosse un pezzo della prima valvola ed un pezzo della seconda, come faresti il controllo? come faresti il controllo?

 

Mi appoggerei sempre e comunque ad un UDT e farei poi un array di UDT e il controllo lo userei andando a indicizzare l'offset nelle istruzione di PEEK.

 

Grazie mille Batta!

 

MaxT1978

 

Link al commento
Condividi su altri siti

1 ora fa, MaxT1978 ha scritto:

l'importante sarebbe che Siemens, sempre di più, aggiungesse istruzioni che permettono una programmazione più di alto livello.

Come linguaggio di programmazione di PLC,non mi pare che sia indietro.
A quanto mi risulta, sono ben pochi i PLC che accettano una vera programmazione ad oggetti. Che poi, sinceramente, per un PLC non mi pare nemmeno così importante.

Link al commento
Condividi su altri siti

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...