PHP + Siemens PLC

Hawkster

Level-1
Beiträge
90
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allesamt...

weiß zwar net wie ich grad auf die Idee komme, aber gibt es eine Möglichkeit via PHP auf eine SPS zu verbinden und dort DB-Inhalte auszulesen?!

Ich weiß, das es die FETCH/WRITE Methode gibt, diese jedoch sehr "begrenzt" zu nutzen ist. (nur begrenzte Daten, DB darf maximal nummer 255 haben usw).

Nun meine Frage, geht das nicht auch einfacher?! Bzw nicht einfacher sondern geht mehr?!

Bedenkt das PHP eine Websprache ist und ich keine DLL's oder sonstiges nutzen kann.

Mit freundlichen Grüßen,
Hawkster
 
Dass es für php direkt etwas fertiges gibt ist mir nicht bekannt.

Du könntest aber einen OPC-XML Server verwenden, und diese Daten über ein php-Skript abfragen.

Alternativ gibt kann man libnodave auch mit Perl verwenden, da man mittels Perl-xs C-Funktionen in Perl einbinden kann.
Das bei libnodave mitgelieferte Beispiel lässt sich bei mir jedoch nur unter Linux übersetzen. Unter Windows ist es bei mir immer gescheitert.
 
Hallo zusammen,

kennt jemand eine Free Version OPC XML Server? habe das gleiche Problem das ich mit php was machen möchte. Nur in meiner Version muss ich mir noch einen CP kaufen. Ich muss aber eine Lösung finden, auch wenn sie nur vorübergehend ist.

Grüße,
Torsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
kennt jemand eine Free Version OPC XML Server? habe das gleiche Problem das ich mit php was machen möchte. Nur in meiner Version muss ich mir noch einen CP kaufen. Ich muss aber eine Lösung finden, auch wenn sie nur vorübergehend ist.
Was ist denn der Grund warum es mit php sein soll?

Ansonsten kannst du auch versuchen die einfachen Funktionen wie Daten lesen/schreiben in php nachzuprogrammieren (hätte ich auch Interesse ;-) ). Es hat letztens mal jemand so etwas auch Open Source in C# gemacht, da ist der Code etwas strukturierter als bei libnodave. Das könntest du als Vorlage nehmen.

Wenns was auf die schnelle sein soll und nur Daten gelesen werden sollen:
C-Programm mit Funktionen aus libnodave, welches im Hintergrund Daten aus einem DB der SPS liest und stumpf in eine Textdatei schreibt, welche du von deinem php-Skript auslesen kannst.
 
Hallo Thomas.....

php deshalb weil ich angefangen habe php zu lernen. Des weiteren kommt hinzu das ich Daten aus einem anderen Projekt in eine my SQL Datenbank schreiben möchte. Jetzt kommt bestimmt der Vorschlag es mit Softings OPC Server zu machen. STIMMT auch aber das ist recht einfach und der Nachteil es kosten Geld da die Testversion nur 15 min läuft. Man kann in VB den Server alle 15min neu starten aber das ist nicht sauber. PHP ist eine gute Serverseitige Sprache mit der ich mich angefreundet habe und was liegt da näher mal was anderes zu probieren.
Daten aus txt oder xml zu lesen ist ja nicht das Problem. Ich bin gerade dabei meine Webseite neu zu gestalten und dort werden mit Hilfe eines txt Files und xml Daten ausgelesen und in Diagrammen dargestellt. Nun sollte für mich der nächste Schritt sein das ganze aus einer SPS auszulesen und ebenso darstellen zu können.
Wenn ich aber für meine Anwendung einen CP kaufen muss, muss ich ein wenig sparen. Darum würde ich dann erst einmal mit xml oder txt arbeiten. Das File mit php auslesen um es im Browser darstellen zu können. ich denke die Entwicklung geht einfach dort hin. Ich habe mit libnodave keine Erfahrung geschweige denn mit C. Da aber hier im Forum sehr viel von libnodave reden, wird mir nichts anderes übrig bleiben als mich damit zu beschäftigen. Aber da geht wieder Zeit ins Land. Die PHP Version deshalb weil ich mich in php reindenken kann.
Die "schnelle" Version würde es für den Anfang machen. Wäre ja ausbaufahig.
Vielleich bin ich auch ein wenig "Engstirnig" aber ein Versuch ist es wert.

Grüße,
TH
 
Einen kostenlosen OPC-Server gibt es bei Langner.
Du kannst dir iPlant Evolution installieren. In diesem Paket ist der Langner OPC-Server enthalten und damit lässt sich recht gut arbeiten.
Ich bin mir nur nicht ganz sicher, ob er OPC-XML beherrscht.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mal auf die schnelle was in php zusammengestümpert, kannst ja mal testen ob das bei dir funktioniert, und ob das so ist wie du dir das vorgestellt hast. Ich hab das eben nur mal mit meinem nettoplcsim grob durchgetestet - Daten kommen zumindest rein.

Bisher kannst du damit einfach nur ein Bytearray aus einem Datenbaustein auslesen. Umwandlungsfunktionen um daraus z.B. ein INT oder REAL zu machen habe ich nicht drin (Byteorder in der SPS beachten).

Als Vorlage habe ich den C# Code von S7net genommen. Im Prinzip könnte man die Klasse auch um die restlichen Funktionen erweitern (Konvertierungsfunktionen etc.).
 

Anhänge

  • s7plc_php_20100103.zip
    2,1 KB · Aufrufe: 460
Hallo Thomas.


erst einmal DANKE! für deine Hilfe. Leider habe ich keinen vollwertigen CP dran. Es ist eine VIPA 313SC. Funktioniert es auch mit dieser Steuerung? Die gleiche Frage gilt auch für den OPC Server von Langner.
Bin noch auf der Suche nache einem 343iger aber der große E------ möchte mir keinen günstigen anbieten (noch nicht)!:cry:
Bin erst heute wieder am Projekt und vielleicht kann ich mir ein wenig Stress ersparen und mir kann im Vorfeld schon jemand sagen ab das so funktoniert.

Grüße,
TH
 
Also ich kenne die Vipa Kisten nicht näher.

Zumindest steht im Datenblatt dass die Onboard-Ethernet Schnittstelle zumindest 2 PG/OP-Verbindungen kann.
Ein OP (zumindest eins von Siemens) nutzt normalerweise die gleiche Kommunikation wie mein php-Skript im Anhang, libnodave, und auch die OPC-Server die ich so kenne. Ich taufe das mal S7-Kommunikation.

Ich würde behaupten es funktioniert, aber wenn du die SPS zu Hause hast ist das doch schnell gemacht. IP Adresse einstellen und ab gehts...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
....die Verbindung scheint wohl zu stehen da nur die Meldung kommt "Fehler beim lesen der Daten" aber so in etwa (wenn man Daten lesen kann) habe ich mir das vorgestellt. Würde ja am liebsten selber ein wenig probieren aber da fehlt mir die Erfahrung in php.

Zum Vorgang habe DB101 eingefügt DBB 0 mit B#16#80 beschrieben. Manager geschlossen.



Grüße,
TH


lese gerade nochmal! Du ließt ein Array ein? habe damit noch nicht gearbeitet! wie füllt man es mit Daten aus der CPU? und wie wird es deklariert?
 
Zuletzt bearbeitet:
....die Verbindung scheint wohl zu stehen da nur die Meldung kommt "Fehler beim lesen der Daten" aber so in etwa (wenn man Daten lesen kann) habe ich mir das vorgestellt. Würde ja am liebsten selber ein wenig probieren aber da fehlt mir die Erfahrung in php.

Zum Vorgang habe DB101 eingefügt DBB 0 mit B#16#80 beschrieben. Manager geschlossen.
Wenn du mein Beispiel einfach so kopiert hast, muss der DB101 mindestens 6 Bytes lang sein, da diese Anzahl an Bytes am Stück gelesen werden.
PHP:
$plcdata = $plc->ReadBytes(0, $db, $startbyte, $numBytes);
$db ist die Datenbausteinnummer die gelesen wird
$startbyte die Startadresse (z.B. DBB0)
$numBytes sind die Anzahl der Bytes die gelesen werden sollen. Bei 6 werden DBB0-DBB5 gelesen.

lese gerade nochmal! Du ließt ein Array ein? habe damit noch nicht gearbeitet! wie füllt man es mit Daten aus der CPU? und wie wird es deklariert?

Der Rückgabewert der Funktion ist ein Array. Wie der DB in der SPS aufbgebaut ist, ist völlig egal.
Also wenn DB101 ab DBB0 6 Bytes gelesen werden (wie in meinem Beispiel), hast du in
$plcdata[0] -> DB101.DBB0
$plcdata[1] -> DB101.DBB1
$plcdata[2] -> DB101.DBB2
.
.
stehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.....kann man auch in die CPU schreiben? könntest du mir da auch behilflich sein? brauche eigentlich nur ein Beispiel und würde dann versuchen mich mal selber durch zu wühlen.


Grüße,
TH
 
.....kann man auch in die CPU schreiben? könntest du mir da auch behilflich sein? brauche eigentlich nur ein Beispiel und würde dann versuchen mich mal selber durch zu wühlen.

Schreiben geht auch, nur nicht mit dem Stand was ich die gestern gepostet habe. Da habe ich nur schnell die Funktionen zum Verbindungsaufbau und zum Lesen reingetippt. Das ist auch das zweite Mal dass ich überhaupt was in php programmiere.

Wenn du so ein bißchen was von C bzw. C# verstehst, kannst du dir ja mal den Code von S7.Net ( http://s7net.codeplex.com/ ) oder libnodave ansehen und die Telegramme an die SPS in php nachprogrammieren. Ich habe ein Plugin für Wireshark geschrieben, da kann man seine SPS-Netzwerkkommunikation recht gut mit debuggen (mal hier im Forum suchen).
Vielleicht habe ich die nächsten Tage aber mal etwas Zeit um die restlichen Funktionen zu ergänzen.

Kleiner Hinweis:
Wenn du das Skript so roh auf deinem Webserver laufen lässt, solltest du bedenken dass jeder Seitenaufruf einen Verbindungsauf- und abbau zur SPS nach sich zieht. Da deine SPS nur 2 Verbindungsressourcen hat, können sich die Seite maximal 2 Benutzer gleichzeitig aufrufen.
Und im jetzigen Programmstand kannst du maximal 240 Bytes mit einer Abfrage auslesen.
Viel Spaß!
 
das reicht mir aus! bin nur ein Benutzer! und es soll auch nicht offen sein! noch nicht! war nur ein Test! wetere Funktionen möchte ich dann gern in PHP nachprogrammieren.
Aber es ist schon genau das was ich wollte. Schreiben auf die CPU wäre nur ein Punkt auf dem i . Lesen war mir erst einmal wichtiger um einen Status zu bekommen und diesen in Variablen. Vielleicht polle ich auch den Status und speichere ihn zyklisch in ein xml File. Dieses kann ich dann weiter verarbeiten. Aber das weiß ich noch nicht so richtig wie ich weiter vorgehen. Eine Umwandlung der Hexwerte ist ja in php auch kein Problem. Mal sehen, aber der Startschuss ist erst einmal getan dank Deiner Hilfe!

Nochmals herzlichen Dank dafür!

Ja, wenn Du Zeit findest! ich nehme Dir alles ab!:sb14:
mir persönlich hilft ein kleiner Denkanstoß immer sehr viel weiter!

Grüße,
TH
 
......ich bekomme das "schreiben" nicht hin. Da fehlt mir noch einiges. Mir fehlt einfach der Ansatz.:confused:

Wie weit bist du denn gekommen?

So ein bißchen weitergemacht habe ich schon.
Also ich könnte dir einen Zwischenstand per PN zuschicken. Eine Funktion zum Schreiben habe ich dort drin, und auch ein paar Konvertierungsfunktionen um gelesene Daten z.B. in php integer/float etc. umzuwandeln.

Ich habe aber auch den Rückgabewert von ReadBytes von einem Array auf String geändert, da wie ich feststellen musste, in php ein Array immer als assoziatives Array gehandhabt wird - mit dem sich daraus resultierenden Overhead. Außerdem spart es zwei Konvertierungen, da die php Socket-Funktionen auch einen String zurückgeben.
Du wirst also evtl. was ändern müssen wenn du schon was herum programmiert hast.

Wie hast du denn vor die Daten auf deiner Webseite darzustellen?
Mir schwebt ja vor, um diese s7plc Klasse einen Soap-Server zu schreiben, auf den dann ganz Web2.0 mäßig mit Ajax auf die Daten zugegriffen werden kann.
Optimal wäre dass dies symbolisch geschieht. Da bin ich auch gerade bei, aus einem Step7-Projekt eine Symboltabelle mit allen Adressen (soweit sie symbolisch angelegt sind) automatisch zu generieren. Der Inat OPC-Server kann ja auch sowas...
 
Hi,

so richtig habe ich noch nichts auf die Beine gestellt. Ich weiß eben nicht wie ich anfangen soll. Ich habe mir zwar die Codes durchgelesen und teilweise verstanden aber ich komme mit der Implementierung in php nicht zurecht, Wie schon geagt, da fehlt mir noch einiges.
Also weiß ich auch nicht wie ich das anfangen soll. Die Darstellung dachte ich mir mit Symbolen. Das heißt, wenn ich die Daten lesen und das Array mit explode in einzellne Variablen aufteile habe ich alle Bits die ich benötige. Dann mit if else eine Grafik laden und diese darstellen. Des weiteren benutze ich die pChart Klasse. Mit dieser kann man recht gut Diagramme darstellen. Ein Beispiel auf meiner neuen Seite. Die ist aber noch nicht fertig also noch komplett in der Bearbeitung.
http://poetnitz.homeip.net/webseite/raum/index.php
Dort findest du einige Diagramme. Hier lese ich eben xml und txt Files ein. Des weiteren lese ich auch Webseite (natürlich mit Genehmigung!) ein und werte diese aus. Steuerungseitig würde ich eben wenn ich es benötige die Schnittstelle öffnen, Daten einlesen und auswerten. Das schreiben auf die CPU ist g......l. und man will ja nicht auf der Hälfte stehenbleiben. Aber gedacht habe ich mir das eben so; zu ändernde Variable einlesen, vergleichen und gegebenenfalls Wert neu schreiben. Ja ein Ansatz von dir zum schreiben per PN wäre Klasse. Dann wüsste ich wo und wie ich ansetzen muss.
Wie schon bemerkt, php ist serverseitig, da muss man ein wenig umdenken aber es geht.
Was das Array angeht, du musst nicht unbedingt die Indizes benennen. Wenn du ein Array ohne Indizes auslesen möchtest geht das nummerisch. Ich komme da immer ein wenig durcheinander da die letzt geschriebene Variable oder Wert mit der Nummer $variable[0] ausgegeben wird aber das bekommt man mit der sort Funktion auch in den Griff. oder ist das garnicht Deine Problem?

Grüße,
Torsten
 
Zuletzt bearbeitet:
Zurück
Oben