1. 传感器简介
模型清单
可使用下列名称或 ID 在 ThinkLink 中搜索对应模型。
| 模型类型 | 名称 | id_name | 平台模型 ID |
|---|---|---|---|
| RPC | [ECS-2280NEO GET] para | ecs_2280neo_22101_get | 80536120831512581 |
| RPC | [ECS-2280NEO SET] para | ecs_2280neo_22101_set | 79888011143155717 |
| Template | ECS-2280NEO | 80533446350344197 | |
| Thing Model | [ECS-2280NEO] | ecs_2280neo_22101 | 79886859227893765 |
| Thing Model | [ELITECH-22101-ECS-2280NEO资产] 区域聚合 | ecs_2280neo_asset_22101 | 119677174411063308 |
| Parameter Thing Model | [ECS-2280NEO-PARA] | ecs_2280neo_para_22101 | 90829990110695429 |
ECS-2280NEO 为精创(Elitech)温度控制器,业务代码为 22101,模板名称为 ECS-2280NEO。该控制器支持 RS-485 通讯,可通过上位机读取控制器参数、工作状态及故障状态,适用于中低温药品柜、厨房柜、超市分体柜、风幕柜、岛柜、便利柜、酒柜等场景。
2. 产品特点
ECS-2280NEO 具备以下特点:
- 交流供电:100~240VAC ±10%,50/60Hz
- 支持 RS-485 通讯
- 支持上位机读写参数、读取运行状态及故障状态
- 支持控制器地址 Adr 配置
- 支持分组域地址 un1 配置
- 同一网络最多支持 128 个节点
- 具备温控、状态监测、故障告警等能力。
3. 适用范围
适用于:
- 中低温药品柜
- 厨房柜
- 超市分体柜
- 风幕柜
- 岛柜
- 便利柜
- 酒柜。
4. 对接信息
4.1 硬件信息
- 设备型号:ECS-2280NEO
- 厂商:精创 / Elitech
- 供电方式:100~240VAC ±10%,50/60Hz
- 通讯方式:RS-485
- 网络节点数:最多 128 个节点
- 控制器地址范围:00~127
- 分组域地址范围:00~127。
4.2 接线信息
电源与通讯接口
根据说明书接线图,设备主要接口包括:
- 交流电源输入:N / L
- 通讯接口:A / B(RS-485)
- UPS 接口:12V / GND
- 其余端子涉及化霜、柜温、门开关、冷凝等接线。
传感器接口
说明书中可见与业务相关的接口包括:
- 柜温
- 化霜
- 门开关
- 冷凝
- UPS 接口。
5. 数据采集
本方案中,通过 Modbus 读取以下寄存器:
- 03 功能码
- 寄存器 256:冷藏室温度
- 寄存器 257:融霜温度
- 01 功能码
- 通过读取状态位块,提取:
- 阀状态
- 风机状态
- 融霜状态。
- 通过读取状态位块,提取:
5.1 寄存器定义
| 采集项 | 功能码 | 地址(hex) | 地址(hex) | 数据类型 | 说明 |
|---|---|---|---|---|---|
| 冷藏室温度 | 03 | 256 | 0x0100 | int16 | 冷藏室温度,系数 0.1 |
| 融霜温度 | 03 | 257 | 0x0101 | int16 | 融霜温度,系数 0.1 |
| 控制器状态 | 01 | 512 | 0x0200 | bit | 0=关,1=开 |
| 库温度探头故障(P1) | 01 | 520 | 0x0208 | bit | 0=无,1=有 |
| 融霜探头故障(P2) | 01 | 521 | 0x0209 | bit | 0=无,1=有 |
| 高温报警 | 01 | 524 | 0x020C | bit | 0=无,1=有 |
| 低温报警 | 01 | 525 | 0x020D | bit | 0=无,1=有 |
| 融霜状态 | 01 | 535 | 0x0217 | bit | 0=关,1=开 |
| 开门报警 | 01 | 536 | 0x0218 | bit | 0=无,1=有 |
| 风机状态 | 01 | 539 | 0x021B | bit | 0=关,1=开 |
| 制冷状态(压缩机状态) | 01 | 542 | 0x021E | bit | 0=关,1=开 |
| 门状态 | 03 | 10 | 0x000A | bit | 0=关,1=开 |
6. EdgeBus
6.1 EB 配置参数
typescript
let otaConfig = getOtaConfig({
SwVersion:31,
BaudRate: 9600,
StopBits: 1,
DataBits: 8,
Checkbit: CheckbitEnum.NONE,
Battery: true,
ConfirmDuty: 60,
BzType: 22101,
BzVersion: 11
})关键参数说明:
- 波特率:9600
- 数据位:8
- 停止位:1
- 校验位:无
- 电池上报:开启
- 业务类型:22101
- 业务版本:11。
6.2 EB 代码
typescript
import {Buffer} from "buffer";
import {buildOtaFile} from "@EBSDK/run";
import {LoraUpEvent} from "@EBSDK/EBCompiler/all_variable";
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, HwTypeEnum} from "@EBSDK/otaConfig";
////////////////////////////////////////////////////////////////////////////////////////
//manufactory: elitech
const eventInfo:UserConfUPItem[]=[
{
name:"ecs_2280neo",port:22, version:"0x86",dataType:"0x01",upPeriodIndex:70,
quInfo:[
{
protocol:"modbus",code:"0x03", periodIndex:74,//addr:"0x01",
indexAPP:150, indexCMD:0, copySize:1,isLast:false,//period:"900s",payIndex:3,ackAddrIndex:0,
listVal:[
{ start: "256", end: "256" ,covType:"Int16BE",covAppIndex:110}, //冷藏室温度,refrigerator_temp,coefficient=0.1
{ start: "257", end: "257" ,covType:"Int16BE",covAppIndex:112} //融霜温度,defrost_temp,coefficient=0.1
]
},
{
protocol:"modbus",code:"0x01",periodIndex:74, //addr:"0x01",
indexAPP:150, indexCMD:0, copySize:1,isLast:false,//period:"900s",payIndex:3,ackAddrIndex:0,
cmd:"0x01 01 02 00 00 1F 39 51",
ack:"0x01 01 04 01 02 03 04 78 C0",
listTag:[{index:1,val:"1"},{index:2,val:"4"}],
listVal:[
{ start: "3", end: "6",covType: "Uint32LE",covAppIndex:114},
]
}
]
}
]
let otaConfig = getOtaConfig({
SwVersion:31,
BaudRate: 9600,
StopBits: 1,
DataBits: 8,
Checkbit: CheckbitEnum.NONE,
Battery: true,
ConfirmDuty: 60,
BzType: 22101,
BzVersion: 11
})
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 逻辑说明:
- 设备上行端口为 22。
- 业务帧头使用:
version = 0x86dataType = 0x01
- 通过 03 功能码 分别读取:
- 256:冷藏室温度
- 257:融霜温度
- 通过 01 功能码 读取一段状态区块,命令为:
01 01 02 00 00 1F 39 51- 起始地址为 0x0200
- 读取数量为 0x001F
- 01 功能码返回后,EB 将状态数据中的第 3~6 字节按 Uint32LE 写入
- 物模型再从该 32 位状态字中拆出:
- 阀状态
- 风机状态
- 融霜状态
upPeriodIndex:70表示上报周期参数位;periodIndex:74表示采集周期参数位。- 110: 冷藏室温度阈值 ; 112: 融霜温度阈值 ,114: 状态变化阈值
- 参数上报/参数应答端口为 214。
7. 物模型
7.1 物模型基本信息
数据物模型
- 名称:[ECS-2280NEO]
- id Name:ecs_2280neo_22101
参数物模型
- 名称:[ECS-2280NEO-PARA]
- id Name:ecs_2280neo_para_22101。
7.2 上行帧结构
typescript
let frameInfo={
port:22, dataLen:14,rssi:true,battery:4,
tagList:[{ index:0, tag:0x86}, { index:1, tag:0x01}]
}字段说明:
port: 22dataLen: 14rssi: truebattery: 4- 标签位:
index 0 = 0x86index 1 = 0x01。
7.3 修正后的物模型脚本
typescript
let port = msg?.userdata?.port || null;
if (port !== 22) return null;
let frameInfo = {
port: 22,
dataLen: 14,
rssi: true,
battery: 4,
tagList: [
{ index: 0, tag: 0x86 },
{ index: 1, tag: 0x01 }
]
};
let appInfo = [
{ name: "temp_refrigerator", field_name: "temp_refrigerator", unit: "℃", index: 6, type: "int16BE", coefficient: 0.1, decimal: 1 },
{ name: "temp_defrost", field_name: "temp_defrost", unit: "℃", index: 8, type: "int16BE", coefficient: 0.1, decimal: 1 },
{ name: "status_valve", field_name: "status_valve", unit: "", index: 10, type: "bitLE23-23" },
{ name: "status_fan", field_name: "status_fan", unit: "", index: 10, type: "bitLE27-27" },
{ name: "status_defrost", field_name: "status_defrost", unit: "", index: 10, type: "bitLE30-30" }
];
let payParser = new PayloadParser({
device: device,
msg: msg,
frameInfo: frameInfo,
appInfo: appInfo,
});
let tdata = payParser.telemetry();
return {
telemetry_data: tdata,
server_attrs: null,
shared_attrs: null
};8. 第三方平台数据订阅
8.1 MQTT Topic
/v32/{Organization Account}/tkl/up/telemetry/{eui}
8.2 上报示例数据
json
{
"eui": "设备EUI",
"active_time": "2026-03-29T09:00:00.000Z",
"thingModelId": "平台实际生成ID",
"thingModelIdName": "ecs_2280neo_22101",
"telemetry_data": {
"snr": 0,
"rssi": 0,
"battery": 0,
"temp_refrigerator": -18.5,
"temp_defrost": -6.0,
"status_valve": 1,
"status_fan": 1,
"status_defrost": 0
}
}说明:
thingModelId和eui未在你提供的资料中出现,因此这里保留为平台实际值。thingModelIdName建议使用统一后的业务命名ecs_2280neo_22101。- 温度和状态值为示例格式,字段名来自你提供的物模型定义。
9. RPC
9.1 RPC 名称
已提供的 RPC 名称包括:
ecs_2280neo_22101_setecs_2280neo_22101_get。
9.2 参数定义
typescript
let paraDef= {
app_70: {name: "period_up", field_name: "period_up", unit: "s", type: "uint32LE"},
app_74: {name: "period_read", field_name: "period_read", unit: "s", type: "uint32LE"},
app_110: {name: "cov_temp_refrigerator", field_name: "cov_refrigerator_temp", unit: "℃", type: "int16BE",coefficient:0.1,decimal:1},
app_112: {name: "cov_temp_defrost", field_name: "cov_temp_defrost", unit: "℃", type: "int16BE",coefficient:0.1,decimal:1},
app_114: {name: "cov_status", field_name: "cov_status", unit: "", type: "uint32BE"},
app_150: {name: "addr", field_name: "addr_modbus", unit: "", type: "uint8"}
}参数说明:
period_up:上报周期period_read:采集周期cov_temp_refrigerator:冷藏室温度变化上报阈值cov_temp_defrost:融霜温度变化上报阈值cov_status:状态变化上报项addr_modbus:Modbus 地址。
9.3 RPC 代码
设置参数 RPC
typescript
let classMode = (device && device.shared_attrs && device.shared_attrs.class_mode) || "ClassA";
let dnWaitms = classMode === "ClassA" ? 0 : 5000;
let paraDef= {
app_70: {name: "period_up", field_name: "period_up", unit: "s", type: "uint32LE"},
app_74: {name: "period_read", field_name: "period_read", unit: "s", type: "uint32LE"},
app_110: {name: "cov_temp_refrigerator", field_name: "cov_refrigerator_temp", unit: "℃", type: "int16BE",coefficient:0.1,decimal:1},
app_112: {name: "cov_temp_defrost", field_name: "cov_temp_defrost", unit: "℃", type: "int16BE",coefficient:0.1,decimal:1},
app_114: {name: "cov_status", field_name: "cov_status", unit: "", type: "uint32BE"},
app_150: {name: "addr", field_name: "addr_modbus", unit: "", type: "uint8"}
}
params.cov_status=1
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=[]
let msgServerAttrs={
sleepTimeMs: 0,
type:"modifyAttrs",
dnMsg: {
server_attrs: {
ecs_2280neo_22101_set: {
counter:0,
ms:Date.now(),
params:params
}
}
}
}
msgQue.push(msgServerAttrs);
let msgPara=RPCHelper.makeMSG({
msgType:Utils.msgType.paras,
device:device,
dnBuffer:dnBuffer,
sleepTime:0,
dnWaitms:dnWaitms
})
msgQue.push(msgPara);
if (classMode==="ClassA") return msgQue
let msgRedo=RPCHelper.makeMSG({
msgType:Utils.msgType.paras,
device:device,
dnBuffer:redoBuffer,
sleepTime:0,
dnWaitms:dnWaitms
})
msgQue.push(msgRedo);
return msgQue读取参数 RPC
typescript
let classMode = (device && device.shared_attrs && device.shared_attrs.class_mode) || "ClassA";
let dnWaitms = classMode === "ClassA" ? 0 : 5000;
let paraDef= {
app_70: {name: "period_up", field_name: "period_up", unit: "s", type: "uint32LE"},
app_74: {name: "period_read", field_name: "period_read", unit: "s", type: "uint32LE"},
app_110: {name: "cov_temp_refrigerator", field_name: "cov_refrigerator_temp", unit: "℃", type: "int16BE",coefficient:0.1,decimal:1},
app_112: {name: "cov_temp_defrost", field_name: "cov_temp_defrost", unit: "℃", type: "int16BE",coefficient:0.1,decimal:1},
app_114: {name: "cov_status", field_name: "cov_status", unit: "", type: "uint32BE"},
app_150: {name: "addr", field_name: "addr_modbus", 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=[]
let msgServerAttrs={
sleepTimeMs: 0,
type:"modifyAttrs",
dnMsg: {
server_attrs: {
ecs_2280neo_22101_set: {
counter:0,
ms:Date.now(),
params:params
}
}
}
}
msgQue.push(msgServerAttrs);
let msgPara=RPCHelper.makeMSG({
msgType:Utils.msgType.paras,
device:device,
dnBuffer:dnBuffer,
sleepTime:0,
dnWaitms:dnWaitms
})
msgQue.push(msgPara);
if (classMode==="ClassA") return msgQue
let msgRedo=RPCHelper.makeMSG({
msgType:Utils.msgType.paras,
device:device,
dnBuffer:redoBuffer,
sleepTime:0,
dnWaitms:dnWaitms
})
msgQue.push(msgRedo);
return msgQue10. 模板选择
在 ThinkLink 平台中搜索模板:
ECS-2280NEO
或按业务类型查找:
22101(精创 ECS-2280NEO 温控器)。