Modbus en PLC CP1L de Omron

Actualmente estoy trabajando con un PLC de la marca Omron, concretamente con un CP1L. Este PLC posee conectividad mediante ethernet y quería configurar un servidor ModBus para poder realizar un intercambio de datos entre este PLC y otro dispositivo de red.

ModBus es el protocolo industrial más utilizado en la actualidad y pensaría que este tema lo Omron lo tendría solucionado sin muchas complicaciones. Y es cierto, Omron posee unas librerías para poder usar servidores y clientes de ModBus pero no vienen por defecto con su suite de programación (CX-ONE) sino que hay que bajarselo de la siguiente direccion: https://www.myomron.com/index.php?action=kb&article=1245

Si descargamos el servidor nos viene con unos archivos que debemos almacenar en alguna parte de nuestro disco duro (yo los almaceno en: C:\Program Files (x86)\OMRON\CX-One\Lib\FBL\omronlib). Lo más curioso es que viene un PDF explicándonos las características de la librería y podemos observar que no están implementadas todas las funciones de ModBus y que además encontramos un mensaje en rojo que nos dice: Omron could not be held responsible in case of malfunction.

Después de acabar este proceso abro CX-Programmer para implementar funciones de ModBus en mi programa y para ello pulso segundo botón sobre Bloques de función (en el panel izquierdo) y selecciono Insertar bloque de función > desde archivo. Selecciono el archivo que me he descomprimido anteriormente y ya tendré la librería de ModBus lista para usar.

Para usar la librería me creo una nueva sección del programa y coloco la librería allí

Librería ModBus

Para probar que está funcionando hago un escaneo de red mediante nmap y veo que cuando acaba el escaneo, efectivamente el PLC tiene activo el puerto 502 (que es el puerto de modbus por defecto) pero veo que el PLC deja estar a la escucha. Lo más preocupante es que aunque resetease las entradas no era capaz de volverse a poner a la escucha.

ModBus

Después de hacer un poco de ingeniería inversa a la libreria de ModBus me di cuenta de que en la dirección de memoria D32404 almacena el error actual

ModBus

Y además me fijo que el error en el que se queda después del escaneo de nmap es 0x0E88 así que en la misma sección donde tengo la librería ModBus incorporó una pequeña lógica para resetar a 0 el valor de esa dirección de memoria cuando el valor de dicha dirección es 0x0E88

ModBus

Y con esto ya es capaz de recuperarse del error que se genera cuando hago un escaneo con nmap y ya puedo conectar mediante un pequeño cliente que he programado en python (Aunque posteriormente probé a ejecutar el cliente sin necesidad de la lógica de reseteo de la dirección de memoria y funcionaba correctamente. Parece que solamente se produce con nmap el fallo)

modbus5Por cierto, este es el PLC sobre el que estoy trabajando

WhatsApp Image 2019-03-15 at 18.40.43 WhatsApp Image 2019-03-15 at 18.41.07