Step 7 Auslesen SPS über Web

Janitor

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

Ich habe eine Frage, bezüglich auslesen einer Steuerung über den Webserver.

Hardware:
ET200S CPU (6ES7 151-8AB01-0AB0)
2MB MMC
IP: 192.168.1.100

Software:
Step7 v5.5

Die SPS hat einen Webserver.

Die Ausgangslage:
Ich habe bei mir lokal eine .html-Datei gebastelt, nennen wir Sie Startseite. Auf der Startseite ist ganz simpel gesagt eine Verlinkung zum Webserver von der SPS. z.b Button mit Verlinkung auf 192.168.1.100. Von dort aus gelangt man dann üblicherweise mit dem Login auf die Anwender spez. Webseite vom Webserver, welche ja auf der SPS abgespeichert ist.
Veränderungen an meiner lokalen Startseite, haben keine Auswirkungen auf den Webserver von der SPS.
Auf der Startseite wurde ein Login-Bereich erstellt, mit welchem man die Anmeldeinformationen in Variablen(javascript) zwischenspeichern kann. Die Variablen werden, dann mit dem Klick auf den Button an die Steuerung gesendet(POST). So hat man die Möglichkeit direkt auf die spez. Anwenderseite zu gelangen in dem man die Verlinkung auf dem Button z.B. so anpasst: 192.168.1.100/awp/MeineSeite.html.

Meine Frage:
Wie ist es möglich über meine Startseite(lokal), eine Variable aus der Steuerung(z.B. db1.dbw0) auszulesen. Da ich mich ja Anmelden kann, sollte es sicherlich auch die Möglichkeit geben, Daten auszulesen. Wenn möglich möchte ich den Webserver der SPS nicht verändern, bzw. das SPS-Programm anpassen.
Gibt es eine Möglichkeit von meiner Startseite auf den DB zuzugreifen?

Mögliche Lösungsansätze(Stichwortartig):
XMLHttpRequest, mwsl,...
Die beiden Lösungsansätze habe ich aus div. Berichten und Forumsbeiträge gesucht. Mir sagt beides im Moment noch nicht wirklich viel.. Bin aber gerne bereit, neues zu lernen;-)
Ich habe zudem nichts gelesen, aber ist es nicht auch möglich mit einem GET-Formular die Daten auszulesen?

Bin gespannt auf eure Tipps.

Gruss
Janitor
 
Das Problem bei einiem XMLHttpRequest ist in dem Fall, dass die sog. Same-OriginPolicy greift wenn du von einer Webseite auf localhost Daten von einer fremden Domain (bzw. Adresse der SPS) laden willst.
Das ist eigentlich eine Sicherheitsfunktion. Beim IE lässt sich dafür aber eine Ausnahmeregel einstellen, wenn man es denn will.

Ansonsten könntest du auch in deine lokale Seite eine kleine Seite vom SPS Webserver als iframe einbinden, in der diese eine Variable angezeigt wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls es auch reicht den Variablenwert im Webserver zu sehen:
- der Webserver dieser CPU müsste schon eine Seite "Variablenstatus" haben
- man kann auch sehr einfach eigene Variablentabellen in den Webserver einfügen (VAT Häkchen: Webserver)
- man kann etwas aufwendiger anwenderdefinierte Webseiten erstellen (Web2PLC)

Harald
 
Hallo Thomas und Harald

Erst einmal möchte ich euch danken für die schnellen Antworten.
@Thomas:
Ich schaue mir die Thematik iframe im Moment genauer an. Ich habe noch Schwierigkeiten den S7-Webserver in diesem zu öffnen. Ich ahne jedoch, dass sich meine Aufgabe so nicht lösen lässt. Kann ich über das iFrame mit dem Webserver S7 drin, eine Variable an meine Startseite übergeben? Ich möchte nicht nur anzeigen, sondern eine Variabel(z.B. ein String) übergeben.

Ich tue mich recht schwer mein wirkliches Problem zu schildern. Mein Ziel ist schlussendlich folgendes:
Beispiel Systemaufbau:
100 SPS’n mit jeweils einem Router auf mehrere km verteilt. Jetzt kommt der Servicetechniker und steckt sich irgendwo ins Netzwerk. Von dort aus ruft er die Startseite auf und navigiert sich durch alle Anlagen(SPS, Klimagerät, etc..) jeweils zum Webserver. Jetzt hat er jedoch die Möglichkeit auf der Startseite ins „lokale“ Netzwerk zu wechseln und kann sich direkt, nach dem Router, ans lokale Netz anschliessen. (somit ändert sich die ip, statt z.b. (10.22.20.100:port) nur noch (192.168.1.XY)) Nun möchte ich erreichen, dass die Startseite aus der Steuerung den aktuellen Ort liest, damit dem Servicetechniker gleich die aktuellen Anlagen in diesem lokalen Netzwerk(bei dieser Örtlichkeit) angezeigt werden. Dies möchte ich aus der SPS lesen, das gibt es nämlich schon eine String Variable, die den Ort enthält. So könnte ich die Anlagen an diesem Ort mittels Skript ermitteln und dem Servicetechniker auf der Startseite die aktuellen Anlagen anzeigen.
Ich hoffe ihr versteht was ich möchte. Ich will von euch keine fertige Lösung, aber eine Idee wie ich das realisieren könnte wäre super!
Wenn es keine „einfache“ Lösung dafür gibt, werde ich kurzen Prozess machen und einfach alle Anlagen auf der internen Seite anzeigen und verlinken und wenn die Anlage an einem Ort nicht verfügbar wäre, führen halt einige Links ins nichts. Das geht schon, ist jedoch nicht so elegant.

@Harald
Irgendwie reden wir wohl an einander vorbei…:)

Gruss
Janitor
 
Wenn ich es richtig verstanden habe.
Du willst Variabeln in den SPS auslesen können ohne weitere Systeme als ein Webbrowser auf ein PC der mit den SPS verbunden ist, und ohne den integrierte Webserver Projekt zu ändern.
Nein, das geht nicht.

Aber es gibt viele Webserver basierte Systeme, womit man ein HMI oder SCADA einrichten kann. Diese Webserver Systeme braucht dann normaleweise ein OPC Server um den Verbindung zu den SPS zu bekommen.

Andere Lösungsvorschläge:
1. Du verwendest trotzdem den integrierte Webserver, entweder mit Variabeltabellen, oder anwenderdefinierte Webseiten.
2. Da du pro SPS ein Router hast, dann gibt es Router mit integrierte Webserver und möglichkeiten Variabeln in den SPS zu verlinken. Ewon hat diesen Funktion, selber habe ich es aber nicht probiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun möchte ich erreichen, dass die Startseite aus der Steuerung den aktuellen Ort liest, damit dem Servicetechniker gleich die aktuellen Anlagen in diesem lokalen Netzwerk(bei dieser Örtlichkeit) angezeigt werden. Dies möchte ich aus der SPS lesen, das gibt es nämlich schon eine String Variable, die den Ort enthält.
Du willst ermitteln, an welcher SPS der Techniker angeschlossen ist?
- Haben die SPS/CPU verschiedene Stationsnamen? --> der Stationsname wird schon auf den Standard-Webseiten angezeigt
- Haben die SPS verschiedene IP-Adressen oder verschiedene Gateways? --> die IP-Adresse und das eingestellte Gateway wird schon in den Standard-Webseiten angezeigt


Jetzt kommt der Servicetechniker und steckt sich irgendwo ins Netzwerk.
Er steckt sich auf den Switch des lokalen Netzwerks oder wie? Kannst Du das genauer erklären?

Jetzt hat er jedoch die Möglichkeit auf der Startseite ins „lokale“ Netzwerk zu wechseln und kann sich direkt, nach dem Router, ans lokale Netz anschliessen. (somit ändert sich die ip, statt z.b. (10.22.20.100:port) nur noch (192.168.1.XY))
Ich kann mir echt nicht vorstellen wie das gehen soll bzw. wie Du das meinst ...

Harald
 
Und nochmal der Hinweis auf die Standard-Webseite "Variablenstatus" wo man sich die zu lesende(n) Variable(n) nach Belieben zusammenklicken kann.

Harald
 
Hallo zusammen
Danke für die vielen Ideen, Anregungen.

Ich versuche einmal die Fragen zu beantworten/bzw. zu kommentieren.

Wenn ich es richtig verstanden habe.
Du willst Variabeln in den SPS auslesen können ohne weitere Systeme als ein Webbrowser auf ein PC der mit den SPS verbunden ist, und ohne den integrierte Webserver Projekt zu ändern.
Nein, das geht nicht.

Genau, ich will eine Variable in der SPS auslesen und sie in meinem Skript auf der Startseite einlesen und verarbeiten. Wenn das nicht möglich ist, ist das schon einmal ein Rückschlag.

Andere Lösungsvorschläge:
1. Du verwendest trotzdem den integrierte Webserver, entweder mit Variabeltabellen, oder anwenderdefinierte Webseiten.
2. Da du pro SPS ein Router hast, dann gibt es Router mit integrierte Webserver und möglichkeiten Variabeln in den SPS zu verlinken. Ewon hat diesen Funktion, selber habe ich es aber nicht probiert.
Und nochmal der Hinweis auf die Standard-Webseite "Variablenstatus" wo man sich die zu lesende(n) Variable(n) nach Belieben zusammenklicken kann.

Hier verstehe ich den Zusammenhang mit meiner Aufgabe nicht ganz. Mir ist bewusst, dass ich Variablentabellen im Webserver der S7 anbinden kann, bzw. anzeigen lassen kann. Dies auch schon in der default-Webseite, jedoch will ich die Variable ja auf meiner Startseite. Die Startseite muss man sich als externe Datei vorstellen. Die kann jeder auf sein Notebook laden und Sie brauchen.

Du willst ermitteln, an welcher SPS der Techniker angeschlossen ist?
- Haben die SPS/CPU verschiedene Stationsnamen? --> der Stationsname wird schon auf den Standard-Webseiten angezeigt
- Haben die SPS verschiedene IP-Adressen oder verschiedene Gateways? --> die IP-Adresse und das eingestellte Gateway wird schon in den Standard-Webseiten angezeigt
- Die Örtlichkeit ist in einem String in einem DB gespeichert.
- Die Ip-Adresse ist im lokalen/internen Netz immer die gleiche für eine Anlage, z.b. Die SPS1 hat immer 192.168.1.10, die Klima4 hat immer 192.168.1.60 etc.

Er steckt sich auf den Switch des lokalen Netzwerks oder wie? Kannst Du das genauer erklären?


Ich kann mir echt nicht vorstellen wie das gehen soll bzw. wie Du das meinst ...
Genau, der Servicetechniker steckt sein Kabel im lokalen/internen Netz an einem Switch ein(in dem Fall im Netz: 192.168.1.XY)

So ich hoffe ich konnte etwas genauer die Ausgangslage schildern. Ich tendiere im Moment zu der Lösung mit der Auflistung aller Anlagen.

Gruss
Janitor
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So tun wir das:

Wir haben viele Anlagen in viele Länder. In fast alle Anlagen haben wir ein Internet Router, nur nicht in die kleinste und wo die Kunden es nicht haben will.
Als Router verwenden wir Ewon, aber es gibt mehrere Anbieter mit diesen Funktionalität.
Alle Anlagen haben denselbe IP Struktur.
Zu Hause logge ich mich durch Ewons Portal (heisst Talk2M) an das Anlage die ich beobachten will.
Dann bin ich mit diese Anlage angeschlossen als ob ich direkt verbunden wäre.
Ich kann STEP7 verwenden um online mit den SPS zu gehen, aber ich kann auch den integrierte Webserver verwenden.
Ich kann nur 1 Anlage auf einmal in diese weise checken (wegen die IP Adressen). Ob da ein trick gibt um mehrere Anlagen zu beobachten auf einmal weiss ich nicht. Ich habe auch kein bedarf dafür.

Ist das was du brauchst ? Oder etwas in diesen Stil ?
 
@Thomas:
Ich schaue mir die Thematik iframe im Moment genauer an. Ich habe noch Schwierigkeiten den S7-Webserver in diesem zu öffnen. Ich ahne jedoch, dass sich meine Aufgabe so nicht lösen lässt. Kann ich über das iFrame mit dem Webserver S7 drin, eine Variable an meine Startseite übergeben? Ich möchte nicht nur anzeigen, sondern eine Variabel(z.B. ein String) übergeben.

So richtig verstanden was du das vorhast habe ich noch nicht wirklich. Aber nur mit dem Öffnen einer lokalen HTML-Datei ohne echten Webserver im Hintergrund kommst du nicht weiter, weil da einfach die Möglichkeiten fehlen.
Vielleicht kannst du auf dem PC des Servicetechniker einen kleinen leichtgewichtigen Webserver laufen lassen, wie http://www.server2go-web.de/
Damit kannst du die Logik zu Abfrage der Steuerungen in php auf dem Server programmieren. Z.B. abfragen welche Steuerungen erreichbar sind, und dann die Webseite die der Techniker zu Gesicht bekommt gleich passend aufbauen.
 
Guten Morgen

Ihr seid super! Ich schätze Eure Hilfe sehr, dennoch habe ich das Gefühl wir driften langsam von meinem Ursprünglichen Problem ab.

Vielleicht kannst du auf dem PC des Servicetechniker einen kleinen leichtgewichtigen Webserver laufen lassen, wie http://www.server2go-web.de/
Damit kannst du die Logik zu Abfrage der Steuerungen in php auf dem Server programmieren. Z.B. abfragen welche Steuerungen erreichbar sind, und dann die Webseite die der Techniker zu Gesicht bekommt gleich passend aufbauen.
Vielen Dank für den Tipp, das werde ich mir mal anschauen. Jedoch klingt es für meinen Fall viel zu Aufwendig, nur um eine "elegantere" Lösung zu erhalten.


Ist das was du brauchst? Oder etwas in diesen Stil ?
Vielen Dank für die Schilderung. Leider ist das nicht das, wonach ich suche. Ich tue mich recht schwer die Problematik zu schildern, da ich selbst nicht genau weiss, ob dies so einfach möglich ist.

Ich ging davon aus, dass es eine einfache Lösung geben sollte, denn mein Login auf meiner Startseite(lokal) sendet 2 Variablen(Benutzer, Passwort)mit einem POST an die Steuerung(SPS/Webserver). So sollte es doch auch möglich sein, Variablen von der Steuerung zu holen!? Aber ja, so wie ich das im Moment beurteile geht das nicht so einfach. :)

Ich werde mir Eure Gedanken und Tipps noch ein wenig durch den Kopf gehen lassen. Falls ich auf eine einfache Lösung für dieses Problem gelange, werde ich es anschliessend hier posten. Vielen Dank nochmal für die Unterstützung.

Freundliche Grüsse
Janitor
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für den Tipp, das werde ich mir mal anschauen. Jedoch klingt es für meinen Fall viel zu Aufwendig, nur um eine "elegantere" Lösung zu erhalten.
Aufwändig für dich oder den Benutzer? Für den Benutzer ist es nicht schwer. Er kann den Server sogar von einem USB Stick starten (keine Installation notwendig), und man kann einstellen dass dann sofort ein Webbrowser gestartet wird und eine entsprechende Startseite aufgerufen wird.

Ich ging davon aus, dass es eine einfache Lösung geben sollte, denn mein Login auf meiner Startseite(lokal) sendet 2 Variablen(Benutzer, Passwort)mit einem POST an die Steuerung(SPS/Webserver). So sollte es doch auch möglich sein, Variablen von der Steuerung zu holen!? Aber ja, so wie ich das im Moment beurteile geht das nicht so einfach. :)
Wie geschrieben, das liegt an der Same origin policy.
Aber es gibt meine ich einen Weg das teilweise zu umgehen. Denn beim Einbinden von Javascript Dateien gilt diese Regel nicht. Du könntest also auf dem Webserver eine Datei erstellen mit einer Javascript Datei die mit Werten aus der SPS befüllt wird (oder gleich Json). Auf deiner lokalen Seite bindest du dann im Kopf diese Daten vom Webserver der SPS ein. Dann sind zumindest die Werte schonmal da. Das lässt sich aber nur mit einem kompletten Neuladen der Seite aktualisieren. Weißt du wie ich meine?

Oder eben in ein iframe laden, hast du das schon probiert?
 
Aber es gibt meine ich einen Weg das teilweise zu umgehen. Denn beim Einbinden von Javascript Dateien gilt diese Regel nicht. Du könntest also auf dem Webserver eine Datei erstellen mit einer Javascript Datei die mit Werten aus der SPS befüllt wird (oder gleich Json). Auf deiner lokalen Seite bindest du dann im Kopf diese Daten vom Webserver der SPS ein. Dann sind zumindest die Werte schonmal da. Das lässt sich aber nur mit einem kompletten Neuladen der Seite aktualisieren. Weißt du wie ich meine?

Oder eben in ein iframe laden, hast du das schon probiert?

Hallo Thomas

Jetzt wird es interessant, das hört sich nach einem möglichen Weg an. Ich versuche mal zu schildern was du meinst, korrigiere mich wenn ich was falsch verstanden habe:
Die Variable wird auf dem Webserver mittels Javascript in einer Variable gelesen. Einfaches Bespiel:
Code:
Var temp = SPS_Varaible;
In meiner lokalen Datei kann ich auf die temp Variable zugreifen mittels javascript. Die temp Variable kann ich dann z.B. in einer "lokalen"variable abspeichern und verwenden. Hab ich das richtig verstanden?
Wiso geht das nur beim komplett refresh?
Wie kann ich die Variable temp denn aus der Steuerung holen?

iFrame hatte noch Probleme gemacht...

Gruss
 
Genau. Auf dem Webserver der SPS legst du eine Datei z.B. javascript-daten.js an.

Ganz einfaches Beispiel:

Inhalt der Datei javascript-daten.js auf dem Webserver der SPS(Achtung, Syntax für eine 1200, ist aber nur bei den Anführungszeichen unterschiedlich):
Code:
<!-- AWP_In_Variable Name='"DB_HMI"' -->
<!-- AWP_In_Variable Name='"DB_HMI".intVar1' -->
<!-- AWP_In_Variable Name='"DB_HMI".intVar2' -->

var SPS_variable_1 = :="DB_HMI".intVar1:;
var SPS_variable_2 = :="DB_HMI".intVar2:;

Und dann als lokale Seite:
Code:
<html>
<head>
<title>Testseite zur Datenaktualisierung</title>	
<script src="http://192.168.1.191/awp/Testseite-Web2Plc/javascript-daten.js" type="text/javascript"></script>		
<script type="text/javascript">
function refreshOutputArea()
{
	var text = "<p>SPS_variable_1 = " + SPS_variable_1 + "<\/p>";
	text +=  "<p>SPS_variable_2 = " + SPS_variable_2 + "<\/p>";	 
	document.getElementById("OutputArea").innerHTML = text;
}

window.onload = function()
{
	refreshOutputArea();
}

</script>	
</head>
<body>
<h2>Testseite zur Datenaktualisierung lokal</h2>
<div id="OutputArea"></div>
</body>
</html>

Die eingebundene js Datei vom Webserver der SPS wird dann leider nur aktualisiert wenn die komplette Seite neu geladen wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube so langsahm aber sicher kommen wir der Sache auf den Punkt. In der Theorie hats glaubich bei mir klick gemacht. Jetzt happerts noch an der Umsetzung:)

Inhalt der Datei javascript-daten.js auf dem Webserver der SPS(Achtung, Syntax für eine 1200, ist aber nur bei den Anführungszeichen unterschiedlich):
Wie müssen die Anführungszeichen bei mir sein?
Müsste das in der .js Datei nicht so aussehen(statt: <!--html--> , so: /*js*/)?

Code:
/*AWP_In_Variable Name='"DB_Ort"'*/
/*AWP_In_Variable Name='"DB_Ort.Geb_Ort"'*/ 

var Temp1 = :="DB_Ort".Geb_Ort:;  //wahrscheinlich auch falsch, da teilweise "-Zeichen

Das ganze wird im Webserver so aufgerufen:
Code:
<script src="scripts/temp.js" type="text/javascript"></script>

Code in der lokalen Seite:
Code:
<html>
<head>
<title>Testseite zur Datenaktualisierung</title>	
<script src="http://192.168.1.80/awp/html/scripts/temp.js" type="text/javascript"></script>		
<script type="text/javascript">
function refreshOutputArea()
{
	var text = "<p>temp = " + Temp1 + "<\/p>";
		 
	document.getElementById("OutputArea").innerHTML = text;
}

window.onload = function()
{
	refreshOutputArea();
}

</script>	
</head>
<body>
<h2>Hier steht Ort</h2>
<div id="OutputArea"></div>
</body>
</html>

Irgendwo ist noch der Wurm drin...
 
Ich glaube so langsahm aber sicher kommen wir der Sache auf den Punkt. In der Theorie hats glaubich bei mir klick gemacht. Jetzt happerts noch an der Umsetzung:)


Wie müssen die Anführungszeichen bei mir sein?
Müsste das in der .js Datei nicht so aussehen(statt: <!--html--> , so: /*js*/)?

Nein, das muss schon genauso wie ich das geschrieben habe. Das ist eben diese AWP-Syntax für den Webserver der SPS. Dass die Syntax in Form von HTML-Kommentaren aufgebaut ist hält einen nicht davon ab das auch in andere Dateien einzubauen ;-) . Diese Informationen sind bei Auslieferung der Seite nicht mehr vorhanden.

Die AWP-Anweisungen in den spitzen Klammern werden vom Webserver komplett entfernt. An den Stellen wo eine SPS-Variable nach Schema ":= Variablenname:" vorkommt, wird der Wert von Variablenname eingesetzt.

Wenn in meinem Beispiel javascript-daten.js beim Import über Step 7 noch so aussieht:
Code:
<!-- AWP_In_Variable Name='"DB_HMI"' -->
<!-- AWP_In_Variable Name='"DB_HMI".intVar1' -->
<!-- AWP_In_Variable Name='"DB_HMI".intVar2' -->

var SPS_variable_1 = :="DB_HMI".intVar1:;
var SPS_variable_2 = :="DB_HMI".intVar2:;

Sieht der Client bei GET javascript-daten.js nur noch
Code:
SPS_variable_1 = 1234;
SPS_variable_2 = 4567;

Wenn "DB_HMI".intVar1 aktuell den Wert 1234 und "DB_HMI".intVar2 aktuell 4567 besitzt.

Probiers aus wenn du in deinem Webbrowser direkt die Adresse angibst. Aufgrund des MIME-Types den der Webserver der SPS setzt bekommst du die Datei zum Download angeboten.
 
Hallo Thomas

Endlich!!! Du bist genial, ich hatte einen Fehler im Aufruf! Och bis man so Sachen findet!!!!!

Step1 wäre geschafft! Ich konnte eine Variable so übergeben wie ich das wollte. Danke dir!

Was mir noch Probleme macht ist folgender Code:
Code:
<!--AWP_In_Variable Name='"DB_Ort"'-->
<!--AWP_In_Variable Name='"DB_Ort.Geb_Ort"'--> 

var Temp1 = :="DB_Ort".Geb_Ort:;

Das will irgendwie nicht gehen. Ich hatte den erfolgreichen Test mit diesem Code gemacht:
Code:
var Temp1 = 1234; //statisch

Ich denke jetzt fehlt nicht mehr viel! Ich versuchs noch ein wenig!

Gruss
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es leider nicht hingekriegt, da ich nächste Woche weg bin werde ich mich erst wieder in 1 Woche melden! Auf jedenfall werde ich mich hier noch mal melden, wenn ich die Lösung gefunden habe. Vielleicht hast du Thomas oder jemand anders ja mein Fehler endeckt. Auf jedenfall wünsch ich euch allen ein schönes Wochenende!

Grüsse aus der Schweiz
 
Zurück
Oben