PHP + Siemens PLC

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas !

Danke für deine viele Mühe !

Ich bin hier als externer Systemprogrammierer bei einem Kunden eingesetzt und muss jetzt Daten aus ca. 12Stk. S7/300 auslesen und per Webportal zur Verfügung stellen.
Dank deines Scripts läuft das bereits ganz gut.

Eine Hilfe zur "Aufrechterhaltung" der Verbindungsdaten im AJAX Betrieb bieten dies SESSION-Variablen von PHP.
Alle definierten Session Variablen gelten auch für die per AJAX aufgerufene php-Seite.

Da kann man ja alles notwendig reinpacken, und die Variablen bleiben solange am Leben, bis das Browserfenster geschlossen wird.
Heute bekam ich den Auftrag, das auch Daten zurückgeschrieben werden sollen ! Bin schon gespannt, wie das klappt.
 
Hi,

wirklich interessant wäre wenn das php-Skript nur eine Verbindung zur SPS aufbauen und diese auch halten würde. Jetzt wird bei jedem Aufruf die Verbindung zur SPS aufgebaut, gelesen und wieder getrennt. Zumindest habe ich das nie anders hinbekommen. Oder wäre das mit deiner Variante auch möglich?
Bei einem Benutzer der Webseite ist das so wie es jetzt ist auch wenn nicht schön gerade noch in Ordnung, wenn mehrere Benutzer die Seite aufrufen kann es aber vorkommen, dass die Verbindungen in der SPS irgendwann aufgebraucht sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!
Ich schau mir das am Wochenende an, vorher komme ich leider nicht dazu.
Ich habe leider von der S7-Programmierung und dem Aufbau der S7 keine Ahnung, erfahre immer nur, welchen Datentyp ich wo lesen/schreiben muss.
Durch deine gut verständlich geschriebenen php Seiten ist mir das jetzt schon etwas klarer - bis auf den Header-Aufbau, der den eigentlichen Daten voran geht.
Gibt es dazu irgendwo vernünftige Dokumentation ? Hab mich bei Siemens schon dumm gesucht ...
 
Der TPKT und der ISO Header sind in RFCs dokumentiert, für den S7 spezifischen Teil gibt es keine offizielle Dokumentation.
Die beste verfügbare gibt es meiner Meinung nach bei Snap7:
http://snap7.sourceforge.net/

dort unter "Siemens communications".

Mit Wireshark wird das auch aufgeschlüsselt was vor sich geht (siehe Beispiel Screenshot) und wozu welche Felder sind. In dieser php-Klasse habe ich das meiste nur mit konstanten Werten ohne weitere Beschreibung eingesetzt, die Klasse kann auch nur einen sehr kleinen Teil von den Möglichkeiten welche die S7 noch bietet.
 

Anhänge

  • s7comm-beispiel.jpg
    s7comm-beispiel.jpg
    60 KB · Aufrufe: 73
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas

Habe nun rausgefunden wie ich an die Variablen-Adresse komme: Man muss die gewünschten Blöcke in der Parameter-VM-Zuordnung mit einer Adresse hinterlegen. Ich habe nun als den Wert als Word in der Tabelle.

Ich kann nun dieses Word (2 Bytes) einlesen. Aber wie mache ich daraus am einfachen eine Zahl? Gibt es eine Funktion dafür?

lg
 
Hallo Thomas,

erstmal danke für die spitzen PHP-Klasse. Funktioniert in Verbindung mit Ajax(Datenpolling) echt super.
Mich würde ebenfalls eine dauerhafte "Serververbindung" interessieren,zwecks noch besserer Performance..(Zykluszeit,Echtzeit)
Hat schon jemand in Richtung WEB-Sockets experimentiert, wie z.B. mit ratchet ......
Grüsse Torsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich das bei ratchet richtig verstehe, dann kannst du damit auch nur eine Client-Session aufrechterhalten. Mehrere Benutzer benötigen dann trotzdem noch mehrere Verbindungen.

Was ich bei meinen Nachforschungen so gefunden habe, ist das mit reinem php auch nicht möglich. Mit einem anderen Webserver wie node.js oder Apache Tomcat könnte das wohl funktionieren, aber das funktioniert eben auch komplett anders, und mit der php Klasse hier kannst du nichts anfangen.

Der Vorteil von meiner Lösung ist, dass es keine weiteren Abhängigkeiten besitzt. Es gibt auch Webserver Apps für Android, d.h. es funktioniert auch auf einem Smartfon oder Tablet mit Android.

Für eine richtige Client/Server Lösung, würde ich vermutlich den Datenaustausch über eine Datenbank realisieren. Und dann ein Dienst im Hintergrund laufen lassen, der die SPS Kommunikation erledigt und die Daten in die DB schreibt, und Schreibbefehle daraus liest und an die SPS absetzt. Dann hat man auch eine saubere Trennung zur SPS-Anbindung, und du kannst ohne Änderung an der Web-Darstellung einen anderen SPS-Typ anbinden.
Aber glaub das hatte ich hier alles schon mal so geschrieben, müsste halt mal jemand ausprobieren der es braucht. Vielleicht gibt es so etwas ja auch schon als Opensource-Lösung?
 
Ich habe mal so ein paar Tests gemacht. Eine Datenbank als Schnittstelle zu missbrauchen ist keine sehr gute Lösung.

Was ich getestet habe und prinzipiell funktioniert ist folgendes:
Ein Serverdienst in php der im Hintergrund läuft erledigt die SPS Kommunikation. Parallel dazu wartet er auf Anfragen über UDP, und schickt daraufhin die angefragten Werte über UDP zurück (z.B. direkt json Objekte). Dieser Dienst muss einmal manuell gestartet werden, läuft also nicht im Kontext des Webservers.
Über ein php Skript im Webserver wird dann die Anfrage nicht direkt an die SPS geschickt, sondern an diesen UDP Server.
Etwas mehr Geschwindigkeit würde eine shared memory Funktion (z.B. mit shmop) geben um den UDP-Teil zu eliminieren, dazu muss aber php selbst entsprechend kompiliert werden.

Der Nachteil bei php ist, dass es keine Threads unterstützt. D.h. der Server muss dann nacheinander die SPS- und die UDP Kommunikation abarbeiten. Da wäre zu überlegen so einen Server direkt in C zu schreiben, denn da gibt es entsprechend mehr Möglichkeiten.
 
Hallo zusammen,

könnte mir jemand vielleicht unter die Arme greifen.

Ich möchte mit einem php Script Bytes, Words, Int oder Real Werte aus einem DB zu lesen. Leider ohne Erfolg.

Vielen Dank im Voraus.
 
Zurück
Oben