Abfrage von CPU-Daten (generisch)
Dieses Beispiel zeigt den Zugriff auf CPU-Daten der IPC-Diagnose über den generischen Funktionsbaustein FB_MDP_ReadElement.
Der Aufbau des Programms ist so gestaltet, dass das Programm leicht für den Zugriff auf andere Module der IPC-Diagnose angepasst werden kann. Programmzeilen, die für eine Anpassung des Programms auf andere Module der IPC-Diagnose geändert werden müssten, sind im Kommentar mit der Zeichenfolge //** markiert.
Nachfolgend auf den Programmcode des Beispiels finden Sie die textuelle Beschreibung des Beispielprogramms.
Beispiel zum Zugriff über den generischen Funktionsbaustein FB_MDP_ReadElement
Einzelne CPU-Daten sind über einen Subindex im Modul CPU in der Configuration Area der IPC‑Diagnose auslesbar. Dazu wird der generische Funktionsbaustein FB_MDP_ReadElement verwendet.
Enumerationsdefinition
//** = simply adjust these lines if modifying code for own purposes
// central definition of state machine states
// (supports easy program modification)
{attribute 'qualified_only'}
TYPE E_State :
(
Idle,
ReadCPUusageInit, //** initiate reading CPU usage
ReadCPUusageProcess //** process reading CPU usage
);
END_TYPE
Variablendeklaration
PROGRAM MAIN
VAR
// internal use
sAmsNetId : STRING := ''; //** ADS Net ID (local = '')
eState : E_State; // Enum with index for state machine
bStart : BOOL := TRUE; // flag to trigger (re)start of statemachine
nData : UINT; // data storage for unsigned integer
stMDP_Addr : ST_MDP_Addr; // structure will include all address parameters
// FB instances
fbReadMDPElement : FB_MDP_ReadElement; // instance of FB for reading MDP element
// results of execution
bError : BOOL; // error flag (indicator: error occured)
nErrID : UDINT; // last error ID
nCpuUsage : UINT; // buffer for CPU usage (%)
END_VAR
Programmcode
// For an easy re-use of the following code for own purposes, parts of this sample program use
// "general" data names (and copy the results in specific variables after processing the code).
CASE eState OF
E_State.Idle:
IF bStart THEN
bStart := FALSE;
eState := E_State.ReadCPUusageInit; //** initiate first state
END_IF
E_State.ReadCPUusageInit:
stMDP_Addr.nArea := INT_TO_BYTE(eMDP_Area_ConfigArea); //** set area address to "Config Area"
stMDP_Addr.nTableId := 1; //** table ID in module for "cpu properties"
stMDP_Addr.nSubIdx := 2; //** subindex in table ID for "CPU usage"
fbReadMDPElement(
bExecute := TRUE, // Flag: trigger execution of FB
eModuleType := eMDP_ModT_CPU, //** desired module type = CPU
stMDP_Addr := stMDP_Addr, // MDP address structure. Dynamic module ID added internally.
iModIdx := 0, //** instance of desired module type (0 = first instance)
pDstBuf := ADR(nData), // buffer for storing data
cbDstBufLen := SIZEOF(nData), // length of buffer
sAmsNetId := sAmsNetId, // AMS Net ID
); //** Note: fbReadMDPElement.tTimeOut must be > cycle time!
eState := E_State.ReadCPUusageProcess; //** next state: process FB
E_State.ReadCPUusageProcess: //** process FB: request CPU data
fbReadMDPElement(bExecute := FALSE); // Flag: Get execution state of FB
//** Note: fbReadMDPElement.tTimeOut must be > cycle time!
IF NOT fbReadMDPElement.bBusy THEN // FB executed?
IF fbReadMDPElement.bError THEN // Error?
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 := E_State.Idle; // finish state machine
ELSE // set parameters for next steps
bError := FALSE; // turn off error flag
nCpuUsage := nData; //** store CPU usage in dedicated variable
eState := E_State.ReadCPUusageInit; //** next state
END_IF
END_IF
END_CASE
Beschreibung des Beispielprogramms
Der Funktionsbaustein FB_MDP_ReadElement erfordert minimal die im Folgenden aufgeführten Parameter:


- Einen Speicherbereich für die MDP‑Adressstruktur
- Den MDP‑Modultypen
- Die Adresse und Größe des Speicherbereichs für die Ausgabedaten des Funktionsbausteins
- Die AMS-Adresse (AMS Net ID)
Zur Vollständigkeit sind hier noch die Ausgabewerte des Funktionsbausteins beschrieben:

Eine sehr wichtige Rolle hat die Struktur zur Adressierung der gewünschten Information. Sie ist durch den Datentyp ST_MDP_Addr beschrieben:

Für die Ermittlung des Parameters „nArea“ gibt es zwei Möglichkeiten:
- Die einzelnen Areas sind in der Tc2_MDP-Bibliothek als Enumeration hinterlegt. Dieser Eintrag kann als leicht lesbarer Eingangsparameter genutzt werden (gestrichelter roter Pfeil).
- Der Wert für die Area kann alternativ auch dem Index eines Tables entnommen werden (linke 4 Bit - roter Pfeil)

Der Parameter „nModule“ ist KEIN Eingabeparameter. Ihm wird die vom Funktionsbaustein ermittelte Moduladresse (=ModuleID) zugewiesen, nachdem dieser die gewünschte Modulinstanz ermittelt hat.
„nTableId“ entsprechen den rechten 4 Bit des Table-Index (gelber Pfeil).
„Subindex“ ist die Nummer des Eintrags in der Tabelle (blauer Pfeil).
Der Parameter „eModuleType“ gibt den Typ des Moduls an. Auch für den Modultyp gibt es eine Enumeration, die zwecks besserer Lesbarkeit des Programmes verwendet werden kann:

Alternativ kann der Wert auch der Modulbeschreibung entnommen und direkt eingetragen werden.
Aufbau der State Machine
Die Status der State Machine sind über Enumerationswerte in einem DUT definiert und können so zentral einfach angepasst bzw. erweitert werden.

Funktionsbereiche der State Machine

Ein- und Ausgabeparameter des Beispielprogrammes


