Ir al contenido

Cómo probar el bus CAN en un Raspberry PLC

Prueba del bus CAN con can-utils entre dos Raspberry PLC
7 de septiembre de 2021 por
Cómo probar el bus CAN en un Raspberry PLC
Boot & Work Corp. S.L, Fernandez Queralt Martinez

Guía completa: Cómo elegir un controlador industrial

Para probar el bus CAN en un Raspberry PLC, conecta CAN H con CAN H y CAN L con CAN L entre dos PLC, levanta la interfaz can0 con la misma velocidad en los dos, ejecuta candump can0 en un PLC y cansend can0 111#FF en el otro. Si el primer PLC muestra can0 111 [1] FF, el controlador CAN, el cableado y la velocidad son correctos.

Esta prueba se hizo con dos Raspberry PLC v3, en los que el controlador CAN es un MCP2515 conectado al bus SPI de la Raspberry Pi. En la familia Raspberry PLC actual, el CAN es una placa de expansión con el mismo controlador: MCP2515, CAN 2.0B, hasta 1 Mbit/s. La prueba con can-utils es la misma. Solo cambian los parámetros del overlay según la versión de hardware.

¿Qué es el bus CAN?

CAN (Controller Area Network) es un bus serie en el que cada nodo envía tramas cortas con un identificador, y todos los nodos reciben todas las tramas. Se diseñó para el cableado de los vehículos y hoy se usa en máquinas, equipos móviles y dispositivos industriales. Cuando dos nodos transmiten a la vez, la trama con el identificador más bajo gana el bus y el otro nodo vuelve a intentarlo, así que no se pierden datos en una colisión.

CaracterísticaCAN clásico (CAN 2.0)
Identificador11 bits (estándar, CAN 2.0A) o 29 bits (extendido, CAN 2.0B)
Datos por tramaDe 0 a 8 bytes
Capa físicaPar diferencial, CAN H y CAN L, normalmente trenzado
Terminación120 Ω en cada extremo del bus
VelocidadHasta 1 Mbit/s. Cuanto más alta, más corto debe ser el bus
Gestión de erroresCRC y bit de reconocimiento en cada trama; un nodo con demasiados errores pasa a bus off

En Linux, el controlador CAN aparece como una interfaz de red (can0) mediante SocketCAN, así que se configura con ip y se prueba con las herramientas de can-utils.

Qué necesitas

  • Dos Raspberry PLC con CAN: un v3, o un modelo actual con la placa de expansión CAN.
  • Una fuente de alimentación de 12 a 24 Vdc para cada PLC.
  • Un cable de par trenzado para CAN H y CAN L.
  • Dos resistencias de 120 Ω, una en cada extremo del bus, si tus placas no las llevan.

Comprueba la interfaz CAN en cada PLC

  1. Usa la imagen del Raspberry PLC, o créala con los archivos de configuración como se explica en cómo crear una imagen de Raspberry PLC a partir de Raspberry Pi OS.
  2. Comprueba que el SPI está activado. El MCP2515 se comunica con la Raspberry Pi por SPI.
  3. Comprueba que el archivo de configuración tiene el overlay del controlador CAN. En el Raspberry PLC v3 es esta línea, con el cristal de 20 MHz y la interrupción en el GPIO 5 de esa placa:
    dtoverlay=mcp2515-can0,interrupt=5,oscillator=20000000
    El archivo es /boot/firmware/config.txt en Raspberry Pi OS Bookworm y /boot/config.txt en imágenes anteriores. En una placa de expansión CAN, usa los valores de oscilador e interrupción de su guía de usuario, no los del v3.
  4. Después de reiniciar, comprueba que el driver ha encontrado el controlador. El driver mcp251x escribe una línea cuando inicializa el MCP2515:
    dmesg | grep -i mcp251
  5. Levanta la interfaz y comprueba su estado:
    sudo ip link set can0 up type can bitrate 500000 restart-ms 100
    ip -details -statistics link show can0
    La interfaz debe estar UP y el estado CAN debe ser ERROR-ACTIVE. Usa la misma velocidad en los dos PLC.
  6. La imagen del v3 también levanta can0 al arrancar con el archivo /etc/network/interfaces.d/can0. Su contenido es:
    auto can0
    iface can0 inet manual
        pre-up /sbin/ip link set can0 type can bitrate 500000 triple-sampling on restart-ms 100
        up /sbin/ifconfig can0 up
        down /sbin/ifconfig can0 down
    Este archivo necesita ifupdown e ifconfig (net-tools). Si tu imagen no los usa, levanta la interfaz con el comando ip del paso anterior.
  7. Instala can-utils, que incluye los comandos candump, cansend y cangen:
    sudo apt update
    sudo apt install can-utils

Cablea el bus CAN entre dos PLC

Conecta CAN H del primer PLC con CAN H del segundo, y CAN L con CAN L. Usa un par trenzado. Si los PLC no comparten la fuente de alimentación, conecta también una referencia de masa común.

Esquema de conexión: CAN H y CAN L conectados entre los bornes CAN de dos Raspberry PLC
CAN H y CAN L entre los conectores de comunicación de dos Raspberry PLC.

El bus necesita una resistencia de 120 Ω en cada extremo, también con solo dos nodos. Sin alimentación, deberías medir unos 60 Ω entre CAN H y CAN L. Consulta en la guía de usuario de tu PLC si la placa ya lleva una resistencia de terminación.

Envía y recibe una trama CAN

1. Escucha en el primer PLC. Abre un terminal y arranca candump. Muestra todas las tramas que llegan a can0.

candump can0
Terminal del primer Raspberry PLC ejecutando candump can0 a la espera de tramas
candump esperando tramas en el primer PLC.

2. Envía una trama desde el segundo PLC. 111#FF significa identificador 0x111 (hexadecimal, 11 bits) y un byte de datos, 0xFF.

cansend can0 111#FF
Terminal del segundo Raspberry PLC: ifconfig can0 muestra UP y RUNNING, y después cansend can0 111#FF
El segundo PLC: can0 está UP y RUNNING, y cansend envía la trama.

3. Lee el resultado en el primer PLC. candump muestra la interfaz, el identificador, el número de bytes de datos entre corchetes y los datos:

  can0  111   [1]  FF
Terminal del primer Raspberry PLC: candump can0 recibe la trama can0 111 [1] FF
El primer PLC recibe la trama 111 con un byte, FF.

Más tramas para probar el bus:

cansend can0 123#DEADBEEF        # standard ID 0x123, 4 data bytes
cansend can0 18FF1234#0102030405  # extended 29-bit ID, 5 data bytes
candump -ta can0                  # received frames with absolute time
cangen can0 -g 100                # one random frame every 100 ms

Si la trama no llega

SíntomaCausa habitualQué revisar
can0 no existeFalta el overlay, el SPI está desactivado, o los valores de oscilador o interrupción son incorrectosLa línea del overlay, el SPI y dmesg | grep -i mcp251
can0 está DOWNLa interfaz no se ha levantadosudo ip link set can0 up type can bitrate 500000
cansend dice "No buffer space available"Ningún otro nodo reconoce las tramas y la cola de transmisión se llenaQue el otro PLC esté encendido, misma velocidad, CAN H y CAN L sin cruzar, terminación
Estado ERROR-PASSIVE o BUS-OFFDemasiados errores en el busVelocidad, terminación, cableado. Con restart-ms el controlador sale solo del bus off
Las tramas llegan con errores en las estadísticasRuido o una derivación largaPar trenzado, derivaciones cortas, una sola terminación en cada extremo

De una trama de prueba a una aplicación CAN

Una trama desde el terminal demuestra que el hardware funciona. Un equipo real suele usar un protocolo de nivel superior sobre CAN, como CANopen en accionamientos y sensores industriales, o SAE J1939 en vehículos y maquinaria móvil. En un programa, usas la misma interfaz can0 desde Python con la librería python-can, o desde C con sockets SocketCAN.

Mira CANopen en un Raspberry PLC. Dos ejemplos completos de la PLC Solution Library leen un encoder y un inclinómetro CANopen en un seguidor solar, y controlan un variador LOVATO VLB3 por CANopen.

Lectura de un encoder CANopenControl de un variador por CANopen

Preguntas frecuentes sobre el bus CAN en un Raspberry PLC

¿El Raspberry PLC tiene bus CAN?

El Raspberry PLC v3 tiene un controlador CAN MCP2515. En la familia actual, el CAN es una placa de expansión con el controlador MCP2515, CAN 2.0B, hasta 1 Mbit/s. Pídela al encargar el PLC.

¿Qué velocidad debo usar?

La de los demás equipos del bus: todos los nodos deben usar la misma. 500 kbit/s y 250 kbit/s son habituales. Las velocidades más bajas permiten cables más largos.

¿Necesito resistencias de terminación con solo dos PLC?

Sí. El bus necesita 120 Ω en cada extremo, sea cual sea el número de nodos. Sin terminación, las tramas pueden fallar incluso con un cable corto.

¿El MCP2515 es compatible con CAN FD?

No. El MCP2515 es un controlador CAN 2.0B: tramas clásicas de hasta 8 bytes de datos.

¿Por qué cansend falla con "No buffer space available"?

Porque ningún otro nodo reconoce las tramas. Comprueba que el segundo PLC está encendido y escuchando a la misma velocidad, y revisa el cableado y la terminación.

Buscar en nuestro blog

Cómo probar el bus CAN en un Raspberry PLC
Boot & Work Corp. S.L, Fernandez Queralt Martinez 7 de septiembre de 2021
Compartir esta publicación

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.

Comparativa de PLCs