Skip to content

1. 简介

安科瑞 DTSD1352 是一款 三相导轨式多功能电能表,采用 RS-485 接口输出 Modbus RTU 协议数据,可采集三相电压、电流、有功/无功/视在功率、功率因数、频率、分相电能、电压/电流不平衡度、零序电流及 DIDO 状态共 37 个电力参数。有功电能计量精度达 0.5S 级,满足贸易结算与工业计量双重要求。

本方案以 安科瑞 DTSD1352 为接入对象,通过 KC11 LoRaWAN 采集器 连接仪表的 RS-485 接口,由 KC11 内置 EdgeBus 脚本完成 Modbus RTU 采集、数据封装与 LoRaWAN 上报,实现将配电柜三相电力数据无线接入 ThinkLink 平台。

本方案业务代码为 23112,模板名称为 DTSD1352


2. 产品特点

  • 支持 DTSD1352 三相导轨式多功能电能表 数据采集
  • 支持 RS-485 / Modbus RTU 接口接入
  • 通过 KC11 实现电能表数据 LoRaWAN 无线化接入,无需改造配电柜走线
  • 支持 37 个电力参数 全量采集:电压、电流、功率、功率因数、电能、频率、不平衡度、DIDO 状态
  • 有功电能精度 0.5S 级(IEC 62053-22),无功 2 级,满足贸易结算需求
  • 导轨式安装(7 模位 DIN),体积小巧(126×91×74mm),直接嵌入标准配电箱
  • 支持 CT/PT 变比远程写入(透传 Modbus FC=10),适应高压/大电流互感器接线
  • 支持 Modbus 从站地址与采集/上传周期 远程配置,适合 RS-485 总线多表挂接
  • 支持 Class C 常在线,采集周期最短 1 秒
  • 内置失压/过压/相序异常报警,DIDO 状态寄存器远程可读

3. 适用范围

本方案适用于需要将 DTSD1352 接入 ThinkLink / LoRaWAN 系统的场景,例如:

  • 工业厂房配电柜三相用电监测与分区域能耗统计
  • 商业建筑配电间远程抄表,替代人工巡检
  • 企业能耗管理与电能质量分析(不平衡度、功率因数、零序电流监测)
  • 多楼层/多回路计量,RS-485 总线串联多台电表统一接入
  • 含分布式光伏的双向用电场景(正向/反向有功无功四象限电能)
  • 存量电力仪表无线化改造,不改动原有接线
  • PLC / SCADA / 能源管理系统 MQTT 数据对接

4. 采集器信息

4.1 硬件信息

项目内容
采集设备型号KC11
通信接口RS-485
供电方式AC 85–270V 市电供电(导轨安装)
通信方式LoRaWAN Class C(常在线)
EdgeBus 支持支持
适配协议Modbus RTU
业务代码23112
模板名称DTSD1352

4.2 接线信息

电源与通讯接口

接口说明
电源输入KC11 采用 AC 85–270V 市电供电,可从配电柜 220V 回路引出
RS-485 A接 DTSD1352 Pin 7(RS485 A+)
RS-485 B接 DTSD1352 Pin 8(RS485 B-)
终端电阻KC11 已内置 120Ω,总线末端无需外接;多表串联时中间节点不接终端电阻

传感器侧接口

DTSD1352 背面端子定义(RS-485 相关):

DTSD1352 端子(背面)       KC11 DTU 端子
───────────────────────     ─────────────────
Pin 7 (RS485 A+)      ───→  RS485 A
Pin 8 (RS485 B-)      ───→  RS485 B
电压测量端 (L1/L2/L3/N)  ───  接配电回路(电表自取电,与 KC11 供电相互独立)

注意:DTSD1352 从被测量电压(L1/N 或 L1/L2/L3)自取电,KC11 通过独立的 AC 市电供电,两者供电回路相互独立。RS-485 总线上多台电表串联时,每台需拨号设置不同从站地址(1–247)。


5. 数据采集

本方案通过 Modbus RTU 协议(FC=03,读保持寄存器)读取 DTSD1352 以下寄存器组:

采集组起始地址读取内容
G10x000AH正向有功总电能(ep_fwd)
G20x0014H反向有功总电能(ep_rev)
G30x0028H正向无功总电能(eq_fwd)
G40x0032H反向无功总电能(eq_rev)
G50x0061HA/B/C 相电压 + A/B/C 相电流(6 项)
G60x0077H频率 + AB/CB/AC 线电压(4 项)
G70x0087HA/B/C 相正向有功电能(ep_a/ep_b/ep_c)
G8a0x008FHDIDO/失压状态(dido_status)
G8b0x0092H零序电流 + 电压不平衡度 + 电流不平衡度
G90x0164H三相有功/无功/视在功率 + 功率因数(28 个寄存器,触发上行)

CT/PT 变比(0x008DH/0x008EH)通过 Modbus FC=10(写多个寄存器)透传写入,不做周期采集。

5.1 寄存器定义

电能寄存器(uint32BE,× 0.01,kWh / kVarh)

数据项地址字节数数据类型系数单位
正向有功总电能0x000AH4uint32BE0.01kWh
反向有功总电能0x0014H4uint32BE0.01kWh
正向无功总电能0x0028H4uint32BE0.01kVarh
反向无功总电能0x0032H4uint32BE0.01kVarh
A相正向有功电能0x0087H4uint32BE0.01kWh
B相正向有功电能0x0089H4uint32BE0.01kWh
C相正向有功电能0x008BH4uint32BE0.01kWh

电压/电流/频率寄存器(uint16BE)

数据项地址字节数数据类型系数单位
A相电压0x0061H2uint16BE0.1V
B相电压0x0062H2uint16BE0.1V
C相电压0x0063H2uint16BE0.1V
A相电流0x0064H2uint16BE0.01A
B相电流0x0065H2uint16BE0.01A
C相电流0x0066H2uint16BE0.01A
频率0x0077H2uint16BE0.01Hz
AB线电压0x0078H2uint16BE0.1V
CB线电压0x0079H2uint16BE0.1V
AC线电压0x007AH2uint16BE0.1V

功率寄存器(int32BE 补码,× 0.001,保留 3 位小数)

数据项地址字节数数据类型系数单位
A相有功功率0x0164H4int32BE0.001kW
B相有功功率0x0166H4int32BE0.001kW
C相有功功率0x0168H4int32BE0.001kW
总有功功率0x016AH4int32BE0.001kW
A相无功功率0x016CH4int32BE0.001kVar
B相无功功率0x016EH4int32BE0.001kVar
C相无功功率0x0170H4int32BE0.001kVar
总无功功率0x0172H4int32BE0.001kVar
A相视在功率0x0174H4int32BE0.001kVA
B相视在功率0x0176H4int32BE0.001kVA
C相视在功率0x0178H4int32BE0.001kVA
总视在功率0x017AH4int32BE0.001kVA
A相功率因数0x017CH2int16BE0.001
B相功率因数0x017DH2int16BE0.001
C相功率因数0x017EH2int16BE0.001
总功率因数0x017FH2int16BE0.001

状态/诊断寄存器

数据项地址字节数数据类型系数单位
DIDO/失压状态0x008FH2uint16BE
零序电流0x0092H2uint16BE0.01A
电压不平衡度0x0093H2uint16BE0.1%
电流不平衡度0x0094H2uint16BE0.1%

配置寄存器(R/W,通过 RPC 写入)

数据项地址字节数数据类型说明
电压变比 PT0x008DH2uint16BE1–9999,默认 1
电流变比 CT0x008EH2uint16BE1–9999,默认 1

5.2 状态位定义(DIDO/失压状态寄存器 0x008FH)

Bit含义
Bit0A相过压
Bit1B相过压
Bit2C相过压
Bit3A相失压
Bit4B相失压
Bit5C相失压
Bit6A相逆向(相序异常)
Bit7B相逆向
Bit8C相逆向
Bit9DI 状态
Bit10DO 状态

6. EdgeBus 模型

6.1 EB 配置参数

参数
上报端口(port)22
帧版本标识(version)0x87
数据类型标识(dataType)0x31
上传/采集周期参数槽(upPeriodIndex)70
串口波特率9600 bps
数据位8
停止位1
校验位None
供电模式AC 市电(Battery=false,Class C)
业务代码(BzType)23112
业务版本(BzVersion)1
固件版本(SwVersion)31

6.2 EB 代码

typescript
import { Buffer } from "buffer";
import { buildOtaFile } from "@EBSDK/run";
import { EBModel } from "@EBSDK/EBCompiler/EBModel/EBModel";
import { EventInfoItem } from "@EBSDK/EBCompiler/plugins/EBHelper";
import type { UserConfUPItem } from "@EBSDK/EBCompiler/plugins/EBHelper";
import { CheckbitEnum, getOtaConfig } from "@EBSDK/otaConfig";

const eventInfo: UserConfUPItem[] = [
    {
        name: "dtsd1352",
        port: 22,
        version: "0x87",
        dataType: "0x31",
        upPeriodIndex: 70,
        quInfo: [
            // G1: 正向有功总电能 ep_fwd (0x000A, uint32BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x000A", end: "0x000B" }
                ]
            },
            // G2: 反向有功总电能 ep_rev (0x0014, uint32BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x0014", end: "0x0015" }
                ]
            },
            // G3: 正向无功总电能 eq_fwd (0x0028, uint32BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x0028", end: "0x0029" }
                ]
            },
            // G4: 反向无功总电能 eq_rev (0x0032, uint32BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x0032", end: "0x0033" }
                ]
            },
            // G5: 三相电压+电流 (0x0061-0x0066, 6×uint16BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x0061", end: "0x0061" }, // ua
                    { start: "0x0062", end: "0x0062" }, // ub
                    { start: "0x0063", end: "0x0063" }, // uc
                    { start: "0x0064", end: "0x0064" }, // ia
                    { start: "0x0065", end: "0x0065" }, // ib
                    { start: "0x0066", end: "0x0066" }  // ic
                ]
            },
            // G6: 频率+线电压 (0x0077-0x007A, 4×uint16BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x0077", end: "0x0077" }, // freq
                    { start: "0x0078", end: "0x0078" }, // uab
                    { start: "0x0079", end: "0x0079" }, // ucb
                    { start: "0x007A", end: "0x007A" }  // uac
                ]
            },
            // G7: 分相电能 (0x0087-0x008C, 3×uint32BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x0087", end: "0x0088" }, // ep_a (uint32BE)
                    { start: "0x0089", end: "0x008A" }, // ep_b (uint32BE)
                    { start: "0x008B", end: "0x008C" }  // ep_c (uint32BE)
                ]
            },
            // G8a: 失压/DIDO状态 (0x008F, uint16BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x008F", end: "0x008F" }  // dido_status
                ]
            },
            // G8b: 零序电流+不平衡度 (0x0092-0x0094, 3×uint16BE)
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                listVal: [
                    { start: "0x0092", end: "0x0092" }, // i0
                    { start: "0x0093", end: "0x0093" }, // unbl_u
                    { start: "0x0094", end: "0x0094" }  // unbl_i
                ]
            },
            // G9: 功率+功率因数 (0x0164-0x017F, 12×int32BE + 4×int16BE), 触发上行
            {
                protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
                indexAPP: 150, indexCMD: 0, copySize: 1,
                isLast: true,
                listVal: [
                    { start: "0x0164", end: "0x0165" }, // pa (int32BE)
                    { start: "0x0166", end: "0x0167" }, // pb (int32BE)
                    { start: "0x0168", end: "0x0169" }, // pc (int32BE)
                    { start: "0x016A", end: "0x016B" }, // pt (int32BE)
                    { start: "0x016C", end: "0x016D" }, // qa (int32BE)
                    { start: "0x016E", end: "0x016F" }, // qb (int32BE)
                    { start: "0x0170", end: "0x0171" }, // qc (int32BE)
                    { start: "0x0172", end: "0x0173" }, // qt (int32BE)
                    { start: "0x0174", end: "0x0175" }, // sa (int32BE)
                    { start: "0x0176", end: "0x0177" }, // sb (int32BE)
                    { start: "0x0178", end: "0x0179" }, // sc (int32BE)
                    { start: "0x017A", end: "0x017B" }, // st (int32BE)
                    { start: "0x017C", end: "0x017C" }, // pfa (int16BE)
                    { start: "0x017D", end: "0x017D" }, // pfb (int16BE)
                    { start: "0x017E", end: "0x017E" }, // pfc (int16BE)
                    { start: "0x017F", end: "0x017F" }  // pft (int16BE)
                ]
            }
        ]
    }
]

let otaConfig = getOtaConfig({
    BaudRate: 9600,
    StopBits: 1,
    DataBits: 8,
    Checkbit: CheckbitEnum.NONE,
    Battery: false,
    ConfirmDuty: 60,
    BzType: 23112,
    BzVersion: 1
})

const MODBUS_TT = (ebModel: EBModel) => {
    for (let i = 0; i < eventInfo.length; i++) {
        let event = new EventInfoItem(eventInfo[i]);
        event.upEventSetup()
        event.eventInstall()
    }
    return JSON.stringify(ebModel, null, 2)
}

buildOtaFile(__filename, otaConfig, MODBUS_TT)

6.3 说明

EB 代码包含 9 个 Modbus 查询事件(G1–G9),采集完成后由 G9(isLast: true)触发一次上行:

  • G1–G4:分散地址段的电能寄存器,各独立读取 2 个寄存器(uint32BE,4 字节/组)
  • G5:三相电压(0x0061–0x0063)+ 三相电流(0x0064–0x0066),共 6 个 uint16BE 寄存器
  • G6:频率(0x0077)+ AB/CB/AC 线电压(0x0078–0x007A),共 4 个 uint16BE 寄存器
  • G7:A/B/C 相正向有功电能(0x0087/0x0089/0x008B),各 2 个寄存器(uint32BE)
  • G8a:DIDO/失压状态(0x008F),1 个 uint16BE 寄存器
  • G8b:零序电流(0x0092)+ 电压不平衡度(0x0093)+ 电流不平衡度(0x0094),3 个 uint16BE
  • G9:功率组,连续读取 0x0164–0x017F 共 28 个寄存器(12×int32BE + 4×int16BE),触发上行

上行帧结构(dataLen=118 字节):

字节偏移内容
0版本标识(0x87)
1数据类型(0x31)
2状态字节(status)
3保留
4电池电压
5保留
6–9ep_fwd(uint32BE)
10–13ep_rev(uint32BE)
14–17eq_fwd(uint32BE)
18–21eq_rev(uint32BE)
22–23ua(uint16BE)
24–25ub(uint16BE)
26–27uc(uint16BE)
28–29ia(uint16BE)
30–31ib(uint16BE)
32–33ic(uint16BE)
34–35freq(uint16BE)
36–37uab(uint16BE)
38–39ucb(uint16BE)
40–41uac(uint16BE)
42–45ep_a(uint32BE)
46–49ep_b(uint32BE)
50–53ep_c(uint32BE)
54–55dido_status(uint16BE)
56–57i0(uint16BE)
58–59unbl_u(uint16BE)
60–61unbl_i(uint16BE)
62–65pa(int32BE)
66–69pb(int32BE)
70–73pc(int32BE)
74–77pt(int32BE)
78–81qa(int32BE)
82–85qb(int32BE)
86–89qc(int32BE)
90–93qt(int32BE)
94–97sa(int32BE)
98–101sb(int32BE)
102–105sc(int32BE)
106–109st(int32BE)
110–111pfa(int16BE)
112–113pfb(int16BE)
114–115pfc(int16BE)
116–117pft(int16BE)

upPeriodIndex = periodIndex = 70:COV 关闭,采集周期与上传周期共用同一参数槽(app_70),默认值 60 秒。Modbus 从站地址通过 app_150 动态注入查询帧(indexAPP=150, indexCMD=0, copySize=1)。


7. 物模型

7.1 物模型基本信息

类型名称id_name
数据物模型[DTSD1352]dtsd1352_23112
参数物模型[DTSD1352-PARA]dtsd1352_para_23112

7.2 上行帧结构(frameInfo)

javascript
let frameInfo = {
    port: 22,
    dataLen: 118,
    rssi: true,
    battery: 4,
    tagList: [
        { index: 0, tag: 0x87 },
        { index: 1, tag: 0x31 }
    ]
};

7.3 物模型脚本

数据物模型(dtsd1352_23112)

javascript
import {BufferTKL, PayloadParser, Utils} from '#tklHelper';

function payload_parser({device, msg, thingModelId, noticeAttrs}) {
    let port = msg?.userdata?.port || null;
    if (port !== 22) return null;
    let frameInfo = {
        port: 22,
        dataLen: 118,
        rssi: true,
        battery: 4,
        tagList: [
            { index: 0, tag: 0x87 },
            { index: 1, tag: 0x31 }
        ]
    };
    let appInfo = [
        { name: "正向有功总电能", field_name: "ep_fwd",      unit: "kWh",   index: 6,   type: "uint32BE", coefficient: 0.01,  decimal: 2 },
        { name: "反向有功总电能", field_name: "ep_rev",      unit: "kWh",   index: 10,  type: "uint32BE", coefficient: 0.01,  decimal: 2 },
        { name: "正向无功总电能", field_name: "eq_fwd",      unit: "kVarh", index: 14,  type: "uint32BE", coefficient: 0.01,  decimal: 2 },
        { name: "反向无功总电能", field_name: "eq_rev",      unit: "kVarh", index: 18,  type: "uint32BE", coefficient: 0.01,  decimal: 2 },
        { name: "A相电压",       field_name: "ua",          unit: "V",     index: 22,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "B相电压",       field_name: "ub",          unit: "V",     index: 24,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "C相电压",       field_name: "uc",          unit: "V",     index: 26,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "A相电流",       field_name: "ia",          unit: "A",     index: 28,  type: "uint16BE", coefficient: 0.01,  decimal: 2 },
        { name: "B相电流",       field_name: "ib",          unit: "A",     index: 30,  type: "uint16BE", coefficient: 0.01,  decimal: 2 },
        { name: "C相电流",       field_name: "ic",          unit: "A",     index: 32,  type: "uint16BE", coefficient: 0.01,  decimal: 2 },
        { name: "频率",          field_name: "freq",        unit: "Hz",    index: 34,  type: "uint16BE", coefficient: 0.01,  decimal: 2 },
        { name: "AB线电压",      field_name: "uab",         unit: "V",     index: 36,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "CB线电压",      field_name: "ucb",         unit: "V",     index: 38,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "AC线电压",      field_name: "uac",         unit: "V",     index: 40,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "A相正向有功电能",field_name: "ep_a",       unit: "kWh",   index: 42,  type: "uint32BE", coefficient: 0.01,  decimal: 2 },
        { name: "B相正向有功电能",field_name: "ep_b",       unit: "kWh",   index: 46,  type: "uint32BE", coefficient: 0.01,  decimal: 2 },
        { name: "C相正向有功电能",field_name: "ep_c",       unit: "kWh",   index: 50,  type: "uint32BE", coefficient: 0.01,  decimal: 2 },
        { name: "失压/DIDO状态", field_name: "dido_status", unit: "",      index: 54,  type: "uint16BE" },
        { name: "零序电流",      field_name: "i0",          unit: "A",     index: 56,  type: "uint16BE", coefficient: 0.01,  decimal: 2 },
        { name: "电压不平衡度",  field_name: "unbl_u",      unit: "%",     index: 58,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "电流不平衡度",  field_name: "unbl_i",      unit: "%",     index: 60,  type: "uint16BE", coefficient: 0.1,   decimal: 1 },
        { name: "A相有功功率",   field_name: "pa",          unit: "kW",    index: 62,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "B相有功功率",   field_name: "pb",          unit: "kW",    index: 66,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "C相有功功率",   field_name: "pc",          unit: "kW",    index: 70,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "总有功功率",    field_name: "pt",          unit: "kW",    index: 74,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "A相无功功率",   field_name: "qa",          unit: "kVar",  index: 78,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "B相无功功率",   field_name: "qb",          unit: "kVar",  index: 82,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "C相无功功率",   field_name: "qc",          unit: "kVar",  index: 86,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "总无功功率",    field_name: "qt",          unit: "kVar",  index: 90,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "A相视在功率",   field_name: "sa",          unit: "kVA",   index: 94,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "B相视在功率",   field_name: "sb",          unit: "kVA",   index: 98,  type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "C相视在功率",   field_name: "sc",          unit: "kVA",   index: 102, type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "总视在功率",    field_name: "st",          unit: "kVA",   index: 106, type: "int32BE",  coefficient: 0.001, decimal: 3 },
        { name: "A相功率因数",   field_name: "pfa",         unit: "",      index: 110, type: "int16BE",  coefficient: 0.001, decimal: 3 },
        { name: "B相功率因数",   field_name: "pfb",         unit: "",      index: 112, type: "int16BE",  coefficient: 0.001, decimal: 3 },
        { name: "C相功率因数",   field_name: "pfc",         unit: "",      index: 114, type: "int16BE",  coefficient: 0.001, decimal: 3 },
        { name: "总功率因数",    field_name: "pft",         unit: "",      index: 116, type: "int16BE",  coefficient: 0.001, decimal: 3 },
    ];
    let payParser = new PayloadParser({ device, msg, frameInfo, appInfo });
    let tdata = payParser.telemetry();
    if ((tdata?.status & 0x02) === 0x02) {
        const status = tdata.status;
        tdata = { ...(device.telemetry_data?.[thingModelId] ?? {}) };
        tdata.status = status;
    }
    tdata._modelName = "dtsd1352_23112";
    return { telemetry_data: tdata, server_attrs: null, shared_attrs: null };
}

参数物模型(dtsd1352_para_23112)

javascript
import {BufferTKL, PayloadParser, Utils} from '#tklHelper';

function payload_parser({device, msg, thingModelId, noticeAttrs}) {
    let port = msg?.userdata?.port || null;
    const rpcName = "dtsd1352_set_23112";
    let paraDef = {
        app_20:  { name: "TimeOffset",  field_name: "TimeOffset",  unit: "",   index: 20, type: "uint32le" },
        app_38:  { name: "pwron_delay", field_name: "pwron_delay", unit: "ms", index: 38, type: "uint16le" },
        app_70:  { name: "period_up",   field_name: "period_up",   unit: "s",  type: "uint32le" },
        app_150: { name: "addr_modbus", field_name: "addr_modbus", unit: "",   type: "uint8" }
    };
    if (port !== 214) {
        let checkData = Utils.paraCheck(rpcName, device.server_attrs, device.shared_attrs);
        return {
            server_attrs: checkData.sdata,
            actions: checkData.actions
        };
    }
    let pdata = (new PayloadParser({ device, msg, paraInfo: paraDef })).paras();
    let checkData = Utils.paraCheck(rpcName, device.server_attrs, pdata);
    return {
        telemetry_data: pdata,
        server_attrs: checkData.sdata,
        shared_attrs: pdata,
        actions: checkData.actions
    };
}

8. 第三方平台数据订阅

8.1 MQTT Topic

/v32/{组织账号}/tkl/up/telemetry/{eui}

8.2 上报示例数据

json
{
    "eui": "aabbccddeeff0011",
    "active_time": "2026-05-24T02:00:00.000Z",
    "thingModelId": "111065443795365888",
    "thingModelIdName": "dtsd1352_23112",
    "telemetry_data": {
        "snr": 9.5,
        "rssi": -65,
        "battery": 3.6,
        "status": 0,
        "ep_fwd": 12345.67,
        "ep_rev": 0.00,
        "eq_fwd": 3218.44,
        "eq_rev": 0.00,
        "ua": 220.3,
        "ub": 219.8,
        "uc": 221.1,
        "ia": 18.52,
        "ib": 17.91,
        "ic": 19.05,
        "freq": 50.01,
        "uab": 381.2,
        "ucb": 380.7,
        "uac": 381.9,
        "ep_a": 4115.22,
        "ep_b": 4112.89,
        "ep_c": 4117.56,
        "dido_status": 0,
        "i0": 0.15,
        "unbl_u": 0.3,
        "unbl_i": 1.2,
        "pa": 4.076,
        "pb": 3.941,
        "pc": 4.199,
        "pt": 12.216,
        "qa": 1.312,
        "qb": 1.288,
        "qc": 1.356,
        "qt": 3.956,
        "sa": 4.284,
        "sb": 4.146,
        "sc": 4.420,
        "st": 12.850,
        "pfa": 0.951,
        "pfb": 0.950,
        "pfc": 0.950,
        "pft": 0.951
    }
}

9. RPC

9.1 RPC 名称

类型名称id_name
参数设置[DTSD1352 SET] 23112dtsd1352_set_23112
参数读取[DTSD1352 GET] 23112dtsd1352_get_23112

9.2 参数定义

参数槽field_name含义单位类型范围说明
app_70period_up采集/上传周期suint32le1–3600控制数据采集并上报云端的间隔,COV 关闭时采集与上传共用同一参数
app_150addr_modbusModbus 从站地址uint81–247DTU 轮询时使用的电表从站地址
0x008EH(设备寄存器)ct_ratioCT 变比uint16BE1–9999电流互感器变比,透传 FC=10 写入仪表
0x008DH(设备寄存器)vt_ratioVT 变比uint16BE1–9999电压互感器变比,透传 FC=10 写入仪表

period_upaddr_modbus 通过 PTL-D01 协议(端口 214)写入 DTU 参数槽,有完整的读回确认机制。ct_ratiovt_ratio 通过透传 Modbus FC=10(端口 51)直接写入仪表寄存器,为即发即忘型操作。

9.3 RPC 代码

参数设置 RPC(dtsd1352_set_23112)

javascript
import {BufferTKL, RPCHelper, Utils} from '#tklHelper'

function rpc_script({device, params, alarms, logger}) {
    let classMode = (device?.shared_attrs?.class_mode) || "ClassC";
    const rpcName = "dtsd1352_set_23112";

    let paraDef = {
        app_20:  { name: "TimeOffset",  field_name: "TimeOffset",  unit: "",   index: 20, type: "uint32le" },
        app_38:  { name: "pwron_delay", field_name: "pwron_delay", unit: "ms", index: 38, type: "uint16le" },
        app_70:  { name: "period_up",   field_name: "period_up",   unit: "s",  type: "uint32le" },
        app_150: { name: "addr_modbus", field_name: "addr_modbus", unit: "",   type: "uint8" }
    };

    const ptlFields = ["TimeOffset", "pwron_delay", "period_up", "addr_modbus"];
    let ptlParams = {};
    ptlFields.forEach(f => { if (params[f] !== undefined) ptlParams[f] = params[f]; });

    let msgQue = [];
    if (Object.keys(ptlParams).length > 0) {
        let frames = RPCHelper.buildFrame({ paraDef, params: ptlParams });
        let dnBuffer = Buffer.alloc(frames.writeBuffer.length + frames.readBuffer.length);
        frames.writeBuffer.copy(dnBuffer, 0);
        frames.readBuffer.copy(dnBuffer, frames.writeBuffer.length);
        msgQue = Utils.makeParaSetMSG({
            device, classMode, rpcName, params: ptlParams,
            paraDownBuffer: dnBuffer.length > 0 ? dnBuffer : undefined,
        });
    }

    let modbusAddr = device?.shared_attrs?.addr_modbus ?? 1;

    if (params.ct_ratio !== undefined) {
        let ctFrames = RPCHelper.buildmodbusFrame10({
            paraDef: {
                addr: modbusAddr,
                paraList: [{ index: 0x008E, field_name: "ct_ratio", name: "CT变比", type: "uint16BE" }]
            },
            params
        });
        if (ctFrames.writeBuffer.length > 0) {
            msgQue.push(RPCHelper.makeMSG({
                msgType: Utils.msgType.transParent,
                device,
                dnBuffer: ctFrames.writeBuffer,
            }));
        }
    }

    if (params.vt_ratio !== undefined) {
        let vtFrames = RPCHelper.buildmodbusFrame10({
            paraDef: {
                addr: modbusAddr,
                paraList: [{ index: 0x008D, field_name: "vt_ratio", name: "VT变比", type: "uint16BE" }]
            },
            params
        });
        if (vtFrames.writeBuffer.length > 0) {
            msgQue.push(RPCHelper.makeMSG({
                msgType: Utils.msgType.transParent,
                device,
                dnBuffer: vtFrames.writeBuffer,
            }));
        }
    }

    if (msgQue.length == 0) return null;
    return msgQue;
}

参数读取 RPC(dtsd1352_get_23112)

javascript
import {BufferTKL, RPCHelper, Utils} from '#tklHelper'

function rpc_script({device, params, alarms, logger}) {
    let classMode = (device?.shared_attrs?.class_mode) || "ClassC";
    let sleepMs = classMode === "ClassA" ? 500 : 5000;
    let paraDef = {
        app_20:  { name: "TimeOffset",  field_name: "TimeOffset",  unit: "",   index: 20, type: "uint32le" },
        app_38:  { name: "pwron_delay", field_name: "pwron_delay", unit: "ms", index: 38, type: "uint16le" },
        app_70:  { name: "period_up",   field_name: "period_up",   unit: "s",  type: "uint32le" },
        app_150: { name: "addr_modbus", field_name: "addr_modbus", unit: "",   type: "uint8" }
    };
    let frames = RPCHelper.buildFrame({ paraDef, params });
    let msg = RPCHelper.makeMSG({
        msgType: Utils.msgType.paras,
        device,
        dnBuffer: frames.readBuffer,
        sleepTime: sleepMs,
    });
    return [msg];
}

10. 模板选择

在 ThinkLink 平台模板库中搜索:

  • DTSD1352

或按业务代码查找:

  • 23112 / 三相导轨式多功能电能表

11. 补充说明

Modbus 通信参数配置

DTSD1352 出厂默认通信参数:波特率 9600 bps,数据位 8,停止位 1,校验位 Even(DL/T645 模式)。本方案使用 Modbus RTU 无校验,需通过设备菜单将校验位切换为 None

设备菜单路径:BUS → Parity → None(无校验)

切换后重启设备生效。KC11 也应配置为 9600 bps、8N1。

CT/PT 变比写入

CT/PT 变比通过 SET RPC(dtsd1352_set_23112)写入仪表寄存器:

  • ct_ratio → 仪表寄存器 0x008EH(Modbus FC=10)
  • vt_ratio → 仪表寄存器 0x008DH(Modbus FC=10)

写入为即发即忘型,平台不会读回确认。建议写入后执行 GET RPC(dtsd1352_get_23112)验证 period_up / addr_modbus 是否正常,并通过 Modbus 调试工具(ThinkLink 透传 RPC)手动读回 0x008D/0x008EH 确认变比已生效。

多表串联

RS-485 总线上可串联多台 DTSD1352,每台使用不同 Modbus 地址(1–247)。在 ThinkLink 平台为每台设备独立配置 addr_modbus,KC11 会在查询时动态替换查询帧中的从站地址(indexAPP=150)。总线末端需接 120Ω 终端电阻(KC11 已内置)。

Modbus 通信示例

读 A相电压(FC=03):

请求:01 03 00 61 00 01 D4 34
响应:01 03 02 08 9A C0 2A
      → 0x089A = 2202 → 2202 × 0.1 = 220.2 V

读总有功功率(4 字节 int32BE,FC=03):

请求:01 03 01 6A 00 02 A3 E7
响应:01 03 04 00 00 04 B0 [CRC]
      → 0x000004B0 = 1200 → 1200 × 0.001 = 1.200 kW