- modbus转发、控制配置说明
- 一、说明:
- 二、名词解释
- (1)数据类型:位(bit)、短整型(short);
- (2)地址下标索引;
- (3)值:位类型只有0和1;短整型的值是整数;
- 三、配置说明
- 1.配置转发需要明确
- 1.1配置示例
- (1)首先配置数据块,这是数据存储区域
- (2)配置采集数据,这是数据的源头
- (3)配置转发的数据块,这是数据的目标
- (4)配置数据块间地址映射和值的偏移计算
- (4.1) 普通地址映射(addr_Maps)
- 配置说明:
- (4.2) 位地址映射[addr_Maps_bit]
- 2.控制节点配置(control_nodes)
- (1)配置层级说明
- (2)顶层配置字段(control_nodes数组元素)
- (3)地址级配置字段(addrs数组元素)
- (4)目标控制指令字段(dest_nodes数组元素)
- (5)配置代码示例
modbus转发、控制配置说明
一、说明:
modbus转发方案基于数据中心(DataCenter)数据中心;作为控制器的数据交互层最核心部分,扮演着管理一切数据的基础;
数据流转:数据通常遵循 “采集 -> 处理 / 映射 -> 转发 / 控制” 的路径。DataCenter 的配置就是为了精确地定义和控制这个路径。
二、名词解释
1. 数据块 (DB - Data Block):你可以把它想象成一个数据容器或一个表格。
需要关注:
(1)数据类型:位(bit)、短整型(short);
(2)地址下标索引;
(3)值:位类型只有0和1;短整型的值是整数;
2.modbus功能码:reg = 1、reg = 2 是位类型的数据块; reg = 3、reg = 4是short类型的数据块;
3.modbusServer(modbus服务器):
(1)db1、db2、db3、db4对应modbus功能码reg = 1、reg = 2、reg = 3、reg = 4;
(2)由于不同设备型号的数据块写入和读取会有冲突的现象,智物联适配器特针对该情况进行处理,添加支持写入、读取相同的功能码不同的数据块;
即若不配置db5、db6则db5对应写入reg = 1所在的数据块、db6对应写入reg = 3所在的数据块;
若配置db5和db6则读取和写入是不同的数据块
4.modbus转发和modbus服务器是一个含义,在本文档中;
5.偏移计算即加、减、乘、除;需要注意modbus协议不支持小数,而非数据块不支持小数的存储
三、配置说明
1.配置转发需要明确
(1)从(地址)哪里采集的数据;参考1.1-(2)
(2)转发到哪里(地址);参考1.1-(4)
(3)值是否需要偏移计算;参考1.1-(4)
1.1配置示例
(1)首先配置数据块,这是数据存储区域
DB = {
-- db1
{ db_name = "db1_AO", db_type = "short", addr = 0, count = 100 },
{ db_name = "db2_AO", db_type = "short", addr = 0, count = 100 },
{ db_name = "db3_AO", db_type = "short", addr = 0, count = 100 },
{ db_name = "db1_AO_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db2_AO_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db3_AO_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db1_6_AO_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db2_6_AO_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db3_6_AO_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db11_AI_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db12_AI_dest", db_type = "short", addr = 0, count = 100 },
{ db_name = "db13_AI_dest", db_type = "short", addr = 0, count = 100 },
},| 字段 | 含义 | 详细解释 | 示例 | 示例含义 | 可选项 |
|---|---|---|---|---|---|
| db_name | 数据块名称 | 用于标识数据块的唯一名称,后续配置中通过该名称引用 | “db1_AO” | 表示第一个数据块,用于存储AO类型采集数据 | 自定义字符串(建议含功能标识) |
| db_type | 数据类型 | 指定数据块中存储数据的类型,需与采集功能码对应 | “short” | 表示数据为16位短整型,对应modbus功能码3 | “short”、”int”、”bit” |
| addr | 起始地址 | 数据块在内存中的起始存储地址,默认从0开始 | 0 | 表示该数据块从内存地址0开始存储 | 非负整数(建议默认0) |
| count | 数据数量 | 数据块可存储的数据项个数,需大于等于采集的数据量 | 100 | 该数据块可存储100个short类型数据项,满足64个采集数据需求 | 正整数(需≥采集cnt值+1,允许冗余) |
需要注意,采集的数据是reg = 3,地址是从0到64个,因此需要定义short(reg = 3对应short)的数据块,数量100个(只要大于64+1个即可,可以有冗余);
即配置了十二个数据块,后续可根据db_name引用对应的数据块;
即根据功能码选择对应的db_type;
即根据采集的cnt来选择count数量;
(2)配置采集数据,这是数据的源头
collect = {
{ ID = 1, reg = "3", addr = 0, cnt = 64, db = "db1_AO" },
{ ID = 2, reg = "3", addr = 0, cnt = 64, db = "db2_AO" },
{ ID = 3, reg = "3", addr = 0, cnt = 64, db = "db3_AO" },
},采集ID = 1, reg = 3,addr从0开始64个(即0-63个short类型的数据)放到数据块"db1_AO"中;
(3)配置转发的数据块,这是数据的目标
Stations =
{
--{station=站号(必要), db1=可读写开关量(非必要), db2=只读开关量(非必要), db3=可读写16位数据(非必要), db4=只读16位数据(非必要)},
--例1: {station=1, db1="AXio_DO_2", db2="AXio_DI_4", db3="AXio_AO_n", db4="AXio_AI_4"},
--例2: {station=2, db1="DB_1_100", db2="DB_2_100", db3="DB_3_100", db4="DB_4_100"},
-- 站配置(关联dest库)
{ station = 1, db3 = "db1_AO_dest", db6 = "db1_6_AO_dest" },
{ station = 2, db3 = "db2_AO_dest", db6 = "db2_6_AO_dest" },
{ station = 3, db3 = "db3_AO_dest", db6 = "db3_6_AO_dest" },
{ station = 11, db3 = "db1_6_AO_dest", db4 = "db11_AI_dest" },
{ station = 12, db3 = "db2_6_AO_dest", db4 = "db12_AI_dest" },
{ station = 13, db3 = "db3_6_AO_dest", db4 = "db13_AI_dest" },
},modbus服务器ID = 1,reg = 3的数据块来源是db1_AO_dest,写入的数据块是db1_6_AO_dest;reg = 4的读取、写入的数据块是db1_6_AO_dest;同时配置写入和读取不一样的数据块;
即读取的reg = 3的数据块是db1_AO_dest,写入的数据块是db1_6_AO_dest
modbus服务器ID = 11,reg = 3的数据块是db1_6_AO_dest,写入的数据块是db11_AI_dest;
即读取和写入是相同的数据块,reg = 3的读取、写入数据块是db1_6_AO_dest;reg = 4的读取、写入的数据块是db11_AI_dest;
(4)配置数据块间地址映射和值的偏移计算
--同类型地址映射
addr_Maps = {
--[[
1.控制配置(源数据)(modbus客户端配置)
那么其中的地址也是addr_maps中的源地址,即addr_maps中的左侧的地址
--]]
--[[
2.转发配置(目标地址)(modbusSvr的配置)
那么其中的地址也是addr_maps中的源地址,即addr_maps中的左侧的地址
--]]
--3.偏移不针对bit,仅针对short
--4.偏移,short的范围是两个字节,超出范围数据会丢失,不正确;
--5.不论是转发配置还是控制配置,都需要在addr_maps中配置地址映射,若不映射仅配置相同地址即可,如[13] = 13,
--6.不配做地址映射的地址的数据,在控制配置(源数据)(modbus客户端配置)为modbus客户端的数据;而转发的数据则无数据为0
-- db1_AO
{
enable = true,
db_src = "db1_AO",
db_dest = "db1_AO_dest",
addr_maps = {
[0] = 13, --机组排气压力_Mpa;采集到的值*145.04 后转到 1从站,3功能码,13寄存器地址中
[1] = 11, --排气温度_℃;采集到的值 后转到 1从站,3功能码,11寄存器地址中给
[2] = 14, --油气桶压力_Mpa;采集到的值*145.04 后转到 1从站,3功能码,14寄存器地址中
[3] = 12, --油分后温度_℃;采集到的值 后转到 1从站,3功能码,12寄存器地址中
[4] = 15, --A相绕组温度_℃;采集到的值 后转到 1从站,3功能码,15寄存器地址中
[5] = 16, --B相绕组温度_℃;采集到的值 后转到 1从站,3功能码,16寄存器地址中
[6] = 19, --C相绕组温度_℃;采集到的值 后转到 1从站,3功能码,19寄存器地址中
[7] = 7, --进线电压_V;采集到的值 后转到 1从站,3功能码,7寄存器地址中
[8] = 8, --进线电流_A;采集到的值 后转到 1从站,3功能码,8寄存器地址中
[38] = 1, --机组运行时间H_小时;采集到的值 后转到 1从站,3功能码,1寄存器地址中
[39] = 0, --机组运行时间L_小时;采集到的值 后转到 1从站,3功能码,0寄存器地址中
[40] = 3, --机组加载时间H_小时;采集到的值 后转到 1从站,3功能码,3寄存器地址中
[41] = 2, --机组加载时间L_小时;采集到的值 后转到 1从站,3功能码,2寄存器地址中
},
--[[
2.转发配置(源地址)(modbusSvr的配置)
那么其中的地址也是addr_maps中的目标地址,即addr_maps中的左侧的地址
--]]
forward_offsets = {
-- [0] = { { "*", 1000 }, { "/", 2 } }, --4.偏移,short的范围是两个字节,超出范围数据会丢失,不正确;
[0] = { { "*", 145.04 }, { "/", 100 } },
[2] = { { "*", 145.04 }, { "/", 100 } },
[1] = { { "/", 10 }, { "+", 20 } },
[3] = { { "/", 10 }, { "+", 20 } },
[4] = { { "/", 10 }, { "+", 20 } },
[5] = { { "/", 10 }, { "+", 20 } },
[6] = { { "/", 10 }, { "+", 20 } },
},
},
-- db2_AO
{
enable = true,
db_src = "db2_AO",
db_dest = "db2_AO_dest",
addr_maps = {
[0] = 13, --机组排气压力_Mpa;采集到的值*145.04 后转到 1从站,3功能码,13寄存器地址中
[1] = 11, --排气温度_℃;采集到的值 后转到 1从站,3功能码,11寄存器地址中给
[2] = 14, --油气桶压力_Mpa;采集到的值*145.04 后转到 1从站,3功能码,14寄存器地址中
[3] = 12, --油分后温度_℃;采集到的值 后转到 1从站,3功能码,12寄存器地址中
[4] = 15, --A相绕组温度_℃;采集到的值 后转到 1从站,3功能码,15寄存器地址中
[5] = 16, --B相绕组温度_℃;采集到的值 后转到 1从站,3功能码,16寄存器地址中
[6] = 19, --C相绕组温度_℃;采集到的值 后转到 1从站,3功能码,19寄存器地址中
[7] = 7, --进线电压_V;采集到的值 后转到 1从站,3功能码,7寄存器地址中
[8] = 8, --进线电流_A;采集到的值 后转到 1从站,3功能码,8寄存器地址中
[38] = 1, --机组运行时间H_小时;采集到的值 后转到 1从站,3功能码,1寄存器地址中
[39] = 0, --机组运行时间L_小时;采集到的值 后转到 1从站,3功能码,0寄存器地址中
[40] = 3, --机组加载时间H_小时;采集到的值 后转到 1从站,3功能码,3寄存器地址中
[41] = 2, --机组加载时间L_小时;采集到的值 后转到 1从站,3功能码,2寄存器地址中
},
--[[
2.转发配置(源地址)(modbusSvr的配置)
那么其中的地址也是addr_maps中的目标地址,即addr_maps中的左侧的地址
--]]
forward_offsets = {
-- [0] = { { "*", 1000 }, { "/", 2 } }, --4.偏移,short的范围是两个字节,超出范围数据会丢失,不正确;
[0] = { { "*", 145.04 }, { "/", 100 } },
[2] = { { "*", 145.04 }, { "/", 100 } },
[1] = { { "/", 10 }, { "+", 20 } },
[3] = { { "/", 10 }, { "+", 20 } },
[4] = { { "/", 10 }, { "+", 20 } },
[5] = { { "/", 10 }, { "+", 20 } },
[6] = { { "/", 10 }, { "+", 20 } },
},
},
-- db3_AO
{
enable = true,
db_src = "db3_AO",
db_dest = "db3_AO_dest",
addr_maps = {
[0] = 13, --机组排气压力_Mpa;采集到的值*145.04 后转到 1从站,3功能码,13寄存器地址中
[1] = 11, --排气温度_℃;采集到的值 后转到 1从站,3功能码,11寄存器地址中给
[2] = 14, --油气桶压力_Mpa;采集到的值*145.04 后转到 1从站,3功能码,14寄存器地址中
[3] = 12, --油分后温度_℃;采集到的值 后转到 1从站,3功能码,12寄存器地址中
[4] = 15, --A相绕组温度_℃;采集到的值 后转到 1从站,3功能码,15寄存器地址中
[5] = 16, --B相绕组温度_℃;采集到的值 后转到 1从站,3功能码,16寄存器地址中
[6] = 19, --C相绕组温度_℃;采集到的值 后转到 1从站,3功能码,19寄存器地址中
[7] = 7, --进线电压_V;采集到的值 后转到 1从站,3功能码,7寄存器地址中
[8] = 8, --进线电流_A;采集到的值 后转到 1从站,3功能码,8寄存器地址中
[38] = 1, --机组运行时间H_小时;采集到的值 后转到 1从站,3功能码,1寄存器地址中
[39] = 0, --机组运行时间L_小时;采集到的值 后转到 1从站,3功能码,0寄存器地址中
[40] = 3, --机组加载时间H_小时;采集到的值 后转到 1从站,3功能码,3寄存器地址中
[41] = 2, --机组加载时间L_小时;采集到的值 后转到 1从站,3功能码,2寄存器地址中
},
--[[
2.转发配置(源地址)(modbusSvr的配置)
那么其中的地址也是addr_maps中的目标地址,即addr_maps中的左侧的地址
--]]
forward_offsets = {
-- [0] = { { "*", 1000 }, { "/", 2 } }, --4.偏移,short的范围是两个字节,超出范围数据会丢失,不正确;
[0] = { { "*", 145.04 }, { "/", 100 } },
[2] = { { "*", 145.04 }, { "/", 100 } },
[1] = { { "/", 10 }, { "+", 20 } },
[3] = { { "/", 10 }, { "+", 20 } },
[4] = { { "/", 10 }, { "+", 20 } },
[5] = { { "/", 10 }, { "+", 20 } },
[6] = { { "/", 10 }, { "+", 20 } },
},
},
-- db1_AO
{
enable = true,
db_src = "db1_AO",
db_dest = "db11_AI_dest",
addr_maps = {
[51] = 3, --油分后温度_℃;采集到的值 后转到 12从站,4功能码,3寄存器地址中
[4] = 0, --A相绕组温度_℃;采集到的值 后转到 12从站,4功能码,0寄存器地址中
[5] = 1, --B相绕组温度_℃;采集到的值 后转到 12从站,4功能码,1寄存器地址中
[6] = 2, --C相绕组温度_℃;采集到的值 后转到 12从站,4功能码,2寄存器地址中
},
--[[
2.转发配置(源地址)(modbusSvr的配置)
那么其中的地址也是addr_maps中的目标地址,即addr_maps中的左侧的地址
--]]
forward_offsets = {
[51] = { { "*", 1 } },
[4] = { { "*", 1 } },
[5] = { { "*", 1 } },
[6] = { { "*", 1 } },
},
},
-- db2_AO
{
enable = true,
db_src = "db2_AO",
db_dest = "db12_AI_dest",
addr_maps = {
[51] = 3, --油分后温度_℃;采集到的值 后转到 12从站,4功能码,3寄存器地址中
[4] = 0, --A相绕组温度_℃;采集到的值 后转到 12从站,4功能码,0寄存器地址中
[5] = 1, --B相绕组温度_℃;采集到的值 后转到 12从站,4功能码,1寄存器地址中
[6] = 2, --C相绕组温度_℃;采集到的值 后转到 12从站,4功能码,2寄存器地址中
},
--[[
2.转发配置(源地址)(modbusSvr的配置)
那么其中的地址也是addr_maps中的目标地址,即addr_maps中的左侧的地址
--]]
forward_offsets = {
[51] = { { "*", 1 } },
[4] = { { "*", 1 } },
[5] = { { "*", 1 } },
[6] = { { "*", 1 } },
},
},
-- db3_AO
{
enable = true,
db_src = "db3_AO",
db_dest = "db13_AI_dest",
addr_maps = {
[51] = 3, --油分后温度_℃;采集到的值 后转到 12从站,4功能码,3寄存器地址中
[4] = 0, --A相绕组温度_℃;采集到的值 后转到 12从站,4功能码,0寄存器地址中
[5] = 1, --B相绕组温度_℃;采集到的值 后转到 12从站,4功能码,1寄存器地址中
[6] = 2, --C相绕组温度_℃;采集到的值 后转到 12从站,4功能码,2寄存器地址中
},
--[[
2.转发配置(源地址)(modbusSvr的配置)
那么其中的地址也是addr_maps中的目标地址,即addr_maps中的左侧的地址
--]]
forward_offsets = {
[51] = { { "*", 1 } },
[4] = { { "*", 1 } },
[5] = { { "*", 1 } },
[6] = { { "*", 1 } },
},
},
},
--位址映射
addr_Maps_bit =
{
{
enable = true,
db_src = "db1_AO",
db_dest = "db1_AO_dest",
--short->short
{ --系统运行:采集到的值后转到 1从站,3功能码,23寄存器地址,bit9位
--需考虑src和dest的类型,short(中的bit)-->short(中的bit); short-->bit;
is_offset = false, --值是否反相
src_addr = { addr = 28, dBit = 12 },
dest_addr = { addr = 23, dBit = 9 },
},
{ --故障输出:采集到的值后转到 1从站,3功能码,23寄存器地址,bit13位
src_addr = { addr = 28, dBit = 13 },
dest_addr = { addr = 23, dBit = 13 },
},
{ --加载阀输出:采集到的值后转到 1从站,3功能码,23寄存器地址,bit10位
src_addr = { addr = 28, dBit = 15 },
dest_addr = { addr = 23, dBit = 10 },
},
},
{
enable = true,
db_src = "db2_AO",
db_dest = "db2_AO_dest",
--short->short
{ --系统运行:采集到的值后转到 1从站,3功能码,23寄存器地址,bit9位
--需考虑src和dest的类型,short(中的bit)-->short(中的bit); short-->bit;
is_offset = false, --值是否反相
src_addr = { addr = 28, dBit = 12 },
dest_addr = { addr = 23, dBit = 9 },
},
{ --故障输出:采集到的值后转到 1从站,3功能码,23寄存器地址,bit13位
src_addr = { addr = 28, dBit = 13 },
dest_addr = { addr = 23, dBit = 13 },
},
{ --加载阀输出:采集到的值后转到 1从站,3功能码,23寄存器地址,bit10位
src_addr = { addr = 28, dBit = 15 },
dest_addr = { addr = 23, dBit = 10 },
},
},
{
enable = true,
db_src = "db3_AO",
db_dest = "db3_AO_dest",
--short->short
{ --系统运行:采集到的值后转到 1从站,3功能码,23寄存器地址,bit9位
--需考虑src和dest的类型,short(中的bit)-->short(中的bit); short-->bit;
is_offset = false, --值是否反相
src_addr = { addr = 28, dBit = 12 },
dest_addr = { addr = 23, dBit = 9 },
},
{ --故障输出:采集到的值后转到 1从站,3功能码,23寄存器地址,bit13位
src_addr = { addr = 28, dBit = 13 },
dest_addr = { addr = 23, dBit = 13 },
},
{ --加载阀输出:采集到的值后转到 1从站,3功能码,23寄存器地址,bit10位
src_addr = { addr = 28, dBit = 15 },
dest_addr = { addr = 23, dBit = 10 },
},
},
},
(4.1) 普通地址映射(addr_Maps)
(同类型数据块间的映射,即都是bit类型的数据块则都以bit类型进行地址转换映射、都是short则都以short类型进行地址间映射)
用于配置两个数据块间的寄存器地址映射关系,支持对指定地址的数据进行偏移计算(如乘除、加减运算)。
| 字段 | 含义 | 详细解释 | 示例 | 示例含义 | 可选项 |
|---|---|---|---|---|---|
| enable | 映射启用开关 | 控制该组地址映射是否生效 | true | 启用当前源 - 目标数据块的地址映射 | true(启用)、false(禁用) |
| db_src | 源数据块名称 | 映射数据的来源数据块,需与 DB 配置中的 db_name 一致 | “db1_AO” | 从 “db1_AO” 数据块读取源数据 | DB 配置中已定义的 db_name 值 |
| db_dest | 目标数据块名称 | 映射数据的目标存储数据块,需与 DB 配置中的 db_name 一致 | “db1_AO_dest” | 映射后的数据存储到 “db1_AO_dest” 数据块 | DB 配置中已定义的 db_name 值 |
| addr_maps | 地址映射关系 | 键值对格式,键为源数据块地址,值为目标数据块地址,实现地址一对一映射 | [0] = 13 | 源数据块地址 0 的数据,映射到目标数据块地址 13 | 键:源数据块有效地址(0-count-1);值:目标数据块有效地址(0-count-1) |
| forward_offsets | 数值偏移计算 | 针对指定目标地址配置数值运算规则,支持多步运算(按数组顺序执行) | [0] = { { “*”, 145.04 }, { “/“, 100 } } | 源数据块("db1_AO")的地址0的数据经过,先乘 145.04 再除以 100 后映射到目标数据块("db1_AO_dest")的13地址 |
运算符号:”*”(乘)、”/“(除)、”+”(加)、”-“(减);运算值:数字(整数 / 小数) |
配置说明:
偏移计算仅支持 short 及以上类型数据,不支持 bit 位;
多步运算按数组顺序执行,如[0] = { { “*”, 145.04 }, { “/“, 100 } }表示 “原值 × 145.04 → 结果 ÷ 100”;
未配置forward_offsets的地址,数据直接映射(无偏移计算);
未配置addr_maps的地址,转发时默认值为 0
(4.2) 位地址映射[addr_Maps_bit]
用于配置数据块中单个 bit 位的映射关系,支持 不同数据块间的 bit 位映射,可配置值反相。
| 字段 | 含义 | 详细解释 | 示例 | 示例含义 | 可选项 |
|---|---|---|---|---|---|
| enable | 映射启用开关 | 控制该组位地址映射是否生效 | true | 启用当前源 - 目标数据块的位映射 | true(启用)、false(禁用) |
| db_src | 源数据块名称 | bit 位数据的来源数据块,需与 DB 配置中的 db_name 一致 | “db1_AO” | 从 “db1_AO” 数据块的指定 bit 位读取数据 | DB 配置中已定义的 db_name 值(short 类型优先) |
| db_dest | 目标数据块名称 | bit 位数据的目标存储数据块,需与 DB 配置中的 db_name 一致 | “db1_AO_dest” | 映射后的 bit 位数据存储到 “db1_AO_dest” | DB 配置中已定义的 db_name 值(short 类型优先) |
| is_offset | 值反相开关 | 控制映射后的 bit 位值是否反相(0→1、1→0),默认不反相 | false | 映射后 bit 位值保持不变 | true(反相)、false(不反相) |
| src_addr | 源 bit 位地址 | 包含源数据块的寄存器地址(addr)和 bit 位编号(dBit) | { addr = 28, dBit = 12 } | 源数据块地址 28 的第 12 位(bit12) | addr:源数据块有效地址;dBit:0-15(short 类型 bit 位范围) |
| dest_addr | 目标 bit 位地址 | 包含目标数据块的寄存器地址(addr)和 bit 位编号(dBit) | { addr = 23, dBit = 9 } | 目标数据块地址 23 的第 9 位(bit9) | addr:目标数据块有效地址;dBit:0-15(short 类型 bit 位范围) |
2.控制节点配置(control_nodes)
核心功能:当源数据块中指定地址(src_addr)的值发生改变时,触发控制逻辑,按配置规则向目标设备/地址写入控制指令。
(1)配置层级说明
控制节点配置分为 顶层配置(control_nodes数组元素)、地址级配置(addrs数组元素)、目标控制指令配置(dest_nodes数组元素) 三层,每层字段含义、示例及可选项如下:
(2)顶层配置字段(control_nodes数组元素)
| 字段 | 含义 | 详细解释 | 示例 | 示例含义 | 可选项 |
|---|---|---|---|---|---|
| enable | 控制节点启用开关 | 控制当前控制节点是否生效,true则源地址值变化时触发控制,false则禁用该节点 | true | 启用“Control_Start_Stop_485_1_ID_1”控制节点 | true(启用)、false(禁用) |
| db_src | 源数据块名称 | 触发控制的源数据块,需与DB配置中的db_name一致,监听该数据块地址值变化 | “db1_6_AO_dest” | 监听“db1_6_AO_dest”数据块的地址值变化,作为控制触发条件 | DB配置中已定义的db_name值(如xxx_dest类数据块) |
| name | 控制节点名称 | 控制节点的唯一标识,建议包含链路、设备ID信息,便于区分不同控制逻辑 | “Control_Start_Stop_485_1_ID_1” | 标识该节点用于“485-1链路、ID=1设备”的启停控制 | 自定义字符串(唯一不重复) |
| addrs | 触发地址配置数组 | 存储单个或多个源地址触发规则,每个元素对应一条“地址值变化→控制触发”逻辑 | 见下文地址级配置示例 | 包含1条源地址(addr=0)的触发规则 | 数组类型,元素为地址级配置对象 |
(3)地址级配置字段(addrs数组元素)
| 字段 | 含义 | 详细解释 | 示例 | 示例含义 | 可选项 |
|---|---|---|---|---|---|
| addr_type | 源地址数据类型 | 指定源数据块中触发地址的数据类型,默认与db_src的数据类型(如short)一致 | “short” | 源触发地址的数据类型为16位短整型 | “short”(16位)、”ushort”(无符号16位)、”int”(32位) |
| src_addr | 源触发地址 | 监听值变化的源数据块地址,支持配置bit位(dBit可选,默认dBit=0) | { addr = 0 } | 监听源数据块的地址0(默认bit0),该地址值变化即触发控制 | addr:源数据块有效地址(0~count-1);dBit:可选(0-15,默认0) |
| src_val | 触发值过滤(可选) | 仅当源地址值等于该数组中的值时才触发控制,不配置则“值改变即触发” | { 1, 2 } | 仅当源地址值为1(启动)或2(停止)时,触发控制指令 | 数组类型(整数/小数),不配置则无过滤条件,值变化即触发 |
| dest_nodes | 目标控制指令数组 | 源地址触发后需执行的控制指令集合,支持向多个目标设备/地址写入数据 | 见下文目标控制指令示例 | 触发后向1个目标设备写入启停控制指令 | 数组类型,元素为目标控制指令对象 |
(4)目标控制指令字段(dest_nodes数组元素)
| 字段 | 含义 | 详细解释 | 示例 | 示例含义 | 可选项 |
|---|---|---|---|---|---|
| ID | 目标设备ID | modbus目标设备的从站编号,用于定位待控制的设备 | 1 | 控制modbus从站编号为1的设备 | 1-247(modbus协议标准从站地址范围) |
| reg | 目标功能码 | modbus写入功能码,指定控制指令的写入类型 | “6” | 使用modbus功能码6(写单个保持寄存器)写入控制指令 | “6”(写单个保持寄存器)、”16”(写多个保持寄存器) |
| addr | 目标寄存器地址 | 控制指令写入的目标设备寄存器地址 | 0 | 将控制指令写入目标设备的地址0寄存器 | 非负整数(需与目标设备控制寄存器地址一致) |
| dtype | 目标数据类型 | 指定写入目标寄存器的数据类型 | “ushort” | 写入目标寄存器的数据类型为无符号16位整型 | “short”(16位)、”ushort”(无符号16位)、”int”(32位) |
| method | 通信协议方法 | 指定控制指令的传输协议,当前仅支持modbus协议 | “modbus” | 通过modbus协议发送控制指令 | “modbus”(默认),后续可扩展其他协议 |
| obj | modbus对象 | 指定控制指令的modbus客户端 | 1 | 通过第一个modbus对象控制 | 正整数 |
(5)配置代码示例
--控制节点:当src_addr的值改变时,按控制节点的规则进行控制
control_nodes =
{
--modbusSvr_485-1_ID-1
{
enable = true,
db_src = "db1_6_AO_dest",
name = "Control_Start_Stop_485_1_ID_1",
addrs =
{
{
addr_type = "short",
src_addr = { addr = 0 }, --dBit可以不存在,默认为0
-- src_val = { 1, 2 }, --可以不存在,拿到多少写入多少
dest_nodes =
{
--控制结点的值偏移,可以不偏移也可以偏移,从src地址拿到的值运算后写入目标地址
{ ID = 1, reg = "6", addr = 0, dtype = "ushort", dStyle = { "L1_6_30" }, method = "modbus", obj = 1 },
}
},
}
},
--modbusSvr_485-1_ID-2
{
enable = true,
db_src = "db2_6_AO_dest",
name = "Control_Start_Stop_485_1_ID_2",
addrs =
{
{
addr_type = "short",
src_addr = { addr = 0 }, --dBit可以不存在,默认为0
-- src_val = { 1, 2 }, --可以不存在,拿到多少写入多少
dest_nodes =
{
--控制结点的值偏移,可以不偏移也可以偏移,从src地址拿到的值运算后写入目标地址
{ ID = 2, reg = "6", addr = 0, dtype = "ushort", dStyle = { "L1_6_30" }, method = "modbus", obj = 1 },
}
},
}
},
--modbusSvr_485-1_ID-3
{
enable = true,
db_src = "db3_6_AO_dest",
name = "Control_Start_Stop_485_1_ID_3",
addrs =
{
{
addr_type = "short",
src_addr = { addr = 0 }, --dBit可以不存在,默认为0
-- src_val = { 1, 2 }, --可以不存在,拿到多少写入多少
dest_nodes =
{
--控制结点的值偏移,可以不偏移也可以偏移,从src地址拿到的值运算后写入目标地址
{ ID = 3, reg = "6", addr = 0, dtype = "ushort", dStyle = { "L1_6_30" }, method = "modbus", obj = 1 },
}
},
}
},
--modbusSvr_485-2_ID-1
{
enable = true,
db_src = "db1_6_AO_dest",
name = "Control_Start_Stop_485_2_ID_1",
addrs =
{
{
addr_type = "short",
src_addr = { addr = 0 }, --dBit可以不存在,默认为0
-- src_val = { 1, 2 }, --可以不存在,拿到多少写入多少
dest_nodes =
{
--控制结点的值偏移,可以不偏移也可以偏移,从src地址拿到的值运算后写入目标地址
{ ID = 1, reg = "6", addr = 0, dtype = "ushort", dStyle = { "L1_6_30" }, method = "modbus", obj = 1 },
}
},
}
},
--modbusSvr_485-2_ID-2
{
enable = true,
db_src = "db2_6_AO_dest",
name = "Control_Start_Stop_485_2_ID_2",
addrs =
{
{
addr_type = "short",
src_addr = { addr = 0 }, --dBit可以不存在,默认为0
-- src_val = { 1, 2 }, --可以不存在,拿到多少写入多少
dest_nodes =
{
--控制结点的值偏移,可以不偏移也可以偏移,从src地址拿到的值运算后写入目标地址
{ ID = 2, reg = "6", addr = 0, dtype = "ushort", dStyle = { "L1_6_30" }, method = "modbus", obj = 1 },
}
},
}
},
--modbusSvr_485-2_ID-3
{
enable = true,
db_src = "db3_6_AO_dest",
name = "Control_Start_Stop_485_2_ID_3",
addrs =
{
{
addr_type = "short",
src_addr = { addr = 0 }, --dBit可以不存在,默认为0
-- src_val = { 1, 2 }, --可以不存在,拿到多少写入多少
dest_nodes =
{
--控制结点的值偏移,可以不偏移也可以偏移,从src地址拿到的值运算后写入目标地址
{ ID = 3, reg = "6", addr = 0, dtype = "ushort", dStyle = { "L1_6_30" }, method = "modbus", obj = 1 },
}
},
}
},
}