Programmierung Störmeldeverzögerung

homei

Level-1
Beiträge
100
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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...
 
Zuletzt bearbeitet:
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
 
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:

Code:
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:

Code:
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 ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei mir geht das im Minimum so:

Code:
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.
 
Zuletzt bearbeitet:
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
 
Oder kürzer und more siemenslike, da die Schablone sowieso kommt:
Code:
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:=
 
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 ...

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 ...
 
Zuletzt bearbeitet:
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 ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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
 

Anhänge

  • St_meld.zip
    39,8 KB · Aufrufe: 56
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...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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:
 
Zurück
Oben