Vai al contenuto
PLC Forum


Comunicazione Arduino con PLC ET200S


AndreaADZ

Messaggi consigliati

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


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

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...