IpcDiagnostics_2

This sample is very similar to the IpcDiagnostics sample and differs only in terms of the implementation flavor and optional writing of a parameter.

The program is structured in such a way that it can easily be adapted for access to other IPC diagnostics parameters.

Enumeration definition

{attribute 'qualified_only'}
TYPE E_State :
(
    Init,
    Idle,
    ReadOnce_CpuUsage,
    ReadOnce_CpuTemperature,
    ReadOnce_SrnMainboard,
    ReadOnce_SrnIPC,
    Write_DHCP,
    Write_IPAddr,
    ReadPeriodically,
    Error
);
END_TYPE

Variable Declaration

PROGRAM MAIN
VAR
    bStart                 : BOOL := TRUE;           // flag to trigger (re)start of statemachine
    bSkipSettingIPAddr     : BOOL := TRUE;           // for safety reasons - set FALSE if you want to set the IP address
    eState                 : E_State := E_State.Init;
    
    bError                 : BOOL;                   // error flag (indicator: error occured)
    hrErrorCode            : HRESULT;                // last error code
    hrGetValue             : HRESULT;
    
    nCpuUsage              : UINT;                   // CPU usage [%]
    nCpuTemperature        : INT;                    // CPU temerature [°C]
    sSerialNumberMainboard : STRING;                 // serial number of mainboard
    sSerialNumberIPC       : STRING;                 // serial number of IPC
    nNicModuleIdx          : USINT := 1;             // select which NIC adapter should be adapted with a new IP address
    bDHCP                  : BOOL := FALSE;
    sIPAddr                : T_IPv4Addr := '174.18.3.154'; // the new ip address 
    aFanSpeed              : ARRAY[1..2] OF UINT;    // speed of fans - should be read periodically
    
    fbDiagRegister         : FB_IPCDiag_Register := (sNetId:=cNetId);
    fbDiagRead             : FB_IPCDiag_ReadParameter := (sNetId:=cNetId);
    fbDiagReadPeriodic     : FB_IPCDiag_ReadParameterPeriodic := (tPeriod:= T#10S, sNetId:=cNetId);
    fbDiagWrite            : FB_IPCDiag_WriteParameter := (sNetId:=cNetId);
END_VAR
VAR CONSTANT
    cNetId : T_AmsNetID := ''; // local
END_VAR

Initialization

E_State.Init:
    IF NOT fbDiagRegister.bBusy THEN
        fbDiagRegister(bExecute:=TRUE);
    ELSE
        fbDiagRegister(bExecute:=FALSE, bError=>bError, hrErrorCode=>hrErrorCode);
    END_IF
    IF NOT fbDiagRegister.bBusy THEN
        IF fbDiagRegister.bError THEN
            eState := E_State.Error;
        ELSE
            eState := E_State.Idle;
        END_IF
    END_IF

Simple parameter query (using CPU temperature as an example)

E_State.ReadOnce_CpuTemperature:
    IF NOT fbDiagRead.bBusy THEN
        fbDiagRead(bExecute:= TRUE, eParameterKey:=E_IPCDiag_ParameterKey.CPU_Temp, fbRegister:=fbDiagRegister);    
    ELSE
        fbDiagRead(bExecute:= FALSE, fbRegister:=fbDiagRegister, bError=>bError, hrErrorCode=>hrErrorCode);
    END_IF
    IF NOT fbDiagRead.bBusy THEN
        IF fbDiagRead.bError THEN
            eState := E_State.Error;
        ELSE // get value
            hrGetValue := fbDiagRead.GetParameter(pBuffer:=ADR(nCpuTemperature), nBufferSize:=SIZEOF(nCpuTemperature));    
            IF FAILED(hrGetValue) THEN
                eState := E_State.Error;
            ELSE
                eState := E_State.ReadOnce_SrnMainboard;
            END_IF
        END_IF
    END_IF        

Writing a parameter (using the IP address as an example)

E_State.Write_IPAddr:
    IF NOT fbDiagWrite.bBusy THEN
        fbDiagWrite(bExecute:= TRUE, 
                    eParameterKey:=E_IPCDiag_ParameterKey.NIC_IPv4Address,
                    pBuffer:=ADR(sIPAddr),
                    nBufferSize:=INT_TO_UDINT(LEN(sIPAddr)+1),
                    nModuleIdx:=nNicModuleIdx,
                    fbRegister:=fbDiagRegister );    
    ELSE
        fbDiagWrite(bExecute:= FALSE, fbRegister:=fbDiagRegister, bError=>bError, hrErrorCode=>hrErrorCode);
    END_IF
    IF NOT fbDiagWrite.bBusy THEN
        IF fbDiagWrite.bError THEN
            eState := E_State.Error;
        ELSE
            eState := E_State.ReadPeriodically;
        END_IF
    END_IF

Periodic query of a parameter (using the fan speed as an example)

E_State.ReadPeriodically:
    fbDiagReadPeriodic(bEnable:=TRUE, eParameterKey:=E_IPCDiag_ParameterKey.Fan_Speed, fbRegister:=fbDiagRegister,
                       bError=>bError, hrErrorCode=>hrErrorCode);
    IF fbDiagReadPeriodic.bValid THEN
        fbDiagReadPeriodic.GetParameter(pBuffer:=ADR(aFanSpeed), nBufferSize:=SIZEOF(aFanSpeed) );    
    END_IF
    IF fbDiagReadPeriodic.bError THEN
        eState := E_State.Error;
    END_IF