AndreaADZ Inserito: 9 luglio 2021 Segnala Share Inserito: 9 luglio 2021 Buonasera, spero qualcuno possa aiutarmi, avendo sviluppato un applicativo con un plc Siemens nello specifico un (ET200s) con il quale controllo la mia casa, vorrei inserire delle sonde DS18B20 per il controllo della temperatura le stesse collegate ad un Arduino che a sua volta comunica tramite shield ethernet utilizzando la libreria settimino con il plc, il mio problema consiste nella conversione del dato letto da Arduino e trasferito al plc, ho già stabilito una connessione tra i due dispositivi ma nel momento della scrittura ricevo un dato errato. ES.(arduino 28.69°C plc 7196). Ricercando nei vari forum ho letto l’indispensabile conversione in quanto Arduino ha dei dati Little-Endian mentre il plc ha dei dati Big-Endian. Allego lo sketch. Spero qualcuno possa aiutarmi. //----------------------------------------------------------------------*/ #include <SPI.h> #include <Ethernet.h> #include "Settimino.h" #include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(2); DallasTemperature temp(&oneWire); float tc = 0; char comando; // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x08, 0xE11 }; IPAddress Local(192,168,1,70); // Local Address IPAddress PLC(192,168,1,250); // PLC Address byte Buffer[512]; S7Client Client; unsigned long Elapsed; // To calc the execution time //---------------------------------------------------------------------- // Setup : Init Ethernet and Serial port //---------------------------------------------------------------------- void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); temp.begin(); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } // Start the Ethernet Library Ethernet.begin(mac, Local); // Setup Time, someone said me to leave 2000 because some // rubbish compatible boards are a bit deaf. delay(2000); Serial.println(Ethernet.localIP()); } //---------------------------------------------------------------------- // Connects to the PLC //---------------------------------------------------------------------- bool Connect() { int Result=Client.ConnectTo(PLC, 0, // Rack (see the doc.) 2); // Slot (see the doc.) Serial.print("Connecting to ");Serial.println(PLC); if (Result==0) { Serial.print("Connected ! PDU Length = ");Serial.println(Client.GetPDULength()); } else Serial.println("Connection error"); return Result==0; } //---------------------------------------------------------------------- // Prints the Error number //---------------------------------------------------------------------- void CheckError(int ErrNo) { Serial.print("Error No. 0x"); Serial.println(ErrNo, HEX); // Checks if it's a Severe Error => we need to disconnect if (ErrNo & 0x00FF) { Serial.println("SEVERE ERROR, disconnecting."); Client.Disconnect(); } } //---------------------------------------------------------------------- // Profiling routines //---------------------------------------------------------------------- void MarkTime() { Elapsed=millis(); } //---------------------------------------------------------------------- void ShowTime() { // Calcs the time Elapsed=millis()-Elapsed; Serial.print("Job time (ms) : "); Serial.println(Elapsed); } //---------------------------------------------------------------------- // Main Loop //---------------------------------------------------------------------- void loop() { temp.requestTemperatures(); tc = temp.getTempCByIndex(0); word Size; int Result; Size = sizeof(Buffer); // Connection while (!Client.Connected) { if (!Connect()) delay(500); } Serial.println("Uploading DB166"); // Get the current tick MarkTime(); Buffer[0]=tc; Result=Client.WriteArea(S7AreaDB, // We are requesting DB access 166, // DB Number 0, // Start from byte N.0 sizeof(word), // We need "Size" bytes Buffer); // Put them into our target (Buffer or PDU) if (Result==0) { ShowTime(); } else CheckError(Result); delay(500); Serial.print(" C "); Serial.print(tc); delay(1000); } Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 10 luglio 2021 Segnala Share Inserita: 10 luglio 2021 Questo è una problematica da sezione arduino, non da sezione PLC, visto che vuoi fare la conversione in arduino. Pro a spostare la discussione. Io ho avuto un problema analogo, sempre con il medesimo sensore, ed ho risolto passando 2 interi: nel primo passo la parte intera e nel secondo passo la parte decimale, così non ci sono problemi di conversione di tipo di floating Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora