TIA RFID Tag auslesen mit RF120C und RF220R scheitert

MKK3103

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich dachte mit reinen Siemens-Produkten wäre RFID eine unkomplizierte Sache, leider komme ich aber aktuell nicht weiter und benötige eure Hilfe.
Ich habe mir ein System bestehend aus: S7-1211C, Kommunikationsmodul RF120C und einem "Kopf" (RF220R) aufgebaut und wie von Siemens beschrieben programmiert. Rufe in meinem OB1 Erst den FB Reset-Reader und dann denn FB Read auf. Das ausführen des Resets funktioniert auch noch tadellos. Allerdings sobald ich den Read-Befehl anstoße bleibt der Baustein Busy. Ist auch logisch, da er auf einen Tag wartet. Jetzt mein Problem, ich kann den Tag noch so lange davor halten, er erkennt ihn einfach nicht. Tag ist ein MIFARE classik. Müsste also auch funktionieren. Habe ich irgendwo einen Gedankenfehler oder habt ihr eine Idee wo der Fehler noch liegen könnte ?


Danke im vorraus
 
Hallo,
der RFID-Reader von Siemens ist doch die "Creme de la Creme" - so richtig schön "von hinten durch die Brust ins Auge" - soll heissen : von jedem anderen Hersteller hättest du wahrscheinlich ein unkomplizierteres System erworben haben können.
Sei es drum - ich hatte für den Reader (und ich meine auch in der Konstellation) für S7-Classic mal einen SCL-Baustein erstellt.
Ich werde den dann morgen mal hier einstellen. Vielleicht hilft dir das ja weiter ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss mich korrigieren -es war ein RF180C bei mir - vielleicht hilft der Code dir aber trotzdem "etwas" weiter :
Code:
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
 
Zurück
Oben