Laboratorio Virtual de Ciberseguridad Industrial – Parte 4: Programación de la Lógica de Control
En el anterior post vimos cómo simular el proceso físico mediante FactoryIO, así que el último paso antes de poder comenzar a utilizar el laboratorio (al menos en su versión reducida sin SCADA), será programar la lógica de control que gobierne nuestra escena e integrar FactoryIO con OpenPLC mediante Modbus TCP.
Integración de OpenPLC con FactoryIO
Para integrar FactoryIO con OpenPLC, accedemos al portal web de OpenPLC (si recordamos, en nuestro caso 192.168.88.201:8080) y una vez dentro accederemos a la pestaña “Slave devices” para configurar el Driver de Factory IO como dispositivo esclavo, teniendo en cuenta las siguientes consideraciones:
- Device type: debe ser generic modbus TCP device
- SlaveID: puede ser cualquier número entero mayor que 0, pero debe ser el mismo que se haya configurado previamente en el driver de FactoryIo.
- IP Address: la misma que se haya configurado previamente en el driver de FactoryIO (adaptador host-only de VirtualBox).
- IP Port: 502 es el puerto por defecto de ModbusTCP, se aconseja mantenerlo por defecto aunque sería posible cambiarlo siempre que se ajuste adecuadamente en el driver de Factory IO
- DiscreteInputs: empezando en 0, y acabando en el número necesario de entradas (6 en nuestro caso)
- Coils: empezando en 0, y acabando en el número necesario de entradas (5 en nuestro caso)
- Input registers: nuestro ejemplo no cuenta con registros (solo entradas y salidas), así que se podrá configurar como 0,0
- Holding Registers – Read: nuestro ejemplo no cuenta con registros (solo entradas y salidas), así que se podrá configurar como 0,0
- Holding Registers -Write: nuestro ejemplo no cuenta con registros (solo entradas y salidas), así que se podrá configurar como 0,0

Programación de la Lógica de Control
Para programar la lógica de control se va a hacer uso de OpenPLC Editor, que es un programa independiente de OpenPLC y se puede descargar e instalar en nuestro dispositivo Windows10 (host). Una vez descargado y creado un nuevo proyecto (puedes encontrar más información sobre cómo hacer esto aquí), definiremos todas las variables a utilizar por el programa, teniendo en cuenta las siguientes consideraciones:
- Las variables declaradas en OpenPLC Editor deben estar en el mismo rango que las declaradas en el SlaveDevice configurado en el punto anterior
- Utilizaremos una variable auxiliar “RUN” de manera interna durante el programa, que no será necesario asignarla a ninguna entrada o salida (%IX100.x , %QX100.x)

Con las variables definidas, ya podemos empezar a desarrollar el programa de control utilizando para ello el lenguaje de escaleras (Ladder Logic) estándar en el sector, implementando las siguientes lógica:
- Pulsar el botón “StartButton” enciende o apaga la línea
- Abrir la puerta para todo el movimiento
- La cinta se para cuando hay una caja esperando
- Si hay una caja esperando, el robot desciende, enciende el succionador, asciende, gira, suelta la caja y vuelve a su posición de reposo
Cabe destacar que el programa que se verá a continuación no cumple con los estándares ni buenas prácticas del sector, pero es completamente funcional y nos perfectamente para su propósito, que es controlar la línea sin mayores complejidades.

Puesta en Marcha
Llegados a este punto se acerca el momento de la verdad, quedan ya solo un par de pasos más, para terminar
- Exportar el proyecto en OpenPLC como un archivo .ST
- Encender el router virtual pfSense
- Encender la máquina virtual de OpenPLC
- Acceder al portal de administración de OpenPLC
- Dentro de la pestaña “Programs”, cargar el archivo .ST exportado. Si todo ha ido bien obtendrás el siguiente mensaje:

- Enciende FactoryIO, carga la escena apropiada y ponla en modo ejecución
- Desde el dashboard de OpenPLC, haz click en “StartPLC”.
- En este punto deberías ser capaz de ver todos los estados de FactoryIO a través de la pestaña de “Monitoring” de OpenPLC

- En FactoryIO, presiona el botón de start situado en el cuadro eléctrico y verás como tu línea cobra vida!
