Browse Source

Umstellung RFID auf die UID des Tags; AUtomatische-LAserung mit HAndshake zum Centurio; DZ ev. begonnen

jcech 2 years ago
parent
commit
f3cbce0b3f

+ 32 - 13
Logical/Global.var

@@ -22,7 +22,11 @@ VAR
 	gKurve_4 : Kurve_4_Typ;
 	gMerker_block_RFID_read_Tisch_6 : BOOL;
 	gMerker_Cech_Test_Counter : USINT;
+	gMerker_Debug_Test_Counter : UINT; (*Cech-Comment: Variable zum Debuggen, Testen*)
+	gMerker_Debug_Test_Counter_RFID : UINT; (*Cech-Comment: Variable zum Debuggen, Testen der RFID*)
 	gMerker_Laser_Automatik : BOOL;
+	gMerker_Laser_Doppelzylinder : BOOL; (*Cech-Implement: Centurio fordert aus dem Produktcode eine Doppellaserung für einen Doppelzylinder*)
+	gMerker_Laser_Einstellen_fertig : BOOL; (*Cech-Implement: Laser ist fertig eingestellt mit LAserfile und Seriennummer und bereit für das Startsignal von Linien-SPS "gVK_Start_Laser"*)
 	gMerker_Laser_Halbautomatik : BOOL;
 	gMerker_Laser_Manuell : BOOL;
 	gMerker_Liftgate_entriegelt : BOOL;
@@ -53,58 +57,73 @@ VAR
 	gMerker_Tisch_1_Auftrag_Lesen : BOOL;
 	gMerker_Tisch_1_lesen_fertig : BOOL;
 	gMerker_Tisch_1_RFID_Reset : BOOL;
+	gMerker_Tisch_1_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_1_RFID_Vorhanden : BOOL;
+	gMerker_Tisch_1_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_2_alles_nullen : BOOL;
 	gMerker_Tisch_2_Auftrag_Lesen : BOOL;
 	gMerker_Tisch_2_lesen_fertig : BOOL;
 	gMerker_Tisch_2_RFID_Reset : BOOL;
+	gMerker_Tisch_2_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_2_RFID_Vorhanden : BOOL;
+	gMerker_Tisch_2_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_3_alles_nullen : BOOL;
 	gMerker_Tisch_3_Auftrag_Lesen : BOOL;
 	gMerker_Tisch_3_lesen_fertig : BOOL;
 	gMerker_Tisch_3_RFID_Reset : BOOL;
+	gMerker_Tisch_3_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_3_RFID_Vorhanden : BOOL;
+	gMerker_Tisch_3_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_4_alles_nullen : BOOL;
 	gMerker_Tisch_4_Auftrag_Lesen : BOOL;
 	gMerker_Tisch_4_lesen_fertig : BOOL;
 	gMerker_Tisch_4_RFID_Reset : BOOL;
+	gMerker_Tisch_4_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_4_RFID_Vorhanden : BOOL;
+	gMerker_Tisch_4_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_5_alles_nullen : BOOL;
 	gMerker_Tisch_5_Auftrag_Lesen : BOOL;
 	gMerker_Tisch_5_lesen_fertig : BOOL;
 	gMerker_Tisch_5_RFID_Reset : BOOL;
+	gMerker_Tisch_5_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_5_RFID_Vorhanden : BOOL;
+	gMerker_Tisch_5_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_6_alles_nullen : BOOL;
 	gMerker_Tisch_6_Auftrag_Lesen : BOOL;
+	gMerker_Tisch_6_Ausgehoben : BOOL; (*Cech-Implement*)
 	gMerker_Tisch_6_lesen_fertig : BOOL;
 	gMerker_Tisch_6_RFID_Reset : BOOL;
+	gMerker_Tisch_6_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_6_RFID_Vorhanden : BOOL;
+	gMerker_Tisch_6_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_7_alles_nullen : BOOL;
 	gMerker_Tisch_7_Auftrag_Lesen : BOOL;
 	gMerker_Tisch_7_lesen_fertig : BOOL;
 	gMerker_Tisch_7_RFID_Reset : BOOL;
+	gMerker_Tisch_7_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_7_RFID_Vorhanden : BOOL;
+	gMerker_Tisch_7_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_8_alles_nullen : BOOL;
 	gMerker_Tisch_8_Auftrag_Lesen : BOOL;
 	gMerker_Tisch_8_lesen_fertig : BOOL;
 	gMerker_Tisch_8_RFID_Reset : BOOL;
+	gMerker_Tisch_8_RFID_UID_STR : STRING[24]; (*Cech-Implement*)
 	gMerker_Tisch_8_RFID_Vorhanden : BOOL;
-	gSensor_Balluff_IO_Link_Read : ARRAY[0..9] OF USINT;
-	gSensor_Balluff_IO_Link_Write : ARRAY[0..9] OF USINT;
+	gMerker_Tisch_8_STRING_HELPER : STRING[24]; (*Cech-Implement*)
 	gTaster_Liftgate_Leuchte_Gruen : BOOL;
 	gTaster_Liftgate_Leuchte_Rot : BOOL;
 	gTaster_Liftgate_oeffnen : BOOL;
 	gTaster_Liftgate_verriegeln : BOOL;
 END_VAR
 VAR RETAIN
-	gTaster_Tisch_1_aus : BOOL;
-	gTaster_Tisch_2_aus : BOOL;
-	gTaster_Tisch_3_aus : BOOL;
-	gTaster_Tisch_4_aus : BOOL;
-	gTaster_Tisch_5_aus : BOOL;
-	gTaster_Tisch_6_aus : BOOL;
-	gTaster_Tisch_7_aus : BOOL;
-	gTaster_Tisch_8_aus : BOOL;
+	gTaster_Tisch_1_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
+	gTaster_Tisch_2_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
+	gTaster_Tisch_3_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
+	gTaster_Tisch_4_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
+	gTaster_Tisch_5_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
+	gTaster_Tisch_6_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
+	gTaster_Tisch_7_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
+	gTaster_Tisch_8_aus : BOOL; (*Cech-Comment: Das sind die Soft-Switches am Hauptpanel, wo die jeweilige Station aktiviert und deaktiviert werden kann*)
 END_VAR
 VAR
 	gTisch_1 : Tisch_1_Typ;
@@ -131,13 +150,14 @@ VAR
 	gTisch_8 : Tisch_8_Typ;
 	gTisch_8_RFID_Read : ARRAY[0..9] OF USINT;
 	gTisch_8_RFID_Write : ARRAY[0..9] OF USINT;
-	gVK_Absaugung : BOOL := TRUE; (*//Cech-Implement: Zum Aktivieren und Deaktivieren der Absaugung über den Control-Panel-PC*)
+	gVK_Absaugung : BOOL := TRUE; (*Cech-Implement: Zum Aktivieren und Deaktivieren der Absaugung über den Control-Panel-PC*)
 	gVK_Aushebeeinheit_Tisch_6 : BOOL;
 	gVK_doppelt_Lasern : BOOL;
-	gVK_Freigabe_manuell : BOOL;
+	gVK_Freigabe_manuell : BOOL; (*Cech-Comment: TAster auf dem Haupt-Panel; wird über OPC-UA übergeben*)
 	gVK_Start_Laser : BOOL;
 	gVK_Stopper_Tisch_6 : BOOL;
 	gVK_Vorstopper_Tisch_6 : BOOL;
+	i : USINT;
 END_VAR
 VAR CONSTANT
 	KMD_AUSFAHREN : USINT := 2;
@@ -157,7 +177,6 @@ VAR
 	Liftgate_oeffnen : USINT;
 	OPCUATEST2 : USINT;
 	OPCUATEST3 : STRING[80];
-	OPCUA_TEST4 : USINT;
 	OPCUA_TEST_1 : USINT;
 	RFID_Schreiben : USINT;
 	Rot_blinken : USINT;

+ 206 - 39
Logical/RFID/Main.st

@@ -12,11 +12,14 @@ PROGRAM _CYCLIC
 	
 	(* Lesen *)
 
-	gMerker_Tisch_1_RFID_Vorhanden := gTisch_1_RFID_Read[0].0; (* Auslesen ob Chip vor Lesekopf *)
+	gMerker_Tisch_1_RFID_Vorhanden := gTisch_1_RFID_Read[0].0; (* Auslesen ob Chip vor Lesekopf *) //Cech-Comment: Wenn dieses Bit gesetzt ist, dann ist ein Datenträger im LEsebereich
 	
+	
+	//Cech-Comment: Diese zehn Integer-Werte sind im Balluff-Manual MAN_BIS_M_4XX_045_... Kap.9.2 S48 beschrieben
+	// Die TAG-UID wird automatisch nach einem TAG-PResent vom Lesekopf ausgelesen und in das LEseregister geschrieben; da braucht kein LEsebefehl ausgegeben werden
 	IF gMerker_Tisch_1_Auftrag_Lesen = TRUE THEN
 		//			gMerker_Lesen_Fertig := FALSE;
-		gTisch_1_RFID_Write[1] := 1;(* Befehl Datenträger lesen *)
+		gTisch_1_RFID_Write[1] := 1;(* Befehl Datenträger lesen *) 
 		gTisch_1_RFID_Write[2] := 0;
 		gTisch_1_RFID_Write[3] := 0;
 		gTisch_1_RFID_Write[4] := 8;  (* Anzahl Bytes Lowbytes *)
@@ -25,7 +28,7 @@ PROGRAM _CYCLIC
 		gTisch_1_RFID_Write[7] := 0;
 		gTisch_1_RFID_Write[8] := 0;
 		gTisch_1_RFID_Write[9] := 1;
-		gTisch_1_RFID_Write[0].0 := TRUE;
+		gTisch_1_RFID_Write[0].0 := TRUE; (*Cech: Bit0: nuer Auftrag an Reader, Bit2:Reset, Bit5:Kopfabschaltung, Bit6: Toggeln für längere Abfragen/Aufträge, wenn SPS bereit ist, weitere Daten zu übernehmen*)
 	END_IF
 	   
 	(* Schreiben *)	
@@ -60,21 +63,56 @@ PROGRAM _CYCLIC
 	gTisch_1_RFID_Write[9] := gTisch_1_RFID_Write[0];
 	
 	CASE Tisch_1_RFID OF
-		
-		0:
-			IF gMerker_Tisch_1_RFID_Vorhanden  = TRUE AND gTisch_1.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_1_RFID_Reset = FALSE (*AND gMerker_Tisch_1_lesen_fertig = FALSE*) THEN
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_1_RFID_Read[0] = 129 AND gTisch_1_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde, dann liefert der TAG automatisch die UID zurück
+				gMerker_Debug_Test_Counter_RFID := 00; 		//Cech-Comment: eingefügt für TEstzwecke
+															//				gMerker_Tisch_1_RFID_UID[0] := gTisch_1_RFID_Read[1];
+															//				gMerker_Tisch_1_RFID_UID[1] := gTisch_1_RFID_Read[2];
+															//				gMerker_Tisch_1_RFID_UID[2] := gTisch_1_RFID_Read[3];
+															//				gMerker_Tisch_1_RFID_UID[3] := gTisch_1_RFID_Read[4];
+															//				gMerker_Tisch_1_RFID_UID[4] := gTisch_1_RFID_Read[5];
+															//				gMerker_Tisch_1_RFID_UID[5] := gTisch_1_RFID_Read[6];
+															//				gMerker_Tisch_1_RFID_UID[6] := gTisch_1_RFID_Read[7];
+															//				gMerker_Tisch_1_RFID_UID[7] := gTisch_1_RFID_Read[8];
+															//				gMerker_Tisch_1_RFID_UID_STRARR[0] := USINT_TO_STRING (gTisch_1_RFID_Read[1]);
+															//				gMerker_Tisch_1_RFID_UID_STRARR[1] := USINT_TO_STRING (gTisch_1_RFID_Read[2]);
+															//				gMerker_Tisch_1_RFID_UID_STRARR[2] := USINT_TO_STRING (gTisch_1_RFID_Read[3]);
+															//				gMerker_Tisch_1_RFID_UID_STRARR[3] := USINT_TO_STRING (gTisch_1_RFID_Read[4]);
+															//				gMerker_Tisch_1_RFID_UID_STRARR[4] := USINT_TO_STRING (gTisch_1_RFID_Read[5]);
+															//				gMerker_Tisch_1_RFID_UID_STRARR[5] := USINT_TO_STRING (gTisch_1_RFID_Read[6]);
+															//				gMerker_Tisch_1_RFID_UID_STRARR[6] := USINT_TO_STRING (gTisch_1_RFID_Read[7]);
+															//				gMerker_Tisch_1_RFID_UID_STRARR[7] := USINT_TO_STRING (gTisch_1_RFID_Read[8]);
+				gMerker_Tisch_1_STRING_HELPER := '';
+				gMerker_Tisch_1_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_1_STRING_HELPER := USINT_TO_STRING (gTisch_1_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_1_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_1_STRING_HELPER := CONCAT('00', gMerker_Tisch_1_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_1_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_1_STRING_HELPER := CONCAT('0', gMerker_Tisch_1_STRING_HELPER);
+					END_IF;
+					gMerker_Tisch_1_RFID_UID_STR := CONCAT( gMerker_Tisch_1_RFID_UID_STR, gMerker_Tisch_1_STRING_HELPER );
+				END_FOR
+				Tisch_1_RFID := 5;
+			END_IF
+//Cech-Implement-Ende
+			
+		5:	IF gMerker_Tisch_1_RFID_Vorhanden  = TRUE AND gMerker_Tisch_1_RFID_Reset = FALSE (*AND gMerker_Tisch_1_lesen_fertig = FALSE*) THEN
+				gMerker_Debug_Test_Counter_RFID := 05; 		//Cech-Comment: eingefügt für TEstzwecke
 				gMerker_Tisch_1_Auftrag_Lesen := TRUE;
 				Tisch_1_RFID := 10;
 			END_IF
 		
 		10: lWarten_RFID_Fehler_Tisch_1 := lWarten_RFID_Fehler_Tisch_1 + (RTInfo_0.cycle_time/1000);
-			IF gTisch_1_RFID_Read[0] = 135 THEN
+			IF gTisch_1_RFID_Read[0] = 135 THEN		//135 : 1000 0111 / Cech-Comment: Bit: 0...Tag im Lesebereich, 1...Auftragsbearbeitung läuft, 2...Auftrag fehlerlos beendet, 3...Auftrag fehlerhaft bearbeitet, 5...Wenn toggelt: Sensor bereit, weitere Daten zu übermitteln, 6...Sensor abgeschaltet, 7...Sensor bereit
+				gMerker_Debug_Test_Counter_RFID := 10; 		//Cech-Comment: eingefügt für TEstzwecke
 				gMerker_RFID_Value_Tisch_1 := gTisch_1_RFID_Read[1];
-	//			gMerker_RFID_Tisch_1_gelesen := TRUE;
-	//			gMerker_Tisch_1_lesen_fertig := TRUE;
+				//			gMerker_RFID_Tisch_1_gelesen := TRUE;
+				//			gMerker_Tisch_1_lesen_fertig := TRUE;
 				lWarten_RFID_Fehler_Tisch_1 := 0;
 				Tisch_1_RFID := 15;
-			ELSIF lWarten_RFID_Fehler_Tisch_1 >= 5000 AND gTisch_1_RFID_Read[0] <> 135 THEN
+			ELSIF lWarten_RFID_Fehler_Tisch_1 >= 5000 AND gTisch_1_RFID_Read[0] <> 135 THEN	//Wenn nach 5s noch keine fehlerfreie Rückmeldung vom LEser gekommen ist, dann wird der Leser resetiert und alles wieder rückgesetzt ab 100: 
+				gMerker_Debug_Test_Counter_RFID := 11; 		//Cech-Comment: eingefügt für TEstzwecke
 				gMerker_Tisch_1_Auftrag_Lesen := FALSE;
 				gMerker_Tisch_1_RFID_Reset := TRUE;
 				lWarten_RFID_Fehler_Tisch_1 := 0;
@@ -82,45 +120,54 @@ PROGRAM _CYCLIC
 			END_IF
 		
 		15:
-			IF gMerker_RFID_Value_Tisch_1 <> 0 THEN
+			IF gMerker_RFID_Value_Tisch_1 <> 0 THEN		//ungleich 0 von gTisch_1_RFID_Read[1] bedeutet einen Fehlercode; ohne Fehler muss das 00h sein
+				gMerker_Debug_Test_Counter_RFID := 15; 		//Cech-Comment: eingefügt für TEstzwecke
 				gMerker_RFID_Tisch_1_gelesen := TRUE;
 				gMerker_Tisch_1_lesen_fertig := TRUE;
 				Tisch_1_RFID := 20;
-			ELSIF gMerker_RFID_Value_Tisch_1 = 0 THEN
-					gMerker_RFID_Tisch_1_gelesen := FALSE;
-					gMerker_Tisch_1_lesen_fertig := FALSE;
-					Tisch_1_RFID := 100;
+			ELSIF gMerker_RFID_Value_Tisch_1 = 0 THEN		//kein Fehler beim Lesen
+				gMerker_Debug_Test_Counter_RFID := 16; 		//Cech-Comment: eingefügt für TEstzwecke
+				gMerker_RFID_Tisch_1_gelesen := FALSE;
+				gMerker_Tisch_1_lesen_fertig := FALSE;
+				Tisch_1_RFID := 100;
 			END_IF				
 			
 		20: lWarten_fuer_OPCUA_Tisch_1 := lWarten_fuer_OPCUA_Tisch_1 + (RTInfo_0.cycle_time/1000);
 			IF gMerker_Tisch_1_RFID_Vorhanden = FALSE AND gTisch_1.Inputs.Vor_Stopper = FALSE AND lWarten_fuer_OPCUA_Tisch_1 >= Wartezeit_OPCUA THEN
+				gMerker_Debug_Test_Counter_RFID := 20; 		//Cech-Comment: eingefügt für TEstzwecke
 				gMerker_Tisch_1_Auftrag_Lesen := FALSE;
 				gMerker_RFID_Value_Tisch_1 := 0;
-				gTisch_1_RFID_Write[0] := 4;
+				gTisch_1_RFID_Write[0] := 4;		//SW-Reset des RFID-Sensors
+				gMerker_Tisch_1_RFID_UID_STR := '0';
 				Tisch_1_RFID := 30;
 			END_IF
 		
 		30: 
 			IF gTisch_1_RFID_Read[0] = 0 THEN
+				gMerker_Debug_Test_Counter_RFID := 30; 		//Cech-Comment: eingefügt für TEstzwecke
 				gTisch_1_RFID_Write[0] := 0;
 				Tisch_1_RFID := 0;
 			END_IF
 		
-		100:
+		100:			//Hier geht es weiter, wenn die Daten fehlerfrei empfangen wurden
 			IF gMerker_Tisch_1_Auftrag_Lesen = FALSE AND gMerker_Tisch_1_RFID_Reset = TRUE THEN
-				gTisch_1_RFID_Write[0] := 4;
+				gMerker_Debug_Test_Counter_RFID := 100; 		//Cech-Comment: eingefügt für TEstzwecke
+				gTisch_1_RFID_Write[0] := 4;		//SW-Reset des RFID-Sensors
 				gMerker_RFID_Value_Tisch_1 := 0;
+				gMerker_Tisch_1_RFID_UID_STR := '0';
 				Tisch_1_RFID := 110;
 			END_IF
 		
 		110:
 			IF gTisch_1_RFID_Read[0] = 0 THEN
+				gMerker_Debug_Test_Counter_RFID := 110; 		//Cech-Comment: eingefügt für TEstzwecke
 				gMerker_Tisch_1_alles_nullen := TRUE;
 				Tisch_1_RFID := 120;
 			END_IF
 		
 		120:
 			IF gTisch_1_RFID_Write[0] = 0 AND gTisch_1_RFID_Write[1] = 0 AND gTisch_1_RFID_Write[2] = 0 AND gTisch_1_RFID_Write[3] = 0 AND gTisch_1_RFID_Write[4] = 0 AND gTisch_1_RFID_Write[5] = 0 AND gTisch_1_RFID_Write[6] = 0 AND gTisch_1_RFID_Write[7] = 0 AND gTisch_1_RFID_Write[8] = 0 AND gTisch_1_RFID_Write[9] = 0 THEN
+				gMerker_Debug_Test_Counter_RFID := 120; 		//Cech-Comment: eingefügt für TEstzwecke
 				gMerker_Tisch_1_alles_nullen := FALSE;
 				gMerker_Tisch_1_RFID_Reset := FALSE;
 				Tisch_1_RFID := 0;
@@ -135,7 +182,7 @@ PROGRAM _CYCLIC
 			
 			0:
 			IF gMerker_Tisch_1_RFID_Vorhanden = TRUE AND gMerker_OPCUA_Schreibauftrag = TRUE AND gMerker_Tisch_1_lesen_fertig = TRUE THEN
-				gTisch_1_RFID_Write[0] := 4;
+				gTisch_1_RFID_Write[0] := 4;		// Kopf-Reset
 				RFID_Schreiben := 10;
 			END_IF
 			
@@ -153,7 +200,7 @@ PROGRAM _CYCLIC
 			END_IF
 			
 			30: 
-			IF gTisch_1_RFID_Read[0] = 163 THEN
+			IF gTisch_1_RFID_Read[0] = 163 THEN				//163 : 10100011  betriebsbereit; toggelbit zeigt an dass Kopf bereit weitere Daten zu übermitteln; Auftrag erkannt und entgegengenommen; Datenträger im Lesebereich;
 				gMerker_neuen_Befehl_schreiben := FALSE;	
 				gMerker_Tisch_1_alles_nullen := TRUE;
 				RFID_Schreiben := 40;
@@ -170,12 +217,12 @@ PROGRAM _CYCLIC
 				gTisch_1_RFID_Write[6] := 0;
 				gTisch_1_RFID_Write[7] := 0; 
 				gTisch_1_RFID_Write[8] := 0;
-				gTisch_1_RFID_Write[0] := 65;
+				gTisch_1_RFID_Write[0] := 65;  //65: 0100 0001  das obere Bit zeigt an, durch Toggelung, dass die Linien-SPS bereit ist, Daten vom Kopf zu empfangen
 				RFID_Schreiben := 50;
 			END_IF
 					
 			50:
-			IF gTisch_1_RFID_Read[0] = 167 THEN
+			IF gTisch_1_RFID_Read[0] = 167 THEN				//167 1010 0111, Kopf bereit;Kopf bereit für neue Daten; Auftrag ohne Fehler beendet; Auftrag erkannt und entgegengenommen; Datenträger im LEsebereich des Kopfes
 				gMerker_Tisch_1_alles_nullen := TRUE;
 				RFID_Schreiben := 60;
 			END_IF
@@ -234,9 +281,24 @@ PROGRAM _CYCLIC
 	gTisch_2_RFID_Write[9] := gTisch_2_RFID_Write[0];
 	
 	CASE Tisch_2_RFID OF
-		
-		0:
-			IF gMerker_Tisch_2_RFID_Vorhanden  = TRUE AND gTisch_2.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_2_RFID_Reset = FALSE (*AND gMerker_Tisch_2_lesen_fertig = FALSE*) THEN
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_2_RFID_Read[0] = 129 AND gTisch_2_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde
+				gMerker_Tisch_2_STRING_HELPER := '';
+				gMerker_Tisch_2_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_2_STRING_HELPER := USINT_TO_STRING (gTisch_2_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_2_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_2_STRING_HELPER := CONCAT('00', gMerker_Tisch_2_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_2_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_2_STRING_HELPER := CONCAT('0', gMerker_Tisch_2_STRING_HELPER);
+					END_IF;
+					gMerker_Tisch_2_RFID_UID_STR := CONCAT( gMerker_Tisch_2_RFID_UID_STR, gMerker_Tisch_2_STRING_HELPER );
+				END_FOR
+				Tisch_2_RFID := 5;
+			END_IF
+//Cech-Implement-Ende
+
+		5:	IF gMerker_Tisch_2_RFID_Vorhanden  = TRUE AND gTisch_2.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_2_RFID_Reset = FALSE (*AND gMerker_Tisch_2_lesen_fertig = FALSE*) THEN
 				gMerker_Tisch_2_Auftrag_Lesen := TRUE;
 				Tisch_2_RFID := 10;
 			END_IF
@@ -271,6 +333,7 @@ PROGRAM _CYCLIC
 				gMerker_Tisch_2_Auftrag_Lesen := FALSE;
 				gMerker_RFID_Value_Tisch_2 := 0;
 				gTisch_2_RFID_Write[0] := 4;
+				gMerker_Tisch_2_RFID_UID_STR := '0';
 				Tisch_2_RFID := 30;
 			END_IF
 		
@@ -285,6 +348,7 @@ PROGRAM _CYCLIC
 				gTisch_2_RFID_Write[0] := 4;
 				gMerker_RFID_Value_Tisch_2 := 0;
 				Tisch_2_RFID := 110;
+				gMerker_Tisch_2_RFID_UID_STR := '0';
 			END_IF
 		
 		110:
@@ -340,9 +404,24 @@ PROGRAM _CYCLIC
 	gTisch_3_RFID_Write[9] := gTisch_3_RFID_Write[0];
 	
 	CASE Tisch_3_RFID OF
-		
-		0:
-			IF gMerker_Tisch_3_RFID_Vorhanden  = TRUE AND gTisch_3.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_3_RFID_Reset = FALSE (*AND gMerker_Tisch_3_lesen_fertig = FALSE*) THEN
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_3_RFID_Read[0] = 129 AND gTisch_3_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde
+				gMerker_Tisch_3_STRING_HELPER := '';
+				gMerker_Tisch_3_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_3_STRING_HELPER := USINT_TO_STRING (gTisch_3_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_3_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_3_STRING_HELPER := CONCAT('00', gMerker_Tisch_3_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_3_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_3_STRING_HELPER := CONCAT('0', gMerker_Tisch_3_STRING_HELPER);
+					END_IF;
+					gMerker_Tisch_3_RFID_UID_STR := CONCAT( gMerker_Tisch_3_RFID_UID_STR, gMerker_Tisch_3_STRING_HELPER );
+				END_FOR
+				Tisch_3_RFID := 5;
+			END_IF
+//Cech-Implement-Ende		
+
+		5:	IF gMerker_Tisch_3_RFID_Vorhanden  = TRUE AND gTisch_3.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_3_RFID_Reset = FALSE (*AND gMerker_Tisch_3_lesen_fertig = FALSE*) THEN
 				gMerker_Tisch_3_Auftrag_Lesen := TRUE;
 				Tisch_3_RFID := 10;
 			END_IF
@@ -377,6 +456,7 @@ PROGRAM _CYCLIC
 				gMerker_Tisch_3_Auftrag_Lesen := FALSE;
 				gMerker_RFID_Value_Tisch_3 := 0;
 				gTisch_3_RFID_Write[0] := 4;
+				gMerker_Tisch_3_RFID_UID_STR := '0';
 				Tisch_3_RFID := 30;
 			END_IF
 		
@@ -390,6 +470,7 @@ PROGRAM _CYCLIC
 			IF gMerker_Tisch_3_Auftrag_Lesen = FALSE AND gMerker_Tisch_3_RFID_Reset = TRUE THEN
 				gTisch_3_RFID_Write[0] := 4;
 				gMerker_RFID_Value_Tisch_3 := 0;
+				gMerker_Tisch_3_RFID_UID_STR := '0';
 				Tisch_3_RFID := 110;
 			END_IF
 		
@@ -445,9 +526,24 @@ PROGRAM _CYCLIC
 	gTisch_4_RFID_Write[9] := gTisch_4_RFID_Write[0];
 	
 	CASE Tisch_4_RFID OF
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_4_RFID_Read[0] = 129 AND gTisch_4_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde
+				gMerker_Tisch_4_STRING_HELPER := '';
+				gMerker_Tisch_4_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_4_STRING_HELPER := USINT_TO_STRING (gTisch_4_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_4_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_4_STRING_HELPER := CONCAT('00', gMerker_Tisch_4_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_4_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_4_STRING_HELPER := CONCAT('0', gMerker_Tisch_4_STRING_HELPER);
+					END_IF;
+					gMerker_Tisch_4_RFID_UID_STR := CONCAT( gMerker_Tisch_4_RFID_UID_STR, gMerker_Tisch_4_STRING_HELPER );
+				END_FOR
+				Tisch_4_RFID := 5;
+			END_IF
+//Cech-Implement-Ende		
 		
-		0:
-			IF gMerker_Tisch_4_RFID_Vorhanden  = TRUE AND gTisch_4.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_4_RFID_Reset = FALSE (*AND gMerker_Tisch_4_lesen_fertig = FALSE*) THEN
+		5:	IF gMerker_Tisch_4_RFID_Vorhanden  = TRUE AND gTisch_4.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_4_RFID_Reset = FALSE (*AND gMerker_Tisch_4_lesen_fertig = FALSE*) THEN
 				gMerker_Tisch_4_Auftrag_Lesen := TRUE;
 				Tisch_4_RFID := 10;
 			END_IF
@@ -482,6 +578,7 @@ PROGRAM _CYCLIC
 				gMerker_Tisch_4_Auftrag_Lesen := FALSE;
 				gMerker_RFID_Value_Tisch_4 := 0;
 				gTisch_4_RFID_Write[0] := 4;
+				gMerker_Tisch_4_RFID_UID_STR := '0';
 				Tisch_4_RFID := 30;
 			END_IF
 		
@@ -495,6 +592,7 @@ PROGRAM _CYCLIC
 			IF gMerker_Tisch_4_Auftrag_Lesen = FALSE AND gMerker_Tisch_4_RFID_Reset = TRUE THEN
 				gTisch_4_RFID_Write[0] := 4;
 				gMerker_RFID_Value_Tisch_4 := 0;
+				gMerker_Tisch_4_RFID_UID_STR := '0';
 				Tisch_4_RFID := 110;
 			END_IF
 		
@@ -550,9 +648,24 @@ PROGRAM _CYCLIC
 	gTisch_5_RFID_Write[9] := gTisch_5_RFID_Write[0];
 	
 	CASE Tisch_5_RFID OF
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_5_RFID_Read[0] = 129 AND gTisch_5_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde
+				gMerker_Tisch_5_STRING_HELPER := '';
+				gMerker_Tisch_5_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_5_STRING_HELPER := USINT_TO_STRING (gTisch_5_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_5_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_5_STRING_HELPER := CONCAT('00', gMerker_Tisch_5_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_5_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_5_STRING_HELPER := CONCAT('0', gMerker_Tisch_5_STRING_HELPER);
+					END_IF;
+					gMerker_Tisch_5_RFID_UID_STR := CONCAT( gMerker_Tisch_5_RFID_UID_STR, gMerker_Tisch_5_STRING_HELPER );
+				END_FOR
+				Tisch_5_RFID := 5;
+			END_IF
+//Cech-Implement-Ende		
 		
-		0:
-			IF gMerker_Tisch_5_RFID_Vorhanden  = TRUE AND gTisch_5.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_5_RFID_Reset = FALSE (*AND gMerker_Tisch_5_lesen_fertig = FALSE*) THEN
+		5:	IF gMerker_Tisch_5_RFID_Vorhanden  = TRUE AND gTisch_5.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_5_RFID_Reset = FALSE (*AND gMerker_Tisch_5_lesen_fertig = FALSE*) THEN
 				gMerker_Tisch_5_Auftrag_Lesen := TRUE;
 				Tisch_5_RFID := 10;
 			END_IF
@@ -587,6 +700,7 @@ PROGRAM _CYCLIC
 				gMerker_Tisch_5_Auftrag_Lesen := FALSE;
 				gMerker_RFID_Value_Tisch_5 := 0;
 				gTisch_5_RFID_Write[0] := 4;
+				gMerker_Tisch_5_RFID_UID_STR := '0';
 				Tisch_5_RFID := 30;
 			END_IF
 		
@@ -600,6 +714,7 @@ PROGRAM _CYCLIC
 			IF gMerker_Tisch_5_Auftrag_Lesen = FALSE AND gMerker_Tisch_5_RFID_Reset = TRUE THEN
 				gTisch_5_RFID_Write[0] := 4;
 				gMerker_RFID_Value_Tisch_5 := 0;
+				gMerker_Tisch_5_RFID_UID_STR := '0';
 				Tisch_5_RFID := 110;
 			END_IF
 		
@@ -655,9 +770,24 @@ PROGRAM _CYCLIC
 	gTisch_6_RFID_Write[9] := gTisch_6_RFID_Write[0];
 	
 	CASE Tisch_6_RFID OF
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_6_RFID_Read[0] = 129 AND gTisch_6_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde
+				gMerker_Tisch_6_STRING_HELPER := '';
+				gMerker_Tisch_6_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_6_STRING_HELPER := USINT_TO_STRING (gTisch_6_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_6_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_6_STRING_HELPER := CONCAT('00', gMerker_Tisch_6_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_6_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_6_STRING_HELPER := CONCAT('0', gMerker_Tisch_6_STRING_HELPER);
+					END_IF;
+					gMerker_Tisch_6_RFID_UID_STR := CONCAT( gMerker_Tisch_6_RFID_UID_STR, gMerker_Tisch_6_STRING_HELPER );
+				END_FOR
+				Tisch_6_RFID := 5;
+			END_IF
+//Cech-Implement-Ende		
 		
-		0:
-			IF gMerker_Tisch_6_RFID_Vorhanden  = TRUE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_6_RFID_Reset = FALSE AND gMerker_block_RFID_read_Tisch_6 = FALSE (*AND gMerker_Tisch_6_lesen_fertig = FALSE*) THEN
+		5:	IF gMerker_Tisch_6_RFID_Vorhanden  = TRUE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_6_RFID_Reset = FALSE AND gMerker_block_RFID_read_Tisch_6 = FALSE (*AND gMerker_Tisch_6_lesen_fertig = FALSE*) THEN
 				gMerker_Tisch_6_Auftrag_Lesen := TRUE;
 				Tisch_6_RFID := 10;
 			END_IF
@@ -692,6 +822,7 @@ PROGRAM _CYCLIC
 				gMerker_Tisch_6_Auftrag_Lesen := FALSE;
 	//			gMerker_RFID_Value_Tisch_6 := 0;
 				gTisch_6_RFID_Write[0] := 4;
+				gMerker_Tisch_6_RFID_UID_STR := '0';
 				Tisch_6_RFID := 30;
 			END_IF
 		
@@ -705,6 +836,7 @@ PROGRAM _CYCLIC
 			IF gMerker_Tisch_6_Auftrag_Lesen = FALSE AND gMerker_Tisch_6_RFID_Reset = TRUE THEN
 				gTisch_6_RFID_Write[0] := 4;
 		//		gMerker_RFID_Value_Tisch_6 := 0;
+				gMerker_Tisch_6_RFID_UID_STR := '0';
 				Tisch_6_RFID := 110;
 			END_IF
 		
@@ -760,9 +892,24 @@ PROGRAM _CYCLIC
 	gTisch_7_RFID_Write[9] := gTisch_7_RFID_Write[0];
 	
 	CASE Tisch_7_RFID OF
-		
-		0:
-			IF gMerker_Tisch_7_RFID_Vorhanden  = TRUE AND gTisch_7.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_7_RFID_Reset = FALSE (*AND gMerker_Tisch_7_lesen_fertig = FALSE*) THEN
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_7_RFID_Read[0] = 129 AND gTisch_7_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde
+				gMerker_Tisch_7_STRING_HELPER := '';
+				gMerker_Tisch_7_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_7_STRING_HELPER := USINT_TO_STRING (gTisch_7_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_7_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_7_STRING_HELPER := CONCAT('00', gMerker_Tisch_7_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_7_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_7_STRING_HELPER := CONCAT('0', gMerker_Tisch_7_STRING_HELPER);
+					END_IF;
+					gMerker_Tisch_7_RFID_UID_STR := CONCAT( gMerker_Tisch_7_RFID_UID_STR, gMerker_Tisch_7_STRING_HELPER );
+				END_FOR
+				Tisch_7_RFID := 5;
+			END_IF
+//Cech-Implement-Ende		
+				
+		5:	IF gMerker_Tisch_7_RFID_Vorhanden  = TRUE AND gTisch_7.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_7_RFID_Reset = FALSE (*AND gMerker_Tisch_7_lesen_fertig = FALSE*) THEN
 				gMerker_Tisch_7_Auftrag_Lesen := TRUE;
 				Tisch_7_RFID := 10;
 			END_IF
@@ -797,6 +944,7 @@ PROGRAM _CYCLIC
 				gMerker_Tisch_7_Auftrag_Lesen := FALSE;
 				gMerker_RFID_Value_Tisch_7 := 0;
 				gTisch_7_RFID_Write[0] := 4;
+				gMerker_Tisch_7_RFID_UID_STR := '0';
 				Tisch_7_RFID := 30;
 			END_IF
 		
@@ -810,6 +958,7 @@ PROGRAM _CYCLIC
 			IF gMerker_Tisch_7_Auftrag_Lesen = FALSE AND gMerker_Tisch_7_RFID_Reset = TRUE THEN
 				gTisch_7_RFID_Write[0] := 4;
 				gMerker_RFID_Value_Tisch_7 := 0;
+				gMerker_Tisch_7_RFID_UID_STR := '0';
 				Tisch_7_RFID := 110;
 			END_IF
 		
@@ -865,9 +1014,25 @@ PROGRAM _CYCLIC
 	gTisch_8_RFID_Write[9] := gTisch_8_RFID_Write[0];
 	
 	CASE Tisch_8_RFID OF
+//Cech-Implement-Beginn: Hier soll die UID aus dem TAg nach Tag-Present rausgeholt und auf 8Byte-Array gMerker_Tisch_1_RFID_UID übergeben werden, damit die UID für Centurio über Opc-Ua übergeben werden kannn
+		0:	IF gTisch_8_RFID_Read[0] = 129 AND gTisch_8_RFID_Write[0].0 = FALSE THEN //Cech-Comment: Wenn der TAG im Lesebereich ist und der Lesekopf betriebsbereit ist ( Read[0] = 1000 0001 ), aber noch kein Lesebefehl ausgegeben wurde
+				gMerker_Tisch_8_STRING_HELPER := '';
+				gMerker_Tisch_8_RFID_UID_STR := '0';
+				FOR i := 1 TO 8 DO
+					gMerker_Tisch_8_STRING_HELPER := USINT_TO_STRING (gTisch_8_RFID_Read[i]);
+					IF LEN(gMerker_Tisch_8_STRING_HELPER) = 1 THEN 			//Cech-Comment: Wenn der String nur 1 ZEichen ist, muss mit 2 Nullen links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_8_STRING_HELPER := CONCAT('00', gMerker_Tisch_8_STRING_HELPER); 
+					ELSIF LEN(gMerker_Tisch_8_STRING_HELPER) = 2 THEN 			//Cech-Comment: Wenn der String nur 2 Zeichen ist, muss mit 1 Null links verlängert werden, sonst wird ID verstümmelt und ist dadurch nicht mehr eindeutig über alle 8 Bytes der UID
+						gMerker_Tisch_8_STRING_HELPER := CONCAT('0', gMerker_Tisch_8_STRING_HELPER);
+					END_IF;
+
+					gMerker_Tisch_8_RFID_UID_STR := CONCAT( gMerker_Tisch_8_RFID_UID_STR, gMerker_Tisch_8_STRING_HELPER );
+				END_FOR
+				Tisch_8_RFID := 5;
+			END_IF
+//Cech-Implement-Ende		
 		
-		0:
-			IF gMerker_Tisch_8_RFID_Vorhanden  = TRUE AND gTisch_8.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_8_RFID_Reset = FALSE (*AND gMerker_Tisch_8_lesen_fertig = FALSE*) THEN
+		5:	IF gMerker_Tisch_8_RFID_Vorhanden  = TRUE AND gTisch_8.Inputs.Vor_Stopper = TRUE AND gMerker_Tisch_8_RFID_Reset = FALSE (*AND gMerker_Tisch_8_lesen_fertig = FALSE*) THEN
 				gMerker_Tisch_8_Auftrag_Lesen := TRUE;
 				Tisch_8_RFID := 10;
 			END_IF
@@ -902,6 +1067,7 @@ PROGRAM _CYCLIC
 				gMerker_Tisch_8_Auftrag_Lesen := FALSE;
 				gMerker_RFID_Value_Tisch_8 := 0;
 				gTisch_8_RFID_Write[0] := 4;
+				gMerker_Tisch_8_RFID_UID_STR := '0';
 				Tisch_8_RFID := 30;
 			END_IF
 		
@@ -915,6 +1081,7 @@ PROGRAM _CYCLIC
 			IF gMerker_Tisch_8_Auftrag_Lesen = FALSE AND gMerker_Tisch_8_RFID_Reset = TRUE THEN
 				gTisch_8_RFID_Write[0] := 4;
 				gMerker_RFID_Value_Tisch_8 := 0;
+				gMerker_Tisch_8_RFID_UID_STR := '0';
 				Tisch_8_RFID := 110;
 			END_IF
 		

+ 11 - 11
Logical/Stationen_Variablen/Tisch_1.typ

@@ -1,20 +1,9 @@
 
 TYPE
-	Tisch_1_Typ : 	STRUCT  (* *) (* *) (*12*)
-		Cmd : Tisch_1_Cmd; (* *) (* *) (*13*)
-		Status : Tisch_1_Status; (* *) (* *) (*14*)
-		Inputs : Tisch_1_Inputs; (* *) (* *) (*15*)
-		Outputs : Tisch_1_Outputs; (* *) (* *) (*16*)
-		Times : Tisch_1_Times; (* *) (* *) (*17*)
-	END_STRUCT;
 	Tisch_1_Cmd : 	STRUCT 
 		Stopper : USINT;
 		Vorstopper : USINT;
 	END_STRUCT;
-	Tisch_1_Status : 	STRUCT 
-		Stopper : USINT;
-		Vorstopper : USINT;
-	END_STRUCT;
 	Tisch_1_Inputs : 	STRUCT 
 		Vor_VorStopper : BOOL;
 		Nach_Vorstopper : BOOL;
@@ -34,6 +23,10 @@ TYPE
 		Vorstopper_ausfahren : BOOL;
 		Lampe_Start : BOOL;
 	END_STRUCT;
+	Tisch_1_Status : 	STRUCT 
+		Stopper : USINT;
+		Vorstopper : USINT;
+	END_STRUCT;
 	Tisch_1_Times : 	STRUCT 
 		Stopper_ZeitRun : UDINT;
 		Stopper_EinZeit : BOOL;
@@ -42,4 +35,11 @@ TYPE
 		Vorstopper_ZeitRun : UDINT;
 		Vorstopper_AusZeit : BOOL;
 	END_STRUCT;
+	Tisch_1_Typ : 	STRUCT  (* *) (* *) (*12*)
+		Cmd : Tisch_1_Cmd; (* *) (* *) (*13*)
+		Status : Tisch_1_Status; (* *) (* *) (*14*)
+		Inputs : Tisch_1_Inputs; (* *) (* *) (*15*)
+		Outputs : Tisch_1_Outputs; (* *) (* *) (*16*)
+		Times : Tisch_1_Times; (* *) (* *) (*17*)
+	END_STRUCT;
 END_TYPE

+ 3 - 3
Logical/Stationen_Variablen/Tisch_2.typ

@@ -20,19 +20,19 @@ TYPE
 		Stopper_eingefahren : BOOL;
 		Vorstopper_ausgefahren : BOOL;
 		Vorstopper_eingefahren : BOOL;
-		Vor_VorStopper : BOOL;
+		Vor_VorStopper : BOOL; (*Cech-Comment: Das sind die Sensoren in den Stoppern*)
 		Nach_Vorstopper : BOOL;
 		Vor_Stopper : BOOL;
 		Nach_Stopper : BOOL;
 		Stausensor : BOOL;
-		Start : BOOL;
+		Start : BOOL; (*Cech-Comment: Das dürfte der grüne Taster sein am PAnel*)
 	END_STRUCT;
 	Tisch_2_Outputs : 	STRUCT 
 		Stopper_ausfahren : BOOL;
 		Stopper_einfahren : BOOL;
 		Vorstopper_einfahren : BOOL;
 		Vorstopper_ausfahren : BOOL;
-		Lampe_Start : BOOL;
+		Lampe_Start : BOOL; (*Cech-Comment: Ich weiß nicht, welches Lämpchen da leuchten soll*)
 	END_STRUCT;
 	Tisch_2_Times : 	STRUCT 
 		Stopper_ZeitRun : UDINT;

+ 28 - 22
Logical/TischProgramme/Tisch2/Main.st

@@ -6,13 +6,15 @@ PROGRAM _INIT
 END_PROGRAM
 
 PROGRAM _CYCLIC
-	
+		
+		//Cech-Comment: Schauen, ob auf einen Tstendruck gewartet wird, und eine Lampe als Signal eingeschaltet werden soll (output in jeder Station, ich weiß nicht, ob das am Terminal ein Lämpchen ist oder Ä) 
 		IF (gTisch_2.Inputs.Vor_Stopper = TRUE AND gTisch_2.Inputs.Stausensor = FALSE AND Tisch_2 = 0) OR (gTisch_2.Inputs.Vor_VorStopper = TRUE AND gTisch_2.Inputs.Vor_Stopper = FALSE AND Tisch_2 = 0) THEN
 			gTisch_2.Outputs.Lampe_Start := TRUE;
 		ELSE
 			gTisch_2.Outputs.Lampe_Start := FALSE;
 		END_IF
 	
+		//Cech-Comment: Wenn die Station generell deaktiviert ist, werden alle STopper eingefahren
 		IF gTaster_Tisch_2_aus = TRUE THEN
 			gTisch_2.Cmd.Stopper := KMD_EINFAHREN;
 			gTisch_2.Cmd.Vorstopper := KMD_EINFAHREN;
@@ -22,96 +24,100 @@ PROGRAM _CYCLIC
 
 	CASE Tisch_2 OF
 
-		0:
+	//Cech-Comment: Mit dem grünen TAster werden entsprechend der Konstellation in der Station die Stopper aus und eingefahren und der RFID-Merker wird geschrieben oder gelöscht
+		0:  
+			//Cech-Comment: Wenn grüne TAste und ein WST in und auch vor der Station, danach frei und der RFID gelesen wurde, dann WST aus der Station entlasse und RFID-VAriable der Station auf ungelesen stellen
 		IF gTisch_2.Inputs.Start = TRUE AND gTisch_2.Inputs.Vor_VorStopper = TRUE AND gTisch_2.Inputs.Vor_Stopper = TRUE AND gTisch_2.Inputs.Stausensor = FALSE AND gTaster_Tisch_2_aus = FALSE AND gMerker_RFID_Tisch_2_gelesen = TRUE THEN
 			gTisch_2.Cmd.Stopper := KMD_EINFAHREN;
 			gMerker_RFID_Tisch_2_gelesen := FALSE;
-			Tisch_2 := 10;
+				Tisch_2 := 10;
+			// Cech-Comment: Wenn grüner TAster und kein WST vor der Station und WST in der Station und keiner nach der Station und RFID gelesen, dann WST entlassen und RFID-Variable der STation auf ungelesen setzen
 		ELSIF gTisch_2.Inputs.Start = TRUE AND gTisch_2.Inputs.Vor_VorStopper = FALSE AND gTisch_2.Inputs.Vor_Stopper = TRUE AND gTisch_2.Inputs.Stausensor = FALSE AND gTaster_Tisch_2_aus = FALSE AND gMerker_RFID_Tisch_2_gelesen = TRUE THEN
 				gTisch_2.Cmd.Stopper := KMD_EINFAHREN;
 				gMerker_RFID_Tisch_2_gelesen := FALSE;
 				Tisch_2 := 70;
+			// Cech-Comment: Wenn grüner TAster und WST vor der Station und kein WST in der Station, dann Vorstopper einfahren
 		ELSIF gTisch_2.Inputs.Start = TRUE AND gTisch_2.Inputs.Vor_VorStopper = TRUE AND gTisch_2.Inputs.Vor_Stopper = FALSE AND gTaster_Tisch_2_aus = FALSE THEN
 				gTisch_2.Cmd.Vorstopper := KMD_EINFAHREN;
 				Tisch_2 := 110;
+
+			// Cech-Comment: Wenn Station aktiv und beide Stopper vor der Station und in der Station drinnen, dann beide Stopper ausfahren und Prozess mit "0" wieder von vorne beginnen
 		ELSIF gTaster_Tisch_2_aus = FALSE AND gTisch_2.Inputs.Stopper_eingefahren = TRUE AND gTisch_2.Inputs.Vorstopper_eingefahren = TRUE THEN
 				gTisch_2.Cmd.Stopper := KMD_AUSFAHREN;
 				gTisch_2.Cmd.Vorstopper := KMD_AUSFAHREN;
 				Tisch_2 := 0;
 		END_IF	
 		
-//
-
-		10:
+	// Cech-Comment: Im Block bis exclusive 70 wird ein neuer WST in die Station eingefahren, wenn ein WST die Station verlassen hat und ein anderer beim Vorstopper wartet
+		10: 	//Cech-Comment: Wenn der WST den Sensor NAchstopper überfahren hat, dann ...
 		IF gTisch_2.Inputs.Nach_Stopper = TRUE THEN
 			Tisch_2 := 20;
 		END_IF
 		
-		20:
+		20:		//Cech-Comment: WEnn der WST den Stopper verlassen hat, wird der Stopper ausgefahren und der Vorstopper freigegeben
 		IF gTisch_2.Inputs.Nach_Stopper = FALSE THEN
 			gTisch_2.Cmd.Stopper := KMD_AUSFAHREN;
 			gTisch_2.Cmd.Vorstopper := KMD_EINFAHREN;
 			Tisch_2 := 30;
 		END_IF
 
-		30:
+		30:		//WST hat den Vorstopper passiert
 		IF gTisch_2.Inputs.Nach_Vorstopper = TRUE THEN
 			Tisch_2 := 40;
 		END_IF
 
-		40:
+		40:		//und der Vorstopper wird wieder ausgefahren
 		IF gTisch_2.Inputs.Nach_Vorstopper = FALSE THEN
 			gTisch_2.Cmd.Vorstopper := KMD_AUSFAHREN;
 			Tisch_2 := 50;
 		END_IF
 
-		50:
+		50:		//Prozess wartet, bis der Stausensor hinter der STation anschlägt
 		IF gTisch_2.Inputs.Stausensor = TRUE THEN
 			Tisch_2 := 60;
 		END_IF
 
-		60:
+		60:		//... und setzt den Prozess wieder auf "0", dann beginnt er wieder oben
 		IF gTisch_2.Status.Vorstopper = STATUS_AUSGEFAHREN AND gTisch_2.Status.Stopper = STATUS_AUSGEFAHREN THEN
 			Tisch_2 := 0;
 		END_IF
 
-//      	
-
-		70:
+	//Cech-Comment: Im Block bis exclusive 110: Prozess, wenn der WST aus der Station entlassen wurde und keiner beim Vortsopper wartet      	
+		70: //Nachstopper wird überfahren
 		IF gTisch_2.Inputs.Nach_Stopper = TRUE THEN
 			Tisch_2 := 80;
 		END_IF
 
-		80:
+		80:	//NAchstopper wieder frei --> Stopper wieder ausfahren
 		IF gTisch_2.Inputs.Nach_Stopper = FALSE THEN
 			gTisch_2.Cmd.Stopper := KMD_AUSFAHREN;
 			Tisch_2 := 90;
 		END_IF
 
-		90:
+		90:	//Warten, bis der Stausensor erreicht ist
 		IF gTisch_2.Inputs.Stausensor = TRUE THEN
 			Tisch_2 := 100;
 		END_IF
 
-		100:
+		100:	// und dann den Prozess wieder auf "0" stellen
 		IF gTisch_2.Status.Stopper = STATUS_AUSGEFAHREN THEN
 			Tisch_2 := 0;
 		END_IF
 
-//
-
-		110:
+			
+	//	Cech-Comment: Prozess wenn ein WST beim Vorstopper angekommen und Vorstopper eingefahren wurde, und in der Station aber kein WST drinnen steht
+		110:	//Cech-Comment: WST hat Vorstopper passiert
 		IF gTisch_2.Inputs.Nach_Vorstopper = TRUE THEN
 			Tisch_2 := 120;
 		END_IF
 
-		120:
+		120:	//Cech-Comment: Vorstopper wird wieder ausgefahren
 		IF gTisch_2.Inputs.Nach_Vorstopper = FALSE THEN
 			gTisch_2.Cmd.Vorstopper := KMD_AUSFAHREN;
 			Tisch_2 := 130;
 		END_IF
 
-		130:
+		130:	//Cech-Comment: Wenn alles stabil ist, denn wird der Prozess mit "0" von vorne begonnen
 		IF gTisch_2.Inputs.Vor_Stopper = TRUE AND gTisch_2.Status.Vorstopper = STATUS_AUSGEFAHREN THEN
 			Tisch_2 := 0;
 		END_IF

+ 1 - 1
Logical/TischProgramme/Tisch6/IEC.prg

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<?AutomationStudio Version=4.7.2.98?>
+<?AutomationStudio Version=4.7.7.74 SP?>
 <Program SubType="IEC" xmlns="http://br-automation.co.at/AS/Program">
   <Files>
     <File Description="Init, cyclic, exit code">Main.st</File>

+ 152 - 68
Logical/TischProgramme/Tisch6/Main.st

@@ -3,19 +3,23 @@ PROGRAM _INIT
 
 	Tisch_6 := 0;
 	Tisch_6_Manuell := 0;
+	Tisch_6_Automatik :=0;			//Cech-Implement
 	
 	gTisch_6.Cmd.Stopper := KMD_EINFAHREN;
 	gTisch_6.Cmd.Vorstopper := KMD_EINFAHREN;
 	gTisch_6.Cmd.Aushebeeinheit := KMD_EINFAHREN;
 	
 	RTInfo_0(enable:=1);
-
+	
+	gMerker_Laser_Einstellen_fertig := FALSE; 	//Cech-Implement
+		
 END_PROGRAM
 
 PROGRAM _CYCLIC
 
 	gTisch_6;
 	
+
 	IF gMerker_Laser_Manuell = TRUE THEN
 		gDO_Start_Laser := FALSE;
 		gDO_Laser_Seitentuer_oeffnen := FALSE;
@@ -25,6 +29,7 @@ PROGRAM _CYCLIC
 		gDO_Laser_Seitentuer_oeffnen := FALSE;
 	END_IF
 	
+//Cech-Comment: Hier wird der Status der Soft-Buttons am Hauptpanel abgefragt. Wenn die Freigabe erteilt ist, sind die anderen 5 Tasten (Ausheber, Vorstopperm, Stopper, Start-Laser und Doppelt-lasern aktiviert) 	
 	IF gVK_Freigabe_manuell = TRUE AND gVK_Stopper_Tisch_6 = TRUE THEN
 		gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
 	ELSIF gVK_Freigabe_manuell = TRUE AND gVK_Stopper_Tisch_6 = FALSE THEN
@@ -49,12 +54,12 @@ PROGRAM _CYCLIC
 		gDO_doppelt_lasern := FALSE;
 	END_IF	
 	
-	IF gVK_Freigabe_manuell = TRUE AND gVK_Start_Laser = TRUE THEN
+	IF gVK_Freigabe_manuell = TRUE AND gVK_Start_Laser = TRUE THEN  //Cech-Comment: 
 		gDO_Start_Laser := TRUE;
 	ELSIF gVK_Freigabe_manuell = TRUE AND gVK_Start_Laser = FALSE THEN
 		gDO_Start_Laser := FALSE;
-	END_IF
-	
+	END_IF	
+
 	IF gVK_Absaugung = FALSE THEN				//Cech-Implement zum Aktivieren und deaktivieren der LAserabsaugung über einen Button am Control-Panel-PC
 		gDO_Laser_Absaugung := FALSE;			//Cech-Implement zum Aktivieren und deaktivieren der LAserabsaugung über einen Button am Control-Panel-PC
 	END_IF										//Cech-Implement zum Aktivieren und deaktivieren der LAserabsaugung über einen Button am Control-Panel-PC
@@ -62,8 +67,9 @@ PROGRAM _CYCLIC
 	IF gVK_Absaugung = TRUE AND (gDO_Start_Laser = TRUE OR gMerker_Laser_Manuell = TRUE) THEN	//Cech-Implement zum Aktivieren und deaktivieren der LAserabsaugung über einen Button am Control-Panel-PC
 		gDO_Laser_Absaugung := TRUE;			//Cech-Implement zum Aktivieren und deaktivieren der LAserabsaugung über einen Button am Control-Panel-PC
 	END_IF										//Cech-Implement zum Aktivieren und deaktivieren der LAserabsaugung über einen Button am Control-Panel-PC
-	
-		
+
+
+//Cech-Comment: Alles neutralsieren, wenn die Station deaktiviert wurde mit dem Soft-Button am Hauptbildschirm	
 		IF gTaster_Tisch_6_aus = TRUE THEN
 			gTisch_6.Cmd.Stopper := KMD_EINFAHREN;
 			gTisch_6.Cmd.Vorstopper := KMD_EINFAHREN;
@@ -72,8 +78,10 @@ PROGRAM _CYCLIC
 			Tisch_6_Automatik := 0;
 			Tisch_6 := 0;
 			Tisch_6_Manuell := 0;
-		END_IF
+	END_IF
+	
 	
+//Cech-Comment: In diesem und den nachfolgenden IFs werden die drei möglichen Zustände von der LAser-SPS (MAnuell, Halbauto, Auto) auf die Linien-SPS übernommen
 	IF gDI_Laser_Automatik = TRUE AND gDI_Laser_Manuell = FALSE THEN
 		gMerker_Laser_Automatik := TRUE;
 		gMerker_Laser_Halbautomatik := FALSE;
@@ -94,36 +102,37 @@ PROGRAM _CYCLIC
 	
 	
 	
-	CASE Tisch_6_Manuell OF
+	CASE Tisch_6_Manuell OF		//Cech-Comment: Handbetrieb (meiner Meinung nach nicht sauber, Fehler drinnen)
 		
-		0:
+		0:		// Cech-Comment: Ich schätze, dass hier der manuelle Laserbetrieb initiiert wird, indem eine WST-"Beladung" initiiert wird (IF: WST in LASer und wird ausgefahren, ELSE-IF: Kein WSt in LAser)
 		IF gMerker_Laser_Manuell = TRUE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = FALSE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND Tisch_6 = 0 THEN	
 			gTisch_6.Cmd.Aushebeeinheit := KMD_EINFAHREN;
 			gTisch_6.Cmd.Stopper := KMD_EINFAHREN;
 			Tisch_6_Manuell := 10;
-			ELSIF gMerker_Laser_Manuell = TRUE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = FALSE AND gTisch_6.Inputs.Vor_Stopper = FALSE AND Tisch_6 = 0 THEN
-				gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN;
-				gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
-				gTisch_6.Cmd.Vorstopper := KMD_AUSFAHREN;
-				Tisch_6_Manuell := 20;
+		ELSIF gMerker_Laser_Manuell = TRUE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = FALSE AND gTisch_6.Inputs.Vor_Stopper = FALSE AND Tisch_6 = 0 THEN
+			gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN;
+			gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
+			gTisch_6.Cmd.Vorstopper := KMD_AUSFAHREN;
+			Tisch_6_Manuell := 20;
 			END_IF
 			
-		10:
-			IF gTisch_6.Inputs.Nach_Stopper = TRUE THEN
-			gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN;
+		10:		//Cech-Comment: Warten, bis der WST die Station verlassen hat und alles ausfahren (Warum Aushebeeinheit?)
+		IF gTisch_6.Inputs.Nach_Stopper = TRUE THEN
+			gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN; //Im Handbetrieb wird jeenfalls die Aushebeeinheit ausgefahren. Wahrscheinlich, damit händisch ein WST oder Sonstiges eingelegt werden kann
 			gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
 			gTisch_6.Cmd.Vorstopper := KMD_AUSFAHREN;
 			Tisch_6_Manuell := 20;
 		END_IF
 		
-		20:
+		20:		//Cech-Comment: Wenn HAndbetrieb beendet wird am LAser-Umschalter, dann wird die Aushebeeinheit runtergafehren und die LAserabsaugung ausgeschaltet
 		IF gMerker_Laser_Manuell = FALSE THEN	
 			gTisch_6.Cmd.Aushebeeinheit := KMD_EINFAHREN;
 			gDO_Laser_Absaugung := FALSE;
 			Tisch_6_Manuell := 30;
 		END_IF
 		
-		30: lWarten_Aushebeeinheit_Tisch_6 := lWarten_Aushebeeinheit_Tisch_6 + (RTInfo_0.cycle_time/1000);
+		30: 	//Cech-Comment: Warten, bis die Aushebeeinheit unten ist. Dann wird der Stopper eingefahren, wenn ein WST wartet, bzw. der Prozess von vorne gestartet, wenn kein WST beim Vorstopper wartet
+			lWarten_Aushebeeinheit_Tisch_6 := lWarten_Aushebeeinheit_Tisch_6 + (RTInfo_0.cycle_time/1000);
 		IF gTisch_6.Inputs.Vor_Stopper = TRUE AND lWarten_Aushebeeinheit_Tisch_6 >= 500 THEN
 			gTisch_6.Cmd.Stopper := KMD_EINFAHREN;
 			lWarten_Aushebeeinheit_Tisch_6 := 0;	
@@ -133,7 +142,7 @@ PROGRAM _CYCLIC
 				Tisch_6_Manuell := 0;
 		END_IF
 		
-		40:
+		40:		// ... und  der Stopper wird wieder ausgefahren
 		IF gTisch_6.Inputs.Nach_Stopper = TRUE THEN
 			gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
 			Tisch_6_Manuell := 0;
@@ -141,21 +150,25 @@ PROGRAM _CYCLIC
 				
 	END_CASE
 	
-	CASE Tisch_6 OF
+	
+	CASE Tisch_6 OF		//Cech-Comment: Halbautomatik; Hier wird ein WST eingefahren bzw. auch ausgefahren;
 
-		0:
+		0:		//Cech-Comment: Wenn ein WST vor dem LAser wartet und der Stausensor nicht anschlägt, aber der RFID gelesen wurde, wird die Aushebeeinheit hochgefahren (offensichtlich befindet sich ein WST in der Station
 		IF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = TRUE AND gMerker_Laser_Automatik = FALSE AND Tisch_6_Manuell = 0 AND gTisch_6.Inputs.Vor_VorStopper = TRUE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gTisch_6.Inputs.Stausensor = FALSE AND gTaster_Tisch_6_aus = FALSE AND gMerker_RFID_Tisch_6_gelesen = TRUE THEN
 			gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN;
 			gMerker_RFID_Tisch_6_gelesen := FALSE;
-			Tisch_6 := 10;
+				Tisch_6 := 10;
+			//Cech-Comment: Wen kein WST wartet aber RFID gelesen wurde, dann wird auch die Aushebeeinheit ausgefahren (offensichtlich befindet sich ein WST in der Station)
 		ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = TRUE AND gMerker_Laser_Automatik = FALSE AND Tisch_6_Manuell = 0 AND gTisch_6.Inputs.Vor_VorStopper = FALSE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gTisch_6.Inputs.Stausensor = FALSE AND gTaster_Tisch_6_aus = FALSE AND gMerker_RFID_Tisch_6_gelesen = TRUE THEN
 				gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN;
 				gMerker_RFID_Tisch_6_gelesen := FALSE;
 				Tisch_6 := 10;
+			//Cech-Comment: Wenn kein WST in der Station, aber einer davor, dann werden die Sietentüren geöffnet und der Vorstopper wird freigegeben
 		ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = TRUE AND gMerker_Laser_Automatik = FALSE AND Tisch_6_Manuell = 0 AND gTisch_6.Inputs.Vor_VorStopper = TRUE AND gTisch_6.Inputs.Vor_Stopper = FALSE AND gTaster_Tisch_6_aus = FALSE THEN
 				gDO_Laser_Seitentuer_oeffnen := TRUE;
 				gTisch_6.Cmd.Vorstopper := KMD_EINFAHREN;
 				Tisch_6 := 200; /// war 110
+			//Cech-Comment: Wenn entweder Vorstopper oder Stopper eingefahren sind, dann werden beide wieder ausgefahren
 		ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = TRUE AND gMerker_Laser_Automatik = FALSE AND Tisch_6_Manuell = 0 AND gTaster_Tisch_6_aus = FALSE AND (gTisch_6.Inputs.Stopper_eingefahren = TRUE OR gTisch_6.Inputs.Vorstopper_eingefahren = TRUE) THEN
 				gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
 				gTisch_6.Cmd.Vorstopper := KMD_AUSFAHREN;
@@ -164,52 +177,51 @@ PROGRAM _CYCLIC
 		
 //
 
-		10:
+		10:		//Cech-Comment: Ich schätze, mit diesen Ports wird das LASern aus Liniensicht freigegeben (mit Start Absaugung) und bereits das Port für das Öffnen der Seitentüren gesetzt, damit LAser-SPS öffnet, wenn gelasert wurde
 			IF (*gTisch_6.Status.Aushebeeinheit = STATUS_AUSGEFAHREN*) gTisch_6.Outputs.Aushebeeinheit_ausfahren = TRUE AND gTisch_6.Outputs.Aushebeeinheit_einfahren = FALSE THEN
 				gDO_Start_Laser := TRUE;
-				gMerker_Cech_Test_Counter := 10;
-				gDO_Laser_Seitentuer_oeffnen := TRUE;			//!!!!!!!!!!!!!!!!!!!!!!Cech-Comment: Könnte mir vorstellen, dass hier ein FALSE hergehört und unter 20: dann gDO_Laser_Seitentuer_oeffnen := TRUE; das müsste ich ausprobieren
-				Tisch_6 := 20;
-			END_IF
+				gDO_Laser_Seitentuer_oeffnen := TRUE; //!!!!!!!!!!!!!!!!!!!!!!Cech-Comment: Könnte mir vorstellen, dass hier ein FALSE hergehört und unter 20: dann gDO_Laser_Seitentuer_oeffnen := TRUE; das müsste ich ausprobieren
+			Tisch_6 := 20;
+		END_IF
 		
-		20:
-			IF gTisch_6.Inputs.Start = TRUE THEN
+		20:		//Cech-Comment: Wenn der grüne TAster gedrückt wurde (Offensichtlich ist das LAsern beendet und der WST kann ausgefahren werden) dann wird der WST ausgefahren
+			IF gTisch_6.Inputs.Start = TRUE THEN		//Cech-Comment: Dieser Input ist der grüne Taster unter dem Panal-PC, der HW-mäßig auf den Input 0 der 16 Input-Kanäle des Input-Moduls verdrahtet ist
 				gDO_Start_Laser := FALSE;
 				gDO_Laser_Absaugung := FALSE;
-				gDO_Laser_Seitentuer_oeffnen := FALSE;			//!!!!!!!!!!!!!!!!!!!!!!Cech-Comment: Könnte mir vorstellen, dass hier ein TRUE hergehört und unter 10: dann gDO_Laser_Seitentuer_oeffnen := FALSE; das müsste ich ausprobieren
+				gDO_Laser_Seitentuer_oeffnen := FALSE; //!!!!!!!!!!!!!!!!!!!!!!Cech-Comment: Könnte mir vorstellen, dass hier ein TRUE hergehört und unter 10: dann gDO_Laser_Seitentuer_oeffnen := FALSE; das müsste ich ausprobieren
 			gTisch_6.Cmd.Aushebeeinheit := KMD_EINFAHREN;
 			Tisch_6 := 30;
 		END_IF
 
-		30:
+		30:		//Cech-Comment: WST wird rausgelassen
 		IF (*gTisch_6.Status.Aushebeeinheit = STATUS_EINGEFAHREN*) gTisch_6.Outputs.Aushebeeinheit_einfahren = TRUE AND gTisch_6.Outputs.Aushebeeinheit_ausfahren = FALSE THEN
 			gTisch_6.Cmd.Stopper := KMD_EINFAHREN;
 			Tisch_6 := 40;
 		END_IF
 
-		40:
+		40: 	//Cech-Comment: Wenn der NAchstopper_Sensor einmal ein ...
 		IF gTisch_6.Inputs.Nach_Stopper = TRUE THEN	
 			Tisch_6 := 45;
 		END_IF	
 		
-		45:	
+		45:		// ... und wieder aus geht, dann kann der Stopper wieder ausgefahren werden
 		IF gTisch_6.Inputs.Nach_Stopper = FALSE THEN	
 			gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
 			Tisch_6 := 50;	
 		END_IF
 
-		50:
+		50:		//Cech-Comment: WEnn der WST am Stausensor vorbei ist, also ein ...
 		IF gTisch_6.Inputs.Stausensor = TRUE THEN
 			Tisch_6 := 60;
 		END_IF
 
-		60:
+		60:		// ... und wieder aus, dann wird der Prozess von oben wieder begonnen
 		IF gTisch_6.Inputs.Stausensor = FALSE THEN
 			Tisch_6 := 0;
 		END_IF
 
 	//
-
+		// Cech-Comment: von hier bis excl. 200 wird nicht durchfahren 
 		110:
 			IF gTisch_6.Inputs.Nach_Vorstopper = TRUE THEN
 				Tisch_6 := 120;
@@ -227,23 +239,24 @@ PROGRAM _CYCLIC
 				Tisch_6 := 0;
 			END_IF
 		
-		200:
+		200:	//Cech-Comment: Wenn WST am Ausfahrsensor des Stoppers
 			IF gTisch_6.Inputs.Nach_Vorstopper = TRUE THEN
 				Tisch_6 := 210;
 			END_IF
 
-		210:
+		210:	//Cech-Comment: WEnn WST am Ausfahrsensor vorbei, dann wird der Stopper wieder ausgefahren
 			IF gTisch_6.Inputs.Nach_Vorstopper = FALSE THEN
 				gTisch_6.Cmd.Vorstopper := KMD_AUSFAHREN;
 				Tisch_6 := 220;
 			END_IF
 
-		220:
+		220:	// ... und geprüft, ab der SW-Status des Stoppers auf ausgefahren steht
 			IF (*gTisch_6.Inputs.Vor_Stopper = TRUE AND*) gTisch_6.Status.Vorstopper = STATUS_AUSGEFAHREN THEN
 				Tisch_6 := 230;
 			END_IF
 		
-		230: IF gTisch_6.Inputs.Vor_Stopper = TRUE THEN
+		230:	// Cech-Comment: ... und auch tatsächlich schon ausgefahren ist und von vorne begonnen
+			IF gTisch_6.Inputs.Vor_Stopper = TRUE THEN
 				Tisch_6 := 0;
 			END_IF
 
@@ -251,20 +264,29 @@ PROGRAM _CYCLIC
 	
 	CASE Tisch_6_Automatik OF
 
-		0:
-			IF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND gTisch_6.Inputs.Vor_VorStopper = TRUE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gTisch_6.Inputs.Stausensor = FALSE AND gTaster_Tisch_6_aus = FALSE AND gMerker_RFID_Tisch_6_gelesen = TRUE THEN
+		0:	//Cech-Comment: Hier werden die Stati vom LaSerwahlschalter und den Stoppern, Schaltern und Sensoren der Station 6 abgefragt und entsprechend in die Case-Schleife verzweigt
+			IF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND gTisch_6.Inputs.Vor_VorStopper = TRUE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gTisch_6.Inputs.Stausensor = FALSE AND gMerker_RFID_Tisch_6_gelesen = TRUE AND gTaster_Tisch_6_aus = FALSE THEN  //Cech-Comment: gTAster_Tisch_6_aus ist der Softbutton am MAain-Panel, wo jede Station deaktiviert werden kann
+				gMerker_Debug_Test_Counter := 010;			//Cech-Implement
+				lWarten_Laser_Dauer := 0;					//Cech-Implement
 				gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN;
 				gMerker_RFID_Tisch_6_gelesen := FALSE;
 				Tisch_6_Automatik := 10;
-			ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND gTisch_6.Inputs.Vor_VorStopper = FALSE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gTisch_6.Inputs.Stausensor = FALSE AND gTaster_Tisch_6_aus = FALSE AND gMerker_RFID_Tisch_6_gelesen = TRUE THEN
+			ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND gTisch_6.Inputs.Vor_VorStopper = FALSE AND gTisch_6.Inputs.Vor_Stopper = TRUE AND gTisch_6.Inputs.Stausensor = FALSE AND gMerker_RFID_Tisch_6_gelesen = TRUE AND gTaster_Tisch_6_aus = FALSE THEN  //Cech-Comment: gTAster_Tisch_6_aus ist der Softbutton am MAain-Panel, wo jede Station deaktiviert werden kann
+				gMerker_Debug_Test_Counter := 020;			//Cech-Implement
+				lWarten_Laser_Dauer := 0;					//Cech-Implement
 				gTisch_6.Cmd.Aushebeeinheit := KMD_AUSFAHREN;
 				gMerker_RFID_Tisch_6_gelesen := FALSE;
 				Tisch_6_Automatik := 10;
-			ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND gTisch_6.Inputs.Vor_VorStopper = TRUE AND gTisch_6.Inputs.Vor_Stopper = FALSE AND gTaster_Tisch_6_aus = FALSE THEN
+				//Cech-Comment: Wenn ein WST wartet und keiner in der STation ist, weiters entweder der Stausensor anschlägt und/oder der RFID nicht gelesen wird   !!!! Ergibt keinen Sinn für mich!!!! Ev. soll das saubere Anfangsbedingungen schaffen
+			ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND gTisch_6.Inputs.Vor_VorStopper = TRUE AND gTisch_6.Inputs.Vor_Stopper = FALSE AND gTaster_Tisch_6_aus = FALSE THEN  //Cech-Comment: gTAster_Tisch_6_aus ist der Softbutton am MAain-Panel, wo jede Station deaktiviert werden kann
+				gMerker_Debug_Test_Counter := 030;			//Cech-Implement
+				lWarten_Laser_Dauer := 0;					//Cech-Implement
 				gDO_Laser_Seitentuer_oeffnen := TRUE;
 				gTisch_6.Cmd.Vorstopper := KMD_EINFAHREN;
 				Tisch_6_Automatik := 200; // war 110
-			ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND gTaster_Tisch_6_aus = FALSE AND (gTisch_6.Inputs.Stopper_eingefahren = TRUE OR gTisch_6.Inputs.Vorstopper_eingefahren = TRUE) THEN
+			ELSIF gMerker_Laser_Manuell = FALSE AND gMerker_Laser_Halbautomatik = FALSE AND gMerker_Laser_Automatik = TRUE AND (gTisch_6.Inputs.Stopper_eingefahren = TRUE OR gTisch_6.Inputs.Vorstopper_eingefahren = TRUE) AND gTaster_Tisch_6_aus = FALSE THEN  //Cech-Comment: gTAster_Tisch_6_aus ist der Softbutton am MAain-Panel, wo jede Station deaktiviert werden kann
+				gMerker_Debug_Test_Counter := 040;			//Cech-Implement
+				lWarten_Laser_Dauer := 0;					//Cech-Implement
 				gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
 				gTisch_6.Cmd.Vorstopper := KMD_AUSFAHREN;
 				Tisch_6_Automatik := 0;
@@ -272,57 +294,112 @@ PROGRAM _CYCLIC
 		
 			//
 
-		10:
-			IF (*gTisch_6.Status.Aushebeeinheit = STATUS_AUSGEFAHREN*) gTisch_6.Outputs.Aushebeeinheit_ausfahren = TRUE AND gTisch_6.Outputs.Aushebeeinheit_einfahren = FALSE THEN
-				gDO_Start_Laser := TRUE;
-				Tisch_6_Automatik := 15;
+			
+			
+			
+		10:	//Cech-Comment: Laserport zum Starten des Lasers an die Laser-SPS wird eingeschaltet
+			IF (*gTisch_6.Status.Aushebeeinheit = STATUS_AUSGEFAHREN*) gTisch_6.Outputs.Aushebeeinheit_ausfahren = TRUE AND gTisch_6.Outputs.Aushebeeinheit_einfahren = FALSE AND gMerker_Laser_Einstellen_fertig = TRUE THEN //Cech-Implement gMerker_Laser_Einstellen_fertig von Cech eingefügt
+				IF gMerker_Laser_Doppelzylinder = TRUE THEN
+					gDO_doppelt_lasern := TRUE;
+				END_IF
+				gMerker_Debug_Test_Counter := 100;					//Cech-Implement
+				gDO_Start_Laser := TRUE;	// Cech-Implement, Comment: Das entspricht dem Port "WST in Position", wie es Hr.Ziegler von Bluhm nennt. Wenn Centurio den gMerker_Laser_Einstellen_fertig auf TRUE gesetzt hat darf LAserung gestartet werden
+				Tisch_6_Automatik := 15;	
 			END_IF
 		
-		15: lWarten_Laser_Startsignal := lWarten_Laser_Startsignal + (RTInfo_0.cycle_time/1000);
-			IF lWarten_Laser_Startsignal >= 500 THEN
+		15: //Cech-Comment: Nach 1000ms wird das Startsignal an den Laser zurückgenommen und weiter mit 20
+			lWarten_Laser_Startsignal := lWarten_Laser_Startsignal + (RTInfo_0.cycle_time/1000);
+			IF lWarten_Laser_Startsignal >= 1000 THEN  
+				//	gDO_Start_Laser := FALSE;  !!!!!!!!!!!!!!!!Dies geht nicht, weil Hr.Ziegler offensichtlich keinen Handshake programmiert hat, sondern "LAsern-fertig" gleich setzt, wenn wir sagen, dass Start-LAser low wird. Es wird nicht fertiggelasert.
+				gMerker_Debug_Test_Counter := 150;
+				IF gMerker_Laser_Doppelzylinder = TRUE THEN
+					Tisch_6_Automatik := 18;
+				ELSIF gMerker_Laser_Doppelzylinder = FALSE THEN
+					Tisch_6_Automatik :=20;
+				END_IF
+			END_IF
+		18: 
+			IF (gDI_Laser_fertig = TRUE AND gDI_keiner_Stoerung_Laser = TRUE)THEN (* OR lWarten_Laser_Dauer >= 10000 THEN *)  //WEnn das Handshake in LaserSPS aktiv wird, dann kann das ELSIF theoretisch wieder weggenommen werdenTHEN
+				// Und hier, beim Doppelzylinder darf die ZEit nicht überprüft werden, weil der Bediener die Doppeltaster drücken muss nach Einstellung von File und Seriennummer
+				//Cech-Implement-Anfang
+				gMerker_Debug_Test_Counter := 200;
 				gDO_Start_Laser := FALSE;
+				gMerker_Laser_Einstellen_fertig := FALSE; //Cech-Implement
+				gMerker_Laser_Doppelzylinder := FALSE;
+				//				gDO_Laser_Seitentuer_oeffnen := TRUE;
+				//gTisch_6.Cmd.Aushebeeinheit := KMD_EINFAHREN;
+				//gMerker_RFID_Value_Tisch_6 := 0;
+				//gMerker_block_RFID_read_Tisch_6 := TRUE;	//Cech-Comment: Der MErker wenn TRUE blockiert das RFID-LEsen während des Einfahrens der Aushebeeinheit, um nicht neu zu beginnen (RFID kann beim Ausheben die VErbindung verlieren, das soll verhindert werden)
 				Tisch_6_Automatik := 20;
+				//			ELSIF (gDI_Laser_fertig = TRUE AND gDI_keiner_Stoerung_Laser = FALSE)
+				//				gDO_Start_Laser := FALSE;
+				//				gMerker_Laser_Einstellen_fertig := FALSE;
+		
+				//Cech-Implement-Ende
 			END_IF
+						
+						
 			
-		20:
-			IF gDI_Laser_fertig = TRUE THEN
+		20:	//Cech-Comment: Wenn vom LAser das Signal "WST bereit zum ABtransport", also LAsern fertig, kommt, dann wird die Aushebeeinheit eingefahren, der RFID-Wert der Station auf "0" gesetzt
+			lWarten_Laser_Dauer := lWarten_Laser_Dauer + (RTInfo_0.cycle_time/1000);		//Cech-Implement
+			IF (gDI_Laser_fertig = TRUE AND gDI_keiner_Stoerung_Laser = TRUE) OR lWarten_Laser_Dauer >= 10000 THEN  //WEnn das Handshake in LaserSPS aktiv wird, dann kann das ELSIF theoretisch wieder weggenommen werdenTHEN
+				//Cech-Implement-Anfang
+				gMerker_Debug_Test_Counter := 200;
 				gDO_Start_Laser := FALSE;
+				gMerker_Laser_Einstellen_fertig := FALSE; //Cech-Implement
+				gMerker_Laser_Doppelzylinder := FALSE;
+				gDO_doppelt_lasern := FALSE;
+				//				gDO_Laser_Seitentuer_oeffnen := TRUE;
 				gTisch_6.Cmd.Aushebeeinheit := KMD_EINFAHREN;
 				gMerker_RFID_Value_Tisch_6 := 0;
-				gMerker_block_RFID_read_Tisch_6 := TRUE;
+				gMerker_block_RFID_read_Tisch_6 := TRUE;	//Cech-Comment: Der MErker wenn TRUE blockiert das RFID-LEsen während des Einfahrens der Aushebeeinheit, um nicht neu zu beginnen (RFID kann beim Ausheben die VErbindung verlieren, das soll verhindert werden)
 				Tisch_6_Automatik := 30;
+				//			ELSIF (gDI_Laser_fertig = TRUE AND gDI_keiner_Stoerung_Laser = FALSE)
+				//				gDO_Start_Laser := FALSE;
+				//				gMerker_Laser_Einstellen_fertig := FALSE;
+				
+				//Cech-Implement-Ende
+				
 			END_IF
-
-		30:
+					
+			
+			
+		30:	//Cech-Comment: Stopper wird eingefahren
 			IF (*gTisch_6.Status.Aushebeeinheit = STATUS_EINGEFAHREN*) gTisch_6.Outputs.Aushebeeinheit_einfahren = TRUE AND gTisch_6.Outputs.Aushebeeinheit_ausfahren = FALSE THEN
+				gMerker_Debug_Test_Counter := 300;
 				gTisch_6.Cmd.Stopper := KMD_EINFAHREN;
 				Tisch_6_Automatik := 40;
 			END_IF
 
-		40:
+		40:	//Cech-Comment: schauen, wenn der WST die Station wirklich verlassen hat
 			IF gTisch_6.Inputs.Nach_Stopper = TRUE THEN	
+				gMerker_Debug_Test_Counter := 400;
 				Tisch_6_Automatik := 45;
 			END_IF	
 		
-		45:	
+		45:	//Cech-Comment: Wenn der WST weg ist, wird der Stopper ausgefahren und der RFID-Leser wieder "scharf" geschaltet
 			IF gTisch_6.Inputs.Nach_Stopper = FALSE THEN	
 				gTisch_6.Cmd.Stopper := KMD_AUSFAHREN;
-				gMerker_block_RFID_read_Tisch_6 := FALSE;
+				gMerker_block_RFID_read_Tisch_6 := FALSE;	//Cech-Comment: Damit wird das RFID-Lesen nicht mehr "blockiert"
+				gMerker_Debug_Test_Counter := 450;
 				Tisch_6_Automatik := 50;	
 			END_IF
 
-		50:
+		50:	//Cech-Comment: Wenn der Stausensor nach dem Laser den WST anzeigt und ...
 			IF gTisch_6.Inputs.Stausensor = TRUE THEN
+				gMerker_Debug_Test_Counter := 500;
 				Tisch_6_Automatik := 60;
 			END_IF
 
-		60:
+		60:	//Cech-Comment: ...und vorbei ist, dann wird der Prozess wieder von Vorne begonnen
 			IF gTisch_6.Inputs.Stausensor = FALSE THEN
+				gMerker_Debug_Test_Counter := 600;
 				Tisch_6_Automatik := 0;
 			END_IF
 
 			//
 
+//Cech-Comment: Wird meiner Meinung nach im Augenblick nicht mehr ausgeführt bis excl. 200:
 		110:
 			IF gTisch_6.Inputs.Nach_Vorstopper = TRUE THEN
 				Tisch_6_Automatik := 120;
@@ -338,26 +415,33 @@ PROGRAM _CYCLIC
 			IF (*gTisch_6.Inputs.Vor_Stopper = TRUE AND*) gTisch_6.Status.Vorstopper = STATUS_AUSGEFAHREN THEN
 				Tisch_6_Automatik := 0;
 			END_IF
-		
-		200:
+//Cech-Comment: Wird meiner Meinung nach im Augenblick nicht mehr ausgeführt seit 110:			
+
+			
+		200:	//Cech-Comment: Warten, bis ein WST den Stopper sicher verlassen hat ...
 			IF gTisch_6.Inputs.Nach_Vorstopper = TRUE THEN
+				gMerker_Debug_Test_Counter := 2000;
 				Tisch_6_Automatik := 210;
 			END_IF
 
-		210:
+		210:	// .... dann wird der Stopper ausgefahren
 			IF gTisch_6.Inputs.Nach_Vorstopper = FALSE THEN
 				gTisch_6.Cmd.Vorstopper := KMD_AUSFAHREN;
+				gMerker_Debug_Test_Counter := 2100;
 				Tisch_6_Automatik := 220;
 			END_IF
 
-		220:
+		220:	// .... Wenn dann der Stopper ausgefahren ist, dann 
 			IF (*gTisch_6.Inputs.Vor_Stopper = TRUE AND*) gTisch_6.Status.Vorstopper = STATUS_AUSGEFAHREN THEN
+				gMerker_Debug_Test_Counter := 2200;
 				Tisch_6_Automatik := 230;
 			END_IF
 		
-		230: IF gTisch_6.Inputs.Vor_Stopper = TRUE THEN
+		230:	// ... wird wieder von Vorne begonnen 
+			IF gTisch_6.Inputs.Vor_Stopper = TRUE THEN
+				gMerker_Debug_Test_Counter := 2300;
 				Tisch_6_Automatik := 0;
-			 END_IF
+			END_IF
 		
 	END_CASE
 

+ 1 - 0
Logical/TischProgramme/Tisch6/Variables.var

@@ -1,4 +1,5 @@
 VAR
+	lWarten_Laser_Dauer : UDINT; (*Cech: Wartezeit für sichers LAsern, weil ich möglicherweise kein Laser-fertig von der Laser-SPS erhalte*)
 	lWarten_Aushebeeinheit_Tisch_6 : UDINT;
 	RTInfo_0 : RTInfo;
 	lWarten_Laser_Startsignal : UDINT;

+ 48 - 24
Logical/Zylinder/Zylinder_Tisch6/Main.st

@@ -11,6 +11,9 @@ 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;
@@ -27,6 +30,7 @@ PROGRAM _CYCLIC
 		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;
@@ -36,6 +40,7 @@ PROGRAM _CYCLIC
 		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);
@@ -51,6 +56,7 @@ PROGRAM _CYCLIC
 		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
@@ -128,61 +134,79 @@ PROGRAM _CYCLIC
    #############################              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
+		gMerker_Debug_Test_Counter := 111;
 		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
+		gMerker_Debug_Test_Counter := 112;
 		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
+		gMerker_Debug_Test_Counter := 113;
 		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
+		gMerker_Debug_Test_Counter := 114;		
 		gTisch_6.Status.Aushebeeinheit := STATUS_AUSGEFAHREN;
 	ELSE
+		// Es wird immer dieser Zweig angefahren und der Status der Aushebeeinheit bleibt immer STATS_BUSY (255)
+		gMerker_Debug_Test_Counter := 115;
 		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;
-
-			IF gTisch_6.Times.Aushebeeinheit_EinZeit = TRUE THEN
-				gError[0] := 1;
-			END_IF
+	//	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
+	//			gMerker_Debug_Test_Counter := 116;
+	//		(* lPortal_Mittelanschlag_EinZeit := FALSE;
+	//		 lPortal_Mittelanschlag_AusZeit := FALSE; *)
+	//			gTisch_6.Times.Aushebeeinheit_ZeitRun := 0;
+	//		END_IF
+
+	//		IF gTisch_6.Times.Aushebeeinheit_ZeitRun >= 5000 THEN
+	//			gMerker_Debug_Test_Counter := 117;
+	//			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
+	//							gMerker_Debug_Test_Counter := 118;
+	//				gError[0] := 1;
+	//			END_IF
          
-			IF gTisch_6.Times.Aushebeeinheit_AusZeit = TRUE THEN
-				gError[1] := 1;
-			END_IF
+	//			IF gTisch_6.Times.Aushebeeinheit_AusZeit = TRUE THEN
+	//							gMerker_Debug_Test_Counter := 119;
+	//				gError[1] := 1;
+	//			END_IF
 
-		END_IF
+	//		END_IF
 
-	ELSE
-		gTisch_6.Times.Aushebeeinheit_ZeitRun := 0;
-	END_IF
+	//	ELSE
+	//		gTisch_6.Times.Aushebeeinheit_ZeitRun := 0;
+	//	END_IF
 	
 END_PROGRAM
 

+ 1 - 1
Logical/mappView/Visualization/Pages/MainPage/ContentMain.content

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Content id="ContentMain" height="764" width="1536" xmlns="http://www.br-automation.com/iat2015/contentDefinition/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Widgets>
-    <Widget xsi:type="widgets.brease.PushButton" id="PushButton1" top="40" left="100" width="500" height="120" zIndex="0" text="Start" borderStyle="solid" backColor="rgba(0, 0, 0, 1)" textColor="rgba(255, 255, 255, 1)" fontSize="64px" />
+    <Widget xsi:type="widgets.brease.PushButton" id="PushButton1" top="140" left="300" width="500" height="120" zIndex="0" text="Start" borderStyle="solid" backColor="rgba(0, 0, 0, 1)" textColor="rgba(255, 255, 255, 1)" fontSize="64px" />
     <Widget xsi:type="widgets.brease.PushButton" id="PushButton2" top="40" left="940" width="500" height="120" zIndex="1" text="Stop" backColor="rgba(0, 0, 0, 1)" textColor="rgba(255, 255, 255, 1)" fontSize="64px" />
     <Widget xsi:type="widgets.brease.ToggleButton" id="ToggleButton1" top="520" left="100" width="320" height="80" zIndex="2" text="Station 1" borderWidth="1px 1px 1px 1px" backColor="rgba(0, 0, 0, 1)" textColor="rgba(0, 192, 0, 1)" mouseDownBorderWidth="1px 1px 1px 1px" mouseDownTextColor="rgba(255, 0, 0, 1)" fontSize="64px" />
     <Widget xsi:type="widgets.brease.ToggleButton" id="ToggleButton2" top="520" left="440" width="320" height="80" zIndex="3" text="Station 2" borderWidth="1px 1px 1px 1px" backColor="rgba(0, 0, 0, 1)" textColor="rgba(0, 192, 0, 1)" mouseDownBorderWidth="1px 1px 1px 1px" mouseDownTextColor="rgba(255, 0, 0, 1)" fontSize="64px" />