Modbus 关键词 ============== modbus 关键词可用于匹配 Modbus 请求的各种属性。 该关键词有三种使用方式: * 通过 "function" 设置匹配功能属性; * 通过 "access" 设置直接匹配数据访问; * 通过 "unit" 设置单独匹配单元标识符,或结合前述的 "function" 或 "access" 设置。 使用 **function** 设置时,可匹配以下内容: * 基于功能码字段及适用时子功能码的操作; * 三类 Modbus 功能之一; * 公开定义的公共功能(设置 "public"); * 用户自定义功能(设置 "user"); * 专用于 Modbus 专有扩展的保留功能(关键词 "reserved"); * 公共功能的两个子组之一: * 已在 Modbus 规范中定义的功能(关键词 "assigned"); * 未分配功能,保留供未来使用(关键词 "unassigned")。 语法:: modbus: function <值> modbus: function <值>, subfunction <值> modbus: function [!] 符号 '!' 表示否定 示例:: modbus: function 21 # 写文件记录功能 modbus: function 4, subfunction 4 # 强制只听模式(诊断)功能 modbus: function assigned # 由 Modbus 应用协议规范 V1.1b3 定义 modbus: function public # 经 Modbus.org 社区验证 modbus: function user # 内部使用且规范不支持 modbus: function reserved # 部分公司用于遗留产品,不对外开放使用 modbus: function !reserved # 除保留功能外的所有功能 使用 **access** 设置时,可匹配以下内容: * 数据访问类型(读或写); * 主表访问之一(离散输入、线圈、输入寄存器和保持寄存器); * 地址访问范围; * 写入的值。 语法:: modbus: access modbus: access read modbus: access read , address <值> modbus: access write < coils | holding> modbus: access write < coils | holding>, address <值> modbus: access write < coils | holding>, address <值>, value <值> _<值>_ 设置匹配正在访问或写入的地址或值,如下所示:: address 100 # 精确匹配地址 100 address 100<>200 # 大于地址 100 且小于地址 200 address >100 # 大于地址 100 address <100 # 小于地址 100 示例:: modbus: access read # 读访问 modbus: access write # 写访问 modbus: access read input # 离散输入表的读访问 modbus: access write coils # 线圈表的写访问 modbus: access read discretes, address <100 # 离散输入表地址小于 100 的读访问 modbus: access write holding, address 500, value >200 # 保持寄存器表地址 500 处写入值大于 200 使用 **unit** 设置时,可匹配以下内容: * 连接在桥接器或网关后子网络上的远程设备的 MODBUS 从站地址。目标 IP 地址标识桥接器本身,桥接器使用 MODBUS 单元标识符将请求转发至正确的从设备。 语法:: modbus: unit <值> modbus: unit <值>, function <值> modbus: unit <值>, function <值>, subfunction <值> modbus: unit <值>, function [!] modbus: unit <值>, access modbus: unit <值>, access read modbus: unit <值>, access read , address <值> modbus: unit <值>, access write < coils | holding> modbus: unit <值>, access write < coils | holding>, address <值> modbus: unit <值>, access write < coils | holding>, address <值>, value <值> _<值>_ 设置匹配正在访问或写入的地址或值,如下所示:: unit 10 # 精确匹配单元标识符 10 unit 10<>20 # 大于单元标识符 10 且小于单元标识符 20 unit >10 # 大于单元标识符 10 unit <10 # 小于单元标识符 10 示例:: modbus: unit 10 # 单元标识符 10 modbus: unit 10, function 21 # 单元标识符 10 和写文件记录功能 modbus: unit 10, function 4, subfunction 4 # 单元标识符 10 和强制只听模式(诊断)功能 modbus: unit 10, function assigned # 单元标识符 10 和已分配功能 modbus: unit 10, function !reserved # 单元标识符 10 和除保留功能外的所有功能 modbus: unit 10, access read # 单元标识符 10 和读访问 modbus: unit 10, access write coils # 单元标识符 10 和线圈表的写访问 modbus: unit >10, access read discretes, address <100 # 大于单元标识符 10 和离散输入表地址小于 100 的读访问 modbus: unit 10<>20, access write holding, address 500, value >200 # 大于单元标识符 10 且小于单元标识符 20 和保持寄存器表地址 500 处写入值大于 200 (参见:http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf) **注意:** 读写的地址从 1 开始。如果系统从 0 开始计数,需将地址值加 1。 **注意:** 根据 MODBUS TCP/IP 实现指南 V1.0b,建议保持与远程设备的 TCP 连接开启,而非为每个 MODBUS/TCP 事务开启和关闭连接。此时,需将流重组深度设置为无限(stream.reassembly.depth: 0)。 **注意:** 根据 MODBUS TCP/IP 实现指南 V1.0b,串行线路上的 MODBUS 从设备地址范围为 1 至 247(十进制)。地址 0 用作广播地址。 (参见:http://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf) 关于 Modbus 支持的论文和演示(法语)可在此获取: http://www.ssi.gouv.fr/agence/publication/detection-dintrusion-dans-les-systemes-industriels-suricata-et-le-cas-modbus/