1. 传感器简介
模型清单
可使用下列名称或 ID 在 ThinkLink 中搜索对应模型。
| 模型类型 | 名称 | id_name | 平台模型 ID |
|---|---|---|---|
| RPC | [ADW2xx GET] para | adw2xx_get_23109 | 102274327663087623 |
| RPC | [ADW2xx SET] para | adw2xx_set_23109 | 102273573074243589 |
| Template | ADW2xx-23109 | 102273965933727749 | |
| Thing Model | [ADW2xx-23109] | adw2xx_23109 | 102271576388407301 |
| Thing Model | [ACREL-23109-ADW2xx资产] 区域聚合 | adw2xx_asset_23109 | 119677189950959616 |
| Parameter Thing Model | [ADW2xx-PARA] | adw2xx_para_23109 | 102272760276848645 |
ADW2xx 是安科瑞(Acrel)多通道导轨式多回路电力仪表,主要用于多个三相回路的全电参量测量。设备最多可同时接入 4 个三相回路的电流输入,可测量电压、电流、功率、功率因数、频率、电能等参数。
本方案中,ADW2xx 作为多用户电表使用,一个采集器采集一台 ADW2xx 设备。由于 ADW2xx 内部包含多个通道/回路,因此每个通道按照一包数据独立上传,并通过上行数据第 2 字节的值判断当前数据所属通道号。
2. 产品特点
ADW2xx 多回路电力仪表具备以下特点:
- 支持 1~4 路三相回路全电参量测量。
- 支持三相电压、三相电流、零序电流、频率采集。
- 支持有功功率、无功功率、视在功率及总功率测量。
- 支持三相功率因数、总功率因数测量。
- 支持正向有功电能、反向有功电能、正向无功电能、反向无功电能计量。
- 支持 RS-485 通讯,通信协议为 Modbus-RTU。
- 支持多通道数据独立读取与上传,适用于多用户电表场景。
- 支持通过 KC21/KC11 接入 LoRaWAN 网络,并在 ThinkLink 平台完成数据解析、子设备区分和第三方平台转发。
3. 适用范围
本对接方案适用于以下场景:
- 多用户用电计量。
- 楼宇、园区、公寓、商业综合体等多回路电能监测。
- 单台 ADW2xx 多通道电表通过一个 LoRaWAN 采集器接入 ThinkLink。
- 需要按通道区分不同用户或不同用电回路的电力监测场景。
- 需要通过 MQTT 向第三方平台订阅电表遥测数据的场景。
4. 采集器信息
4.1 硬件信息
| 项目 | 内容 |
|---|---|
| 采集器型号 | KC21 / KC11 |
| 采集接口 | RS-485 |
| 通讯协议 | Modbus-RTU |
| 采集对象 | ADW2xx 多通道电表 |
| 采集方式 | 一个采集器采集一台 ADW2xx |
| 上报方式 | LoRaWAN |
| 供电方式 | 220V / 12V / 电池供电,按实际采集器型号和现场供电条件选择 |
4.2 接线信息
电源与通讯接口
ADW2xx 电表通过 RS-485 与 KC21/KC11 采集器连接。采集器负责通过 Modbus-RTU 读取 ADW2xx 的各通道寄存器数据,并通过 LoRaWAN 上报到 ThinkLink。
| ADW2xx | KC21/KC11 |
|---|---|
| RS-485 A | RS-485 A |
| RS-485 B | RS-485 B |
| 电源端子 | 按 ADW2xx 现场供电要求接入 |
| 采集器电源 | 按 KC21/KC11 型号接入 220V / 12V / 电池供电 |
ADW2xx 主体支持 RS-485 接口,Modbus-RTU 协议,通信波特率支持 1200~38400,本文档 EB 配置中默认使用 9600bps、8N1。
传感器接口
ADW2xx 为多回路电力仪表,每个电流回路通过外置电流互感器接入。CH1~CH4 分别对应 4 个三相电流回路。电压、电流互感器接线应按照 ADW2xx 说明书中的接线图执行。
本方案中不涉及额外传感器接口,采集器仅通过 RS-485 读取 ADW2xx 的 Modbus 寄存器。
5. 数据采集
本方案中,通过 Modbus-RTU 功能码 0x03 读取 ADW2xx 以下寄存器。
ADW2xx 每个通道独立读取并独立上报。上报数据通过第 2 字节的值区分当前通道号:
| 上报 dataType | 对应通道 |
|---|---|
| 9 | CH1 |
| 10 | CH2 |
| 11 | CH3 |
| 12 | CH4 |
在物模型脚本中,字段 ch 来自上行帧第 2 字节,即 index:1。当 ch > 8 时,脚本执行 ch = ch - 9,因此最终输出通道号为:
| 原始 ch 值 | 解析后 ch 值 | 对应通道 |
|---|---|---|
| 9 | 0 | CH1 |
| 10 | 1 | CH2 |
| 11 | 2 | CH3 |
| 12 | 3 | CH4 |
5.1 寄存器定义
5.1.1 通道读取范围
| 通道 | 起始地址 | 结束地址 | 说明 |
|---|---|---|---|
| CH1 | 0x0100 | 0x013D | CH1 电参量 |
| CH2 | 0x0156 | 0x0193 | CH2 电参量 |
| CH3 | 0x01AC | 0x01E9 | CH3 电参量 |
| CH4 | 0x0202 | 0x023F | CH4 电参量 |
每个通道读取内容一致,寄存器地址按通道整体偏移。
5.1.2 CH1 寄存器定义
| 寄存器地址 | 字段名称 | 字段标识 | 单位 | 数据类型 |
|---|---|---|---|---|
0x0100-0x0101 | A相电压 | ua | V | float |
0x0102-0x0103 | B相电压 | ub | V | float |
0x0104-0x0105 | C相电压 | uc | V | float |
0x0106-0x0107 | AB线电压 | uab | V | float |
0x0108-0x0109 | BC线电压 | ubc | V | float |
0x010A-0x010B | CA线电压 | uca | V | float |
0x010C-0x010D | 频率 | freq | Hz | float |
0x010E-0x010F | A相电流 | ia | A | float |
0x0110-0x0111 | B相电流 | ib | A | float |
0x0112-0x0113 | C相电流 | ic | A | float |
0x0114-0x0115 | 零序电流 | i0 | A | float |
0x0116-0x0117 | A相有功功率 | pa | W | float |
0x0118-0x0119 | B相有功功率 | pb | W | float |
0x011A-0x011B | C相有功功率 | pc | W | float |
0x011C-0x011D | 总有功功率 | pt | W | float |
0x011E-0x011F | A相无功功率 | qa | var | float |
0x0120-0x0121 | B相无功功率 | qb | var | float |
0x0122-0x0123 | C相无功功率 | qc | var | float |
0x0124-0x0125 | 总无功功率 | qt | var | float |
0x0126-0x0127 | A相视在功率 | sa | VA | float |
0x0128-0x0129 | B相视在功率 | sb | VA | float |
0x012A-0x012B | C相视在功率 | sc | VA | float |
0x012C-0x012D | 总视在功率 | st | VA | float |
0x012E-0x012F | A相功率因数 | pfa | float | |
0x0130-0x0131 | B相功率因数 | pfb | float | |
0x0132-0x0133 | C相功率因数 | pfc | float | |
0x0134-0x0135 | 总功率因数 | pft | float | |
0x0136-0x0137 | A相正向有功电能 | epfa | kWh | float |
0x0138-0x0139 | B相正向有功电能 | epfb | kWh | float |
0x013A-0x013B | C相正向有功电能 | epfc | kWh | float |
0x013C-0x013D | 总正向有功电能 | epft | kWh | float |
5.1.3 CH2~CH4 寄存器说明
CH2、CH3、CH4 字段含义与 CH1 一致,寄存器地址如下:
| 字段 | CH2 地址 | CH3 地址 | CH4 地址 |
|---|---|---|---|
| A相电压 | 0x0156-0x0157 | 0x01AC-0x01AD | 0x0202-0x0203 |
| B相电压 | 0x0158-0x0159 | 0x01AE-0x01AF | 0x0204-0x0205 |
| C相电压 | 0x015A-0x015B | 0x01B0-0x01B1 | 0x0206-0x0207 |
| AB线电压 | 0x015C-0x015D | 0x01B2-0x01B3 | 0x0208-0x0209 |
| BC线电压 | 0x015E-0x015F | 0x01B4-0x01B5 | 0x020A-0x020B |
| CA线电压 | 0x0160-0x0161 | 0x01B6-0x01B7 | 0x020C-0x020D |
| 频率 | 0x0162-0x0163 | 0x01B8-0x01B9 | 0x020E-0x020F |
| A相电流 | 0x0164-0x0165 | 0x01BA-0x01BB | 0x0210-0x0211 |
| B相电流 | 0x0166-0x0167 | 0x01BC-0x01BD | 0x0212-0x0213 |
| C相电流 | 0x0168-0x0169 | 0x01BE-0x01BF | 0x0214-0x0215 |
| 零序电流 | 0x016A-0x016B | 0x01C0-0x01C1 | 0x0216-0x0217 |
| A相有功功率 | 0x016C-0x016D | 0x01C2-0x01C3 | 0x0218-0x0219 |
| B相有功功率 | 0x016E-0x016F | 0x01C4-0x01C5 | 0x021A-0x021B |
| C相有功功率 | 0x0170-0x0171 | 0x01C6-0x01C7 | 0x021C-0x021D |
| 总有功功率 | 0x0172-0x0173 | 0x01C8-0x01C9 | 0x021E-0x021F |
| A相无功功率 | 0x0174-0x0175 | 0x01CA-0x01CB | 0x0220-0x0221 |
| B相无功功率 | 0x0176-0x0177 | 0x01CC-0x01CD | 0x0222-0x0223 |
| C相无功功率 | 0x0178-0x0179 | 0x01CE-0x01CF | 0x0224-0x0225 |
| 总无功功率 | 0x017A-0x017B | 0x01D0-0x01D1 | 0x0226-0x0227 |
| A相视在功率 | 0x017C-0x017D | 0x01D2-0x01D3 | 0x0228-0x0229 |
| B相视在功率 | 0x017E-0x017F | 0x01D4-0x01D5 | 0x022A-0x022B |
| C相视在功率 | 0x0180-0x0181 | 0x01D6-0x01D7 | 0x022C-0x022D |
| 总视在功率 | 0x0182-0x0183 | 0x01D8-0x01D9 | 0x022E-0x022F |
| A相功率因数 | 0x0184-0x0185 | 0x01DA-0x01DB | 0x0230-0x0231 |
| B相功率因数 | 0x0186-0x0187 | 0x01DC-0x01DD | 0x0232-0x0233 |
| C相功率因数 | 0x0188-0x0189 | 0x01DE-0x01DF | 0x0234-0x0235 |
| 总功率因数 | 0x018A-0x018B | 0x01E0-0x01E1 | 0x0236-0x0237 |
| A相正向有功电能 | 0x018C-0x018D | 0x01E2-0x01E3 | 0x0238-0x0239 |
| B相正向有功电能 | 0x018E-0x018F | 0x01E4-0x01E5 | 0x023A-0x023B |
| C相正向有功电能 | 0x0190-0x0191 | 0x01E6-0x01E7 | 0x023C-0x023D |
| 总正向有功电能 | 0x0192-0x0193 | 0x01E8-0x01E9 | 0x023E-0x023F |
5.2 状态位定义
当前物模型脚本中使用 status 字段进行状态判断:
if((tdata?.status&0x02)===0x02) {
// time out , just update the status.
}状态位定义如下:
| 状态位 | 含义 | 处理逻辑 |
|---|---|---|
status & 0x02 | Modbus 采集超时 | 保留上一包遥测数据,仅更新 status 状态 |
当采集超时时,平台不覆盖原有有效电参量数据,只更新设备状态,避免因超时导致业务数据被清空。
6. EdgeBus 模型
ADW2xx 本身不是 LoRaWAN 设备,需要通过 KC21/KC11 采集器接入。因此本方案需要 EB 代码,由 EdgeBus 负责生成 Modbus 采集任务,周期性读取 ADW2xx 各通道寄存器,并通过 LoRaWAN 分包上报。
6.1 EB 配置参数
| 参数 | 值 |
|---|---|
| 业务代码 | 23109 |
| 业务版本 | 13 |
| 设备模板 | ADW2xx-23109 |
| 波特率 | 9600 |
| 数据位 | 8 |
| 停止位 | 1 |
| 校验位 | 无校验 |
| LoRaWAN 上报端口 | 23 |
| 上行版本标识 | 0x87 |
| 默认采集设备数量 | 2 |
| 每台设备通道数 | 4 |
| 采集协议 | Modbus-RTU |
| 功能码 | 0x03 |
参数索引定义
| 参数 | APP Index | 字段名 | 类型 | 说明 |
|---|---|---|---|---|
| 设备 1 查询周期 | 70 | period1 | uint32le | 单位:秒 |
| 设备 2 查询周期 | 74 | period2 | uint32le | 单位:秒 |
| 设备 1 485 地址 | 150 | addr1 | uint8 | Modbus 地址 |
| 设备 2 485 地址 | 151 | addr2 | uint8 | Modbus 地址 |
当前用户补充说明为“一个采集器采集一个设备”,因此实际部署时通常只使用
period1与addr1。代码中预留了 2 台 ADW2xx 的配置能力。
6.2 EB 代码
import { Buffer } from "buffer";
import { buildOtaFile } from "@EBSDK/run";
import {
ActionAfertExpr, CalcData,
CrcMode,
CvtRule,
EBBuffer,
EBModel,
ExprCondition,
LoraUpEvent,
QueryEvent, SetUpCovDataType,
UserConfUPItem,EventInfoItem
} from "@EBSDK/EBCompiler/all_variable";
import { CheckbitEnum, getOtaConfig, HwTypeEnum, UpgrdTypeEnum } from "@EBSDK/otaConfig";
////////////////////////////////////////////////////////////////////////////////////////
let eventInfo:UserConfUPItem[]=[]
let otaConfig = getOtaConfig({
BaudRate: 9600,
StopBits: 1,
DataBits: 8,
Checkbit: CheckbitEnum.NONE,
Battery: false,
ConfirmDuty: 60,
BzType: 23109,
BzVersion: 13
})
for(let i=0;i<2;i++){
let name="ADW2XX_3M_4CH_"+(i+1).toString();
let periodIndex=70+i*4
let addrIndex=150+i
for (let j=0;j<4;j++){
let start="0x100"
let end="0x13D"
if (j===1) { start="0x156";end="0x193"
}else if(j===2){start="0x1AC";end="0x1E9"
}else if(j===3){start="0x202";end="0x23F"}
let userConf:UserConfUPItem={
name:name,dataType:(9+j).toString(), port:23, version:"0x87",upPeriod:"10y",
quInfo:[
{ protocol:"modbus",code:"0x03", periodIndex:periodIndex,
indexAPP:addrIndex, indexCMD:0, copySize:1,isLast:true,
listVal:[{ start:start, end:end}]
}
]
}
eventInfo.push(userConf);
}
}
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(import.meta.url, otaConfig, MODBUS_TT)6.3 说明
当前 EB 逻辑说明:
- EB 代码默认配置 2 台 ADW2xx,每台 ADW2xx 包含 4 个通道。
- 用户当前场景为“一个采集器采集一个设备”,因此实际使用时主要启用第 1 台 ADW2xx,即
addr1和period1。 - 每个通道独立生成一条 Modbus 采集任务。
- 每个通道独立上传一包数据,LoRaWAN 端口统一为
23。 - 上行帧版本标识为
0x87。 - 通道号通过 dataType 区分:
9:CH110:CH211:CH312:CH4
- 物模型解析时读取第 2 字节作为
ch字段,并将9~12转换为0~3,用于平台侧区分通道。 - 由于 ADW2xx 是多用户表,ThinkLink 可通过
sub_device机制将每个通道解析为不同子设备,实现多用户表按通道分设备管理。
7. 物模型
7.1 物模型基本信息
| 项目 | 内容 |
|---|---|
| 物模型名称 | ADW2xx-23109 |
| 设备型号 | ADW2xx |
| 业务代码 | 23109 |
| LoRaWAN Port | 23 |
| 帧版本 | 0x87 |
| 上行帧长度 | 130 字节 |
| 是否携带 RSSI | 是 |
| 是否携带电池电压 | 是,battery:4 |
| 通道判断方式 | 第 2 字节 ch |
| 子设备区分方式 | sub_device = tdata.addr + 1000 |
7.2 上行帧结构
let frameInfo = {
port:23,
dataLen:130,
rssi:true,
battery:4,
tagList:[
{ index:0, tag:0x87 }
]
}上行字段定义
| 字段名称 | 字段标识 | 单位 | 字节位置 | 类型 | 小数位 |
|---|---|---|---|---|---|
| CH | ch | 1 | uint8 | ||
| A相电压 | ua | V | 6 | floatbe | 3 |
| B相电压 | ub | V | 10 | floatbe | 3 |
| C相电压 | uc | V | 14 | floatbe | 3 |
| AB线电压 | uab | V | 18 | floatbe | 3 |
| BC线电压 | ubc | V | 22 | floatbe | 3 |
| CA线电压 | uca | V | 26 | floatbe | 3 |
| 频率 | freq | Hz | 30 | floatbe | 3 |
| A相电流 | ia | A | 34 | floatbe | 3 |
| B相电流 | ib | A | 38 | floatbe | 3 |
| C相电流 | ic | A | 42 | floatbe | 3 |
| 零序电流 | i0 | A | 46 | floatbe | 3 |
| A相有功功率 | pa | W | 50 | floatbe | 3 |
| B相有功功率 | pb | W | 54 | floatbe | 3 |
| C相有功功率 | pc | W | 58 | floatbe | 3 |
| 总有功功率 | pt | W | 62 | floatbe | 3 |
| A相无功功率 | qa | var | 66 | floatbe | 3 |
| B相无功功率 | qb | var | 70 | floatbe | 3 |
| C相无功功率 | qc | var | 74 | floatbe | 3 |
| 总无功功率 | qt | var | 78 | floatbe | 3 |
| A相视在功率 | sa | VA | 82 | floatbe | 3 |
| B相视在功率 | sb | VA | 86 | floatbe | 3 |
| C相视在功率 | sc | VA | 90 | floatbe | 3 |
| 总视在功率 | st | VA | 94 | floatbe | 3 |
| A相功率因数 | pfa | 98 | floatbe | 3 | |
| B相功率因数 | pfb | 102 | floatbe | 3 | |
| C相功率因数 | pfc | 106 | floatbe | 3 | |
| 总功率因数 | pft | 110 | floatbe | 3 | |
| A相正向有功电能 | epfa | kWh | 114 | floatbe | 3 |
| B相正向有功电能 | epfb | kWh | 118 | floatbe | 3 |
| C相正向有功电能 | epfc | kWh | 122 | floatbe | 3 |
| 总正向有功电能 | epft | kWh | 126 | floatbe | 3 |
7.3 物模型脚本
7.3.1 数据物模型脚本
let port=msg?.userdata?.port || null;
let frameInfo = {
port:23,
dataLen:130,
rssi:true,
battery:4,
tagList:[
{ index:0, tag:0x87 }
]
}
let appInfo = [
{ name:"CH", field_name:"ch", unit:"", index:1, type:"uint8" },
{ name:"A相电压", field_name:"ua", unit:"V", index:6, type:"floatbe", decimal:3 },
{ name:"B相电压", field_name:"ub", unit:"V", index:10, type:"floatbe", decimal:3 },
{ name:"C相电压", field_name:"uc", unit:"V", index:14, type:"floatbe", decimal:3 },
{ name:"AB线电压", field_name:"uab", unit:"V", index:18, type:"floatbe", decimal:3 },
{ name:"BC线电压", field_name:"ubc", unit:"V", index:22, type:"floatbe", decimal:3 },
{ name:"CA线电压", field_name:"uca", unit:"V", index:26, type:"floatbe", decimal:3 },
{ name:"频率", field_name:"freq", unit:"Hz", index:30, type:"floatbe", decimal:3 },
{ name:"A相电流", field_name:"ia", unit:"A", index:34, type:"floatbe", decimal:3 },
{ name:"B相电流", field_name:"ib", unit:"A", index:38, type:"floatbe", decimal:3 },
{ name:"C相电流", field_name:"ic", unit:"A", index:42, type:"floatbe", decimal:3 },
{ name:"零序电流", field_name:"i0", unit:"A", index:46, type:"floatbe", decimal:3 },
{ name:"A相有功功率", field_name:"pa", unit:"W", index:50, type:"floatbe", decimal:3 },
{ name:"B相有功功率", field_name:"pb", unit:"W", index:54, type:"floatbe", decimal:3 },
{ name:"C相有功功率", field_name:"pc", unit:"W", index:58, type:"floatbe", decimal:3 },
{ name:"总有功功率", field_name:"pt", unit:"W", index:62, type:"floatbe", decimal:3 },
{ name:"A相无功功率", field_name:"qa", unit:"var", index:66, type:"floatbe", decimal:3 },
{ name:"B相无功功率", field_name:"qb", unit:"var", index:70, type:"floatbe", decimal:3 },
{ name:"C相无功功率", field_name:"qc", unit:"var", index:74, type:"floatbe", decimal:3 },
{ name:"总无功功率", field_name:"qt", unit:"var", index:78, type:"floatbe", decimal:3 },
{ name:"A相视在功率", field_name:"sa", unit:"VA", index:82, type:"floatbe", decimal:3 },
{ name:"B相视在功率", field_name:"sb", unit:"VA", index:86, type:"floatbe", decimal:3 },
{ name:"C相视在功率", field_name:"sc", unit:"VA", index:90, type:"floatbe", decimal:3 },
{ name:"总视在功率", field_name:"st", unit:"VA", index:94, type:"floatbe", decimal:3 },
{ name:"A相功率因数", field_name:"pfa", unit:"", index:98, type:"floatbe", decimal:3 },
{ name:"B相功率因数", field_name:"pfb", unit:"", index:102, type:"floatbe", decimal:3 },
{ name:"C相功率因数", field_name:"pfc", unit:"", index:106, type:"floatbe", decimal:3 },
{ name:"总功率因数", field_name:"pft", unit:"", index:110, type:"floatbe", decimal:3 },
{ name:"A相正向有功电能", field_name:"epfa", unit:"kWh", index:114, type:"floatbe", decimal:3 },
{ name:"B相正向有功电能", field_name:"epfb", unit:"kWh", index:118, type:"floatbe", decimal:3 },
{ name:"C相正向有功电能", field_name:"epfc", unit:"kWh", index:122, type:"floatbe", decimal:3 },
{ name:"总正向有功电能", field_name:"epft", unit:"kWh", index:126, type:"floatbe", decimal:3 },
]
let tdata={}
let payParser=new PayloadParser({
device:device,
msg:msg,
frameInfo:frameInfo,
appInfo:appInfo,
})
tdata= payParser.telemetry()
if((tdata?.status&0x02)===0x02) {
// time out , just update the status.
const status=tdata.status
tdata={ ...(device.telemetry_data?.[thingModelId] ?? {})}
tdata.status=status
}
if(tdata?.ch>8) {
tdata.ch=tdata.ch-9
}
return {
sub_device:tdata==undefined ? null : (tdata.addr+1000),
telemetry_data: tdata,
server_attrs: null,
shared_attrs: null
}7.3.2 参数物模型脚本
let port=msg?.userdata?.port || null;
const rpcName="adw2xx_23109_set";
let paraDef = {
app_70:{name: "period1", field_name: "period1", unit:"S", type: "uint32le"},
app_74:{name: "period2", field_name: "period2", unit:"S", type: "uint32le"},
app_150:{name: "addr1", field_name: "addr1", unit:"", type: "uint8"},
app_151:{name: "addr2", field_name: "addr2", unit:"", type: "uint8"}
}
if (port!==214) {
let checkData=Utils.paraCheck(rpcName,device.server_attrs,device.shared_attrs)
return {
server_attrs: checkData.sdata,
action:checkData.action,
}
}
let pdata=(new PayloadParser({
device:device,
msg:msg,
paraInfo:paraDef,
})).paras()
let checkData= Utils.paraCheck(rpcName,pdata)
return {
telemetry_data: pdata,
server_attrs: checkData.sdata,
shared_attrs: pdata,
action: checkData.action,
}8. 第三方平台数据订阅
8.1 MQTT Topic
/v32/{Organization Account}/tkl/up/telemetry/{eui}示例:
/v32/{Organization Account}/tkl/up/telemetry/{eui}其中:
| 参数 | 说明 |
|---|---|
{Organization Account} | ThinkLink 组织账号 |
{eui} | LoRaWAN 设备 EUI |
8.2 上报示例数据
以下示例为 ADW2xx 多用户表 CH1 通道上报数据。实际业务中,每个通道会独立上报一包数据,并通过 ch 字段区分通道。
{
"eui": "6353012af10a9331",
"active_time": "2026-02-05T08:35:48.000Z",
"thingModelId": "23109",
"thingModelIdName": "ADW2xx-23109",
"telemetry_data": {
"snr": 13.5,
"rssi": -51,
"battery": 3.37,
"addr": 1,
"ch": 0,
"ua": 220.125,
"ub": 219.876,
"uc": 220.342,
"uab": 380.456,
"ubc": 381.012,
"uca": 379.998,
"freq": 50.002,
"ia": 12.345,
"ib": 11.876,
"ic": 12.021,
"i0": 0.012,
"pa": 2300.125,
"pb": 2201.456,
"pc": 2250.789,
"pt": 6752.370,
"qa": 120.123,
"qb": 118.456,
"qc": 121.789,
"qt": 360.368,
"sa": 2310.125,
"sb": 2210.456,
"sc": 2260.789,
"st": 6781.370,
"pfa": 0.995,
"pfb": 0.996,
"pfc": 0.995,
"pft": 0.995,
"epfa": 1234.567,
"epfb": 1220.345,
"epfc": 1218.901,
"epft": 3673.813,
"status": 0
}
}通道说明
telemetry_data.ch | 对应通道 |
|---|---|
| 0 | CH1 |
| 1 | CH2 |
| 2 | CH3 |
| 3 | CH4 |
子设备说明
当前物模型脚本中:
sub_device:tdata==undefined ? null : (tdata.addr+1000)平台会根据子设备地址区分下级设备。对于多用户表场景,建议结合 addr 与 ch 进行业务侧用户/回路绑定。例如:
| ADW2xx 地址 | 通道 | 业务含义 |
|---|---|---|
| 1 | 0 | 用户/回路 1 |
| 1 | 1 | 用户/回路 2 |
| 1 | 2 | 用户/回路 3 |
| 1 | 3 | 用户/回路 4 |
9. RPC
9.1 RPC 名称
| RPC 类型 | RPC 名称 |
|---|---|
| 配置参数 | adw2xx_23109_set |
| 读取参数 | adw2xx_23109_set |
9.2 参数定义
| 参数名 | 字段名 | APP Index | 单位 | 类型 | 说明 |
|---|---|---|---|---|---|
| period1 | period1 | 70 | S | uint32le | 设备 1 查询/上传周期 |
| period2 | period2 | 74 | S | uint32le | 设备 2 查询/上传周期,预留 |
| addr1 | addr1 | 150 | uint8 | 设备 1 Modbus 地址 | |
| addr2 | addr2 | 151 | uint8 | 设备 2 Modbus 地址,预留 |
当前场景为一个采集器采集一个 ADW2xx,因此主要配置:
{
"period1": 300,
"addr1": 1
}9.3 RPC 代码
9.3.1 配置参数 RPC
let classMode = (device && device.shared_attrs && device.shared_attrs.class_mode) || "ClassA";
const rpcName="adw2xx_23109_set";
let paraDef = {
app_70:{name: "period1", field_name: "period1", unit:"S", type: "uint32le"},
app_74:{name: "period2", field_name: "period2", unit:"S", type: "uint32le"},
app_150:{name: "addr1", field_name: "addr1", unit:"", type: "uint8"},
app_151:{name: "addr2", field_name: "addr2", unit:"", type: "uint8"}
}
let frames=RPCHelper.buildFrame({
paraDef:paraDef,
params:params
});
let redoBuffer=RPCHelper.redo()
let dnBuffer=Buffer.alloc(frames.writeBuffer.length+frames.readBuffer.length);
frames.writeBuffer.copy(dnBuffer,0)
frames.readBuffer.copy(dnBuffer,frames.writeBuffer.length)
logger.info("set para")
let msgQue=Utils.makeParaSetMSG({
device:device,
classMode:classMode,
rpcName:rpcName,
params:params,
paraDownBuffer:dnBuffer,
extraAppBuffer:redoBuffer
})
if (msgQue.length==0) return null
return msgQue9.3.2 读取参数 RPC
let paraDef = {
app_70:{name: "period1", field_name: "period1", unit:"S", type: "uint32le"},
app_74:{name: "period2", field_name: "period2", unit:"S", type: "uint32le"},
app_150:{name: "addr1", field_name: "addr1", unit:"", type: "uint8"},
app_151:{name: "addr2", field_name: "addr2", unit:"", type: "uint8"}
}
let frames=RPCHelper.buildFrame({
paraDef:paraDef,
params:params
});
let msg=RPCHelper.makeMSG({
msgType:Utils.msgType.paras,
device:device,
dnBuffer:frames.readBuffer,
sleepTime:0,
})
return [msg]9.3.3 RPC 调用示例
配置 ADW2xx 地址为 1,采集周期为 300 秒:
{
"method": "adw2xx_23109_set",
"params": {
"period1": 300,
"addr1": 1
}
}如使用第二台设备预留参数:
{
"method": "adw2xx_23109_set",
"params": {
"period1": 300,
"addr1": 1,
"period2": 300,
"addr2": 2
}
}10. 模板选择
在 ThinkLink 平台中搜索模板:
ADW2xx-23109或按业务类型查找:
多回路电力仪表
多用户表
Modbus 电表
ADW2xx
Acrel ADW2xx11. 对接注意事项
- ADW2xx 为多通道电表,每个通道按一包数据上传。
- 当前通道号通过上行数据第 2 字节判断。
dataType=9~12分别对应 CH1~CH4。- 物模型中将
ch>8的值减 9,转换为平台内部通道号0~3。 - 默认 EB 代码支持 2 台 ADW2xx,每台 4 个通道;当前项目按“一个采集器采集一个设备”部署时,仅配置
addr1和period1即可。 - ADW2xx 通讯参数需与 EB 配置一致:9600bps、8 数据位、1 停止位、无校验。
- RS-485 总线较长或现场干扰较强时,建议检查屏蔽接地、终端电阻及 A/B 极性。