TIA Portal 显示屏显示 PLC IP 地址的完整实现方法
在 TIA Portal 中让 HMI / 显示屏显示 PLC 的 IP 地址,核心是先让 PLC 读取自身 IP 地址并存储到变量,再在 HMI 画面上绑定这些变量显示。以下是适用于 S7-1200/1500 系列 PLC 和 WinCC Basic/Comfort/Advanced 面板的现场直接可用方案。
一、核心原理(必懂)
PLC 的 IP 地址存储在PROFINET 接口的系统数据区中,需要通过专用函数块读取并转换为可显示的字符串格式,再通过 HMI 变量连接显示在画面上。
二、两种实现方案(按场景选择)
方案 A:S7-1200/1500 通用方法(推荐)
1. PLC 程序:读取 IP 地址并转换为字符串
表格
| 步骤 | 操作 | 代码 / 设置 |
|---|---|---|
| 1. 创建数据块 | 建 DB1,定义变量存储 IP 信息 | IP_Byte[4]: Array[0..3] of Byte; // 存储IP的4个字节<br>IP_String: String[15]; // 存储"xxx.xxx.xxx.xxx"格式字符串 |
| 2. 添加函数块 | 使用LPNDR_ReadGlobalInfo(S7-1200)或PN_DCP_GetIP(S7-1500) | 从 TIA Portal 指令库中搜索并添加 |
| 3. 调用函数块 | 读取 PROFINET 接口 X1 的 IP 地址 | // S7-1200示例<br>CALL "LPNDR_ReadGlobalInfo"<br> InterfaceID := W#16#0001 // X1接口<br> InfoType := W#16#0001 // 读取IP地址<br> pdata:= P#DB1.DBX0.0 BYTE 4<br> RetVal => #RetVal |
| 4. 转换为字符串 | 把 4 个字节转为 "xxx.xxx.xxx.xxx" | // 方法:用"Byte_TO_String"和字符串拼接<br>IP_String := CONCAT(CONCAT(CONCAT(CONCAT(Byte_TO_String(IP_Byte[0]), '.'), Byte_TO_String(IP_Byte[1])), '.'), CONCAT(CONCAT(Byte_TO_String(IP_Byte[2]), '.'), Byte_TO_String(IP_Byte[3]))); |
2. HMI 配置:显示 IP 字符串
表格
| 步骤 | 操作 | 细节 |
|---|---|---|
| 1. 创建 HMI 变量 | 在 HMI 项目中添加变量 | 连接 PLC 的 DB1.DBX0.0(IP_Byte 数组)和 DB1.DBW8(IP_String 字符串) |
| 2. 设计画面 | 添加文本框 / IO 域 | 选择 "字符串" 类型,绑定IP_String变量 |
| 3. 测试运行 | 下载程序到 PLC 和 HMI | 确保 PLC 和 HMI 在同一网段,通信正常 |
方案 B:S7-1500 简化方法(集成 PN 接口专用)
S7-1500 可直接访问系统变量读取 IP 地址,无需额外函数块:
plaintext
// S7-1500专属代码 IP_Byte[0] := "S7_diagnostic_buffer".PN_INTERFACE.X1.IP_ADDRESS.bytes[0]; IP_Byte[1] := "S7_diagnostic_buffer".PN_INTERFACE.X1.IP_ADDRESS.bytes[1]; IP_Byte[2] := "S7_diagnostic_buffer".PN_INTERFACE.X1.IP_ADDRESS.bytes[2]; IP_Byte[3] := "S7_diagnostic_buffer".PN_INTERFACE.X1.IP_ADDRESS.bytes[3];
三、关键代码片段(直接复制使用)
1. IP 地址读取与转换完整程序(S7-1200 示例)
plaintext
// 数据块DB1定义 DATA_BLOCK DB1 VAR_GLOBAL IP_Byte: ARRAY[0..3] OF BYTE; // IP地址的4个字节 IP_String: STRING[15]; // 最终显示的IP字符串 RetVal: INT; // 函数块返回值 END_VAR // 主程序OB1 VAR LPNDR_ReadGlobalInfo: "LPNDR_ReadGlobalInfo"; // 读取PROFINET信息的FB END_VAR // 读取IP地址 CALL "LPNDR_ReadGlobalInfo" InterfaceID := W#16#0001; // X1接口 InfoType := W#16#0001; // 读取IP地址 pData := P#DB1.DBX0.0 BYTE 4; // 存储位置 RetVal => DB1.RetVal; // 转换为字符串格式 IF DB1.RetVal = 0 THEN // 读取成功 DB1.IP_String := CONCAT( CONCAT( CONCAT( CONCAT( BYTE_TO_STRING(DB1.IP_Byte[0]), '.' ), BYTE_TO_STRING(DB1.IP_Byte[1]) ), '.' ), CONCAT( CONCAT( BYTE_TO_STRING(DB1.IP_Byte[2]), '.' ), BYTE_TO_STRING(DB1.IP_Byte[3]) ) ); END_IF;
2. HMI 画面配置(WinCC Comfort 面板)
新建画面,添加IO 域控件
IO 域属性设置:
类型:输出
变量:选择 PLC 的
DB1.IP_String格式:字符串
显示长度:15 字符(刚好容纳 "xxx.xxx.xxx.xxx")
四、常见问题与解决方法
表格
| 问题 | 原因 | 解决方法 |
|---|---|---|
| IP 显示为 "0.0.0.0" | 函数块调用失败 | 检查InterfaceID是否正确(X1=1, X2=2);确保 PROFINET 已启用 |
| 字符串显示乱码 | 转换格式错误 | 使用BYTE_TO_STRING而非INT_TO_STRING;确保字符串长度足够 |
| HMI 无法读取变量 | 通信配置错误 | 检查 HMI 与 PLC 的连接;确认 DB 块属性为 "优化的块访问"=禁用 |
| 读取不稳定 | 网络波动 | 增加读取周期(如 1 秒 1 次);添加错误处理机制 |
五、进阶优化(可选)
添加子网掩码和网关显示:同样方法读取,只需修改
InfoType参数错误状态显示:根据
RetVal值显示 "读取成功"/"读取失败"自动更新:在 OB35 循环中断中调用读取程序,实现实时刷新
多接口支持:读取 X1 和 X2 接口的 IP 地址,分别显示
六、快速落地检查表
✅ PLC 程序:创建 DB 块→添加函数块→调用读取→转换字符串
✅ HMI 配置:创建变量连接→添加 IO 域→绑定字符串变量
✅ 下载测试:同时下载 PLC 程序和 HMI 画面→验证显示结果。

