FC parametrieren Step7

Zuviel Werbung?
-> Hier kostenlos registrieren
Wie dalbi schon sagt geht das so nicht.

Du solltest in der Schnittstelle des FB eine IN Variable vom Typ BOOL deklarieren und diese für dein Signal vom FC verwenden.
 
Neue Quelle für einen FC.

diesen FC rufst du 10 mal auf.
Dann noch einen globalen-DB oder auch Merker für deine 10 Türen
(10 Flankenmerker Tür auf und 10 Flankenmerker Tür zu)
und 10 Merker die den Zustand der Türen speichern.
door_auf: true =Tür auf
door_auf: false =Tür zu

du musst dann nur noch die 10 FC-Aufrufe mit den richtigen Variablen parametrieren

Code:
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  Tuerschalter : BOOL ;    
END_VAR
VAR_IN_OUT
  door_auf : BOOL ;    
  Flankenmerker_auf : BOOL ;    
  Flankenmerker_zu : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =

//Tür auf
      U     #Tuerschalter; 
      FP    #Flankenmerker_auf; 
      S     #door_auf; 



// Tür zu
      U     #Tuerschalter; 
      FN    #Flankenmerker_zu; 
      R     #door_auf; 


      SET   ; //ENO handling
      SAVE  ; 


END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke euch. Habe ich verstanden.

Macht es aus eurer Sicht jetzt mehr Sinn, einen FB zu nehmen und für jede Tür den FB aufzurufen oder doch besser einen FC zu erstellen, der 10 Eingänge für alle Türen hat.

... hätte ich mein Zeug bloß nicht optimiert ...


Sorry crash, habe deinen Beitrag beim Verfassen des Meinigen nicht lesen können, quasi erst danach gelesen. Werde mich dem Beispiel nun widmen. Danke.
 
Zuletzt bearbeitet:
Ich würde die FC nehmen so wie in meinem letzten Post beschrieben
dann brauchst du nicht 10 DBs dafür "verschwenden."
Eine Multi-Instanz wäre auch möglich aber da du ja Anfänger bist lassen wir das. :)
 
Wie sind eigentlich deine Türschalter angeschlossen?
Tür auf - Kontakt geöffnet
Tür zu - Kontakt geschlossen
oder anders herum?
du musst das dann im FC eventuell noch anpassen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Crash,

Danke für das Beispiel. Ich habe auch nur eine alte 314er CPU mit 24kb RAM. Da spare ich auch lieber.

Was ich nur nicht aus deinem Beispiel entnehme, welche Türnummer übergeben wird. Dies brauche ich... hier mein Beispiel des bereits demontierten FB100. In meiner Urfassung hatte ich noch einen In-Parameter mit TüraufZu. Ich habe eine 1 übergeben wenn auf und eine 0 wenn zu.

Es war mal ein FC!

Code:
FUNCTION_BLOCK FB 100
TITLE =
VERSION : 0.1
 
VAR_INPUT
  DOORNR : BYTE ; 
  AUF : BOOL ; 
END_VAR
VAR_TEMP
  ErrorVar : INT ; //Errorvar für sfc20
  ErrorVar2 : INT ; //Errorvar2
  Datum_und_Zeit : DATE_AND_TIME ; 
END_VAR
BEGIN
NETWORK
TITLE =
//Hier werde ich noch anhand der eingetragenen Tür (1 bis 10) mit einem Zeiger in 
//in das entsprechende Fach eines DBs einen Wert aufsummieren...
NETWORK
TITLE =
      CALL "BLKMOV" (
           SRCBLK                   := P#DB99.DBX8.0 BYTE 1592,
           RET_VAL                  := #ErrorVar,
           DSTBLK                   := P#DB99.DBX0.0 BYTE 1592);
      NOP   0; 
NETWORK
TITLE =Letzten Datensatz eintragen 1a
//Türennummer
      L     #DOORNR; 
      T     "LOG".Eintrag[200].door; 
      NOP   0; 
NETWORK
TITLE =Letzten Datensatz eintragen 2
//Datum und Zeit Teil 1
      CALL "READ_CLK" (
           RET_VAL                  := #ErrorVar2,
           CDT                      := #Datum_und_Zeit);
      NOP   0; 
NETWORK
TITLE =Jahr eintragen
//Jahr eintragen
//
      L     LB     4; 
      BTI   ; 
      T     "LOG".Eintrag[200].JAHR; 
      NOP   0; 
NETWORK
TITLE =Monat eintragen
      L     LB     5; 
      BTI   ; 
      T     "LOG".Eintrag[200].MONAT; 
      NOP   0; 
NETWORK
TITLE =Tag einfügen
      L     LB     6; 
      BTI   ; 
      T     "LOG".Eintrag[200].TAG; 
      NOP   0; 
NETWORK
TITLE =Stunde einfügen
      L     LB     7; 
      BTI   ; 
      T     "LOG".Eintrag[200].Stunde; 
      NOP   0; 
NETWORK
TITLE =Minute einfügen
      L     LB     8; 
      BTI   ; 
      T     "LOG".Eintrag[200].Minute; 
      NOP   0; 
NETWORK
TITLE =Sekunden einfügen
      L     LB     9; 
      BTI   ; 
      T     "LOG".Eintrag[200].Sekunde; 
      NOP   0; 
END_FUNCTION_BLOCK

Habe irgendwo gelesen, dass ein FC am Eingang EN immer mit einem Signal versorgt werden sollte. Bist du auch dieser Meinung oder kann ich erst, nachdem der Türkontakt geöffnet/geschlossen wurde, diesen FB aufrufen.

Werde erst einmal Kaffee-Trinken gehen - Besuch - komme heute Abend wieder.

Sorry für meine sicherlich blöden Fragen.

Diese Variante musste ich aber für Flanke positiv und negativ getrennt aufrufen, also je Tür 2 Mal den FC (war es ja mal) Deine Modifikation hilft, um diesen nur noch einmal aufrufen zu müssen...
 
Zuletzt bearbeitet:
Ja, es sind Öffner, das heißt NC - Tür zu, Kontakt geschlossen - sonst könnte ja auch jemand das Kabel durchscheiden und es würde kein Alarmgetöse mehr geben. (Ist sowieso nur "Spielerei", habe hier keine Goldbarren versteckt ;)
 
Ja, es sind Öffner, das heißt NC - Tür zu, Kontakt geschlossen - sonst könnte ja auch jemand das Kabel durchscheiden und es würde kein Alarmgetöse mehr geben. (Ist sowieso nur "Spielerei", habe hier keine Goldbarren versteckt ;)

dann musst du das noch ändern
Code:
//Tür auf
      U     #Tuerschalter; 
      [B][COLOR=Red]FN[/COLOR][/B]    #Flankenmerker_auf; 
      S     #door_auf; 



// Tür zu
      U     #Tuerschalter; 
      [B][COLOR=Red]FP[/COLOR][/B]    #Flankenmerker_zu; 
      R     #door_auf;
 
Hallo liebe geduldige Experten.

Ich habe mich mit Sicherheit nicht so gut ausgedrückt. Versuche es aber mal so:

Bisher habe ich ein lauffähgiges System. Verschiedene Alarm-Modus (verzögert, Alle Außentüren, Alle Türen) und ist der Alarm aktiviert - eine Tür (je nach Modus) öffnet sich, dann löst das aktustische Signal aus. Das ist alles schon ganz gut.

Derzeit habe ich mehrere Netzwerke, in denen je Türöffnung eine positive und eine negative Flanke gebildet wird. Jeweils wird der FC1 aufgerufen (schon existent), der dann mit BlockMove die übergebenen Einträge in einen DB packt. Alles super. Also bei positiver Flanke wird derzeit der besagte FC aufgerufen - Inparameter Byte Türnummer, Inparameter Byte AufZu. In diesem Fall wird 0 gesetzt, weil ja die Tür aufging und daher 0. Weiterhin addiere ich derzeit im selben Netzwerk bei besagter positiver Flanke eine Zahl auf, ein anderer DB (zählt die Öffnungen, daher bei pos. Flanke) Es geht eine Verzweigung zur negativen Flanke, die nicht aufsummiert, aber wieder den FC1 aufruft, mit Paramter Türnummer und diesmal mit 1 bei Aufzu. Das realisiere ich mit jeder Tür - und ist mir zu fett. Daher dachte ich an den FC1 mit noch mehr Parameter. Da ein FC sich nichts merken kann, muss ich die Flanken mit übergeben. Sonst könnte ich einfach auf einen In-Parameter bei Öffnung das Signal draufgeben - werte die positive Flanke aus - und beim Schließen die negative Flanke auswerten. Aber in einem FC muss ich vorher nicht mit P und N, sondern mit der aufwändigeren Funktion realisieren. Wieder hätte ich für eine einzige Tür in einem Netzwerk so viele Elemente.

Kann ich das nicht einfacher realisieren? Wie gesagt, das ist alles losgelöst von der eigentlichen Überprüfung auf Alarmierung. Tür geht auf - Eintrag in DB, Zählung DB, Tür geht zu - Eintrag in DB (soll alles der FC1 realisieren)

grafik1.JPG


grafik2.JPG

Dankeschön für Ideen.
 
Zuletzt bearbeitet:
Ich habe nun einfach den oberen Teil (Bild) in einen FB eingebunden und die Übergabeparameter definiert. Die Flankenmerker als STAT-Variablen angelegt. Um nicht für jeden Aufruf einen DB zu verschwenden, rufe ich den FB von einen anderen FB auf (Multiinstanz) und speichere alle Variablen in nur einen DB. Das funktioniert auch sehr gut.

Darf nun nur nicht mehr das AR2 benutzen, wie ich erfahren habe...

Nun werde ich nur noch den zweiten Teil mit der Übergabe der Zählervariable weglassen und mir die Adresse berechnen.

MfG

Olaf
 
Zurück
Oben