Seguidores solares de dos ejesRaspberry PLC 21CANopenControl
Gobernar un variador LOVATO VLB3 por CANopen SDO con Python
Mover un eje pesado de un seguidor solar significa comandar un variador con rampas, cambios de sentido y supervisión constante. Este ejemplo muestra el control de un VFD por CANopen con un variador LOVATO VLB3 desde el bus CAN integrado de un Raspberry PLC 21, escrito en Python con la librería canopen. Extraído de un despliegue real de seguidor solar de dos ejes, cubre la parametrización del motor por SDO, marcha adelante, marcha atrás, paro con rampa, consignas de frecuencia y lectura en vivo de la corriente del motor y de los códigos de error.
Una palabra de control, tres comandos
El VLB3 expone su interfaz de comandos en el objeto 0x400B. Escribir 0x0061 en el subíndice 1 arranca el motor hacia delante, 0x0062 lo invierte y 0x0060 lo detiene con la rampa de deceleración configurada. La consigna de frecuencia va al subíndice 3 en décimas de hercio, así que 250 significa 25,0 Hz. Tres escrituras SDO sustituyen a todo un armario de relés y potenciómetros, y cada comando viaja por los mismos dos hilos que la realimentación.
Parametrización del motor a través del bus
El boost, el cos phi y la tensión/frecuencia nominales se escriben una sola vez al arranque por SDO, directamente desde los valores de placa del motor recogidos en la cabecera del script. Esto hace trivial la sustitución del variador: cambias el hardware, alimentas, y el PLC vuelca automáticamente la configuración completa del motor — sin menús de teclado y sin parámetros perdidos en un armario en medio del campo. La cabecera del script se convierte en la única fuente de verdad de los datos del motor.
Supervisión con lectura de corriente y errores
Durante cada maniobra el script sondea el objeto 0x2D88 para la corriente del motor (décimas de amperio) y 0x603F para el código de error CiA. Cualquier error distinto de cero dispara un paro inmediato y lanza una excepción con el código, de modo que un eje bloqueado o un disparo por subtensión nunca pasan desapercibidos. Un bloque finally garantiza que el motor queda parado y el bus cerrado incluso ante un crash.
Un fragmento de la implementación
Tal cual del ejemplo desplegado en el Raspberry PLC 21 — cópialo libremente:
def connect():
"""Opens the CAN bus and returns (network, VFD node)."""
network = canopen.Network()
network.connect(channel=CAN_CHANNEL, bustype='socketcan',
bitrate=CAN_BITRATE)
driver = network.add_node(NODE_VFD, EDS_VFD)
driver.nmt.state = 'OPERATIONAL'
return network, driver
El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.
Preguntas frecuentes
¿Qué bitrate de CAN usa este montaje?
El ejemplo levanta can0 a 125 kbit/s con ip link, una elección robusta para las longitudes de cable habituales dentro de un seguidor. El variador, los encoders y el PLC deben compartir el mismo bitrate.
¿Necesito el fichero EDS del LOVATO VLB3?
Sí. La librería canopen carga el diccionario de objetos del variador desde el EDS, lo que permite direccionar objetos como 0x400B por índice. LOVATO proporciona el EDS de la serie VLB3 en su web.
¿Puede el Raspberry PLC hablar con el variador y los encoders en el mismo bus?
Sí. CANopen es multipunto, así que el VLB3 (nodo 3) y los dos encoders (nodos 4 y 5) comparten el mismo par trenzado, cada uno con un node ID único y la terminación adecuada en ambos extremos.