PROGRAM _INIT RTInfo_0(enable:=1); END_PROGRAM PROGRAM _CYCLIC (* ############################################################################################################# ############################# Stopper Tisch 6 ##################################### ############################################################################################################# *) //Cech-Comment: Dieses gesamte Programm bedient nur die einzelnen Stopper und die Aushebeeinheit, wenn ein anderes Programm den Befehl gibt, Aus- bzw. Einzufahren //Cech-Comment: Initiierung des Ausfahrens (bzw. des Einfahrens im nächsten Block) mit allen Variablen. Der Vorgang beginnt somit IF gTisch_6.Cmd.Stopper = KMD_AUSFAHREN THEN gTisch_6.Outputs.Stopper_einfahren := FALSE; gTisch_6.Times.Stopper_AusZeit := TRUE; gTisch_6.Times.Stopper_EinZeit := FALSE; gTisch_6.Cmd.Stopper := KMD_FERTIG; gTisch_6.Status.Stopper := STATUS_BUSY; END_IF IF gTisch_6.Cmd.Stopper = KMD_EINFAHREN THEN gTisch_6.Outputs.Stopper_einfahren := TRUE; gTisch_6.Times.Stopper_AusZeit := FALSE; gTisch_6.Times.Stopper_EinZeit := TRUE; gTisch_6.Cmd.Stopper := KMD_FERTIG; gTisch_6.Status.Stopper := STATUS_BUSY; END_IF //Cech-Comment: STATUS_BUSY bleibt solange erhalten, bis die Rückmeldung kommt, dass der Stopper fertig ein- bzw. ausgefahren ist (* Status, Zylinderposition ausgeben *) IF (gTisch_6.Inputs.Stopper_eingefahren = TRUE) AND (gTisch_6.Inputs.Stopper_ausgefahren = FALSE) THEN gTisch_6.Status.Stopper := STATUS_EINGEFAHREN; ELSIF (gTisch_6.Inputs.Stopper_eingefahren = FALSE) AND (gTisch_6.Inputs.Stopper_ausgefahren = TRUE) THEN gTisch_6.Status.Stopper := STATUS_AUSGEFAHREN; ELSE gTisch_6.Status.Stopper := STATUS_BUSY; END_IF //Cech-Comment: Schauen, ob nach 5s die Stopper noch nicht umgestellt sind und Status STATUS_ERROR setzen (* Zeitüberwachung Eingefahren*) IF (gTisch_6.Times.Stopper_EinZeit = TRUE AND gTisch_6.Status.Stopper <> STATUS_EINGEFAHREN) OR (gTisch_6.Times.Stopper_AusZeit = TRUE AND gTisch_6.Status.Stopper <> STATUS_AUSGEFAHREN) THEN gTisch_6.Times.Stopper_ZeitRun := gTisch_6.Times.Stopper_ZeitRun + (RTInfo_0.cycle_time/1000); IF (gTisch_6.Times.Stopper_EinZeit = TRUE AND gTisch_6.Status.Stopper = STATUS_EINGEFAHREN) OR (gTisch_6.Times.Stopper_AusZeit = TRUE AND gTisch_6.Status.Stopper = STATUS_AUSGEFAHREN)THEN (* lPortal_Mittelanschlag_EinZeit := FALSE; lPortal_Mittelanschlag_AusZeit := FALSE; *) gTisch_6.Times.Stopper_ZeitRun := 0; END_IF IF gTisch_6.Times.Stopper_ZeitRun >= 5000 THEN gTisch_6.Status.Stopper := STATUS_ERROR; //Cech-Comment: diese globalen Errors sind offensichtlich IF gTisch_6.Times.Stopper_EinZeit = TRUE THEN gError[0] := 1; END_IF IF gTisch_6.Times.Stopper_AusZeit = TRUE THEN gError[1] := 1; END_IF END_IF ELSE gTisch_6.Times.Stopper_ZeitRun := 0; END_IF (* ############################################################################################################# ############################# VorStopper Tisch 6 ##################################### ############################################################################################################# *) IF gTisch_6.Cmd.Vorstopper = KMD_AUSFAHREN THEN gTisch_6.Outputs.Vorstopper_einfahren := FALSE; gTisch_6.Times.Vorstopper_AusZeit := TRUE; gTisch_6.Times.Vorstopper_EinZeit := FALSE; gTisch_6.Cmd.Vorstopper := KMD_FERTIG; gTisch_6.Status.Vorstopper := STATUS_BUSY; END_IF IF gTisch_6.Cmd.Vorstopper = KMD_EINFAHREN THEN gTisch_6.Outputs.Vorstopper_einfahren := TRUE; gTisch_6.Times.Vorstopper_AusZeit := FALSE; gTisch_6.Times.Vorstopper_EinZeit := TRUE; gTisch_6.Cmd.Vorstopper := KMD_FERTIG; gTisch_6.Status.Vorstopper := STATUS_BUSY; END_IF (* Status, Zylinderposition ausgeben *) IF (gTisch_6.Inputs.Vorstopper_eingefahren = TRUE) AND (gTisch_6.Inputs.Vorstopper_ausgefahren = FALSE) THEN gTisch_6.Status.Vorstopper := STATUS_EINGEFAHREN; ELSIF (gTisch_6.Inputs.Vorstopper_eingefahren = FALSE) AND (gTisch_6.Inputs.Vorstopper_ausgefahren = TRUE) THEN gTisch_6.Status.Vorstopper := STATUS_AUSGEFAHREN; ELSE gTisch_6.Status.Vorstopper := STATUS_BUSY; END_IF (* Zeitüberwachung Eingefahren*) IF (gTisch_6.Times.Vorstopper_EinZeit = TRUE AND gTisch_6.Status.Vorstopper <> STATUS_EINGEFAHREN) OR (gTisch_6.Times.Vorstopper_AusZeit = TRUE AND gTisch_6.Status.Vorstopper <> STATUS_AUSGEFAHREN) THEN gTisch_6.Times.Vorstopper_ZeitRun := gTisch_6.Times.Vorstopper_ZeitRun + (RTInfo_0.cycle_time/1000); IF (gTisch_6.Times.Vorstopper_EinZeit = TRUE AND gTisch_6.Status.Vorstopper = STATUS_EINGEFAHREN) OR (gTisch_6.Times.Vorstopper_AusZeit = TRUE AND gTisch_6.Status.Vorstopper = STATUS_AUSGEFAHREN)THEN (* lPortal_Mittelanschlag_EinZeit := FALSE; lPortal_Mittelanschlag_AusZeit := FALSE; *) gTisch_6.Times.Vorstopper_ZeitRun := 0; END_IF IF gTisch_6.Times.Vorstopper_ZeitRun >= 5000 THEN gTisch_6.Status.Vorstopper := STATUS_ERROR; IF gTisch_6.Times.Vorstopper_EinZeit = TRUE THEN gError[0] := 1; END_IF IF gTisch_6.Times.Vorstopper_AusZeit = TRUE THEN gError[1] := 1; END_IF END_IF ELSE gTisch_6.Times.Vorstopper_ZeitRun := 0; END_IF (* ############################################################################################################# ############################# Aushebeeinheut Tisch 6 ##################################### ############################################################################################################# *) (* Cech-Comment: Bei der Aushebeeinheit ist die Sensorik nicht angeschlossen, die KAbel gehen ins Leere! Warum, weiß ich nicht. Möglicherweise Ressourcenmangel am Hauptschrank Daher werden wahrscheinlich bei der Aushebeeinheit die Steuersignale gegengleich geschaltet ( kann aber auch eine eEigenheit der Aushebeeinheit sein). Jedenfalls läuft der Timer immer und die Zeitüberwachung wird nicht verwendet. Es handelt sich somit um eine reine Steuerung ohne Sensorkontrolle. Das muss man berücksichtigen bei Änderungen in diesem Teil der SW*) IF gTisch_6.Cmd.Aushebeeinheit = KMD_AUSFAHREN THEN gTisch_6.Outputs.Aushebeeinheit_einfahren := FALSE; gTisch_6.Outputs.Aushebeeinheit_ausfahren := TRUE; gTisch_6.Times.Aushebeeinheit_AusZeit := TRUE; gTisch_6.Times.Aushebeeinheit_EinZeit := FALSE; gTisch_6.Cmd.Aushebeeinheit := KMD_FERTIG; gTisch_6.Status.Aushebeeinheit := STATUS_BUSY; gMerker_Tisch_6_Ausgehoben := TRUE; //Cech-Implement: Für Opc-Ua-Übergabe an Centurio als BOOL, ob Aushebeeinheit in Position ist END_IF IF gTisch_6.Cmd.Aushebeeinheit = KMD_EINFAHREN THEN gTisch_6.Outputs.Aushebeeinheit_einfahren := TRUE; gTisch_6.Outputs.Aushebeeinheit_ausfahren := FALSE; gTisch_6.Times.Aushebeeinheit_AusZeit := FALSE; gTisch_6.Times.Aushebeeinheit_EinZeit := TRUE; gTisch_6.Cmd.Aushebeeinheit := KMD_FERTIG; gTisch_6.Status.Aushebeeinheit := STATUS_BUSY; gMerker_Tisch_6_Ausgehoben := FALSE; //Cech-Implement: Für Opc-Ua-Übergabe an Centurio als BOOL, ob Aushebeeinheit in Position ist END_IF (* Status, Zylinderposition ausgeben *) IF (gTisch_6.Inputs.Aushebeeinheit_eingefahren = TRUE) AND (gTisch_6.Inputs.Aushebeeinheit_ausgefahren = FALSE) THEN // Toter Zweig, weil der Input vom Aushebesensor nicht angeschlossen wurde gTisch_6.Status.Aushebeeinheit := STATUS_EINGEFAHREN; ELSIF (gTisch_6.Inputs.Aushebeeinheit_eingefahren = FALSE) AND (gTisch_6.Inputs.Aushebeeinheit_ausgefahren = TRUE) THEN // Toter Zweig, weil der Input vom Aushebesensor nicht angeschlossen wurde gTisch_6.Status.Aushebeeinheit := STATUS_AUSGEFAHREN; ELSE // Es wird immer dieser Zweig angefahren und der Status der Aushebeeinheit bleibt immer STATS_BUSY (255) gTisch_6.Status.Aushebeeinheit := STATUS_BUSY; END_IF // Cech-Comment: Die Zeitüberwachung hat für die Aushebeeinheit eigentlich nur sehr bedingt Sinn!?, weil ja nur gesteuert wird; Ist wahrscheinlich mehr ein Bypass (* Zeitüberwachung Eingefahren*) // IF (gTisch_6.Times.Aushebeeinheit_EinZeit = TRUE AND gTisch_6.Status.Aushebeeinheit <> STATUS_EINGEFAHREN) OR (gTisch_6.Times.Aushebeeinheit_AusZeit = TRUE AND gTisch_6.Status.Aushebeeinheit <> STATUS_AUSGEFAHREN) THEN // gTisch_6.Times.Aushebeeinheit_ZeitRun := gTisch_6.Times.Aushebeeinheit_ZeitRun + (RTInfo_0.cycle_time/1000); // IF (gTisch_6.Times.Aushebeeinheit_EinZeit = TRUE AND gTisch_6.Status.Aushebeeinheit = STATUS_EINGEFAHREN) // OR (gTisch_6.Times.Aushebeeinheit_AusZeit = TRUE AND gTisch_6.Status.Aushebeeinheit = STATUS_AUSGEFAHREN)THEN // (* lPortal_Mittelanschlag_EinZeit := FALSE; // lPortal_Mittelanschlag_AusZeit := FALSE; *) // gTisch_6.Times.Aushebeeinheit_ZeitRun := 0; // END_IF // IF gTisch_6.Times.Aushebeeinheit_ZeitRun >= 5000 THEN // gTisch_6.Status.Aushebeeinheit := STATUS_ERROR; //// gMerker_Tisch_6_Ausgehoben := FALSE; //Cech-Implement: Für Opc-Ua-Übergabe an Centurio, ob Aushebeeinheit in Position ist // IF gTisch_6.Times.Aushebeeinheit_EinZeit = TRUE THEN // gError[0] := 1; // END_IF // IF gTisch_6.Times.Aushebeeinheit_AusZeit = TRUE THEN // gError[1] := 1; // END_IF // END_IF // ELSE // gTisch_6.Times.Aushebeeinheit_ZeitRun := 0; // END_IF END_PROGRAM PROGRAM _EXIT (* Insert code here *) END_PROGRAM