VINZENT Inserito: 27 dicembre 2016 Segnala Inserito: 27 dicembre 2016 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
kizmeth Inserita: 27 dicembre 2016 Segnala Inserita: 27 dicembre 2016 usa lo XOW (xor a word) o XOD (double) in un loop.
VINZENT Inserita: 27 dicembre 2016 Autore Segnala Inserita: 27 dicembre 2016 perdonami..programmo in KOP
STEU Inserita: 28 dicembre 2016 Segnala Inserita: 28 dicembre 2016 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.
VINZENT Inserita: 28 dicembre 2016 Autore Segnala Inserita: 28 dicembre 2016 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.
odx Inserita: 28 dicembre 2016 Segnala Inserita: 28 dicembre 2016 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.
VINZENT Inserita: 28 dicembre 2016 Autore Segnala Inserita: 28 dicembre 2016 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.
odx Inserita: 29 dicembre 2016 Segnala Inserita: 29 dicembre 2016 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.
Livio Orsini Inserita: 29 dicembre 2016 Segnala Inserita: 29 dicembre 2016 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.
JumpMan Inserita: 31 dicembre 2016 Segnala Inserita: 31 dicembre 2016 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
JumpMan Inserita: 31 dicembre 2016 Segnala Inserita: 31 dicembre 2016 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 .
Livio Orsini Inserita: 31 dicembre 2016 Segnala Inserita: 31 dicembre 2016 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.
JumpMan Inserita: 31 dicembre 2016 Segnala Inserita: 31 dicembre 2016 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.
Cesare Nicola Inserita: 4 gennaio 2017 Segnala Inserita: 4 gennaio 2017 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.
Livio Orsini Inserita: 4 gennaio 2017 Segnala Inserita: 4 gennaio 2017 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.
JumpMan Inserita: 4 gennaio 2017 Segnala Inserita: 4 gennaio 2017 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).
Livio Orsini Inserita: 5 gennaio 2017 Segnala Inserita: 5 gennaio 2017 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.
JumpMan Inserita: 5 gennaio 2017 Segnala Inserita: 5 gennaio 2017 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.
Livio Orsini Inserita: 5 gennaio 2017 Segnala Inserita: 5 gennaio 2017 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
dodoplc Inserita: 6 gennaio 2017 Segnala Inserita: 6 gennaio 2017 Nel 1200 l'awl non c'è e poi non tutto quello che si scrive in awl può essere convertito in kop
JumpMan Inserita: 7 gennaio 2017 Segnala Inserita: 7 gennaio 2017 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)
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora