Skip to content

1. 传感器简介

模型清单

可使用下列名称或 ID 在 ThinkLink 中搜索对应模型。

模型类型名称id_name平台模型 ID
RPC[ECS-2280NEO GET] paraecs_2280neo_22101_get80536120831512581
RPC[ECS-2280NEO SET] paraecs_2280neo_22101_set79888011143155717
TemplateECS-2280NEO80533446350344197
Thing Model[ECS-2280NEO]ecs_2280neo_2210179886859227893765
Thing Model[ELITECH-22101-ECS-2280NEO资产] 区域聚合ecs_2280neo_asset_22101119677174411063308
Parameter Thing Model[ECS-2280NEO-PARA]ecs_2280neo_para_2210190829990110695429

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)数据类型说明
冷藏室温度032560x0100int16冷藏室温度,系数 0.1
融霜温度032570x0101int16融霜温度,系数 0.1
控制器状态015120x0200bit0=关,1=开
库温度探头故障(P1)015200x0208bit0=无,1=有
融霜探头故障(P2)015210x0209bit0=无,1=有
高温报警015240x020Cbit0=无,1=有
低温报警015250x020Dbit0=无,1=有
融霜状态015350x0217bit0=关,1=开
开门报警015360x0218bit0=无,1=有
风机状态015390x021Bbit0=关,1=开
制冷状态(压缩机状态)015420x021Ebit0=关,1=开
门状态03100x000Abit0=关,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 逻辑说明:

  1. 设备上行端口为 22
  2. 业务帧头使用:
    • version = 0x86
    • dataType = 0x01
  3. 通过 03 功能码 分别读取:
    • 256:冷藏室温度
    • 257:融霜温度
  4. 通过 01 功能码 读取一段状态区块,命令为:
    • 01 01 02 00 00 1F 39 51
    • 起始地址为 0x0200
    • 读取数量为 0x001F
  5. 01 功能码返回后,EB 将状态数据中的第 3~6 字节按 Uint32LE 写入
  6. 物模型再从该 32 位状态字中拆出:
    • 阀状态
    • 风机状态
    • 融霜状态
  7. upPeriodIndex:70 表示上报周期参数位;periodIndex:74 表示采集周期参数位。
  8. 110: 冷藏室温度阈值 ; 112: 融霜温度阈值 ,114: 状态变化阈值
  9. 参数上报/参数应答端口为 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: 22
  • dataLen: 14
  • rssi: true
  • battery: 4
  • 标签位:
    • index 0 = 0x86
    • index 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
    }
}

说明:

  • thingModelIdeui 未在你提供的资料中出现,因此这里保留为平台实际值。
  • thingModelIdName 建议使用统一后的业务命名 ecs_2280neo_22101
  • 温度和状态值为示例格式,字段名来自你提供的物模型定义。

9. RPC

9.1 RPC 名称

已提供的 RPC 名称包括:

  • ecs_2280neo_22101_set
  • ecs_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 msgQue

10. 模板选择

在 ThinkLink 平台中搜索模板:
ECS-2280NEO

或按业务类型查找:
22101(精创 ECS-2280NEO 温控器)