Vai al contenuto
PLC Forum


Confronto Blocco Dati


VINZENT

Messaggi consigliati

Ragazzi, un piccolo suggerimento.

Ho un blocco dati formato da x booleani che ad ogni booleano corrisponde un allarme.

Vorrei confrontare l'intero blocco dati con un valore pari a 0 oppure ad un blocco dati della stessa dimensione e struttura in modo da avere un risultato se il blocco dati e diverso da 0.

Spero di essere stato chiaro.

In sostanza vorrei confrontare il blocco dati degli allarmi con un blocco dati identico e se non sono uguali deve restituirmi un bit a 1

Grazie

 

Link al commento
Condividi su altri siti


Sinceramennte non ho capito proprio bene se devi verificare che tutti i buleani del tuo blocco dati devono essere a 0 , oppure devi confrontare un blocco dati con un altro.

E comunque se vuoi farlo in KOP e non vuoi usare i puntatori devi fare una serie di confronti tra i 2 blocchi dati , o tra il blocco dati e 0.

Link al commento
Condividi su altri siti

Fondamentalmente devo confrontare due blocchi dati gemelli e avere un risultato in booleano vero o falso.

Ho provato a fare un puntatore con il blocco XOR ma mi da' errore sul puntatore perche' dice che non e' possibile farlo.

 

 

Link al commento
Condividi su altri siti

confronta la word intera no ?  la metti = .... oppure   <> e ti da il risultato di confronto .....  

 

un blocco "booleano" è una word ... dword ... quello che sia, usi il blocchetto di confronto. Puoi fare un confronto con altra word, o con zero.

Link al commento
Condividi su altri siti

no un confronto diretto mi porta via molti confronti...pensavo di confrontare direttamente due blocchi dati , di cui uno tutto a "0" confrontato con quello di lavoro.

 

 

 

Link al commento
Condividi su altri siti

Non mi vengono in mente soluzioni preconfezionate .... al più potresti crearti una FB tu con in ingresso i due blocchi e un uscita booleana e dentro i confronti, così fai il lavoro una volta sola.   Oppure lavorare con una stringa di valori .....  sono idee solo.

Link al commento
Condividi su altri siti

Se devi verificare l'uguaglianza dei 2 blocchi la via più ottimizzata è fare un loop che confronta in XOR le doppie words dei 2 blocchi; alla prim adword differente ti fermi e alzi il flag di blocchi diseguali.

In geenre si fa questo confronto alla partenza per verificare che i dati ritenuti non si siano corrotti.

Link al commento
Condividi su altri siti

Se proprio vuoi farlo in KOP devi confrontare ad una ad una tutte le doubleword come ti hanno già detto.

<<<esempio>>>

(Il segmento 2 lo ripeti per tutte le doubleword delle db)

L'esempio è per il 300, non uso il 1200.

 

Però farlo in strutturato o in awl risulterebbe molto più elegante, ordinato, ottimizzato, e anche parametrizzabile volendo 

Link al commento
Condividi su altri siti

Quote

Oppure lavorare con una stringa di valori 

Potrebbe essere una buona idea, per esempio nel 300 c'è un FC di biblioteca che compara 2 stringhe di 254 bytes e restituisce un bit true in caso di disuguaglianza, ma non so se c'è anche nel 1200 e se riesci a trattare come stringa dei dati già definiti come bool .

Link al commento
Condividi su altri siti

Ma anche in KOP si può fare un loop di "n" ricorsi.

Il confronto per double in loop è il più ottimizzato per tempi e occuoazione.

Anche lo FC di biblioteca che compara le stringhe, alla fine esegue un loop.

Anche se si potesse usare lo asm del processore si arriverebbe comunque ad eseguire un loop di confronti.

Link al commento
Condividi su altri siti

Quote

Ma anche in KOP si può fare un loop di "n" ricorsi.

Dipende dal plc, per esempio con il vecchio s7-200 si può fare un ciclo for-next in KOP, ma col 300 in simatic manager, a meno che non mi sfugga qualcosa, non esiste una istruzione simile in KOP.

Se poi esista nel 1200 non lo so, perchè non uso il TIA.

Comunque dipende anche dalla quantità di allarmi da esaminare, se p.es. sono solo 128 bit non vale forse neanche la pena di imbastire puntatori e loop, poi chiaro che se uno vuole fare in FC da utilizzare anche in altri programmi può fare qualcosa di configurabile con parametri ecc.

 

Link al commento
Condividi su altri siti

Cesare Nicola

Oltre alle soluzioni già proposte, io mi sono creato un blocco in ST che conta quanti allarmi sono attivi, perché un cliente me l'ha chiesto. E' parametrizzabile così l'ho mandato al cliente senza preoccuparmi di qual'era il numero della sua DB di allarmi. Se il numero di allarmi attivi è diverso da zero, imposti il bit che ti serve.

 

// Verifica il numero di allarmi attivi
#OUT_num_allarmi := 0;
FOR #Puntatore_byte := #IN_primo_byte_allarmi TO #IN_ultimo_byte_allarmi DO

FOR #Puntatore_bit := 0 TO 7 DO
    IF PEEK_BOOL(area := 16#84,
                     dbNumber := #IN_num_DB,
                     byteOffset := #Puntatore_byte,
                     bitOffset := #Puntatore_bit) THEN
        #OUT_num_allarmi := #OUT_num_allarmi + 1;
    END_IF;
END_FOR;

END_FOR;

Crei un FC con dentro il codice che ho postato e come parametri di ingresso il numero della DB (#IN_num_DB), il primo byte che devi controllare (#IN_primo_byte_allarmi) e l'ultimo (#IN_ultimo_byte_allarmi). Il parametro di uscita #OUT_num_allarmi è il numero di allarmi attivi. #Puntatore_byte e #Puntatore_bit sono variabili Temp in formato INT.

Io non mi ostinerei a programmare in KOP se certe cose si fanno più semplicemente con altri linguaggi.

Link al commento
Condividi su altri siti

Quote

si può fare un ciclo for-next in KOP

 

Non è necessario avere le istruzioni "for-next"

Basta crearsi una variabile che si decrementa ad ogni passaggio, se la variabile non è "0" si salta all'inizio del loop. Il ciclo "for next" esegue esattamente queste istruzioni, solo che non lo vedi direttamente.

Link al commento
Condividi su altri siti

 

Quote

 

Non è necessario avere le istruzioni "for-next"

Basta crearsi una variabile che si decrementa ad ogni passaggio, se la variabile non è "0" si salta all'inizio del loop. Il ciclo "for next" esegue esattamente queste istruzioni, solo che non lo vedi direttamente.

 

Non so se il 1200 permette certe operazioni in KOP, parlo sempre per il 300, come dici tu risolvi il problema del for-next perchè c'è l'istruzione di salto condizionato ma poi incappi in un altro problema, non puoi gestire puntatori o indicizzare variabili in KOP (cosa che invece potevi fare col buon vecchio s7-200).


 

Link al commento
Condividi su altri siti

Sono più di 20 anni, fortunatamente, che non uso quella ciofeca immonda dello step7, però quel lavoro di confronto l'ho sempre fatto però io usavo AWL.

Link al commento
Condividi su altri siti

Infatti, in AWL puoi fare tutto.

PLC di altre marche hanno la possibilità di eseguire tutte le istruzioni anche in KOP, p.es. il Rockwell permette anche di scrivere una formula matematica più o meno complessa dentro un blocchetto KOP.

 

Qualcuno che usa il TIA potrebbe scrivere se anche nel 1200 il KOP è limitato e se certe cose (visto che AWL non c'è più) debbano per forza esser scritte in ST ?

La domanda non è per me, io userei ST, ma per l'autore del post che mi sembra abbia detto programmi solo in KOP.

Link al commento
Condividi su altri siti

Ma sei sicuro che non si possa fare anche in KOP?  Dai miei ricordi c'è il passaggio automatico da AWL a KOP e viceversa.

Il KOP è ottimo per realizzare sequenze booleane, ma per il resto AWL è meglio ed è anche semplicissimo ed intuitivo, nonostante sia siemens:)

Link al commento
Condividi su altri siti

Premetto che già nell'era preistorica con S5 avevo un blocco FB portabile con parametri scritto in AWL che faceva la scansione indicizzata di un numero configurabile di bytes di una DB che conteneva i bit di allarme, l'FB restituiva in uscita un bit di "presenza allarmi" e un bit di "nuovo allarme" (faceva anche altro ma non lo scrivo per non appesantire).

Se ho ben capito lo scopo iniziale del topic, alla fine si vuole solo avere il bit "presenza allarmi" e se ho intuito bene il confronto tra 2 DB potrebbe servire invece per verificare una variazione negli allarmi e quindi avere il bit che io chiamo "nuovo allarme".

Bene, per fare questo non è nemmeno necessario avere conoscenze di programmazione in ST o AWL, ma si può fare tutto benissimo in KOP e senza salti nè puntatori nè loops, a dispetto dei puristi che programmano esclusivamente in ST e denigrano il KOP (per dirla in generale, senza alcun riferimento ad alcuna persona di questo forum !!!).

Se avete voglia potete dare una occhiata all' esempio che ho messo <<<qui>>> 

(consiglio di non scaricarlo ma di visualizzarlo direttamente zoomando con la rotella del mouse, mi sembra più comodo il visualizzatore online)

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