Ir al contenido

← Todas las funcionalidades

Seguidores solares de dos ejesRaspberry PLC 21CANopenAdquisición

Lectura de inclinómetros y encoders CANopen con Python en un PLC

Un motor sin realimentación de posición es una suposición, no un lazo de control. Este ejemplo lee dos encoders/inclinómetros CANopen TY7953 — uno por eje — desde el bus CAN de un Raspberry PLC 21 usando Python. Procede de un despliegue real de seguidor solar de dos ejes, donde el mismo bus transporta el variador y ambos sensores. Verás cómo llevar cada nodo al estado OPERATIONAL, leer position_value por SDO y convertir las unidades brutas en grados con una calibración de planta sencilla.

Dos nodos, un bus

El sensor de elevación ocupa el nodo 4 y el de azimut el nodo 5, compartiendo el par trenzado con el variador del motor. Cada uno se añade a la red con su fichero EDS, de modo que el diccionario de objetos puede direccionarse por nombre. Un node ID único por dispositivo y resistencias de terminación en ambos extremos del bus son toda la disciplina de cableado que exige CANopen.

Estado NMT antes de cualquier lectura

Un nodo CANopen recién alimentado arranca en PRE-OPERATIONAL, donde el SDO funciona pero el dispositivo no está comprometido con su tarea. El script pone explícitamente nmt.state en OPERATIONAL y espera brevemente antes de empezar a leer. Hacerlo nodo a nodo, en lugar de por broadcast, hace el arranque determinista: si un sensor está muerto, sabes exactamente cuál en el momento de la conexión, en vez de descubrirlo a mitad del seguimiento con la estructura ya en movimiento.

De cuentas brutas a grados

Leer encoder.sdo["position_value"].raw devuelve unidades enteras, no ángulos. La calibración de planta en este despliegue es de 10 unidades por grado, más un offset de cero por eje capturado durante la puesta en marcha con la mesa horizontal y orientada al sur. Mantener las constantes de calibración al principio del fichero hace que un re-cero mecánico tras un mantenimiento sea un cambio de una sola línea, y cada seguidor de la flota lleva sus propios offsets sin tocar la lógica de control.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el Raspberry PLC 21 — cópialo libremente:

def connect_encoder(network, node_id):
    """Registers an encoder on the bus and switches it to OPERATIONAL."""
    encoder = network.add_node(node_id, EDS_ENCODER)
    encoder.nmt.state = 'OPERATIONAL'
    # Short wait so the node processes the NMT state change.
    time.sleep(0.1)
    print(f"Encoder node {node_id}: state {encoder.nmt.state}")
    return encoder

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Cuál es aquí la diferencia entre un encoder y un inclinómetro?

Las unidades TY7953 reportan la inclinación absoluta como un objeto de posición CANopen, así que el software las trata como encoders absolutos. Como miden un ángulo referenciado a la gravedad, la lectura sobrevive a los cortes de alimentación sin necesidad de homing.

¿A qué velocidad puedo leer la posición por SDO?

Una lectura SDO es una transacción de petición-respuesta que se realiza cómodamente a unas decenas de hercios a 125 kbit/s. Para un seguidor solar, el sondeo de 1 segundo del ejemplo ya es generoso; los PDO solo hacen falta para control de movimiento rápido.

¿Qué ocurre si un encoder deja de responder?

La lectura SDO lanza una excepción de timeout en la librería canopen. En producción, eso debería detener el eje afectado a través del variador y señalizar el fallo, porque mover sin realimentación arriesga llevar la estructura contra sus topes mecánicos.

Funcionalidades relacionadas