WebVisu:读取客户端的IP地址
- 创建标准项目并选择 CODESYS Control Win V3 作为设备。
- 通过网络扫描连接目标系统。

- 在设备树中插入可视化。 然后插入带有可视化类型 TargetVisu 和 WebVisu 的可视化管理器。 此外,还会自动创建一个 Visu_Task。

从 SP17 开始:
- 打开库管理器并添加以下库: VisuUtils

- 创建一个名为 FB_Iteration 的新 FB 并实现接口 VU.IVisualizationClientIteration。

FB 会自动创建以下方法: EndIteration HandleClient StartIteration
- 按如下修改 FB_Iteration 功能块:
声明
FUNCTION_BLOCK FB_Iteration IMPLEMENTS VU.IVisualizationClientIteration
VAR CONSTANT
c_MaxClients : __XINT := 5;
END_VAR
VAR
_iIndex : __XINT;
asIpAddresses : ARRAY [0..c_MaxClients-1] OF STRING;
END_VAR
- 按如下修改 EndIteration 方法:
声明
METHOD EndIteration
VAR
_iCounter : __XINT;
END_VAR
实现
FOR _iCounter := (c_MaxClients - 1) TO _iIndex BY -1 DO
asIpAddresses[_iCounter] := '';
END_FOR
- 按如下修改 HandleClient 方法:
实现
IF _iIndex <= (c_MaxClients - 1) THEN
asIpAddresses[_iIndex] := itfClient.GetIPv4Address();
_iIndex := _iIndex + 1;
END_IF
- 按如下修改 StartIteration 方法:
实现
_iIndex := 0;
- 修改 PLC_PRG 如下:
声明
VAR
fbIteration : FB_Iteration;
fbIterateClients : VU.FbIterateClients;
xIterate : BOOL;
END_VAR
实现
fbIterateClients(xExecute := xIterate, itfClientFilter := VU.Globals.OnlyWebVisu, itfIterationCallback := fbIteration);
IF fbIterateClients.xDone THEN
xIterate := FALSE;
END_IF
- 启动项目并在监视列表中插入变量 PLC_PRG.fbIteration。
- 打开浏览器并输入以下地址:http://localhost:8080/webvisu.htm
- 设置 PLC_PRG 的 xIterate 变量为 TRUE。

SP16 及以前:
创建一个名为 ClientInfo 的新 POU 并从 Visu_Task 调用它。
ClientInfo POU 的调用必须源自 Visu_Task,因为只有这样才能传递所需的客户端句柄。

- 按如下修改 ClientInfo:
声明
VAR
pClient : POINTER TO VisuElems.VisuElemBase.VisuStructClientData;
helper : VisuElems.VisuFbClientTagDataHelper;
s1 : STRING;
END_VAR
实现
VisuElems.g_ClientManager.BeginIteration();
WHILE (pClient := VisuElems.VisuElemBase.g_ClientManager.GetNextClient()) <> 0 DO
IF pClient^.GlobalData.ClientType = VisuElems.VisuElemBase.Visu_ClientType.WebVisualization THEN
helper(pClientData := pClient);
s1 := helper.stIPv4;
END_IF
END_WHILE
- 启动项目并在 ClientInfo 的第 6 行设置断点。

- 打开浏览器并输入以下地址:http://localhost:8080/webvisu.htm
- 客户端连接后,执行在断点处停止,可以读取 IP 地址。

该信息仅适用于 Web 客户端。连接到控制器的 TargetVisu 不包含此信息。