XC-227+ Disinfection Cabinet Temperature Controller Integration (22111)
1. Sensor Overview
| Item | Value |
|---|---|
| Device | XC-227+ Disinfection Cabinet Temperature Controller |
| Vendor | Xuzhou Ringder Electric Co., Ltd. |
| Model | XC-227+ |
| Protocol | Modbus-RTU (RS-485, 9600/8N1) |
| Business Code | 22111 |
| Connection | EdgeBus KC11 mains DTU |
| Template | XC227-22111 |
The XC-227+ controls high-temperature disinfection cabinets. It drives heater and fan relays, reports cabinet temperature, and supports remote power on/off, start/stop, and read/write of temperature-control parameters (stop temp / upper / lower / hysteresis / calibration). A probe fault returns the marker value 0x5050.
2. Features
- Standard Modbus-RTU over RS-485 at 9600bps — connects to the ManThink KC11 DTU directly.
- Dual relay control (heater + fan) with readable heating/fan status.
- Full temperature-control parameter set: St stop temp, F01 upper, F02 lower, F03 hysteresis, F04 calibration — all remotely read/write.
- Probe self-check: a faulty/disabled probe returns 0x5050 so the upper layer can null the reading.
- Independent power and start/stop control bits using 0xFF00/0x0000.
3. Applicable Scenarios
- Compliance monitoring of disinfection cabinets in restaurant/canteen kitchens.
- Traceability and alarming for instrument sterilization in clinics and labs.
- Centralized control of chain-store cabinets — remote power and parameter push.
4. Gateway (DTU) Information
4.1 Hardware
| Item | Value |
|---|---|
| DTU Model | KC11 (mains, DIN rail) |
| Interface | RS-485 |
| Power | AC 85–270V |
| LoRaWAN Class | Class C (always online) |
4.2 Wiring
| Controller Pin | Signal | To KC11 |
|---|---|---|
| 485A | RS-485 A | KC11 485A |
| 485B | RS-485 B | KC11 485B |
KC11 is powered from AC L/N (85–270V). Short the 120Ω terminating resistor to 485A at the bus end when needed.
5. Data Acquisition
The solution polls Modbus-RTU by function code:
- FC04 read sensor data: cabinet probe temperature (0x0000)
- FC01 read status: heater/fan relay, power, heating, fan status (0x0000–0x0004)
- FC02 read alarm: cabinet probe fault (0x0000)
5.1 Register Definitions
Sensor data (FC04, signed integer)
| Address | Item | Type | Coefficient | Notes |
|---|---|---|---|---|
| 0x0000 | Cabinet probe temperature | int16BE | ÷10 | Fault/disabled = 0x5050 |
System parameters (FC03 read / FC06·FC10 write, signed integer °C, no scaling)
| Address | Param | Range | Default | Step |
|---|---|---|---|---|
| 0x0000 | St stop temp | F02~F01 | 90 | 5 |
| 0x0001 | F01 upper limit | St~150 | 90 | 5 |
| 0x0002 | F02 lower limit | -10~St | 0 | 5 |
| 0x0003 | F03 hysteresis | 0~20 | 5 | 1 |
| 0x0004 | F04 calibration | -20~20 | 0 | 1 |
Control commands (FC05, 2-byte unsigned)
| Address | Item | ON | OFF |
|---|---|---|---|
| 0x0000 | Power on/off | 0xFF00 on | 0x0000 off |
| 0x0001 | Start/stop | 0xFF00 start | 0x0000 stop |
5.2 Status Bits
Status (FC01, bit, low bit = low address)
| Address | Item | Notes |
|---|---|---|
| 0x0000 | Heater relay | 0 open / 1 closed |
| 0x0001 | Fan relay | 0 open / 1 closed |
| 0x0002 | Power status | 0 off / 1 on |
| 0x0003 | Heating status | 0 no / 1 yes |
| 0x0004 | Fan status | 0 no / 1 yes |
Alarm (FC02, bit)
| Address | Item | Notes |
|---|---|---|
| 0x0000 | Probe fault | 0 normal / 1 alarm |
6. EdgeBus Model
6.1 EB Configuration
| Item | Value |
|---|---|
| name | xc227 |
| port | 22 |
| version | 0x87 |
| dataType | 0x10 |
| upPeriodIndex | 70 |
| Serial | 9600 / 8 / 1 / NONE |
| BzType | 22111 |
| BzVersion | 1 |
| SwVersion | 31 |
| Battery | false (Class C) |
6.2 EB Code
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: "xc227", port: 22, version: "0x87", dataType: "0x10", upPeriodIndex: 70,
quInfo: [
{ protocol: "modbus", addr: "0x01", code: "0x04", periodIndex: 70,
indexAPP: 150, indexCMD: 0, copySize: 1, isLast: false,
listVal: [ { start: "0x0000", end: "0x0000" } ] },
{ protocol: "modbus", addr: "0x01", code: "0x02", periodIndex: 70,
indexAPP: 150, indexCMD: 0, copySize: 1, isLast: false,
listVal: [ { start: "0x0000", end: "0x0000", covType: "HEX" } ] },
{ protocol: "modbus", addr: "0x01", code: "0x01", periodIndex: 70,
indexAPP: 150, indexCMD: 0, copySize: 1, isLast: true,
listVal: [ { start: "0x0000", end: "0x0004", covType: "HEX" } ] }
]
}
];
let otaConfig = getOtaConfig({
SwVersion: 31, BaudRate: 9600, StopBits: 1, DataBits: 8,
Checkbit: CheckbitEnum.NONE, Battery: false, ConfirmDuty: 60,
BzType: 22111, 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(import.meta.url, otaConfig, MODBUS_TT);6.3 Notes
- The EB code has 1 uplink event + 3 query events, polled in order: FC04 temperature → FC02 probe fault → FC01 five status bits (the last query with
isLast:truetriggers the uplink). - COV is disabled;
upPeriodIndexandperiodIndexare both 70, so collect and upload share one period parameter (default 300s). - Uplink frame is 10 bytes:
[0]=0x87 [1]=0x10 [2]=cov [3]=status [4]=ds [5]=addr [6-7]=temp(int16BE÷10) [8]=alarm byte [9]=status byte. - The Modbus slave address is injected from DTU app_150 (default 1).
7. Thing Model
7.1 Basic Info
| Type | Name | id Name |
|---|---|---|
| Telemetry | [XC227] | xc227_22111 |
| Parameter | [XC227-PARA] | xc227_para_22111 |
7.2 Uplink Frame Structure
frameInfo: port 22, dataLen 10, rssi true, battery index 4, tagList [{0:0x87},{1:0x10}].
| index | field_name | type | Notes |
|---|---|---|---|
| 6 | cabinet_temp | int16BE ÷10 | Cabinet temp °C |
| 8 | probe_fault | bitLE0-0 | Probe fault |
| 9 | heat_relay | bitLE0-0 | Heater relay |
| 9 | fan_relay | bitLE1-1 | Fan relay |
| 9 | power_status | bitLE2-2 | Power status |
| 9 | heating_status | bitLE3-3 | Heating status |
| 9 | fan_status | bitLE4-4 | Fan status |
When the cabinet temperature reads 0x5050 (probe fault), it is set to null.
7.3 Scripts
See project files thinklink/thingModel/xc227_22111.js and xc227_para_22111.js.
8. Third-Party Data Subscription
8.1 MQTT Topic
/v32/{Organization Account}/tkl/up/telemetry/{eui}
8.2 Example Payload
{
"eui": "6353012af10a9331",
"active_time": "2026-06-01T08:35:48.000Z",
"thingModelId": "22111",
"thingModelIdName": "xc227_22111",
"telemetry_data": {
"snr": 13.5,
"rssi": -51,
"cabinet_temp": 98.5,
"power_status": 1,
"heating_status": 1,
"fan_status": 0,
"heat_relay": 1,
"fan_relay": 0,
"probe_fault": 0
}
}9. RPC
9.1 RPC Names
| Type | Name | id Name |
|---|---|---|
| Set | [XC227 SET] 22111 | xc227_set_22111 |
| Get | [XC227 GET] 22111 | xc227_get_22111 |
| Action | [XC227 ACT] 22111 | xc227_action_22111 |
9.2 Parameter Definitions
DTU app parameters (Set/Get RPC, port 214)
| Slot | Name | field_name | Unit | Type | Notes |
|---|---|---|---|---|---|
| app_70 | Upload/collect period | period_up | s | uint32LE | 1–3600, DTU poll & upload interval |
| app_150 | Modbus address | addr_modbus | — | uint8 | 1–199, target slave address |
Device control / temperature parameters (Action RPC, transparent FC05/FC06)
| field_name | Register | Type | Notes |
|---|---|---|---|
| power_cmd | FC05 0x0000 | bool | Power: true=on / false=off |
| run_cmd | FC05 0x0001 | bool | Start/stop: true=start / false=stop |
| stop_temp | FC06 0x0000 | int16 | St stop temp |
| temp_upper | FC06 0x0001 | int16 | F01 upper limit |
| temp_lower | FC06 0x0002 | int16 | F02 lower limit (signed, two's complement) |
| temp_diff | FC06 0x0003 | int16 | F03 hysteresis |
| temp_calib | FC06 0x0004 | int16 | F04 calibration (signed) |
The Action RPC sends one parameter per invocation; the echo frame is verified over the transparent channel (port 51), then telemetry/shared are synced and the form is back-filled.
9.3 RPC Code
See thinklink/rpc/xc227_set_22111.js, xc227_get_22111.js, xc227_action_22111.js.
10. Template Selection
Search the ThinkLink platform for:
- XC227-22111
or by business type:
- 22111 / Disinfection cabinet temperature controller
11. Notes
- The communication address can only be set on the controller panel, range 1–199, default 1.
- Cabinet temperature is a signed integer; divide by 10 for the actual value. A faulty/disabled probe reads a fixed 0x5050.
- Temperature parameters (St/F01/F02/F03/F04) are raw integer °C with no ÷10; F02 and F04 may be negative (two's complement).
- Power and start/stop control values are 0xFF00 (ON) / 0x0000 (OFF), not 0x0001.
- The alarm trigger
xc227_trigger_22111raises an immediate probe-fault alarm; high/low temperature alarms compare the cabinet temperature against F01/F02 with 0.5°C hysteresis. Configure the notification group on the device before use.