Vai al contenuto

Problemi su FB ModbusMaster

Home Forum Programmazione IEC 61131 (LogicLab) Problemi su FB ModbusMaster

Stai visualizzando 12 post - dal 1 a 12 (di 12 totali)
  • Autore
    Post
  • #35989
    Lucio
    Partecipante

    Stò 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 ?

    #39506
    Sergio Bertana
    Amministratore del forum

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

    #39548
    Lucio
    Partecipante

    Grazie, 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 ?

    #39549
    Sergio Bertana
    Amministratore del forum

    Mi 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…

    #39551
    Lucio
    Partecipante

    I registri sono tutti di word. Stringascrittura è definita come UINT, corretto o meglio come WORD ?

    #39552
    Sergio Bertana
    Amministratore del forum

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

    #39557
    Lucio
    Partecipante

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

    #39558
    Sergio Bertana
    Amministratore del forum

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

    #39625
    Alessandro
    Partecipante

    Ho 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 ?

    #39626
    Sergio Bertana
    Amministratore del forum

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

    #73356
    Alex M
    Partecipante

    Cosa significa “comando multiplo va”?

    #73360
    Sergio 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.

Stai visualizzando 12 post - dal 1 a 12 (di 12 totali)
  • Devi essere connesso per rispondere a questo topic.