Vai al contenuto

Connessione in modbus RTU utilizzando una macro

Home Forum Terminali operatore (Weintek) Connessione in modbus RTU utilizzando una macro

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #35013
    Anonimo
    Inattivo

    Ho la necessità di realizzare la lettura di un registro modbus RTU da un vostro prodotto SlimLine utilizzando una macro attivata da un pulsante su terminale. Ho un progetto in cui ho definito un dispositivo con protocollo libero Free protocol, impostato i parametri di comunicazione a 15200, e, 8, 1 ed eseguo la lettura del registro 40016.

    Il frame di comando modbus è cablato nel programma, per il calcolo del CRC ho utilizzato il vostro programma Toolly. Agendo sul pulsante la lettura viene eseguita correttamente, ma quando il valore supera 127 nell’oggetto di visualizzazione viene visualizzato un valore negativo, ecco la macro realizzata.

    macro_command main()
    char Command[32], Response[32]
    short RetValue, Data, Errors

    FILL(Command[0],0,32)
    FILL(Response[0],0,32)

    Command[0]=0x01
    Command[1]=0x03
    Command[2]=0x9C
    Command[3]=0x47
    Command[4]=0x00
    Command[5]=0x01
    Command[6]=0x1A
    Command[7]=0x4F

    OUTPORT(Command[0], “Free Protocol”, 8) //Send command
    INPORT(Response[0], “Free Protocol”, 7, RetValue) //Read response

    if (RetValue == 7 and Response[1] == 0x3) then
        Data=(Response[3] << 8)+Response[4]
        SetData(Data[0], “Local HMI”, LW,100,1)
    else
        Errors=Errors+1
    end if

    SetData(Errors, “Local HMI”, LW,101,1)
    end macro_command

    #36738
    Sergio Bertana
    Amministratore del forum

    La macro è corretta, il tuo problema e nella conversione dei dati ricevuti dalla risposta modbus da formato 8 bit char, a formato 16 bit short. I singoli dati char sono considerati con segno, il manuale di riferemto macro riporta Char 8 bits (byte) ±127, quindi valori superiori a 127 sono considerati negativi. Per risolvere il problema devi dichiarare le variabili di tipo unsigned char 8 bits (byte) 0 to 255.

    unsigned char Command[32], Response[32]

    Così facendo il programma funziona correttamente. Allego un programma diviso in una sezione terminale ed una sezione SlimLine per download.

    #36739
    Sergio Bertana
    Amministratore del forum

    Ti ricordo che per effettuare la lettura del registro da mofbus puoi definire un protocollo modbus ed utilizzare questa macro molto più semplice.

    macro_command main()
    short Data

    // Invio comando modbus lettura registro 40016.
    // Occorre dividere indirizzo per 2.

    GetData(Data, “MODBUS RTU”, 3x, 40008, 1)
    SetData(Data, “Local HMI”, LW,100,1) 

    end macro_command

    Se occorre gestire la comunicazione con più dispositivi con diversi nodi modbus è possibile definire il numero di nodo nel modo.

    GetData(Data, “MODBUS RTU”, 3x, 01#40008, 1) //Nodo 1
    GetData(Data, “MODBUS RTU”, 3x, 02#40008, 1) //Nodo 2
    GetData(Data, “MODBUS RTU”, 3x, 64#40008, 1) //Nodo 64

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