Remote Plugin
Por motivos técnicos, el código fuente completo de estos ejemplos no puede mostrarse aquí.
Visite nuestro repositorio de GitHub con más ejemplos y el código fuente completo.
El "optiMEAS Remote Plugin Module" es una herramienta muy flexible para conectar aplicaciones externas al sistema smartCORE, basada en protocolos de comunicación y tecnologías modernos. La comunicación subyacente se realiza mediante el protocolo UDP (User Datagram Protocol), conocido por su baja latencia y eficiencia, especialmente en aplicaciones en tiempo real. El módulo utiliza el formato MsgPack para la serialización y deserialización eficientes de datos, lo que permite una transmisión de datos compacta y rápida. La interfaz para la comunicación con el sistema smartCORE se realiza mediante IPC (comunicación entre procesos), y la configuración de los canales de productor y de consumidor puede adaptarse individualmente. Esto permite la integración y el control de software externo en tiempo real y facilita la ampliación flexible de los sistemas existentes. La documentación ofrece ejemplos detallados para facilitar el desarrollo de plugins propios, de modo que los requisitos específicos puedan implementarse de forma sencilla y eficiente. Gracias al empleo de estas tecnologías, el módulo ofrece una solución robusta y escalable para la comunicación entre smartCORE y procesos externos, ideal para aplicaciones en entornos industriales exigentes.
Notas sobre el desarrollo de scripts:
- Si trabaja en Windows, asegúrese de que los scripts contengan solo
\n, no\r\n
Tutoriales
Desarrollo en un PC externo
Plugin sencillo de escritura de datos
Plugin de lectura y escritura de datos
[Avanzado] Instalación de nuevas bibliotecas de Python (p. ej., NumPy)
Configuración JSON
Configuración de los parámetros de red
| Palabra clave | Explicación |
|---|---|
| port | Puerto UDP en el que escucha el plugin (por defecto: 61616) |
| localhost | Restricción a la comunicación "solo localhost" (por defecto: true) |
Configuración del control de procesos
| Nombre | Explicación |
|---|---|
| enable | Determina si el proceso debe iniciarse y supervisarse (por defecto: false) |
| logOutput | Incorporar la salida (stdout y stderr) del proceso al archivo de registro de smartCORE (por defecto: true) |
| watchdogTimeout | Tiempo máximo entre 2 mensajes IPC hasta el REINICIO del proceso |
| disableKillAllProcesses | Desactivar la finalización de todos los procesos al iniciar o en caso de problemas (por defecto: false) |
| command | Nombre (con ruta opcional) del proceso |
| arguments | Argumentos de línea de comandos del proceso |
Configuración de los Producer Channels ( producerChannels )
| Palabra clave | Explicación |
|---|---|
| name | Nombre del canal |
| dataType | Tipo de datos del canal |
| physicalUnit | Unidad del canal |
Configuración del Consumer Channels ( consumerChannels )
| Palabra clave | Explicación |
|---|---|
| name | Nombre del canal que se va a leer |
Configuración de ejemplo
{
"module": "remote",
"factory": "remote",
"config": {
"port": 61616,
"localhost": true,
"process":
{
"enable": true,
"logOutput": false,
"watchdogTimeout": 60,
"disableKillAllProcesses": false,
"command": "i2c-sen5x-cpp",
"arguments": "--device-path=/dev/i2c-1 --interval=1"
},
"producerChannels": [
{
"name": "sen5x_pm1p0",
"dataType": "float",
"physicalUnit": "ug/m^3"
},
{
"name": "sen5x_pm2p5",
"dataType": "float",
"physicalUnit": "ug/m^3"
}
],
"consumerChannels": [
{
"name": "scd40_co2"
}
]
}
}
API/Protocolo
El protocolo consta de una cabecera en su mayor parte estática, en la que se especifica un código de comando, y (si es necesario) una carga útil JSON.
Cabecera
Metadatos de la cabecera
| Desplazamiento y tipo de datos | Nombre | Descripción |
|---|---|---|
| [0] uint32_t | magicToken | Reconocimiento del protocolo (fijo 0x45554C42) |
| [4] uint8_t | version | Versión del protocolo (actualmente siempre 1; abierta a ampliaciones) |
| [5] uint8_t | payloadType | Compatibilidad y distinción de distintos tipos de carga útil (aquí actualmente siempre 2) |
| [6] uint16_t | reserved | Reservado para ampliaciones futuras (el tamaño de la cabecera debe ser divisible por 4) |
| [8] uint64_t | senderPid | ID del proceso emisor |
| [16] uint64_t | senderTime_msSE | Instante en milisegundos en que se envió el paquete (con fines de diagnóstico) |
| [24] uint16_t | group | Identificador del servicio al que iba dirigida la llamada RPC o del que procede la respuesta (aquí fijo 1000) |
| [26] uint16_t | command | Número de la llamada RPC (véase la tabla siguiente) |
Comandos
| N.º de comando | Denominación | Explicación |
|---|---|---|
| 0 | LifeSignRequest | Consulta del estado de smartCORE |
| 1 | LifeSignResponse | Respuesta a LifeSignRequest |
| 100 | WriteSamplesByName | Enviar muestras individuales con el nombre del canal |
| 101 | ReadSamplesByNameRequest | Consulta de canales individuales mediante nombres de canal |
| 102 | ReadSamplesByNameResponse | Respuesta a ReadSamplesByNameRequest (valores medidos) |
| 200 | ChannelListRequest | Consulta de la lista de canales (asignación nombre de canal => índice) |
| 201 | ChannelListResponse | Respuesta a ChannelListRequest (lista de canales) |
| 202 | WriteSamplesRequest | Enviar muestras (opcionalmente con marca de tiempo) mediante índice |
| 203 | WriteSamplesResponse | Respuesta opcional a WriteSamplesRequest si se ha pasado un token de confirmación |
| 204 | ReadSamplesBegin | Activación del envío cíclico de valores medidos por parte de smartCORE |
| 205 | ReadSamplesContent | Valores medidos del envío cíclico |
| 206 | ReadSamplesEnd | Desactivación del envío cíclico |
| 300 | AlarmMessageRequest | Escritura de una alarma en la central de alarmas de smartCORE |
| 301 | AlarmMessageResponse | Confirmación de AlarmMessageRequest |