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 以下寄存器组:
| 采集组 | 起始地址 | 读取内容 |
|---|---|---|
| G1 | 0x000AH | 正向有功总电能(ep_fwd) |
| G2 | 0x0014H | 反向有功总电能(ep_rev) |
| G3 | 0x0028H | 正向无功总电能(eq_fwd) |
| G4 | 0x0032H | 反向无功总电能(eq_rev) |
| G5 | 0x0061H | A/B/C 相电压 + A/B/C 相电流(6 项) |
| G6 | 0x0077H | 频率 + AB/CB/AC 线电压(4 项) |
| G7 | 0x0087H | A/B/C 相正向有功电能(ep_a/ep_b/ep_c) |
| G8a | 0x008FH | DIDO/失压状态(dido_status) |
| G8b | 0x0092H | 零序电流 + 电压不平衡度 + 电流不平衡度 |
| G9 | 0x0164H | 三相有功/无功/视在功率 + 功率因数(28 个寄存器,触发上行) |
CT/PT 变比(0x008DH/0x008EH)通过 Modbus FC=10(写多个寄存器)透传写入,不做周期采集。
5.1 寄存器定义
电能寄存器(uint32BE,× 0.01,kWh / kVarh)
| 数据项 | 地址 | 字节数 | 数据类型 | 系数 | 单位 |
|---|---|---|---|---|---|
| 正向有功总电能 | 0x000AH | 4 | uint32BE | 0.01 | kWh |
| 反向有功总电能 | 0x0014H | 4 | uint32BE | 0.01 | kWh |
| 正向无功总电能 | 0x0028H | 4 | uint32BE | 0.01 | kVarh |
| 反向无功总电能 | 0x0032H | 4 | uint32BE | 0.01 | kVarh |
| A相正向有功电能 | 0x0087H | 4 | uint32BE | 0.01 | kWh |
| B相正向有功电能 | 0x0089H | 4 | uint32BE | 0.01 | kWh |
| C相正向有功电能 | 0x008BH | 4 | uint32BE | 0.01 | kWh |
电压/电流/频率寄存器(uint16BE)
| 数据项 | 地址 | 字节数 | 数据类型 | 系数 | 单位 |
|---|---|---|---|---|---|
| A相电压 | 0x0061H | 2 | uint16BE | 0.1 | V |
| B相电压 | 0x0062H | 2 | uint16BE | 0.1 | V |
| C相电压 | 0x0063H | 2 | uint16BE | 0.1 | V |
| A相电流 | 0x0064H | 2 | uint16BE | 0.01 | A |
| B相电流 | 0x0065H | 2 | uint16BE | 0.01 | A |
| C相电流 | 0x0066H | 2 | uint16BE | 0.01 | A |
| 频率 | 0x0077H | 2 | uint16BE | 0.01 | Hz |
| AB线电压 | 0x0078H | 2 | uint16BE | 0.1 | V |
| CB线电压 | 0x0079H | 2 | uint16BE | 0.1 | V |
| AC线电压 | 0x007AH | 2 | uint16BE | 0.1 | V |
功率寄存器(int32BE 补码,× 0.001,保留 3 位小数)
| 数据项 | 地址 | 字节数 | 数据类型 | 系数 | 单位 |
|---|---|---|---|---|---|
| A相有功功率 | 0x0164H | 4 | int32BE | 0.001 | kW |
| B相有功功率 | 0x0166H | 4 | int32BE | 0.001 | kW |
| C相有功功率 | 0x0168H | 4 | int32BE | 0.001 | kW |
| 总有功功率 | 0x016AH | 4 | int32BE | 0.001 | kW |
| A相无功功率 | 0x016CH | 4 | int32BE | 0.001 | kVar |
| B相无功功率 | 0x016EH | 4 | int32BE | 0.001 | kVar |
| C相无功功率 | 0x0170H | 4 | int32BE | 0.001 | kVar |
| 总无功功率 | 0x0172H | 4 | int32BE | 0.001 | kVar |
| A相视在功率 | 0x0174H | 4 | int32BE | 0.001 | kVA |
| B相视在功率 | 0x0176H | 4 | int32BE | 0.001 | kVA |
| C相视在功率 | 0x0178H | 4 | int32BE | 0.001 | kVA |
| 总视在功率 | 0x017AH | 4 | int32BE | 0.001 | kVA |
| A相功率因数 | 0x017CH | 2 | int16BE | 0.001 | — |
| B相功率因数 | 0x017DH | 2 | int16BE | 0.001 | — |
| C相功率因数 | 0x017EH | 2 | int16BE | 0.001 | — |
| 总功率因数 | 0x017FH | 2 | int16BE | 0.001 | — |
状态/诊断寄存器
| 数据项 | 地址 | 字节数 | 数据类型 | 系数 | 单位 |
|---|---|---|---|---|---|
| DIDO/失压状态 | 0x008FH | 2 | uint16BE | — | — |
| 零序电流 | 0x0092H | 2 | uint16BE | 0.01 | A |
| 电压不平衡度 | 0x0093H | 2 | uint16BE | 0.1 | % |
| 电流不平衡度 | 0x0094H | 2 | uint16BE | 0.1 | % |
配置寄存器(R/W,通过 RPC 写入)
| 数据项 | 地址 | 字节数 | 数据类型 | 说明 |
|---|---|---|---|---|
| 电压变比 PT | 0x008DH | 2 | uint16BE | 1–9999,默认 1 |
| 电流变比 CT | 0x008EH | 2 | uint16BE | 1–9999,默认 1 |
5.2 状态位定义(DIDO/失压状态寄存器 0x008FH)
| Bit | 含义 |
|---|---|
| Bit0 | A相过压 |
| Bit1 | B相过压 |
| Bit2 | C相过压 |
| Bit3 | A相失压 |
| Bit4 | B相失压 |
| Bit5 | C相失压 |
| Bit6 | A相逆向(相序异常) |
| Bit7 | B相逆向 |
| Bit8 | C相逆向 |
| Bit9 | DI 状态 |
| Bit10 | DO 状态 |
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 代码
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–9 | ep_fwd(uint32BE) |
| 10–13 | ep_rev(uint32BE) |
| 14–17 | eq_fwd(uint32BE) |
| 18–21 | eq_rev(uint32BE) |
| 22–23 | ua(uint16BE) |
| 24–25 | ub(uint16BE) |
| 26–27 | uc(uint16BE) |
| 28–29 | ia(uint16BE) |
| 30–31 | ib(uint16BE) |
| 32–33 | ic(uint16BE) |
| 34–35 | freq(uint16BE) |
| 36–37 | uab(uint16BE) |
| 38–39 | ucb(uint16BE) |
| 40–41 | uac(uint16BE) |
| 42–45 | ep_a(uint32BE) |
| 46–49 | ep_b(uint32BE) |
| 50–53 | ep_c(uint32BE) |
| 54–55 | dido_status(uint16BE) |
| 56–57 | i0(uint16BE) |
| 58–59 | unbl_u(uint16BE) |
| 60–61 | unbl_i(uint16BE) |
| 62–65 | pa(int32BE) |
| 66–69 | pb(int32BE) |
| 70–73 | pc(int32BE) |
| 74–77 | pt(int32BE) |
| 78–81 | qa(int32BE) |
| 82–85 | qb(int32BE) |
| 86–89 | qc(int32BE) |
| 90–93 | qt(int32BE) |
| 94–97 | sa(int32BE) |
| 98–101 | sb(int32BE) |
| 102–105 | sc(int32BE) |
| 106–109 | st(int32BE) |
| 110–111 | pfa(int16BE) |
| 112–113 | pfb(int16BE) |
| 114–115 | pfc(int16BE) |
| 116–117 | pft(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)
let frameInfo = {
port: 22,
dataLen: 118,
rssi: true,
battery: 4,
tagList: [
{ index: 0, tag: 0x87 },
{ index: 1, tag: 0x31 }
]
};7.3 物模型脚本
数据物模型(dtsd1352_23112)
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)
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 上报示例数据
{
"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] 23112 | dtsd1352_set_23112 |
| 参数读取 | [DTSD1352 GET] 23112 | dtsd1352_get_23112 |
9.2 参数定义
| 参数槽 | field_name | 含义 | 单位 | 类型 | 范围 | 说明 |
|---|---|---|---|---|---|---|
| app_70 | period_up | 采集/上传周期 | s | uint32le | 1–3600 | 控制数据采集并上报云端的间隔,COV 关闭时采集与上传共用同一参数 |
| app_150 | addr_modbus | Modbus 从站地址 | — | uint8 | 1–247 | DTU 轮询时使用的电表从站地址 |
| 0x008EH(设备寄存器) | ct_ratio | CT 变比 | — | uint16BE | 1–9999 | 电流互感器变比,透传 FC=10 写入仪表 |
| 0x008DH(设备寄存器) | vt_ratio | VT 变比 | — | uint16BE | 1–9999 | 电压互感器变比,透传 FC=10 写入仪表 |
period_up和addr_modbus通过 PTL-D01 协议(端口 214)写入 DTU 参数槽,有完整的读回确认机制。ct_ratio和vt_ratio通过透传 Modbus FC=10(端口 51)直接写入仪表寄存器,为即发即忘型操作。
9.3 RPC 代码
参数设置 RPC(dtsd1352_set_23112)
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)
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