Archivierung Zeitgesteuert aktivieren

Zuviel Werbung?
-> Hier kostenlos registrieren
Wie herum funktioniert SetTag ?
Nicht das du hier Old auf akt schreibst statt umgekehrt wie du es eigentlich willst ...
Ich bin jetzt auch nicht der Sripting-Spezi
aber muss die letzte Anweisung nicht genau anders herum lauten?

Code:
falsch:
M_Stopp_Archiv_Old = M_Stopp_Archiv

richtig:
M_Stopp_Archiv = M_Stopp_Archiv_Old

Gruß ukofumo

genau das meinte ich ja, mir scheint nämlich das du durch die falsche Reihenfolge deine Variable "M_Stop_Archiv" ständig zu NULL schreibst...
und nicht den aktuellen Zustand von M_Stop_Archiv auf deine "Flankenvariable" M_Stop_Archiv_Old...

ggf. mal die beiden Variablen als "Leuchtmelder" ausgeben dann kannst du den Zustand ja "sehen" (oder als Farbumschlag bei deinen beiden Buttons)

Gruß ukofumo
 
Ich bin jetzt auch nicht der Sripting-Spezi
aber muss die letzte Anweisung nicht genau anders herum lauten?

Code:
falsch:
M_Stopp_Archiv_Old = M_Stopp_Archiv

richtig:
M_Stopp_Archiv = M_Stopp_Archiv_Old
Nein muß nicht, das ist schon richtig so. Dein Vorschlag ist falsch.

Der TE versucht eine Flankenerkennung (welche aber nicht nötig ist).
M_Stopp_Archiv ist die Trigger-Variable mit dem aktuellen Zustand, demzufolge muß am Ende der aktuelle Zustand in M_Stopp_Archiv_Old gemerkt werden. Siehe die Beiträge #1 und #6

In VBS (wie eigentlich bei fast allen Programmiersprachen) steht bei Zuweisungen die Zielvariable links vom =, rechts steht das was zugewiesen werden soll.
Code:
'den Wert von M_Stopp_Archiv an M_Stopp_Archiv_Old zuweisen:
M_Stopp_Archiv_Old = M_Stopp_Archiv

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, Asche auf mein Haupt... Harald hat (ein bisschen) Recht....

Code:
'den Wert von M_Stopp_Archiv an M_Stopp_Archiv_Old zuweisen:
M_Stopp_Archiv_Old = M_Stopp_Archiv

Ich hab jetzt mal ein bissi gespielt...
diese Art der Zuweisung scheint in WinCC gennerell nicht zu fuktionieren.

Die Anweisung ob "M_Stopp_Archiv_Old" gesetzt oder zurück gesetzt werden soll muss mit in den jeweiligen Zweig.
Ob dabei die getrennten If-Abfragen oder die If-Then-Else Variante sollten beide funktionieren.

Code:
If  (M_Stopp_Archiv And Not M_Stopp_Archiv_Old)  Then
    StopLogging hmiAlarmLog, "STQ_Archiv"
    HmiRuntime.Trace("Stopp Logging")    
'    ShowSystemAlarm("Stopp Logging")
    ActivateScreen "BG 04",0
    SetTag ("M_Stopp_Archiv_Old"),1
End If

If  (Not M_Stopp_Archiv And M_Stopp_Archiv_Old)  Then
    StartLogging hmiAlarmLog, "STQ_Archiv"
    HmiRuntime.Trace("Start Logging")    
'    ShowSystemAlarm("Start Logging")
    ActivateScreen "BG 05",0
    SetTag ("M_Stopp_Archiv_Old"),0
End If

Code:
If (M_Stopp_Archiv And Not M_Stopp_Archiv_Old) Then
    StopLogging hmiAlarmLog, "STQ_Archiv"
    HmiRuntime.Trace("Stopp Logging")    
'    ShowSystemAlarm("Stopp Logging")
    ActivateScreen "BG 04",0
    SetTag ("M_Stopp_Archiv_Old"),1
ElseIf (Not M_Stopp_Archiv And M_Stopp_Archiv_Old) Then
    StartLogging hmiAlarmLog, "STQ_Archiv"
    HmiRuntime.Trace("Start Logging")    
'    ShowSystemAlarm("Start Logging")
    ActivateScreen "BG 05",0
    SetTag ("M_Stopp_Archiv_Old"),0
End If

Gruß ukofumo
 

Anhänge

  • Script1.jpg
    Script1.jpg
    61,8 KB · Aufrufe: 8
  • Script2a.jpg
    Script2a.jpg
    62,1 KB · Aufrufe: 9
Zuletzt bearbeitet:
diese Art der Zuweisung scheint in WinCC gennerell nicht zu fuktionieren.

Das wäre dann aber ein böser Fehler im TIA wenn du da Recht hast (ich kann es nicht checken - aber der TE wird es am Montag ganz sicher tun).
Bei WinCCFlexibel 2008 zumindestens bin ich mir noch ganz sicher, dass es da korrekt (und wie auch vom TE gedacht) funktioniert hat ...

Gruß
Larry
 
Das wäre dann aber ein böser Fehler im TIA wenn du da Recht hast (ich kann es nicht checken - aber der TE wird es am Montag ganz sicher tun).
Bei WinCCFlexibel 2008 zumindestens bin ich mir noch ganz sicher, dass es da korrekt (und wie auch vom TE gedacht) funktioniert hat ...

Gruß
Larry

tya, wie war der Spruch? warum einfach wenns auch Siemens gibt.... bei weitem ja auch nicht der einzigste Bug im TIA
its not a Bug -> its a Feature

Gruß ukofumo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nachtrag,
ich habs mit TIA-WinCC V13 (Updatestand müsst ich montag nochmal nachschauen) probiert, alledings auch nur mit der Runtime- Simulation getestet.
ob sich das bei nem Realen Panel dann anderst verhält... :confused:

mir sind auch noch ein paar weitere mir merkwürdige eigenheiten aufgefallen:
Code:
'wenn ich im Script eine HMI-Bit-Variable mit:
Variable_XY = 1
'wird die Variable auf "1" gesetzt

Code:
Variable_XY = 0
'bewirkt komischer weise aber überhaupt nix (?)  die Variable bleibt auf "1"

Zumal ich Bit-Variablen ja eig. auch eher mit "TRUE" und "FALSE" traktieren würde....
Code:
Variable_XY = True
Variable_XY = False

Beide Varianten bewirken aber überhaupt nix!

deshalb dann letztlich über die "SetTag-Funktion"....



nehme ich aber eine INT-Variable (oder DINT)
Code:
Variable_INT = Variable_INT +1

oder
Variable_INT = Variable_INT -1
funktioniert das klaglos, bei jedem Scriptaufruf zählt die Variable eins hoch... (bzw. eins runter)
 
Zuletzt bearbeitet:
Das, was du da schreibst, wäre eine mögliche Erklärung für die Problematik des TE - für mich entbehrt das allerdings eines logischen Zusammenhangs (bitte nicht als Kritik an dich und deine Bemühungen, Licht ins Dunkel zu bringen, zu verstehen). Ich bin jetzt wirklich sehr gespannt, wie sich das Ganze weiter entwickelt.

Gruß
Larry
 
für mich entbehrt das allerdings eines logischen Zusammenhangs
Trrzzz... ne kein Problem :s1:
ich hatte ja am Anfang schon geschrieben das ich jetzt nicht unbedingt der Scripting-Profi bin...
hätte aber schon gedacht das mich mein Basic-Wissen aus C64er Zeiten und VisualBasic doch nützen würde...
wioe es ausschaut muss ich aber für VB-WinCC nochmal von vorne anfangen :icon_evil: :icon_evil: :icon_evil:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es in dem TIA kein SmartTags() mehr?
Auch wenn man nicht immer muß, ich würde es trotzdem generell verwenden.

Bei dem Problem des TE würde ich ganz frisch neue Variablen anlegen und ein neues ganz einfaches Script schreiben und testen und dieses dann erweitern:
Code:
If SmartTags("Triggervariable") = 1 Then
  SmartTags("Testvariable") = 1
  ShowSystemAlarm("Stop Logging")
Else
  SmartTags("Testvariable") = 0
  ShowSystemAlarm("Start Logging")
End If
Den Zustand der Triggervariable merken ist unnötig, wenn das Script nur bei Wertänderung der Triggervariable aufgerufen wird. Es stört aber auch nicht, wenn das Script öfters aufgerufen würde.

Harald
 
ich hatte ja am Anfang schon geschrieben das ich jetzt nicht unbedingt der Scripting-Profi bin...
hätte aber schon gedacht das mich mein Basic-Wissen aus C64er Zeiten und VisualBasic doch nützen würde...
wioe es ausschaut muss ich aber für VB-WinCC nochmal von vorne anfangen :icon_evil: :icon_evil: :icon_evil:

Sehe ich nicht so.
Visual Basic kenne ich eigentlich recht gut. Du kannst in VB-Script die Objekte nicht so nutzen wie unter .Net - die Grundsyntax ist aber ziemlich ähnlich. Man kann halt nur Proceduren und Funktionen erstellen und keine Klassen. C64 ist allerdings doch schon recht weit hergeholt ... 8)

Gruß
Larry
 
@Harald:
wenn Flex die Variable ohne die SmartTags-Angabe schluckt (also nicht anmeckert) dann sollte es auch funktionieren. Das System findet dann ja ein Objekt mit dem es arbeiten kann.
Aber wir sprechen hier ja von TIA - und da wurden ja viele Zahnräder anscheinend wieder neu erfunden und manche vielleicht auch erst gar nicht eingebaut ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich lese die Beiträge mit Begeisterung. Nur umsetzen kann ich die am Wochenende leider nicht. Ich werde mir das aber am Montag natürlich anschauen. Ich werde auch mal neue Variablen anlegen. Ich bin halt auch sehr verwirrt warum das Script permanent aufgerufen wird. Da dieser Aufruf immer wieder erfolgt bin ich erst auf die Auswertung des „alten“ Zustandes (M_Stopp_Archive_Old) gekommen.
Ich verwende übrigens TIA V12 SP1 (glaube ich) Update 4. Mal schauen ob ich Montag was Neues berichten kann. Ein Aufschrei das es jetzt geht wäre schön.

Schönes WE
Uli
 
Nachtrag,
ich habs mit TIA-WinCC V13 (Updatestand müsst ich montag nochmal nachschauen) probiert, alledings auch nur mit der Runtime- Simulation getestet.
ob sich das bei nem Realen Panel dann anderst verhält... :confused:

mir sind auch noch ein paar weitere mir merkwürdige eigenheiten aufgefallen:
Code:
'wenn ich im Script eine HMI-Bit-Variable mit:
Variable_XY = 1
'wird die Variable auf "1" gesetzt

Variable_XY = 0
'bewirkt komischer weise aber überhaupt nix (?)  die Variable bleibt auf "1"

Zumal ich Bit-Variablen ja eig. auch eher mit "TRUE" und "FALSE" traktieren würde....
Code:
Variable_XY = True
Variable_XY = False

Beide Varianten bewirken aber überhaupt nix!

deshalb dann letztlich über die "SetTag-Funktion"....



nehme ich aber eine INT-Variable (oder DINT)
Code:
Variable_INT = Variable_INT +1

oder
Variable_INT = Variable_INT -1
funktioniert das klaglos, bei jedem Scriptaufruf zählt die Variable eins hoch... (bzw. eins runter)


Sodele, hat mich jetzt nicht in ruhe gelassen....!
und ich kann da etwas "Entwarnung" geben....

Hab heut morgen nochmal mit nem Kollegen probiert....
WinCC flex 2008 --> alles gut --> alle Varianten funktionieren!
TIA-WinCC V13 --> wie oben beschrieben :confused:

Ich muss allerdings dazu sagen das auf dem Rechner beides installiert ist!!!
(also Classic Step7 (V5.5) & WinCC flex 2008 (SP3) als auch TIA-Portal Step7 V13 & WinCC V13 (noch ohne SP1)

Hatte an anderer Stelle ja schon geschrieben das wir derzeit neue Lappis fürn Service aufsetzen...

Haben dann mal eins von dehnen mit frisch installiertem TIA-Portal WinCC V13 SP1 genommen und siehe da es funzt DOCH!
scheint so das bei der TIA Installation bei dem anderen Rechner was "krumm" ist. :oops::oops::oops:

Gruß ukofumo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

es wird allerhöchste Zeit, dass ich mich auch mal wieder zu Wort melde. Ich habe die letzten Zwei Tag noch einmal intensiv an dem Problem gearbeitet und wollte eigentlich schon folgenden Satz schreiben.

„Jetzt will ich mal etwas Lichts ins dunkle bringen. Vorab gleich die Enttäuschende Meldung: Es hat alles nichts geändert.“
ABER
Das Blatt hat sich gewendet. Gestern hatte ich dann doch einen Durchbruch. Ich habe mir den vorhergehenden Projektstand noch einmal geschnappt und für diese Problem bei Null angefangen. Step by Step baute ich das Problem neu auf.
- Button zum setzen einer HMI Variable und Anzeige über Rechteck (Farbwechsel)
- Script wie in #29 eingefügt
- HMI-Variable mit PLC-Variable verbunden (anzeige über weites Rechteck)
Ups: die Variable „Testvariable“ fängt an zu flackern und das Script wir sporadisch (dachte ich zumindest) aufgerufen.
Lösung: Beim Anlegen der HMI-Variable steht bei Verbindung (CPU315….) drin. Es wird also automatisch eine Verbindung zur CPU hergestellt auch wenn bei PLC-Variable „undefiniert“ drin steht. Hier musste ich auch die Verbindung löschen damit die Variable nicht mehr von der PLC beeinfluss wird. Ab jetzt hatte ich ruhe mit unkontrollierten aufrufen meines Scripts.
Problem 1 war also gelöst. Jetzt ging es an das Script ran. Hier mußte ich einiges Testen bis ich die Richtige Lösung für die IF-Abfragen hatte. Hier nun das Script.
Code:
On Error Resume Next
If TP_ArchivPause = True Then
    'SetTag "Test_Bit_1", 0
    StopLogging hmiAlarmLog, "STQ_Archiv"
    ShowSystemAlarm "Archivierung angehalten STQ-Archiv"
ElseIf TP_ArchivPause = False Then
    'SetTag "Test_Bit_1", 1
    StartLogging hmiAlarmLog, "STQ_Archiv"
    ShowSystemAlarm "Archivierung gestartet STQ-Archiv"
End If
If Err.Number <>0 Then
    ShowSystemAlarm "Error '" & CStr(Err.Number) & " " & Err.Description
    Err.Clear
    Exit Sub
End If

Was soll ich sagen? Getestet und als GUT befunden. Das Test_Bit_1 wird nicht mal benötigt.

VIELEN DANK für die Diskussion und die Tipps/Hinweise. Das Problem gilt für mich vorerst als gelöst. Ich hoffe auf weiter tolle Unterstützung bei weiteren Fragen die mit Sicherheit aufkommen. Ich fange ja gerade erst an mit der Programmierung.
 
Sagte ich doch - nochmal komplett frisch anfangen.
Gibt es in dem TIA sowas wie "temporäre Dateien löschen" oder "alles neu generieren"?

Übrigens ist die ElseIf-Abfrage überflüssig, ein einfaches Else tut es auch :cool:

Harald
 
Einfach alles neu hat es nicht gebracht. Die "automatische" Zuordnung einer HMI-Variable zur PLC war trotzdem wieder da und hatte das anfangs versaut. Vielleicht könnte es aber auch daran liegen, dass es mal ein V5.5 Projekt war und wir es ins TIA übernommen haben.

Ja, eine Else würde es auch machen. Ich wollte hier aber auf Nummer sicher gehen. Ich hatte ja schon den Fall wo immer der Else-Zweig durchlaufen wurde. Da hatte ich aber nicht die unkontrollierten aufrufe des Scripts. Die sind nun Geschichte und ich mit dem Teil glücklich.
Gibt es bei dem MP277 eigentlich sowas wie eine MassageBox? Ich glaube was gelesen zu haben das es dies nicht gibt. Würde gerne noch eine Meldung auf dem Display anzeigen wenn das Archivieren wieder aktiviert wurde.

VG Uli
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine MassageBox gibt es leider nicht, eine aufpoppende MessageBox übrigens auch nicht ;)

Das liegt nicht an dem MP277 sondern an dem WinCC flexible bzw. Advanced.

Du könntest auf einem Bild etwas malen, was wie eine Messagebox aussieht und in dem Skript eine Panelvariable setzen, welche die Sichtbarkeit der "Messagebox"-Elemente steuert. Die [OK]-Schaltfläche der "Messagebox" rücksetzt die Variable und schaltet die Elemente dadurch wieder unsichtbar. Allerdings sieht man diese "Messagebox" nur in dem Bild, in dem sie gemalt ist.

Oder einfacher: Du setzt in der Steuerung eine Variable, welche im Panel eine quittierpflichtige Meldung auslöst. Dann poppt die Meldung in jedem Bild auf.

Harald
 
Ein Nur-Else ohne erneute Bedingung liest und versteht sich einfacher als ElseIf und bietet weniger Möglichkeiten für Tippfehler.

Die "sicherheitshalber" erneute Abfrage der TP_ArchivPause-Variable im Else-Zweig kann auch kontraproduktiv sein, wenn nämlich die Variable im IF-Zweig rückgesetzt wird. Dann wird der ElseIf-Zweig wahr ...

Boolsche Logik ist schon sicher genug, es gibt nur Wahr oder Falsch und nichts dazwischen. Wenn eine Bool-Aussage nicht wahr ist, dann ist sie falsch.

Harald
 
quittierpflichtige Meldung wird der Weg der Lösung sein. Ich habe ja keine Ahnung welches Bild gerade angezeigt wird.

wenn nämlich die Variable im IF-Zweig rückgesetzt wird. Dann wird der ElseIf-Zweig wahr ...

Richtig aber doch falsch. Bei einer If Then Else Anweisung wird der Reihe nach geprüft.

Code:
if x=1 Then
              'Abarbeitung wenn X=1
              'Springen zu End IF
ElseIF x=2 Then
              'Abarbeitung wenn X=2
              'Springen zu End IF
Else
               'Abarbeitung wenn X nicht 1 und 2
               'Springen zu End IF
EndIF

Es wird immer der Zweig abgearbeitet der als erstes die Bedinung erfüllt. Alle anderen Zweige werden Ignoriert auch wenn die Bedingung durch die Abarbeitung eines Vorhergehenden Zweiges auf einmal TRUE wird. Leider habe ich den Nachweis jetzt auf die Schnelle nicht gefunden. Hier ein Auszug aus dem Bereich SCL:
Wenn die erste Bedingung (<Bedingung1>) erfüllt ist, werden die Anweisungen (<Anweisungen1>) nach THEN ausgeführt. Nach der Bearbeitung der Anweisungen wird die Programmbearbeitung nach END_IF fortgesetzt.

Wenn die erste Bedingung nicht erfüllt ist, wird die zweite Bedingung (<Bedingung2>) geprüft. Wenn die zweite Bedingung (<Bedingung2>) erfüllt ist, werden die Anweisungen <Anweisungen2> nach THEN ausgeführt. Nach der Bearbeitung der Anweisungen wird die Programmbearbeitung nach END_IF fortgesetzt.

Wenn keine der Bedingungen erfüllt ist, werden die Anweisungen (<Anweisungen0>) nach ELSE ausgeführt und danach wird die Programmbearbeitung nach END_IF fortgesetzt.

Genauso kenn ich es auch bei VB und gehe mal davon aus, dass es hier auch so umgesetzt ist.

VG Uli
 
Zurück
Oben