Gateway Modbus TCP/RTU per lettura condizionatori
Home › Forum › Discussioni su problematiche generali › Gateway Modbus TCP/RTU per lettura condizionatori
- Questo topic ha 3 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 1 anno, 6 mesi fa da
Sergio Bertana.
-
AutorePost
-
Ottobre 4, 2023 alle 4:19 pm #74201
Anonimo
InattivoHo un progetto domotico da realizzare per il controllo di unità fan-coil di condizionamento. Occorre poter da un sistema master Modbus su rete TCP poter leggere e scrivere i fan-coil su rete Modbus RTU RS485, le varie unità sono uguali quindi avranno slave ID diverso ma stessi registri su cui operare.
Mi occorrerebbe un gateway in grado di gestire le richieste Modbus TCP (Tutte con lo stesso slave ID) reindirizzandole sul Modbus RTU ai diversi slave ID dei moduli. Immaginavo di cambiare lo slave ID in base all’indirizzo del registro, ad esempio
- Comandi con indirizzi da 1 a 15, mappate su slave ID 1 registri 1-15.
- Comandi con indirizzi da 16 a 31, mappate su slave ID 2 registri 1-15.
- Comandi con indirizzi 32 a 47, mappate su slave ID 3 registri 1-15.
- Così via… per 15 moduli fan-coil.
Avete qualche soluzione…
Ottobre 4, 2023 alle 4:36 pm #74206Sergio Bertana
Amministratore del forumIl tuo progetto si può realizzare con i ns sistemi programmabili utilizzando il blocco funzione ModbusGateway. Questo blocco funzione oltre a operare come gateway tra diversi tipi di Modbus può:
- Effettuare modifiche sui frames di comando ricevuti dal master prima di inviarle al sistema slave.
- Effettuare modifiche sui frames di risposta ricevuti dal sistema slave prima di inviarle al sistema master.
Quindi basterà utilizzare l’esempio ST_ModbusGateway riportato nella pagina del manuale FB a cui si dovrà aggiungere il codice per la modifica dei pacchetti di comando e di risposta. Ti posto un esempio del programma.
// ------------------------------------------------------------------------- // PACCHETTI MODBUS DI COMANDO RICEVUTI DA MODBUS TCP // ------------------------------------------------------------------------- // Nodo e indirizzo registro per questi comandi sono in testa al frame. // 16#01 Read coil status // 16#02 Read input status // 16#03 Read holding registers // 16#04 Read input registers // 16#05 Force single coil // 16#06 Preset single register // 16#10 Preset multiple registers // // +----+---+---+---+--- // Frame comando |Node|Cmd|Address|... // +----+---+---+---+--- // ------------------------------------------------------------------------- // Modifica pacchetti comandi ricevuti da Modbus TCP. // L'indirizzo di nodo cambia in funzione dell'indirizzo registro. IF (ITrigger) THEN ITrigger:=FALSE; //Trigger command (Input) // Controllo indirizzo e modifico il nodo di destinazione. ARAddress:=eGetBYTE(MdbGw.DFrame+2); ARAddress:=(ARAddress*256)+eGetBYTE(MdbGw.DFrame+3); CASE (ARAddress) OF 1..15: i:=eSetBYTE(MdbGw.DFrame, 16#01); CRAddress:=ARAddress-0; //Setto nodo 16#01 16..31: i:=eSetBYTE(MdbGw.DFrame, 16#02); CRAddress:=ARAddress-16; //Setto nodo 16#02 END_CASE; // Setto indirizzo registro. i:=eSetBYTE(MdbGw.DFrame+2, TO_BYTE(CRAddress/256)); //Setto MSB i:=eSetBYTE(MdbGw.DFrame+3, TO_BYTE(CRAddress)); //Setto LSB END_IF; // ------------------------------------------------------------------------- // PACCHETTI MODBUS DI RISPOSTA RICEVUTI DA MODBUS RTU // ------------------------------------------------------------------------- // Nodo per questi comandi è in testa al frame. // 16#01 Read coil status // 16#02 Read input status // 16#03 Read holding registers // 16#04 Read input registers // // +----+---+--- // Frame risposta |Node|Cmd|... // +----+---+--- // // Nodo e indirizzo registro per questi comandi sono in testa al frame. // 16#05 Force single coil // 16#06 Preset single register // 16#10 Preset multiple registers // // +----+---+---+---+--- // Frame risposta |Node|Cmd|Address|... // +----+---+---+---+--- // ------------------------------------------------------------------------- // Nelle risposte l'indirizzo di nodo da ritornare è sempre 16#01. IF (OTrigger) THEN OTrigger:=FALSE; //Trigger command (Output) i:=eSetBYTE(MdbGw.DFrame, 16#01); //Setto nodo 16#01 // Setto indirizzo registro nei comandi in cui è previsto CASE (eGetBYTE(MdbGw.DFrame)) OF 16#05, 16#06,16#10: i:=eSetBYTE(MdbGw.DFrame+2, TO_BYTE(ARAddress/256)); //Setto MSB i:=eSetBYTE(MdbGw.DFrame+3, TO_BYTE(ARAddress)); //Setto LSB END_CASE; END_IF; // [End of file]
Ottobre 16, 2023 alle 5:55 pm #74363Giussarg
PartecipanteIl FB ModbusGateway_v1 funziona anche con uno slave TCP, cioè basta sostituire la connessione seriale con una connessione TCPClient per avere il gateway tra i 2 sistemi?
Inoltre, ho una domanda in merito al timing.
Nel sistema da realizzare vorrei che, quando non ci sono comandi di scrittura, il PLC legga sempre lo slave (slave –> registri modbus) mentre quando vado a scrivere si interrompa la lettura fino a che non ho scritto nei registri (registri modbus –> slave). Questo perchè vorrei evitare di avere feedback diversi.
Mi spiego: ho una luce dimmerata, il modbus sta leggendo il valore 50 nel suo registro associato (Holding register), vado a scrivere 100 nel registro perchè la voglio al massimo, quindi il feedback a video (uno slider) mi passa al 100%, ma il driver sta ancora leggendo il vecchio valore quindi il feedback mi ritorna al 50%, poi solo una volta aggiornato il registro il feedback va a 100%.
C’è questa possibilità? oppure il FB ModbusGateway gestisce già questa problematica?
Ottobre 18, 2023 alle 2:04 pm #74393Sergio Bertana
Amministratore del forumIl FB ModbusGateway agisce da gateway tra due streams di comunicazione, quindi puoi connettere qualsiasi stream, seriale, TCPServer o TCPClient.
Se usi il gateway il PLC non fà altro che gestire i comandi che arrivano da uno stream (Esempio ModbusTCP) e li invia sull’altro stream (Esempio modbus seriale) o viceversa. Quindi sarà il sistema connesso al gateway a gestire l’ordine delle comunicazioni.
Non comprendo bene la tua domanda, se scrivi 100 in un registro quando lo rileggi sarà con valore 100, certo un attimo prima di scriverlo leggerai il vecchio valore, ma questo non si può evitare. Immagino però che chi visualizza continui ad interrogare il dispositivo, nei pannelli operatore ad esempio se usi uno slider il pannello contina a leggerlo ed a visulizzarlo con il suo valore. Quando sposti il cursore viene scritto il nuovo valore che poi viene riletto.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.