1. 方案介绍
该脚本方案实现了确认报警的方案,可以通过以下两种按钮进行报警确认
- HMI软按钮
- 实体按钮
方案开发环境
TIA Portal | V19 |
---|---|
Panel | Unified Comfort Panel |
Unified Images Version | V19.0.0.0 |
2. 实现步骤
- 创建bool报警变量并通过报警控件显示在画面中
- 创建两个变量
ackButton连接到PLC,负责获取实体按钮的输入
ackHmi是HMI上的画面按钮
- 画面创建一个Ack确认报警按钮,并在按下时置位,释放时复位, 变量是ackHmi
- 导入LSUP_AckAlarm全局脚本
- 在按钮的属性选型,背景色中插入脚本
- 打开全局定义,将全局脚本导入到当前上下文中。可以根据自己的需要重新命名
import * as AckAlarm from "LSUP_AckAlarm"
- 如果你选择导入我提供的全局脚本,可以直接跳至第8步。
- 这里,你可以自行创建全局脚本,来导入
代码我放在下面:
全局定义:(可以根据自己的按钮颜色修改RGB)const highlightBtnColor=HMIRuntime.Math.RGB(0, 255 ,0 ,255); const defaultBtnColor=HMIRuntime.Math.RGB(72, 73 ,78 ,255);
AckFunction:
``` JS
export function AckFunction(hmiAck, ackButton) {
let btnColor
// read soft button in HMI
let ackHmi=HMIRuntime.Tags(hmiAck).Read();
// read real button from PLC
let ackPlc=HMIRuntime.Tags(ackButton).Read();
let ack=ackHmi||ackPlc;
if(ack){
// set button color to highlight
btnColor=highlightBtnColor;
//Get all Active Alarms,get a Promise boject,use .then to acknowledge them
HMIRuntime.Alarming.GetActiveAlarms(HMIRuntime.Language).then(
function(AckAlarm){
for (let i=0; i<AckAlarm.length; i++){
//use Acknowledge() function
HMIRuntime.Alarming.Alarms(AckAlarm[i].Name).Acknowledge();
}
}
)
}else{
// set button color to default
btnColor=defaultBtnColor;
}
return btnColor
}
- 在该按钮的脚本中,插入一行脚本
这里需要填入你的HMI变量名(程序中的hmi复位按钮变量和实体复位按钮变量)
如果你的程序变量名不一致,一定要修改,并且使用双引号作为字符串传入。
value=AckAlarm.AckFunction("ackHmi","ackButton")
如图所示:
3. 方案细节
- Alarming.GetActiveAlarms()
这个方法的语法是:
HMIRuntime.Alarming.GetActiveAlarms(Language[,Filter][,SystemNames])
.then(function(HMIAlarmResult[]) {
...
});
.catch(function(ErrorCode) {
...
});
此方法可执行异步读取操作,不会阻碍脚本的进一步执行。在执行此操作时,该方法使用 Promise 对象,该对象具有针对读取操作成功(“then()”)和错误(“catch()”)执行的处理程序。根据结果,在完成执行后,将调用 Promise 模式的相应处理程序(“AlarmResult”对象或错误代码作为参数)。
简单来说,这个异步函数可以读取当前报警,返回的是一个Promise对象
我们可以使用.then对返回的Promise对象做进一步处理
返回的这个Promise对象的介绍:
AlarmResult”对象(“HMIAlarmResult”类型)可提供访问激活报警属性的权限。“AlarmResult”对象是映射激活报警所有属性的纯数据对象。
对象类型:HMIAlarmResult
我们再来看这个实现的代码。传入了当前Runtime的语言,获取了HMIAlarmResult这个对象,用.then方法进一步处理。
这里调用function(){}就是把返回的这个对象传递给AckAlarm这个变量。
HMIRuntime.Alarming.GetActiveAlarms(HMIRuntime.Language).then(
function(AckAlarm){
for (let i=0; i<AckAlarm.length; i++){
//use Acknowledge() function
HMIRuntime.Alarming.Alarms(AckAlarm[i].Name).Acknowledge();
}
}
这个“AlarmResult”对象具有以下属性:
- AlarmGroupID
返回报警组 ID。 - ID
返回报警 ID(也用于显示)。 - Name
返回报警的名称。
等等...
这里我们其实就是需要返回的这个HMIAlarmResult的Name属性。
- Alarming.Alarms()
“Alarms”方法返回一个“Alarm”对象(“HMIAlarm”类型)。可使用“Alarm”对象对报警执行操作,例如确认或添加注释。
通过该方法,输入报警名称,返回报警Alarm对象。然后可以使用该对象的方案进行确认。
语法
HMIRuntime.Alarming.Alarms(AlarmName);
参数
AlarmName
类型:String、HMIAlarm
报警名称
返回值
Object, HMIAlarm
Alarm对象具有的方法,可以通过帮助看到:
本方案的脚本使用的是该对象的Acknowledge()方法。
4. 问题
- 如果只使用PLC来确认报警(实体按键),往往大家会尝试使用计划任务。
通用变量的触发来执行计划任务中的脚本,从而确认报警。
HMIRuntime.Alarming.GetActiveAlarms(HMIRuntime.Language).then(...)
但是,如果直接复制上面的脚本会无法执行。
我们可以通过Trace软件来查看,定位报错原因。
原因是因为:‘HMIRuntime.Language’这个对象属性在计划任务的上下文中找不到。
计划任务的上下文和画面属性的上下文是不同的。
我们可以直接传入Language的ID来实现。
如何获取这个ID?
- 在项目中勾选语言
- 画面事件中选择设置语言事件
- 选择目标语言,查看ID。(如下图,中文的ID为2052,这个数据类型是Number)
综上,可以把计划任务的脚本写为:
export function Task_任务_1_Update() {
HMIRuntime.Alarming.GetActiveAlarms(2052).then(
function(AckAlarm){
for (let i=0; i<AckAlarm.length; i++){
//use Acknowledge() function
HMIRuntime.Alarming.Alarms(AckAlarm[i].Name).Acknowledge();
}
}
)
}
5. 提供的库和示例程序
- 库文件 LSUP_AckAlarm.zal19
- 示例程序AckAlarm.zap19
库和示例程序可以通过百度网盘获取:LSUP_AckAlarm
链接:https://pan.baidu.com/s/1Szhrx2dRda6DacCON916FA
提取码:89dn - JS代码可以通过GIT获取
仓库地址: https://gitee.com/xie-shaotian-lukas/supvss1.git
下载代码请复制以下命令到终端执行
git clone https://gitee.com/xie-shaotian-lukas/supvss1.git