Go Down

Topic: Settimino -> Siemens Logo und Arduino (Read 267 times) previous topic - next topic

luxusl

Nov 08, 2018, 12:36 pm Last Edit: Nov 08, 2018, 12:53 pm by luxusl
Hallo zusammen,

ich versuche Daten aus dem VM-Speicher einer Logo 0BA8 auszulesen. Für die definierten Parameter wie Timer funktioniert dies auch mit Settimino, allerdings möchte ich auch die Ein- und Ausgänge an den Arduino auch übertragen können.
Die Eingänge befinden sich bei VM-Adresse 1024 - 1031 und die Ausgänge bei 1064 - 1071, jeweils 8 Byte.

Hat mit Settimino jemand schon Erfahrungen?

Hier das Script:

Code: [Select]
/*----------------------------------------------------------------------
Data Read Demo

 Created 12 Dec 2016
 by Davide Nardella
 
------------------------------------------------------------------------
This demo shows how to read data from the PLC.
A DB with at least 1024 byte into the PLC is needed.
Specify its number into DBNum variable

- Both small and large data transfer are performed (see DO_IT_SMALL)
- During the loop, try to disconnect the ethernet cable.
  The system will report the error and will reconnect automatically
  when you re-plug the cable.
- For safety, this demo *doesn't write* data into the PLC, try
  yourself to change ReadArea with WriteArea.
- This demo uses ConnectTo() with Rack=0 and Slot=2 (S7300)
  - If you want to connect to S71200/S71500 change them to Rack=0, Slot=0.
  - If you want to connect to S7400 see your hardware configuration.
  - If you want to work with a LOGO 0BA7 or S7200 please refer to the
    documentation and change
    Client.ConnectTo(<IP>, <Rack>, <Slot>);
    with the couple
    Client.SetConnectionParams(<IP>, <LocalTSAP>, <Remote TSAP>);
    Client.Connect();

NodeMCU 1.0 ESP-12E ESP8266 supported
    
----------------------------------------------------------------------*/
// Wifi  -> #define S7WIFI
// Cable -> #define S7WIRED
#define S7WIRED

#include <SPI.h>
#include <Ethernet.h>
#ifdef S7WIFI
  //#include <ESP8266WiFi.h>
#endif
#include "Settimino.h"

// Uncomment next line to perform small and fast data access
#define DO_IT_SMALL

// 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, 0xE1 };

IPAddress Local(192,168,0,33); // Local Address
IPAddress PLC(192,168,0,3);   // PLC Address

// Following constants are needed if you are connecting via WIFI
// The ssid is the name of my WIFI network (the password obviously is wrong)
char ssid[] = "SKYNET-AIR";    // Your network SSID (name)
char pass[] = "yourpassword";  // Your network password (if any)
IPAddress Gateway(192, 168, 0, 1);
IPAddress Subnet(255, 255, 255, 0);

int DBNum = 100; // This DB must be present in your PLC
byte Buffer[1024];

#ifdef S7WIFI
// S7Client will create a WiFiClient as TCP Client
S7Client Client(_S7WIFI);
#else
// S7Client will create an EthernetClient as TCP Client
S7Client Client(_S7WIRED);
#endif

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);
     while (!Serial) {
      ; // wait for serial port to connect. Needed for Leonardo only
    }
    
#ifdef S7WIFI
//--------------------------------------------- ESP8266 Initialization    
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, pass);
    WiFi.config(Local, Gateway, Subnet);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected");  
    Serial.print("Local IP address : ");
    Serial.println(WiFi.localIP());
#else
//--------------------------------Wired Ethernet Shield Initialization    
    // 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("");
    Serial.println("Cable connected");  
    Serial.print("Local IP address : ");
    Serial.println(Ethernet.localIP());
#endif  
}
//----------------------------------------------------------------------
// Connects to the PLC
//----------------------------------------------------------------------
bool Connect()
{
    Client.SetConnectionParams(PLC, 0x0300, 0x0200);
    Client.Connect();

    
    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;
}
//----------------------------------------------------------------------
// Dumps a buffer (a very rough routine)
//----------------------------------------------------------------------
void Dump(void *Buffer, int Length)
{
  int i, cnt=0;
  pbyte buf;
  
  if (Buffer!=NULL)
    buf = pbyte(Buffer);
  else  
    buf = pbyte(&PDU.DATA[0]);

  Serial.print("[ Dumping ");Serial.print(Length);
  Serial.println(" bytes ]===========================");
  for (i=1024; i<Length; i++)
  {
    cnt++;
    if (buf[i]<0x10)
      Serial.print("0");
    Serial.print(buf[i], HEX);
    Serial.print(" ");
    if (cnt==16)
    {
      cnt=0;
      Serial.println();
    }
  }  

  Serial.println("======================DATA=====================");
  Serial.print("Timer 1: ");
  Serial.println(buf[1], DEC);
  
  Serial.print("Eingang 1: ");
  Serial.println(buf[1024], DEC);

    Serial.print("Ausgang 1: ");
  Serial.println(buf[1064], DEC);
  Serial.println("===============================================");
}
//----------------------------------------------------------------------
// 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()
{
  int Size, Result;
  void *Target;
  
#ifdef DO_IT_SMALL
  Size=1280; //64
  Target = NULL; // Uses the internal Buffer (PDU.DATA[])
#else
  Size=1024;
  Target = &Buffer; // Uses a larger buffer
#endif
  
  // Connection
  while (!Client.Connected)
  {
    if (!Connect())
      delay(500);
  }
  
  Serial.print("Reading ");Serial.print(Size);Serial.print(" bytes from DB");Serial.println(DBNum);
  // Get the current tick
  MarkTime();
  Result=Client.ReadArea(S7AreaDB, // We are requesting DB access
                         DBNum,    // DB Number
                         0,        // Start from byte N.0
                         Size,     // We need "Size" bytes
                         Target);  // Put them into our target (Buffer or PDU)
  if (Result==0)
  {
    ShowTime();
    Dump(Target, Size);
  }
  else
    CheckError(Result);
    
  delay(500);  
}




Danke für Eure Hilfe!

Doc_Arduino

Bitte nicht ein quote Tags sondern in code Tags den Sketch posten. Sonst hat man ggf. Buchstabensalat.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Scherheinz

#2
Nov 08, 2018, 02:58 pm Last Edit: Nov 08, 2018, 03:03 pm by Scherheinz
Du willst Ein- und Ausgänge einlesen, greifst aber auf einen DB zu!?

Code: [Select]
Result=Client.ReadArea(S7AreaDB, // We are requesting DB access


Ich benutze Settimino um auf 300er S7 zu zugreifen, ich weiß nicht genau wie das mit ner LOGO funktioniert aber dort gibt es doch keine DBs, oder?

EDIT:

Mach mal aus
Code: [Select]
int DBNum = 100; // This DB must be present in your PLC

Code: [Select]
int DBNum = 1; // This DB must be present in your PLC
Hier könnte ihre Werbung stehen

volvodani

Hallo luxus,
ich habe eine Verbindung erfolgreich zwischen Siemens S7-1200 und einem Arduino und gerade zwischen S7-1200 und meheren ESP8266 als "remote" IOs. Die Lib läuft soweit ganz gut. Leider habe ich noch nicht die Logo8 probieren können. Aber schaue mal hier >Hier< sind die Detail die zu ändern sind, dort sind die wichtigesten Infos.
Ist zwar für die ältere 1.1 aber dort sind viele Sachen aber gleich geblieben. >Klick<

Gruß
DerDani

0x2B | ~ 0x2B = 0xFF  
(Shakespeare)

Wie stelle ich mich hier richtig an

Scherheinz

In dem Link von volvodani steht es schön geschrieben:

Quote
The LOGO memory that we can Read/Write is the V area that is seen by all HMI (and Snap7 too) as DB 1.
Into it are mapped all LOGO resources organized by bit, byte or word.
Hier könnte ihre Werbung stehen

luxusl

Ich habe nun den DB 100 in DB 1 geändert. Ich kann die Werte weiterhin auslesen, die über Logo!Soft (Parameter VM-Zuordnung) festgelegt sind. Nur leider kann man hier nicht die Ein- und Ausgänge die man verwendet hinterlegen.

Laut Hilfe sind die Eingänge ja bei VM-Adresse 1024 - 1031 und die Ausgänge bei 1064 - 1071, jeweils 8 Byte festgelegt. Dies ist dann wohl außerhalb von DB 1 (Der Bereich für eine Parameteradresse reicht von 0 bis 850)?

luxusl

Mit Hilfe eines Zählers bilde ich mir nun die Eingänge ab...

Go Up