Programmazione.it
Il Modbus per Intel Edison
Scritto da Matthias Hahn il 02-05-2016 ore 02:38
Il Modbus è un famoso protocollo utilizzato ad esempio nei sistemi di automazione industriale o negli impianti domotici. Può funzionare su strati fisici come le porte seriali (RS232, oppure RS485) o ethernet (TCP o UDP).
Con il modbus per Intel(R) Edison potrai facilmente utilizzare il WiFi, o il seriale (RS232) disponibili direttamente sulla piattaforma.

BIBLIOTECHE PYTHON
Su Linux trovi tantissime biblioteche come ad esempio:
  • C/C++: es. libmodbus

  • Node: es. il wrapper libmodbus "modbus"

  • Python: es. pymodbus


INSTALLAZIONE
  • libmodbus: avvia dall’inizio o installa il pacchetto (ad es. da repo.opkg e clicca su opkg install libmodbus)

  • node modbus: "npm install modbus"

  • pymodbus: “pip install pymodbus" (puoi scaricare pip per es. da repo.opkg)


TEST
Per il test utilizziamo pymodbus) che presenta già dei campioni per client e server.

Innanzitutto bisogna aggiungere il pacchetto "pyserial" digitando:

[code=bash]
pip install pyserial
[/code]

Per testare il seriale utilizziamo due efficaci schede Intel(R) Edison Arduino. I led TX and RX sono incrociati, cioè IO 0 da ogni scheda passa a IO 1 dell’altra scheda. Per testare l’installazione ricorriamo ad un server sincrono, leggermente modificato su una scheda, e un client sincrono sull’altra scheda.

Per le modifiche al server:

[code=python]
# run the server you want
# Tcp:
#StartTcpServer(context, identity=identity, address=("localhost", 5020))
# Udp:
# StartUdpServer(context, identity=identity, address=("localhost", 502))
# Ascii:
#StartSerialServer(context, identity=identity, port='/dev/pts/3', timeout=1)
# RTU:
import mraa, serial as s
mraa.Uart(0)
StartSerialServer(context, identity, port='/dev/ttyMFD1', stopbits=s.STOPBITS_ONE, bytesize=s.EIGHTBITS, baudrate=115200, parity=s.PARITY_NONE)
[/code]

Per il client:

[code=python]
[...]
# client = ModbusClient('localhost', retries=3, retry_on_empty=True)
#client = ModbusClient('localhost', port=502)
#client = ModbusClient(method='ascii', port='/dev/pts/2', timeout=1)
#client = ModbusClient(method='rtu', port='/dev/pts/2', timeout=1)
import mraa, serial as s
mraa.Uart(0)
client = ModbusClient(method='rtu', port='/dev/ttyMFD1', stopbits=1, bytesize=8, baudrate=115200, parity=s.PARITY_NONE)
client.connect()
[...]
[/code]

La porta seriale è impostata tramite MRAA. Successivamente il modbus può accedere al /dev/ttyMFD1 (vedi ad es. Using Serialx on Edison).
Se tutto è installato correttamente, dovresti visionare dei messaggi modbus proveninti dal client.

TCP/IP su Ethernet (es. WiFi)
Per testare il modbus su Ethernet, utilizziamo gli esempi di server asincrono e client asincrono, anche in questo caso con piccole modifiche. Il server è caratterizzato dal proprio indirizzo IPv4 xxx.xxx.xxx.xxx e una porta (in questo caso 5020).

[code=python]
[...]
StartTcpServer(context, identity=identity, address=("xxx.xxx.xxx.xxx", 5020))
[/code]

E lo stesso per il client.

[code=python]
[...]
defer = protocol.ClientCreator(reactor, ModbusClientProtocol).connectTCP("xxx.xxx.xxx.xxx", 5020)
defer.addCallback(beginAsynchronousTest)
reactor.run()
[/code]

Anche in questo caso se tutto è installato correttamente, si dovrebbero vedere dei messaggi modbus dal client che arrivano al server come mostrato di seguito.

[code=python]
# python AsynchronousServerExample.py
INFO:pymodbus.server.async:Starting Modbus TCP Server on 192.168.178.72:5020
DEBUG:pymodbus.server.async:Client Connected [IPv4Address(TCP, '192.168.178.72', 5020)]
DEBUG:pymodbus.server.async:0x0 0x1 0x0 0x0 0x0 0x6 0x0 0x5 0x0 0x1 0xff 0x0 0x0 0x2 0x0 0x0 0x0 0x6 0x0 0x1 0x0 0x1 0x0 0x1 0x0 0x3 0x0 0x0 0x0 0x8 0x0 0xf 0x0 0x1 0x0 0x8 0x1 0xff 0x0 0x4 0x0 0x0 0x0 0x6 0x0 0x1 0x0 0x1 0x0 0x8 0x0 0x5 0x0 0x0 0x0 0x8 0x0 0xf 0x0 0x1 0x0 0x8 0x1 0x0 0x0 0x6 0x0 0x0 0x0 0x6 0x0 0x2 0x0 0x1 0x0 0x8 0x0 0x7 0x0 0x0 0x0 0x6 0x0 0x6 0x0 0x1 0x0 0xa 0x0 0x8 0x0 0x0 0x0 0x6 0x0 0x3 0x0 0x1 0x0 0x1 0x0 0x9 0x0 0x0 0x0 0x17 0x0 0x10 0x0 0x1 0x0 0x8 0x10 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0x0 0x0 0x6 0x0 0x4 0x0 0x1 0x0 0x8 0x0 0xb 0x0 0x0 0x0 0x1b 0x0 0x17 0x0 0x1 0x0 0x8 0x0 0x1 0x0 0x8 0x10 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0xc 0x0 0x0 0x0 0x6 0x0 0x4 0x0 0x1 0x0 0x8
DEBUG:pymodbus.transaction:0x0 0x1 0x0 0x0 0x0 0x6 0x0 0x5 0x0 0x1 0xff 0x0 0x0 0x2 0x0 0x0 0x0 0x6 0x0 0x1 0x0 0x1 0x0 0x1 0x0 0x3 0x0 0x0 0x0 0x8 0x0 0xf 0x0 0x1 0x0 0x8 0x1 0xff 0x0 0x4 0x0 0x0 0x0 0x6 0x0 0x1 0x0 0x1 0x0 0x8 0x0 0x5 0x0 0x0 0x0 0x8 0x0 0xf 0x0 0x1 0x0 0x8 0x1 0x0 0x0 0x6 0x0 0x0 0x0 0x6 0x0 0x2 0x0 0x1 0x0 0x8 0x0 0x7 0x0 0x0 0x0 0x6 0x0 0x6 0x0 0x1 0x0 0xa 0x0 0x8 0x0 0x0 0x0 0x6 0x0 0x3 0x0 0x1 0x0 0x1 0x0 0x9 0x0 0x0 0x0 0x17 0x0 0x10 0x0 0x1 0x0 0x8 0x10 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0xa 0x0 0x0 0x0 0x6 0x0 0x4 0x0 0x1 0x0 0x8 0x0 0xb 0x0 0x0 0x0 0x1b 0x0 0x17 0x0 0x1 0x0 0x8 0x0 0x1 0x0 0x8 0x10 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0x14 0x0 0xc 0x0 0x0 0x0 0x6 0x0 0x4 0x0 0x1 0x0 0x8
DEBUG:pymodbus.factory:Factory Request[5]
DEBUG:pymodbus.datastore.context:validate[5] 2:1
DEBUG:pymodbus.datastore.context:setValues[5] 2:1
DEBUG:pymodbus.datastore.context:getValues[5] 2:1
DEBUG:pymodbus.server.async:send: 00010000000600050001ff00
DEBUG:pymodbus.factory:Factory Request[1]
DEBUG:pymodbus.datastore.context:validate[1] 2:1
DEBUG:pymodbus.datastore.context:getValues[1] 2:1
DEBUG:pymodbus.server.async:send: 00020000000400010101
[/code]

Con questo dovreste essere in grado di comunicare sulla seriale o via ethernet con dispositivi modbus.

Per maggiori informazioni su Intel Edison leggi la guida Edison Getting Started, oppure consulta il forum. Scopri gli altri tool di sviluppo disponibili per IoT sulla Intel IoT Developer Zone.

RIFERIMENTI
Intel Edison Board Getting Started Guide
Intel Tech Community Forum
Intel IoT Dev Zone
Server asincrono
Server sincrono
repo.opkg
Modbus
Copyright Programmazione.it® 1999-2005. Tutti i diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002.