Step 7 FC aufruf klappt nicht

janoro

Level-1
Beiträge
29
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich habe mal ein kleines Anfänger problem und ich hoffe ihr könnt mir sagen, was ich falsch gemacht habe oder wie es richtig klappt.

Ich habe eine fertige Anlage an der 20 Kühlkreisläufe sitzen. An den Kühlkreisläufen wird der Durchfluss gemssen, wenn kein Durchfluss da ist, gibt es eine Fehlermeldung.
Dieses Programm möchte ich nun so erweitern, das wenn an einem Kühlkreislauf drei mal kein Durchfluss da ist, die Anlage in den Taktstopp geht und erst wieder gestartet wird wenn die Kühlung io ist.

Ich habe mir nun einen neuen FC erstellt, in dem ich den Zähler und weitere Bedingungen programmiert habe.
Den fertigen FC habe ich nun 20 mal aufgerufen wenn nun ein Kreislauf 3 mal einen Fehler hat, soll in einem DB ein DBX gesetzt werden welches ich für die Fehlermeldung nutzen will.

Mein Problem ist nun das wenn 1 Kreislauf 3mal einen Fehler hatte. Ich 20 Fehlermeldungen erhalte und nicht nur eine.

Ich hoffe ihr versteht mein Problem und könnt mir weiterhelfen.

Vielen Dank.
 
Hallo

es währen etwas mehr Infos gefragt. Ich weis nicht wie fit du bist. Ich hoffe du übergibst den Zähler an der Schnittstelle oder hast du einen Fb mit Multiinstanz? Wenn du immer den gleichen Zähler aufrufst geht das nicht stell am besten mal den Code des fc s bitte online

gruß TiaWinCC
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo TiaWinCC danke für die Antwort.
Doch ich nehme immer den gleichen Zähler. Ich habe auch keinen fb. Liegt da der Fehler?

Ich komme leider erst morgen nachmittag wieder an das Programm um den Code zu senden.
 
Wenn Du den selben Zähler verwendet hast, ist es sehr wahrscheinlich der Zähler, aber da Du den Code nicht gepostet hast, kann es natürlich auch noch andere Fehler geben.
 
Hier nun der Code von dem FC den ich aufrufe. ICh hoffe ihr könnt das so verstehen :)

NW1
U M 100.6
U #Durchfluss_nio
ZV Z 10
BLD 101
U M 100.6
L C#0
S Z 10
U #Durchfluss_io
R Z 10
NOP 0
LC Z 10
T #Zaehler
NOP 0


NW2
L #Zaehler
L 3
==I
= #Stoerung_1

NW3
U #Stoerung_1
S #Fehler_Da
U E 2.3
R #Fehler_Da
NOP 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du rufst diesen FC 20 mal auf? benutzt darin aber diverse globale Variablen. Das sind also diverse fehler die du hier machst.
Der erste ist natürlich der Z10 der ist immer Z10 es ist also egal welcher aufruf #Durchfluss_nio bringt es wird immer Z10 hochgezählt und in jedem aufruf auch Z10 abgefragt. übersteigt dieser also den Grenzwert wird jeder FC Aufruf #Stroerung_1 Setzen.

Such im Forum mal nach Multiinstanzen, FBs und wie man Zähler Instanziert. Wobei Hier natürlich nicht unbedingt ein FB nötig wäre, kann man (sollte man) auch alles über die Schnittstelle übergeben.

mfG René
 
??

Hallo janoro,

wie vollmi schon geschrieben funktioniert das leider nicht ganz so ich weis leider nicht genau was bei dir M100.6 macht.
aber du musst für jeden FC aufruf einen eigenen Zähler verwenden das Funktioniert entweder über einen FB in dem du einem IEC Timer aufrufst oder einfacher du legt eine In_out Variable an die den Zähler übergibst.
Dann musst du halt noch bei jedem Fc aufruf einen anderen Zähler an den FC Schreiben.

ähnlich wäre es beim M100.6 wenn dieser bei jeden Aufruf die gleiche Aufgabe hat (das gleiche abfragen soll) ist das gut so soll hier aber bei jeden Aufruf etwas anderes abgefragt werden solltest du hier auch eine Variable im In Bereich des FC deklariern und diese beim Aufruf übergeben

Wenn du fragen hast oder nicht ganz verstanden hast um was es geht dann melde dich bitte nochmal ich werde es dir dann genauer erklären.

MFG WINCCTIA
 
Bei Verwendung von mehrfach aufgerufenen FC beachten:
- alles was von außerhalb des FC kommt (z.B. Eingänge, Merker) --> über die FC-Schnittstelle übergeben
- alles was sich der FC merken soll --> eine Speichervariable über IN_OUT übergeben, weil ein FC kann sich nichts merken
- wenn der FC je Aufruf unterschiedliche Zähler oder Timer verwenden soll, dann die Instanz (Nummer) des zu verwendenden Zählers/Timers an den FC übergeben

Wenn in KOP/FUP der Zählerstand eines Z_VORW noch mit Dezimalzahlen (INT) verglichen werden soll, dann
- den Zählerstand vom Ausgang DUAL nehmen (der Ausgang DEZ ist BCD-codiert)
- den Zählerstand auf eine Word-Variable speichern, weil DUAL und DEZ als WORD deklariert sind
- den Wert von der WORD-Variable in eine INT-Variable kopieren (MOVE), weil CMP bei (normalerweise) aktivierter Typprüfung nicht mit WORD arbeitet
- beim CMP auf >=I vergleichen statt ==I, weil der Zähler auch noch weiterzählen kann

- Deine Verwendung des M100.6 bei ZV und für Setzen des Zählers kann so wie gezeigt nicht richtig sein. Hast Du da einen Tippfehler?

- Fehlerspeicher bis Quittieren macht man üblicherweise als RS-Flipflop (vorrangig Setzen) anstatt SR-Flipflop (vorrangig rücksetzen), damit man nur quittieren kann, wenn der Fehler nicht mehr ansteht. Bei SR-Flipflop kann man die Fehlerspeicherung unterdrücken, solange man den Quittierknopf gedrückt hält.

Hier ein Beispiel, wie Du es besser machen kannst:
Code:
FUNCTION FC123 : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
  Durchfluss_io : BOOL ;
  Durchfluss_nio : BOOL ;
  CheckPuls : BOOL ;
  Quitt : BOOL ;
  Z_No : COUNTER ;
END_VAR
VAR_IN_OUT
  Fehler_Da : BOOL ;
END_VAR
VAR_TEMP
  wZaehler : WORD ;
  iZaehler : INT ;
  Stoerung_1 : BOOL ;
END_VAR

BEGIN
NETWORK
      U     #CheckPuls;
      U     #Durchfluss_nio;
      ZV    #Z_No;
      BLD   101;
      NOP   0;
      NOP   0;
      U     #Durchfluss_io;
      R     #Z_No;
      L     #Z_No;
      T     #wZaehler;
      NOP   0;
      NOP   0;
NETWORK
      L     #wZaehler;
      T     #iZaehler;
      NOP   0;
NETWORK
      U     #Quitt;
      R     #Fehler_Da;
      U(    ;
      L     #iZaehler;
      L     3;
      >=I   ;
      )     ;
      =     #Stoerung_1;
      U     #Stoerung_1;
      S     #Fehler_Da;
      NOP   0;
END_FUNCTION
Den Code in eine AWL-Quelle kopieren, die FC-Nummer anpassen und übersetzen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, vielen Dank erstmal für die wirklich schnelle Hilfe. Ich habe das Programm jetzt so geändert das ich an den aufgerufenen FC einen Zähler dran schreibe. Das funktioniert jetzt auch soweit.

Allerdings finde ich es nicht schön jedes mal einen Zähler zu verwenden. Für die ganze Anlage wären das insgesamt 40 Zähler die ich nutzen müßte.

Mir ist nun die Idee gekommen, dass ganze über einen addierer zu machen.
Ich habe mir das so vorgestellt, das wenn der Durchfluss nio ist die Zahl um 1 erhöht wird und dann im db gespeichert wird. Wenn im db irgendwann eine 3 steht, gibt es eine Fehlermeldung.

Aber auch das will wieder nicht auf Anhieb klappen.
Ich habe einen addierer genommen und das db.dbb ran geschrieben und mit 1 addiert am Ausgang habe ich das gleiche db.dbb gesetzt.

Wenn nun ein Fehler kommt, wird 1 hochgezählt. Wenn der Fehler wieder geht, steht aber wieder eine 0 drin.

Vielleicht könnt ihr mir da auch einen Tipp geben.

Den Code werde ich gleich noch einmal hochladen.

Gesendet von meinem SM-G920F mit Tapatalk
 
Dir ist klar dass ein Byte keine zahlentyp hat? Nimm lieber einen INT oder DINT. Diesen musst du an inout des fc deklarieren.


Sent from my iPhone using Tapatalk
 
Wenn ich den in/out des FC als int deklariere, kann ich doch aber kein db. dbb dran schreiben, weil ich einen Datentyp Konflikt habe.
Was muss ich denn dann verwenden?
 
So ich habe nun den in/out als Int deklariert und ein dbx.dbw verwendet allerdings habe ich weiterhin das gleiche Problem. Wenn mir jemand dazu ein paar gute Quellen zum nachlesen nennen könnte, würde ich mich da auch erstmal schlau lesen.

Hier nochmal der neue Code für den addierer:

MW1

U #Durchfluss_nio
SPBNB _001
L #DB_Addieren
L1
+I
T #DB_Addieren
_001: Nop 0
 
Sie habe noch ein In - out bool nodig fur ein flankmerker. Und in code

Verstuurd vanaf mijn GT-I9301I met Tapatalk
 
Hallo zusammen,
ich habe mich jetzt mit den ganzen tipps mal hingesetzt und vor mich hinprogrammiert.
Hier mal das Ergebnis.
Gibt es vielleicht einen Trick wie ich die Fehlermeldungen aus dem DB ins HMI bekomme oder muss ich die alle einzeln abtippen?

Vielen Dank

Code:
DATA_BLOCK DB 1
TITLE =
VERSION : 0.1


  STRUCT     
   Kreislauf_links : STRUCT     
    Zaehlen : ARRAY  [1 .. 20 ] OF WORD ;    
    Fehler : ARRAY  [1 .. 20 ] OF BOOL ;    
    Flanken : ARRAY  [1 .. 20 ] OF BOOL ;    
   END_STRUCT ;    
   Kreislauf_rechts : STRUCT     
    Zaehlen : ARRAY  [1 .. 20 ] OF WORD ;    
    Fehler : ARRAY  [1 .. 20 ] OF BOOL ;    
    Flanken : ARRAY  [1 .. 20 ] OF BOOL ;    
   END_STRUCT ;    
  END_STRUCT ;    
BEGIN
   Kreislauf_links.Zaehlen[1] := W#16#0; 
   Kreislauf_links.Zaehlen[2] := W#16#0; 
   Kreislauf_links.Zaehlen[3] := W#16#0; 
   Kreislauf_links.Zaehlen[4] := W#16#0; 
   Kreislauf_links.Zaehlen[5] := W#16#0; 
   Kreislauf_links.Zaehlen[6] := W#16#0; 
   Kreislauf_links.Zaehlen[7] := W#16#0; 
   Kreislauf_links.Zaehlen[8] := W#16#0; 
   Kreislauf_links.Zaehlen[9] := W#16#0; 
   Kreislauf_links.Zaehlen[10] := W#16#0; 
   Kreislauf_links.Zaehlen[11] := W#16#0; 
   Kreislauf_links.Zaehlen[12] := W#16#0; 
   Kreislauf_links.Zaehlen[13] := W#16#0; 
   Kreislauf_links.Zaehlen[14] := W#16#0; 
   Kreislauf_links.Zaehlen[15] := W#16#0; 
   Kreislauf_links.Zaehlen[16] := W#16#0; 
   Kreislauf_links.Zaehlen[17] := W#16#0; 
   Kreislauf_links.Zaehlen[18] := W#16#0; 
   Kreislauf_links.Zaehlen[19] := W#16#0; 
   Kreislauf_links.Zaehlen[20] := W#16#0; 
   Kreislauf_links.Fehler[1] := FALSE; 
   Kreislauf_links.Fehler[2] := FALSE; 
   Kreislauf_links.Fehler[3] := FALSE; 
   Kreislauf_links.Fehler[4] := FALSE; 
   Kreislauf_links.Fehler[5] := FALSE; 
   Kreislauf_links.Fehler[6] := FALSE; 
   Kreislauf_links.Fehler[7] := FALSE; 
   Kreislauf_links.Fehler[8] := FALSE; 
   Kreislauf_links.Fehler[9] := FALSE; 
   Kreislauf_links.Fehler[10] := FALSE; 
   Kreislauf_links.Fehler[11] := FALSE; 
   Kreislauf_links.Fehler[12] := FALSE; 
   Kreislauf_links.Fehler[13] := FALSE; 
   Kreislauf_links.Fehler[14] := FALSE; 
   Kreislauf_links.Fehler[15] := FALSE; 
   Kreislauf_links.Fehler[16] := FALSE; 
   Kreislauf_links.Fehler[17] := FALSE; 
   Kreislauf_links.Fehler[18] := FALSE; 
   Kreislauf_links.Fehler[19] := FALSE; 
   Kreislauf_links.Fehler[20] := FALSE; 
   Kreislauf_links.Flanken[1] := FALSE; 
   Kreislauf_links.Flanken[2] := FALSE; 
   Kreislauf_links.Flanken[3] := FALSE; 
   Kreislauf_links.Flanken[4] := FALSE; 
   Kreislauf_links.Flanken[5] := FALSE; 
   Kreislauf_links.Flanken[6] := FALSE; 
   Kreislauf_links.Flanken[7] := FALSE; 
   Kreislauf_links.Flanken[8] := FALSE; 
   Kreislauf_links.Flanken[9] := FALSE; 
   Kreislauf_links.Flanken[10] := FALSE; 
   Kreislauf_links.Flanken[11] := FALSE; 
   Kreislauf_links.Flanken[12] := FALSE; 
   Kreislauf_links.Flanken[13] := FALSE; 
   Kreislauf_links.Flanken[14] := FALSE; 
   Kreislauf_links.Flanken[15] := FALSE; 
   Kreislauf_links.Flanken[16] := FALSE; 
   Kreislauf_links.Flanken[17] := FALSE; 
   Kreislauf_links.Flanken[18] := FALSE; 
   Kreislauf_links.Flanken[19] := FALSE; 
   Kreislauf_links.Flanken[20] := FALSE; 
   Kreislauf_rechts.Zaehlen[1] := W#16#0; 
   Kreislauf_rechts.Zaehlen[2] := W#16#0; 
   Kreislauf_rechts.Zaehlen[3] := W#16#0; 
   Kreislauf_rechts.Zaehlen[4] := W#16#0; 
   Kreislauf_rechts.Zaehlen[5] := W#16#0; 
   Kreislauf_rechts.Zaehlen[6] := W#16#0; 
   Kreislauf_rechts.Zaehlen[7] := W#16#0; 
   Kreislauf_rechts.Zaehlen[8] := W#16#0; 
   Kreislauf_rechts.Zaehlen[9] := W#16#0; 
   Kreislauf_rechts.Zaehlen[10] := W#16#0; 
   Kreislauf_rechts.Zaehlen[11] := W#16#0; 
   Kreislauf_rechts.Zaehlen[12] := W#16#0; 
   Kreislauf_rechts.Zaehlen[13] := W#16#0; 
   Kreislauf_rechts.Zaehlen[14] := W#16#0; 
   Kreislauf_rechts.Zaehlen[15] := W#16#0; 
   Kreislauf_rechts.Zaehlen[16] := W#16#0; 
   Kreislauf_rechts.Zaehlen[17] := W#16#0; 
   Kreislauf_rechts.Zaehlen[18] := W#16#0; 
   Kreislauf_rechts.Zaehlen[19] := W#16#0; 
   Kreislauf_rechts.Zaehlen[20] := W#16#0; 
   Kreislauf_rechts.Fehler[1] := FALSE; 
   Kreislauf_rechts.Fehler[2] := FALSE; 
   Kreislauf_rechts.Fehler[3] := FALSE; 
   Kreislauf_rechts.Fehler[4] := FALSE; 
   Kreislauf_rechts.Fehler[5] := FALSE; 
   Kreislauf_rechts.Fehler[6] := FALSE; 
   Kreislauf_rechts.Fehler[7] := FALSE; 
   Kreislauf_rechts.Fehler[8] := FALSE; 
   Kreislauf_rechts.Fehler[9] := FALSE; 
   Kreislauf_rechts.Fehler[10] := FALSE; 
   Kreislauf_rechts.Fehler[11] := FALSE; 
   Kreislauf_rechts.Fehler[12] := FALSE; 
   Kreislauf_rechts.Fehler[13] := FALSE; 
   Kreislauf_rechts.Fehler[14] := FALSE; 
   Kreislauf_rechts.Fehler[15] := FALSE; 
   Kreislauf_rechts.Fehler[16] := FALSE; 
   Kreislauf_rechts.Fehler[17] := FALSE; 
   Kreislauf_rechts.Fehler[18] := FALSE; 
   Kreislauf_rechts.Fehler[19] := FALSE; 
   Kreislauf_rechts.Fehler[20] := FALSE; 
   Kreislauf_rechts.Flanken[1] := FALSE; 
   Kreislauf_rechts.Flanken[2] := FALSE; 
   Kreislauf_rechts.Flanken[3] := FALSE; 
   Kreislauf_rechts.Flanken[4] := FALSE; 
   Kreislauf_rechts.Flanken[5] := FALSE; 
   Kreislauf_rechts.Flanken[6] := FALSE; 
   Kreislauf_rechts.Flanken[7] := FALSE; 
   Kreislauf_rechts.Flanken[8] := FALSE; 
   Kreislauf_rechts.Flanken[9] := FALSE; 
   Kreislauf_rechts.Flanken[10] := FALSE; 
   Kreislauf_rechts.Flanken[11] := FALSE; 
   Kreislauf_rechts.Flanken[12] := FALSE; 
   Kreislauf_rechts.Flanken[13] := FALSE; 
   Kreislauf_rechts.Flanken[14] := FALSE; 
   Kreislauf_rechts.Flanken[15] := FALSE; 
   Kreislauf_rechts.Flanken[16] := FALSE; 
   Kreislauf_rechts.Flanken[17] := FALSE; 
   Kreislauf_rechts.Flanken[18] := FALSE; 
   Kreislauf_rechts.Flanken[19] := FALSE; 
   Kreislauf_rechts.Flanken[20] := FALSE; 
END_DATA_BLOCK

FUNCTION "WK_Störung" : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  Durchfluss_nio : BOOL ;    
  Durchfluss_io : BOOL ;    
END_VAR
VAR_OUTPUT
  Fehler : BOOL ;    
  Ventil_auf : BOOL ;    
END_VAR
VAR_IN_OUT
  DB_Zaehlen : WORD ;    
  FlankeP : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =Addiert +1 wenn Durchfluss nio 

      U     #Durchfluss_nio; 
      FP    #FlankeP; 
      SPBNB _001; 
      L     #DB_Zaehlen; 
      L     1; 
      +I    ; 
      T     #DB_Zaehlen; 
_001: NOP   0; 
NETWORK
TITLE =Wenn 3x nio = Fehlermeldung

      L     #DB_Zaehlen; 
      L     3; 
      >=I   ; 
      =     #Fehler; 
NETWORK
TITLE =Fehlerzähler auf 0
//Wenn der Durchfluss wieder io ist wird der Zähler auf 0 gesetzt
      U     #Durchfluss_io; 
      SPBNB _002; 
      L     0; 
      T     #DB_Zaehlen; 
_002: NOP   0; 
NETWORK
TITLE =Wenn 3x Fehler = Taktstopp
//Wenn 3x kein Durchfluss da war kommt der Taktstop 
//M2000.1 wird der Taktstopmerker
      U     #Fehler; 
      =     M   2000.0; 
NETWORK
TITLE =Ventil testen
//M2000.1 kommt vom HMI zum Durchflusstest
      U     M   2000.1; 
      U     #Fehler; 
      =     #Ventil_auf; 
END_FUNCTION
 
Zurück
Oben