IpcDiagnostics

Das Beispiel zeigt das einfache Auslesen von verschiedenen IPC Diagnose Parametern mit Hilfe der Funktionsbausteine FB_IPCDiag_ReadParameter und FB_IPCDiag_ReadParameterPeriodic.

Es werden sechs Parameter einmalig und ein Parameter, dessen Werte sich zeitlich verändern, periodisch ausgelesen. Für diese Parameter werden Variablen angelegt.

PROGRAM IpcDiagnostics
VAR CONSTANT
    cNetId         : T_AmsNetID := '';        // local
    cNbrParameters : UDINT := 6;              // number of parameters to read
END_VAR
VAR
    sDeviceName     : STRING(39);
    nCpuFreq        : UDINT;
    nTcBuild        : UINT;
    aNetworkNames   : ARRAY[1..3] OF STRING(79); // array in order to receive info of up to three network ports (NICs)
    aIpAddr         : ARRAY[1..3] OF STRING(39); // array in order to receive info of up to three network ports (NICs)
    aDHCP           : ARRAY[1..3] OF BOOL;       // array in order to receive info of up to three network ports (NICs)
    nCpuTemperature : INT;                       // should be read periodically

    eState           : E_State := E_State.Init;
    hrGetValue       : HRESULT;
    fbDiagRegister   : FB_IPCDiag_Register := (sNetId:=cNetId);
    fbDiagRead       : FB_IPCDiag_ReadParameter := (sNetId:=cNetId);
    nKeyIdx          : USINT := 1;
    aParameterKeys   : ARRAY[1..cNbrParameters] OF E_IPCDiag_ParameterKey 
                                                   := [ E_IPCDiag_ParameterKey.IPCDeviceName,
                                                        E_IPCDiag_ParameterKey.CPU_Frequency,
                                                        E_IPCDiag_ParameterKey.TC_VersionBuild,
                                                        E_IPCDiag_ParameterKey.NIC_Name,
                                                        E_IPCDiag_ParameterKey.NIC_IPv4Address,
                                                        E_IPCDiag_ParameterKey.NIC_DHCP ];
    fbDiagReadPeriodic : FB_IPCDiag_ReadParameterPeriodic := (eParameterKey:=E_IPCDiag_ParameterKey.eCPU_Temp, 
                                                              tPeriod:= T#10S, sNetId:=cNetId);
END_VAR

Jeder Parameter wird wie folgt ausgelesen: Die Instanz von FB_IPCDiag_ReadParameter wird getriggert und zyklisch aufgerufen bis der Lesevorgang abgeschlossen ist. Daraufhin wird der Parameter mit Hilfe der Methode GetParameter() in die dafür vorbereitete eigene Variable kopiert.

E_State.ReadOnce: // reads every parameter once
    IF NOT fbDiagRead.bBusy THEN
        fbDiagRead(bExecute:= TRUE, eParameterKey:=aParameterKeys[nKeyIdx], fbRegister:=fbDiagRegister);    
    ELSE
        fbDiagRead(bExecute:= FALSE, fbRegister:=fbDiagRegister);
    END_IF
    IF NOT fbDiagRead.bBusy THEN
        IF fbDiagRead.bError THEN
            eState := E_State.Error;
        ELSE // get value
            IF aParameterKeys[nKeyIdx] = E_IPCDiag_ParameterKey.IPCDeviceName THEN
                hrGetValue := fbDiagRead.GetParameter(pBuffer:=ADR(sDeviceName), nBufferSize:=SIZEOF(sDeviceName));
                
            ELSIF aParameterKeys[nKeyIdx] = E_IPCDiag_ParameterKey.CPU_Frequency THEN
                hrGetValue := fbDiagRead.GetParameter(pBuffer:=ADR(nCpuFreq), nBufferSize:=SIZEOF(nCpuFreq));

            ...

            END_IF
                
            IF SUCCEEDED(hrGetValue) THEN
                IF nKeyIdx = cNbrParameters THEN // all keys successfully read
                    nKeyIdx := 1;
                    eState := E_State.ReadPeriodically;
                ELSE
                    nKeyIdx := nKeyIdx + 1;
                END_IF
            ELSE
                eState := E_State.Error;
            END_IF
        END_IF
    END_IF    

Sind alle sechs Parameter erfolgreich gelesen, geht das Beispielprogramm vom Zustand E_State.ReadOnce in den Zustand E_State.ReadPeriodically, in dem die siebte Variable periodisch gelesen wird. Die Instanz von FB_IPCDiag_ReadParameterPeriodic wird zyklisch aufgerufen. Intern wird der gewählte Parameter mit der eingestellten Periode von 10 Sekunden abgefragt. Sobald der Bausteinausgang bValid gesetzt ist, kann ein gültiger Wert in die vorbereitete Variable kopiert werden.

E_State.ReadPeriodically:
    fbDiagReadPeriodic(bEnable:=TRUE, fbRegister:=fbDiagRegister);
    IF fbDiagReadPeriodic.bValid THEN
        fbDiagReadPeriodic.GetParameter(pBuffer:=ADR(nCpuTemperature), nBufferSize:=SIZEOF(nCpuTemperature) );    
    END_IF
    IF fbDiagReadPeriodic.bError THEN
        eState := E_State.Error;
    END_IF

Möchten Sie das Beispiel um eine weitere periodische Parameterabfrage ergänzen, so können Sie eine zusätzliche Instanz von FB_IPCDiag_ReadParameterPeriodic deklarieren und diese ebenso im Zustand E_State.Ready aufrufen.

Download: TC3_PlcSample_IpcDiag