1. 工业HMI开发中的屏幕适配难题
在工业自动化项目中,威纶通(Weinview)触摸屏作为人机交互界面(HMI)的常用设备,其开发过程中最令人头疼的问题莫过于多尺寸屏幕适配。不同设备可能配备4.3寸、7寸或10寸触摸屏,传统做法需要为每种尺寸单独设计界面,工作量呈几何级数增长。
去年我在某化工厂DCS系统升级项目中,就遇到了这样的困境:产线上12台设备分别使用了三种不同尺寸的威纶通触摸屏(MT8071iP 7寸、MT8102iE 10寸、MT6050iP 4.3寸)。最初采用传统方式开发时,每修改一个阀门控制逻辑,就需要在三套工程文件中同步调整,不仅效率低下,还极易出现版本不一致的问题。
2. 屏幕自适应解决方案的核心思路
2.1 基准分辨率设计法
经过多次项目实践,我总结出一套基于基准分辨率的自适应方案。其核心原理是:
- 选定一个中间尺寸作为基准(推荐800×480,对应7寸屏)
- 所有控件按基准分辨率进行绝对定位
- 运行时通过缩放系数动态调整控件位置和尺寸
这种方法的优势在于:
- 开发阶段只需维护一套基准尺寸的工程文件
- 适配不同屏幕时只需计算缩放比例,无需重新布局
- 特别适合包含复杂动画的工业组态界面
2.2 VBScript动态缩放实现
在EB Pro开发环境中,可以通过VBScript脚本实现自动缩放。以下是经过多个项目验证的可靠代码:
vbs复制Sub Screen_OnLoad()
' 基准分辨率设定(800×480对应7寸屏)
Dim baseWidth = 800
Dim baseHeight = 480
' 计算当前屏幕的缩放比例
ratioX = HMI.ScreenWidth / baseWidth
ratioY = HMI.ScreenHeight / baseHeight
' 遍历屏幕所有控件进行缩放
For Each obj In Screen.Objects
' 保存原始尺寸(首次运行)
If IsEmpty(obj.OriginalWidth) Then
obj.OriginalLeft = obj.Left
obj.OriginalTop = obj.Top
obj.OriginalWidth = obj.Width
obj.OriginalHeight = obj.Height
End If
' 应用缩放比例
obj.Left = obj.OriginalLeft * ratioX
obj.Top = obj.OriginalTop * ratioY
obj.Width = obj.OriginalWidth * ratioX
obj.Height = obj.OriginalHeight * ratioY
' 字体大小自适应(可选)
If obj.HasProperty("FontSize") Then
obj.FontSize = obj.FontSize * Min(ratioX, ratioY)
End If
Next
End Sub
关键细节:必须在控件属性中勾选"允许脚本控制",否则缩放操作会失效。实测在EB Pro V6.0以上版本中,该方案对按钮、指示灯、图表等常见控件均有效。
3. 多设备IP切换的工程实践
3.1 PLC连接动态配置方案
工业现场常需要切换不同PLC设备,传统做法是进入系统菜单修改IP参数,既不方便又容易出错。我的解决方案是通过宏脚本实现一键切换:
vbs复制' PLC连接管理模块
Dim PLC_IP_List
PLC_IP_List = Array("192.168.1.100", "192.168.1.101", "192.168.1.102")
Sub SetPLC_IP(index)
' 参数校验
If index < 0 Or index > UBound(PLC_IP_List) Then Exit Sub
' 更新SmartTag值
SmartTags("PLC_IP") = PLC_IP_List(index)
' 自动重连逻辑
If SmartTags("ConnectionStatus") = 0 Then
PLC.Disconnect
PLC.Connect
End If
' 更新界面显示
SetText("txtCurrentIP", "当前PLC: " & PLC_IP_List(index))
End Sub
3.2 前端交互设计要点
配套的界面设计建议:
- 创建IP选择下拉菜单,绑定到宏命令
- 添加连接状态指示灯,绑定PLC.ConnectionStatus
- 在画面显眼位置显示当前连接IP
- 为重要操作添加二次确认弹窗
实测案例:在某包装产线项目中,通过这种方案将设备切换时间从原来的3分钟缩短到10秒,且完全避免了IP输入错误的问题。
4. 元件库的高效复用技巧
4.1 自定义组件开发规范
建立可复用的元件库是提升开发效率的关键。以下是经过验证的最佳实践:
-
属性标准化:
- 所有可绑定参数必须声明为动态属性
- 命名采用[类型]_[功能]格式(如Tag_Alarm、Color_Normal)
- 为每个属性添加注释说明
-
脚本模块化:
- 事件处理函数使用标准命名(如Update_Alarm)
- 避免在组件脚本中使用绝对路径
- 包含完善的错误处理逻辑
示例:报警指示灯组件模板
xml复制<CustomComponent Name="AlarmIndicator">
<!-- 可绑定属性 -->
<Property Name="Tag_Alarm" Type="Tag" Bindable="True"
Description="绑定到PLC报警点"/>
<Property Name="Color_Normal" Type="Color" Default="RGB(0,255,0)"
Description="正常状态颜色"/>
<Property Name="Color_Alarm" Type="Color" Default="RGB(255,0,0)"
Description="报警状态颜色"/>
<!-- 脚本逻辑 -->
<Script>
Sub Update_Alarm()
On Error Resume Next
If Tag_Alarm.Value Then
SetFillColor Color_Alarm
StartAnimation "Blink", 500
Else
SetFillColor Color_Normal
StopAnimation
End If
End Sub
Sub Component_OnBind()
RegisterEvent Tag_Alarm, "OnChange", "Update_Alarm"
End Sub
</Script>
</CustomComponent>
4.2 组件版本管理策略
为避免不同项目间的组件冲突,建议:
- 按功能领域建立分类目录(如/Valves/、/Pumps/)
- 每个组件附带版本说明文件(.ver)
- 使用EB Pro的"导出元件库"功能批量打包
- 定期备份到网络共享目录
5. 版本兼容性处理与现场调试
5.1 高低版本工程转换
威纶通EB Pro不同版本间的兼容性问题是个大坑,特别是当开发电脑使用新版本,而现场设备固件较旧时。可靠的处理流程:
-
开发阶段:
- 明确现场设备固件版本(通过HMI系统信息查看)
- 在EB Pro中创建工程时选择对应版本
- 定期使用"另存为旧版本"功能测试兼容性
-
部署阶段:
- 使用"工程转换器"工具(EB Pro自带)
- 勾选"移除新版本特性"选项
- 转换后必须实地测试所有功能
血泪教训:某项目因忽略版本兼容,导致现场10台设备无法加载动画效果,最后不得不连夜重做工程文件。
5.2 现场调试快速排错指南
当HMI出现异常时,按以下步骤排查:
-
通信问题检查:
- 确认PLC IP与HMI设置一致
- 检查网线连接和交换机状态
- 使用Ping功能测试网络连通性
-
画面显示异常:
- 确认屏幕分辨率设置正确
- 检查缩放脚本是否正常执行
- 验证字体文件是否嵌入工程
-
组件功能失效:
- 检查动态属性绑定是否正确
- 查看脚本错误日志(通过EB Pro远程诊断)
- 验证标签地址与PLC程序一致
6. 工程优化与性能调优
6.1 内存管理技巧
威纶通触摸屏的内存资源有限,特别是处理复杂画面时容易卡顿。经过多个项目验证的优化方案:
-
画面组织:
- 将大型工程拆分为多个子画面
- 使用"画面缓存"功能预加载常用画面
- 及时卸载不用的画面释放内存
-
资源优化:
- 压缩图片资源(建议使用PNG-8格式)
- 限制同时运行的动画数量
- 避免使用过多透明控件
-
脚本优化:
- 减少Screen.OnTimer事件的触发频率
- 使用局部变量替代全局变量
- 复杂的计算任务移交给PLC处理
6.2 实时数据监控方案
对于需要高频更新的数据展示,推荐采用以下架构:
-
数据采集层:
- 在PLC中建立数据缓冲区
- 使用块传输代替单点读取
- 设置合理的采样周期(通常100-500ms)
-
HMI处理层:
- 采用异步更新机制
- 对趋势图使用动态加载
- 关键参数添加变化率检测
示例代码:
vbs复制' 趋势图动态加载模块
Sub Update_Trend()
Static lastUpdate
If Now() - lastUpdate < 0.2 Then Exit Sub ' 限流200ms
' 获取最新100个数据点
Dim values
values = PLC.ReadBlock("DB100.DBD0", 100)
' 更新趋势图
TrendChart.Clear
For i = 0 To UBound(values)
TrendChart.AddPoint values(i)
Next
lastUpdate = Now()
End Sub
这套HMI开发方案已在多个工业现场得到验证,包括化工厂DCS系统、食品包装线和汽车焊装线等项目。最典型的案例是在某汽车厂焊装车间,使用同一套工程文件适配了23台不同尺寸的威纶通触摸屏,开发效率提升60%以上,且完全消除了以往因多版本工程文件导致的逻辑不一致问题。