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ística | CAN clásico (CAN 2.0) |
|---|---|
| Identificador | 11 bits (estándar, CAN 2.0A) o 29 bits (extendido, CAN 2.0B) |
| Datos por trama | De 0 a 8 bytes |
| Capa física | Par diferencial, CAN H y CAN L, normalmente trenzado |
| Terminación | 120 Ω en cada extremo del bus |
| Velocidad | Hasta 1 Mbit/s. Cuanto más alta, más corto debe ser el bus |
| Gestión de errores | CRC 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
- 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.
- Comprueba que el SPI está activado. El MCP2515 se comunica con la Raspberry Pi por SPI.
- 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:
El archivo esdtoverlay=mcp2515-can0,interrupt=5,oscillator=20000000/boot/firmware/config.txten Raspberry Pi OS Bookworm y/boot/config.txten 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. - 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 - Levanta la interfaz y comprueba su estado:
La interfaz debe estar UP y el estado CAN debe ser ERROR-ACTIVE. Usa la misma velocidad en los dos PLC.sudo ip link set can0 up type can bitrate 500000 restart-ms 100 ip -details -statistics link show can0 - La imagen del v3 también levanta
can0al arrancar con el archivo/etc/network/interfaces.d/can0. Su contenido es:
Este archivo necesita ifupdown e ifconfig (net-tools). Si tu imagen no los usa, levanta la interfaz con el comandoauto 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 downipdel paso anterior. - Instala can-utils, que incluye los comandos
candump,cansendycangen: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.

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

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

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](/web/image/759618/canbus-raspberry-plc-candump.webp)
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íntoma | Causa habitual | Qué revisar |
|---|---|---|
can0 no existe | Falta el overlay, el SPI está desactivado, o los valores de oscilador o interrupción son incorrectos | La línea del overlay, el SPI y dmesg | grep -i mcp251 |
can0 está DOWN | La interfaz no se ha levantado | sudo 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 llena | Que el otro PLC esté encendido, misma velocidad, CAN H y CAN L sin cruzar, terminación |
| Estado ERROR-PASSIVE o BUS-OFF | Demasiados errores en el bus | Velocidad, terminación, cableado. Con restart-ms el controlador sale solo del bus off |
| Las tramas llegan con errores en las estadísticas | Ruido o una derivación larga | Par 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.
Más sobre el Raspberry PLC
- Cómo crear una imagen de Raspberry PLC a partir de Raspberry Pi OS
- Guía de Modbus TCP y RTU para PLC con Raspberry Pi
- Cómo programar en Python las entradas de interrupción del Raspberry PLC
- Cómo conectar un Raspberry PLC al Wi-Fi
- Cómo elegir un controlador industrial
Elige el modelo y la combinación de E/S en la familia Raspberry PLC.