Abfrage des Lüfterstatus (generisch)

Dieses Beispiel zeigt den Zugriff auf die Daten der Lüftergeschwindigkeit über den generischen Funktionsbaustein FB_MDP_ReadElement. Es kann zur Diagnose eines Lüfterausfalls verwendet werden (Lüftergeschwindigkeit = 0).

Voraussetzung ist das Vorhandensein eines Lüfters. Wenn kein Lüfter im IPC vorhanden ist, wird der angesprochene Modultyp vom IPC nicht unterstützt, und der Zugriffsversuch liefert die Fehlermeldung 16#EC800002 zurück.

Der Inhalt des FAN-Moduls ist in der Configuration Area der IPC-Diagnose beschrieben. Für den Zugriff wird der generische Funktionsbaustein FB_MDP_ReadElement verwendet.

Eine Beschreibung des Aufbaus dieses Beispielprogramms finden Sie im Beispiel Abfrage von CPU-Daten (generisch).

Beispiel zum Zugriff über den generischen Funktionsbaustein FB_MDP_ReadElement

Enumeratiosdefinition

//** = 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,                    // idle state
    ReadFanSpeedInit,        //** initiate reading fan speed
    ReadFanSpeedProcess      //** process reading fan speed
);
END_TYPE
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 restart of statemachine
    nData               : UINT;                // data storage for unsigned integer  
    stMDP_Addr          : ST_MDP_Addr;         // structure will include all address parameters
    nModuleIndex        : USINT := 0;          //** Fan index (no. of fan)
    
    // 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
    aFanSpeed           : ARRAY[0..1] OF UINT; //** buffer for speed of fans
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).
// Remark: Error 16#EC800002 means module type not supported (IPC does not provide this type of information, e.g. does not have fans)

CASE eState OF
    E_State.Idle:
        IF bStart THEN
            bStart := FALSE;
            eState := E_State.ReadFanSpeedInit;    //** initiate first state
        END_IF
 
    E_State.ReadFanSpeedInit:                 //**
        stMDP_Addr.nArea := INT_TO_BYTE(eMDP_Area_ConfigArea); //** set area address to "Config Area"
        stMDP_Addr.nTableId := 1;             //** table ID in module for "Fan properties"
        stMDP_Addr.nSubIdx := 1;              //** subindex in table ID for "Fan speed"

        fbReadMDPElement(
            bExecute := TRUE,                 // Flag: trigger execution of FB
            eModuleType := eMDP_ModT_Fan,     //** desired module type = Fan
            stMDP_Addr := stMDP_Addr,         // MDP address structure. Dynamic module ID added internally.
            iModIdx := nModuleIndex,          //** 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.ReadFanSpeedProcess;//** next state: process FB

    E_State.ReadFanSpeedProcess:              //** process FB: request fan 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
                aFanSpeed[nModuleIndex] := nData; //** store fan speed in dedicated array
                IF nModuleIndex = 0 THEN      //** Current fan = fan 1?
                    nModuleIndex := 1;        //** Read fan 2 (= second module instance) in next loop
                ELSE                          //**
                    nModuleIndex := 0;        //** Read fan 1 (= first module instance) in next loop
                END_IF                        //**
                eState := E_State.ReadFanSpeedInit; //** next state
            END_IF
        END_IF

END_CASE