BACRouter内置的Modbus 网关

从固件版本4.x起,BACRouter内置了Modbus网关功能。这篇文章尝试解释其底层运作机制。

Modbus 读

为了提高性能,BACRouter将尽可能在一次事务读取更多数据。在Modbus标准中,最多2000个位(指线圈或离散输入)或125个寄存器(指输入或保持寄存器)可以在一次请求中读回,但是特定的Modbus从站可能不支持读取大量的数据。在BACRouter的WebUI的”从站设定“页面的Modbus参数对话框中,”批量读比特位数“与”批量读寄存器数“两个参数定义了从站的对批量读数据的支持。

BACRouter不会分段读取单点的数据,即使”批量读寄存器数“小于该点占用的寄存器数。

通常来说,我们关心的数据的Modbus地址并不连续,比如我们只关心地址为1及2000的线圈,虽然我们可以一次批量读回地址1~2000的数据,然后抛弃地址2~1999的数据,先读取地址1的数据,再发请求读取地址2000的数据的做法可能更有效率。”比特位跳过“与”寄存器跳过“参数定义了在两个我们关心的数据地址中间,有多少个无用的数据允许被抛弃。假设在上述例子中,”比特位跳过“设为1998,BACRouter将尝试一次性读回地址1~2000,抛弃中间1998个数据。倘若”比特位跳过“为1997,则BACRouter将分两次读取地址1与地址2000。因为中间跳过的1998个数据大于设定值1997。

数据点的年龄定义为数据读到后经过的时间,当数据年龄大等于”刷新间隔“参数时,BACRouter将发出读请求尝试更新数据。

Modbus 写

BACRouter不会合并写请求。

对于写单个数据,有两个Modbus功能号可供使用。例如,功能5为写单个线圈,功能号15为写多个线圈但写数量可以为1。有的从站只支持其中一个功能号。”写单个线圈”参数指定采用哪个功能号。

同样地,”写单个寄存器“参数指定用于写单个寄存器的功能号。假设有任一个BACnet输出对象映射到多个保持寄存器,这意味着从站支持功能号16写多个寄存器,”写单个寄存器“参数将被忽略,功能号16将被采用。

为避免过于频繁地发出写请求,BACRouter将在写请求之间间隔至少“写入间隔“参数指定的时间。

离线

如果任何读写请求失败,BACRouter将会重试,如果连续失败次数达到3次,BACRouter将认为该从站离线。在离线状态下,BACRouter将间隔”离线刷新间隔“时间重试该请求。

在离线事件中,BACnet侧的反应将在后面描述。

Modbus 测试

“批量读”测试方式可用来确认从站的”批量读比特位数“与”批量读寄存器数“能力及Modbus地址的有效性。

“点读写”测试方式可以帮助用户确认复杂点位的数据类型及字节顺序。

在执行测试前,主站必须被定义、使能,并保存到BACRouter上以生效。

Modbus 串行总线

BACRouter支持在同一条RS485总线上,不同波特率、奇偶较验、RTU/ASCII模式的从站共存。在发出请求前,BACRouter将根据从站的设定切换串口的参数。

如总线上的两个从站拥有相同的从站地址但是波特率或RTU/ASCII模式不同,BACRouter可以无冲突地通信。但是如果仅依赖不同的奇偶较验来防范冲突并不可靠,因为有的从站并不检查奇偶错误。

单设备映射模式

如VBUS网络端口未使能,BACRouter将工作与单设备模式,每个Modbus从站将被映射到”应用层设定“中定义的BACnet设备的不同对象实例空间。每个从站将占据1000实例空间。例如,第一个从站将使用0~999实例号,第二个从站使用1000~1999,以此类推。

如果“应用层设定”的”包捕捉映射“被启用,包捕捉映射模块将使用0~999实例空间。Modbus从站将紧随其后。

BACRouter将为每一个从站创建一个结构化视图对象,对象名采用“从站设定”中的”设备名“。

在本模式下,每个从站的”设备名”与”点名”必须全局唯一,包括“应用层设定”中的”设备名“及包捕捉映射模块使用的对象名。为避免名称冲突,在“从站设定”页面下有一个“名称前缀”参数,此字符串将插入到“设备名”与“点名”前。

本模式下当从站切换到离线状态,所有点的可靠性将被设为”COMMUNICATION_FAILURE”,当从站重新上线时,随着点数据的更新,各点的可靠性将被重新置回到”NO_FAULT_DETECTED”。

虚拟设备映射模式

当VBUS网络端口被使能,每个从站将被映射为VBUS网络上的虚拟BACnet设备。虚拟设备的MAC地址将从1开始。

在本模式下,所有从站必须有一个唯一的“设备实例号”。

在本模式下如果从站切换到离线,对应的虚拟BACnet设备将停收收发包以模拟离线状态。当从站重新上线时后,当更新完所有点数据后,虚拟BACnet设备将退出离线状态。

对象实例号分配

对象的实例号将自动按定义顺序增长。实际的对象ID可以在“从站设定”中的“映射”对话框中获取。

输出对象

输出对象对应的点值仍然会被定期读回,且设置成对象的Relinguish_Default属性。如果读回的值与上次写入的值不匹配,BACRouter将把该对象的可靠性置为”UNRELIABLE_OTHER”,如果上次写入时间已超过“重写间隔”参数,BACRouter将尝试重新写入。

基于以上的验证重写机制,如果两个输出对象对应的Modbus地址重叠,将可能产生混乱。WebUI会在从站内部配置阻止上述重叠。

浮点数的NaN

NaN是IEEE-754标准规定的特殊值,其意思为非有效数,BACRouter不接受NaN(正负无穷大仍然被视为有效值).

当一个Modbus点被定义为单精度浮点或双精度浮点,且BACRouter读到NaN值时,该点对应对象的可靠性将被设为”UNRELIABLE_OTHER”。