
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

