Buongiorno
Intanto ringrazio tutti per la miriade di informazioni che ho trovato sul forum con cui sono riuscito ad elaborare il mio piccolo progettino. sono un novizio del settore arduino e immancabilmente mi sono trovato davanti ad un problema che non riesco a risolvere.
Ho un server con cui non faccio altro che inviare ad un plc lo stato degli io a bordo arduino ed alzare le uscite che il plc mi comanda. tutto tramite wifi e collegamento tcp.
Fin qui tutto bene la cosa funziona a dovere se non che per processare il comando server.available() ci metto 2 secondi.
il refresh di io su scheda arduino da parte del plc è di 2.2s e anche quando invio un comando da plc ci mette 2.2 secondi ad eseguirlo.
se lo salto con un while client.connected per evitare di processarlo finchè il client è connesso non va più nulla però il tempo di refresh dei comandi scende a 0.2s.
ringrazio tutti in anticipo per l'aiuto
Aggiornamento: realmente guardando le statistiche che mi sono generato sul plc noto che il problema deriva dal fatto che dopo un comando di send tcp da parte del mio plc mi arriva la risposta di send ok dopo circa 1.8 secondi. ho controllato che non fosse un errore nel sw del plc ma con un altro apparecchio non lo fa.
vi posto il codice:
#include <ESP8266WiFi.h>
////////////////// DEFINIZIONE VARIABILI /////////////////////////////
//wifi
const char* ssid = "SISSI";
const char* password = "K35235514";
int stato = 0;
String stringa_invio;
String stringa_ricezione = " ";
const String stringa_vuota = " ";
char ricezione[10];
int ok_ricezione = 0;
int out = 0;
int ok_rx = 0;
int errore = 0;
char car;
int com_stato = 0;
/////////////////////////////////////////////////////////////
/////// DIFINIZIONE PROTOCOLLO DI COMUNICAZIONE///////////////77
WiFiServer server(2000); //PORTA
///////////////////////////////////////////////////////7
//////////////////////////////7SETUP////////////////////////////////////
void setup() {
/////////////// CONFIGURAZIONE PIN ///////
pinMode(D0,OUTPUT); //RESET SCHEDA
pinMode(D1,INPUT);
pinMode(D2,INPUT);
pinMode(D3,INPUT);
pinMode(D4,INPUT);
pinMode(D5,OUTPUT);
pinMode(D6,OUTPUT);
pinMode(D7,OUTPUT);
pinMode(D8,OUTPUT);
// pinMode(D9,OUTPUT); ////occupati da monitor seriale
// pinMode(D10,OUTPUT); //////occupati da monitor seriale
pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
digitalWrite(LED_BUILTIN, HIGH);
//////////////////////////////
////////// CONFIGURAZIONE SERIALE ////////////////////77
Serial.begin(115200);
delay(10);
///////////////////////////////////////////////////////
////////indirizzo ip statico /////////////////////77
IPAddress myIP(192, 168, 1, 244);
IPAddress dnsIP(8,8,8,8);
IPAddress routerIP(192, 168, 1, 1);
IPAddress netMask(255, 255, 255, 0);
/////////////////////////////////////////////7
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.config(myIP, dnsIP, routerIP, netMask);WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());
}
///////////////////////////////LOOP//////////////////////////////////////////////////////
void loop() {
com_stato = 0;
digitalWrite(LED_BUILTIN, HIGH); //METTO LED SCHEDA SU OFF PER SEGNALARE CHE NON E CONNESSA
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
////// attesa ricezione
Serial.println("CONNESSO");
digitalWrite(LED_BUILTIN, LOW); //METTO LED SCHEDA SU ON PER SEGNALARE CHE è CONNESSA
while(!client.available()){
delay(1);
}
//////// leggi stringa
String stringa_ricezione = client.readStringUntil('Q');
Serial.println(stringa_ricezione);
client.flush();
////////////////////// comando uscite ////////////////////////////////////
if (stringa_ricezione.charAt(0) == 'A') { //controllo se il comando è dato al nodo giusto
if (stringa_ricezione.charAt(1) == '1') {
digitalWrite(D5, HIGH);
}
else {
digitalWrite(D5, LOW);
}
if (stringa_ricezione.charAt(2) == '1') {
digitalWrite(D6, HIGH);
}
else {
digitalWrite(D6, LOW);
}
if (stringa_ricezione.charAt(3) == '1') {
digitalWrite(D7, HIGH);
}
else {
digitalWrite(D7, LOW);
}
if (stringa_ricezione.charAt(4) == '1') {
digitalWrite(D8, HIGH);
}
else {
digitalWrite(D8, LOW);
}
}
/////////////// IMPOSTO STRINGA DI INVIO A PLC CON STATO I/O
String nodo = "A";
stato= errore;
String in_0 = String(stato, DEC);
stato= digitalRead(D1);
String in_1 = String(stato, DEC);
stato= digitalRead(D2);
String in_2 = String(stato, DEC);
stato= digitalRead(D3);
String in_3 = String(stato, DEC);
stato= digitalRead(D4);
String in_4 = String(stato, DEC);
stato= digitalRead(D5);
String out_1 = String(stato, DEC);
stato= digitalRead(D6);
String out_2 = String(stato, DEC);
stato= digitalRead(D7);
String out_3 = String(stato, DEC);
stato= digitalRead(D8);
String out_4 = String(stato, DEC);
/////////////////////////////////////////////////////////////////////
//////////////////////STRINGA INVIO////////////////////////////77
stringa_invio = String (nodo + in_0 + in_1 + in_2 + in_3 + in_4 + out_1 + out_2 + out_3 + out_4);
client.print(stringa_invio);
Serial.println(stringa_invio);
client.flush();
///////////////////////////////////////////////////////////////////////////////////////////////////7
delay(1);
// Serial.println("Client disonnected");
// The client will actually be disconnected
// when the function returns and 'client' object is detroyed
}