威纶通双屏互锁方案详解:PLC信号量与EBPro组态实践
2026/9/9 1:24:55 网站建设 项目流程

简介:针对工业现场多触摸屏操作冲突问题,这份配套资料给出了基于威纶通HMI的两屏互锁完整实现思路,适合自动化工程师、电气调试人员参考。核心逻辑围绕操作权切换展开:任一侧离开主画面即触发另一侧锁屏,被锁屏侧点击“获取操作权”后可重新接管,确保同一时刻仅单屏可操作,避免误触与数据冲突。压缩包共16个文件,以HTML页面、CSS样式、JavaScript下载脚本及二维码文件为主,体积仅1.06MB,内容为从逻辑说明、步骤分解到EasyBuilder Pro编程要点的整理,便于快速理解互锁机制和事件触发设置。已有296人学习下载,对正在设计双屏HMI联锁方案或希望规范操作权限管理的开发者有一定参考价值。 两台威纶通触摸屏控制同一台设备,听上去无非是加一块屏的事,真正在产线上跑过才知道没那么简单。参数画面两边都能进,前面的人刚改完配方,后面又写了一遍,到底谁的最后生效?设备还在跑着,屏幕互锁做不好,操作员在车间里能吵起来。这个需求几乎每个双屏项目都会碰到,但网上能查到的完整案例少得可怜。这篇文章把我实际做过的双屏互锁方案拆开讲,从选型对比、EBPro组态细节到把锁位改丢的翻车记录,一次性说清楚。

1. 双触摸屏系统为什么需要互锁:先弄清你要锁的是什么

1.1 两台屏同控一台设备:常见部署场景

最典型的场景是一条设备前后各装一台操作屏,比如产线中间的某台专机,正面是主操作位,背面或侧边还有一台给后面工序的人看状态、偶尔操作。两台屏通常连同一台PLC,威纶通MT8071iE这类带以太网口的型号,走网线直连或者经交换机进PLC都很常见。

这种布局的好处是省了操作员来回跑,坏处是"两个人同时操作同一台设备"这件事从概率问题变成了日常。你在这边把参数画面打开准备调节,那边也在参数画面里改着同一个数值,两边写下去的都是自己的值,后写覆盖先写。等到设备动作不对了,互相都不知道是对方动过手。

1.2 屏幕互锁不是"禁止跳页",而是防止两个操作员打架

屏幕互锁这个叫法容易让人误解成"锁住屏幕不让切页面",实际要解决的是资源独占:某些画面——参数设定、配方编辑、手动调试、软元件强制——同一时刻只允许一台屏进入,另一台屏要么弹提示,要么只能看不能写。

互锁的对象不同,做法完全不同。如果只是不想让两台屏同时进入同一画面,那叫画面级互锁;如果连启动、急停复位、气缸手动点动这类操作都要保证同一时刻只有一边能发出命令,那就上升到操作级互锁了。文章后面会讲到,这两种级别的可靠性要求和实现成本差很多,先别急着写宏,把自己要锁的东西列清楚。

1.3 互锁的需求边界:只锁该锁的,别锁监视画面

我的建议是互锁范围宁窄勿宽。主画面、状态监视、报警列表这类只读画面不需要锁,锁了反而让另一侧的操作员每次切页都被弹回,几分钟后就会有人骂娘。真正需要锁的是会写PLC数据的、发表单的、动工艺参数的画面。

另外要考虑等待体验。操作员在A屏占用参数画面,B屏的操作员点了同一个入口,如果只是按钮没反应,他大概率会认为是触摸屏失灵,又要喊你过来看。一定要有明确的提示,告诉他"对面正在操作参数画面"。这一条在设计互锁提示时会反复提到。

2. 互锁方案三选一:PLC信号量、HMI直连与PLC仲裁

2.1 方案A:PLC寄存器当信号量,最简单也最常用

两台屏都连同一台PLC,那就直接在PLC里开一个寄存器当信号量。比如参数画面用D100,约定:0代表空闲,1代表1号屏占用,2代表2号屏占用。

A屏进入参数画面之前,先读D100,是0就写1再切屏;B屏同样先读D100,是0就写2再切屏。谁先进去,另一个就被挡在外面。退出画面时把D100写回0。这个方案不增加任何硬件,逻辑直观,PLC扫描周期本来就是毫秒级,双屏之间感知占用状态基本上感觉不到延迟。

它的缺点是检查和置位不是原子操作。两边同时读到0、同时写入,理论上存在双双进入的极小概率。对画面级互锁来说,这个概率在真实操作中基本可以接受;但如果是安全相关的操作互锁,这个方案就不够了。

2.2 方案B:HMI之间直连,不占用PLC资源

如果不方便在PLC里开寄存器——比如PLC程序是设备厂家加密的、或者不想动原程序——可以让其中一台威纶通触摸屏做MODBUS TCP服务器,把本地LW地址映射出去,另一台屏作为MODBUS TCP客户端读取对方的LW状态。

威纶通EBPro工程里自带MODBUS服务器功能,把HMI的LW0映射成保持寄存器40001,另一台屏就能像读一台普通MODBUS从站一样读到这个字。这种方案的优势是完全不动PLC,纯组态层面解决;劣势是依赖两台屏之间以太网通讯,如果网线断了、某台屏重启了,互锁就不可靠了。

2.3 方案C:PLC梯形图统一仲裁,适合安全相关操作

画面级互锁用方案A就够,但涉及安全相关的操作互锁,我会把仲裁逻辑写进PLC梯形图。具体做法是:HMI侧的按钮不再直接置位输出,而是发一个"请求"位,PLC收到后在梯形图里做判断——如果当前没有另一侧正在执行同类操作,才给出"允许"位并保持,否则把请求清掉。

这样哪怕两个操作员在同一毫秒按下按钮,PLC按扫描周期顺序处理,也只会有一个请求被响应,不存在方案A那种同时写入的竞态。代价是PLC程序多写几行逻辑,调试周期长一点。设备停机的风险高不高,决定了你要不要上这个方案。

2.4 三种方案的选型对照

对比项方案A:PLC信号量方案B:HMI直连方案C:PLC仲裁
实现难度中高
是否改PLC程序只需加寄存器,不动逻辑完全不改需要写仲裁逻辑
竞态风险极小但存在较高
通讯中断影响取决于PLC本身互锁直接失效失效,但可按安全策略处理
适用场景画面级互锁,常规操作客户不让动PLC程序安全相关操作、联锁要求高

3. 方案A落地:MT8071iE与S7-200 SMART的参数页互锁全流程

3.1 组态前的IP规划与端口确认

以两台MT8071iE加一台西门子S7-200 SMART为例。MT8071iE背后就一个RJ45以太网口,两个COM口,COM1走RS232,COM2走RS485/RS422,做互锁走以太网最省事,PLC、交换机、两台屏都配到192.168.1.x同一网段。

我习惯这样分:PLC占192.168.1.1,1号屏192.168.1.10,2号屏192.168.1.11,子网掩码255.255.255.0。在同一台交换机下跑互锁,通讯速度不是问题。EBPro组态时,两台HMI工程里都要新增设备,选"S7-200 SMART"驱动,填上PLC的IP地址,站号按驱动要求设置。

这里提醒一句:如果现场走的是WiFi或者跨交换机,互锁的实时性会变差。屏幕互锁的占用判定一般要求秒级以内,但操作互锁必须用有线以太网,别迷信无线。

3.2 在EBPro里建好占用标志位

打开EasyBuilder Pro,新建两个工程,先在两台屏各自的工程里建立相同的PLC标签。PLC设备建好后,新建一个16位字地址标签,名字叫"参数页占用",地址指向S7-200 SMART的D100。再建一个位标签"互锁提示",地址用M10.0,给提示弹窗用。软件版本我用的V6.08.02.702,不同版本界面略有差异,但设备表和标签的入口都差不多。

D100在S7-200 SMART里默认不是掉电保持的,这正好符合我们想要的行为:设备断电重启后互锁自动释放,不会出现屏A停机后屏B永远进不去的情况。当然,如果你的工艺要求断电能保持"谁占用"的状态,那就在系统块里把D100设成保持区,这个要看现场需求。

3.3 窗口打开/关闭宏:占位与释放

核心逻辑写在画面的窗口宏里。以1号屏的"参数画面"为例,假设这个画面在工程里的窗口编号是5,打开宏里写:

// 进入参数画面,置位占用标志 short v; GetData(v, "PLC", "D100", 1); // 读当前占用状态 if (v == 0) // 空闲才置位 { SetData(1, "PLC", "D100", 1); }

2号屏的同一个"参数画面"打开宏,逻辑完全一样,只是把置位值从1改成2,表示2号屏占用。

关闭宏才是重点。在窗口属性里找到"关闭时"宏,写:

// 离开参数画面,释放占用标志 SetData(0, "PLC", "D100", 1);

关键点来了:EBPro的窗口关闭宏,无论这个窗口是通过返回按钮关闭的,还是通过其他窗口切换顶掉的,都会被触发。也就是说,只要画面设计了关闭宏,释放逻辑基本能兜住,不容易出现"进去出不来"的永久锁死。前提是你在窗口属性的宏设置里确实把"关闭时"这个宏挂上了,这一步最容易漏。

3.4 导航按钮的检测逻辑与提示窗口

光有窗口打开宏还不够,操作员在B屏按"参数画面"按钮时,应该立刻知道他进不去,而不是画面闪一下又被弹回来。所以在导航按钮上再挂一个按下宏,先检查再决定是否切屏:

// 导航按钮:检查占用,空闲才允许进 short v; GetData(v, "PLC", "D100", 1); if (v == 0) { OpenWindow(5); // 打开参数画面 } else { SetData(1, "本机", "LW9000", 1); // 触发提示弹窗 }

提示弹窗的做法是用间接窗口。在基础画面上放一个"间接窗口"对象,控制地址设为本机LW9000,再单独做一个小窗口,内容是"另一侧正在操作参数画面,请稍候"。LW9000被置1时小窗口弹出来,置0时消失。为了让操作员看清楚,小窗口务必做成不透明、带边框的模态提示,点任意空白处或加个确认按钮把LW9000清掉。

这里注意"本机"这个设备名,中文版EBPro有时叫"本机",英文版叫"Local HMI",以你工程里实际的本地节点名为准。LW是断电即失的掉电内存,用来做提示这类非安全用途正合适。

4. 方案B落地:不占PLC资源的HMI直连互锁

4.1 主机屏开MODBUS TCP服务器并映射LW

客户不让你动PLC程序的时候,方案B就是救命稻草。把1号屏作为MODBUS TCP服务器,把自己的LW0映射成保持寄存器40001,2号屏作为客户端去读这个寄存器。

在1号屏的EBPro工程里,系统参数-设备列表-新增设备,制造商选MODBUS,设备类型选MODBUS TCP Server,绑定本地以太网口。然后在服务器的地址映射表里,把LW0对应到保持寄存器40001。保存后编译下载到1号屏,它就开始对外提供MODBUS服务了,从外部看就是一台站号1、IP为192.168.1.10的MODBUS从站。

4.2 从机屏添加客户端设备与远程标签

在2号屏的工程里,同样新增设备,这次选MODBUS TCP,目标IP填192.168.1.10,端口默认502,站号为1。建一个标签叫"对方占用字",地址填40001,16位字格式。这样2号屏的宏里就能直接读写1号屏的LW0了。

要注意威纶通HMI做MODBUS服务器时,LW映射的寄存器偏移规则和具体型号有关,MT8071iE这类比较常规的型号,LW0就是40001,LW1是40002。下载前可以用MODBUS调试工具先读一遍验证,别等联调时才发现地址对不上,这一步花五分钟能省半天。

4.3 双向互斥的占位写法与抢占处理

单向占位好写,双向互斥要小心。约定:1号屏占用自己的LW0,2号屏占用自己的LW1。1号屏进参数画面时,宏里先把自己的LW0置1,再去读2号屏的LW1;如果LW1是0,说明对方没占用,正常进入;如果LW1是1,说明对方已经占用了,把自己LW0清回0,同时弹提示。

// 1号屏进入参数画面前的互斥检查 short peer; SetData(1, "本机", "LW0", 1); // 先宣告自己占用 GetData(peer, "MODBUS TCP", "远程占用字", 1); // 读对方LW1 if (peer == 0) { OpenWindow(5); } else { SetData(0, "本机", "LW0", 1); // 对方占用,撤回宣告 SetData(1, "本机", "LW9000", 1); // 弹提示 }

"先置自己的位,再查对方的位"这个顺序是故意设计的,它能把两台屏同时进入的概率压到最低。但极端情况下两边同时置位、同时读到对方也是1,结果就是两边都撤回、都不进,操作员再按一次就行,这叫"活锁变重试",虽然体验一般,但不会出现两边同时进去的危险状态。

如果你想让体验更好一点,可以约定固定优先级:比如IP地址较小的屏在冲突时强制等待500ms后自动重试进入,另一台屏直接弹提示。这个规则要写进宏里,并且要在现场和操作员讲清楚,不然两边同时按,只有一侧能进,另一侧会以为屏坏了。

5. 真正让人翻车的不是组态,而是这些边界场景

5.1 宏的执行时机:按钮宏先跑还是窗口宏先跑

EBPro的宏触发时机有很多坑。导航按钮上的按下宏,是在手指松开那一刻执行的;而窗口打开宏,是在窗口真正切过去之后才执行。按钮宏里OpenWindow(5)先执行,切屏完成后再触发5号窗口的打开宏。所以按钮宏负责"检查并置位",打开宏负责任何途径进入该窗口时"兜底置位",这个职责划分要想清楚。

我见过有人把置位写在按钮宏里,结果操作员不是按按钮进去的,而是通过窗口切换、间接窗口等方式进到参数画面,占用位根本没置上,互锁形同虚设。兜底逻辑必须放在窗口打开宏,才能覆盖所有路径。

5.2 占位标志释放不干净导致的"死锁"

方案A有个经典翻车场景:1号屏的占位宏和释放宏都写在按钮上,操作员在参数画面里直接断电关机,按钮的释放宏根本没机会执行,D100一直停在1。等1号屏重新开机,2号屏再看D100还是1,永久锁死,只能手动复位PLC寄存器。

解决办法是双保险:释放逻辑放到窗口关闭宏里,同时占位值写一个超时判断。比如在PLC里加一个定时器,D100置位超过10分钟自动清零。参数画面这种操作,10分钟足够完成一次修改,超时清零不会误伤正常使用,但能救回大部分异常场景。

5.3 通讯中断、屏断电重启时的互锁行为

方案B的互锁状态存在HMI的LW里,LW是易失的,屏重启后自动清零,从"锁死"的角度看反而是好事。但这里有个更严重的问题:如果2号屏读取1号屏时通讯超时,GetData返回失败,你宏里读到的值是不可信的。

我的处理原则是:互锁判断时,GetData执行要检查返回值,失败时一律按"对方可能正在操作"处理,不允许进参数画面。宁可误报一次,也不能在通讯异常的时候双屏同时进去。这在写宏的时候要多写几行:

short peer, ret; ret = GetData(peer, "MODBUS TCP", "远程占用字", 1); if (ret == 0) // 读取失败,按占用处理 { SetData(1, "本机", "LW9000", 1); return; }

5.4 双人同时点击的竞态处理

前面说了方案A存在理论上的竞态窗口,现场真实测一下就知道,两个操作员同时按下按钮的间隔一般在几十毫秒以上,而PLC一个扫描周期只要几毫秒,方案A在实际操作中很难撞上。但你要是不放心,或者这台设备涉及人身安全,那就直接把方案C搬出来:PLC梯形图里做请求/应答仲裁,两个HMI侧只发请求、不直接置位执行标志。PLC梯形图仲裁还有个好处:操作记录、报警联动都在PLC侧统一处理,后续排查问题不用翻两套屏的程序。

6. 联调验收与生产环境里的使用经验

6.1 模拟器能测什么、不能测什么

EBPro自带的离线模拟能跑单个工程的宏逻辑,但双屏互锁这种需要两台屏在线的场景,模拟器只能帮你验证单屏侧的宏语法和弹窗逻辑。真正常见的故障——通讯超时、体会不执行、LW掉电变化——模拟器统统测不出来。这台屏的MODBUS服务器功能模拟器也能开,但和实物屏的端口占用、映射行为有差别,别省这一步,直接在实物上联调。

6.2 联调流程:从单屏到双屏的测试顺序

我的习惯是先在单屏上把打开宏、关闭宏、提示弹窗都过一遍,确认没有占位不释放、弹窗不消失的问题,再做双屏联调。具体顺序是:

  1. 1号屏进入参数画面,确认D100变成1;
  2. 2号屏按同一导航按钮,确认弹提示、画面不切换;
  3. 1号屏退出参数画面,确认D100变成0;
  4. 2号屏再进入,确认D100变成2;
  5. 1号屏此时尝试进入,确认被挡;
  6. 拔掉2号屏网线,1号屏尝试进入,确认行为符合预期;
  7. 1号屏在参数画面里断电重启,恢复后确认2号屏没有被锁死。

整套走完没问题,再放到车间里让操作员实际用两天,我一般还会在验收前一天故意制造几次"双人抢按",观察现场反馈。

6.3 验收清单和我踩过的几个坑

最后整理一份我在现场验收用的清单:占位标志是否随画面打开和关闭稳定变化;非占用侧进入是否有明确提示;通讯中断时是否安全可靠地拦截;屏断电重启后能否自动恢复;提示文案操作员一眼能看懂;设备要出口的,提示文案做进威纶通的多语言切换功能里,别写死在画面上。

第一次做双屏互锁时,我把占位位写在了屏自己的本地LW里,结果没同步到PLC,一台屏重启后另一台被锁得死死的,车间里设备停了十分钟,那台屏的程序被我反复重下了好几遍。后来统一改成PLC里做信号量,才彻底消停。

再分享一个小技巧:给每台屏在提示信息里显示自己的编号,"1号屏正在操作参数画面"和"2号屏正在操作参数画面"写清楚。操作员看到是哪一边占用的,直接对讲机喊一句就行,省得两个人隔着设备猜来猜去。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询