Lukas
Lukas
发布于 2024-09-15 / 122 阅读
0
0

WinCC Unified 确认报警 JS脚本方案

1. 方案介绍

该脚本方案实现了确认报警的方案,可以通过以下两种按钮进行报警确认

  1. HMI软按钮
  2. 实体按钮

方案开发环境

TIA PortalV19
PanelUnified Comfort Panel
Unified Images VersionV19.0.0.0

2. 实现步骤

  1. 创建bool报警变量并通过报警控件显示在画面中
  2. 创建两个变量
    ackButton连接到PLC,负责获取实体按钮的输入
    ackHmi是HMI上的画面按钮
  3. 画面创建一个Ack确认报警按钮,并在按下时置位,释放时复位, 变量是ackHmi
  4. 导入LSUP_AckAlarm全局脚本
  5. 在按钮的属性选型,背景色中插入脚本
  6. 打开全局定义,将全局脚本导入到当前上下文中。可以根据自己的需要重新命名
  import * as AckAlarm from "LSUP_AckAlarm"
  1. 如果你选择导入我提供的全局脚本,可以直接跳至第8步。
  2. 这里,你可以自行创建全局脚本,来导入
    代码我放在下面:
    全局定义:(可以根据自己的按钮颜色修改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
}
  1. 在该按钮的脚本中,插入一行脚本
    这里需要填入你的HMI变量名(程序中的hmi复位按钮变量和实体复位按钮变量)
    如果你的程序变量名不一致,一定要修改,并且使用双引号作为字符串传入。
   value=AckAlarm.AckFunction("ackHmi","ackButton")

如图所示:

3. 方案细节

  1. 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属性。

  1. Alarming.Alarms()

“Alarms”方法返回一个“Alarm”对象(“HMIAlarm”类型)。可使用“Alarm”对象对报警执行操作,例如确认或添加注释。

通过该方法,输入报警名称,返回报警Alarm对象。然后可以使用该对象的方案进行确认。

语法

HMIRuntime.Alarming.Alarms(AlarmName); 

参数
AlarmName
类型:String、HMIAlarm
报警名称

返回值
Object, HMIAlarm

Alarm对象具有的方法,可以通过帮助看到:
本方案的脚本使用的是该对象的Acknowledge()方法。

4. 问题

  1. 如果只使用PLC来确认报警(实体按键),往往大家会尝试使用计划任务。
    通用变量的触发来执行计划任务中的脚本,从而确认报警。
HMIRuntime.Alarming.GetActiveAlarms(HMIRuntime.Language).then(...)

但是,如果直接复制上面的脚本会无法执行。
我们可以通过Trace软件来查看,定位报错原因。
原因是因为:‘HMIRuntime.Language’这个对象属性在计划任务的上下文中找不到。
计划任务的上下文和画面属性的上下文是不同的。
我们可以直接传入Language的ID来实现。
如何获取这个ID?

  1. 在项目中勾选语言
  2. 画面事件中选择设置语言事件
  3. 选择目标语言,查看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. 提供的库和示例程序

  1. 库文件 LSUP_AckAlarm.zal19
  2. 示例程序AckAlarm.zap19
    库和示例程序可以通过百度网盘获取:LSUP_AckAlarm
    链接:https://pan.baidu.com/s/1Szhrx2dRda6DacCON916FA
    提取码:89dn
  3. JS代码可以通过GIT获取
    仓库地址: https://gitee.com/xie-shaotian-lukas/supvss1.git
    下载代码请复制以下命令到终端执行
   git clone https://gitee.com/xie-shaotian-lukas/supvss1.git

评论