sortie_analogique.ino
La sortie analogique de l'Opta délivre 0-10 V en millivolts : ce programme génère une rampe triangulaire complète, idéale pour tester un variateur de vitesse ou une vanne proportionnelle. La rampe est bornée et l'écriture passe par l'API PLC.
Matériel requis
Une Opta PLC STMicroelectronics (STM32H747 temps réel + coprocesseur sécurisé i.MX RT1052) programmée avec l'environnement Arduino PLC, alimentée en 24 V DIN. Actionneur 0-10 V (variateur, vanne) sur les bornes AO0 et GND analogique.
Câblage
AO0 vers l'entrée de consigne du variateur, 0 V analogique vers la masse de consigne (souvent isolée de la puissance : lire la doc du variateur).
Fonctionnement
AnalogOut.write(CANAL, mv) pilote un convertisseur numérique-analogique ; la rampe incrémentale à 20 pas/s évite les à-coups de consigne sur l'actionneur.
Exécution
Installez le gestionnaire de cartes Arduino PLC, sélectionnez « Opta PLC », câblez en USB/DFU puis téléversez. Le programme tourne sur le STM32H747 côté temps réel.
Variantes
Remplacer la rampe par une consigne issue d'un registre Modbus écrit par le SCADA, ou asservir une température (PID sur 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);
}