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:

Abfrage von CPU-Daten (generisch) 1:
Abfrage von CPU-Daten (generisch) 2:

Zur Vollständigkeit sind hier noch die Ausgabewerte des Funktionsbausteins beschrieben:

Abfrage von CPU-Daten (generisch) 3:

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

Abfrage von CPU-Daten (generisch) 4:

Für die Ermittlung des Parameters „nArea“ gibt es zwei Möglichkeiten:

Abfrage von CPU-Daten (generisch) 5:

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:

Abfrage von CPU-Daten (generisch) 6:

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.

Abfrage von CPU-Daten (generisch) 7:

Funktionsbereiche der State Machine

Abfrage von CPU-Daten (generisch) 8:

Ein- und Ausgabeparameter des Beispielprogrammes

Abfrage von CPU-Daten (generisch) 9:
Abfrage von CPU-Daten (generisch) 10:
Abfrage von CPU-Daten (generisch) 11: