Saltar a contenido

Interfaz Modbus TCP

El emulador actúa como servidor Modbus TCP. El controlador es el cliente y el único maestro.

El mapa es configurable

Nada de lo que sigue está cableado en el código. El mapa vive en el JSON de configuración y el usuario puede rehacerlo entero desde la interfaz. Lo que sigue es la semilla por defecto, derivada del Apéndice G del manual ADAM-4000 para que las pruebas contra el RD100S no partan de cero.

Hallazgos del Apéndice G

Tres cosas del manual condicionan el diseño y no son evidentes.

Advantech no usa los espacios 1X ni 3X

Las entradas digitales de solo lectura viven en el espacio 0X, que en numeración Modicon es el de coils, no el de discrete inputs. Las entradas analógicas viven en 4X, holding registers, no en input registers.

Consecuencia para el controlador

Las lecturas de DI se hacen con FC01 (Read Coils), no con FC02. Las lecturas de AI con FC03 (Read Holding Registers), no con FC04. El emulador debe implementar coils con atributo de solo lectura: una escritura sobre una coil de entrada debe responder excepción, no aceptarse en silencio.

Como consecuencia práctica, el emulador solo necesita implementar cuatro espacios de direcciones de los cuales dos quedan vacíos, y estos códigos de función:

FC Función Uso
01 Read Coils DI y DO
03 Read Holding Registers AI y AO
05 Write Single Coil DO
06 Write Single Register AO
15 Write Multiple Coils DO
16 Write Multiple Registers AO

Las direcciones colisionan entre módulos

El ADAM-4051 sitúa sus 16 DI en 00001..00016. El ADAM-4024 sitúa sus cuatro Emergency DI Input Flag en 00001..00004. Dentro de un mismo unit ID serían la misma dirección.

La resolución es que cada módulo físico es un unit ID distinto. En el sistema real cada módulo es un nodo RS-485 con su propia dirección, y el gateway la traduce a unit ID. El emulador replica ese modelo: diez unit IDs para los diez módulos del RD100S.

El manual atribuye salidas analógicas a un módulo que no las tiene

El Apéndice G asigna al 4051 —16 entradas digitales— cuatro registros 4X en 40001..40004 etiquetados Current Output Value R/W. Un módulo exclusivamente de entrada digital no tiene salidas analógicas; con alta probabilidad es un error de copia heredado de la tabla del 4024.

La semilla ignora esos registros. Ver PEND-22.

Regla de mapeo por defecto

Tipo Espacio Dirección convencional Dirección de cable Acceso
DI 0X 00001 + canal canal solo lectura
DO 0X 00017 + canal 16 + canal lectura/escritura
AI 4X 40001 + canal canal solo lectura
AO 4X 40001 + canal canal lectura/escritura

Convencional contra cable

La numeración de cinco dígitos del manual es convencional, base 1. La dirección que viaja en la trama Modbus es base 0: 00001 se transmite como 0, 40001 como 0. El JSON almacena ambas: address es la de cable y conventional es la del manual, para que sea trivial cotejar con la documentación de Advantech durante la puesta a punto.

Unit IDs de la semilla

Unit ID Subsistema Módulo Contenido
1 Transmitter ADAM 4051 16 DI
2 Transmitter ADAM 4024 4 DI + 4 AO
3 Transmitter ADAM 4069 8 DO
4 Transmitter ADAM 4117 8 AI
11 Antenna ADAM 4051 16 DI
12 Antenna ADAM 4024 4 DI + 4 AO
13 Antenna ADAM 4069 8 DO
14 Antenna ADAM 4117 8 AI
21 Receiver ADAM 4150 7 DI + 8 DO
31 On/Off/Climate ADAM 4055 8 DI + 8 DO

Los números concretos son arbitrarios y deben ajustarse a las direcciones RS-485 reales (PEND-08).

Requisito duro sin verificar

El servidor debe atender múltiples unit IDs sobre una sola conexión TCP. No está verificado que las librerías candidatas lo soporten correctamente. Es lo primero que hay que probar (PEND-21).

Módulos no cubiertos por el Apéndice G

El apéndice aportado documenta 4015, 4018+, 4017+, 4019+, 4024, 4051, 4055, 4056S, 4056SO y 4068. No cubre 4069, 4117 ni 4150, que sí aparecen en el mapa de señales del RD100S.

Sus direcciones en la semilla son inferidas por analogía funcional, no leídas de un manual:

Módulo Función Análogo usado Direcciones inferidas
ADAM 4069 8 salidas de relé ADAM 4068 DO en 00017..00024
ADAM 4117 8 entradas analógicas ADAM 4017+ AI en 40001..40008
ADAM 4150 7 DI + 8 DO ADAM 4055 DI en 00001..00007, DO en 00017..00024

Verificar contra los manuales correspondientes antes de una prueba formal (PEND-07).

Señales analógicas

El manual lista los registros de valor pero no la conversión a unidades de ingeniería, que depende del Type Code de cada canal en 40201 y siguientes.

Cada señal analógica del JSON lleva por tanto dos capas:

{
  "units": "kV",
  "range": [0.0, 30.0],
  "raw": {
    "encoding": "int16",
    "raw_range": [0, 65535],
    "note": "PENDIENTE: confirmar codificacion y rango crudo del modulo real"
  }
}

El núcleo trabaja siempre en unidades de ingeniería. La conversión a crudo ocurre únicamente en el adaptador Modbus, en el borde. Todos los rangos de ingeniería de la semilla son invención (PEND-06).

Registros de identidad de módulo

El apéndice define registros de nombre de módulo, versión y Comm Safety en 40211..40216, y habilitación de canal en 40221. Si el controlador los interroga durante la puesta en marcha, el emulador debe responder con los valores del manual. La semilla no los incluye; se añaden si se comprueba que el controlador los consulta.

Valores del manual, para referencia:

Módulo Module Name 1 Module Name 2
ADAM 4024 0x4024 0x0000
ADAM 4051 no documentado no documentado
ADAM 4055 0x4055 0x0000
ADAM 4068 0x4068 0x0000

Comandos por flanco

Varios comandos aparecen como pares mutuamente excluyentes: Turn On Tx / Turn Off Tx, Turn On RFE / Turn Off RFE, Turn On Radar / Turn Off Radar. Eso indica comandos momentáneos sobre una máquina de estados enclavada en el radar, no bits de nivel.

El emulador detecta flanco de subida, no nivel. Dos consecuencias a implementar:

  • Un pulso más corto que el tick puede perderse. El adaptador Modbus marca el flanco al recibir la escritura y el lazo lo consume en el siguiente tick, aunque la señal ya haya vuelto a cero.
  • Si ambos comandos del par están activos simultáneamente, prevalece apagar. Es el estado seguro. La regla es explícita en la configuración, no implícita en el código.