miércoles, octubre 05, 2016

Leyendo datos con pymodbus3

Uno de los protocolos más populares y viejos del mundo de la automatización industrial es Modbus. Es un protocolo sencillo que nos permite leer datos de una miríada de dispositivos industriales tales como controladores de procesos, PLC's y sensores y medidores de todo tipo. Modbus ha estado ya unas cuantas décadas y ha evolucionado en lo que yo llamo tres sabores principales: ASCII, RTU y TCP. Los dos primeros funcionan sobre conexiones seriales tipo RS-232, RS-422 o RS-485 y el último, el TCP, funciona usando Ethernet como medio de conexión.

Pymodbus3 es una biblioteca, o librería como también la llamamos, de Python que nos permite usar el protocolo a alto nivel sin entrar en los detalles de programación de bajo nivel.

Supongo que si están leyendo esto ya de alguna manera conocen el protocolo y saben algo de Python. Así que al grano. Vamos a hacer un pequeño programa que lea datos y los escriba a algún lugar, por ejemplo un archivo texto.

Lo primero es asegurarnos que tengamos Python instalado, por ejemplo python 3.4 para que sea compatible con pymodbus3. Luego instalamos pymodbus3 con pip de la manera usual.

Las primeras líneas del programa serían algo así:

from pymodbus3.client.sync import ModbusTcpClient as ModbusClient

client = ModbusClient('localhost', port=502)
client.connect()

El script supone que estoy usando el protocolo ModbusTCP, por lo que el cliente en cuestión estaría leyendo de un PLC, o servidor Modbus, ubicado en este caso en mi pc (localhost). ModbusTCP usa el puerto TCP 502, así que eso es lo que significa el segundo parámetro del constructor de la clase.

Para poder simular una conexión ModbusTCP uso mod_RSsim. Este simulador si lo instale en mi pc puede emular un PLC sin problemas y me conecto vía el puerto 502.

Luego de creado el cliente podemos leer de esta manera.

lectura = client.read_holding_registers(450, 10)

Esto guardaría en la variable lectura una lista de 10 valores a partir del holding register con dirección 450. Pymodbus3 tiene funciones para leer y escribir todo tipo de variables Modbus y podemos ver un ejemplo para un cliente asíncrono en la documentación.

Quedaría empaquetar el código de manera que podamos interactuar con el programa, guardar los datos en algún lado y añadir el manejo de excepciones por si hay algún problema de comunicaciones. Pero eso sería materia de otro post.



3 comentarios:

Sala de Autopsia dijo...

No entendí nada .... pero feliz de que sepas tanto

Interxoft SAS dijo...

Romulo,

hola. Me gusta mucho la forma en que explicas lo que se debe hacer para crear un cliente Modbus TCP. Seria interesante que explicaras los pasos para crear un servidor.

Saludos desde Bogota, Colombia

David Diaz
https://www.linkedin.com/in/david-diaz-22380b31?trk=hp-identity-name

Romulo Rodriguez dijo...

Ahora mismo estoy trabajando en otro proyecto que implica leer datos de un cliente pero esta vez usando C# y .NET. Pero en lo que tenga un tiempo escribo algo sobre como crear maestros Modbus usando pymodbus.