web_relais.ino
Une page web servie par l'Opta elle-même : affichage de l'état des relais et de l'entrée analogique, boutons de commande par simple lien HTTP. Le dépannage à distance d'une machine sans redémarrer l'armoire, avec zéro dépendance logicielle.
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. Opta sur le réseau ; un navigateur (poste atelier ou téléphone en Wi-Fi d'atelier).
Câblage
Câble RJ45 ; l'IP statique du setup est à noter sur l'armoire. Ne pas exposer ce serveur sur Internet sans VPN.
Fonctionnement
Le serveur parse la ligne GET : /relais?n=&etat= applique la commande au relais puis renvoie la page HTML avec l'état courant lu en direct.
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
Ajouter un jeton dans l'URL pour restreindre l'accès, un refresh automatique (meta refresh), ou un bouton d'arrêt d'urgence prioritaire.
web_relais.ino
// Opta PLC : mini serveur web embarqué — page de commande des relais.
// GET / -> page HTML GET /relais?n=1&etat=on -> commande
#include "PLCContainer.h"
#include <Ethernet.h>
PLCContainer PLC;
EthernetServer serveur(80);
void page(EthernetClient &c) {
c.println("HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n"
"Connection: close\r\n\r\n"
"<h2>Opta PLC</h2><ul>");
for (int i = 0; i < 2; i++) {
c.print("<li>RO"); c.print(i + 1);
c.print(PLC.Relay[i].state() ? " : <b>ON</b> " : " : OFF ");
c.print("<a href=\"/relais?n="); c.print(i);
c.println(PLC.Relay[i].state() ? "&etat=off\">couper</a></li>"
: "&etat=on\">activer</a></li>");
}
c.print("</ul>AI1 = "); c.print(PLC.AnalogIn.read(OPTA_AI_1));
c.println(" mV"); c.stop();
}
void setup() {
PLC.begin();
byte mac[] = { 0x00, 0x80, 0xE1, 0x14, 0x22, 0x35 };
PLC.Eth.begin(mac, IPAddress(192, 168, 1, 62), IPAddress(192, 168, 1, 1));
serveur.begin();
}
void loop() {
EthernetClient c = serveur.available();
if (!c) return;
String req = c.readStringUntil('\n'); // ligne GET /...
if (req.startsWith("GET /relais")) {
int n = req.substring(req.indexOf("n=") + 2).toInt();
bool on = req.indexOf("etat=on") > 0;
if (n >= 0 && n < 2) PLC.Relay[n].write(on);
}
page(c);
delay(5); c.stop();
}