跳到正文
Learn-LAD
PLC AI 实战/用 AI 做一个能按的 HMI 面板:WinCC Unified 交通灯

用 AI 做一个能按的 HMI 面板:WinCC Unified 交通灯

只用一个 HMI 设备,不接 PLC:用 TiaLink 建 21 个控件、10 个动态化和 5 个按钮事件,做一个可手动切换相位的 WinCC Unified 交通灯面板;读回 21/10/5,用 TiaLink 编译到 0/0 并保存。

实战 第 2 课 40 分钟 TiaLink

学完你能:能独立用 AI/TiaLink 建出一个可操作的 Unified 画面,用值映射把 1 个状态字变成 9 路灯和 1 个状态文本,并用读回、编译和保存验收;知道 HMI-only 与接 PLC 的差别。

概述

本课只加一个 WinCC Unified HMI 设备,不接 PLC:用 TiaLink 在 HMI 里建 1 个状态变量、21 个控件、10 个动态化和 5 个按钮事件,做一个可以手动切换相位的交通灯面板。

为什么先做 HMI-only?因为 HMI 变量、控件几何、动态化、按钮事件和读回本身就是一套完整的手艺;先把 HMI 侧做对,再接 PLC,排查问题会清楚得多。接 PLC 的 12 个 Bool 变量版本放在「下一步」,不作为本课验收。

备注:接 PLC 时的连接伙伴设置在 TIA 中完成一次。

TiaLink 侧已在 TIA Portal V20 上实测:HMI_1(MTP700 Unified Comfort,800×480)、HMI_State(DInt)、TL_Main 的 21 个控件 / 10 个动态化 / 5 个事件;HMI 编译 0 错误 0 警告,保存后工程没有未保存修改。

口径:AI 是辅助,画面和逻辑必须人工复核。交通灯的真实时序、联锁和安全相关逻辑,最终仍要由 PLC 程序和现场调试确认。

你将学会

  • 分清 HMI 内部变量和外部 PLC 变量:本课只用内部 HMI_State,不建连接;
  • 用一个 DInt 状态字(0=停、1=东、2=西、3=北)驱动 9 个灯和 1 个状态文本,而不是堆 12 个 Bool;
  • 建 21 个控件时,哪些用 Left/Top/Width/Height,哪些(圆)用 CenterX/CenterY/Radius;
  • 用值映射把状态 0–3 变成暗/亮颜色和文字;
  • 用按钮事件写状态字,并确认 5 个事件的语法检查通过;
  • 把 HMI 编译到 0/0,再读回 21/10/5、保存,并确认工程没有未保存修改。

前置条件

  • Windows 机器,已安装 TIA Portal V19 或 V20、WinCC Unified 选件,并有有效的 WinCC Unified 许可证。没有 Unified 许可证时,Openness 读不到 HMI 软件,TiaLink 会提示找不到 WinCC Unified HMI;
  • 一个练习工程:可以没有 HMI,agent 会自己建一个 MTP700 Unified Comfort(800×480);不需要 PLC。本课实测用的设备名是 HMI_1;
  • 一个支持 Streamable HTTP MCP 的客户端(Claude Code、Cursor、VS Code 等),端点为 http://localhost:8080/mcp;
  • 可选:WinCC Unified Runtime 或真实面板,用来做最后的点击验证;没有也不影响本课的读回/编译验收。

把 TiaLink 配成 MCP 服务:

MCP
{
  "mcpServers": {
    "tialink": {
      "type": "http",
      "url": "http://localhost:8080/mcp",
      "headers": { "Authorization": "Bearer <你的 TiaLink API Token>" }
    }
  }
}

步骤

第 1 步:你输入的(全部内容)

真实使用只有一次输入。把下面这段发给 agent;本课后面的步骤都是它实际做的事:

在当前 TIA 工程里只加一个 WinCC Unified HMI(不要 PLC);如果工程里还没有 HMI,你自己建一个 MTP700 Unified Comfort,然后做一个 800×480 的交通灯面板 TL_Main:

  1. 建内部变量 HMI_State(DInt,0=停,1=东,2=西,3=北);
  2. 建 21 个控件:5 个按钮(START/STOP/EAST/WEST/NORTH)、1 个状态 IOField、3 个灯组底板、3 个方向文字、9 个圆灯;
  3. 9 个灯的 BackColor 绑定 HMI_State,用 0–3 值映射:当前方向绿灯亮、其余方向红灯亮、黄灯暗;
  4. 状态 IOField 用 0–3 映射 STOPPED/EAST/WEST/NORTH;
  5. 5 个按钮按下时写 HMI_State(START/EAST=1,STOP=0,WEST=2,NORTH=3);
  6. 读回 21 个控件/10 个动态化/5 个事件,编译到 0/0,保存。

下面每一步都写「看到什么」,你可以按这些数字抽查,不用相信 agent 的自我总结。

第 2 步:agent 先做健康检查

agent 会先检查 TiaLink 是否已连接、许可证是否可写、工程里有没有一个 Unified HMI。你不需要手动执行任何命令。

如果工程里还没有 HMI,agent 会自己建一个 MTP700 Unified Comfort;你只需要在它报告后确认。

看到什么:设备列表里有 HMI_1,类型是 Unified Comfort,不是 classic。如果是 classic,本课的 HMI 动态化和按钮事件不适用,先换一个 Unified 设备。

第 3 步:建 HMI 变量表,只放一个 DInt 状态字

agent 会先建 HMI_Tags,再建一个 HMI_State。

看到什么:变量是 HMI_State,类型 DInt,内部变量——没有 PLC 连接、没有绑定 PLC 变量。这正是本课要的:先不碰 PLC–HMI 连接。

为什么用一个 DInt,而不是 12 个 Bool?因为这是一个「手动相位」面板:HMI_State 的 0/1/2/3 就是四个状态,9 个灯和 1 个状态文本都从它派生。接 PLC 时再换成 9 个灯位 + 3 个控制位,见「下一步」。

第 4 步:建 800×480 画面和 21 个控件

agent 会建画面 TL_Main,尺寸 800×480,然后按下面的布局建 21 个控件:

类型 数量 名称 几何
Rectangle 3 Rect_East / Rect_West / Rect_North Left=20/280/540,Top=40,240×300
Text 3 Text_East / Text_West / Text_North Top=45,240×28,白字
Circle 9 Lamp_EastRed 等 CenterX=140/400/660,CenterY=130/215/300,Radius=30
Button 5 Btn_Start / Btn_Stop / Btn_East / Btn_West / Btn_North Top=400,高 40
IOField 1 Field_Status Left=40,Top=355,720×32

看到什么:21 个控件全部创建成功,没有失败项。

交通灯 HMI 面板布局:三个灯组、9 个圆灯、5 个按钮和 1 个状态字段
按 800×480 的实际坐标画的布局示意;圆灯用 CenterX/CenterY/Radius,其余控件用 Left/Top/Width/Height

两个容易踩的几何点:

  • 圆是中心形状:HmiCircle 用 CenterX/CenterY/Radius;给它传 Left 会失败;
  • 静态文字用 Text,不要用 Label:V19 的 HmiLabel 创建返回 Not supported,用 HmiText 的 Text 属性写文字。

第 5 步:用值映射把状态字变成 9 路灯 + 1 个状态文本

agent 会给 9 个灯的 BackColor 各建 4 条值映射(状态 0/1/2/3),再给状态字段建 4 条文字映射。

9 个灯的颜色规则:

HMI_State 东向灯组 西向灯组 北向灯组
0 停 全暗 全暗 全暗
1 东 绿亮、红暗、黄暗 红亮、绿暗、黄暗 红亮、绿暗、黄暗
2 西 红亮、绿暗、黄暗 绿亮、红暗、黄暗 红亮、绿暗、黄暗
3 北 红亮、绿暗、黄暗 红亮、绿暗、黄暗 绿亮、红暗、黄暗

状态字段的 4 条文字映射是:0 → STOPPED、1 → EAST、2 → WEST、3 → NORTH。

黄灯在这个手动面板里保持暗态:真实交通灯的黄灯需要「绿→黄→红」的定时过渡,这是下一步接 PLC / 定时器要做的,不是本课的手动按钮能表达的。把黄灯先留成暗态,比假装它会闪更诚实。

看到什么:一共 10 个动态化——9 个灯各 4 条颜色映射,状态字段 4 条文字映射。

一个状态字驱动 9 路灯和 1 个状态文本:值映射把 0–3 翻译成颜色和文字
9 个灯共用 HMI_State;每个灯 4 条映射,状态字段 4 条文字映射

第 6 步:建 5 个按钮事件

5 个按钮都在按下时写同一个状态字:

控件 事件 目标变量 写入值
Btn_Start 按下 HMI_State 1
Btn_Stop 按下 HMI_State 0
Btn_East 按下 HMI_State 1
Btn_West 按下 HMI_State 2
Btn_North 按下 HMI_State 3

看到什么:5 个事件全部通过语法检查;按下按钮时分别写入 1、0、1、2、3。

START 和 EAST 都写入 1:START 是一个更直观的启动入口,EAST 是相位选择;两个都保留,方便操作。注意:一个按钮事件只能写一个变量;如果你以后需要「按一下同时置位 3 个灯」,那要把逻辑放到 PLC,或改成值映射/状态字。

第 7 步:读回、保存、确认没有未保存修改

agent 会读回整张画面,并保存工程。

看到什么:

检查 结果
控件 21
动态化 10
事件 5
变量 HMI_State,DInt,内部变量
保存 成功
工程状态 没有未保存修改

读回验收:21 个控件、10 个动态化、5 个事件,保存后工程干净
TiaLink 侧实测的读回结果;编译是下一步的验收动作

第 8 步:编译 HMI 软件

agent 会调用 TiaLink 编译 HMI。本课实测返回 0 错误 0 警告。

看到什么:编译结果 0 错误 0 警告;编译后保存成功,工程没有未保存修改。

如果编译报错,agent 会收到错误信息并继续修;它通常会先检查 HMI_State、9 个灯的绑定和 5 个按钮事件。你只需要看最后是不是 0 错误 0 警告。

HMI 软件编译:TiaLink 直接编译到 0/0
TiaLink 实测 0 错误 0 警告

第 9 步(可选):在运行时点一下

最快的方式是用 TIA Portal 自带的 HMI 仿真,不需要真实面板,也不需要 PLC:

  1. agent 会先编译(或你在 TIA 里编译),确认 0 错误 0 警告;
  2. 如果还没设起始画面,在 HMI_1 属性里把「起始画面」设为 TL_Main;
  3. 选中 HMI_1 或打开 TL_Main,点工具栏的「启动仿真 / Start simulation」(显示器 + 播放图标),或右键 HMI_1 → 启动仿真;
  4. WinCC Unified Runtime 窗口打开后,依次点 EAST、WEST、NORTH、STOP、START,看状态字段和 9 个灯是否跟着变。

如果你有真实面板,也可以把 HMI 下载到面板,操作步骤同上。

第 10 步(下一步):接 PLC 时怎么改

如果你要让灯跟着 PLC 的 EAST_GREEN 等 9 个位走,或者让 START/STOP 控制 PLC 的 STARTED,就把 HMI-only 版升级成 PLC 版:

  1. 导入示例库的 交通灯控制,得到 START、STOP、STARTED 和 9 个灯位;
  2. 建 PLC–HMI 连接 HMI_Connection_1;接 PLC 时在 TIA 的连接编辑器里设置一次 PLC/站号;
  3. 把 HMI_State 换成 12 个 Bool HMI 变量(3 个控制/状态 + 9 个灯),每个都带 Connection 和 PlcTag;
  4. 9 个灯的 BackColor 改成绑定各自的灯位,值映射键用 Int32 0/1(不是 true/false);
  5. START/STOP 用按下/松开写位,让 PLC 的 SR 保持运行状态;
  6. HMI 编译用 TiaLink。

验证清单

  • 设备列表里 HMI_1 是 Unified Comfort;
  • HMI_Tags/HMI_State 是 DInt,内部变量,没有 PLC 连接;
  • TL_Main 是 800×480,读回 21 / 10 / 5;
  • 9 个灯的 BackColor 各有 4 条值映射;状态字段有 4 条文字映射;
  • 5 个按钮事件全部通过语法检查;
  • HMI 编译 0 错误 0 警告;
  • 编译后保存成功,工程没有未保存修改;
  • (可选)Runtime 里点 5 个按钮,状态字段和 9 个灯按预期变化。

常见坑

  • HMI 变量是内部的:HMI_State 没有 PLC 连接,不是绑定失败;本课就是 HMI-only。要接 PLC,见「下一步」。
  • 圆灯不是矩形:HmiCircle 用 CenterX/CenterY/Radius;Left/Top/Width/Height 只适用于 Button/IOField/Rectangle/Text 等。
  • Label 在 V19 不可用:HmiLabel 创建返回 Not supported,静态文字用 Text。
  • 值映射的键类型:本课 HMI_State 是 DInt,键是 0–3;如果以后接 PLC 的 Bool 灯位,键必须是 Int32 0/1,不能写 true/false。
  • 状态文本用字符串:状态字段的值映射可以直接写 "STOPPED" 这样的字符串;如果属性是数值型,就写数字。
  • 一个按钮事件只能写一个变量:多点联动要放到 PLC 或状态字里。
  • 按钮事件名:Pressed 会显示为原生 Down,Released 是 Up,Clicked 是 Tapped;这是正常的。
  • Int 范围类型:用 Int(16 位)做值映射时,TIA 可能报「上限值和下限值应属于相同的数据类型」;把 HMI_State 改成 DInt(32 位)后编译通过。
  • Unified 画面不能导出:TiaLink 会明确提示不能导出;用画面读回作为验收面。
  • TiaLink 不跑 HMI 运行时:点按钮看灯在 WinCC Unified Runtime 或真实面板里完成。
  • 保存是显式的:所有写入只在内存;保存之后再看工程有没有未保存修改,否则关掉工程就丢。
  • 自动循环不在本课:手动相位面板不会自己 20 秒换相;真实的绿→黄→红过渡需要 PLC 定时器或 HMI 脚本,本课只做面板和交互。

下一步

本课工具

TiaLink

把 TIA Portal 接到你的智能体:导入、编译、读回核对、PLCSIM 仿真。本地运行,工程数据不出厂。

打开 TiaLink