Archivierung Zeitgesteuert aktivieren

Uli001

Level-1
Beiträge
40
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich will in einer Anlage die Archivierung für die Zeit von Wartungsarbeiten unterbrechen. Ganz genau geht es um ein Meldearchiv in einem MP277. Dafür habe ich mir zwei Button geschaffen. Button 1 stoppt die Archivierung und setzt ein Bit (M_Stopp_Archiv) und Button 2 startet die Archivierung und setzt das Bit (M_Stopp_Archiv) zurück. Soweit scheint das auch zu Funktionieren.
Jetzt das Problem:
Über das Bit (M_Stopp_Archiv) starte ich einen S5Timer der mir nach Ablauf automatisch die Archivierung wieder starten soll. Den Befehl „StarteArchivierung“ kann ich ja aber nicht direkt aus dem Netzwerk aufrufen. Also habe ich mir ein Scrip geschrieben in dem ich den Zustand von M_Stopp_Archiv Abfrage und entsprechen das Archivieren starte oder stoppe. Das Script wird aber nicht aufgerufen. Ich habe gelesen, dass es nur geht wenn das Bit durch direkte Eingabe vom User geändert wird.
Wie kann ich jetzt aber realisieren, dass nach Ablauf des S5Timers oder zumindest nach einer Zeit die Archivierung automatisch wieder gestartet wird?
Hintergrund: Das Archiv wird zur Fehlererfassung herangezogen. Im Falle von Wartungsarbeiten entstehen viele Fehlermeldungen die aber durch die Arbeiten und nicht im „normalen“ Ablauf der Steuerung entstehen. Diese sollen nicht mit Protokoliert werden um die Fehlerquote nicht zu verfälschen. Sollte am Ende der Wartungsarbeiten aber vergessen werden die Archivierung wieder zu aktivieren soll dies nach einer Zeit ich automatisch geschehen. Am liebsten hätte ich noch eine Textausgabe am HMI aber das lässt sich sicher auch über das Meldefenster realisieren.

Danke für jeden Hinweis.
Uli:
PS: Bitte möglichst einfach beschreiben da ich TIA V12 und die Programmierung mir gerade erst beibringe.
 
Stell bei der Variable die Erfassungsart von "Zyklisch bei Verwendung" auf "Zyklisch" um.

Dann wird die Variable immer erfasst, und du kannst dann bei Wertänderung dein Script ausführen.

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Marcel,

cih hatte die auf "Zyklisch fortlaufend" oder so stehen. Das hat aber nichts gebracht. Kann aber am Dienstag noch mal schauen. Bin morgen im Außendienst unterwegs und werde sich nicht dazu kommen.

Danke

Uli
 
Hallo,

also, mein Ausflug ist doch ausgefallen. Habe inzwischen sehen können, dass der Aufruf vom Script funktioniert. Habe in dem Script

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

End If
M_Stopp_Archiv_Old=M_Stopp_Archiv

Ich rufe die Bilder nur auf um zu sehen ob der Zweig des Programmcodes auch durchlaufen wird. Leider wird aber immer nur der ELSE-Zweig durchlaufen. Stimmt was mit der letzten Zuweisung nicht? Beider Variablen werden gleich eingelesen.

VG Uli
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

ich verwende das Ereignis "Wertänderung" der HMI-Variable M_Stopp_Archiv. Kann das sein, dass dieses Ereignis jedes Mal beim Zyklischen einlesen ausgelöst wird? Ich habe das Gefühl, dass mein Script permanent aufgerufen wird. Wenn ich z.B. in den Else-Zweig die Darstellung eines Bildes implementiere erscheint dies immer wieder OHNE das ich den Butten der M_Stopp_Archiv auf High setzt betätige. z.Z. setzte ich den Wert für M_Stopp_archiv über ein Button auf 1 und über einen Timer wieder auf 0 Der Teil läuft auch. Nur bei einem Timer von 300s wird das Bild viel häufiger aufgerufen was nicht sein dürfte. Das Script wird ja "eigentlich" nur beim loslassen des Buttons und nach dem Ablauf des Timers aufgerufen.


VG Uli
 
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

Ich würde das Sript auch in zwei einzelne If-Abfragen gliedern
Code:
If (M_Stopp_Archiv=1 And M_Stopp_Archiv_Old=0) Then
    StopLogging hmiAlarmLog, "STQ_Archiv"
'    HmiRuntime.Trace("Stopp Logging")    
'    ShowSystemAlarm("Stopp Logging")
    ActivateScreen "BG 04",0
End If

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

M_Stopp_Archiv = M_Stopp_Archiv_Old

Gruß ukofumo
 
Zuletzt bearbeitet:
Ich weiss jetzt nicht welche Programmiersprache hier verwendet wird.

Ist es aber schon richtig das der Vergleich in der IF Anweisung (x=y) und die Zuweisung (VariableOld = Varialbe) gleich aussehen ?

lg Günther
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen

@ukofumo
Also wenn ich von meinen Kenntnissen in VBA (Visual Basic for Applications) welches in Excel, Access und Co verwendet wird, ausgehe bin ich mit der Zuweisung richtig. Ich werde aber sowohl die Zuweisung als auch die Aufsplittung der IF-Funktion testen. Ich bin aber immer noch irritiert warum das Script permanent aufgerufen wird. Eigentlich soll das nur bei Wertänderung von „M_Stopp_Archiv“ erfolgen. Na ich gehe gleich an die Anlage und teste weiter.

@roger34
Die Scriptsprache müsste ein abgewandeltes Visual Basic sein. Leider habe ich hier noch keinen Debugger finden können wie ich es bei z.B. Excel habe. Ich habe das jetzt mal in Word nachgebaut und erhalte genau das Verhalten wie ich es erwartet habe. Da es bei einer SPS meist nur um 0 oder 1 (H oder L) geht kannst du die Zuweisung sicher auch anders machen:
Code:
 If (M_Stopp_Archiv And !M_Stopp_Archiv_Old) Then
Der Code ist nicht getestet sollte aber aus VBA auch gehen. Mal schauen ob die Vorschläge von ukofumo helfen.
Danke für die Antworten und ich hoffe auf weiter Hilfe.
Uli
 
Hallo,
das mit dem Ausdrufezeiche als Negation (wie bei z.B. C#) funktioniert bei VB m.E. nicht. Was aber geht (wenn deine beiden Variablen BOOL sind) ist :
Code:
If (M_Stopp_Archiv And NOT M_Stopp_Archiv_Old) Then
was mich aber interessieren würde : wenn der Trigger für dein Script die Wertänderung von M_Stop_Archiv ist - wann ändert diese Variable ihren Zustand - also : wo wird die beeinflusst und wie ?

Gruß
Larry
 
Hallo Larry

Die Variable „M_Stopp_Archiv“ wird von einem Button im HMI gesetzt (manuell) und kann über einen zweiten Button ebenfalls im HMI manuell auch wieder zurückgesetzt werden. Falls das Manuelle Rücksetzen aber vergessen wird, soll nach einer Bestimmten Zeit die durch das setzen gestartet wird die Variable automatisch zurückgesetzt werden. Die Funktionalität ist umgesetzt und erfolgreich getestet.

SPS-1.pngSPS-2.pngSPS-3.pngSPS-4.png

Warum das Script aber immer aufgerufen wird auch wenn sich der Wert für M_Stopp_Archiv nicht ändert und die IF-Auswertung immer ins ELSE gehen erklärt sich mir unteranderem nicht.

VG Uli
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum das Script den ELSE-Zweig bearbeitet ist (mir) schon klar - warum das Script allerdings überhaupt mehrfach aufgerufen wird ist mir nicht klar.
Schau dir doch noch einmal den Querverweis zu dem Script an ...

Aber eine Frage noch : woher weißt du, dass immer der ELSE-Zweig abgearbeitet wird ?

Gruß
Larry
 
Ich hatte im Script auch mal einen Aufruf
Code:
    ActivateScreen "BG 06,0
drin der immer wieder ausgeführt wurde. Da ich hier keinen Debugger habe helfe ich mir so meist weiter. So habe ich erste entdeckt, dass das Script überhaupt aufgerufen wird und dann immer im Else-Zweig landet. In die anderen bin ich noch nicht gekommen.

Habe jetzt gerade wieder zum Test den Code eingebaut und dasselbe Ergebnis erhalten. Das Script wird permanent aufgerufen und geht immer in den Else-Zweig.

Ich zerlege jetzt mal die IF-Anweisung in zwei einzelne.

VG Uli

PS: Querverweis. Es scheint nur einen zu geben was nach der Logik auch OK ist. Kann das mit der Definition als HMI bzw. PLC-Variable etwas zu tun haben? M_Stopp_Archiv_Old würde ja als HMI-Variable reichen. Habe es jetzt aber noch mit eine PLC-Variable verbunden.

SPS-5.jpg

PSS: Ich gehe auch gerne von dem Script weg wenn es einen besseren Weg gibt.
 
Hallo,
für M_Stop_Archiv_Old ist eine HMI-Variable vollkommen ausreichend, da sie ja "nur" eine Art Flankenmerker darstellt und keine Aktion an sie geknüpft ist.
Allerdings fällt mir auf, dass du genau an dieser Variablen tatsächlich auch wieder ein Script dran hast (dein Beitrag #11 - das 4.Bild). Vielleicht schaust du da mal.
Das Aufsplitten der IF-Abfrage ist jedenfalls Unsinn (kannst du machen - bringt aber nichts). Der Fehler muß irgendwo in der sonstigen Verwendung der M_Stop_Archiv-Variablen liegen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein im Beitrag #11 Bild 4 ist doch M_Stopp_Archiv in der Liste gewählt. An M_Stopp_Archiv_OLD hängt kein Script mit dran. Im Beitrag #13 das Bild zeigt ja die Querverweise vom/zum Script.

Mal was schnelle dazwischen: S_SEVERZ, hat das im TIA eine andere Bezeichnung? ICh finde den Timer bei mir nicht.

Danke für deine Mühen
Uli
 
OK ... hast Recht ... da hatte ich falsch geschaut - sorry.

Trotzdem noch etwas dazu :
Was macht Script1_Archiv ?
Was macht Script2_Break_Archiv ?
Warum stoppst du das Archiv beim Tasten-loslassen (auch) und nicht nur im Script ?
 
Script1_Archiv wird ausgelöst durch den Button "Störarchiv sichern" (#13 Bild 2) und wird Verwendet um das Archiv zu Kopieren. Hintergrund ist, dass Ende des Monats eine Auswertung der Fehler erfolgen soll. Dazu benötige ich eine Kopie des Archives die ich über die Taste Anlegen kann. Hat also keine Verbindung zum Script2_Break_Archiv.

Code:
StopLogging hmiAlarmLog, "STQ_Archiv"
CloseAllLogs
ArchiveLogFile hmiAlarmLog, "STQ_Archiv", "\Storage Card MMC\", hmiCopy
OpenAllLogs
StartLogging hmiAlarmLog, "STQ_Archiv"


Script2_Break_Archiv ist der Code den ich bis jetzt geschrieben habe.

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
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
End If

SetTag M_Stopp_Archiv_Old,M_Stopp_Archiv

Hier jetzt in der getrennten Version wobei mir die alte auch besser gefällt. Ich lasse diese jtzt mal durchlaufen. Bringt aber keine Änderung wenn das Script permanent aufgerufen wird.
Warum stoppst du das Archiv beim Tasten-loslassen (auch) und nicht nur im Script ?
Ist ein altes Fragment. Da hatte ich noch die Hoffnung auf eine Lösung ohne Script. Habe ich jetzt entfernt.
 
Code:
Verwendung in der Funktionsliste
SetzeVariable (Variable, Wert)

Verwendung in benutzerdefinierten Funktionen
SetTag (Tag, Value)

Verwendbar, sofern das projektierte Gerät benutzerdefinierte Funktionen unterstützt. Weitere Informationen finden Sie unter "Geräteabhängigkeit".

Parameter

Variable

Die Variable, welcher der angegebene Wert zugewiesen wird.

Wert

Der Wert, welcher der angegebenen Variablen zugewiesen wird.

Hinweis
Die Systemfunktion "SetzeVariable" wird nur nach Aufbau einer Verbindung ausgeführt.

Welche Verbindung auch immer gemeint ist. Also ich denke schon das es stimmt. Kann es aber auch einfach mal drehen. Gleich drunter findet sich ein Beispiel
Code:
{

BOOL ok;

BOOL bvalue;


//Set the tag to true

ok = SetTag("gs_tag_bit", TRUE);

//error handling

if(ok)

{

// succeeded

printf ( "Function has run through.\r\n" );

bvalue = GetTagBit("gs_tag_bit");

printf ("Value of gs_tag_bit: %d\r\n", bvalue);

}

else

{

// failed

printf ( "Error - function failed." );

}

...

}

Der gespeicherte Rückgabewert kann im nachfolgenden Code verarbeitet werden.

Das geht ja gleich mal gar nicht. SetTag hat nach Anzeige im TIA keinen Rückgebewert wie es im Beispiel (TIA-Hilfe) angegeben ist.

Ich gehe erstmal ins Wochenenden. Würde mich über weiter Hilfe kommende Woche freuen.

VG Uli
 
klar ... wir können hier weitermachen - ich muss dir aber gestehen, dass ich im Augenblick nicht mehr so ganz viele Ideen habe.

Naja - außer Eines :
Bau dir mehere HMI-Variablen, die du in das Script mit einbaust und denen du Texte zuweist, die dann auf der Bildschirmseite angezeigt werden können. Das ist so eine Art Pseudo-Debugging - hilft aber vielleicht ...

Gruß
Larry
 
Zurück
Oben