FUNCTION_BLOCK FB500
TITLE = 'UP Kopplung Siemens RF180C'
AUTHOR : 'LL'
VERSION : '0.3'
KNOW_HOW_PROTECT
VAR_INPUT
PerAdresse : INT ; // erste Perepherie-Adresse des Moduls
_mit_Ch1 : BOOL ; // Anwahl: Kanal 1 benutzen
_mit_Ch2 : BOOL ; // Anwahl: Kanal 2 benutzen
END_VAR
VAR_IN_OUT
Init : BOOL := false ; // Baustein initialisieren
END_VAR
VAR_OUTPUT
Meldungen : BOOL ; //------------------------------------------------------------
_Ch1_Ready : BOOL ; // MSG : Kanal 1 ist betriebsbereit
_Ch1_Error : BOOL ; // MSG : Kanal 1 hat allgemeinen Fehler
_Ch1_Transponder_vorh : BOOL ; // MSG : Transponder-Chip am Kanal 1 erkannt
_Ch1_Transponder_ID1_akt : DWORD ; // MSG : aktuelle Transponder-Chip-ID am Kanal 1 (low)
_Ch1_Transponder_ID2_akt : DWORD ; // MSG : aktuelle Transponder-Chip-ID am Kanal 1 (high)
_Ch1_Transponder_ID_akt : STRING ; // MSG : aktuelle Transponder-Chip-ID am Kanal 1
_Ch1_Transponder_ID1_sav : DWORD ; // MSG : letzte Transponder-Chip-ID am Kanal 1 (low)
_Ch1_Transponder_ID2_sav : DWORD ; // MSG : letzte Transponder-Chip-ID am Kanal 1 (high)
_Ch1_Transponder_ID_sav : STRING ; // MSG : letzte Transponder-Chip-ID am Kanal 1
_Ch2_Ready : BOOL ; // MSG : Kanal 2 ist betriebsbereit
_Ch2_Error : BOOL ; // MSG : Kanal 2 hat allgemeinen Fehler
_Ch2_Transponder_vorh : BOOL ; // MSG : Transponder-Chip am Kanal 2 erkannt
_Ch2_Transponder_ID1_akt : DWORD ; // MSG : aktuelle Transponder-Chip-ID am Kanal 2 (low)
_Ch2_Transponder_ID2_akt : DWORD ; // MSG : aktuelle Transponder-Chip-ID am Kanal 2 (high)
_Ch2_Transponder_ID_akt : STRING ; // MSG : aktuelle Transponder-Chip-ID am Kanal 2
_Ch2_Transponder_ID1_sav : DWORD ; // MSG : letzte Transponder-Chip-ID am Kanal 2 (low)
_Ch2_Transponder_ID2_sav : DWORD ; // MSG : letzte Transponder-Chip-ID am Kanal 2 (high)
_Ch2_Transponder_ID_sav : STRING ; // MSG : letzte Transponder-Chip-ID am Kanal 2
END_VAR
VAR
Ch1_Init_Ablauf : INT := 0 ;
Ch1_Init_FM : BOOL ;
Ch1_Init_OK : BOOL ;
Ch1_aktiv : BOOL ;
Ch1_Transponder_FM : BOOL ;
Ch1_Transponder : ARRAY [1..2] OF DWORD ;
Ch2_Init_Ablauf : INT := 0 ;
Ch2_Init_FM : BOOL ;
Ch2_Init_OK : BOOL ;
Ch2_aktiv : BOOL ;
Ch2_Transponder_FM : BOOL ;
Ch2_Transponder : ARRAY [1..2] OF DWORD ;
Ch1_Parameter : MOBY_Parameter ;
Ch1_Cmd : ARRAY [1..5] OF MOBY_Cmd ;
Ch1_Request : FB45 ;
Ch1_Timer : SFB4 ;
Ch2_Parameter : MOBY_Parameter ;
Ch2_Cmd : ARRAY [1..5] OF MOBY_Cmd ;
Ch2_Request : FB45 ;
Ch2_Timer : SFB4 ;
END_VAR
VAR_TEMP
DatenQuelle_Ptr : ANY ;
DatenQuelle_Adr : INT ;
atDatenQuelle AT DatenQuelle_Ptr : STRUCT
ID_Code : BYTE ;
DataTyp : BYTE ;
Anzahl : WORD ;
DB_Nr : INT ;
SpeicherPtr : DWORD ;
END_STRUCT ;
i : INT ;
END_VAR
BEGIN
// Init
IF Init AND NOT Ch1_Init_FM AND _mit_Ch1 THEN Ch1_Init_Ablauf := 1 ; END_IF ;
Ch1_Init_FM := Init ;
CASE Ch1_Init_Ablauf OF
0 :
; // warten auf Init-Befehl
1 :
Ch1_Parameter.command_Start := false ;
Ch1_Parameter.Init_Run := false ;
Ch1_Init_OK := false ;
Ch1_aktiv := false ;
Ch1_Parameter.ASM_address := PerAdresse ;
Ch1_Parameter.ASM_channel := 1 ;
Ch1_Parameter.MDS_Control := 1 ;
Ch1_Parameter.ECC_Mode := false ;
Ch1_Parameter.Reset_long := true ;
Ch1_Parameter.Moby_Mode := 5 ;
Ch1_Parameter.Scanning_Time := 0 ;
Ch1_Parameter.Option_1 := 2 ;
Ch1_Parameter.Distance_Limiting := 0 ;
Ch1_Parameter.Field_On_Time := 1 ;
Ch1_Parameter.MultiTag := 1 ;
DatenQuelle_Ptr := Ch1_Cmd ;
DatenQuelle_Adr := DINT_TO_INT(DWORD_TO_DINT(atDatenQuelle.SpeicherPtr AND dw#16#00FF_FFFF) / 8) ;
Ch1_Parameter.Command_DB_number := atDatenQuelle.DB_Nr ;
Ch1_Parameter.Command_DB_address := DatenQuelle_Adr ;
Ch1_Cmd[1].command := B#16#2 ; // MDS Befehl:1=schreiben,2=lesen,3=init,4=slg-status,8=end,A=set-ant,B=mds-status
Ch1_Cmd[1].sub_command := B#16#0 ;
Ch1_Cmd[1].Address_MDS := w#16#FFF0 ; // Auszulesende Speicher-Adresse im Chip
Ch1_Cmd[1].length := 8 ; // Anzahl der zu lesenden Daten in Bytes
DatenQuelle_Ptr := Ch1_Transponder ;
DatenQuelle_Adr := DINT_TO_INT(DWORD_TO_DINT(atDatenQuelle.SpeicherPtr AND dw#16#00FF_FFFF) / 8) ;
Ch1_Cmd[1].DAT_DB_number := atDatenQuelle.DB_Nr ;
Ch1_Cmd[1].DAT_DB_address := DatenQuelle_Adr ;
FOR i:=2 TO 5 BY 1 DO
Ch1_Cmd[i] := Ch1_Cmd[1] ;
END_FOR ;
Ch1_Init_Ablauf := 2 ;
2 :
IF NOT Ch1_Request.Init_Run AND NOT Ch1_Request.command_Start THEN Ch1_Init_Ablauf := 3 ; END_IF ;
3 :
Ch1_Parameter.Init_Run := true ;
Ch1_Init_Ablauf := 4 ;
4 :
IF Ch1_Parameter.ready THEN
Ch1_Parameter.Init_Run := false ;
Ch1_Init_OK := true ;
Ch1_Init_Ablauf := 5 ;
END_IF ;
5 :
IF Ch1_Timer.Q AND (NOT Ch1_Parameter.Error OR Ch1_Parameter.Ready) THEN
Ch1_Init_OK := false ;
Ch1_aktiv := true ;
Ch1_Init_Ablauf := 6 ;
END_IF ;
6 :
Ch1_Parameter.command_Start := true ;
; // Init komplett durchgelaufen und OK
ELSE :
Ch1_Init_Ablauf := 0 ;
END_CASE ;
Ch1_Timer (IN := (Ch1_Init_Ablauf = 5) , PT := t#1s) ;
IF NOT _mit_Ch1 OR (Ch1_Init_Ablauf = 0) THEN
Ch1_Init_Ablauf := 0 ;
Ch1_Parameter.command_Start := false ;
Ch1_Parameter.Init_Run := false ;
Ch1_Init_OK := false ;
Ch1_aktiv := false ;
END_IF ;
IF Init AND NOT Ch2_Init_FM AND _mit_Ch2 THEN Ch2_Init_Ablauf := 1 ; END_IF ;
Ch2_Init_FM := Init ;
CASE Ch2_Init_Ablauf OF
0 :
; // warten auf Init-Befehl
1 :
Ch2_Parameter.command_Start := false ;
Ch2_Parameter.Init_Run := false ;
Ch2_Init_OK := false ;
Ch2_aktiv := false ;
Ch2_Parameter.ASM_address := PerAdresse ;
Ch2_Parameter.ASM_channel := 2 ;
Ch2_Parameter.MDS_Control := 1 ;
Ch2_Parameter.ECC_Mode := false ;
Ch2_Parameter.Reset_long := true ;
Ch2_Parameter.Moby_Mode := 5 ;
Ch2_Parameter.Scanning_Time := 0 ;
Ch2_Parameter.Option_1 := 2 ;
Ch2_Parameter.Distance_Limiting := 0 ;
Ch2_Parameter.Field_On_Time := 1 ;
Ch2_Parameter.MultiTag := 1 ;
DatenQuelle_Ptr := Ch2_Cmd ;
DatenQuelle_Adr := DINT_TO_INT(DWORD_TO_DINT(atDatenQuelle.SpeicherPtr AND dw#16#00FF_FFFF) / 8) ;
Ch2_Parameter.Command_DB_number := atDatenQuelle.DB_Nr ;
Ch2_Parameter.Command_DB_address := DatenQuelle_Adr ;
Ch2_Cmd[1].command := B#16#2 ; // MDS Befehl:1=schreiben,2=lesen,3=init,4=slg-status,8=end,A=set-ant,B=mds-status
Ch2_Cmd[1].sub_command := B#16#0 ;
Ch2_Cmd[1].Address_MDS := w#16#FFF0 ; // Auszulesende Speicher-Adresse im Chip
Ch2_Cmd[1].length := 8 ; // Anzahl der zu lesenden Daten in Bytes
DatenQuelle_Ptr := Ch2_Transponder ;
DatenQuelle_Adr := DINT_TO_INT(DWORD_TO_DINT(atDatenQuelle.SpeicherPtr AND dw#16#00FF_FFFF) / 8) ;
Ch2_Cmd[1].DAT_DB_number := atDatenQuelle.DB_Nr ;
Ch2_Cmd[1].DAT_DB_address := DatenQuelle_Adr ;
FOR i:=2 TO 5 BY 1 DO
Ch2_Cmd[i] := Ch2_Cmd[1] ;
END_FOR ;
Ch2_Init_Ablauf := 2 ;
2 :
IF NOT Ch2_Request.Init_Run AND NOT Ch2_Request.command_Start THEN Ch2_Init_Ablauf := 3 ; END_IF ;
3 :
Ch2_Parameter.Init_Run := true ;
Ch2_Init_Ablauf := 4 ;
4 :
IF Ch2_Parameter.ready THEN
Ch2_Parameter.Init_Run := false ;
Ch2_Init_OK := true ;
Ch2_Init_Ablauf := 5 ;
END_IF ;
5 :
IF Ch2_Timer.Q AND (NOT Ch2_Parameter.Error OR Ch2_Parameter.Ready) THEN
Ch2_Init_OK := false ;
Ch2_aktiv := true ;
Ch2_Init_Ablauf := 6 ;
END_IF ;
6 :
Ch2_Parameter.command_Start := true ;
; // Init komplett durchgelaufen und OK
ELSE :
Ch2_Init_Ablauf := 0 ;
END_CASE ;
Ch2_Timer (IN := (Ch2_Init_Ablauf = 5) , PT := t#1s) ;
IF NOT _mit_Ch2 OR (Ch2_Init_Ablauf = 0) THEN
Ch2_Init_Ablauf := 0 ;
Ch2_Parameter.command_Start := false ;
Ch2_Parameter.Init_Run := false ;
Ch2_Init_OK := false ;
Ch2_aktiv := false ;
END_IF ;
IF (Ch1_Init_OK OR NOT _mit_Ch1) AND (Ch2_Init_OK OR NOT _mit_Ch2) THEN Init := false ; END_IF ;
// Aufruf Handshake mit RF180C
IF _mit_Ch1 AND (Ch1_Init_Ablauf >= 2) THEN
DatenQuelle_Ptr := Ch1_Parameter ;
DatenQuelle_Adr := DINT_TO_INT(DWORD_TO_DINT(atDatenQuelle.SpeicherPtr AND dw#16#00FF_FFFF) / 8) ;
Ch1_Request (Params_DB := atDatenQuelle.DB_Nr
,Params_ADDR := DatenQuelle_Adr
) ;
END_IF ;
IF _mit_Ch2 AND (Ch2_Init_Ablauf >= 2) THEN
DatenQuelle_Ptr := Ch2_Parameter ;
DatenQuelle_Adr := DINT_TO_INT(DWORD_TO_DINT(atDatenQuelle.SpeicherPtr AND dw#16#00FF_FFFF) / 8) ;
Ch2_Request (Params_DB := atDatenQuelle.DB_Nr
,Params_ADDR := DatenQuelle_Adr
) ;
END_IF ;
// Auswertung
_Ch1_Ready := Ch1_aktiv AND (Ch1_Init_Ablauf = 6) AND NOT Ch1_Parameter.Error ;
_Ch1_Error := Ch1_Parameter.Error ;
_Ch1_Transponder_vorh := Ch1_Parameter.Anz_MDS_present ;
IF _Ch1_Transponder_vorh THEN
_Ch1_Transponder_ID1_akt := Ch1_Transponder[1] ;
_Ch1_Transponder_ID2_akt := Ch1_Transponder[2] ;
_Ch1_Transponder_ID_akt := CONCAT (IN1 := DWord_2_HexString (Wert := _Ch1_Transponder_ID1_akt , Anz_Stellen := 8 , Raster := 4)
,IN2 := ' '
,IN3 := DWord_2_HexString (Wert := _Ch1_Transponder_ID2_akt , Anz_Stellen := 8 , Raster := 4)
) ;
ELSIF NOT _Ch1_Transponder_vorh AND Ch1_Transponder_FM THEN
_Ch1_Transponder_ID1_sav := _Ch1_Transponder_ID1_akt ;
_Ch1_Transponder_ID2_sav := _Ch1_Transponder_ID2_akt ;
_Ch1_Transponder_ID_sav := CONCAT (IN1 := DWord_2_HexString (Wert := _Ch1_Transponder_ID1_sav , Anz_Stellen := 8 , Raster := 4)
,IN2 := ' '
,IN3 := DWord_2_HexString (Wert := _Ch1_Transponder_ID2_sav , Anz_Stellen := 8 , Raster := 4)
) ;
ELSE
_Ch1_Transponder_ID_akt := '' ;
_Ch1_Transponder_ID1_akt := 0 ;
_Ch1_Transponder_ID2_akt := 0 ;
END_IF ;
Ch1_Transponder_FM := _Ch1_Transponder_vorh ;
_Ch2_Ready := Ch2_aktiv AND (Ch2_Init_Ablauf = 6) AND NOT Ch2_Parameter.Error ;
_Ch2_Error := Ch2_Parameter.Error ;
_Ch2_Transponder_vorh := Ch2_Parameter.Anz_MDS_present ;
IF _Ch2_Transponder_vorh THEN
_Ch2_Transponder_ID1_akt := Ch2_Transponder[1] ;
_Ch2_Transponder_ID2_akt := Ch2_Transponder[2] ;
_Ch2_Transponder_ID_akt := CONCAT (IN1 := DWord_2_HexString (Wert := _Ch2_Transponder_ID1_akt , Anz_Stellen := 8 , Raster := 4)
,IN2 := ' '
,IN3 := DWord_2_HexString (Wert := _Ch2_Transponder_ID2_akt , Anz_Stellen := 8 , Raster := 4)
) ;
ELSIF NOT _Ch2_Transponder_vorh AND Ch2_Transponder_FM THEN
_Ch2_Transponder_ID1_sav := _Ch2_Transponder_ID1_akt ;
_Ch2_Transponder_ID2_sav := _Ch2_Transponder_ID2_akt ;
_Ch2_Transponder_ID_sav := CONCAT (IN1 := DWord_2_HexString (Wert := _Ch2_Transponder_ID1_sav , Anz_Stellen := 8 , Raster := 4)
,IN2 := ' '
,IN3 := DWord_2_HexString (Wert := _Ch2_Transponder_ID2_sav , Anz_Stellen := 8 , Raster := 4)
) ;
ELSE
_Ch2_Transponder_ID_akt := '' ;
_Ch2_Transponder_ID1_akt := 0 ;
_Ch2_Transponder_ID2_akt := 0 ;
END_IF ;
Ch2_Transponder_FM := _Ch2_Transponder_vorh ;
END_FUNCTION_BLOCK