S7-300 über Ethernet mit Linux-Webserver mittels AG_SEND / AG_RECV verbinden

poppycock

Level-1
Beiträge
253
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte auch mal die Kommunikation zwischen mehreren Stationen bei einer S7 mit anderen Geräten ausprobieren und lernen, wie das alles funktioniert und worauf man achten sollte.

Ziel des privaten Projekts soll sein, dass ein kompletter DB in der S7-300 auf dem Computer "gespiegelt" wird.

Da habe ich mir gedacht, dass ich meinen Linux-Webserver (mit PHP und mySQL) dafür verwenden kann.
Auf der SPS-Seite kommt ein CP343-1 und eine CPU315 2-DP zum Einsatz.

Da ich mich absolut nicht auskenne (Stand: siehe Post-Datum :ROFLMAO: ), habe ich bereits einen Teil des Internets durchsucht und wurde teilweise fündig.
Mein jetziges Ergebnis mit STEP7 v5.3 und NetPro sieht folgendermaßen aus:
  • in NetPro eine "Andere Station" erstellt
  • diese Station mit Industrial Ethernet vernetzt
  • MAC- sowie IP-Adresse und Subnetzmaske eingetragen
  • bei der CPU315 eine "Neue Verbindung" mit Verbindungstyp TCP/IP eingetragen
  • Bausteinparameter aufgeschrieben, Port auf 2000 bei beiden Partnern so gelassen
  • Konfiguration übersetzt, gespeichert und in die CPU geladen
Als nächsts habe ich einen DB5 mit 10 Chars erstellt. Den benötigten FC5 (AG_SEND) habe ich aus der CP-Bibliothek kopiert.
Im FC1, der zyklisch vom OB1 aufgerufen wird, rufe ich auch den FC5 auf. Die Bausteinparameter sowie den Datenbereich habe ich an den FC5 geschrieben, der an den Webserver mittels AG_SEND geschickt werden soll. Der Sendeauftrag wird jede Sekunde gestartet.

Soweit, so gut. Jede Sekunde werden auch die 10 Chars vom CP343-1 gesendet (sehe es am Sendestatus), aber wie geht es jetzt weiter?
Der Webserver muss doch dieses Paket weiterverarbeiten?! Nur wie?
Muss ich eine Art AG_RECEIVE auf dem Webserver realisieren?

Gruß,
poppycock
 
Danke, Jochen,

das PHP-Script habe ich vor ein paar Tagen mit meinem Windows-Rechner und xampp getestet.
Im Prinzip läuft die Sache ordentlich.
Zum Auslesen von 1000 Byte habe ich eine Art ReadManyBytes programmiert (habe die aktuellste PHP-Version aus dem Thread) und erreichte eine Lesezeit von unter 200ms (mit Anzeige der Daten im Browser).
So, natürlich sollen die 1000 Byte auch in einer Datenbank gespeichert werden.
Also wurde kurzerhand eine mySQL-Datenbank samt Tabelle angelegt, als Engine wurde myISAM gewählt.
InnoDB kann wohl nicht mit so vielen Daten umgehen. :confused: Konnte jedenfalls keine Tabelle mit dieser Engine erstellen.
Mit Entsetzen musste ich aber feststellen, dass das Auslesen und Eintragen der Daten in die Tabelle mehr als 1,5 Sekunden dauerte.
Als Notlösung probierte ich den Umweg über eine Textdatei, die ich dann in einem Rutsch in die Tabelle übertrug.
Diesmal dauerte es über den Umweg kaum mehr als 400ms.
Weil ich nicht weiß, warum das direkte Schreiben in die mySQL-Tabelle so lange dauerte und es nur über den Umweg mit der Textdatei schneller ging, wollte ich einen anderen Weg probieren und bin bei AG_SEND bzw. AG_RECV gelandet.
Das funktioniert mittlerweise sehr gut! Leider ist aber dort die Datenmenge beschränkt, soweit ich weiß, oder?

Das PHP-Script mit meinem ersten Datenbankversuch (direktes Schreiben des Wertes in die Tabelle) ist total rampuniert, aber es lief so ab:
* $i = 0
* Byte0 abfragen
* bytes[$i] = $byte_aus_db
* Byte0 in die Spalte Byte[$i] der SQL-Tabelle schreiben
* $i += 1
* Byte1 abfragen
* bytes[$i] = $byte_aus_db
* Byte1 in die Spalte Byte[$i] der SQL-Tabelle schreiben
* Byte2 abfragen
* u.s.w.

Selbst wenn ich die 1000 Byte erstmal komplett in ein Array gespeichert habe und danach mit einer Schleife die Werte in die Tabelle schrieb, kam ich NIE unter 1,2 Sekunden.

Tja, ansonsten habe ich nur noch das Schreiben der gesamten Textdatei in die Tabelle im aktuellen PHP-Script drin:
$sql = "LOAD DATA LOCAL INFILE 'temp.txt' REPLACE INTO TABLE db300 FIELDS TERMINATED BY ';'";
Damit dauert das Füllen der 1000 Spalten in einer Reihe kaum mehr als 400ms!
Warum, weiß nur der Geier... :?

Bitte nicht fragen, warum gerade 1000 Byte, es ist einfach so! :ROFLMAO:

Gruß,
poppycock
 
Zurück
Oben