# Programmierung Störmeldeverzögerung



## homei (27 Februar 2008)

Hallo,

ich habe das Problem, dass ich über 200 Störmeldungen zeitverzögert programmieren muss. Nach dem Auftreten der Sörung soll 2 Sekunden später eine Meldung für diese Störung erfolgen. Nach weiteren 120 Sekunden dann eine entsprechende Anlagenreaktion ausgelöst werden.
Wäre alles kein Problem, wenn ich genügend Timer hätte. 

Hat jemand eine Idee, wie man soetwas timersparend programmieren kann bzw. ob man irgendwelche Systemfunktionen nutzen kann.

(verwendete Hardware CPU314)

MfG
homei


----------



## Ludewig (27 Februar 2008)

IEC-TON verwenden!
Störmelde-FB einmal programmieren und zweihundertmal parametrieren. Zeitverzögerungen ebenfalls als Parameter anlegen, dann kann man im übergeordneten Baustein alle Zeiten individualisieren.

Warum einfach, wenn...


----------



## dtsclipper (27 Februar 2008)

Möglich wäre es vielleicht auch im HMI die Anzeige zu verzögern über die Abtastrate, aber das würde auch das Quittieren verzögern...


----------



## homei (27 Februar 2008)

Ludewig schrieb:


> IEC-TON verwenden!
> Störmelde-FB einmal programmieren und zweihundertmal parametrieren. Zeitverzögerungen ebenfalls als Parameter anlegen, dann kann man im übergeordneten Baustein alle Zeiten individualisieren.
> 
> Warum einfach, wenn...


 
Hallo Ludewig,

vielen Dank für Deine Info.

Nur habe ich noch nie einen FB programmiert und weiss überhaupt nicht , wie das gehen soll. Im FB müßten dann wahrscheinlich die beiden Timer Programmiert werden und im zugehörigen Datenbaustein die Adressen der Störmelde-Bit's. Nur ist es dann auch gewährleistet, dass für jeden Parameter der Zähler neu gestartet werden kann und die korrekte Zeit liefert, wenn Störungen kurzzeitig hinter einander auftreten. 

MfG
homei


----------



## vierlagig (27 Februar 2008)

mal eine Lösung von mir, die noch angepasst werden sollte ... also nur ein Gedankenanstoß, günstig ist die Verwendung des CPU-Takts Mx.5 ... 

habe einen multiinstanzfähigen FB:


```
FUNCTION_BLOCK "alarm"
TITLE =
VERSION : 0.1

VAR_INPUT
  cpu_takt : BOOL ;    
  meldung : BOOL ;    
  quittierung : BOOL ;    
  meldungs_delay : INT ;    
  reaktions_delay : INT ;    
END_VAR
VAR_OUTPUT
  meldung_verzoegert : BOOL ;    
  reaktion_verzoegert : BOOL ;    
END_VAR
VAR
  delay : INT ;
  error : BOOL ;    
  help_flag : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =

      UN    #meldung; //alarm meldung ist mit 1=OK
      R     #error;

      UN    #error; 
      U     #cpu_takt; 
      FP    #help_flag; 
      SPBN  _001; 
      L     #delay; 
      L     1; 
      +I    ; 
      T     #delay; 

_001: U     #meldung; 
      U     #quittierung; 
      SPBN  _002; 
      L     0; 
      T     #delay; 
      S     #meldung_verzoegert; //alarm meldung ist mit 1=OK
      S     #reaktion_verzoegert; //alarm reaktion ist mit 1=OK
      S     #error;

_002: L     #delay; 
      L     #meldungs_delay; 
      >=I   ; 
      R     #meldung_verzoegert; 

      L     #delay; 
      L     #reaktions_delay; 
      >=I   ; 
      R     #reaktion_verzoegert; 


END_FUNCTION_BLOCK
```


...diesen FB kann ich nun in einem anderen FB zum beispiel 200 mal aufrufen und die entsprechenden Instanzen in der STAT-deklaration dieses FB definieren ... sieht dann so aus:


```
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1


VAR
  meldung_1 : "alarm";    
  meldung_2 : "alarm";    
  meldung_3 : "alarm";    
  meldung_4 : "alarm";    
  meldung_5 : "alarm";    
  meldung_6 : "alarm";    
END_VAR
BEGIN
NETWORK
TITLE =

      CALL #meldung_1 (
           cpu_takt                 := M      2.5,
           meldung                  := E      0.0,
           quittierung              := E      1.0,
           meldungs_delay           := 2,
           reaktions_delay          := 120,
           meldung_verzoegert       := M      0.0,
           reaktion_verzoegert      := M      0.1);
      NOP   0; 
NETWORK
TITLE =

      CALL #meldung_2 (
           cpu_takt                 := M      2.5,
           meldung                  := E      0.1,
           quittierung              := E      1.0,
           meldungs_delay           := 2,
           reaktions_delay          := 120,
           meldung_verzoegert       := M      0.2,
           reaktion_verzoegert      := M      0.3);
      NOP   0; 
END_FUNCTION_BLOCK
```

habe fertig ... und dazu einen Instanz-DB für alle Störmeldungen ...


----------



## Ludewig (27 Februar 2008)

Bei mir geht das im Minimum so:


```
VAR_INPUT
  Fehler : BOOL ;    
  Meldezeit : TIME ;    
  Reaktionszeit : TIME ;      
END_VAR
VAR_OUTPUT
  Fehlermeldung : BOOL ;    
  Reaktion : BOOL ;    
END_VAR
VAR
  Meldetimer : TON ;
  Reaktionstimer : TON ;      
END_VAR


U     #Fehler
=     #Meldetimer.IN
=     #Reaktionstimer.IN
L     #Meldezeit
T     #Meldetimer.PT
L     #Reaktionszeit
T     #Reaktionstimer.PT

CALL  #Meldetimer
IN:=
PT:=
Q :=
ET:=

CALL  #Reaktionstimer
IN:=
PT:=
Q :=
ET:=           

U     #Meldetimer.Q
=     #Fehlermeldung

U     #Reaktionstimer.Q
=     #Reaktion
```

Das Instanzieren wurde weiter oben schon beschrieben. Über die Frage, ob die SPS das gebacken kregt, mache ich mir als IEC-Programmierer normalerweise keine Gedanken, sondern wechsle die CPU.


----------



## homei (27 Februar 2008)

Hallo Vierlagig, Hallo Ludewig,

vielen Dank für Eure Mühe. Es sieht sehr interessant aus. Ich muss mich da aber als Anfänger noch richtig reinversetzen. Wie das mit dem Instanzieren geht ist mir noch nich klar. 
Kann ich Eure Beispiele irgendwie einlesen oder muss ich das abschreiben?
Wo können denn die CPU-Probleme liegen bei dieser Programierart? Ich vermute, das die Zykluszeit nicht reicht!?

nebenbei: Was ist denn ein IEC-Programmierer? 

MfG 
homei


----------



## Ludewig (27 Februar 2008)

Oder kürzer und more siemenslike, da die Schablone sowieso kommt:

```
VAR_INPUT
  Fehler : BOOL ;    
  Meldezeit : TIME ;    
  Reaktionszeit : TIME ;      
END_VAR
VAR_OUTPUT
  Fehlermeldung : BOOL ;    
  Reaktion : BOOL ;    
END_VAR
VAR
  Meldetimer : TON ;
  Reaktionstimer : TON ;      
END_VAR

CALL  #Meldetimer
IN:= #Fehler
PT:= #Meldezeit
Q := #Fehlermeldung
ET:=
CALL  #Reaktionstimer
IN:= #Fehler
PT:= #Reaktionszeit
Q := #Reaktion
ET:=
```


----------



## Ludewig (27 Februar 2008)

IEC 61131-3: Ich habe 10 Jahre Möller mit Sucosoft programmiert und neuerdings mit Codesys.


Mit welcher Software arbeitest du denn?


----------



## vierlagig (27 Februar 2008)

homei schrieb:


> Wie das mit dem Instanzieren geht ist mir noch nich klar.



ok, den Anfang macht der FB, der benötigt eine Instanz, bei einem einfachen Aufruf ist dies ein eindeutig zugeordneter Instanz-Datenbaustein. Dieser ist nötig um die Daten zu halten. Bei einer Multiinstanz werden die einzelnen Instanz-Datenbausteine quasi hintereinander in einen einzigen Instanz-Datenbaustein, den des aufrufenden FB, gepackt ... so sparst du dir 200 199 Datenbausteine ...



homei schrieb:


> Kann ich Eure Beispiele irgendwie einlesen oder muss ich das abschreiben?



unter STEP7:

im Ordner Quellen eine neue AWL-Quelle anlegen, Quellcode per copy-paste einfügen, speichern und übersetzen ...


----------



## Frank (27 Februar 2008)

vierlagig schrieb:


> ok, den Anfang macht der FB, der benötigt eine Instanz, bei einem einfachen Aufruf ist dies ein eindeutig zugeordneter Instanz-Datenbaustein. Dieser ist nötig um die Daten zu halten. Bei einer Multiinstanz werden die einzelnen Instanz-Datenbausteine quasi hintereinander in einen einzigen Instanz-Datenbaustein, den des aufrufenden FB, gepackt ... so sparst du dir 200 199 Datenbausteine ...


 
man sollte dabei auf keinen fall etwas reserve vergessen, sonst gibt es einen ziemlichen aufstand beim einpflegen einer neuen meldung


----------



## homei (27 Februar 2008)

Ludewig schrieb:


> IEC 61131-3: Ich habe 10 Jahre Möller mit Sucosoft programmiert und neuerdings mit Codesys.
> 
> 
> Mit welcher Software arbeitest du denn?


 
Bisher mit keiner, habe jetzt mit Step7 angefangen und quäle mich, wie Du ja siehst mit den Grundlagen (natürlich unter Zeitdruck). Ist schwer wenn man Motorrad fahren soll und nicht mal Fahrrad kann.


----------



## vierlagig (27 Februar 2008)

homei schrieb:


> Bisher mit keiner, habe jetzt mit Step7 angefangen und quäle mich, wie Du ja siehst mit den Grundlagen (natürlich unter Zeitdruck). Ist schwer wenn man Motorrad fahren soll und nicht mal Fahrrad kann.



ja, wo hakt es denn jetz genau noch?


----------



## Kai (27 Februar 2008)

Zu dem Thema Multiinstanz gibt es eine schöne Siemens-FAQ:

Wie können Multiinstanzen erstellt und aktualisiert werden?

Gruß Kai


----------



## Frank (27 Februar 2008)

aber den instanz-db musst du dann trotz der aktualisierung zur cpu downloaden und da hakt es ja meistens...    oder wie oft könnt ihr eure anlagen für eine programmänderung anhalten?


----------



## Sven_HH (27 Februar 2008)

Hallo zusammen...

Da ich auch noch relativ unerfahren bin und zum Thema Multiinstanz keine Vorkenntnisse besitze, habe ich mal ein Projekt zum Thema erstellt.

Bitte euch um ein Feedback dazu... was könnte ich noch verbessern oder vereinfachen... ich habe den FB1 in FUP erstellt, weil es damit für Anfänger leichter verständlich ist.

Gruß
Sven


----------



## vierlagig (28 Februar 2008)

Sven_HH schrieb:


> Bitte euch um ein Feedback dazu... was könnte ich noch verbessern oder vereinfachen... ich habe den FB1 in FUP erstellt, weil es damit für Anfänger leichter verständlich ist.



FEEDBACK:
wenn ich es nicht besser wüßte, würd ich glatt denken, dass is von mir ... aber ich machs ja nicht in FUP ... was mir bißchen unangenehm aufgestoßen ist: DA FEHLEN ÜBERALL KOMMENTARE! ... ansonsten sollte es so funktionieren ... nicht die von Frank ins spiel gebrachte reserve vergessen und ab geht er ... btw: ich nummeriere meine bausteine immer so: 1-xxx hauptfunktionen, xxx-ende vorrat werkzeuge, aber das ist sicher nur ne stilfrage...


----------



## homei (28 Februar 2008)

vierlagig schrieb:


> ja, wo hakt es denn jetz genau noch?


 
Ja, dass weiss ich leider auch nicht immer so genau. Ich blicke z. T. noch so wenig durch, dass ich nicht mal Fragen stellen kann. Da kommt mir das Beispielprojekt von Sven HH (nochmals danke!) sehr gelegen. Das werde ich mal am Wochenende versuchen zu verstehen (leider keine Komentare vorhanden). Und vielleicht hilft mir auch der Link von Kai einen Durchblick bezüglich der notwendigen DB's zu erlangen. Ich glaube für mich ist es im Moment sehr effektiv, wenn ich fertige Beispiele habe und diese nachvollziehe. Dann merke ich sicherlich, wo es hakt. 
Aber vielen Dank nochmals für die bisherige Hilfe.

MfG
homei


----------



## eric-c (28 Februar 2008)

Sven_HH schrieb:


> Bitte euch um ein Feedback dazu... was könnte ich noch verbessern oder vereinfachen... ich habe den FB1 in FUP erstellt, weil es damit für Anfänger leichter verständlich ist.


 
Ich hatte zwar noch keine Zeit mir das anzusehen aber schau dir das mal an

Anhang anzeigen Zeiten.zip


----------



## vierlagig (28 Februar 2008)

eric-c schrieb:


> Ich hatte zwar noch keine Zeit mir das anzusehen aber schau dir das mal an



ja, nee, is klar biene, jetzt mal abgesehen davon, dass es für homei wohl nicht wirklich nach zu vollziehen ist - NOCH NICHT - finde ich die sache mit dem M1.0 in dem eigentlich "bibliotheksfähig sein könnte" baustein wirklich böse ... ja, es steht im kommentar, aber wozu soll man sich solche potentiellen fehlerquellen einbauen? :sm12:


----------



## eric-c (28 Februar 2008)

vierlagig schrieb:


> ja, nee, is klar biene, jetzt mal abgesehen davon, dass es für homei wohl nicht wirklich nach zu vollziehen ist - NOCH NICHT -


 
Ich weis das er ihn jetzt noch nicht versteht aber den kann er verwenden.



vierlagig schrieb:


> finde ich die sache mit dem M1.0 in dem eigentlich "bibliotheksfähig sein könnte" baustein wirklich böse ... ja, es steht im kommentar, aber wozu soll man sich solche potentiellen fehlerquellen einbauen?


 
Naja übertreibst du nicht ein wenig wie du ja sagtest ich hab doch alles beschrieben und selbst ein kompletter Neueinsteiger sieht das, ich habs schon mal mit einem Lehrling getestet. sogar der hats, ohne meine hilfe, geschafft die Zeiten zu verwenden und der war auch erst im 2. Lehrjahr



vierlagig schrieb:


> "bibliotheksfähig sein könnte"


 
Danke


----------



## vierlagig (28 Februar 2008)

eric-c schrieb:


> Ich weis das er ihn jetzt noch nicht versteht aber den kann er verwenden.



jo, jeder kann sich sein eigenes programm zusammenpuzzeln wie er mag, verstehen muß man es ja nicht  



eric-c schrieb:


> Naja übertreibst du nicht ein wenig wie du ja sagtest ich hab doch alles beschrieben und selbst ein kompletter Neueinsteiger sieht das, ich habs schon mal mit einem Lehrling getestet. sogar der hats, ohne meine hilfe, geschafft die Zeiten zu verwenden und der war auch erst im 2. Lehrjahr


 
man sollte bei bibliotheks-bausteinen immer mit dem *DAU* rechnen! und nein, ich finde nicht, dass ich übertreibe...


----------



## eric-c (28 Februar 2008)

vierlagig schrieb:


> jo, jeder kann sich sein eigenes programm zusammenpuzzeln wie er mag, verstehen muß man es ja nicht


 
ich weis nicht wie das bei dir war aber ich hab am anfang bausteine erhalten von denen ich nur die Funktion kannte und hab mich da erst später eingearbeitet. Zeitdruck...


----------



## vierlagig (28 Februar 2008)

eric-c schrieb:


> ich weis nicht wie das bei dir war aber ich hab am anfang bausteine erhalten von denen ich nur die Funktion kannte und hab mich da erst später eingearbeitet. Zeitdruck...



OFFTOPIC!!! ... aber kurz dazu: zeitdruck sollte nicht daran hindern wenigstens rudimentär eine idee von der funktionsweise zu haben ...

habe deinen baustein gerade getestet und festgestellt, dass ein flatterndes "meldungssignal" nicht registriert wird...ist das so gewollt? 

[edit]huch, du brauchst ja zwei aufrufe um verzögerte meldung UND verzögerte reaktion zu realisieren [/edit]


----------



## homei (28 Februar 2008)

Hallo,

ich hab mir in der Mittagspause das Beispiel von Sven_HH angesehen und glaube es begriffen zu habe. Dazu aber noch ein paar Fragen. 

1. Sehe ich das richtig, das der DB2 und DB3 nicht zwingend notwendig. Man konnte sicherlich die Meldungen vom DB2 direkt Ausgängen bzw. Merkern zuweisen und statt des DB1 direkt Eingänge festlegen. Oder ist das falsch?

2. Wie erzeuge ich den Distanzbaustein und die Daten darin. Erstellt bzw. generiert der sich automatisch?

3. Könnte ich z. B. den FB2 als parametrierten Baustein erstellen (so wie FB1) mit 30 Meldungen und diesen dann über einen FB3 aufrufen. Ich habe nämlich mindestens 6 baugleiche Anlagen mit über 30 Meldungen?

Das Programm von Eric_c scheint mir auf den ersten Blick sehr kompliziert und vierlagig hat recht. Aber sobald es die Zeit erlaubt, möchte ich das auch gern verstehen.

Vielen Dank für Eure freundliche Hilfe

MfG
homei


----------



## eric-c (28 Februar 2008)

Homei 



> Das Programm von Eric_c scheint mir auf den ersten Blick sehr kompliziert


 
Ich weis das mein Programm kompliziert ist aber du kannst es sicher nach einiger Zeit verstehen vielleicht sogar verbessern. Schau mer mal



Vierlagig 



> festgestellt, dass ein flatterndes "meldungssignal" nicht registriert wird


 
Ich hab das programm (SV) in der Not geschrieben es hat damals gereicht und seitdem hab ichs nicht mehr angerührt ich habs aber noch bei meinen Standards dabei für den Fall, wenn ich es mal brauche dann werd ich es vielleicht überarbeiten


----------



## vierlagig (28 Februar 2008)

homei schrieb:


> 1. Sehe ich das richtig, das der DB2 und DB3 nicht zwingend notwendig. Man konnte sicherlich die Meldungen vom DB2 direkt Ausgängen bzw. Merkern zuweisen und statt des DB1 direkt Eingänge festlegen. Oder ist das falsch?



ja, kannst du auch direkt machen



homei schrieb:


> 2. Wie erzeuge ich den *In*stanzbaustein und die Daten darin. Erstellt bzw. generiert der sich automatisch?



einen einfachen Instanz-DB erzeugst du direkt beim aufruf mit. einfach mal probieren, in FUP bietet sich das an ... oben die drei fragezeichen mit z.B. DB4 überschreiben, enter ... und generieren lassen.
multiinstanz ist ein wenig komplizierter. in dem baustein in dem du mehrere FB aufrufen möchtest, mußt du in der variablendeklaration im bereich STAT variablen vom Typ FB <Nr> anlegen wobei Nr. dann der des aufzurufenden bausteinsentspricht. der baustein aufruf funktioniert dann über die oben definierte variable. der entspechende DB wird dann generiert, wenn du den FB, der die anderen enthält, aufruft und geht so von statten, wie beim einfachen aufruf...



homei schrieb:


> 3. Könnte ich z. B. den FB2 als parametrierten Baustein erstellen (so wie FB1) mit 30 Meldungen und diesen dann über einen FB3 aufrufen. Ich habe nämlich mindestens 6 baugleiche Anlagen mit über 30 Meldungen?



die multiinstanz in der multiinstanz ... du traust dir einiges zu  ... unter uns: es geht


----------



## homei (28 Februar 2008)

Hallo vierlagig,

ich dabke Dir!!!

Kurz und doch sehr verständlich erklärt. Sowas ist Spitze.
Spätestens morgen probiere ich alle aus.


MfG
homei


----------



## Sven_HH (28 Februar 2008)

Hallo zusammen



vierlagig schrieb:


> wenn ich es nicht besser wüßte, würd ich glatt denken, dass is von mir ...


 
OK, ich gebe zu das ich deine Anregungen verarbeitet habe, aber dadurch habe ich verstanden wie man eine Multiinstanz aufbaut.



vierlagig schrieb:


> DA FEHLEN ÜBERALL KOMMENTARE!


 
Du hast recht... werde in Zukunft mehr darauf achten.



			
				eric-c schrieb:
			
		

> Ich weis das mein Programm kompliziert ist aber du kannst es sicher nach einiger Zeit verstehen vielleicht sogar verbessern


 
Da stimme ich Dir zu  


@ homie
Deine Fragen zu meinem Projekt wurden Dir Ja schon von *vierlagig* erläutert. Wobei sich multiinstanz in der multiinstanz verlockend anhört... 

Gruß und Danke
Sven


----------



## vierlagig (28 Februar 2008)

Sven_HH schrieb:


> Wobei sich multiinstanz in der multiinstanz verlockend anhört...



...damit sollte man aber wirklich sehr vorsichtig umgehen ... aber schön isses schon  ... im IDB würde dann z.b. stehen anlage1.meldung12.störung ...


----------



## Kai (29 Februar 2008)

homei schrieb:


> Könnte ich z. B. den FB2 als parametrierten Baustein erstellen (so wie FB1) mit 30 Meldungen und diesen dann über einen FB3 aufrufen. Ich habe nämlich mindestens 6 baugleiche Anlagen mit über 30 Meldungen?


 
Hier ist mal ein kurzes Programmbeispiel für 2 Anlagen mit jeweils 2 Störungsmeldungen.

Gruß Kai


----------



## vierlagig (29 Februar 2008)

hätte mich auch gewundert, wenn kai da nix zu beispielen würde *ROFL*


----------



## homei (29 Februar 2008)

Kai schrieb:


> Hier ist mal ein kurzes Programmbeispiel für 2 Anlagen mit jeweils 2 Störungsmeldungen.
> 
> Gruß Kai


 
Hallo Kai,

vielen Dank für das Beispiel. Das wirkt auf mich wie das Hohe C. 

MfG
homei


----------

