BEGIN
// Perepherie-Daten laden
at_Read_Data.MachineStatus := PED[_PerE_MachineStatus] ;
at_Read_Data.FunctionStatus := PEW[_PerE_FunctionStatus] ;
at_Read_Data.CompletionStatus[1] := PED[_PerE_CompletionStatus +0] ;
at_Read_Data.CompletionStatus[2] := PED[_PerE_CompletionStatus +4] ;
at_Read_Data.Operate_Parameters[1] := PED[_PerE_Operate_Parameter +0] ;
at_Read_Data.Operate_Parameters[2] := PED[_PerE_Operate_Parameter +4] ;
LaserStatus.Shutter_Open := Read_Data.MachineStatus.Shutter ;
LaserStatus.Fehler := Read_Data.MachineStatus.Error ;
LaserStatus.Laser_Trigger := Read_Data.MachineStatus.Print_Busy ;
// Baustein initialisieren
IF Init THEN
AblaufPrg.aktiv := enum_Prg_none ;
AblaufPrg.setLayout := enum_SK_bereit ;
AblaufPrg.setBeschriftung := enum_SK_bereit ;
AblaufPrg.setDateTime := enum_SK_bereit ;
AblaufPrg.Beschriftung := enum_SK_bereit ;
LaserStatus.Init_OK := true ;
erster_Start.setLayout := true ;
erster_Start.setBeschriftung := true ;
erster_Start.setDateTime := true ;
at_Write_Data.Generel_Request[1] := 0 ;
at_Write_Data.Generel_Request[2] := 0 ;
at_Write_Data.CompletionClr_Request[1] := 0 ;
at_Write_Data.CompletionClr_Request[2] := 0 ;
Init := false ;
END_IF ;
// Layout setzen / Programm-Nummer umwählen
IF (AblaufPrg.aktiv = enum_Prg_none) OR (AblaufPrg.aktiv = enum_Prg_setLayout) THEN // Verriegelung gegen andere Abläufe
CASE AblaufPrg.setLayout OF
enum_SK_bereit :
IF _CMD_Set_Layout THEN
AblaufPrg.aktiv := enum_Prg_setLayout ;
AblaufPrg.setLayout := 1 ;
END_IF ;
1 : // neue Layout-Nummer schreiben
Save_Daten.Layout_Index := _Layout_Index ;
Write_Data.Parameter_Nr := INT_TO_DINT(_Layout_Index) ;
PAD[_PerA_Req_Parameter] := at_Write_Data.Parameter_Nr ;
AblaufPrg.setLayout := 2 ;
2 : // Steuerbit für Daten-Übernahme an Laser setzen
Write_Data.Generel_Request.Prg_ChangeReq := true ;
AblaufPrg.setLayout := 3 ;
3 : // Feedback abfragen und auswerten - Daten-Übernahme quittieren
IF Read_Data.CompletionStatus.Prg_Chg_Complete THEN
Write_Data.Generel_Request.Prg_ChangeReq := false ;
at_Read_Data.Operate_Parameters[1] := PED[_PerE_Operate_Parameter] ;
IF Read_Data.Operate_Parameters.akt_Programm_Nr = _Layout_Index THEN
Write_Data.Generel_Request.Prg_ChangeReq := false ;
Write_Data.CompletionClr_Request.Prg_Chg_Complete := true ;
AblaufPrg.setLayout := 4 ;
END_IF ;
END_IF ;
4 : // Feedback abfragen
IF NOT Read_Data.CompletionStatus.Prg_Chg_Complete THEN
Write_Data.CompletionClr_Request.Prg_Chg_Complete := false ;
erster_Start.setLayout := false ;
AblaufPrg.setLayout := enum_SK_beendet ;
END_IF ;
enum_SK_beendet : // fertig
IF NOT _CMD_Set_Layout THEN
AblaufPrg.aktiv := enum_Prg_none ;
AblaufPrg.setLayout := enum_SK_bereit ;
END_IF ;
END_CASE ;
END_IF ;
_Layout_geladen := (Save_Daten.Layout_Index = _Layout_Index) AND ((AblaufPrg.setLayout = enum_SK_bereit) or (AblaufPrg.setLayout = enum_SK_beendet)) ;
LaserStatus.Layout_geladen := _Layout_geladen ;
// Beschriftungstext übertragen
IF (AblaufPrg.aktiv = enum_Prg_none) OR (AblaufPrg.aktiv = enum_Prg_setBeschriftung) THEN // Verriegelung gegen andere Abläufe
CASE AblaufPrg.setBeschriftung OF
enum_SK_bereit :
IF _CMD_Set_Beschriftung THEN
AblaufPrg.aktiv := enum_Prg_setBeschriftung ;
AblaufPrg.setBeschriftung := 1 ;
END_IF ;
1 :
Save_Daten.Beschriftung := _Beschriftungs_Text ;
// Save_Daten.Beschriftung := 'dies ist ein Test' ;
IF _Beschriftungs_Block < 0 THEN // keinen Text setzen
AblaufPrg.setBeschriftung := enum_SK_beendet ;
ELSE
// Block-Nr. wählen
Write_Data.Parameter_Nr := INT_TO_DINT(_Beschriftungs_Block) ;
PAD[_PerA_Req_Parameter] := at_Write_Data.Parameter_Nr ;
// Beschriftungs-Text übergeben
L := BYTE_TO_INT(at_Save_Daten.Beschriftung.Length) ;
FOR i := 1 TO L BY 1 do
Write_Data.Parameter_Data.Inhalt[i-1] := at_Save_Daten.Beschriftung.Chars[i] ;
END_FOR ;
Write_Data.Parameter_Data.Size := L ;
FOR i := L TO 127 BY 1 do
Write_Data.Parameter_Data.Inhalt[i] := 0 ;
END_FOR ;
FOR i := 0 TO 64 BY 1 DO
PAW[i*2 + _PerA_Req_Data] := at_Write_Data.Parameter_Data[i] ;
END_FOR ;
AblaufPrg.setBeschriftung := 2 ;
END_IF ;
2 : // Steuerbit für Daten-Übernahme an Laser setzen
Write_Data.Generel_Request.CharString_Change_Req := true ;
AblaufPrg.setBeschriftung := 3 ;
3 : // Feedback abfragen und auswerten - Daten-Übernahme quittieren
IF Read_Data.CompletionStatus.CharStr_Change_Complete THEN
Write_Data.Generel_Request.CharString_Change_Req := false ;
Write_Data.CompletionClr_Request.CharStr_ChgReq_Complete := true ;
AblaufPrg.setBeschriftung := 4 ;
END_IF ;
4 : // Feedback abfragen
IF NOT Read_Data.CompletionStatus.CharStr_Change_Complete THEN
Write_Data.CompletionClr_Request.CharStr_ChgReq_Complete := false ;
erster_Start.setDateTime := false ;
AblaufPrg.setBeschriftung := enum_SK_beendet ;
END_IF ;
enum_SK_beendet :
IF NOT _CMD_Set_Beschriftung THEN
AblaufPrg.aktiv := enum_Prg_none ;
AblaufPrg.setBeschriftung := enum_SK_bereit ;
END_IF ;
END_CASE ;
END_IF ;
_Beschriftung_geladen := EQ_STRNG(S1:=Save_Daten.Beschriftung , S2:=_Beschriftungs_Text) AND ((AblaufPrg.setBeschriftung = enum_SK_bereit) or (AblaufPrg.setBeschriftung = enum_SK_beendet)) ;
LaserStatus.Beschriftung_geladen := _Beschriftung_geladen ;
// Datum und Uhrzeit übertragen
(*
IF (AblaufPrg.aktiv = enum_Prg_none) OR (AblaufPrg.aktiv = enum_Prg_setDateTime) THEN // Verriegelung gegen andere Abläufe
CASE AblaufPrg.setDateTime OF
enum_SK_bereit :
IF _CMD_Set_DateTime THEN
AblaufPrg.aktiv := enum_Prg_setDateTime ;
AblaufPrg.setDateTime := 1 ;
END_IF ;
1 : // Systemuhr auslesen und Daten in Übertragungspuffer schreiben
Conv_Date_TTMMJJ (IN_Date := _SPS_Datum
,Jahr := JJ
,Monat := MM
,Tag := TT
,Wochentag := WT
,Schaltjahr := SJ
,Jahrestag := JT
,Kalenderwoche := KW
) ;
Conv_TOD_HHMMSS (IN_Uhrzeit := _SPS_Uhrzeit
,Stunden := H
,Minuten := M
,Sekunden := S
,Millisekunden := MS
) ;
// JJ := JJ-2 ; TT := TT-2 ; H := H-2 ;
Write_Data.Parameter_Data.Inhalt[00] := CHAR_TO_BYTE('D') ;
Write_Data.Parameter_Data.Inhalt[01] := CHAR_TO_BYTE('A') ;
Write_Data.Parameter_Data.Inhalt[02] := CHAR_TO_BYTE(',') ;
Write_Data.Parameter_Data.Inhalt[03] := INT_TO_BYTE(((JJ / 1000) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[04] := INT_TO_BYTE(((JJ / 100) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[05] := INT_TO_BYTE(((JJ / 10) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[06] := INT_TO_BYTE(((JJ / 1) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[07] := CHAR_TO_BYTE(',') ;
Write_Data.Parameter_Data.Inhalt[08] := INT_TO_BYTE(((MM / 10) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[09] := INT_TO_BYTE(((MM / 1) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[10] := CHAR_TO_BYTE(',') ;
Write_Data.Parameter_Data.Inhalt[11] := INT_TO_BYTE(((TT / 10) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[12] := INT_TO_BYTE(((TT / 1) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[13] := CHAR_TO_BYTE(',') ;
Write_Data.Parameter_Data.Inhalt[14] := INT_TO_BYTE(((H / 10) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[15] := INT_TO_BYTE(((H / 1) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[16] := CHAR_TO_BYTE(',') ;
Write_Data.Parameter_Data.Inhalt[17] := INT_TO_BYTE(((M / 10) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[18] := INT_TO_BYTE(((M / 1) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[19] := CHAR_TO_BYTE(',') ;
Write_Data.Parameter_Data.Inhalt[20] := INT_TO_BYTE(((S / 10) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[21] := INT_TO_BYTE(((S / 1) MOD 10) + 48) ;
Write_Data.Parameter_Data.Inhalt[22] := 0 ;
Write_Data.Parameter_Data.Size := 22 ;
FOR i := 0 TO 7 BY 1 DO
PAD[i*4 + _PerA_Req_Data] := at_Write_Data.Parameter_Data[i] ;
END_FOR ;
AblaufPrg.setDateTime := 2 ;
2 : // Steuerbit für Daten-Übernahme an Laser setzen
Write_Data.Generel_Request.Command_Req := true ;
AblaufPrg.setDateTime := 3 ;
3 : // Feedback abfragen und auswerten - Daten-Übernahme quittieren
IF Read_Data.CompletionStatus.Command_Req_Complete THEN
Write_Data.Generel_Request.Command_Req := false ;
at_Read_Data.Operate_Parameters[1] := PED[_PerE_Operate_Parameter] ;
Write_Data.CompletionClr_Request.Command_Req_Complete := true ;
AblaufPrg.setDateTime := 4 ;
END_IF ;
4 : // Feedback abfragen
IF NOT Read_Data.CompletionStatus.Command_Req_Complete THEN
Write_Data.CompletionClr_Request.Command_Req_Complete := false ;
erster_Start.setDateTime := false ;
AblaufPrg.setDateTime := enum_SK_beendet ;
END_IF ;
enum_SK_beendet :
IF NOT _CMD_Set_DateTime THEN
AblaufPrg.aktiv := enum_Prg_none ;
AblaufPrg.setDateTime := enum_SK_bereit ;
END_IF ;
END_CASE ;
END_IF ;
_DateTime_geladen := (AblaufPrg.setDateTime >= 4) ;
*)
// Beschriftung durchführen
IF (AblaufPrg.aktiv = enum_Prg_none) OR (AblaufPrg.aktiv = enum_Prg_Beschriftung) THEN // Verriegelung gegen andere Abläufe
CASE AblaufPRG.Beschriftung OF
enum_SK_bereit :
IF _CMD_Laser_beschriften
AND LaserStatus.Layout_geladen AND LaserStatus.Beschriftung_geladen
AND LaserStatus.Laser_Ein AND LaserStatus.Emission THEN
AblaufPrg.aktiv := enum_Prg_Beschriftung ;
AblaufPRG.Beschriftung := 1 ;
END_IF ;
1 :
LaserStatus.Markieren_aktiv := true ;
IF Read_Data.MachineStatus.Print_Busy OR NOT _CMD_Laser_beschriften THEN
AblaufPRG.Beschriftung := 2 ;
END_IF ;
2 :
IF Read_Data.CompletionStatus.Print_Complete OR NOT Read_Data.MachineStatus.Print_Busy THEN
LaserStatus.Markieren_aktiv := false ;
AblaufPRG.Beschriftung := enum_SK_beendet ;
END_IF ;
enum_SK_beendet :
IF NOT _CMD_Laser_beschriften THEN
AblaufPRG.Beschriftung := enum_SK_bereit ;
AblaufPrg.aktiv := enum_Prg_none ;
END_IF ;
END_CASE ;
END_IF ;
LaserStatus.Markieren_aktiv := (AblaufPRG.Beschriftung = 1) OR (AblaufPRG.Beschriftung = 2) ;
LaserStatus.Markieren_fertig := (AblaufPRG.Beschriftung = 3) ;
Write_Data.Generel_Request.Print := LaserStatus.Markieren_aktiv ;
_Markieren_laeuft := LaserStatus.Markieren_aktiv ;
_Markieren_fertig := LaserStatus.Markieren_fertig ;
// Status-Meldungen ausgeben
LaserStatus.aktivieren := NOT Read_Data.MachineStatus.Ready AND Read_Data.MachineStatus.Start_Up ;
LaserStatus.Laser_Ein := Read_Data.MachineStatus.Ready AND Read_Data.MachineStatus.Start_Up ;
LaserStatus.Emission := LaserStatus.Laser_Ein AND Read_Data.MachineStatus.Laser_Emit ;
_Einschalten_laeuft := LaserStatus.aktivieren ;
_Laser_eingeschaltet := LaserStatus.Laser_Ein ;
_Laser_Emission_OK := LaserStatus.Emission ;
_Laser_Fehler := LaserStatus.Fehler ;
Write_Data.Generel_Request.Error_Clear := _CMD_Quit ; // or LaserStatus.aktivieren ;
Write_Data.CompletionClr_Request.Error_Clear_Complete := Read_Data.CompletionStatus.Error_Clear_Complete ;
Write_Data.CompletionClr_Request.Edit_Complete := Read_Data.CompletionStatus.Edit_Complete ;
Impuls_Timer (IN := (AblaufPrg.setLayout = 4) OR (AblaufPrg.setBeschriftung = 3) OR (AblaufPrg.setDateTime = 4) OR Write_Data.Generel_Request.Error_Clear
,PT := t#500ms
) ;
// Perepherie-Daten schreiben
PAD[_PerA_Generel_Req +0] := at_Write_Data.Generel_Request[1] ;
PAD[_PerA_Generel_Req +4] := at_Write_Data.Generel_Request[2] ;
PAD[_PerA_CompletionClr_Req +0] := at_Write_Data.CompletionClr_Request[1] ;
PAD[_PerA_CompletionClr_Req +4] := at_Write_Data.CompletionClr_Request[2] ;
END_FUNCTION_BLOCK