Leyendo direcciones de memoria Modbus
Si quieres ir al turrón clic aquí
El saber no ocupa lugar
Hace unos meses, ha venido una punta de trabajo que me ha obligado a bascular a un área poco explorada para mí.
Al área de los PLCs.
En estos proyectos hay que realizar unas comunicaciones del PLC con otros dispositivos.
Casi todas las comunicaciones en estos proyectos se hacen a través de Modbus.
El motivo del siguiente artículo es que me he encontrado que hay fabricantes de hardware que exponen en sus dispositivos una interfaz Modbus (TCP/IP, RTU...) pero unas veces en la documentación especifican las direcciones de una forma y otras veces de otra.
¿Qué es Modbus?
Modbus es un protocolo de comunicación de bajo nivel que se utiliza para comunicar con dispositivos de hardware.
Es un protocolo muy extendido y muy popular.
¿Los motivos?
- Protocolo gratis y de libre uso.
- Protoco fácil, directo y con un modelo de datos claro.
- Requiere pocos recursos de los dispositivos.
¿Quién da más?
Las áreas de memoria en Modbus
Coils; son áreas de salidas digitales o bits.
Los maestros o clientes pueden leer o escribir bits.
- Discrete inputs ; son entradas digitales en las cuales los maestros o clientes sólo pueden leer bits.
- Input registers ; área de entradas analógicas en las cuales los maestros o clientes sólo pueden leer palabras o words.
- Holding registers ; área de registros en las cuales los maestros o clientes pueden leer o escribir palabras.
Si has llegado hasta aquí entiendo que te interesa el tema y que probablemente no necesite aclararte que cuando digo una palabra o word me refiero a 2 bytes (16 bits) de información.
Para referenciar las áreas de memoria en Modbus, generalmente, se utilizan números de 5 cifras.
El primer dígito dependerá del tipo de área de memoria, siendo:
- 0 para coils
- 1 para discrete inputs
- 3 para input registers
- 4 para holding registers
Por ejemplo, el registro 40103 sería para el holding register número 102.
¿Por qué el 102 y no el 103?
La diferencia viene porque las áreas de memoria se enumeran desde 1, pero a nivel de protocolo la direcciones se enumeran desde 0.
¿Cómo me pueden especificar las direcciones de memoria Modbus?
Como te he dicho antes, la falta de consistencia es debido que las áreas de memoria se enumeran desde 1, pero a nivel de protocolo la direcciones se enumeran desde 0.
Te pueden decir, que leas la dirección 30056, o bien, que leas el input register 55, es equivalente.
Cuando tienes experiencia no le das importancia, pero al principio se puede hacer bola.
Te pueden complicar un poco más si el fabricante te quiere pasar las digitales por un área para analógicas.
Es más común de lo que piensas que te manden en los holding registers lo que se debería enviar por coils.
Es decir, usan los bits de las palabras de los holding registers para enviarte valores digitales.
Te pueden decir que una señal está en la dirección 40322.3 lo que significaría que leyeras en el cuarto bit del holding register 321.
Espero no tener que aclararte que los bits se enumeran desde 0.
Quería explicar también cómo se contruyen los mensajes de Modbus para que supieras leer las tramas en texto plano de Modubs pero se me ha hecho tarde.
Y para contarte lo anterior me tendría que meter también en el byte más significativo de un word, que si little-endian, big-endian...
Quizás en otro artículo.
Hasta luego 🖖