Was sind denn IEC-Timer?!

MikeJ

Level-1
Beiträge
80
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Mahlzeit

ich bin hier im Forum nun schon des Öfteren über die "IEC-Timer" gestoßen. In der Siemens Doku kann ich aber über IEC im Allgemeinen nicht viel finden.
Was ist IEC, muss ich was kaufen um´s nutzen zu können?

...sorry, wenn´s für den ein oder andren vielleicht doof klingt, aber ich hab keine Ahnung :)

Wenn ich das richtig verstanden habe, kann ich es mir damit ersparen die "globalen" Timer zu verwenden?!


Viele Grüße
Mike
 
schau dir mal in der Standard Library unter System Function Blocks die Bausteine SFB3, SFB4 und SFB5 an, das sind die von dir gesuchten IEC-Timer. Sinnvoll einsetzen kannst du die IEC-Timer in multiistanzfähigen FBs. Ansonsten musst du jedem Timer einen Instanz-DB zuweisen.

Gruß Woldo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hmmm, ok, da wäre ich dann bei meinen nächsten Problem : Multiinstanz! Kann mir zwar was drunter vorstellen, hatte aber noch nie was damit zu tun.

Beispiel: Ich habe 2 identische Vorrichtungen mit pneumatischen Spannfunktionen usw.

Im Moment habe ich für jede der Vorrichtung eine FC erstellt (FC10 und FC11) mit exakt der gleichen Logig. Der Unterschied liegt lediglich im EA Bereich und in den Timern (FC10: EA 80...100 und Timer 40...49, FC11: EA 100...120 und Timer 50...59). Zusätzlich speichere ich bestimmte Informationen zu jeder Vorrichtung in einem DB (DB10 und DB11).

Da die Logig absolut gleich ist, würde ich das gerne in eine FC (oder nimmt man da lieber nen FB?!) packen und nur noch auf den EA-Bereich bzw. den zugehörigen DB verweisen. - Im Moment hindern mich die Timer an diesem Vorhaben.
Wenn ich das mit den IEC-Timern richtig verstehe müsste ich die 10 Timer dann aber nochmals in je einen eigenen FB packen oder?!

Gruß Mike
 
Hallo,
und das, was du da beschreibst kann man über Instanzen (unterschiedliche Zuständigkeiten) des gleichen FB's lösen.
Alle Daten, die du jetzt in deinem DB abspeicherst, verlagerst du dann in den Instanz-DB des FB. Die Variablen werden dann im STAT-Bereich des FB hinterlegt. Timer würdest du nicht mehr verwenden, sondern die genannten SFB's, denen du eben keinen neuen DB zuweist sondern einen Teil des DB's des aufrufenden FB's. Sie werden dann wie eine Variable im STAT-Bereich des FB deklariert.

Hilft dir das ?

Gruß
LL
 
das Beispiel ist super! Ich glaube, es verstanden zu haben.
Allerdings hänge ich grad an der EA-Sache.

Dem FB für die Vorrichtung übergebe ich dann einen Pointer auf den Beginn des EA-Bereichs. Also P#E80.0 bzw. P#100.0.

Wenn ich nun die Signale von EW80 und EW82 in den DB schreiben will - wie geht das?!

Im FB deklariere ich ein "IN-Signal" als Pointer (E_Bereich:=POINTER), beim Aufruf übergebe ich dann die Adresse E80.0. Aber wie bekomme ich jetzt die Signale (4 Bytes) in den DB (STAT-Bereich)?

Viele Grüße
Mike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beispiel: Ich habe 2 identische Vorrichtungen mit pneumatischen Spannfunktionen usw.

Im Moment habe ich für jede der Vorrichtung eine FC erstellt (FC10 und FC11) mit exakt der gleichen Logig. Der Unterschied liegt lediglich im EA Bereich und in den Timern (FC10: EA 80...100 und Timer 40...49, FC11: EA 100...120 und Timer 50...59). Zusätzlich speichere ich bestimmte Informationen zu jeder Vorrichtung in einem DB (DB10 und DB11).

Da die Logig absolut gleich ist, würde ich das gerne in eine FC (oder nimmt man da lieber nen FB?!) packen und nur noch auf den EA-Bereich bzw. den zugehörigen DB verweisen. - Im Moment hindern mich die Timer an diesem Vorhaben.

Beim Aufruf eines FC oder FB kannst Du die Nummer der Zeitfunktion sowie die Länge der Zeitdauer als Parameter übergeben.

Du musst also nicht unbedingt mit IEC-Timern und mit Multiinstanzen arbeiten.

Code:
ORGANIZATION_BLOCK OB 1
TITLE =Hauptprogramm
//16
AUTHOR : Kai
FAMILY : SPSForum
NAME : Zeitfunk
VERSION : 1.0
 
VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =Zeitfunktionen 1
 
      U     E     10.0; 
      =     L     20.0; 
      BLD   103; 
      U     E     10.1; 
      =     L     20.1; 
      BLD   103; 
      CALL FC   100 (
           Eingang_1                := L     20.0,
           Zeitfunktion_1           := T     10,
           Zeitdauer_1              := S5T#10S,
           Eingang_2                := L     20.1,
           Zeitfunktion_2           := T     11,
           Zeitdauer_2              := S5T#15S,
           Ausgang_1                := A     10.0,
           Ausgang_2                := A     10.1);
      NOP   0; 
 
NETWORK
TITLE =Zeitfunktionen 2
 
      U     E     20.0; 
      =     L     20.0; 
      BLD   103; 
      U     E     20.1; 
      =     L     20.1; 
      BLD   103; 
      CALL FC   100 (
           Eingang_1                := L     20.0,
           Zeitfunktion_1           := T     20,
           Zeitdauer_1              := S5T#10S,
           Eingang_2                := L     20.1,
           Zeitfunktion_2           := T     21,
           Zeitdauer_2              := S5T#15S,
           Ausgang_1                := A     20.0,
           Ausgang_2                := A     20.1);
      NOP   0; 
 
END_ORGANIZATION_BLOCK

Code:
FUNCTION FC 100 : VOID
TITLE =Zeitfunktionen
//16
AUTHOR : Kai
FAMILY : SPSForum
NAME : Zeitfunk
VERSION : 1.0
 
VAR_INPUT
  Eingang_1 : BOOL ; 
  Zeitfunktion_1 : TIMER ; 
  Zeitdauer_1 : S5TIME ; 
  Eingang_2 : BOOL ; 
  Zeitfunktion_2 : TIMER ; 
  Zeitdauer_2 : S5TIME ; 
END_VAR
VAR_OUTPUT
  Ausgang_1 : BOOL ; 
  Ausgang_2 : BOOL ; 
END_VAR
BEGIN
NETWORK
TITLE =Zeitfunktion 1
 
      U     #Eingang_1; 
      L     #Zeitdauer_1; 
      SE    #Zeitfunktion_1; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     #Zeitfunktion_1; 
      =     #Ausgang_1; 
 
NETWORK
TITLE =Zeitfunktion 2
 
      U     #Eingang_2; 
      L     #Zeitdauer_2; 
      SE    #Zeitfunktion_2; 
      NOP   0; 
      NOP   0; 
      NOP   0; 
      U     #Zeitfunktion_2; 
      =     #Ausgang_2; 
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    7,4 KB · Aufrufe: 14
  • FC100.pdf
    5,7 KB · Aufrufe: 16
  • Zeitfunk.zip
    30,5 KB · Aufrufe: 8
Dem FB für die Vorrichtung übergebe ich dann einen Pointer auf den Beginn des EA-Bereichs. Also P#E80.0 bzw. P#100.0.

Wenn ich nun die Signale von EW80 und EW82 in den DB schreiben will - wie geht das?!

Wenn Du das EW80 und EW82 übergeben willst, dann musst Du nicht mit Pointern arbeiten.

Du kannst direkt das ED80 als IN-Parameter (DWORD) am FC oder FB übergeben.

Gruß Kai
 
@Kai: Die Sache mit den Multidingern gefällt mir ganz gut. Ich werde da zwar nicht so schnell zu ner Lösung kommen wie wenn ich Timer verwenden würde - aber ich will ja auch was lernen :)

Was die Übergabe betrifft - ok, wenn ich maximal 4EB´s benötige, kann ich direkt übergeben. Aber wie mache ich das wenn ich mal mehr brauche?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn du mehr Eingänge an deinem FB brauchst, dann vergrößerst du halt die Schnittstelle.
Du mußt dir aber grundsätzlich über den Sinn dieser Vorgehensweise klar werden. Solche Bausteine machen nur dann Sinn, wenn sie in der einmal erstellten Form immer wieder genauso nur eben mit unterschiedlichen Parametern zum Einsatz kommen.

Gruß
LL
 
naja "immer wieder" wohl eher nicht. Ich habe nur 2 Vorrichtungen die einen identischen Ablauf haben.
Eigentlich könnte ich auch einfach den Vorrichtungs-FC kopieren und die Eingänge mittels Suchen und Ersetzen umbenennen. Allerdings müsste ich dann bei Änderungen beide FC´s pflegen, und das möchte ich eigentlich umgehen. Und lernen will ich ja auch noch was :)


Zur Schnittstelle: gibt es keine Möglichkeit dem FB die Anfangsadresse zu übergeben (E80.0) und dann im FB selbst die Eingänge E80.0 bis E89.7 zu verarbeiten?!

Gruß Mike
 
Zur Schnittstelle: gibt es keine Möglichkeit dem FB die Anfangsadresse zu übergeben (E80.0) und dann im FB selbst die Eingänge E80.0 bis E89.7 zu verarbeiten?!

Klar geht das. Du übergibst nicht die Variable als IN-Bool sondern als Pointer. An den Pointer kannst du dann auch E80.0 schreiben und das dann in deinem Baustein weiter verarbeiten und den Pointer auch erhöhen. das geht sogar recht einfach - allerdings ob man das auch machen sollte ...?
Diese Art der Verwendung (z.B.) eines Eingangs wird dir dann in der Step7-Querverwei0liste nicht mehr ausgewiesen und das ist für eine mögliche Fehlersuche ein echtes Manko ... :rolleyes:

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
naja, ich sag mal bei gewissen Dingen wäre das sicherlich nicht angebracht. Aber wenn ich einen "Vorrichtungs-FB" habe und jede Vorrichtung eine eigene ET200S halte ich es schon für nachvollziehbar wenn ich dem FB nur sage wo "seine" EA´s liegen.

zurück zur Praxis: bis zur deklaration und Übergabe des Pointers als IN-Variable bin ich gekommen, aber dann z.B. mal 6 Bytes mittels Blockmove in den Datenbereich des DB´s zu schreiben habe ich nicht geschafft. Wie genau mach ich das?!

Deklaration: E_Bereich als POINTER
Eingang am Blockmove: E_Bereich BYTE6 - aber so geht´s net :)


Viele Grüße
Mike
 
Hallo,
:rolleyes: du wurschtelst dir da ganz schön was zu Recht ... :confused:

Wenn du einen Bereich übergeben willst, dann mußt du natürlich einen Bereichspointer nehmen : ANY-Pointer - der SFC20 erwartet dafür auch am Eingang einen solchen.

Welchen Sinn hat denn das hineinkopieren einen Eingangsbereiches in einen FB ? Was erreichst du so ?
Ein FB ist in diesem Fall (nach meiner Ansicht) dafür gedacht, eine bestimmte Funktion (die sich öfter wiederholt) abzubilden. Eine Funktion kann z.B. sein : Überwache die Arbeitsweise eines Zylinders. Dann hättest du max. 2 Steuerbefehle (Zylinder vor und Zylinder zurück), 2 Eingänge (Zylinder vorn und Zylinder hinten) und 2 Ausgänge (Zylinder vorfahren und Zylinder zurückfahren). Dazu käme dann die Information, wie lange das normalerweise dauern darf bzw. ab wann du einen Timeout hast. Ausgeben könntest du dann zusätzlich noch einen Fehlercode (o.ä.).

Was willst du jetzt machen ?

Gruß
LL
 
Bei einem so kurzen Bereich ist es denkbar, die Eingänge in 2 DINTs und 1 INT zusammenzufassen und so als VAR_INPUT zu übergeben. Bleibt das Problem, es wieder als BOOLs darzustellen.

Oder 80 VAR_INPUT BOOLs anzulegen, aber die Eingänge mit L ED80; T DBx.DD 0 (?) zu übergeben. Das ergibt 6 unschöne Zeilen pro FB-Call, aber ist effizient und referenzfreundlich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja, "wurschteln" trifft´s ganz gut :).

Ich habe ursprünglich den Ablauf einer Vorrichtung in einem FC mit direkten Adressen erstellt. Dieser FC wird dann einfach aus OB1 heraus aufgerufen.
Jetzt gibt es aber noch eine 2. Vorrichtung, die genau das gleiche macht - also habe ich den FC kopiert und die direkten Adressen mittels Suchen/Ersetzen ausgetauscht (E80.0 durch E 100.0, E80.1 durch E100.1 usw).

Diese Vorgehensweise ist halt eben recht nervig - gut, es sind nur 2 Vorrichtungen, aber es hätten ja auch 4 oder 10 Stück sein können (Rundtakttisch), und wenn ich dann bei der Inbetriebnahme noch einen Fehler entdecke, darf ich in allen FC´s ausbessern gehen. Aus diesem Grund hätte ich gerne nur einen einzigen FC/FB erstellt, diesen im OB1 eben 2 mal aufgerufen und dann eben einmal die Startadresse E80.0 und beim 2. mal die 100.0 als In-Parameter mit übergeben.

Gruß Mike
 
Zurück
Oben