Para verificar que las salidas de tu Raspberry PLC funcionan correctamente, el enfoque recomendado es ejecutar un programa de prueba en C++ que alterne todas las salidas digitales, analógicas y de relé cada segundo. Si los LED correspondientes se encienden y apagan, las salidas funcionan. Si no responden, el problema está en la configuración del software o en el propio hardware.
Instalación de la librería rpiplc-lib
El programa de prueba depende de la librería rpiplc-lib. Sigue estos pasos para instalarla:
- Instala git si no está presente:
sudo apt update && sudo apt install git - Clona el repositorio en un directorio de tu elección:
git clone https://github.com/Industrial-Shields/rpiplc-lib.git - Entra en el directorio y compila:
cd rpiplc-lib && make - Instala en el sistema:
sudo make install
La librería instala sus cabeceras en /usr/local/include/rpiplc y la librería compilada en /usr/local/lib.
Programa de prueba de salidas
Guarda el siguiente código en un archivo llamado test_outputs.cpp. El programa usa condicionales de preprocesador para activar los pines de salida correctos según el modelo de Raspberry PLC.
#include <rpiplc.h>
void setDigitalPins(int state) {
digitalWrite(PWM3, state);
digitalWrite(PWM2, state);
digitalWrite(PWM1, state);
#if defined(RPIPLC_21) || defined(RPIPLC_38AR) || defined(RPIPLC_42) || defined(RPIPLC_53ARR) || defined(RPIPLC_54ARA) || defined(RPIPLC_57AAR) || defined(RPIPLC_58)
digitalWrite(Q0_0, state); digitalWrite(Q0_1, state); digitalWrite(Q0_2, state);
digitalWrite(Q0_3, state); digitalWrite(Q0_4, state); digitalWrite(Q0_5, state);
digitalWrite(Q0_6, state); digitalWrite(Q0_7, state);
#elif defined(RPIPLC_19R) || defined(RPIPLC_38R) || defined(RPIPLC_50RRA) || defined(RPIPLC_57R)
digitalWrite(Q0_0, state); digitalWrite(Q0_1, state); digitalWrite(Q0_2, state);
digitalWrite(R0_1, state); digitalWrite(R0_2, state); digitalWrite(R0_3, state);
digitalWrite(R0_4, state); digitalWrite(R0_5, state); digitalWrite(R0_6, state);
digitalWrite(R0_7, state); digitalWrite(R0_8, state);
#endif
#if defined(RPIPLC_42) || defined(RPIPLC_57AAR) || defined(RPIPLC_58)
digitalWrite(Q1_0, state); digitalWrite(Q1_1, state); digitalWrite(Q1_2, state);
digitalWrite(Q1_3, state); digitalWrite(Q1_4, state); digitalWrite(Q1_5, state);
digitalWrite(Q1_6, state); digitalWrite(Q1_7, state);
#elif defined(RPIPLC_38R) || defined(RPIPLC_38AR) || defined(RPIPLC_50RRA) || defined(RPIPLC_53ARR) || defined(RPIPLC_54ARA) || defined(RPIPLC_57R)
digitalWrite(Q1_0, state); digitalWrite(Q1_1, state); digitalWrite(Q1_2, state);
digitalWrite(R1_1, state); digitalWrite(R1_2, state); digitalWrite(R1_3, state);
digitalWrite(R1_4, state); digitalWrite(R1_5, state); digitalWrite(R1_6, state);
digitalWrite(R1_7, state); digitalWrite(R1_8, state);
#endif
#if defined(RPIPLC_50RRA) || defined(RPIPLC_54ARA) || defined(RPIPLC_58)
digitalWrite(Q2_0, state); digitalWrite(Q2_1, state); digitalWrite(Q2_2, state);
digitalWrite(Q2_3, state); digitalWrite(Q2_4, state); digitalWrite(Q2_5, state);
digitalWrite(Q2_6, state); digitalWrite(Q2_7, state);
#elif defined(RPIPLC_53ARR) || defined(RPIPLC_57AAR) || defined(RPIPLC_57R)
digitalWrite(Q2_0, state); digitalWrite(Q2_1, state); digitalWrite(Q2_2, state);
digitalWrite(R2_1, state); digitalWrite(R2_2, state); digitalWrite(R2_3, state);
digitalWrite(R2_4, state); digitalWrite(R2_5, state); digitalWrite(R2_6, state);
digitalWrite(R2_7, state); digitalWrite(R2_8, state);
#endif
}
void setAnalogPins(int value) {
#if defined(RPIPLC_21) || defined(RPIPLC_38AR) || defined(RPIPLC_42) || defined(RPIPLC_53ARR) || defined(RPIPLC_54ARA) || defined(RPIPLC_57AAR) || defined(RPIPLC_58)
analogWrite(A0_5, value); analogWrite(A0_6, value); analogWrite(A0_7, value);
#elif defined(RPIPLC_19R) || defined(RPIPLC_38R) || defined(RPIPLC_50RRA) || defined(RPIPLC_57R)
analogWrite(A0_0, value); analogWrite(A0_1, value); analogWrite(A0_2, value);
#endif
#if defined(RPIPLC_42) || defined(RPIPLC_57AAR) || defined(RPIPLC_58)
analogWrite(A1_5, value); analogWrite(A1_6, value); analogWrite(A1_7, value);
#elif defined(RPIPLC_38R) || defined(RPIPLC_38AR) || defined(RPIPLC_50RRA) || defined(RPIPLC_53ARR) || defined(RPIPLC_54ARA) || defined(RPIPLC_57R)
analogWrite(A1_0, value); analogWrite(A1_1, value); analogWrite(A1_2, value);
#endif
#if defined(RPIPLC_50RRA) || defined(RPIPLC_54ARA) || defined(RPIPLC_58)
analogWrite(A2_5, value); analogWrite(A2_6, value); analogWrite(A2_7, value);
#elif defined(RPIPLC_53ARR) || defined(RPIPLC_57AAR) || defined(RPIPLC_57R)
analogWrite(A2_0, value); analogWrite(A2_1, value); analogWrite(A2_2, value);
#endif
}
int main() {
initPins();
while (true) {
setDigitalPins(1);
setAnalogPins(2000);
delay(1000);
setDigitalPins(0);
setAnalogPins(0);
delay(1000);
}
}Compilación y ejecución de la prueba
Compila el programa con el siguiente comando, sustituyendo RPIPLC_XX por el modelo que corresponda a tu unidad (por ejemplo RPIPLC_58):
g++ -o test_outputs test_outputs.cpp -L /usr/local/lib -l rpiplc -I /usr/local/include/rpiplc -D RPIPLC_XX
Los defines de modelo disponibles son: RPIPLC_19R, RPIPLC_21, RPIPLC_38AR, RPIPLC_38R, RPIPLC_42, RPIPLC_50RRA, RPIPLC_53ARR, RPIPLC_54ARA, RPIPLC_57AAR, RPIPLC_57R, RPIPLC_58.
Ejecuta el binario compilado como root:
sudo ./test_outputs
El programa alterna todas las salidas cada segundo. Observa los LED del panel del PLC. Si algún LED no responde, comprueba el cableado y la instalación de la librería.

Cómo verificar las salidas del Raspberry PLC