Hallo zusammen,
ich programmiere immernoch mit einer Beckhoff CX Steuerung und Twincat3.
Alles was ich mache habe ich durch anlesen und testen gelernt. Bei meinem jetzigen Problem habe ich mal wieder das Gefühl etwas nicht ganz richtig verstanden zu haben.
Die Case Anweisung wird nicht so zurückgesetzt wie ich vermuten würde.
Sollverhalten:
Nach Initialisierung und aktivieren von "bCloseGripper" soll die Methode "Close" einmal durchlaufen werden. Nach Abschluss in Schritt 999 wird der Rückgabewert Close=1 gesetzt und deaktiviert einen erneuten Aufruf der Methode "Close".
Istverhalten:
nSwitchClose geht alle Schritte von 0,10,15,20,30,999 nacheinander in einer Endlosschleife durch.
Frage:
Wie kann es sein dass, wenn der nSwitchClose definitiv auch den Wert 999 annimmt,der Rückgabewert Close das erneute Ausführen der Methode nicht verhindert. Übersehe ich etwas bei der zyklischen Abarbeitung? (Der Code ist teilweise in den Schritten 10-30 gekürzt)
Methodenaufruf zum testen in der Main:
Die Methoden "Close"
Vielen Dank!
ich programmiere immernoch mit einer Beckhoff CX Steuerung und Twincat3.
Alles was ich mache habe ich durch anlesen und testen gelernt. Bei meinem jetzigen Problem habe ich mal wieder das Gefühl etwas nicht ganz richtig verstanden zu haben.
Die Case Anweisung wird nicht so zurückgesetzt wie ich vermuten würde.
Sollverhalten:
Nach Initialisierung und aktivieren von "bCloseGripper" soll die Methode "Close" einmal durchlaufen werden. Nach Abschluss in Schritt 999 wird der Rückgabewert Close=1 gesetzt und deaktiviert einen erneuten Aufruf der Methode "Close".
Istverhalten:
nSwitchClose geht alle Schritte von 0,10,15,20,30,999 nacheinander in einer Endlosschleife durch.
Frage:
Wie kann es sein dass, wenn der nSwitchClose definitiv auch den Wert 999 annimmt,der Rückgabewert Close das erneute Ausführen der Methode nicht verhindert. Übersehe ich etwas bei der zyklischen Abarbeitung? (Der Code ist teilweise in den Schritten 10-30 gekürzt)
Methodenaufruf zum testen in der Main:
Code:
IF bInitiated AND bCloseGripper THEN
fbGripperSMC.Close();
bCloseGripper:=NOT (fbGripperSMC.Close(Close=>Closed)=1);
END_IF
Code:
CASE nSwitchClose OF
0:
bStart:=TRUE;
bError:=FALSE;
IF bStart AND NOT bBusy THEN
bStart := FALSE;
bBusy := TRUE;
bError := FALSE;
nErrId := 0;
nSwitchClose := 10;
ELSIF (bStart AND bBusy) THEN
bError := TRUE;
//SubModul is in use
nErrId := 1011000;
ELSE
//unkown error
bError := TRUE;
END_IF
10:
//If Initialised start movement, else initialise
OSMC_output.9:=TRUE; // Servo Motor an
OSMC_output.0:=1;//nWert.0; Auswahl der Bewegungsdaten
OSMC_output.1:=1;//nWert.1; Auswahl der Bewegungsdaten
OSMC_output.2:=0;//nWert.2; Auswahl der Bewegungsdaten
OSMC_output.3:=1;//nWert.3; Auswahl der Bewegungsdaten
nSwitchOpen:=15;
15:
fbTONClose1(PT:=T#1S);
fbTONClose1( IN:= NOT fbTONClose1.Q);
IF fbTONClose1.Q THEN
OSMC_output.10:=TRUE; // Auszuwählende Step einscannen und Bewegung starten
nSwitchOpen:=20;
END_IF;
20:
IF ((NOT ISMC_inputPort.8) AND ( DINT_TO_REAL(ABS(ISMC_CurrentPos-ISMC_TargetPos))<nErrorMargin)) THEN //Inputport.8 = BUSY
nSwitchClose:=30;
END_IF
30:
IF ISMC_inputPort.8=FALSE THEN // If not busy (=movement finished) go to Step 999
nSwitchClose:=999;
OSMC_output.9:=FALSE; //Motor aus
OSMC_output.10:=FALSE;//Scan nach neuen Bewegungsbefehlen aus
END_IF
999:
bBusy := FALSE;
bError := FALSE;
nErrId := 1;
Close := 1;
nSwitchClose := 0;
END_CASE;