威纶触摸屏脚本编程从入门到精通:解锁智能自动化新维度180


各位自动化领域的探索者们,大家好!我是你们的老朋友,一名专注于分享实用知识的中文知识博主。今天,我们要聊一个能让你的威纶(Weintek)触摸屏“活”起来、更智能、更高效的话题——威纶触摸屏脚本编程。

你是否曾觉得触摸屏的自带功能有些局限?想实现更复杂的逻辑控制、更灵活的数据处理、更个性化的交互体验?恭喜你,脚本语言就是打开这些“潘多拉魔盒”的钥匙!它让触摸屏不再仅仅是简单的显示和操作界面,而能成为你自动化系统中的一个小巧而强大的“大脑”。

本篇文章将带你从零开始,逐步深入威纶触摸屏的脚本世界,助你从入门到精通,彻底掌握这门提升自动化效率的“秘密武器”。让我们一起探索,如何用代码赋予你的HMI新的生命力!

一、什么是威纶触摸屏脚本?为何学它?

威纶触摸屏(Weintek HMI)采用的是基于VB(Visual Basic)语法的脚本语言。简单来说,它是一段可以在触摸屏内部执行的小程序。通过这段程序,我们可以实现以下传统组态软件难以实现的功能:
复杂逻辑判断与控制: 根据多个条件同时判断,执行不同的操作。
高级数据处理: 对来自PLC或内部寄存器的数据进行复杂的计算、转换、筛选。
设备联动与优化: 实现多设备间的协同控制,优化生产流程。
个性化用户体验: 创建自定义的警报、消息提示、动画效果,提升人机交互友好度。
数据记录与分析: 自动记录关键数据,生成报表,辅助生产决策。

学习脚本,意味着你的自动化系统将拥有更高的灵活性、扩展性和智能化水平。这不仅能让你在工作中脱颖而出,更能为企业带来实实在在的效益提升。

二、脚本基础入门:迈出第一步

在威纶的开发软件EasyBuilder Pro中,脚本功能被集成得非常友好。我们主要在两个地方编写和使用脚本:
对象事件脚本: 绑定到特定对象(如按钮、数据显示器)的事件上,当事件发生时(如按钮按下、数据改变)触发执行。
全局脚本(Global Script): 在后台周期性或满足特定条件时自动执行,常用于实现定时任务、后台数据处理等。

2.1 脚本编写界面


在EasyBuilder Pro中,选中一个对象,在其属性窗口中找到“事件”,点击“添加”即可选择“脚本”。对于全局脚本,则在“项目”菜单中选择“全局脚本”。

2.2 基本语法与结构


威纶脚本语法非常接近经典的VB,简单易学。一个基本的脚本结构如下:
Function ScriptName() ' 定义一个函数(脚本)
' 这里是你的代码逻辑
Dim var1 As Integer ' 声明一个整型变量
var1 = 10 ' 赋值

If var1 > 5 Then ' 条件判断
' 执行某些操作
Else
' 执行其他操作
End If

' ...更多代码...
End Function

核心要素:
变量声明: 使用`Dim`关键字,例如`Dim i As Integer`(整数)、`Dim s As String`(字符串)、`Dim b As Boolean`(布尔值)。良好的变量命名习惯非常重要。
注释: 使用单引号`'`开头的行会被视为注释,方便代码理解和维护。

三、核心指令详解:与HMI和PLC对话

脚本的核心在于如何获取HMI和PLC的数据,以及如何控制它们。以下是一些最常用的核心指令:

3.1 读写寄存器:与PLC对话的桥梁


这是脚本最强大的功能之一,能够读取PLC寄存器(如D寄存器、M寄存器)或HMI内部寄存器(如LW、LB)的值,并对其进行写入。

读取数据:`GetData(DataType, Device, Address)`
`DataType`:数据类型,如 `"Integer"` (整型), `"DWord"` (双字), `"Float"` (浮点型), `"String"` (字符串)。
`Device`:设备名称,如 `"PLC1"` (连接的PLC), `"LW"` (HMI内部字寄存器), `"LB"` (HMI内部位寄存器)。
`Address`:寄存器地址,如 `"D0"` (PLC的D0), `"LW0"` (HMI的LW0)。


Dim plc_value As Integer
plc_value = GetData("Integer", "PLC1", "D0") ' 读取PLC D0寄存器的整型值

Dim hmi_string As String
hmi_string = GetData("String", "LW", "LW10", 10) ' 从HMI的LW10开始读取10个字符的字符串



写入数据:`SetData(DataType, Device, Address, Value)`
参数与`GetData`类似,`Value`是要写入的数据。


SetData("Integer", "PLC1", "D10", 123) ' 将整数123写入PLC D10寄存器

SetData("String", "LW", "LW20", "Hello Weintek") ' 将字符串写入HMI的LW20开始的区域



读写位:`GetBit(Device, Address)` / `SetBit(Device, Address, Value)`
专门用于操作位(布尔量),`Value`为 `0` 或 `1`。


Dim plc_m0 As Integer
plc_m0 = GetBit("PLC1", "M0") ' 读取PLC M0位的状态 (0或1)

SetBit("PLC1", "M1", 1) ' 将PLC M1位设置为ON



3.2 逻辑控制:让脚本“思考”




条件判断:`If...Then...Else...End If`
If GetData("Integer", "PLC1", "D0") > 100 Then
SetData("Integer", "LW", "LW0", 1) ' D0大于100,HMI LW0置1
ShowMessage("数值超限!") ' 弹出消息框
ElseIf GetData("Integer", "PLC1", "D0") < 0 Then
SetData("Integer", "LW", "LW0", -1) ' D0小于0,HMI LW0置-1
ShowMessage("数值低于下限!")
Else
SetData("Integer", "LW", "LW0", 0) ' 其他情况,HMI LW0置0
End If



循环结构:`For...Next` 和 `While...Wend`

用于重复执行一段代码。
' For 循环:将HMI LW10到LW19清零
Dim i As Integer
For i = 10 To 19
SetData("Integer", "LW", "LW" & i, 0)
Next i

' While 循环:当某个条件为真时持续执行
Dim counter As Integer = 0
While counter < 5
ShowMessage("计数器:" & counter)
counter = counter + 1
Delay(1000) ' 延迟1秒 (注意:在全局脚本中慎用长延迟,会阻塞HMI刷新)
Wend



3.3 数学运算:处理数据


支持基本的加`+`、减`-`、乘`*`、除`/`、取模`Mod`等运算。
Dim a As Integer = 10
Dim b As Integer = 3
Dim result1 As Integer = a + b
Dim result2 As Integer = a Mod b ' result2 = 1 (10除以3的余数)

3.4 系统功能:操控触摸屏本身




切换画面:`OpenWindow(WindowNo)`
OpenWindow(2) ' 切换到画面2



弹出消息框:`ShowMessage(MessageText)`
ShowMessage("操作完成!请确认。")



播放蜂鸣器:`Beep()`
Beep() ' HMI发出提示音



设置亮度:`SetBrightness(Level)` (Level: 0-100)
SetBrightness(50) ' 设置屏幕亮度为50%



3.5 时间与日期:记录与定时


获取当前日期和时间,或进行时间格式化。

获取当前时间:`Now()`
Dim currentTime As String
currentTime = FormatDateTime(Now(), 3) ' 获取当前时间并格式化为短时间格式 (如 "HH:MM:SS")
SetData("String", "LW", "LW0", currentTime) ' 将时间写入HMI寄存器



格式化日期时间:`FormatDateTime(DateTime, Format)`

`Format`参数可为0-5,代表不同的格式。

例如:`FormatDateTime(Now(), 1)` (长日期格式), `FormatDateTime(Now(), 2)` (短日期格式)

四、实战案例:让理论照进现实

理论知识再多,不如上手实践。下面我们通过几个经典案例,看看脚本是如何发挥作用的。

4.1 案例一:自定义两点运行与停止


假设我们有一个电机,希望通过HMI上的一个按钮来控制其启动和停止,并记录启动次数。
' 脚本名称:MotorControl
' 绑定到HMI的“启动/停止”按钮的“按下”事件
Function MotorControl()
Dim plc_start_bit As String = "M0" ' PLC的启动位
Dim plc_stop_bit As String = "M1" ' PLC的停止位
Dim hmi_run_status As String = "LB0" ' HMI内部运行状态位 (0:停止, 1:运行)
Dim hmi_run_count As String = "LW10" ' HMI内部运行计数器

' 读取当前运行状态
Dim current_status As Integer
current_status = GetBit("LB", hmi_run_status)

If current_status = 0 Then ' 当前为停止状态,点击后启动
SetBit("PLC1", plc_start_bit, 1) ' 设定PLC启动位
Delay(50) ' 短暂延迟,确保PLC接收到信号
SetBit("PLC1", plc_start_bit, 0) ' 复位PLC启动位(脉冲触发)
SetBit("LB", hmi_run_status, 1) ' 更新HMI运行状态为运行
ShowMessage("电机已启动!")

' 启动计数器加1
Dim count As Integer
count = GetData("Integer", "LW", hmi_run_count)
count = count + 1
SetData("Integer", "LW", hmi_run_count, count)
Else ' 当前为运行状态,点击后停止
SetBit("PLC1", plc_stop_bit, 1) ' 设定PLC停止位
Delay(50)
SetBit("PLC1", plc_stop_bit, 0) ' 复位PLC停止位
SetBit("LB", hmi_run_status, 0) ' 更新HMI运行状态为停止
ShowMessage("电机已停止!")
End If
End Function

4.2 案例二:超限报警与画面跳转


当某个PLC数据超过设定阈值时,自动弹出报警信息,并跳转到报警处理画面。
' 脚本名称:AlarmCheck
' 配置为全局脚本,周期性执行 (例如,每1秒执行一次)
Function AlarmCheck()
Dim current_temp As Integer
current_temp = GetData("Integer", "PLC1", "D100") ' 读取PLC温度值

Dim threshold_high As Integer = 80 ' 高温阈值
Dim threshold_low As Integer = 10 ' 低温阈值
Dim alarm_active As Integer = GetData("Integer", "LB", "LB1") ' HMI内部报警激活标志

If current_temp > threshold_high And alarm_active = 0 Then
ShowMessage("警告:温度过高,请检查!当前温度:" & current_temp)
OpenWindow(3) ' 跳转到报警处理画面 (假设画面3是报警画面)
SetBit("LB", "LB1", 1) ' 激活报警标志,避免重复报警
Beep() ' 播放蜂鸣器
ElseIf current_temp < threshold_low And alarm_active = 0 Then
ShowMessage("警告:温度过低,请检查!当前温度:" & current_temp)
OpenWindow(3) ' 跳转到报警处理画面
SetBit("LB", "LB1", 1) ' 激活报警标志
Beep()
ElseIf current_temp = threshold_low And alarm_active = 1 Then
' 温度恢复正常,且之前有报警
ShowMessage("温度已恢复正常。")
SetBit("LB", "LB1", 0) ' 复位报警标志
End If
End Function

五、脚本开发进阶与技巧

掌握了基本操作,我们再来看看如何写出更健壮、更易维护的脚本。

5.1 良好的编程习惯:注释与命名



多写注释: 解释代码的用途、复杂逻辑或关键变量。未来回顾或他人接手时会省去大量时间。
规范命名: 变量、函数名应具有描述性,例如`plc_motor_speed`、`CalculateTotalOutput()`。

5.2 调试与测试:找出问题


EasyBuilder Pro内置了脚本调试器。你可以在脚本中设置断点,单步执行,观察变量值,这对于查找错误非常有帮助。
模拟运行: 在EasyBuilder Pro中进行模拟运行,验证脚本逻辑。
实际测试: 将项目下载到HMI后,在实际环境中测试,确保与PLC的通信正常。
利用消息框: 在调试阶段,可以插入`ShowMessage()`来显示关键变量的值,辅助判断。

5.3 性能优化:让脚本更高效



减少不必要的寄存器读写: 频繁的PLC通信会影响HMI性能。尽量一次性读取所需数据,而不是分散多次读取。
优化循环: 避免无限循环或执行次数过多的循环,特别是全局脚本。
合理使用延迟: `Delay()`函数会暂停脚本执行,在全局脚本中应慎用或使用极短的延迟,以免影响HMI刷新。

5.4 模块化设计:复杂功能的利器


当脚本功能复杂时,可以考虑将其拆分为多个子函数(Sub或Function),提高代码复用性和可读性。
Function MainScript()
Call CheckAndReportStatus()
Call UpdateDisplayData()
End Function
Sub CheckAndReportStatus()
' 检查设备状态并报警的逻辑
End Sub
Sub UpdateDisplayData()
' 更新HMI显示数据的逻辑
End Sub

六、总结与展望

威纶触摸屏脚本编程是提升自动化系统智能化的重要一环。它将HMI从简单的“操作面板”升级为具备“思考能力”的控制终端。通过本篇文章的学习,相信你已经掌握了威纶脚本的基础知识和核心应用。

记住,编程是一门实践的艺术,多动手、多尝试、多犯错、多总结,你才能真正体会到它的乐趣和强大。从简单的计数、报警,到复杂的数据处理、设备联动,脚本能带你抵达自动化世界更广阔的维度。希望这篇教程能成为你自动化旅程中的一块坚实跳板。未来,你将能够创造出更多令人惊叹的智能自动化解决方案!

如果你在学习或实践中有任何疑问,欢迎在评论区留言交流,我们一起进步!

2025-11-21


下一篇:两周自制脚本语言不是梦!从零到一,你的编程速成挑战与实践秘籍大公开!