sortie_analogique.ino
La salida analógica de Opta entrega 0-10 V en milivoltios: este sketch genera una rampa triangular completa, ideal para probar un variador de velocidad o una válvula proporcional. La rampa está limitada y la escritura usa la API oficial de PLC.
Hardware
Una Opta PLC de STMicroelectronics (STM32H747 en tiempo real + coprocesador seguro i.MX RT1052) programada con el entorno Arduino PLC, alimentada a 24 V DIN. Actuador 0-10 V (variador, válvula) en los bornes AO0 y GND analógico.
Cableado
AO0 a la entrada de consigna del variador, 0 V analógico a la masa de consigna (a menudo aislada de la de potencia: lee la doc del variador).
Funcionamiento
AnalogOut.write(CANAL, mv) manda un convertidor digital-analógico; la rampa incremental a 20 pasos/s evita tirones de consigna en el actuador.
Ejecución
Instala el gestor de placas Arduino PLC, selecciona «Opta PLC», conecta USB/DFU y vuelca el programa. El sketch corre por el STM32H747 en tiempo real.
Variantes
Sustituir la rampa por una consigna escrita por el SCADA vía Modbus, o regular una temperatura (PID sobre AI + AO).
sortie_analogique.ino
// Opta PLC : rampe de consigne 0-10 V sur AO0 (sortie analogique).
// Usage typique : consigne de variateur, vanne 0-10 V, potentiomètre numérique.
#include "PLCContainer.h"
PLCContainer PLC;
const int CANAL = OPTA_AO_0; // sortie analogique 0 (0-10 000 mV)
const unsigned long PAS_MS = 50; // 20 pas/s
int mv = 0; // valeur courante en millivolts
int sens = 100; // +100 mV par pas
unsigned long t0 = 0;
// Rampe douce : on limite aussi la dérivée pour ne pas brusquer l'actionneur.
void ecrire_mv(int v) {
v = constrain(v, 0, 10000);
PLC.AnalogOut.write(CANAL, v); // API officielle : millivolts
}
void setup() {
Serial.begin(115200);
PLC.begin();
ecrire_mv(0);
Serial.println("Rampe 0-10 V sur AO0 (Ctrl/Reset pour arreter)");
}
void loop() {
if (millis() - t0 < PAS_MS) return;
t0 = millis();
mv += sens;
if (mv >= 10000) { mv = 10000; sens = -100; } // sommet de rampe
if (mv <= 0) { mv = 0; sens = 100; } // pied de rampe
ecrire_mv(mv);
if ((mv % 1000) == 0) Serial.printf("AO0 = %d mV (%.1f V)\n", mv, mv / 1000.0f);
}