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