WinCC Unified Zugriff auf ein Array mittels einer Indexvariable - geht nicht

Senator42

Level-2
Beiträge
927
Reaktionspunkte
80
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Ich habe WinCC Unified Tia V16

Meldungen ist eine externe variable , die in einen DB einer S7-300 zeigt.

in einer Scriptfunktion kann ich so zugreifen:
Let Tag01 = Tags("Meldungen[0]");

Aber so nicht:
Let ix = 0;
Let Tag02 = Tags("Meldungen[ix]");
der Editor baut das immer mit 2 "" um:
Let Tag02 = Tags(""Meldungen[ix]"");
und damit geht es nicht.

was mach ich falsch?
 
Ist das Skript VBS?
Ist "Meldungen" ein Array oder sind das viele einzelne Tags?
Bei Array probiere mal so: Tags("Meldungen")(ix)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Senator,

...
in einer Scriptfunktion kann ich so zugreifen:
Let Tag01 = Tags("Meldungen[0]");

Aber so nicht:
Let ix = 0;
Let Tag02 = Tags("Meldungen[ix]");
...

der Text innerhalb der Tags-Anführungszeichen repräsentiert einen Variablennamen, wobei es -wie Harald richtig anmerkt- darauf ankommt, ob es sich bei der "Variable" um eine Einzelvariable oder um das Element einer Arrayvariablen handelt:
+ Einzelvariable "Meldungen[0]" -> Schreibweise müsste sein: Tag02 = Tags("Meldungen[" & CStr(iX) & "]")
+ Element einer Arrayvariablen -> Schreibweise müsste sein: Tag02 = Tags("Meldungen")(iX)

WICHTIG:
Meine Schreibweisen sind in VisualBasicSscript!
Da bei Unified ja JavaScript zum Einsatz kommt, muss wahrscheinlich mindestens mal das "CStr(iX)" auf "iX.toString()" umgemodelt werden.


Gruß, Fred
 
Meldungen Array[0..99] of Byte ; extern --> SPS ... DB 100.dbx0.0

Tag02 = Tags("Meldungen")(iX) -- geht nicht, auch nichts im traceViewer

Tag02 = Tags( "Meldungen[" & iX.toString() & "]" ) -- geht nicht, auch nichts im traceViewer

ABER das geht:
let ss = "Meldungen[" + iX.toString() + "]" // es müssen + sein, nicht &
Tag02 = Tags( ss ); // es ist also ein String in der Klammer !!!


Frage 2: woher bekomme ich den Port ?

Start the Script Debugger by calling the address: "http://localhost:9222" in Chrome. (Your port might be different.)


Frage 3: wie kann ich messen , wie lange das dauert:

For 1...10000
{
ein paar sachen
}

 
weitere Probleme:


Code:
----a)  bit lesen
// READ
let tag1 = Tags("einBitImShuttle");
let tagValue1 = tag1.Read();
HMIRuntime.Trace("Funktion_Umdrehen vor umdrehen: " + tagValue1);


----b)  bit umdrehen und schreiben
// WRITE
tagValue1 = 1- tagValue1;
tag1.Write(tagValue1);
HMIRuntime.Trace("Funktion_Umdrehen nach umdrehen: " + tagValue1);


----c)  sofort danach nochmal das bit lesen  - [B]Ergebnis: Es ist nicht das gerade geschriebene.    WARUM ?[/B]
[B]// READ[/B]
//let tag1 = Tags("einBitImShuttle");
tagValue1 = tag1.Read();
HMIRuntime.Trace("Funktion_Umdrehen controlle: " + tagValue1);

auch wenn einige Zeilen später das ganze Byte gelesen wird, fehlt das gerade veränderte Bit.

gibt es für b) irgendwas wie bei SQL ein commit ?
 
in java kannst du deine Strings ganz leicht zusammen fügen:

// zum Variablen einlesen sollten man aus gründen der Zykluszeit zwar Tagsets benutzen, aber falls die einzeln gelesen werden beutze ich lieber die nachfolgende Methode. würde aber auch mit deiner Variante analog gehen:

let ix =[FONT=Verdana,Arial,Tahoma,Calibri,Geneva,sans-serif]HMIRuntime.Tags.SysFct.GetTagValue [/FONT]
("index");
let Tag 02=[FONT=Verdana,Arial,Tahoma,Calibri,Geneva,sans-serif]
HMIRuntime.Tags.SysFct.GetTagValue
("
Meldungen["+ix+"]");
[SUB][SUP]
[/SUP][/SUB]
[/FONT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
weitere Probleme:


Code:
----a)  bit lesen
// READ
let tag1 = Tags("einBitImShuttle");
let tagValue1 = tag1.Read();
HMIRuntime.Trace("Funktion_Umdrehen vor umdrehen: " + tagValue1);


----b)  bit umdrehen und schreiben
// WRITE
tagValue1 = 1- tagValue1;
tag1.Write(tagValue1);
HMIRuntime.Trace("Funktion_Umdrehen nach umdrehen: " + tagValue1);


----c)  sofort danach nochmal das bit lesen  - [B]Ergebnis: Es ist nicht das gerade geschriebene.    WARUM ?[/B]
[B]// READ[/B]
//let tag1 = Tags("einBitImShuttle");
tagValue1 = tag1.Read();
HMIRuntime.Trace("Funktion_Umdrehen controlle: " + tagValue1);
auch wenn einige Zeilen später das ganze Byte gelesen wird, fehlt das gerade veränderte Bit.

Mit Unified habe ich noch nicht gearbeitet, aber ich vermute mal, dass das von Javascript kommt.
Es gibt dort synchrone und asynchrone FunctionCalls.
Wahrscheinlich gehört Write auch dazu.
Such mal in der Doku nach den Begriffen "await" und "promise".
Ich fluch da auch immer, wenn ich was im Node.JS-Umfeld "bastel".

Gruß
Blockmove
 
weitere Probleme:
----c) sofort danach nochmal das bit lesen - Ergebnis: Es ist nicht das gerade geschriebene. WARUM ?
gibt es für b) irgendwas wie bei SQL ein commit ?

Nein, es gibt gibt kein Commit.

Das Schreiben ist etwas komplexer als es aussieht und tatsächlich gibt es sogar noch mehrere Varianten.
Hier der grobe Ablauf:
1. Es wird ein Schreibauftrag an das Prozessabbild abgeschickt
2. nur bei externen Variablen: es wird ein Schreibauftrag an die PLC abgeschickt
3. nur bei externen Variablen: beim nächsten Lese-Zyklus wird das Prozessabbild aktualisiert
4. Der lokale Tag-Cache im Scripting wird vom Prozessabbild aktualisiert

Das dauert natürlich einige Zeit (im Durchschnitt einen halbe Aktualsierungszyklus des Tags), daher will man normalerweise nicht so lange warten, ansonsten wäre die Script Performance sehr langsam.

tag1.Read(); liest aus dem Tag-Cache.

Wenn du mehr wissen willst, kannst du dir mal die anderen Read und Write Methoden des Tag Objektes und vor allem deren optionale Parameter ansehen, vielleicht hilft die die Wait Variante vom Schreiben weiter.

Michael
 
Zurück
Oben