Ir al contenido

Conector Modbus

El conector Modbus permite la comunicación con PLCs y dispositivos industriales usando el protocolo Modbus, admitiendo conexiones tanto seriales (RTU) como TCP/IP.

Tipos de Conector:

  • ModbusReader - Leer datos de dispositivos Modbus
  • ModbusWriter - Escribir datos en dispositivos Modbus
  • ✅ Múltiples protocolos de transporte (TCP, RTU, UDP, TLS)
  • ✅ Todos los tipos de registros (Holding, Input, Coil, Discrete Input)
  • ✅ Múltiples tipos de datos (Int16/32/64, UInt16/32/64, Float32/64, ASCII)
  • ✅ Orden de bytes y palabras configurable
  • ✅ Soporte de ID de unidad para redes multi-dispositivo

Meddle admite los siguientes transportes Modbus:

  • TCP - Modbus TCP sobre Ethernet
  • TCPWithTLS - Modbus TCP con cifrado TLS
  • UDP - Modbus sobre UDP
  • RTU - Modbus RTU sobre serial
  • RTUOverTCP - Modbus RTU encapsulado en TCP
  • RTUOverUDP - Modbus RTU encapsulado en UDP
{
"type": "ModbusReader",
"config": {
"endpoint": "192.168.1.100:502",
"transport": "TCP",
"pollingRate": 1000,
"defaultUnitId": 1,
"defaultBitOrder": "BigEndian",
"defaultWordOrder": "HighFirst"
},
"variables": [
{
"key": "temperature",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float64"
},
{
"key": "pressure",
"address": 4,
"registerType": "HoldingRegister",
"dataType": "Int32"
}
]
}
{
"type": "ModbusReader",
"config": {
"endpoint": "/dev/ttyUSB0",
"transport": "RTU",
"pollingRate": 1000,
"defaultUnitId": 1,
"baudRate": 9600,
"dataBits": 8,
"parity": "None",
"stopBits": 1
},
"variables": [
{
"key": "sensor_value",
"address": 0,
"registerType": "InputRegister",
"dataType": "UInt16"
}
]
}
{
"type": "ModbusWriter",
"config": {
"endpoint": "192.168.1.100:502",
"transport": "TCP",
"defaultUnitId": 1
},
"variables": [
{
"key": "setpoint",
"address": 100,
"registerType": "HoldingRegister",
"dataType": "Float32"
},
{
"key": "enable",
"address": 0,
"registerType": "Coil"
}
]
}

Registros de propósito general que pueden ser leídos y escritos.

{
"key": "temperature",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float64"
}

Códigos de Función: Lectura (03), Escritura Simple (06), Escritura Múltiple (16)

Registros de solo lectura típicamente usados para datos de sensores.

{
"key": "sensor_reading",
"address": 0,
"registerType": "InputRegister",
"dataType": "Int16"
}

Código de Función: Lectura (04)

Registros de un solo bit para salidas digitales.

{
"key": "motor_enable",
"address": 0,
"registerType": "Coil"
}

Códigos de Función: Lectura (01), Escritura Simple (05), Escritura Múltiple (15)

Registros de un solo bit de solo lectura para entradas digitales.

{
"key": "limit_switch",
"address": 0,
"registerType": "DiscreteInput"
}

Código de Función: Lectura (02)

// Entero con signo de 16 bits (-32768 a 32767)
{"dataType": "Int16"} // 1 registro
// Entero sin signo de 16 bits (0 a 65535)
{"dataType": "UInt16"} // 1 registro
// Float de 32 bits (4 bytes)
{"dataType": "Float32"} // 2 registros
// Float de 64 bits (8 bytes)
{"dataType": "Float64"} // 4 registros
// Carácter ASCII (1 byte por registro)
{"dataType": "AsciiChar"} // 1 registro

Los dispositivos Modbus pueden usar diferentes ordenamientos de bytes y palabras. Configúralos para que coincidan con tu dispositivo:

{
"defaultBitOrder": "BigEndian" // o "LittleEndian"
}
  • BigEndian: Byte más significativo primero (por defecto, más común)
  • LittleEndian: Byte menos significativo primero

Para valores multi-registro (32-bit, 64-bit):

{
"defaultWordOrder": "HighFirst" // o "LowFirst"
}
  • HighFirst: Palabra alta primero (por defecto)
  • LowFirst: Palabra baja primero
{
"key": "special_value",
"address": 10,
"registerType": "HoldingRegister",
"dataType": "Float32",
"bitOrder": "LittleEndian",
"wordOrder": "LowFirst"
}

Para conexiones Modbus RTU sobre serial:

{
"endpoint": "/dev/ttyUSB0",
"transport": "RTU",
"baudRate": 9600,
"dataBits": 8,
"parity": "None",
"stopBits": 1,
"timeout": 1000
}

Parámetros:

  • baudRate: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
  • dataBits: 7 u 8
  • parity: None, Even, Odd
  • stopBits: 1 o 2
  • timeout: Timeout de lectura en milisegundos

Modbus admite múltiples dispositivos en la misma red usando IDs de Unidad:

{
"defaultUnitId": 1 // Por defecto para todas las variables
}

Anulación por variable:

{
"key": "device2_temp",
"address": 0,
"registerType": "HoldingRegister",
"dataType": "Float32",
"unitId": 2 // Anular para esta variable
}
{
"type": "ModbusReader",
"config": {
"endpoint": "192.168.1.50:502",
"transport": "TCP",
"pollingRate": 5000,
"defaultUnitId": 1
},
"variables": [
{
"key": "voltage",
"address": 0,
"registerType": "InputRegister",
"dataType": "Float32"
},
{
"key": "current",
"address": 2,
"registerType": "InputRegister",
"dataType": "Float32"
},
{
"key": "power",
"address": 4,
"registerType": "InputRegister",
"dataType": "Float32"
},
{
"key": "energy",
"address": 6,
"registerType": "InputRegister",
"dataType": "Float64"
}
]
}
{
"type": "ModbusWriter",
"config": {
"endpoint": "192.168.1.100:502",
"transport": "TCP",
"defaultUnitId": 1
},
"variables": [
{
"key": "motor_speed",
"address": 100,
"registerType": "HoldingRegister",
"dataType": "UInt16"
},
{
"key": "motor_start",
"address": 0,
"registerType": "Coil"
},
{
"key": "motor_stop",
"address": 1,
"registerType": "Coil"
}
]
}

Soluciones:

  • Verifica la dirección del endpoint y el puerto
  • Verifica la conectividad de red
  • Aumenta el valor de timeout
  • Verifica que el dispositivo esté encendido y responda

Soluciones:

  • Verifica el orden de bytes (BigEndian vs LittleEndian)
  • Verifica el orden de palabras (HighFirst vs LowFirst)
  • Confirma que el tipo de datos coincida con la especificación del dispositivo
  • Verifica que la dirección del registro sea correcta

Soluciones:

  • Verifica las conexiones del cable serial
  • Verifica que la velocidad en baudios coincida con el dispositivo
  • Confirma la configuración de paridad y bits de parada
  • Verifica las resistencias de terminación adecuadas
  • Reduce la tasa de sondeo para evitar colisiones en el bus
  1. Comienza con Solo Lectura: Prueba con Input Registers antes de escribir
  2. Usa Sondeo Apropiado: No sondees más rápido de lo que el dispositivo puede responder
  3. Agrupa Registros Consecutivos: Más eficiente que lecturas dispersas
  4. Documenta el Orden de Bytes: Mantén notas sobre configuraciones específicas del dispositivo
  5. Prueba IDs de Unidad: Verifica que cada dispositivo responda a su ID de Unidad
  • OPC UA - Protocolo industrial alternativo
  • Siemens S7 - Comunicación directa con PLC Siemens
  • Filter - Filtrar datos Modbus
  • SQL Writer - Almacenar datos Modbus en bases de datos