近期某项目上的一个中控程序出了点问题,我过去排查:据说是无法用程序控制灯的开关。
先说下中控是如何控制灯开关的。其实很简单,中控主机后面的485口接了一个8路灯光继电器,通过中控发码来控制继电器的开合,以达到控制灯光的作用。只不过在这个项目上,又略微复杂,因为继电器是通过串联的方式连接,每个继电器都有自己的地址码,以此来区分。
简单的拓扑:IPAD/墙装控制屏–>中控主机–>灯光继电器1–>灯光继电器2–>灯光继电器3–>灯光继电器4–>灯光继电器5 每个灯光继电器控制着不同的电器,现在坏的是最后一个,灯光继电器5。
对于排查问题,用的最多也最好用的是“分段排查”。
首先用IPAD/墙装控制屏控制一下继电器1-4,查看工作一切正常。
检查继电器4到继电器5的连接线,正常。
检查继电器5的电源,正常。
手动控制继电器5,正常。
把继电器5拆下来,直连中控主机,无法工作。
因此判读:继电器5的串口接码模块坏了、中控主机发码不正常、继电器5的地址码自己变成其他码了。
判断接码模块是否损坏:拆开继电器5,观察里面的构造,通过中控主机发码测试,灯亮,正常。
中控主机发码不正常:这个检测麻烦,且其他四个继电器都可以工作,因此放到最后检查。
继电器5的地址码自己跳转成其他码了:这个是重点检测的。
如何检测继电器5的地址码已经跳转?这里就要涉及到中控编程了。AMX虽然后端代码都要纯手动编写,但是基本是模块化,条理清晰,因此也不算太难。
我们从继电器的厂家那里得到:继电器5的更改地址码的串口控制代码为:#SID00x>00y (其中00x为现有的地址码,00y是新的地址码)
为了防止串码,我们必须将继电器5单独拆出来,接到中控主机上。
如图增加一条执行命令,将继电器5的地址码从005改成007
上图中的REL8在中控程序中代表的是继电器5。
接下来添加一条按钮命令,对应刚才的执行命令:
这条命令的意思是:对应的前端按钮编码为2460,按下后的操作是执行“REL8_CHANGE”这条命令,即更改地址码。
接着将继电器1-8路全开和全关的执行命令:#SKD00512345678 和 #SGD00512345678中的005都改为007。
最后我们回到前端界面。在里面加一个按钮,编号为2460,名称为更改地址码测试。
将前端界面程序导入到IPAD中,将后端程序编译后上传到中控主机中。
我们打开IPAD,点一下按钮“更改地址码测试”,然后回到灯光控制界面,测试一下“全开”和“全关”是否能实现。
结果没实现。
出现这个问题说明继电器的地址码确实已经不是原来的005了,那它会变成多少呢?没人知道。且这个继电器无法通过物理按键或者程序初始化……
那么进入死胡同了吗?
突然间又想到一个笨方法。还模模糊糊记得继电器厂家提供的说明书,这个继电器最多16个串联。那么也就是说,最多有16个地址码。既然我不知道,那么可以一个个去试。
那么试的话还是把上面的方法重复16次?那样耗时间就真的太长了。
于是想了个方法。重复上面的方法16此虽然不太现实,但是我可以把所有可能的继电器地址码都改成同个地址码吧?
于是我把“REL8_CHANGE”这条执行命令,改成了如下形式:
然后将后端代码编译,导入中控。继续在IPAD中按“更改地址码”,看到中控主机对应的485口在疯狂地闪。
然后按灯光的“全开”“全关”,发现有效果,可见,此次故障为地址码的问题,且现在已经将地址码改成了007。
测试出来后,将地址码从007改回005,将“全开”“全关”对应的后端程序控制代码改回原来,成功修复中控功能。