Sonstiges S7-1200 Variablen Array für HTML mit JavaScript zusammensetzen

Brubbel

Member
Beiträge
7
Punkte Reaktionen
3
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Forum,

ich bin neu im Umgang mit der SPS Welt und möchte eine Webseite erstellen, die Array-Daten aus der SPS anzeigt.

Von Seiten der SPS existiert ein Datenblock "Aktoren" mit einem Array "Aktordetails" und darin die Felder "Index", "Hersteller" und "Typ"

Das Array hat als Grenzen 1..99 eingetragen und es sind aktuell 5 Aktoren eingetragen.

Ich bekomme es gut hin, die Werte entsprechend auf einer Webseite auszugeben. Allerdings muss ich bisher dazu wissen, welche Werte auch gefüllt sind und die entsprechenden Indizes immer schon komplett ausgeben.

Von Seiten der SPS gibt es schon eine Variable, die mir die Anzahl der gefüllten Aktoren angibt (in meinem Fall 5). Dieser Wert kann aber später variieren. Ich wollte mir also meine Anzeigen abhängig von dem Wert dieser Variablen zusammenbauen:

Code:
<script type="text/javascript">
    $(document).ready(function(){
        var aktorCount = ':="Aktoren".Anzahl_Aktoren:';
        var testArray = [];
        for (let i = 0; i < aktorCount; i++) {
            var z = i+1;
            testArray[i] = ':="Aktoren".Aktordetails['+ z +'].Hersteller:';
        }
    });
</script>


Leider wird das Array irgendwie nicht richtig gebildet. Wenn ich es "offline" (localhost ohne Webserver der S7-1200) ausprobiere, entsteht das gewünschte Array:

Code:
[':="Aktoren".Aktordetails[1].Hersteller:', ':="Aktoren".Aktordetails[2].Hersteller:', ':="Aktoren".Aktordetails[3].Hersteller:', ':="Aktoren".Aktordetails[4].Hersteller:', ':="Aktoren".Aktordetails[5].Hersteller:']

Aber eine Ausgabe auf der Webseite bleibt leer.
Wenn ich das Array gleich direkt so schreibe (ohne die Konstruktion in der Schleife), dann funktioniert das wunderbar.

Ich vermute ich muss dieses Array schon irgendwie vor der Ausführung zusammenbauen aber ich komme mit dem Ajax ohne mein gewohntes php noch nicht so klar und kann das nicht entsprechend vorbereiten.
Ich kann diese Variablen aus einer zusätzlichen Datei per ajax get einlesen und anzeigen. Aber dann müssen sie in der zusätzlichen Datei ja auch schon wieder "fertig" drin stehen und damit habe ich nichts gewonnen.

Könnte mir hier evtl. jemand helfen, wie ich den String/das Array mit der benötigten Anzahl von Variablen zusammensetzen kann?
Aus den bisherigen Antworten hier zu ähnlichen Fragstellungen, bin ich leider nicht ganz schlau geworden, sry ...

Danke schön schon mal im voraus!
 

JSEngineering

Well-known member
Beiträge
1.429
Punkte Reaktionen
399
Moin Brubbel.

Ich gehe jetzt mal davon aus: Du hast eine HTML-Seite, in der Du das Script ausführst, nachdem die Datei geladen wurde.

Das bedeutet ja auch, daß das Array zum Zeitpunkt der Anzeige noch leer ist und erst danach gefüllt wird.

Du mußt Dir also z.B. mit DIV einen benannten Bereich erstellen, in dem Du das Array ausgeben willst und dann im Script über die Eigenschaft innerHTML die Ausgabe in diesen Bereich anstoßen, nachdem das Array gebildet wurde.
 
OP
B

Brubbel

Member
Beiträge
7
Punkte Reaktionen
3
Zuviel Werbung?
->Hier kostenlos registrieren
Moin JSEngineering,

vielen Dank für Deine schnelle Reaktion. Entschuldige bitte, wenn ich mich noch manchmal etwas umständlich ausdrücke. Wie ich den Inhalt von JavaScript Variablen auf einer Webseite zur Anzeige im Browser bringe, ist mir soweit klar. Soweit war ich hier für diesen Teil noch nicht. Ich betrachte die Inhalte des Array zur Überprüfung zunächst in der Console des Browsers. Dort sehe ich, dass das Array die richtigen Werte annimmt, WENN ich das Array bereits komplett fertig zusammengestellt auf der Seite habe:

Code:
let testArray = [':="Aktoren".Aktordetails[1].Hersteller:', ':="Aktoren".Aktordetails[2].Hersteller:', ':="Aktoren".Aktordetails[3].Hersteller:', ':="Aktoren".Aktordetails[4].Hersteller:', ':="Aktoren".Aktordetails[5].Hersteller:' ];
console.log(testArray);

Ergibt die richtigen Werte aus der SPS:

Code:
['1', '2', '5', '2', '3']

Wenn ich das so mache wie oben durch das zusammensetzen mit der Schleife, dann ergibt sich bei:

Code:
console.log(testArray);

Die Ausgabe:

['', '', '', '', '']

Es sieht aktuell für mich so aus, als könnte es ein "Timing" Problem sein. Das Array wird durch die Schleife auf jeden Fall korrekt erzeugt. Aber es ist vermutlich, dass der Zug bereits abgefahren ist und ich jetzt wahrscheinlich noch mal die Seite laden müsste, aber nun bereits mit dem fertigen Array.
Bei PHP hätte ich das jetzt so gemacht, dass ich per Ajax den benötigten Code mir hätte auf einer anderen Seite zusammengebaut und dann das Ergebnis (das fertige Array mit den zusammengesetzten Variablen) hierher als result zurückbekommen hätte.
Ich habe nur leider noch keine Ahnung, wie ich soetwas hier auch machen könnte?

Oder gibt es einen anderen Weg, nur die benötigten Variablen auf der Seite zur Anzeige zu bringen?
 

JSEngineering

Well-known member
Beiträge
1.429
Punkte Reaktionen
399
Ich verstehe so langsam... also die Seite wird anscheinend geparst und Deine Array-Vorbelegung wird durch die Steuerungswerte ersetzt?
Wann/wo geschieht das Parsen? Vermutlich ja auf der Steuerung vor Auslieferung der Seite.
Dann wirst Du nicht umhin kommen, das Array immer komplett vorzubelegen und dann auf der Seite nur so viele Elemente auszugeben, wie gültige Werte vorhanden sind.
Ist das dann ein Performance-Problem, wenn Du alle 100 Werte gleichzeitig liest?

Sollte das so sein, meine nächste Frage: Das scheinen ja keine Daten zu sein, die sich häufig ändern. Wäre es eine Lösung, die Daten ggf. nur einmal beim ersten Aufruf zu laden (was dann einmalig länger dauert) und im Local Storage des Browsers abzulegen, so daß alle nachfolgenden Seiten die Daten nur aus dem Local Storage des Browsers abrufen müssen und nicht jedes Mal ein Laden aller 100 Elemente notwendig ist!?
 

Thomas_v2.1

Well-known member
Beiträge
8.363
Punkte Reaktionen
2.532
Es sieht aktuell für mich so aus, als könnte es ein "Timing" Problem sein. Das Array wird durch die Schleife auf jeden Fall korrekt erzeugt. Aber es ist vermutlich, dass der Zug bereits abgefahren ist und ich jetzt wahrscheinlich noch mal die Seite laden müsste, aber nun bereits mit dem fertigen Array.
Bei PHP hätte ich das jetzt so gemacht, dass ich per Ajax den benötigten Code mir hätte auf einer anderen Seite zusammengebaut und dann das Ergebnis (das fertige Array mit den zusammengesetzten Variablen) hierher als result zurückbekommen hätte.
Ich habe nur leider noch keine Ahnung, wie ich soetwas hier auch machen könnte?

Oder gibt es einen anderen Weg, nur die benötigten Variablen auf der Seite zur Anzeige zu bringen?

Wenn du eine 1500er mit aktueller Firmware hast, dann wird von dieser eine richtige Web-API unterstützt, als JSON-RPC.

Bei älteren Steuerungen kann man sich etwas behelfen, in dem du auf dem Webserver eine Datei in JSON-Syntax anlegst, und dort deine Variablen über die AWP Syntax einfügst. Dann muss der Browser nur einmal die statische Datei laden, und du lädst dann nur die dynamischen Daten über Javascript dazu.

Ich weiß nicht ob die neuen Steuerungen schneller sind beim aktualisieren von vielen Elementen. Wenn du Performance-Probleme bekommst, dann kannst du dir behelfen und im SPS Programm die Daten des Array in einen String z.B. Kommagetrennt einfügen, und dann nur diese eine oder je nach länge mehrere Stringvariablen einfügen. Das ist zwar eine Krücke, aber es funktioniert wesentlich schneller.
 
OP
B

Brubbel

Member
Beiträge
7
Punkte Reaktionen
3
Zuviel Werbung?
->Hier kostenlos registrieren
Moin, dankeschön erstmal für eure Antworten!
@JSEngineering - Ja, so mache ich das aus Ermangelung einer besseren Lösung. Also quasi so wie Thomas_v2.1 das auch vorschlägt. Es wird wohl bald noch 2,3 andere DBs mit ähnlichen Arrays geben und dann jeweils immer so 5-10 Attribute. Kommt schon einiges zusammen was ich da erst mal einsammeln muss. Aber ich schalte einen Spinner davor und dann ist es erstmal nicht sooo schlimm mit der Wartezeit.

Es ist nur schade, dass meine AJAX Kenntnisse hier zu gering sind, um den benötigten String vorher zusammenzubauen :(. Na, ja, falls noch jemand eine Idee hat, dann gerne her damit ;-)

@Thomas_v2.1 - diesen Hinweis darauf, die Daten des Arrays von der SPS in einem String zu erzeugen, habe ich anderen Stellen schon mal gesehen. Gibt es da einen Link zu Informationen was ich dazu auf der SPS machen muss und wie ich diesen String dann auf der Frontendseite auslesen kann?
 

JoGi65

Well-known member
Beiträge
231
Punkte Reaktionen
21
Hilft Dir ev das weiter?
 

JSEngineering

Well-known member
Beiträge
1.429
Punkte Reaktionen
399
Moin Brubbel,

guck Dir mal JSON.stringify an:

Damit kannst Du Dir auf der Konsole ansehen, wie so ein String aufgebaut sein muß, damit Du den mit JSON.parse dann in der Seite auslesen kannst.
 
Oben