Vai al contenuto

Comunicazione Modbus su rete LoRaWAN

LoRaWAN è una tecnologia di comunicazione a lungo raggio e basso consumo energetico, progettata per connettere dispositivi IoT in reti regionali, nazionali o globali. Si basa sul protocollo LoRa, che consente di trasmettere dati a distanze significative con un consumo energetico molto ridotto.

I controller Milesight LoRaWAN come l’UC100 e l’UC300 supportano la funzione di bridge Modbus RS485 LoRaWAN, e quindi possono operare come interfaccie tra la rete LoRaWAN ed i dispositivi Modbus RS485.

I gateways UG56 e UG65 possono connettersi ai vari controller e rendere disponibile una connessione TCP con cui scambiare dati in modo trasparente con i dispositivi connessi al controller.

Gateway Milesight con dispositivo Modbus
Approfondimenti
  • In questo articolo di Milesight IoT support, è riportata la configurazione da effettuare sul controller UC100.
  • In questo articolo informazioni sulla configurazione del gateway e dei dispositivi LoRaWAN.

Configurazione controller su gateway

Per la configurazione della trasmissione Modbus occorre prima avere correttamente collegato il controller con il gateway, rimando a questo articolo per le informazioni relative.

Dal menù Network Server->Device è possibile aggiungere il nuovo dispositivo UC100. Definendone il Device EUI automaticamente verrà visualizzata la sezione per l’impostazione del protocollo Modbus.

Modbus RTU Data Transmission: Modbus RTU over TCP, Permete lo scambio di frame Modbus RTU sulla connessione TCP.

Modbus RTU Fport: Range: 2-84,86-203,210-213,220-223, impostare porta da utilizzare su comunicazione LoRaWAN per scambiare i dati con il controller.

TCP Port: Range: 1-65535, impostare la porta TCP a cui connettersi per lo scambio dati in Modbus RTU.

Con le impostazioni a lato è possibile aprire una connessione TCP all’indirizzo IP del gateway sulla porta 5000 e comunicare in Modbus RTU. Il pacchetto di richiesta viene inviato al controller LoRaWAN sulla porta 200. Il controller lo invierà in uscita sulla RS485 al dispositivo connesso ed il pacchetto di risposta sarà inviato in risposta al gateway e quindi sulla connessione TCP.

Configurazione controller UC100

Per la configurazione del dispositivo occorre collegarlo al connettore USB di un PC ed eseguire il programma ToolBox. Per la connessione occorre impostare la porta seriale e definire la password che di default è 123456. Dal menù LoRaWAN ToolBox è possibile eseguire la configurazione.

Il dispositivo opera in classe C, definire l’Application Key per la crittografia utilizzata durante l’OTAA. Per i dispositivi Milesight 5572404c696e6b4c6f52613230313823.

Nelle impostazioni generali occorre abilitare il Pass-through ed impostare Two-way Pass-through.Occorre impostare la stessa porta impostata sul gateway nel parametro Modbus RTU Fport.

Lettura dei Consumi Elettrici via LoRaWAN

Il monitoraggio intelligente dei consumi energetici è una delle sfide importante per aziende, enti pubblici e cittadini. La lettura dei consumi elettrici via LoRaWAN può essere una soluzione efficace, scalabile ed economicamente vantaggiosa. Nel programma SDM120ThroughLoRa un esempio di acquisizione valore di tensione e frequenza da un SDM\120.

La comunicazione LoRaWAN garantisce lunghe distanze di comunicazione anche all’interno di edifici, ma di contro ha lentezza di comunicazione e pacchetti dati di dimensione ridotta. Nel programma viene eseguita ciclicamente l’acquisizione di 2 valori ad intervalli di 30 secondi, il tempo di comunicazione è 5-8 secondi.

Il programma utilizza il FB ACModbus per sequenziare le variabili da acquisire, è’ possibile aumentare il numero di elementi nell’array ACData definendo ulteriori variabili e/o ulteriori nodi Modbus per acquisire più SDM120.

Connessione SDM120 via LoRaWAN
LogicLab (SDM120ThroughLoRa)
PROGRAM SDM120ThroughLoRa
VAR
    DRead : DWORD; (* Date read *)
    Voltage : REAL; (* Voltage (V) *)
    Frequency : REAL; (* Frequency (Hz) *)
    TCPClient : SysTCPClient; (* TCP client management *)
    MMdb : ModbusMaster_v3; (* Modbus master *)
    ACMdb : ACModbus_v3; (* Array command modbus *)
    ACData : ARRAY[0..1] OF ACMODBUS_DATA_V3; (* Array command data *)
END_VAR

// *****************************************************************************
// PROGRAM "SDM120ThroughLoRa"
// *****************************************************************************
// This program reads voltage and frequency from a SDM120 on LoRaWAN.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN

        // Serial port settings.

        TCPClient.PeerAdd:=ADR('192.168.1.150'); //Peer address
        TCPClient.PeerPort:=5000; //Peer port
        TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
        TCPClient.LocalPort:=0; //Local port
        TCPClient.FlushTm:=50; //Flush time (mS)
        TCPClient.LifeTm:=120; //Life time (S)
        TCPClient.RxSize:=128; //Rx buffer size
        TCPClient.TxSize:=128; //Tx buffer size

        // Modbus master settings.

        MMdb.Type:=MODBUS_PROTOCOL#MDB_RTU; //Modbus protocol type
        MMdb.Timeout:=T#10s; //Timeout time
        MMdb.Delay:=T#30s; //Delay time

        // Array command modbus settings.

        ACMdb.ACAdd:=ADR(ACData); //Array command address
        ACMdb.ACNr:=SIZEOF(ACData)/SIZEOF(ACData[0]); //Array command number
        ACMdb.RTime:=T#10s; //Retry time

        // Voltage read from meter.

        ACData[0].Command.0:=TRUE; //Spy On
        ACData[0].Command.1:=FALSE; //Absolute addressing
        ACData[0].Node:=1; //Modbus node
        ACData[0].FCode:=16#04; //Modbus function code
        ACData[0].Address:=1; //Modbus register address
        ACData[0].Points:=2; //Modbus register points
        ACData[0].Buffer:=ADR(DRead); //Memory buffer address

        // Frequency read from meter.

        ACData[1].Command.0:=TRUE; //Spy On
        ACData[1].Command.1:=FALSE; //Absolute addressing
        ACData[1].Node:=1; //Modbus node
        ACData[1].FCode:=16#04; //Modbus function code
        ACData[1].Address:=71; //Modbus register address
        ACData[1].Points:=2; //Modbus register points
        ACData[1].Buffer:=ADR(DRead); //Memory buffer address
    END_IF;

    // -------------------------------------------------------------------------
    // ENERGY METERS MANAGEMENT
    // -------------------------------------------------------------------------
    // Manage the Modbus communication.

    TCPClient(Connect:=TRUE); //TCPClient management
    MMdb(File:=TCPClient.File); //Modbus master
    ACMdb(MMdb:=ADR(MMdb)); //Array command modbus
    
    // Manage the energy meters.

    ACMdb.Enable:=NOT(ACMdb.Done) AND (SysFIsOpen(MMdb.File)); //FB enable
    IF (ACData[0].Status.0) THEN eTO_JUNK(SwapData(ADR(Voltage), ADR(DRead), DWORD_TYPE, SWAP_HALF)); END_IF;
    IF (ACData[1].Status.0) THEN eTO_JUNK(SwapData(ADR(Frequency), ADR(DRead), DWORD_TYPE, SWAP_HALF)); END_IF;

// [End of file]
Was this article helpful?