Step 7 Programmcide optimieren

hubert

Level-2
Beiträge
411
Reaktionspunkte
26
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

habe mal eine frage an die Profis unter euch. Habe mir einen Baustein geschrieben, mit dem man die Quittierbits, welche bei WinCC flexible (Quittierbits lesend) und bei WinCC bei jeder Störmeldung gesetzt werden, wenn diese Quittiert wird. Also mit der ACK Taste. Wir haben einen Kunden, der möchte die Einzelquttierung dieser Systeme nutzte. Nun ist es mit bei der letzten Anlage immer wieder vorgekommen, das diese Quittiertbit gesetzt wurde und auch das Triggerbit für die jeweilige Störmeldung abgelöscht hat, aber wenn man z.B. beim wieder einsichern des Motorschutzes oder der Sicherung einen kleinen Wackelkontakte hatte. Also der Eingang nochmal ganz kurz von high auf low ging, so bekamm es das Bediengerät nicht mehr mit das die Störmeldung erneut gekommen ist. Ich könnte also das Quittierbit nicht mehr setzte. Musste also das Störmeldebit händisch zurücksetzte. Habe hier auch mal mti dem Support von Siemens gesprochen, sie rieten mir, dass ich diese Quittierbit verzögert rücksetzten soll. Also so 1 bis 2 Sekunden, nachdem das Störbit (Triggerbit für die Störung) gegangen ist. Sie konnten mir allerdings keinen Vorschlag leifern, wie dies bei ca 1000 Störmeldung am einfachsten zu realisieren ist. Nun hab ich mich mal selbst ans Werk gemacht und mir einen Baustein dafür geschrieben, der jedes einzelnen Quittierbit verzögert zurücksetzt, wenn das jeweilige Triggerbit nicht mehr vorhanden ist. Das funktioniert auch soweit ganz gut. Nur bin ich mit der Zykluszeit dieses Bauusteines nicht ganz zu frienden. Momentan braucht der Baustein für 1120 Störmeldebit ca. 7-11ms auf einer neuer 315 PN/ DP V3.2. Das ist mir noch zu Langsam. Habe alledings schon optimiert, wo ich konnte. Nun meine Frage an euch Profis. Schaut auch diesen Baustein mal an. Vielleicht seht ihr noch Optimierungsbedarf oder seht Dingen, die man anders schreiben muss um Zykluszeit zu sparen.
Danke schon mal an Euere Hilfe.
 

Anhänge

Hallo Hubert,

ich kann und will mich zu später Stunde nicht in deinen Code reindenken. Ich kann dir jedoch verraten, wie es funktioniert, auch bei deinem Problem mit dem Wackler.

Folgender SCL-Schnippsel zeigt, wie ich die Störmeldungen quittiere. Wichtig ist daß die Quittierbits im Programm zurück gesetzt werden, wenn eines der Quittierbits vorher gesetzt war und wenn die Störung beseitigt ist. Dann ist quasi alles im Urzustand. Man hat dann auch alle Meldezustands-Kombinationen in Flexible.

Code:
//*** Störung "SPEICHERND" und Quittierbits zurücksetzen
IF ((STOERMELDE_DB.DX[ByteIndex+32, BitIndex] AND NOT QUITT_TAKT) OR STOERMELDE_DB.DX[ByteIndex+64, BitIndex]) AND NOT SM_INTERN THEN
   STOERMELDE_DB.DX[ByteIndex+32, BitIndex] := FALSE;
   STOERMELDE_DB.DX[ByteIndex+64, BitIndex] := FALSE;
   STOERMELDE_DB.DX[ByteIndexNormal+96, BitIndex] := FALSE;
END_IF;

- ab Adresse 32 stehen die QBits "SCHREIBEN"
- ab Adresse 64 stehen die QBits "LESEN"
- ab Adresse 96 stehen die gespeicherten Meldungen
- QUITT_TAKT ist der Quittiertaster über Hardware
- SM_INTERN ist das Meldeereignis, z.Bsp. ein Motorschutzschalter

Du mußt also nur beim Quittieren die Quittierbits zurück setzen. Und natürlich erst dann, wenn ein Quittierbit gesetzt ist und wenn die Störungsursache behoben ist.

Die freundlichen Mitarbeiter vom Support lernen das vielleicht auch noch irgendwann :sc5: .

Damit funktioniert übrigens auch die Meldegruppen-Quittierung korrekt.


Gruß, Onkel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Onkel,

genauso hab ich es ja vorher auch gemacht. Nur hatte ich das Problem.
Sicherung löst aus. Es wird das entsprechnede Triggerbit in der SPS gesetzt und am HMI Taucht die Meldung auf.
Nun wird die mit Hilfe der Einzelquittierung die Meldung als gesehen quittiert und gleichzeitig wird das entsprechende Quittierbit gesetzt. Sicherung hat noch immer ausgelöst. Es wird also das Triggerbit Störung zurückgesetzt. Allerdings bleibt durch das Vorrangige Setzten die Störung weiter anstehend. Nun wird die Sicherung wieder eingelegt und hier gibt sich z.B. beim einlegen der Kleine Wackel. Des Hilfkontakt melden an die SPS für z.B. 200ms OK und geht dann für ein oder mehr SPS Zyklen wieder weg bevor wer wieder OK meldet. Das Triggerbit wird kurz zurückgesetzt und gleich wieder gesetzt. Allerdings bekommt das HMI dieses kommen Ereignis die Störmeldung nicht mehr mit. Du das Zurücksetzten der Störmeldung nach OK wird auch das Triggerbit abgelöscht. Und hier liegt der Hund begraben. Darum hab ich mir das mit der Verzögerung ausgedacht. Das Eigenartige ist, die Anlagenbetreiber bekommen das ja nicht immer hin. Nur ab und zu.
Ich habe dann als Notlösung einen Sammelquittiertaster eingepflegt, wo alle Quittierbit mal gesetzt werden. So hab ich garnantiert, das alle behoben Störungen behoben sind.
Habe mir deinen Code auch schon angeschaut nicht schlecht. Aber ich Versuche es wenn es möglich ist solche Dinge Zentral zu machen. Könntest du dir vlt. nicht meinen Baustein anschauen. Vlt. findest du noch was, was man noch verbesser könnte.
 
Hallo Hubert,

.. Nun wird die mit Hilfe der Einzelquittierung die Meldung als gesehen quittiert und gleichzeitig wird das entsprechende Quittierbit gesetzt...
So weit ok, das macht Flexible.

.. Sicherung hat noch immer ausgelöst. Es wird also das Triggerbit Störung zurückgesetzt...
Nein, das Triggerbit (gespeicherte Meldung) darf erst zurück gesetzt werden, wenn die Sicherung wieder drinn ist.

.. Allerdings bleibt durch das Vorrangige Setzten die Störung weiter anstehend...
Nur zum Verständnis, das Setzen muß im Programmablauf vor dem Rücksetzen erfolgen! Schon irgendwie "vorrangig", aber nicht wie allgemein von einem RS-Glied bekannt. Das Rücksetzen kommt im Programm nach dem Setzen, ist jedoch mit dem Setzen, bzw. mit dem Störungsereignis, verriegelt.


Gruß, Onkel
 
Zuletzt bearbeitet:
Hallo Onkel,

ja das ist schon soweit Richtig. Aber es ist doch so, wenn das Setzte nach dem Rücksetzten kommt, dann könnte ich mir zumindest das doppelschreiben der Störungsursache sparren. Was ich meine ist folgendes.
Code:
UN ST_MS // Trigger-Bit für die Störung ans Panel
R ST_MS_QBit // Quittierubgsbit vom Panel

U ST_MS_QBit // Quittierungsbit vom Panel
R ST_MS //  // Trigger-Bit für die Störung ans Panel


UN E_MS // Störungsursache
S ST_MS  // Trigger-Bit für die Störung ans Panel

Hier wird doch Sichergestellt, dass das Quittierbit vom Panel erst zurück gesetzt wird, wenn die Störungsursache behoben ist. Soll heißen, das Quittierbit vom Panel wird erst im nächsten SPS Zyklus abgelöscht.
Oder habe ich hier was falsche verstenden?
 
Ich mache das seit 100 Jahren so:


Code:
FUNCTION FC 110 : VOID
TITLE =Störmeldung

AUTHOR : Ralle
FAMILY : SYSTEM
NAME : STM_SYS
VERSION : 1.2


VAR_INPUT
  Stoermeldung : BOOL ;	
  Freigabe : BOOL ;	
  Ack : BOOL ;	//Quitt Fehler
END_VAR
VAR_IN_OUT
  Stoerbit : BOOL ;	
  Quittierbit_OP : BOOL ;	
  Quittierbit_SPS : BOOL ;	
END_VAR
BEGIN
NETWORK
TITLE =Funktion zum auswerten der Störungen

      UN    #Freigabe; 
      R     #Stoerbit; 
      R     #Quittierbit_OP; 
      R     #Quittierbit_SPS; 
      BEB   ; 
NETWORK
TITLE =Störung

      U(    ; 
      U(    ; 
      O     #Quittierbit_OP; 
      O     #Quittierbit_SPS; 
      )     ; 
      R     #Stoerbit; 
      U     #Stoermeldung; 
      S     #Stoerbit; 
      U     #Stoerbit; 
      )     ; 
      NOT   ; 
      UN    #Stoermeldung; 
      UN    #Quittierbit_SPS; 
      R     #Quittierbit_OP; 
NETWORK
TITLE =Ack

      O     #Ack; 
      O     ; 
      U     #Quittierbit_SPS; 
      U     #Stoerbit; 
      UN    #Stoerbit; 
      =     #Quittierbit_SPS; 
END_FUNCTION

Zumindest in Flexible gibt es damit keine Probleme, bei WinCC trage ich für die beiden Quittierbits,dzwei Mal die selbe Variable an.
Man kann zentral alles quittieren (Ack) oder die Fehlermeldung einzeln quittieren über das OP.
 
Zurück
Oben