WinCC Unified Verwendung von TagSet in JavaScript

batman&ich

Level-2
Beiträge
161
Reaktionspunkte
37
Zuviel Werbung?
-> Hier kostenlos registrieren
Nutzt jemand häufig das Objekt TagSet, gerade auch für "Massendatenverarbeitung" ?
Falls ja, wie erstellt ihr diese im Code?

Ich habe nun schon mehrfach TagSets verwendet, um bspw. Integer-Variablen auf Word-Variablen (mehr als 100 Variablen) zu schreiben.
Die Vorteile und die allgemeine Funktion von TagSets gefällt mir sehr gut, allerdings ist die Erstellung sehr aufwendig. Ich arbeite dabei schon viel mit KI und Excel, aber dabei passieren doch auch immer wieder Fehler.
(Sicher eine blöde Frage 😂 aber gibt es dafür Tools von Siemens?)

Danke vorab für jede hilfreiche Antwort.
 
Hey,
falls es dir hilft, so habe ich ein TagSet in Unified View-Of-Things (VoT) erstellt. Ich kam irgendwann auf die Idee die Namen der einzelnen Elemente als Array zu übergeben und das hat sofort funktioniert.


Javascript:
  //*** Erstelle TagSet aus Array Elementen ***
  let plcVariables = [];
  for (let i = 0; i <= 31; i++) {
    plcVariables.push('dbHMI.tyDiagramm.aBuffer[' + i + ']');  // Erstelle Array mit Variablennamen
  }

  let tsDataHistory = Tags.CreateTagSet(plcVariables);
  tsDataHistory.Read();

Da ich da keine Möglichkeit gefunden habe ein Array anzulegen als HMI Variable gehe ich den diesen (Um)weg. Was ich da herausgefunden habe, dass die einzelnen Arrayelemente gar nicht als HMI Variable angelegt sein müssen damit es funktioniert, wahrscheinlich aber eine "Sonderlocke" von VoT, mit Unified Panels oder RT's habe ich bisher nicht gearbeitet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
Ich kam irgendwann auf die Idee die Namen der einzelnen Elemente als Array zu übergeben
Danke, das ist eine sehr gute Idee.
Aber wie beschreibst du die einzelnen TagSet Elemente, funktioniert das auch über den Index per Schleife?


wahrscheinlich aber eine "Sonderlocke" von VoT, mit Unified Panels oder RT's habe ich bisher nicht gearbeitet.
Werde ich demnächst aufjedenfall mal versuchen.
 
Hey,
sorry für die spätere Antwort. Ich bin mir nicht sicher ob ich deine Frage verstehe.
Über den Befehl tsDataHistory.Read() werden die Daten aus der SPS in das komplette TagSet geschrieben. Zum Auslesen einzelner Werte aus dem TagSet nutze ich tsDataHistory.Item(i).Value .
Wenn ich nochmal in die Doku schaue https://support.industry.siemens.com/cs/mdm/109813308?c=151804001547&lc=de-DE
hätte ich mir oben vermutlich das extra Array sparen können und in der Schleife mit TagSet Add() arbeiten können..
 
Das Lesen einzelner Elemente ist klar und sehr einfach.

Meine Frage sollte eigentlich auf das beschreiben mehrerer TagSet Elemente abzielen, also Richtung Massendaten verarbeiten.
Aktuell mache ich das immer so, dass ich häufig 2 TagSets habe und das eine auf das andere beschreibe und das sieht dann wie folgt aus:

Javascript:
ts_Eingang('Element0').Value = ts_Ausgang('ElementA').Value;
ts_Eingang('Element1').Value = ts_Ausgang('ElementB').Value;
ts_Eingang('Element2').Value = ts_Ausgang('ElementC').Value;
//... usw.


ts_Eingang.Write();

Und bei >100 Elementen pro TagSet ist das sehr aufwändig und fehleranfällig.
Kann man die einzelnen Elemente eines TagSets auch über einen Index ansprechen (und darauffolgend mit Schleifen abarbeiten)?
Hast du sowas evtl. schon mal gemacht? Ich finde leider dazu nichts was in JS funktioniert...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
nochmal sry für die späte Antwort.
Ich hab bisher noch kein TagSet schreiben müssen, was aber definitiv geht ist das ansprechen mit einem Index, z.B. nutze ich tsDataHistory.Item(0).Value um einen Wert vorzubelegen und bei einer Berechnung auch mit Variablen Index i.

Aus Interesse habe ich mal ein bisschen getestet und der folgende Code macht auch was er soll soweit ich das beurteilen und testen konnte:

Javascript:
let tsSignalTower = Tags.CreateTagSet();
  for (let i = 0; i <= 4; i++) {
    tsSignalTower.Add("dbHMI.aSignalTower[" + i + "]");
  }
  tsSignalTower.Read();
  for (let i = 0; i < tsSignalTower.Count - 1; i++) {
    tsSignalTower.Item(i).Value = tsSignalTower.Item(i + 1).Value + 1;
  }
 
  tsSignalTower.Write();
  tsSignalTower.Read();

// Debug Ausgabe
  Screen.Items('Textfeld_1').Text = tsSignalTower.Item(0).Value;
  Screen.Items('Textfeld_1').Text += tsSignalTower.Item(1).Value;
  Screen.Items('Textfeld_1').Text += tsSignalTower.Item(2).Value;
  Screen.Items('Textfeld_1').Text += tsSignalTower.Item(3).Value;
  Screen.Items('Textfeld_1').Text += tsSignalTower.Item(4).Value;

  return;
Ist nur ein Code zum Testen, also nicht die Sinnhaftigkeit hinterfragen😅
 
Zurück
Oben