TIA Webserver zeigt Variable aus Array nicht an

hoinabauer

Level-1
Beiträge
16
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
ich suche schon Tagen den Fehler und komme nicht darauf wo er liegt.
Evtl. kann jemand helfen.

Mein Roboter (Kuka KRC1) sendet Daten via Profibus an meine S7 1200. Mittels SCL-Code schreibe ich die Daten in ein Array lager[1..43,1..4]. Dieses liegt im DB daten1.

Code:
IF "Daten_berei"=TRUE THEN
    // Statement section IF
    "Zeile" := "Zeile_Roboter";
    "Spalte" := "Spalte_Roboter";
    "Wert" := "Wert_Import";
    "daten1".lager["Zeile_Roboter", "Spalte_Roboter"] := "Wert_Import";
    "Import_Fertig" := True;
END_IF;
IF "Daten_berei"=FALSE THEN
    // Statement section IF
    "Import_Fertig" := FALSE;
END_IF;

"Anz_frankVar":="Anz_frank";


IF "Anz_frankVar">0 THEN
    // Statement section IF
    "frankierte_vorhanden":=TRUE;
END_IF;
IF "Anz_frankVar" = 0 THEN
    // Statement section IF
    "frankierte_vorhanden" := FALSE;
END_IF;

Die Daten werden einwandfrei übertragen. Das kann ich mit "Beaobachten" gut nachvollziehen.

Allerdings zeigt sie meine benutzderdefinierte Website im aktivierten Webserver einfach nicht an.

Code:
PlatzNR: 40
Aktiv :="daten1".lager[40,1]:
Plätze :="daten1".lager[40,2]:
Belegt :="daten1".lager[40,3]:
 Sorte :="daten1".lager[40,4]:

Hinter "Plätze:" bleibt es weiß.

Woran kann das nurliegen?
Die Variable "test" im DB daten1 kann ich ohne Prbleme anzeigen. Es muss irgendwie am Array liegen.
Anbei noch ein Screenshot meines DBs, leider offline gemacht also ohne Beobachtungswerte, aber die werden wie gesagt astrein gefüllt


screenshot.PNG

Wer weiß Rat?
Danke Tom
 
Plätze enthält den Umlaut 'ä'.

Ich vermeide diese auch, grundsätzlich sollte TIA das aber abkönnen.

Kannst du mal nen Screen aus Beobachten hochladen, welcher den Fehler zeigt?
 
Aber Plätze ist doch keine Variable. Ist doch nur Text auf der Website.

Bin leider gerade nicht an der Anlage.

Kann es evtl. daran liegen, dass meine Array Indizes nicht bei 0 sondern bei 1 beginnen. Also im Tia hat sich das problemlos einstellen lassen, siehe auch Screenshot.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, daran liegt es definitiv nicht. Du könntest auch bei 10 beginnen.

Sicher, dass der Wert in der Webvisu richtig eingestellt ist? Wenn nichts drinnen steht, scheint mir das eher ein Problem der Visu zu sein?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit dem Webserver habe ich schon oft festgestellt das es ander Syntax liegt.
Probiere erst einmal ob dein code der Webseite richtig zugreift.
z.B den Wert aktiv auf eine festen Wert in einem DB zugreifen lassen (kein array )
Array hab ich selber noch nicht angesprochen von der Webseite, bin mir auch nicht sicher ob das geht, daher erst einmal den Code der Webseite testen.

Werden denn andere Werte angezeigt und läuft die Webseite ingsgesamt, oder ist das der erste Versuch zum anzeigen von Daten über den Webbrowser?
 
Ich hab mal mit meiner sehr alten 1200 mit FW2.2 und TIA V14 probiert, funktioniert da auch nur teilweise.

:="HMIDATA".lager[1,1]: -> funktioniert, obwohl beim Übersetzen eine Warnung generiert wird, dass die Symbole im DB und unterschiedlich sind (s.u.)
:="HMIDATA".lager[1, 1]: -> funktioniert nicht

:="HMIDATA".lager[2,1]: -> funktioniert
:="HMIDATA".lager[2, 1]: -> funktioniert nicht

:="HMIDATA".lager[10,1]: -> funktioniert nicht
:="HMIDATA".lager[10, 1]: -> funktioniert nicht

Warnmeldung z.B.:
WebInt: Unterschiedliche Schreibweisen für eine PLC-Variable in PLC-Programm '"HMIDATA".lager[10, 1]' und Webseite '"HMIDATA".lager[10,1]'

Mit 1-dimensionalem Arrays hatte ich bisher keine Probleme.
 
Guten Morgen,

Wiegesagt eine einfache Variable lässt sich anzeigen. Ich denke auch dass es am Array liegt. Wäre echt doof wenn das nicht geht. Eindimensional wäre die Notlösung.

Ich teste das mal.

[1,1] habe ich
[1, 1] habe ich nicht,

damit sollte es nach dem letzten Post eigentlich funktionieren.

Tom
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich hab das ausprobiert:

Wenn ich mein zwei dimensionales Array (43 Zeilen, 4 Spalten) auf 4 Arrays mit je 43 Zeilen aufteile geht die Anzeige am Webserver:

ABER: Das Laden der Seite dauert ca. 30 Sekunden. !
Was kann man denn da zum Beschleunigen machen?

Alle Werte auf der Seite werden aus ein und demselben DB geladen.

Firmware meiner 1200er CPU ist 2.2

Also so kann ich damit überhaupt nicht arbeiten, leider. Ich bräcuhte eine Aktualisierung der Seite alle 3-4Sekunden.
 
Hört sich zwar nach einer blöden Lösung an, es bringt aber sehr viel wenn du dein Array vorher in der SPS in einen oder mehrere Strings wandelst (z.B. mit Komma getrennt), dann die Strings über etwas Javascript im Browser zerlegst und so zur Anzeige bringst. Beim Webserver scheint es nicht von der Datenmenge, sondern hauptsächlich von der Anzahl der Variablen abhängig zu sein wie schnell die Datenübertragung läuft.
String-Funktionen in der SPS benötigen aber relativ gesehen viel Zeit, und so kannst du auch nur Werte lesend im Webserver zur Anzeige bringen, und nicht schreibend.

Ich habe mir so mal ein Meldesystem (mit Archiv) für den Webserver programmiert. In der SPS ist es ein Array of UDT, für den Webserver sind es nur noch ein paar Strings. Das ist dann wenigstens einigermaßen schnell.
 
Ich habs grad mal ausprobiert. Um die Daten in Strings zu packen werden 5 Strings benötigt. Das Laden der Seite mit diesen 5 Strings dauert bei mir ca. 2,5 Sekunden. Da könntest du höchstens noch was optimieren, wenn du nicht alle Stellen benötigst (z.B. nur 3) und dir eine eigene INT_TO_STRING Funktion schreibst, und dann mit weniger Strings auskommst.

Es wäre mal interessant zu erfahren, ob mit neueren Firmwareversionen der 1200 oder die 1500 der Webserver schneller bei der Auslieferung von Variablenwerten ist. Eigentlich kann es nicht Sinn der Sache sein, sich im SPS-Programm um die Datenaufbereitung für den Webserver zu kümmern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.
Danke für die Tipps. Ich dneke ich versuch er erstmal mit reduzierung meiner anzuzeigenden Variablen und mit erhöhung des Kommunikationsoverheads auf 50%.

Kann man die Firmware der COU eigentlich updaten? Oder muss man eine neuere CPU kaufen?

Gruß
Tom
 
Eine CPU mit FW2.2 kannst du nicht mehr hochrüsten, da müsste dann eine neue CPU her. Ob der Webserver bei neueren CPUs die Seiten schneller ausliefert ist aber noch zu prüfen.

Falls du es brauchst, z.B. zum Testen. So habe ich das Array im SPS-Programm in 5 Strings konvertiert:
Code:
FUNCTION "IntArrayToStringArray" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      IntArray : Array[1..43, 1..4] of Int;
   END_VAR

   VAR_OUTPUT 
      StringArray : Array[1..5] of String;
   END_VAR

   VAR_TEMP 
      row : Int;
      col : Int;
      i : Int;
      sindex : Int;
      tmpstring : String;
      val : Int;
   END_VAR


BEGIN
	// Array [1..43,1..4] = 4*43 = 172
	// Annahme Int dann "-12345," = 7 Zeichen pro Wert
	// Bei 254 Zeichen String = 36 Werte pro String, ergibt 5 Strings.
	#i := 0;
	#sindex := 1;
	#tmpstring := '';
	
	FOR #row := 1 TO 43 DO
	    FOR #col := 1 TO 4 DO
	        #i := #i + 1;
	        #val := #IntArray[#row, #col];
	        #tmpstring := CONCAT(IN1 := #tmpstring, IN2 := INT_TO_STRING(#val));
	        #tmpstring := CONCAT(IN1 := #tmpstring, IN2 := ',');
	        IF (#i >= 36) THEN
	            #i := 0;
	            #StringArray[#sindex] := #tmpstring;
	            #tmpstring := '';
	            #sindex := #sindex + 1;
	        END_IF;
	    END_FOR;
	END_FOR;
	// Rest
	IF (#i > 0) THEN
	    #StringArray[#sindex] := #tmpstring;
	END_IF;
END_FUNCTION

Und so könnte man es zur Anzeige bringen, wenn die 5 Strings im DB "HMIDATA" und der Variable "lagers" liegen:
Code:
<!DOCTYPE HTML>
<html>
  <head>
  <title>TEST ARRAYS</title>
<style>
table, th, td {
    border: 1px solid black;
}
</style>
<script type="text/javascript">

function loadTable()
{
    var data = ':="HMIDATA".lagers[1]::="HMIDATA".lagers[2]::="HMIDATA".lagers[3]::="HMIDATA".lagers[4]::="HMIDATA".lagers[5]:';
    var row = 0;
    var col = 0;
    var nrows = 43;
    var ncols = 4;
    var vals = data.split(",");
    var i = 0;
    var tabledata = '<table>'
    for (var row = 1; row <= nrows; row++) {
        tabledata += "<tr>";
        for (var col = 1; col <= ncols; col++) {
            tabledata += "<td>" + vals[i] + "</td>";
            i += 1;
        }
        tabledata += "</tr>";
    }
    tabledata += "</table>";
    
    var results = document.getElementById("tableData");
    results.innerHTML = tabledata;
}
window.onload = function()
{
    loadTable();
}
</script>
</head>
<body>
<div id="tableData"></div>
</body>
</html>

Die Strings könnte man auch in eine separate Datei auslagern und den Inhalt dann per Ajax nachladen, dann flackert auch nichts.
 
Zurück
Oben