IPC-Seriennummern lesen
Dieses Beispiel zeigt den Zugriff auf die Seriennummer des IPCs sowie die Seriennummer des Mainboards des IPC
- Die Seriennummer des Mainboards ist über einen SubIndex im Modul Mainboard in der Configuration Area der IPC-Diagnose auslesbar. Dazu wird der generelle Funktionsbaustein FB_MDP_ReadElement verwendet
- Die Seriennummer des IPCs ist über den Index 0xF9F0 der Device Area der IPC-Diagnose auslesbar. Dazu wird der generelle Funktionsbaustein FB_MDP_ReadIndex verwendet.
Beispiel zur Abfrage der Seriennummern eines Beckhoff IPCs
Enumerationsdefinition
(* central definition of state machine states *)
TYPE E_State :
(
Idle,
ReadSnoMainboardInit,
ReadSnoMainboardProcess,
ReadSnoIPCInit,
ReadSnoIPCProcess
);
END_TYPE
Variablendeklaration
PROGRAM MAIN
VAR
sAmsNetId : STRING := ''; (* ADS Net ID (local = '') *)
eState : E_State; (* Enum with index for state machine *)
bStart : BOOL := TRUE; (* flag to trigger restart of statemachine *)
sData : STRING; (* data storage for string variable *)
stMDP_Addr : ST_MDP_Addr; (* structure which will include all address parameters *)
(* FB instances *)
fbReadMDPElement : FB_MDP_ReadElement;
fbReadMDPIndex : FB_MDP_ReadIndex;
(* results of execution *)
bError : BOOL; (* error flag *)
nErrID : UDINT; (* last error ID *)
sSerialNoMainboard : STRING; (* buffer for serial number of mainboard *)
sSerialNoIPC : STRING; (* buffer for serial number of IPC *)
END_VAR
Programmcode
CASE eState OF
Idle:
IF bStart THEN
bStart := FALSE;
eState := ReadSnoMainboardInit; (* initiate first state *
END_IF
(* read serial number of mainboard ************************************************************** *)
ReadSnoMainboardInit:
sData := ''; (* clear data buffer *)
sSerialNoMainboard := ''; (* clear buffer for serial number of mainboard *)
stMDP_Addr.nArea := INT_TO_BYTE(eMDP_Area_ConfigArea); (* set area address to "Config Area" *)
stMDP_Addr.nTableId := 1; (* table ID in index for "mainboard information" *)
stMDP_Addr.nSubIdx := 2; (* subindex in table ID for "serial number" *)
fbReadMDPElement(
bExecute := TRUE,
eModuleType := eMDP_ModT_Mainboard,
stMDP_Addr := stMDP_Addr, (* MDP address structure. Dynamic module ID will be added internally. *)
iModIdx := 0, (* Instance of desired module type (default: 0 = first instance) *)
pDstBuf := ADR(sData),
cbDstBufLen := SIZEOF(sData),
sAmsNetId := sAmsNetId,
);
eState := ReadSnoMainboardProcess;
ReadSnoMainboardProcess:
fbReadMDPElement(bExecute := FALSE);
IF NOT fbReadMDPElement.bBusy THEN
IF fbReadMDPElement.bError THEN
bError := TRUE; (* set error flag *)
nErrID := fbReadMDPElement.nErrID; (* store error id (16#ECA60105 = BIOS or HW does not support this data (here: mainboard data)) *)
eState := Idle;
ELSE (* set parameters for next steps *)
bError := FALSE; (* turn off error flag *)
sSerialNoMainboard := sData; (* store serial number of mainboard in dedicated variable *)
eState := ReadSnoIPCInit;
END_IF
END_IF
(* read serial number of IPC ************************************************************** *)
ReadSnoIPCInit:
sData := ''; (* clear data buffer *)
sSerialNoIPC := ''; (* clear buffer for serial number of IPC *)
fbReadMDPIndex(
bExecute := TRUE,
nIndex := 16#F9F0, (* index: read serial number IPC (-> see docu 'MDP device area') *)
nSubIndex := 0, (* first subdindex (there is only one available for index 16#F9F0) *)
pDstBuf := ADR(sData), cbDstBufLen := SIZEOF(sData),
sAmsNetId := sAmsNetId,
);
eState := ReadSnoIPCProcess;
ReadSnoIPCProcess:
fbReadMDPIndex(bExecute := FALSE);
IF NOT fbReadMDPIndex.bBusy THEN
IF fbReadMDPIndex.bError THEN
bError := TRUE; (* set error flag *)
nErrID := fbReadMDPIndex.nErrID; (* store error id (16#ECA60105 = BIOS or HW does not support this data (here: IPC serial number)) *)
eState := Idle;
ELSE (* set parameters for next steps *)
bError := FALSE; (* turn off error flag *)
sSerialNoIPC := sData; (* store serial number of mainboard *)
eState := Idle;
END_IF
END_IF
END_CASE
Rückgabe Seriennummer des Mainboards statt Seriennummer des IPCs
Bei älteren BIOS-Versionen (vor Q4/2013) wurde die Seriennummer noch nicht im IPC BIOS gespeichert. In diesen Fällen ist der Rückgabewert die Seriennummer des IPC Mainboards. Bei älteren Beckhoff Automation Device-Driver-Versionen ist der Rückgabewert ebenfalls die Seriennummer des IPC Mainboards. Die Seriennummer des IPC Mainboards kann immer über das Mainboard Modul gelesen werden.