本文章是一个机房自动化监控实际项目系列文章的番外篇,有个朋友问能否补充一个声光报警的实现,我仔细一想:虽然我不在这个项目中实现声光报警,但我在其他项目用过,使用的设备器件成本很低。那就以这个项目为背景,添加这个声光报警功能吧。
如果你不了解这个系列的文章,直接看这篇可能会有点迷糊。这个系列文章非常详细,真的可以说是手把手拉着你在现场做实际的项目一样。如果你还不了解前面的内容,请参考
我们的机房声光报警一般情况下,不需要使用影视剧里面那种夸张的效果:声音巨响、还旋转着散发着红光,然后巨大的基地里面上百号人都可以听到,紧张地到处奔跑!当然,你也可以给你的用户安装这样的玩意——可以保证,在办公室你会被用户k死。
我推荐一款声光报警,如下:
这种声光报警器可以安装在监控箱上,内部只需要给它供电24V直流电就行。很明显,我们需要有个可控制的开关给这个供电控制通断。因此,我们还需要一个开关量输出模块,并且这个模块支持Modbus RTU协议,方便接入监控箱的串口服务器的RS485接口中。
我在网上给你随便找了一个开关量输入输出模块,因为我们只需要控制一路,所以给你选择体积最小的。
那么接下来我们就可以把这个接入到之前项目的电路中了。
电路图非常简单,如下图:
此电路我们把开关量模块和之前的温湿度、漏水传感器都接在同一个RS485总线上,?并且给开关量模块使用监控箱中的24V直流电。
此模块因为是2路继电器输出,每个输出有一个常开、常闭和一个公共端,我们把24V+接入OUT1的公共口,常开口接声光报警器的一个输入,另一个输入接24V-。这样,只要开关量模块OUT1口有输出,内部继电器吸合,常开口就会闭合,声光报警器就接通24V电源了——也就能发出声光了。
接下来,我们就在之前实际项目软件配置的基础上,加入这个些设备数据。
假设这个模块配置好的地址是21,RS485接口是(9600 N 8 1)——和我们之前项目总线参数一样,OUT1,OUT2输出对应modbus地址是 00001,00002。
我们打开项目管理界面,在通道ch1下鼠标右键,选择“New Device",在弹出的编辑对话框中填写如下:
添加这个开关量模块对应的设备,然后选中这个swio节点,右边选择"Properties"属性选项卡,修改Modbus Device Address=21。
?接下来,点击"[Tags]选项卡",在里面添加开关量读写数据标签:
这个设备目前就一个声光报警数据标签,其他都不需要配置了。这样就完成了设备接入和标签数据的定义。?
此时,就可以给设备供电,启动项目,然后在标签列表的”Write"列,写入1,点击右边的写入按钮,就可以测试开关量模块Out1是否吸合,声光报警器是否发声。
写入0,就关闭声光报警。
?
由于我们没有实际的设备,以上就没有具体显示数据了。?
此声光报警可以使用之前报警定义作输出,但考虑到之前项目并没有用的任务控制功能,我们此次就以这个例子为契机,使用IOT-Tree Server提供的任务功能,做声光报警输出。
IOT-Tree中的任务是定时运行的JS脚本,我们可以设置任务(Task)-活动(Action)。每个Action含重复运行的JS脚本。在项目启动时,任务也会启动,里面的脚本会被定时运行。任务可以让我们对被监控现场,实现复杂的控制功能。
我们本次控制逻辑非常简单:当发现UPS非online状态时,则输出上面定义的开关量信号=true,否则就关闭。
我们在项目中间组织树上方,点击"Tasks"图标,右边选项卡就多了此项目的任务管理界面。
点击"+Add Task",在弹出的对话框口填写如下信息:?
除了任务名称和标题,我们设置Interval MS=5000,也即是任务每间隔5000毫秒运行一次。点击Ok之后,在此任务右边,点击“+”?添加任务内部的活动:
这个活动在任务中被任务调度,一个任务可以有多个活动,并且任务内部的活动共享任务间隔运行的线程。每个活动有自己的JS控制脚本。点击Ok之后,可以看到活动有 init script,run in loop script,end script
其中,init script表示任务启动时,会被调用一次,你可以在里面定义JS变量或初始化工作,方便后续使用。run in loop script则是任务运行中,会被定时调用的JS脚本。
我们点击此按钮,弹出JS编辑窗口,左边有以项目$prj为根的js运行上下文。我们写入一段如下代码(如果对成员关系不了解,可以参考左边的全局成员已经内部的树形内容):
let ups_online = upseth.apc9631.ups_st_online ;
let av_out = ch1.swio.aud_vis ;
if(ups_online._pv==false)
{// trigger av out
if(av_out._pv==false)
av_out._pv = true;
}
else
{ // no alert
if(av_out._pv==true)
av_out._pv = false;
}
这段代码非常简单,首先判断upseth.apc9631.ups_st_online这个数据标签的值,是否为false。如果==false,则表明UPS非online状态,需要报警。此时判断ch1.swio.aud_vis这个标签值是否在报警状态,如果不是则给这个标签写入true(这个会触发IOT-Tree到开关量模块的写指令)。
否则,如果需要解除报警,则写入false。为了避免每次都有写指令产生,需要对当前值进行判断。
保存之后,我们就可以启动项目进行测试了。你可以尝试手工对UPS切换by pass状态,这样就可以查看运行效果。
本章是一个之前项目系列的补充文档。但里面有着你及可能遇到的开关量输出和任务控制功能。是对之前系列文章的一个很好的补充。?