本帖最后由 慈俭不敢为人先 于 2022-4-20 10:17 编辑
一种历史告警功能的实现——基于【拓普微】Lua脚本实现
一、应用背景
该应用适用于拓普微智能显示模块Modbus主机系列支持的产品,介绍并实现通过Lua脚本设计历史告警信息提示的功能。
二、设计实现
1、工程准备
1-1、硬件平台:拓普微智能显示模块HKT070DMC-2C ;
1-2、软件平台:SGTools;
1-3、UI素材:该案例工程所使用的背景图及图标素材;
1-4、功能目标: Modbus协议,监测故障事件寄存器(保持寄存器类型)每个位的变化,模块实现告警信息反馈与信息显示。事件表如下:
2、工程实现
2-1、工程条件与资源:
①打开SGTools新建工程,工程分辨率“800x480”,设备型号“HKT070DMC-2C” ②导入页面背景图DI0000、DI0001;创建10个字符串变量资源“0x000080~0x000500” 。
2-2、页面控件设置:
①进入页面PG0000关联导入的背景图DI0000,再新建10个字符串控件,依次关联字符串变量“0x000080~0x000500”。用以显示故障事件的信息。②新建2个触摸键控件,参数设置略。使用Lua改写实现上翻下翻查找事件信息功能。具体页面设置如下图2-1
2-3、Modbus通信协议设置
从RGTools的菜单栏中依次点击“工具”然后选择“Modbus产品脚本编辑器”打开编辑器如下图2-2,新建1条地址映射关系与1条逻辑处理关系。
①地址映射“Relative[0x080000,4x:0x0000],vplen[1],mblen[1],slaveID[1]”
功能:将1个16位的屏变量“0x080000”映射1个从机ID为“1”的保持寄存器地址“0x0000”。此例中映射的保存寄存器为“0x0000”也可根据需要映射别的地址或类型。
②逻辑处理“Read,if(always),mbAddr[4x:0x0000],mblen[1],slaveID[1],vplen[1]”
功能:模块上电一直读取1个从机ID为“1”的保持寄存器地址“0x0000”。该保持寄存器为故障事件监测寄存器,16个位对应不同类型的事件; Lua程序中监测到该保持寄存器发生变化时,产生事件信息并刷新字符串控件中的信息显示。
③编辑完成后,依次点击“保存”“编译”按钮生成Modbus.xml文件信息。
2-4、Lua脚本程序设计
智能模块HKT070DMC-2C支持Lua脚本程序扩展,关于Lua的具体编程语法及标准库函数可以参考官方手册,“hmt”库函数的使用说明请查看手册“SMART LCD Lua Functions Reference”。
可以通过点击RGTools资源栏下方的“Lua”标识,右键“添加文件”方式导入Lua脚本。历史告警信息的功能详细设计实现参考以下Lua程序:
--定义全局变量
Problem_Type = {"模块01故障", "模块01通讯故障", "模块02故障", "模块02通讯故障", "模块负载", "PCC开关异常", "闸门开关异常", "电压相位错误", "RTC电池负荷异常", "RTC电池超负荷", "BMC通讯故障", "网络连接异常", "DC散热器过温", "AC散热器过温", "电源欠压", "电源过压"}
Problem_Information = {}
--定义状态
_getinformationTostr = 0
_writevpstrmode = 0
ConIndex = 0
-----------------------------------
--初始化
staticvalue = hmt.readvp16(0x080000)
--SYSRunningTime = hmt.gettick()
--函数定义-----------------------------------------------------------
--事件信息生成函数
function _GetInformation(Value)
local YEAR = hmt.readvpreg(0xFFFF10)
local MONTH = hmt.readvpreg(0xFFFF11)
local DAY = hmt.readvpreg(0xFFFF12)
local HOUR = hmt.readvpreg(0xFFFF13)
local MINUTE = hmt.readvpreg(0xFFFF14)
local SECOND = hmt.readvpreg(0xFFFF15)
local _Date = string.format("%02d/%02d/%02d %02d:%02d:%02d", YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)
local infor_Data = ""
for i = 1, 16 do
if(((Value >> (i-1)) % 2) == 1)then
infor_Data = string.format("%s %s", _Date, Problem_Type)
for j =1, 19 do
Problem_Information[21 - j] = Problem_Information[20 - j]
end
Problem_Information[1] = infor_Data
end
end
end
---------------------------------------------------------------------
----------------------------------------------------------
-----函数名称: 主循环函数
-----函数功能: 上电循环执行,周期10ms
-----输入参数: 无
-----返回值 :
----------------------------------------------------------
luamain = function(void)
local TYPEValue = hmt.readvp16(0x080000)
if(TYPEValue ~= staticvalue)then
staticvalue = TYPEValue
_getinformationTostr = 1
end
if(_getinformationTostr == 1)then
_GetInformation(TYPEValue)
for i = 1, 10 do
hmt.writevpstr((0x00 + (i*0x80)), Problem_Information)
end
ConIndex = 0
_getinformationTostr = 0
end
if(_writevpstrmode == 1)then
for j = 1, 10 do
hmt.writevpstr((j*0x80), Problem_Information[j + ConIndex])
end
_writevpstrmode = 0
end
return 0
end
----------------------------------------------------------
-----函数名称: 触摸键回调函数
-----函数功能:
-----输入参数: 无
-----返回值 :
----------------------------------------------------------
tpkhook = function(page, id, state)
if(page == 0)then
if((id == 0) and (state == 0))then
ConIndex = ConIndex + 1
if(ConIndex > (#Problem_Information - 1))then
ConIndex = (#Problem_Information - 1)
end
_writevpstrmode = 1
end
if((id == 1) and (state == 0))then
ConIndex = ConIndex - 1
if(ConIndex < 0)then
ConIndex = 0
end
_writevpstrmode = 1
end
end
return 0
end
pagechangehook = function(pageid)
return 0
end
三、应用测试
测试一:(置监视地址bit2为1)如图
表中对应触发告警信息“模块02故障”以及对应日期
测试二:(置监视地址bit5为1)如图
表中对应触发告警信息“PCC开关异常”以及对应日期
测试三:其他测试效果