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 },
                }
            },
        }
    },
}
文档更新时间: 2025-12-01 15:48   作者:CGL