带有Modbus的触摸开关:为什么需要它们以及如何在智能公寓中应用它们


在智能家居的预算系统中,通常使用标准开关-它们的输出类型也称为“干触点” 。 但是,这不是唯一的选择:为了寻找美观的开关,我遇到了内部装有Modbus RTU协议的设备。 除了美观的外观外,它们还允许您配置每个按钮的操作模式,详细控制背光并将其连接到中央控制器(我使用Wiren Board 5 ),四根线就足够了-电源,地线和用于RS-485的两条线。

如何连接此类开关并配置其照明和通风控制,请参见下文。 本文还将详细介绍一般如何使用Modbus设备。

Wiren Board营销人员的解释:本文来自Kallyanbl4我们的论坛中创建的主题。 在我们提出要求之后,他写了一篇完整的文章,并允许将其发布在我们的博客上,对此深表感谢。 除结尾处的注释外,所有文字均由作者撰写。

开关说明


研究了现在市场上的东西之后,我从中国人那里购买了这些有趣的开关:



它们的优点:

  • 好的设计;
  • 按下时,触摸开关闪烁,在黑暗中以令人愉悦的白色发光;
  • 价格相对较低-每个2000卢布。 价格包括单独的激光雕刻;
  • 可编程开关-您几乎可以将按钮设置为几乎所有操作:打开灯光,控制LED,升高/降低窗帘,...

开关规格:

  • 电源电压-12 V;
  • 数据传输速率-19200 bit / s;
  • 传输位数-8;
  • 停止位数-1;
  • 奇偶校验控制-无验证。

在Modbus RTU上工作时,连接的设备具有所谓的寄存器-存储信息的单元。 在屏幕快照中,描述了四键开关的寄存器:



当您单击其中一个触摸按钮时,寄存器0-3中的值将从0变为1。

断路器


在Wiren Board 5控制器中,根据配置,有2到4个RS-485端口。 交换机(本例中有27台)必须连接到这些端口。

在这种情况下,所有开关都可以在一条公共总线上运行。 这些开关可以串联连接,将电缆从一个开关引到另一个,但是我决定将所有电缆都连接在一个屏蔽层中。

连接电缆-八芯Cat 5e UTP。 您可以使用四核,但是我通常会以“以防万一”为原则。 您可以考虑使用其他四芯电缆,但是重要的是应该屏蔽电缆,因为即使信号频率相当低,也不会排除损耗和拾取。

结果,所有开关都如图所示互连:



从图中可以看出,所有交换机都使用无源UTP交换机互连。 对于核心1和2(橙色和白色-橙色)的数据传输(线A和B),将12 V电源连接到核心7和8(棕色和白色-棕色),我使用Mean Well NDR-75-12作为电源。

我不知道无源中文UTP交换机的行为,因此,在设计屏蔽时,我为有源RS-423交换机提供了空间。 我注意到该电路可通过无源和有源开关工作。 甚至当它们连接在一起时。



继电器光控


根据我的项目,公寓中计划使用27个独立设备(灯,风扇)供电,并由220 V供电。选择了三个继电器模块WBIO-DO-R10A-8和一个WBIO-DO-R10R-4来控制它们。 该选择是由于以下事实:公寓中几乎所有的照明都是LED,这与白炽灯的区别在于高启动电流。 选定的继电器能够提供每个通道高达10 A的电流切换,在我的情况下这是不必要的-但是,如前所述,“以防万一”。



继电器切换通过控制器Web界面进行 。 该过程很直观,不需要任何说明或提示。

软件部分


端口文件

我们Wiren Board 5硬件描述中了解到 ,它具有两个与两个RS-485端口相对应的设备端口/ dev / ttyAPP1/ dev / ttyAPP4 。 在我的情况下,交换机连接到端口/ dev / ttyAPP1

设备(交换机)地址

使用Modbus RTU协议交换数据时,每个设备都由其自己的唯一编号-Modbus地址标识。 通常,制造商会在设备本身上以三位数字的形式指示此地址,但是如果设备上没有该数字,则可以从命令行迭代地址 (用于将地址存储在Modbus寄存器0x80中):

root@wirenboard:~# service wb-mqtt-serial stop root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ttyAPP1 --debug -a$i -t3 -r0x80 -s1 -pnone; done 2>/dev/null | grep Data: 

结果应采用以下形式:

 Data: 0x008e 

答案以十六进制格式接收,对应于十进制142。
应该注意的是,每次调用modbus_client实用程序时,应该停止控制器的wb-mqtt-serial轮询驱动程序标准; 否则, modbus_client实用程序将无法工作。

交换机与有线板之间的数据交换

在上面,编写了一个循环,该循环轮询所有可能的Modbus地址,并在找到设备后返回地址值。 该循环使用modbus_client实用程序,这对于调试连接的设备是必需的。 在这一点上,使用它,我们将确保所有东西都正确连接,并且交换机与控制器正确交互。 为此,请尝试读取寄存器0x01开关中的数据:

 root@wirenboard:~# service wb-mqtt-serial stop root@wirenboard:~# modbus_client -mrtu /dev/ttyAPP1 --debug -a142 -s1 -pnone -b19200 -a142 -t0x03 

(实用程序及其键的描述在控制器文档中)。

结果如下:

 Opening /dev/ttyAPP1 at 19200 bauds (N, 8, 1) [8E][03][00][64][00][01][DA][EA] Waiting for a confirmation... <8E><03><02><00><01><2C><5B> SUCCESS: read 1 of elements: Data: 0x0001 

这样的结果意味着在寄存器中写入了一个离散值1,按下开关的一个按钮后,寄存器的值将变为相反的值:

 SUCCESS: read 1 of elements: Data: 0x0000 

如本段所述,如果观察到结果,则说明一切连接正确,开关和控制器相互了解。

交换机的本机驱动程序

在确保控制器和开关相互理解之后,就该在软件级别上描述开关键了。 开发人员建议将连接设备的描述添加到/etc/wb-mqtt-serial.conf文件中,或者以/usr/share/wb-mqtt-serial/templates/config-*.json文件的形式创建自定义模板

我走了第二种方式,我的模板如下所示:

 { "device_type": "4-band-switch", "device": { "name": "4-band-switch", "id": "4bsw", "enabled": true, "channels": [{ "name": "All", "reg_type": "holding", "address": "0x00", "type": "switch" }, { "name": "Window", "reg_type": "holding", "address": "0x01", "type": "switch" }, { "name": "Side", "reg_type": "holding", "address": "0x02", "type": "switch" }, { "name": "Diode", "reg_type": "holding", "address": "0x03", "type": "switch" } ] } } 

上面编写的模板的详细描述wb-mqtt-serial驱动程序描述中 。 简要处理以下领域:

  • “ Name”:“ All”是按钮的名称。 如果模板拼写正确,则此按钮将显示在“设置”标签中,其地址为/设备/ 4bsw_142 /控件/全部
  • “ Reg_type”:“持有”-寄存器的类型和大小。 交换机使用“保持”-一个可用于读取和写入的16位寄存器。
  • “ Address”:“ 0x00”-控制器将从中读取数据的开关寄存器的地址。
  • “类型”:“开关”-开关将如何在Web界面中显示。 在“开关”的情况下-分立开关的形式。

将模板保存到控制器。 之后,在Web界面的部分(配置-> /etc/wb-mqtt-serial.conf)中,您可以使用此模板添加新设备(4波段切换)。 添加我们的第一个开关,然后单击“保存”。

按下开关按钮时激活继电器的规则


在状态控制器内部,所有连接的设备均通过MQTT消息进行描述。 还可以通过发送MQTT消息来控制设备。 MQTT消息队列(代理)的客户端既是Web界面, 也是规则引擎

为了清楚起见,我们将看到Web界面如何处理传入的消息。 我们打开Web界面的“设置”选项卡,查看在交换机上按下“全部”按钮时会发生什么:交换机内部,Modbus寄存器的值更改, wb-mqtt-serial驱动程序轮询该交换机,然后根据设备模板,四频段交换机发送一条MQTT消息在主题/设备/ 4bsw_142 /控件/全部中 -以及在“设置”页面上,主题/设备/ 4bsw_142 /控件/全部中的值将立即从0更改为1。

考虑第二个客户端-规则引擎。 该引擎与Web界面一样,与消息队列一起使用,并且可以响应值的更改-whenChanged函数用于此目的。 就我而言,规则如下所示:

 //   defineRule("switch_all", { whenChanged: "4bsw_142/All", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT3_R3A2"] = newValue; dev["wb-gpio"]["EXT3_R3A5"] = newValue; dev["wb-gpio"]["EXT1_R3A1"] = newValue; dev["wb-gpio"]["EXT1_R3A2"] = newValue; dev["wb-gpio"]["EXT1_R3A5"] = newValue; dev["wb-gpio"]["EXT2_R3A8"] = newValue; dev["wb-gpio"]["EXT3_R3A7"] = newValue; } }); //  defineRule("switch_window", { whenChanged: "4bsw_142/Window", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT4_ON4"] = newValue; // dev["wb-gpio"]["EXT3_R3A6"] = newValue; // dev["wb-gpio"]["EXT3_R3A7"] = newValue; } }); // defineRule("switch_side", { whenChanged: "4bsw_142/Side", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT1_R3A3"] = newValue; dev["wb-gpio"]["EXT1_R3A4"] = newValue; dev["wb-gpio"]["EXT2_R3A1"] = newValue; } }); // defineRule("switch_diode", { whenChanged: "4bsw_142/Diode", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT2_R3A2"] = newValue; dev["wb-gpio"]["EXT2_R3A3"] = newValue; dev["wb-gpio"]["EXT3_R3A3"] = newValue; } }); 

我很高兴回答评论中的所有问题。

营销笔记


  1. 最好使用KSPEVG 2x2x0.35电缆(每米仅需30卢布)铺设RS-485线,而不是星形电缆,而要铺设总线。
  2. 我们建议您在使用LED灯时要格外小心-它们的启动电流可能超过额定的150(!) (这将是另一篇文章)-查看功能强大的继电器模块WB-MR6 :每通道电流16 A,包括高达800的浪涌电流(!)修改S中的放大器。

Source: https://habr.com/ru/post/zh-CN417093/


All Articles