S7-Graph 写顺控程序的人基本都有过这种经历:程序里步数二三十个起步,威纶通触摸屏上要显示当前走到哪一步、哪几步同时激活,还要做步名称切换和报警联动。手动一个个去加变量,先到 PLC 程序里翻背景 DB,再回 EBPro 里建标签,步号地址抄来抄去,错一位就是事故。
这次我们来看一个能减少这类重复劳动的方案:把西门子 Graph 块的步状态提取出来,通过脚本生成统一格式的标签映射文件,再导出 XML,在威纶通 EBPro 中一键导入触摸屏工程,最后用 JS 元件在画面上做可视化显示。整体链路一次打通,没有断点,所以我把它叫作“一镜到底”。
这个方案的核心不是教你在 EBPro 里怎么画画面,而是给出一条可以批量跑通的转换路径。你关心的地址规划、JS 元件调用、XML 导入格式、端口配置、批量标签处理,下面都会展开。读完这篇文章你会知道:Graph 步状态在 TIA Portal 里怎么取,中间映射文件长什么样,EBPro 标签导入怎么操作,JS 元件如何把步号显示出来,以及最常见的几个坑在哪。
文章采用可落地的流程式写法,所有脚本和步骤都按工程习惯给出,具体版本号和菜单名称以你本机的 TIA Portal、EBPro 版本为准。下面直接进入正题。
1. 核心能力速览
| 项目 | 内容 |
|---|---|
| 方案类型 | 西门子 S7-Graph 顺控工程与威纶通 HMI 联调工作流 |
| 核心功能 | Graph 步状态批量提取、标签映射生成、XML 文件导出、EBPro 一键导入、JS 元件显示 |
| 适用 PLC | S7-300/400/1200/1500,TIA Portal 或 Step7 环境 |
| 适用 HMI | 威纶通 MT / TK / iE 系列,EBPro V6.x |
| 辅助工具 | Python 3 脚本(生成映射文件)、Excel/文本编辑器(复核标签) |
| 是否支持批量 | 支持,脚本可一次生成几十甚至上百个步的标签 |
| 是否支持一键启动 | 部分支持,脚本可做成 bat 一条命令执行 |
| 是否支持 API | 不涉及运行时 API,但脚本可集成到构建工具链 |
| 入门门槛 | 需要了解 Graph 块接口、DB 地址、EBPro 标签库基本操作 |
从能力表能看出来,这套方案解决的不是“把某个画面做得好看”,而是“变量怎么来”。Graph 程序几十步,每步对应一个使能位,如果靠手工在 EBPro 里逐个建标签,不仅慢,而且容易在地址上出错。用脚本生成映射文件之后,标签名称、地址、注释都可以规范化,导出 XML 再导入,效率会高很多。
2. 技术背景:Graph 步状态怎么取到 HMI
S7-Graph 是西门子用于顺序控制的编程语言,一个 Graph 功能块内部由步(Step)和转换(Transition)组成。每个步都有一个激活状态,程序运行时,某一步激活,对应的状态位就是 1。这些状态位默认存放在 Graph 功能块对应的背景数据块中,也可以通过块接口参数引出来。
从工程上看,把步状态送到威纶通 HMI,常见有三种取法。
第一种是取 Graph 块输出的当前步号。在 TIA Portal 中调用 Graph FB 时,接口上会有类似 S_NO、T_NO 这样的输出参数,分别表示当前激活的步号和转换号。你可以在 OB1 调用处把这几个参数连接到 PLC 变量,例如存到一个全局数据块的整型变量里,HMI 直接读这个变量就能知道当前走到第几步。
第二种是取背景 DB 中的步标志位。每个步在背景数据块里会有一个独立的位地址,比如 DB10.DBX2.0 表示第 1 步激活,DB10.DBX2.1 表示第 2 步激活。这种方式信息最细,可以精确到“哪几步同时激活”,在画面上做指示灯效果非常直观。
第三种是自己在 Graph 块外围写一小段 FC 或 SCL 程序,把步号、步标志、转换条件统一打包成一个结构体,再映射到 HMI 地址。这种做法适合步骤特别多、还需要带上报警文本的场景,等于在 PLC 侧先做了一层数据整理。
无论选哪种,最终结果都是要形成一张表:步号、步名称、PLC 地址、HMI 标签名称、注释。这张表就是整套方案的“中间产物”,后面所有脚本和导入操作都围绕它展开。
3. 适用场景与使用边界
这套方案最适合的项目特征:Graph 步骤多、HMI 需要实时显示当前步、画面中要复用步名称和报警文本、团队里有多台威纶通触摸屏需要同步变量。
它也很适合有“变量替换”需求的场合。威纶通 EBPro 本身提供变量替换功能,如果后期 PLC 地址有调整,可以用脚本重新生成映射表,再通过变量替换批量更新,不用在画面上一个个改。
不合适的场景也明确说一句。如果只是三五步的小程序,手工建标签五分钟就做完,没必要引入脚本和 XML 流程。如果 HMI 动画要求特别高,需要类似音视频播放、Web 页面嵌入等复杂效果,那么 JS 元件的主要职责是状态显示,不是替代专业动画组件。
合规方面需要注意:PLC 程序和 HMI 工程属于工业现场资产,实施前要确认程序版权和授权范围。涉及生产设备联调时,必须提前做好安全回路,避免在设备运行中直接改动地址映射导致误动作。文章给出的脚本和配置均用于测试环境验证,现场使用前要经过完整仿真测试。
4. 环境准备与前置条件
在开始之前,先检查软硬件环境。以下清单按常见工程配置给出,实际版本以你本机环境为准。
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10/11 x64,建议关闭系统休眠 |
| PLC 软件 | TIA Portal V15.1 / V16 / V17 以上,项目含 S7-Graph 块 |
| HMI 软件 | 威纶通 EBPro,常见版本如 V6.08.02.702 及以上 |
| HMI 硬件 | 威纶通 MT/TK/iE 系列,例如 MT8071iE |
| 通讯方式 | PLC 与 HMI 通过以太网或 RS-232/RS-485 连接 |
| 脚本环境 | Python 3.6+,用于生成 XML/CSV 映射文件 |
| 磁盘空间 | 至少 10GB 空闲空间,TIA Portal 和 EBPro 安装体积较大 |
| 端口规划 | HMI 与 PLC 的 IP 段一致,避免地址冲突 |
威纶通 MT8071iE 这类型号在工程中很常见,端口定义一般是:以太网口用于程序下载和 PLC 通讯,COM 口用于串口设备。实际接线时,建议先看对应型号的手册确认引脚定义。如果使用以太网连接 S7-1200/1500,HMI 侧 PLC 驱动选择 Siemens S7-1200/1500 Ethernet,IP 和机架号按实际填写。
EBPro 的版本需要注意:不同版本对 XML 导入的支持和标签向导界面略有差异。更稳妥的做法是用 EBPro 自带的标签导入向导,先导出一份示例文件看格式,再调整脚本生成的目标格式。
5. “一镜到底”整体链路
整套流程可以拆成五个环节,每个环节产出一个可检查的中间产物。
| 环节 | 操作 | 产出 |
|---|---|---|
| 1 | TIA Portal 中提取 Graph 步信息和背景 DB 地址 | 步号与步名称清单 |
| 2 | 整理成 CSV 或 Excel 表 | 结构化标签源文件 |
| 3 | Python/JS 脚本读取源文件,生成 XML 映射 | 标签映射 XML |
| 4 | EBPro 标签导入向导导入 XML | HMI 标签变量 |
| 5 | 在画面上使用 JS 元件读取标签并显示 | 步状态可视化画面 |
这个链路的价值在于每步都有文件可以复核。第 2 步生成的 CSV 文件可以直接发给电气同事确认,第 3 步生成的 XML 可以放进工程目录做版本管理,第 4 步导入后可以在 EBPro 标签库中直接查看结果。即使后期地址变更,也只需要改 CSV 再重新生成,不需要动画面。
6. 用脚本批量生成标签映射 XML
这一步是整套方案自动化程度最高的地方。你只需要一个包含步号、步名称、PLC 地址、注释的 CSV 文件,脚本会自动生成一个结构清晰的 XML 文件。
先看 CSV 文件的推荐格式。
step_no,step_name,plc_address,comment 1,Step_1,DB10.DBX2.0,启动步激活 2,Step_2,DB10.DBX2.1,进给步激活 3,Step_3,DB10.DBX2.2,加工步激活 4,Step_4,DB10.DBX2.3,退回步激活 5,Step_5,DB10.DBX2.4,结束步激活这个 CSV 就是第 2 节里说的“中间产物”,它由 PLC 程序里的步定义整理而来。整理时可以借助 TIA Portal 中 Graph 块的接口列表,导出后稍作调整。
接下来用 Python 脚本把 CSV 转成 XML。脚本逻辑很简单:读 CSV,按行生成 XML 节点,输出到一个新文件。
import csv import xml.etree.ElementTree as ET csv_file = "graph_tags.csv" xml_file = "graph_tags.xml" root = ET.Element("TagList") root.set("source", "S7-Graph") with open(csv_file, "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: tag = ET.SubElement(root, "Tag") ET.SubElement(tag, "Name").text = f"Graph_{row['step_name']}" ET.SubElement(tag, "DataType").text = "BOOL" ET.SubElement(tag, "Address").text = row["plc_address"] ET.SubElement(tag, "Comment").text = row["comment"] tree = ET.ElementTree(root) tree.write(xml_file, encoding="utf-8", xml_declaration=True) print(f"生成完成: {xml_file}")运行命令:
python generate_tags.py生成后的 XML 文件大致长这样:
<?xml version="1.0" encoding="utf-8"?> <TagList source="S7-Graph"> <Tag> <Name>Graph_Step_1</Name> <DataType>BOOL</DataType> <Address>DB10.DBX2.0</Address> <Comment>启动步激活</Comment> </Tag> <Tag> <Name>Graph_Step_2</Name> <DataType>BOOL</DataType> <Address>DB10.DBX2.1</Address> <Comment>进给步激活</Comment> </Tag> </TagList>需要说明的是,这个 XML 的主要作用是结构化管理标签清单。威纶通 EBPro 的标签导入向导在不同版本中支持的文件格式有差异,有的版本直接支持 XML,有的版本更推荐 CSV。导入时如果 XML 格式不被识别,可以把脚本改成输出 CSV,列名保持 Name、DataType、Address、Comment,然后在 EBPro 向导中完成列映射。实际操作时,先导出一份 EBPro 自己的标签模板,照着模板调整脚本输出结构,成功率最高。
7. EBPro 标签导入与地址映射
标签映射文件准备好之后,打开威纶通 EBPro,新建或打开一个 HMI 工程,按以下步骤操作。
第一步,添加 PLC 驱动。在“系统参数”中找到 PLC 列表,添加西门子 S7-1200/1500 以太网驱动,填写 PLC 的 IP 地址、机架号和槽号。这一步决定 HMI 后续读写 DB 地址时走什么协议。
第二步,打开“标签库”。标签库是 EBPro 统一管理变量的地方,可以在里面手动新建标签,也可以通过导入向导批量导入。
第三步,选择标签导入功能。在标签库窗口中,找到“导入标签”入口,选择 CSV 或 XML 文件。如果文件格式和当前 EBPro 版本不完全兼容,向导会提示你手动映射列,比如把文件中的 Name 列对应到“标签名称”,把 Address 列对应到“地址”,把 Comment 列对应到“注释”。
第四步,导入后立即检查。导入完成之后,建议先在标签库中筛选一下导入的标签,确认数据类型的 BOOL 位地址是否和 PLC 背景 DB 一致,确认注释是否完整。这一步非常关键,因为 PLC 地址差一个字节,现场就会显示错误状态。
第五步,编译工程并下载到触摸屏。下载前可以先离线模拟,EBPro 的离线模拟功能可以让你在电脑上验证标签读取逻辑,不一定需要真实 PLC。如果模拟时标签数值不对,回到 PLC 变量表检查地址。
第七节提到的 MT8071iE 端口问题,在实际项目中偶尔会遇到:PLC 通讯正常,但下载程序时找不到 HMI。这种情况通常是 USB 驱动或者以太网端口配置问题,可以检查 EBPro 中的 HMI IP 地址是否和电脑/PLC 在同一网段。
8. JS 元件显示 Graph 步状态
标签导入完成以后,剩下的事情就是画面显示。威纶通 EBPro 中的“JS 元件”或者“宏指令”可以在画面上做逻辑控制,比如根据变量值切换文本、修改颜色、控制可见性。
我的建议是分两层来做。
第一层,在 PLC 侧整理数据。除了把每个步的使能位映射成 BOOL 标签,还可以把当前激活步号写到一个整型变量里,比如叫 Graph_StepNo。HMI 读这个整型变量比扫描几十个 BOOL 位更快,而且 JS 元件处理整型变量更方便。
第二层,在 HMI 画面中放一个 JS 元件,读取 Graph_StepNo,把它转换成步名称文本并显示出来。JS 元件的思路类似前端脚本,先拿值,再更新文本显示。
下面是一个概念性的 JS 脚本示例,具体 API 名称需要按照当前 EBPro 版本中 JS 元件提供的对象和方法调整。
// 读取当前步号 var stepNo = getTagValue("Graph_StepNo"); // 根据步号取步名称,这里可以用数组或查表 var stepNames = ["启动步", "进给步", "加工步", "退回步", "结束步"]; if (stepNo >= 1 && stepNo <= stepNames.length) { setText("current_step_text", stepNames[stepNo - 1]); } else { setText("current_step_text", "停止/未激活"); }同时,画面上还可以放一排指示灯,每个指示灯读取一个 BOOL 标签,比如 Graph_Step_1、Graph_Step_2。这样既能看到“当前在哪一步”,也能看到“哪几步同时激活”。
使用 JS 元件时,要注意它的刷新机制。JS 元件不是每毫秒都执行的,它通常绑定在画面循环、PLC 触发或者定时器上。如果步状态变化太快,JS 刷新可能跟不上,最好把 JS 执行周期调短,或者直接使用 EBPro 自带的“数值显示”和“位状态指示灯”元件做快速状态刷新。JS 元件更适合做文本拼接、步名称映射、状态组合判断这一类逻辑。
9. 功能测试与效果验证
一套流程跑通后,建议按下面的测试用例逐项验证。
| 测试项目 | 操作 | 预期结果 |
|---|---|---|
| 标签导入完整性 | 打开 EBPro 标签库,搜索 Graph_ 前缀 | 能看到所有步标签,类型和注释正确 |
| PLC 地址映射 | 对比标签地址与 TIA Portal 背景 DB 地址 | 完全一致,无偏移 |
| 步号显示 | 手动在 PLC 里给 Graph_StepNo 写入 2 | HMI 显示“进给步” |
| BOOL 位状态 | 手动使能第 3 步标志位 | 画面对应指示灯变绿 |
| JS 文本刷新 | 切换 PLC 步号从 1 到 4 | 文本跟随变化,无卡死 |
| 断线恢复 | 断开 PLC 与 HMI 的网线,再恢复 | HMI 重新建立通讯,状态恢复 |
测试时建议先用离线模拟。EBPro 的离线模拟可以连接真实 PLC,也可以使用模拟数据。先用模拟数据验证 JS 元件逻辑,再接真实 PLC 验证地址映射,这样能快速区分是画面问题还是通讯问题。
判断成功的标准只有一个:HMI 上显示的步号和 TIA Portal 在线监控里 Graph 块的当前步一致。如果一致,说明标签映射、导入、JS 显示整条链路没有问题。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| EBPro 导入 XML 报错 | XML 结构和当前版本向导不匹配 | 查看报错信息,确认向导支持格式 | 改用 CSV 模板,按 EBPro 模板调整列 |
| HMI 提示通讯超时 | PLC IP 与 HMI IP 不在同一网段 | 检查两者 IP、子网掩码 | 修改 HMI 或 PLC IP,保持同网段 |
| 标签地址和 PLC 不一致 | DB 编号或位偏移手工抄错 | 打开 TIA Portal 在线监控逐位核对 | 重新生成映射文件并重新导入 |
| JS 元件步号一直不变 | 变量没绑定到当前画面数据源 | 检查 JS 元件绑定的标签名 | 重新选择标签,确认是地址整数变量 |
| HMI 显示旧字符串 | 字符串刷新缓存未更新 | 切换画面触发刷新 | 在 JS 中先清空文本再重新赋值 |
| PLC 里 DB 地址为 0,HMI 仍显示旧字符 | HMI 本地缓存或变量没有及时更新 | 检查通讯状态和变量刷新周期 | 缩短采样时间或强制刷新 |
| 变量全部显示 #### | 数据类型不匹配 | 查看标签数据类型 | 将 BOOL 标签改为位状态元件,将整数标签改为数值显示元件 |
| 批量导入后变量名有重复 | CSV 中出现同名步名称 | 检查源文件,去重 | 在脚本中加入重名校验 |
这里特别说明一下“博途字符串里面的值已经为 0 但是触摸屏为什么还是显示原来的字符”这类问题。如果 PLC 侧的字符串变量已经清空,但 HMI 还显示旧内容,通常不是地址映射错误,而是刷新机制的问题。字符串显示元件有自己的刷新周期,或者画面没有触发重新读取。解决办法是在 JS 元件中先把显示文本置空,再赋新值,或者把字符串元件的刷新方式改为“PLC 触发”。
11. 最佳实践与合规提醒
把这套流程用在正式项目里,建议提前做好几件事。
第一,PLC 侧预留统一的步状态区。在全局数据块中规划一片地址,专门存放 Graph 步号、步标志和转换条件,不与其他业务数据混用。这样后续生成 CSV 时可以直接从数据块导出,避免在几十个 DB 里来回找。
第二,脚本和源文件纳入版本管理。生成的 XML、CSV、Python 脚本都放到项目目录下,用 Git 或 SVN 管理。后期修改步名称或地址,直接改 CSV 重新生成,保留历史记录,出了问题可以回溯。
第三,批量任务要加日志和失败重试。如果现场有几十个画面、几百个变量,建议在脚本中增加输出检查:CSV 是否有空行,地址格式是否正确,标签名是否重复。脚本报错比现场排错成本低得多。
第四,导入前备份 EBPro 工程。标签导入是批量操作,一旦导入结果不符合预期,没有备份会很被动。导入前复制一份原工程文件,或者使用 EBPro 的工程备份功能。
合规方面再强调一次。如果项目涉及第三方提供的 PLC 程序、HMI 模板、步名称表,使用前必须确认授权。涉及现场设备时,严禁在设备运行状态下直接改动地址映射。导出的 XML 和中间文件如果包含工艺信息,也需要注意保密,不要上传到不安全的公共平台。
12. 总结
这套“西门子 Graph 转威纶通 JS 元件显示”的方案,最值得尝试的点是批量化和可复查性。手动建标签容易漏、容易错,脚本生成 XML 之后,标签格式统一、注释完整,导入 EBPro 后还能继续做变量替换和批量修改。
最先应该验证的功能是标签导入:用 10 个步的小例子跑通 CSV 转 XML、EBPro 导入、画面显示的全流程,确认格式兼容后再扩展到几十步。最容易踩的坑是地址偏移和导入格式不兼容,所以导入后务必核对地址,不确定格式时优先用 CSV 模板。
后续可以扩展的方向很多:把步名称和报警文本放进同一个 XML,在 HMI 上做报警列表联动;在脚本中增加对 S7-1500 系统数据类型和字符串地址的支持;把整个流程封装成一个 bat 一键脚本,交给非脚本人员使用。这套链路一旦调顺,再接到新项目时,从 Graph 到触摸屏显示的时间会压缩到分钟级。建议收藏备用,下次写顺控项目时直接照着做。