PLC → Historian (Modbus)¶
La frontera donde el sistema toca la máquina. Es la primera del camino y la única que depende de hardware que el equipo no controla.
Dos cosas conviene tener claras antes de cualquier detalle: es de solo lectura —el sistema
nunca le escribe al PLC, y eso es una decisión registrada en
SYS-ADR-007, no una casualidad— y nunca se
ejecutó contra un PLC real.
Esta frontera solo se ejerció contra un PLC simulado
El empaquetado y el CI del historian fijan la máquina simulada, no un PLC. El archivo de ejemplo apunta a un PLC real, pero nada en el repositorio lo usa.
El simulador se escribió a partir del mismo mapa de registros que usa el historian, así que los dos coinciden entre sí. Eso no dice nada sobre si coinciden con la máquina.
Es el mismo límite que instalación en planta señala para la Raspberry Pi, y conviene leerlos juntos: la primera conexión real es un evento de riesgo, no un trámite.
Cómo se lee cada variable¶
Son 18 variables, y el tipo declarado determina de qué espacio de direcciones del PLC sale:
| Tipo | Cuántas | De dónde se lee | Cómo se interpreta |
|---|---|---|---|
bool |
3 | Bobinas | Primer bit de la respuesta |
int16 |
4 | Registros de retención, 1 registro | Entero de 16 bits con signo |
float32 |
11 | Registros de retención, 2 registros consecutivos | Se combinan según el orden de palabra declarado |
Que los booleanos salgan de un espacio distinto importa para leer el mapa: la dirección 0 de
una bobina y la dirección 0 de un registro no son el mismo lugar. No hay colisión entre
estado, que es una bobina, y el resto.
Dos campos de la configuración se leen mal con frecuencia, así que vale decir qué hacen:
| Campo | Qué es | Qué no es |
|---|---|---|
unit |
El identificador del esclavo Modbus. Las 18 variables usan 1 |
No es una unidad de medida ni un factor |
scale |
Un factor multiplicativo opcional | Ninguna de las 18 lo declara: los valores llegan al almacén tal como los entrega el PLC, sin conversión |
El orden de palabra se declara solo en las once float32, que son las únicas donde
influye. Está bien resuelto y vale notarlo, porque es el detalle que más suele estar de más.
El mapa de registros¶
Las direcciones están espaciadas de diez en diez, y no se solapan —importa, porque cada
float32 ocupa dos registros—, con una sola excepción:
peso y pesoBruto leen exactamente el mismo registro
Misma dirección, mismo tipo, mismo orden de palabra. Van a tener siempre el mismo valor, y el catálogo las mapea como dos variables distintas.
El simulador lo declara así a propósito, en su propio mapa, así que no es un error de transcripción: o el PLC real expone un solo registro para las dos cosas, o el simulador arrastró un supuesto que nadie confirmó.
Es una de las cosas que hay que resolver en la primera conexión real, y es barata: alcanza con mirar si el PLC distingue peso de peso bruto.
Dos variables más merecen una nota: la hora y la fecha vienen empaquetadas en un entero —hora como HHMM y fecha como DDMM—, sin año. No son marcas de tiempo utilizables: la marca de tiempo real de cada medición la pone el historian al leer.
El ciclo de lectura¶
flowchart TD
A[Inicio del ciclo] --> B[Siguiente variable]
B --> C{¿La lectura lanza error?}
C -->|no| D{¿Devolvió un valor?}
C -->|sí| E[Reintenta: hasta 3 veces,<br/>esperando 5 s entre intentos]
E --> C
D -->|sí| F{¿Tiene entrada en el catálogo?}
D -->|no| G[Calidad BAD, solo al log.<br/>Sin reintento]
F -->|sí| H[Escribe el punto]
F -->|no| I[Se descarta, solo un aviso al log]
H --> J{¿Quedan variables?}
G --> J
I --> J
J -->|sí| B
J -->|no| K[Espera el intervalo y repite]
El intervalo por defecto es 1 segundo, y las 18 variables se recorren en serie. De ahí salen tres comportamientos que no son evidentes leyendo la configuración:
1 · Un PLC que falla secuestra el ciclo entero¶
Los reintentos esperan 5 segundos y son hasta 3 por variable. Con las 18 fallando, un ciclo de ~1 segundo pasa a unos 4 minutos y medio, y las variables sanas quedan esperando detrás de las que fallan. Está analizado en calidad y resiliencia.
2 · No todas las fallas reintentan¶
El reintento se dispara solo si la lectura lanza una excepción. Si el PLC responde algo que no trae datos utilizables, la lectura no lanza nada: devuelve vacío, se marca la calidad como mala y se pasa a la siguiente sin reintentar.
Es una asimetría llamativa: el caso más barato de reintentar es el único que no reintenta, y el más caro reintenta tres veces esperando cinco segundos.
3 · La calidad del dato no sale del log¶
Cada lectura produce un indicador de calidad, y no se escribe con el punto: no es etiqueta ni campo. Queda en el registro de texto del proceso.
La consecuencia está del otro lado de todo el camino: el dashboard no puede distinguir una medición de un hueco. Ver flujo de datos.
Una variable sin entrada en el catálogo se descarta sin error visible
Si una variable leída del PLC no tiene entrada en el catálogo, no se escribe: queda un aviso en el log y el ciclo sigue. Nada falla, ningún contador lo refleja.
Hoy las 18 tienen entrada, así que no se pierde nada. Pero agregar una variable al PLC y olvidarse del catálogo produce exactamente este silencio, y es la validación más barata que falta en todo el sistema: los dos archivos viven en el mismo repositorio.
Qué hace falta para conectar un PLC real¶
En orden, y el segundo es el que más fácil se pasa por alto:
- Apuntar el historian al PLC en lugar del simulador. Es una variable de entorno.
-
Confirmar el orden de palabra de los
float32. Si el PLC entrega las dos palabras invertidas —algo muy común—, hay que cambiarlo, y acá hay un problema:El orden de palabra invertido está implementado mal
Con el orden invertido, un valor que debería ser
1.5sale como6.9e-41.Hoy no afecta a nada, porque las 18 variables usan el orden directo. Pero es justamente la perilla que habría que mover al conectar un PLC con palabras invertidas, y el resultado no es un error: es un número absurdo, muy cerca de cero, que el resto del sistema acepta y almacena como si fuera una medición.
Es una línea de corrección, y conviene hacerla antes de la primera conexión, no durante.
-
Verificar el mapa de direcciones contra la documentación del PLC, incluido el caso de
pesoypesoBruto. - Decidir si hace falta escala. Hoy no hay ninguna, y si el PLC entrega enteros escalados —décimas de kilo, por ejemplo— las mediciones van a estar mal por un factor constante, que es el tipo de error más difícil de notar.
Si el PLC no responde, el servicio arranca igual
Una conexión fallida solo deja un aviso: el proceso sigue y entra al ciclo, donde cada lectura falla. Visto desde afuera, el servicio está corriendo.
Al conectar un PLC por primera vez, el único indicio confiable es que empiecen a aparecer puntos, no que el servicio esté levantado.
Qué no puede decir esta página¶
- Si el mapa de registros coincide con el PLC de la máquina. El único contraste disponible es el simulador, y el simulador salió del mismo mapa.
- El modelo ni la marca del PLC, ni si hay más de uno. No está en ningún repositorio.
- Si
pesoypesoBrutoson la misma cosa en la máquina. - Con qué frecuencia el PLC actualiza sus propios registros. Leer cada un segundo no garantiza un valor nuevo por segundo.
Dónde está implementado¶
El contrato vive en el repositorio del historian, que es de un autor externo. Los archivos que lo fijan:
- Las 18 variables, sus direcciones, tipos y orden de palabra:
src/historian/tags.yaml - Función Modbus por tipo, identificador de esclavo y aplicación de la escala:
src/historian/modbus_reader.py - Valores por defecto de la configuración, incluido que la escala es opcional y nunca se
declara:
src/historian/models.pyysrc/historian/tag_loader.py - Conversión de registros a valores, y el defecto del orden invertido:
src/historian/parsers.py - Intervalo, recorrido en serie, política de reintentos, destino del indicador de calidad y
descarte por falta de entrada en el catálogo:
src/historian/main.py - Mapa de direcciones del simulador, con la dirección compartida declarada a propósito:
src/historian/mock_modbus.py - El empaquetado y el CI fijando el simulador:
docker-compose.ymly.github/workflows/ci.yml
Relacionado¶
- Catálogo de variables — qué hace el sistema con estas 18 variables después de leerlas
- Flujo de datos — el camino completo, de este PLC al dashboard
SYS-ADR-007— sistema de monitoreo, no de control: por qué nunca se le escribe al PLC