P#011909087 PILZ PITmode Programmcode für RFID-Key Übertragung

kapo666

Level-1
Beiträge
157
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

habe vor einiger Zeit diesen Betriebsarten Wahlschalter von PILZ in die hand bekommen. Den PITMode m3.2p.
Die Verkabelung und die Betriebsart (Funktionserweitertes Übertragen) ist eingestellt.
Das Umschalten der einzelnen Berechtigungsstufen funktioniert ohne Probleme.

Jedoch habe ich Probleme die RFID-Key des Transponderschlüssels aus dem Wahlschalter zu bekommen.

Laut Beschreibung gibt es eine definiertes Übertagungsprotokoll, welches durch die SPS programmiert werden muss.
Die RFID Nummer ist 28 Bits lang und wird Bitweise über eine Leitung (IDData) zur Steuerung übertragen. Durch IDRequest wird ein neues Bit angefordert, bekomme aber keine IDResponse antwort aus dem
Wahlschalter und kann somit die RFID Nummer auch nicht auslesen.

Hat einer von euch mit diesem Gerät schon zu tun gehabt und kann mir mit dem Programmcode weiterhelfen.

Marco
 
Ich hab da mal einen Pitmode eingebunden.
Code ist nicht unbedingt schön.

Code:
FUNCTION_BLOCK pitmode_1
VAR_INPUT
    IDo0:BOOL;
    IDo1:BOOL;
    IDo2:BOOL;
    SLo0:BOOL;
    SLo1:BOOL;
    SLo2:BOOL;
    SLo3:BOOL;
END_VAR
VAR_OUTPUT
    IDi0:BOOL;
    keyid:UDINT;
    keymode:UDINT;
    Mode1:BOOL;
    Mode2:BOOL;
    Mode5:BOOL;
    serialnr: STRING(10);
END_VAR
VAR
    error: BOOL;
    key_online: BOOL;
    syncstart: BOOL;
    state_a: INT;
    timeout: BOOL;
    count: INT;
    tim1: TON;
    tim0: TON;
    tim2:TON;
    tim3:TON;
    tim4:TON;
    readarr: ARRAY[0..28] OF BOOL;
    a: INT;
    reada: BOOL;
    vz: BOOL;
    readb: BOOL;
    R_TRIG:R_TRIG;
    FB_FormatString:FB_FormatString;
    SLmode:WORD:=0;
END_VAR


(* Modul zur Einbindung eines PITmode Betriebsartenumschalters*)
(******************************************************************************
- Handshake-gesteuertes Übertragungsverfahren


******************************************************************************)

(* auf gesteckten Key warten *)
key_online:=IDo0;     (*key istgesteckt*)
  (*key ist neu eingesteckt, ID bereit zum Abruf*)
R_TRIG(CLK:=IDo0 , Q=>syncstart );


(* KeyID abrufen *)
tim0(IN:=timeout , PT:=t#100ms , Q=> , ET=> );
tim2(IN:=error, PT:=t#100ms , Q=> , ET=> ); (*errortimer*)
tim1(IN:=IDi0 , PT:=t#50ms , Q=> , ET=> );   (*timeouttimer*)
tim3(IN:= , PT:=t#10ms , Q=> , ET=> );
tim4(IN:=IDo0 , PT:=t#150ms , Q=> , ET=> );

IF syncstart OR (key_online AND timeout) OR  (key_online AND error)THEN state_a:=10; END_IF;
IF NOT key_online THEN state_a:=0; END_IF;

IF tim1.Q AND NOT IDo1 THEN timeout:=TRUE; state_a:=0; END_IF;
CASE state_a OF

0:
IDi0:=FALSE;

10: (*übertragung initialisieren*)
keyid:=0;
keymode:=0;
tim3.IN:=FALSE;
IDi0:=FALSE;
timeout:=FALSE;
count:=27;
    FOR a:=0 TO 27 BY 1 DO
    readarr[a]:=0;
    END_FOR;

state_a:=20;

20:(*übertragung starten*)
IDi0:=TRUE;   (*idrequest senden*)
    IF IDo1 THEN
    vz:=FALSE;
    state_a:=30;
    END_IF;


30: (*bit einlesen*)
reada:=IDo2;  (*erstes mal einlesen*)
IF vz THEN readb:=IDo2;  (*zweites mal einlesen*)
IF reada =readb THEN
    readarr[count]:=reada;
    count:=count - 1;
    IDi0:=FALSE;
    tim3.IN:=TRUE;
    vz:=FALSE;
    state_a:=40;
ELSE
    error:=TRUE;
    state_a:=0;
END_IF;
END_IF;
vz:=TRUE;

40:(*warten und ende*)
IF tim3.Q AND count >= 0 AND NOT IDo1 THEN
    tim3.IN:=FALSE;
    state_a:=20;
END_IF;

IF count = -1 AND tim4.Q THEN
    FOR a:=23 TO 0 BY -1 DO    (*keyid speichern*)
        IF readarr[a] THEN keyid:=keyid+REAL_TO_UDINT(EXPT(2,a)); END_IF;
    END_FOR;
    FOR a:=27 TO 24 BY -1 DO  (*keyberechtigung speichern*)
        IF readarr[a] THEN keymode:=keymode+REAL_TO_UDINT(EXPT(2,a-24)); END_IF;
    END_FOR;
    state_a:=0;
    END_IF;

END_CASE;

FB_FormatString(
    sFormat:= '%.2u%.7u;',
    arg1:= F_UDINT(keymode),
    arg2:=F_UDINT(keyid) ,
    arg3:= , 
    arg4:= , 
    arg5:= ,
    arg6:= , 
    arg7:= , 
    arg8:= , 
    arg9:= , 
    arg10:= , 
    bError=> ,
    nErrId=> , 
    sOut=>serialnr );

SLmode.0:=SLo0;
SLmode.1:=SLo1;
SLmode.2:=SLo2;
SLmode.3:=SLo3;

mode1:=mode2:=mode5:=FALSE;

IF SLmode = 16#3 AND IDo0 THEN
    mode5:=TRUE;
ELSIF SLmode = 16#8 AND IDo0 THEN
    mode1:=TRUE;
ELSIF SLmode = 16#9 AND IDo0 THEN
    mode2:=TRUE;
END_IF;

Mir war so, als hätte das so funktioniert. Ich hatte das mal schnell bei der Inbetriebnahme nach Datenblatt zusammengeschrieben. Wenn ich das richtig in Erinnerung habe war da ein genau beschreibendes Schema der Kommunikation im Datenblatt.
 
Zuletzt bearbeitet:
Hallo,

@andi: danke für deinen Code. Hab ihn für mich ein bisschen Abändern müssen, hat mir aber fürs Verständniss super weiter geholfen.

@Tech. Support: Danke, hab mich auch schon mit eurem Supoort Team zusammen geschlossen.

Liebe Grüße
Marco
 
Zurück
Oben