TIA Daten von SPS, auf Abruf vom Webserver, abfragen

Alde_Oma

Level-2
Beiträge
103
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich stehe gerade vor dem Problem, Daten die ich in der SPS bereitstelle, im integrierten Webserver abzurufen.

Genauer:
Beim Klick auf einen Button wird ein PopUp geöffnet. Mit dem Onload-Event wird eine Zahl an eine Variable ("DB8000_HMI".Von_HMI.Element_Inhalt_holen) in der SPS übermittelt. Die SPS bereitet nun anhand der übermittelten Zahl bestimmte Daten auf und stellt diese in einer weiteren Variable ("DB8000_HMI".Zu_HMI.sZeitsteuerung) zur Verfügung. Hier ein Ausschnitt, wie ich das aktuell löse:

Code:
...
<body onload="Laden()">
...
    function Laden() {
        
        // Daten von SPS holen
        Daten_holen()
        ...
    }

function Daten_holen() {
        // Bit an die SPS senden, damit Daten gesammelt werden
        sendData({"\"DB8000_HMI\".Von_HMI.Element_Inhalt_holen" : getQueryString('sElement')})
        
        // Gesammelte Daten auswerten
        // Abfragen ob "DB8000_HMI".Zu_HMI.sZeitsteuerung <> '' 
        // Wenn <> '' eingelesene Daten splitten usw.
        ...
    }

Das Senden an die SPS und Aufbereiten funktioniert auch schon.
Nun möchte ich wie in der Funktion Daten_holen bereits Beispielhaft kommentiert habe, nach dem Senden an "DB8000_HMI".Von_HMI.Element_Inhalt_holen die bereitgestellten Daten wieder einlesen und Weiterverarbeiten.

Wie bekomme ich es also hin, die Daten speziell an dieser Stelle von der SPS einzulesen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

bei dem Siemens-Beispiel hab ich nicht so ganz durchgeblickt.
Das Beispiel auf der anderen WEB2PLC-Seite hat geklappt. Die Daten kommen rüber. Allerdings noch nicht in dem Format welches ich benötige.
Aktuell kommen die Daten so raus:
Code:
"{\r\n    \"MeinString\":  \"'1|0|06:00|Zeit0|1|1|0|1|0|05:00|Zeit1|1|0|0|1|4|14:00|Zeit4|0|1|0'\"\r\n}"

sollte aber so aussehen:

Code:
"{  "MeinString": "'1|0|06:00|Zeit0|1|1|0|1|0|05:00|Zeit1|1|0|0|1|4|14:00|Zeit4|0|1|0'" }"

Wie kann ich den String nun in mein benötigtes Format konvertieren?

Das Script in dem "UpdatePlcElements" aufgerufen wird hat das Charset utf-8

Code:
<script type="text/javascript" charset="utf-8">

    var iID = 1;
    
    function updatePlcElements() {

...

}
 
das ist ein String mit den Zeichen in HTML Encoding.
Das bekommt man am einfachsten mit folgendem jQuery Code Fragment weg:

Code:
stringNeu = $('<div/>').html(deinString).text();
 
Ich möchte die Daten weiterverarbeiten, also erstmal in einer Variable speichern, nicht auf dem Seite ausgeben.
Also z.B. so:
Code:
var res = data.MeinString.split("|");

Wie nutze ich deinen Code?

Das da was mit der kodierung nicht passt weis ich, jedoch nicht nach was ich suchen muss.
Hab gefühlt schon das halbe Internet nach string zu utf-8 etc. abgegrast..

Oder muss ich in der json-Datei noch irgendwas mit dem charset angeben?
 
Zuletzt bearbeitet:
Zuletzt bearbeitet:
Der erste Treffer geht bei mir hierher:
https://www.w3schools.com/html/html_charset.asp
und da steht nirgends was von dem Code.

Ich bekomme dann den Fehler:

ReferenceError: $ is not defined

So hab ichs aktuell mit dem Fehler:
Code:
function updatePlcElements() {
            if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
            } else {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("GET", "button-data.json", true);
            //xmlhttp.responseType = 'text';
            xmlhttp.onreadystatechange = function()
            {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
                {
                    var data = JSON.parse(xmlhttp.responseText);
                       var stringNeu = $('<div/>').html(data.MeinString).text();
                    var res = stringNeu.split("|");           
                    
                    // CSS Klasse der Elemente ändern, und value setzen.
                    debugger;
                    //document.getElementById("xAL_sZeitsteuerung").className = "Button" + data.MeinString;
                    //document.getElementById("xAL_sZeitsteuerung").innerHTML = data.MeinString;
                    
                    var res = data.MeinString.split("|");
                      document.getElementById("xAL_sZeitsteuerung").innerHTML = res;
                      debugger;
/*                    document.getElementById("Taste2").className = "Button" + data.Taste2;
                    document.getElementById("Taste2").value = data.Taste2;
                    document.getElementById("Taste3").className = "Button" + data.Taste3;
                    document.getElementById("Taste3").value = data.Taste3;
*/        
                    //setTimeout("refreshOutputArea()", 2000);
                }
            }
            xmlhttp.send(null);
        }

// EDIT
Ich glaube ich habs hinbekommen.

Die jQuery musste noch eingebunden werden. Vor dem Aufruf.

Also:
Code:
<script type="text/javascript" src="https://code.jquery.com/jquery-latest.js"></script>

<script type="text/javascript" charset="utf-8">

    var iID = 1;
    
    function updatePlcElements() {
            if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
            } else {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("GET", "button-data.json", true);
            //xmlhttp.responseType = 'text';
            xmlhttp.onreadystatechange = function()
            {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
                {
                    var data = JSON.parse(xmlhttp.responseText);
                       var stringNeu = $('<div/>').html(data.MeinString).text();
                    var res = stringNeu.split("|");           
                    
                    // CSS Klasse der Elemente ändern, und value setzen.
                    debugger;
                    //document.getElementById("xAL_sZeitsteuerung").className = "Button" + data.MeinString;
                    //document.getElementById("xAL_sZeitsteuerung").innerHTML = data.MeinString;
                    
                    var res = data.MeinString.split("|");
                      document.getElementById("xAL_sZeitsteuerung").innerHTML = res;
                      debugger;
/*                    document.getElementById("Taste2").className = "Button" + data.Taste2;
                    document.getElementById("Taste2").value = data.Taste2;
                    document.getElementById("Taste3").className = "Button" + data.Taste3;
                    document.getElementById("Taste3").value = data.Taste3;
*/        
                    //setTimeout("refreshOutputArea()", 2000);
                }
            }
            xmlhttp.send(null);
        }
...
 
Zuletzt bearbeitet:
das "$" kommt / bzw. wird bei jQuery verwendet, wenn du natürlich alles zu "Fuss" ausprogrammierst und die Bibliothek nicht einsetzt geht es so nicht, das war mir gerade nicht bewusst
Ich empfehle dir, das mal nach zu lesen - jQuery und desen Methoden "post" / "get" + den rest davon - erleichtert aus meiner Sicht vieles :-)

Zur Erklärung
Das Fragment oben macht im Prinzip folgendes:
  • einen temporären html "div" Container anlegen
  • zuweisen des Strings als HTML Quelltext - mit encoding
  • zurück lesen des Container Inhalts als Text - ohne encoding

das geht auch mit Standard JavaScript - hab ich aber nicht zur Hand in dem Format da ich mitunter nur noch auf jQuery aufsetze, das müsste man sich im netz mal raussuchen.

Hier im Siemens Forum gibt es auch ein kleines Beispiel mit JSON wie du es verwendest in verbindung mit jQuery / POST und AJAX ;-)
Hab auch etwas gebraucht und gedauert um das wieder zu finden
https://support.industry.siemens.co...splay-plc-variables/154715?page=1&pageSize=10
 
Zuletzt bearbeitet:
Zurück
Oben