10.21. Modbus 关键词¶
modbus 关键词可用于匹配 Modbus 请求的各种属性。
该关键词有三种使用方式:
通过 "function" 设置匹配功能属性;
通过 "access" 设置直接匹配数据访问;
通过 "unit" 设置单独匹配单元标识符,或结合前述的 "function" 或 "access" 设置。
使用 function 设置时,可匹配以下内容:
基于功能码字段及适用时子功能码的操作;
三类 Modbus 功能之一;
公开定义的公共功能(设置 "public");
用户自定义功能(设置 "user");
专用于 Modbus 专有扩展的保留功能(关键词 "reserved");
公共功能的两个子组之一:
已在 Modbus 规范中定义的功能(关键词 "assigned");
未分配功能,保留供未来使用(关键词 "unassigned")。
语法:
modbus: function <值>
modbus: function <值>, subfunction <值>
modbus: function [!] <assigned | unassigned | public | user | reserved | all>
符号 '!' 表示否定
示例:
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 <read | write>
modbus: access read <discretes | coils | input | holding>
modbus: access read <discretes | coils | input | holding>, 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 [!] <assigned | unassigned | public | user | reserved | all>
modbus: unit <值>, access <read | write>
modbus: unit <值>, access read <discretes | coils | input | holding>
modbus: unit <值>, access read <discretes | coils | input | holding>, 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/