Problemi su FB ModbusMaster
Home › Forum › Programmazione IEC 61131 (LogicLab) › Problemi su FB ModbusMaster
- Questo topic ha 11 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 1 anno, 9 mesi fa da
Sergio Bertana.
-
AutorePost
-
Aprile 5, 2016 alle 1:19 pm #35989
Lucio
PartecipanteStò leggendo dei registri di alcuni slave tramite la FB ModbusMaster con una struttura tipo CASE. Sulle letture e scritture di registri non ci sono problemi ma andando a leggere con comando 01 dei singoli coil dello slave il CASE con esegue piu alcuni passi.
Per spiegarmi meglio ho 10 CASE (da 0 a 9), se inserisco un comando 01 (read coil status) il programma non esegue piu i CASE 7-8-9. Se tolgo il codice li esegue; Cosa potrebbe essere?
PS: è corretto quando leggo un singolo COIL attribuire MDB.Buffer:=ADR(miavariabileBOOL) o devo usare una word ?
Aprile 7, 2016 alle 2:43 pm #39506Sergio Bertana
Amministratore del forumQuando mi parli di programma gestito a cases immagino che hai diversi cases dove in ognuno di essi trasferisci nelle variabili di configurazione del FB ModbusMaster i parametri per eseguire il comando. In tal caso ti consiglierei di utilizzare invece un array con le definizioni come riportato in questo topic (Stampa programma).
Quello che hai evidenziato è purtroppo un bug del FB, siccome il comando 16#01 Read coil status ritorna i coils raggruppati a byte (8 BOOL) od a multipli di bytes. La FB erroneamente trasferisce il valore di 8 BOOL, o multipli di 8, nel buffer puntato da MDB.Buffer. Per spiegarmi meglio se leggi da 1 a 7 coils verranno valorizzati 8 BOOL consecutivi, se leggi da 8 a 15 coils verranno valorizzati 16 BOOL consecutivi e così via.
Sicuramente tu hai definito il tuo buffer miavariabile BOOL come un array di BOOL che ha un numero di elementi inferiore ad 8 e questo fà “sporcare” un’altra varibile che il compilatore ha allocato di seguito alla tua.
Workaround fino alla soluzione del bug, allocare un buffer di dimensione adatta al numero di BOOL realmente valorizzati dal FB.
Maggio 3, 2016 alle 2:01 pm #39548Lucio
PartecipanteGrazie, ho risolto creando l’array di word. Ora ho un problema a scrivere registri multipli; nell’esempio:
StingaScrittura è definita come array[0..5]
Il programma esegue:
MMdb.FCode:= 16; (* Modbus function *)
MMdb.Points:=6;
MMdb.Address:=9; (* Comfotr =1 Ridotta =0*)
MMdb.Buffer:=ADR(StingaScrittura[0]);Mi trovo il primo registro scritto correttamente, gli altri no, dove sbaglio ?
Maggio 3, 2016 alle 3:48 pm #39549Sergio Bertana
Amministratore del forumMi sembra tutto corretto… L’array StringaScrittura è un array di WORD immagino…
Quando dici mi trovo il primo registro scritto corretamnete, gli altri no… io intendo che tu sul dispositivo su cui il FB scrive puoi andare a visualizzare i valori dei registri e trovi solo il primo registro corretto.
I registri che scrivi sul tuo dispositivo sono tutte WORD consecutive, non è che hai una WORD e poi una DWORD ecc…
Maggio 4, 2016 alle 11:46 am #39551Lucio
PartecipanteI registri sono tutti di word. Stringascrittura è definita come UINT, corretto o meglio come WORD ?
Maggio 5, 2016 alle 6:07 am #39552Sergio Bertana
Amministratore del forumUINT e WORD si equivalgono, unica differenza che se trascinata nella finestra di watch i valori UINT sono visualizzati in decimale ed i valori WORD in esadecimale.
Non capisco dove possa essere il problema se hai un manuale della apparecchiatura su cui esegui la scrittura e lo invii anche per email a [email protected] magari posso capirne un po di più.
Maggio 5, 2016 alle 9:32 am #39557Lucio
PartecipanteOggi ho sistemato un po il programma; ho notato che nel comando multiplo va il allarme l’FB con codice 10007010 Valore di File non definito.
In tutte le altre letture e scritture sullo stesso slave invece non ho nessun errore. Se scrivo le variabili con un modbuscan non ho nessun problema.
Maggio 9, 2016 alle 6:59 am #39558Sergio Bertana
Amministratore del forumL’errore che riporti indica come dici tu che non è definito il File. Molto strano visto che il file è definito per gli altri comandi.
Mi viene il dubbio che in qualche parte del tuo programma uno spuntamento di pointer e/o una scrittura fuori range in qualche array vada a sporcare il valore di File. Potresti provare a scrivere un semplicissimo programma in ladder con una sola chiamata alla FB ModbusMaster con il comando di scrittura registri incriminato e verificare se funziona.
Giugno 23, 2016 alle 8:37 am #39625Alessandro
PartecipanteHo la necessità di creare una nuova struttura dati, dove nel primo byte avevo necessità di inserire 8 variabili booleane. Dichiarando queste 8 variabili nelle prime 8 posizioni, ed andando a scrivere in modbus su una centralina esterna, sembra che ogni variabile booleana occupi un intero byte.
PLC CENTRALINA
Bool Pos. 0 =true —> 1°bit 1° byte =true
Bool Pos. 1 =true —> 1°bit 2° byte =true
ecc.ecc.Posso in qualche maniera creare una struttura dove 8 variabili booleane siano accodate nello stesso identico byte ?
Giugno 23, 2016 alle 8:38 am #39626Sergio Bertana
Amministratore del forumVediamo di fare chiarezza, le variabili BOOL nell’ambiente LogicLab su SlimLine occupano un byte, quindi se crei una struttura con 8 variabili BOOL questa struttura sarà lunga 8 byte.
Ma se utilizzi per il trasferimento in Modbus su un tuo dispositivo il comando 15 Force multiple coils, il frame modbus avrà un solo byte con tutti gli 8 BOOL all’interno. Poi dipende dal tuo dispositivo allocarli in bit o byte in funzione della sua architettura.
Agosto 2, 2023 alle 12:09 pm #73356Alex M
PartecipanteCosa significa “comando multiplo va”?
Agosto 2, 2023 alle 2:04 pm #73360Sergio Bertana
Amministratore del forum“comando multiplo va” è un errore di scrittura intendeva dire che utilizzando il comando di lettura o scrittura multipla il FB genera un errore.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.