Home › Forum › Terminali operatore (Weintek) › Connessione in modbus RTU utilizzando una macro
- Questo topic ha 2 risposte, 2 partecipanti ed รจ stato aggiornato l'ultima volta 15 anni, 4 mesi fa da
Sergio Bertana.
-
AutorePost
-
Maggio 12, 2011 alle 12:09 pm #35013
Anonimo
InattivoHo 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, ErrorsFILL(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]=0x4FOUTPORT(Command[0], “Free Protocol”, 8) //Send command
INPORT(Response[0], “Free Protocol”, 7, RetValue) //Read responseif (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 ifSetData(Errors, “Local HMI”, LW,101,1)
end macro_commandMaggio 12, 2011 alle 12:13 pm #36738Sergio Bertana
Amministratore del forumLa 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.
Maggio 12, 2011 alle 12:42 pm #36739Sergio Bertana
Amministratore del forumTi 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 -
AutorePost
- Devi essere connesso per rispondere a questo topic.