Skip to content

1. 传感器简介

模型清单

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

模型类型名称id_name平台模型 ID
RPC[SJ101CX GET] parasj101cx_21307_get88308771574517765
RPC[SJ101CX SET] parasj101cx_21307_set88308422692311045
TemplateSJ101CX88309182834413573
Thing Model[SJ101CX]sj101cx_2130788304368717139973
Thing Model[SJ-21307-SJ101CX资产] 区域聚合sj101cx_asset_21307119677174411063302

SJ-101CX 是一款三江衡器开发的数字称重变送模块,用于将称重传感器输出的模拟信号进行放大、处理并转换为数字重量数据,通过 RS485 接口输出,适合对接称重平台、料斗秤、工业称重系统等场景。

本文档面向 ThinkLink + EdgeBus 对接场景,整理了 SJ101CX 的硬件信息、寄存器信息、EdgeBus 配置、ThinkLink 物模型及 RPC 配置,可直接用于平台接入与发布。


2. 产品特点

  • RS485 接口,支持远距离通信
  • 支持标准 Modbus-RTU 协议
  • 默认串口参数:9600,8N1
  • 支持重量、精度、状态读取
  • 支持地址、波特率等参数配置
  • 支持 EdgeBus 快速接入 ThinkLink 平台

3. 适用范围

  • 工业称重采集
  • 平台秤、料斗秤数据采集
  • 无线称重采集系统
  • LoRaWAN 边缘采集与云平台接入

4. 对接信息

4.1 硬件信息

  • 产品资料:SJ101CX_V1.02.pdf
  • 设备型号:SJ-101CX
  • 通信接口:RS485
  • 通信协议:Modbus-RTU
  • 默认 RS485 地址:0x01 (可通过拨码开关进行设置)
  • 默认波特率:9600
  • 串口格式:8N1
  • 供电方式:DC 12~24V ,通过KC21 给设备供电
  • 使用温度:0~40℃
  • 储运温度:-25~55℃

4.2 接线信息

电源与通讯接口

  • V+:电源正
  • V-:电源负
  • A+:RS485 A
  • B-:RS485 B

传感器接口

  • E+:传感器电源正
  • E-:传感器电源负
  • S+:传感器信号正
  • S-:传感器信号负
  • SH:屏蔽线

5. 数据采集

本方案中,通过 Modbus 读取以下寄存器:

  • 0x0000 ~ 0x0001:重量值
  • 0x0002 ~ 0x0003:精度与状态

5.1 寄存器定义

状态寄存器地址寄存器功能数据类型说明
只读0x0000~0x0001当前重量值32 位有符号整型当前重量原始值
只读0x0002精度16 位无符号整型精度位,0/1/2/3 分别表示 1、0.1、0.01、0.001
只读0x0003状态16 位无符号整型状态位 bit0~bit5
0x0004清零16 位无符号整型写 1 执行清零
读写0x0009波特率16 位无符号整型0:9600,1:14400,2:19200,3:38400,4:115200
读写0x000B从机地址16 位无符号整型范围 1~99,默认 1
0x000C通讯参数生效16 位无符号整型写 1 生效
读写0x001BAD 采样速率16 位无符号整型0:10Hz,1:40Hz
读写0x003A保存用户数据16 位无符号整型保存配置
只读0x003B当前版本16 位无符号整型固件版本号

5.2 状态位定义

Bit 位含义01
bit0称重稳定性unstablestable
bit1零点状态non-zerozero
bit2超重状态normaloverload
bit3按键触发no keykey triggered
bit4开机零点has zerono zero
bit5称重有效性invalidvalid

6. EdgeBus 模型

6.1 EB 配置参数

配置项
bzType21307
Batterytrue
上行端口22
version0x83
dataType0x39
默认 Modbus 地址0x01
Modbus 功能码0x03
上报周期app 地址 70
采集周期app 地址 74
重量 COVapp 地址 110
从机地址app 地址 150

6.2 EB 代码

typescript
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";
////////////////////////////////////////////////////////////////////////////////////////
const eventInfo:UserConfUPItem[]=[
    {
        name:"sj101cx",port:21,version:"0x85",dataType:"0x04",upPeriodIndex:70,
        quInfo:[
            {
            protocol:"modbus",addr:"0x02",code:"0x03", periodIndex:74,
            indexAPP:150, indexCMD:0, copySize:1,isLast:false,//period:"900s",payIndex:3,ackAddrIndex:0,
            listVal:[
                { start: "0", end: "1" ,covType:"Uint32BE",covAppIndex:110}, //cov:true,covAppIndex:
                { start: "2", end: "3" } //cov:false,covAppIndex:0
                ]
            }
        ]
    }
]
let otaConfig = getOtaConfig({
    SwVersion:31,
    BaudRate: 9600,
    StopBits: 1,
    DataBits: 8,
    Checkbit: CheckbitEnum.NONE,
    Battery: true,
    ConfirmDuty: 60,
    BzType: 21307,
    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 逻辑说明:

  • 使用默认从机地址 0x01
  • 读取寄存器 0x0000 ~ 0x0003
  • 0x0000 ~ 0x0001 解析为 32 位重量值
  • 0x0002 ~ 0x0003 解析为精度与状态
  • 重量值支持 COV,上报阈值使用 app_110
  • 上报周期使用 app_70
  • 采集周期使用 app_74
  • 从机地址参数映射到 app_150

7. 物模型

7.1 物模型基本信息

  • 物模型名称:sj101cx_21307
  • 物模型 ID:88304368717139973

7.2 上行帧结构

  • 端口号:22
  • version:0x83
  • dataType:0x39
字段名偏移长度(Bytes)类型含义说明
version01Uint8协议版本,固定为 0x85
dataType11Uint8固定为 0x04
covStatus21Uint8保留字节
status31Uint8查询事件状态
battery41Uint8电池值
addr51Uint8子设备地址
weight64Int32BE重量值
precision102Uint16BE精度倍率
statusBits122Uint16BE状态位

7.3 修正后的物模型脚本

javascript
let port = msg?.userdata?.port || null;

let frameInfo = {
    port: 22,
    dataLen: -1,
    rssi: true,
    battery: 4,
    tagList: [
        { index: 0, tag: 0x85 },
        { index: 1, tag: 0x04 }
    ]
};

let appInfo = [
    {
        name: "weight",
        field_name: "weight",
        unit: "kg",
        index: 6,
        dataType: "int32BE",
        coefficient: "precision",
        decimal: 2,
        illegal: "=00000000"
    },
    {
        name: "precision",
        field_name: "precision",
        unit: "",
        index: 10,
        coefficient: 1,
        dataType: "uint16BE",
        optionList: {
            0: 1,
            1: 0.1,
            2: 0.01,
            3: 0.001
        }
    },
    {
        name: "status1",
        field_name: "status1",
        unit: "",
        index: 12,
        coefficient: 1,
        dataType: "bitBE0-0",
        optionList: {
            0: "unstable",
            1: "stable"
        }
    },
    {
        name: "status2",
        field_name: "status2",
        unit: "",
        index: 12,
        coefficient: 1,
        dataType: "bitBE5-5",
        optionList: {
            0: "invalid",
            1: "valid"
        }
    }
];

let paraDef = {
    app_38: {
        name: "pwron_delay",
        field_name: "pwron_delay",
        unit: "ms",
        index: 38,
        type: "uint16LE"
    },
    app_70: {
        name: "periodUP",
        field_name: "periodUP",
        unit: "s",
        type: "uint32LE"
    },
    app_74: {
        name: "periodRead",
        field_name: "periodRead",
        unit: "s",
        type: "uint32LE"
    },
    app_110: {
        name: "cov_weight",
        field_name: "cov_weight",
        unit: "kg",
        type: "int16BE",
        coefficient: 0.1,
        decimal: 1
    },
    app_150: {
        name: "addr",
        field_name: "addr",
        unit: "",
        type: "uint8"
    }
};

let pdata = {};
let tdata = {};

let payParser = new PayloadParser({
    device: device,
    msg: msg,
    frameInfo: frameInfo,
    appInfo: appInfo,
    paraInfo: paraDef,
});

if (port === 214) {
    pdata = payParser.paras();
    tdata = null;
} else {
    tdata = payParser.telemetry();
    pdata = null;
}

return {
    telemetry_data: tdata,
    server_attrs: null,
    shared_attrs: pdata
};

8. 第三方平台数据订阅

8.1 MQTT Topic

latex
/v32/{Organization Account}/tkl/up/telemetry/{eui}

8.2 上报示例数据

json
{
    "eui": "6353012af10a9331",
    "active_time": "2026-02-05T08:35:48.000Z",
    "thingModelId": "88304368717139973",
    "thingModelIdName": "sj101cx_21307",
    "telemetry_data": {
        "snr": 13.5,
        "rssi": -51,
        "battery": 3.37,
        "weight": 12.34,
        "precision": 0.01,
        "status1": "stable",
        "status2": "valid"
    }
}

9. RPC

9.1 RPC 名称

sj101cx_21307_get

9.2 参数定义

参数名App 地址单位说明
pwron_delay38ms上电延时,默认1000ms
periodUP70s上报周期
periodRead74s读取周期
cov_weight110kg重量 COV 阈值
addr150-Modbus 从机地址

9.3 修正后的 RPC 代码

javascript
let paraDef = {
    app_38: {
        name: "pwron_delay",
        field_name: "pwron_delay",
        unit: "ms",
        index: 38,
        type: "uint16LE"
    },
    app_70: {
        name: "periodUP",
        field_name: "periodUP",
        unit: "s",
        type: "uint32LE"
    },
    app_74: {
        name: "periodRead",
        field_name: "periodRead",
        unit: "s",
        type: "uint32LE"
    },
    app_110: {
        name: "cov_weight",
        field_name: "cov_weight",
        unit: "kg",
        type: "int16BE",
        coefficient: 0.1,
        decimal: 1
    },
    app_150: {
        name: "addr",
        field_name: "addr",
        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 + redoBuffer.length
);

frames.writeBuffer.copy(dnBuffer, 0);
frames.readBuffer.copy(dnBuffer, frames.writeBuffer.length);
redoBuffer.copy(dnBuffer, frames.writeBuffer.length + frames.readBuffer.length);

logger.info("get/set sj101cx para");

let msg = RPCHelper.makeMSG({
    msgType: Utils.msgType.paras,
    device: device,
    dnBuffer: dnBuffer,
    sleepTime: 0,
});

return [msg];

10. 模板选择

在 ThinkLink 平台中搜索模板:

SJ101CX

或按业务类型查找:

21307