Funktionen (FU) in WinCat

Bambam

Level-1
Beiträge
60
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

ich habe mal eine Frage bezüglich Funktionen in WinCat bzw. der Sprache "ST". Ich habe ein etwas größeres Projekt programmiert und möchte nun alles aus der Main in Funktionen schaufeln, sodass ich in Main nur noch die Funktionen aufrufen muss.
Das habe ich auch getan, doch leider Funktioniert das nicht so, wie ich mir das vorgestellt habe. Es funktioniert nämlich gar nicht mehr.
Wenn ich alles in Main lasse geht auch alles, doch sobald ich in Funktionen auslagere geht es nicht mehr.
Ein Bsp.:
Ich habe eine Funktion in der zwei Taster sind, zwei IF-Schleifen und zwei TON's. So die Taster schalten, in die Schleifen wird auch gegangen, doch die TON's werden nicht ausgeführt. Wenn ich am IN-Eingang ein TRUE habe läuft es nicht an.
Hat einer eine IDEE woran das liegen könnte? Kann man in Funktionen keine Standardbausteine verwenden?

Habt vielen Dank im Voraus.
 
Hallo,

am besten mal den Code posten. Grundsätzlich kann man in Funktionen alles aufrufen. Das besondere an einer Funktion ist das du keine Instanzen bilden kannst und die Funktion gibt dir genau einen Rückgabewert.

Versuch es doch besser mit Funktionsbausteinen (FB).

gruß bonatus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So sieht mein Code aus:

Code:
 (*Klingel*)
 
FUNCTION bKlingel : BOOL
VAR_INPUT
END_VAR
VAR
 trigTasterS560 : R_TRIG;
 trigTasterS559 : R_TRIG;
 icountKlingel  : INT;
 tonKlingel_2  : TON;
 tonKlingel_1  : TON;
 
END_VAR
 
 trigTasterS560(CLK:= bE09_TasterS560Tuerkontakt);
 trigTasterS559(CLK:=bE08_TasterS559Klingel);
 
 (*tpKlingel_0(IN:=bE08_TasterS559Klingel, PT:=t#5s , Q=>bA08_KlingelSignal);*)
 
 IF  trigTasterS560.Q THEN
      icountKlingel := 3;
 END_IF
 
 IF trigTasterS559.Q THEN
  icountKlingel := 1;
 END_IF
 
 tonKlingel_1(IN:= (icountKlingel > 0 AND NOT tonKlingel_2.Q)  , PT:=t#1s , Q=>bA08_KlingelSignal ); (*Pausenlaenge zwischen den Signalen*)
 
 tonKlingel_2(IN:= tonKlingel_1.Q  , PT:=t#2s );            (*Dauer des Klingelsignals*)
 
 IF  tonKlingel_2.Q THEN
      icountKlingel := icountKlingel - 1;
 END_IF

FB probiere ich gerade doch wenn ich das aufrufe ( Klingel(); ) kommt der Fehler "Klingel ist keine Funktion"?!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habt vielen Dank für eure Antworten.

Aber um das noch einmal zu ordnen. Ich habe eine Funktion erstellt die bKlingel heißt und so aussieht wie die, die ich auch als CODE zuvor gepostet.

Danach habe ich es mit einem Funktion Block versucht der Klingel heißt. Der sieht wie folgt aus:

Code:
FUNCTION_BLOCK Klingel
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
 trigTasterS560 : R_TRIG;
 trigTasterS559 : R_TRIG;
 icountKlingel  : INT;
 tonKlingel_2  : TON;
 tonKlingel_1  : TON;
END_VAR
 
(*Klingel*)
 trigTasterS560(CLK:= bE09_TasterS560Tuerkontakt);
 trigTasterS559(CLK:=bE08_TasterS559Klingel);
 (*tpKlingel_0(IN:=bE08_TasterS559Klingel, PT:=t#5s , Q=>bA08_KlingelSignal);*)
 IF  trigTasterS560.Q THEN
      icountKlingel := 3;
 END_IF
 IF trigTasterS559.Q THEN
  icountKlingel := 1;
 END_IF
 tonKlingel_1(IN:= (icountKlingel > 0 AND NOT tonKlingel_2.Q)  , PT:=t#1s , Q=>bA08_KlingelSignal ); (*Pausenlaenge zwischen den Signalen*)
 tonKlingel_2(IN:= tonKlingel_1.Q  , PT:=t#2s );            (*Dauer des Klingelsignals*)
 IF  tonKlingel_2.Q THEN
      icountKlingel := icountKlingel - 1;
 END_IF

So und beim Funktionsblock, wenn ich den wie folgt aufrufe:

Code:
Klingel();

Kommt die Fehlermeldung:
Klingel ist keine Funktion!
 
Hallo, ich habs mal versucht in einen FB zu machen:
Deklaration:
Code:
FUNCTION_BLOCK Klingel
VAR_INPUT
    TasterS1    : BOOL;
    TasterS2    : BOOL;
END_VAR
VAR_OUTPUT
    Klingel_Signal: BOOL;
END_VAR
VAR
    trigTasterS1 : R_TRIG;
    trigTasterS2 : R_TRIG;
    icountKlingel  : INT;
    tonKlingel_1  : TON;
    tonKlingel_2  : TON;
END_VAR

ST-Teil:
Code:
trigTasterS1(CLK:= TasterS1);
trigTasterS2(CLK:=TasterS2);

 (*tpKlingel_0(IN:=bE08_TasterS559Klingel, PT:=t#5s , Q=>bA08_KlingelSignal);*)
 
 IF  trigTasterS1.Q THEN
      icountKlingel := 3;
 END_IF
 
 IF trigTasterS2.Q THEN
  icountKlingel := 1;
 END_IF
 
 tonKlingel_1(IN:= (icountKlingel > 0 AND NOT tonKlingel_2.Q)  , PT:=t#1s , Q=>Klingel_Signal ); (*Pausenlaenge zwischen den Signalen*)
 
 tonKlingel_2(IN:= tonKlingel_1.Q  , PT:=t#2s );            (*Dauer des Klingelsignals*)
 
 IF  tonKlingel_2.Q THEN
      icountKlingel := icountKlingel - 1;
 END_IF

An dem FB hast du nun 2 Eingänge und 1 Ausgang.

Ruf den FB am besten mal in FUP auf da sieht man das am besten.
 
Super danke.

Doch leider kommt immer noch der Fehler:
Das Klingel keine Funktion ist.
Ist doch zum Mäuse melken ... :-|
 
Dann rufst du irgendwo in deinem Programm noch die Funktion Klingel auf.

In der fehlermeldung siehst du wo das ist.

Mit einem Doppelklick gelangst du an die Stelle wo der Fehler ist
 
Zurück
Oben