XMLHttpRequest schlägt fehl


T1g0r

Grünschnabel
Hallo,

ich bin recht neu was das Programmieren mit JS angeht. Ich habe einen Webserver laufen welcher mir Daten aus einer SPS ausliest und in einer HTML zur Verfügung stellt. Das funktioniert auch erstmal ganz gut.

Hier mal der wichtigste Teil meines Codes:
Javascript:
function updatePlcElements() {
            if (window.XMLHttpRequest) { //Google Chrome, Mozilla Firefox, Opera, Safari, IE 7
                xmlhttp = new XMLHttpRequest();
                
            } else { // Internet Explorer 6 und niedriger
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                
            }
            
            xmlhttp.open("GET", "html/Main_Update_Data.json", true);
            xmlhttp.onreadystatechange = function() {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {   
                    console.log("Response: " + xmlhttp.responseText);
                    var data = JSON.parse(xmlhttp.responseText);
                    console.log(data);
                    debugger;
                
                    var iStunde = data.usi_Stunde;
                    var iMinute = data.usi_Minute;
                    var iSekunde = data.usi_Sekunde;
                    
                    var iJahr = data.ui_Jahr;
                    var iMonat = data.usi_Monat;
                    var iTag = data.usi_Tag;
                    var sWochentag = data.usi_Wochentag;
                    
                    var iTemperatur = data.si_Temperatur;
                    
                    if (iStunde < 10) {
                        iStunde = "0" + iStunde;
                    }
                    
                    if (iMinute < 10) {
                        iMinute = "0" + iMinute;
                    }

                    if (iSekunde < 10) {
                        iSekunde = "0" + iSekunde;
                    }

                    if (iMonat < 10) {
                        iMonat = "0" + iMonat;
                    }

                    if (iTag < 10) {
                        iTag = "0" + iTag;
                    }
                    switch(sWochentag) {
                      case '1':
                        sWochentag = "So"
                        break;
                      case '2':
                        sWochentag = "Mo"
                        break;
                      case '3':
                        sWochentag = "Di"
                        break;
                      case '4':
                        sWochentag = "Mi"
                        break;
                      case '5':
                        sWochentag = "Do"
                        break;
                      case '6':
                        sWochentag = "Fr"
                        break;
                      case '7':
                        sWochentag = "Sa"
                        break;

                      default:
                        
                    }

                    document.getElementById("sZeit").innerHTML = iStunde + ":" + iMinute + ":" + iSekunde;
                    document.getElementById("sDatum").innerHTML = sWochentag + ", " + iTag + "." + iMonat + "." + iJahr;
                    
                    document.getElementById("sTemperatur").innerHTML = iTemperatur + " °C";

                       setTimeout("refreshOutputArea()", 500);
                }
            }
            
            xmlhttp.send(null);
            
        }
Der Code wird beim Laden der HTML gestartet und dann alle 500ms (zum Testen) erneut aufgerufen.

Nun hab ich aber das Problem, dass nach ~100 Aufrufen (in diesem Fall nach 50 Sekunden) folgender Fehler kommt:
Setze ich die Updatezeit auf 1000ms kommt der Fehler nach 100 Sekunden.

Fehler_1.PNG
Wie im unteren Log zu sehen ist, kommt die Zeichenfolge "CB" vor, was in den Logs zuvor nicht passiert.
Daher die Frage: Was kann zu diesem Fehler führen und wie behebe ich das Problem?
 

ComFreek

Mod | @comfreek
Moderator
Das muss an dem Server liegen, der die JSON-Datei ausliefert. Was läuft auf dem Server?

// Internet Explorer 6 und niedriger
IE 6 gibt's schon lange nicht mehr.

setTimeout("refreshOutputArea()", 500);
An setTimeout übergibt man keinen String, sondern schreibt direkt `setTimeout(refreshOutputArea, 500)`

var ist eigentlich auch veraltet. Man benutzt nur noch "const" und "let".
 

T1g0r

Grünschnabel
IE 6 gibt's schon lange nicht mehr.
D.h. das else kann raus?
Wenn ich das setTimeout ohne " Aufrufe, läuft die Zeit nicht korrekt ab. Das Programm rennt im Prinzip durch und wartet nicht die angegebene Zeit.
Die var habe ich jetzt mal durch let ersetzt.
Was genau meinst du damit, was auf dem Sever läuft?
Ich habe eine Hauptseite mit iFrame, eine CSS und 2 JSON-Dateien.

Wie bereits erwähnt, läuft der Server auf einer Simenes SPS. Da gibts nicht wirklich viel einzustellen.
 

ComFreek

Mod | @comfreek
Moderator
D.h. das else kann raus?
Ja. Selbst XMLHttpRequest ist schon durch die neue Fetch API abgelöst worden.

Wenn ich das setTimeout ohne " Aufrufe, läuft die Zeit nicht korrekt ab. Das Programm rennt im Prinzip durch und wartet nicht die angegebene Zeit.
Hmhmhm, normalerweise sollte die Semantik mit " und ohne dieselbe sein. Zumindest solange der Code nicht irgendwie krampfhaft versucht die Aufrufweise herauszufinden.

Die var habe ich jetzt mal durch let ersetzt.
Warum let und nicht const? Die meisten deiner Variablen veränderst du nicht mehr im Nachhinein.

Was genau meinst du damit, was auf dem Sever läuft?
Welches Programm generiert dir den JSON-Output auf dem Server? Ich kenne mich mit Siemens SPS nicht aus. Ist das ein Programm davon?

Wie gesagt, ich vermute sehr stark, dass es am Programm auf dem Server liegt, das dir das JSON generiert. Kannst du dieses zeigen?
 

T1g0r

Grünschnabel
Ich kann in der SPS leider nur sehr rudimentäre Einstellungen vornehmen. Im Prinzip nichts...Einstellungen.PNG

Was das Programm angeht, kann ich dir leider auch nichts bieten. Das geschieht alles im Hintergrund.
Im Prinzip ist es so, dass ich einen Datenbaustein habe in dem ich die benötigten Daten speichere.
Diese frage ich im JSON wie folgt ab:

JSON:
{
    "usi_Stunde": ":="DB820_HMI".Zu_HMI.usi_Stunde:",
    "usi_Minute": ":="DB820_HMI".Zu_HMI.usi_Minute:",
    "usi_Sekunde": ":="DB820_HMI".Zu_HMI.usi_Sekunde:",
    "ui_Jahr": ":="DB820_HMI".Zu_HMI.ui_Jahr:",
    "usi_Monat": ":="DB820_HMI".Zu_HMI.usi_Monat:",
    "usi_Tag": ":="DB820_HMI".Zu_HMI.usi_Tag:",
    "usi_Wochentag": ":="DB820_HMI".Zu_HMI.usi_Wochentag:",
    "si_Temperatur": ":="DB820_HMI".Zu_HMI.siTemperatur:"
}
Etwas verwundert mich eben die 100 Zyklen. Hab bisher nichts gefunden, was darauf hinweist.
 

T1g0r

Grünschnabel
Ich hab mal im SPS-Forum nachgefragt.
Dort kennt man das Problem, bisher jedoch nicht bekannt, warum es auftritt.
Ich schneide mir einfach den String zwischen den geschweiften Klammern aus, dann ist der Bug umgangen.