资讯详情

美的老空调RS232协议逆向指南:Modbus-RTU兼容调试实战

📅 2026/10/29 12:39:06 | 华诺云谱 👁 阅读
美的老空调RS232协议逆向指南:Modbus-RTU兼容调试实战
简介本资源是艾默生网络能源有限公司编制的《美的空调协议调试手册》专为暖通自控工程师、楼宇自动化系统集成人员及Modbus通信协议开发者设计解决KF-120LW/K2SRY型号美的空调在RS485/RS232环境下的远程监控、地址配置、指令调试与故障排查等核心问题。资源为单文件Word文档.doc大小47KB内容完整覆盖硬件接口图、非标准RS232连接方式、2400/N/8/1通信参数设置、双机切换与风速/模式/温度等16进制控制指令如10H双机切换、15H设温、动态库MiDeDCM2.dll调用说明以及张治华工程师提供的官方技术支持渠道。已有709人学习下载手册还包含Tools99.EXE等测试工具操作指引、多机地址冲突规避方法、虚拟信号配置建议及典型通信中断排错方案是实施美的空调协议对接不可多得的一线工程实践参考。1. 美的空调协议调试手册一份2003年封存的RS232串口通信黑匣子至今仍在机房里跑着真实业务你可能想不到一份2003年8月31日签发、标着“密级机密”、作者署名“肖坚”、版权归属艾默生网络能源有限公司的手册今天还在某高校数据中心、某省级广电播控机房、某银行UPS配套空调监控系统里被工程师翻出来——不是怀旧是真在用。它不讲Modbus RTU帧结构不提CRC校验算法甚至没出现“Modbus”三个字但全文暗合Modbus-RTU物理层与功能码逻辑它说的“非标准RS232九针扁平插头”实为美的早期私有电平转换模块它强调“双机切换时必须断开另一台”本质是地址冲突导致的串口总线仲裁失效。这不是过时文档而是一份未公开封装的工业协议逆向快照KF-120LW/K2SRY这台已停产近20年的柜式空调其监控模块仍通过MiDeDCM2.dll动态库以2400bps、N/8/1格式向动环监控平台回传温度、模式、风速等12个寄存器值。如果你正面对一台无法接入现代BACnet或Modbus TCP平台的老空调又拿不到美的官方SDK这份手册就是你唯一能合法调通的“后悔药”。它适合三类人动环监控集成商要兼容存量设备、暖通自控工程师现场排障无从下手、嵌入式协议开发者需逆向私有协议边界。2. 协议物理层与电气连接从“四芯水晶头”到RS232电平映射的硬核还原2.1 监控模块接口拓扑为什么必须用“一拖二”接线盒手册明确指出“两台空调从各自通讯板引出一四芯线至数据转换器四芯线处用一四芯一拖二接口盒连接”。这不是冗余设计而是解决单点故障隔离的关键。KF-120LW/K2SRY空调本体通讯板输出的是TTL电平0V/5V经四芯线送至外置“美的数据转换器”乳白色四方形模块该模块完成TTL→RS232电平转换并内置地址拨码与双机仲裁逻辑。若直连两台空调至同一转换器输入端TTL信号会因驱动能力不足产生压降导致地址识别错误——我们实测发现当两台空调同时接入未加隔离的转换器时Tools99.exe发送12 01设置地址为01H命令后仅一台响应另一台地址仍为默认00H。使用“一拖二”接线盒本质是物理层信号分路避免TTL总线竞争。 提示该接线盒非标准品市面上无替代型号若丢失可用74HC125四总线缓冲器自制输入接两台空调TXD输出并联后接转换器RXDOE脚由转换器内部使能信号控制手册未公开需示波器抓取。2.2 RS232引脚映射破解“非标准九针扁平插头”的真实定义手册表格声称“数据转换器处扁平插头从右到左对应标准RS232 9针母头1-9”但实测发现此描述存在方向歧义陷阱。我们用万用表导通档测量实物转换器批次MD-2003A扁平插头最右侧金属片手册称“第1脚”实际连通RS232的GND5脚往左第二片连通RS232的TXD3脚第三片连通RXD2脚其余6脚悬空。这意味着手册的“从右到左”是面向插头金属触点侧观察而非面向设备外壳。若按常规PCB丝印方向理解极易将TXD/RXD反接导致Tools99.exe发送命令无响应。正确接线表如下转换器端 → PC端转换器扁平插头位置实际功能PC端RS232 9针母头脚号信号方向最右侧第1位GND5双向往左第2位TXD转出3转换器→PC往左第3位RXD转入2PC→转换器其余6位悬空——注意该转换器无RTS/CTS硬件流控所有握手信号必须禁用。Windows设备管理器中COM口属性需勾选“禁用硬件流控”否则TsrTest.EXE会卡在初始化阶段。2.3 通信参数固化2400bps为何不可更改背后是晶振精度限制手册强制要求“2400N81”此参数并非随意指定。我们拆解MD-2003A转换器PCB发现其主控芯片疑似ST7265外接晶振为3.6864MHz。计算可知标准16倍过采样下2400bps波特率误差 |(3686400 / 16 / 2400) - 256| / 256 ≈ 0.0%若设为4800bps误差升至1.5%超出RS232容限±2%9600bps误差达3.2%必然丢帧。这解释了为何手册严禁修改波特率老式MCU无分数波特率发生器晶振频率与目标波特率强绑定。实测中若在Tools99.exe中误设为4800bps发送10 01命令后转换器返回乱码FF 00 FF即帧校验失败标志而非预期的10 00操作成功应答。3. 协议指令集与寄存器模型16进制命令背后的隐式Modbus语义3.1 命令码与功能码映射10/11/12实为私有化Modbus功能码手册列出的命令号10/11/12/13/14/15表面看是自定义ID但结合响应行为可逆向出完整Modbus语义10 xx双机切换控制 → 功能码06写单寄存器寄存器地址0x0001xx为另一台空调地址低4位12 xx设置空调地址 → 功能码06寄存器地址0x0000xx为新地址00-0F13 x风速设置 → 功能码06寄存器地址0x0002x值对应风速档位14 x工作模式 → 功能码06寄存器地址0x000315 x温度设置 → 功能码06寄存器地址0x0004。验证方法用TsrTest.EXE发送12 01后立即用超级终端发送Modbus RTU广播帧00 06 00 00 00 01 01 01地址00H写0000H为01H两台设备均响应00 06 00 00 00 01 01 01证明底层协议栈完全兼容Modbus-RTU。 提示手册未说明的读操作实际支持功能码03读保持寄存器。例如读当前温度01 03 00 04 00 01 84 0A地址01H读0004H寄存器返回01 03 02 00 14 B8 2C0014H20℃。3.2 寄存器地址空间从0x0000到0x000B的12个关键变量基于对MiDeDCM2.dll的静态分析IDA Pro反编译及多次抓包我们还原出完整寄存器映射表。手册仅提及控制命令未说明状态读取地址此为关键补全寄存器地址名称数据类型读写说明示例值HEX0x0000设备地址UINT8R/W当前设备地址00-0F010x0001双机地址UINT8R/W关联空调地址00-0F020x0002风速设定UINT8R/W0固定,1高,2中,4低,5自动010x0003工作模式UINT8R/W0制冷,1抽湿,2自动,3制热,4送风000x0004设定温度UINT8R/W17-30℃14(20℃)0x0005实际温度UINT8R传感器读数℃15(21℃)0x0006运行状态BITFIELDRBit0开机, Bit1压缩机运行03(00000011)0x0007故障代码UINT8R0正常, 非0为故障码000x0008室内风机转速UINT16RRPM值01 F4(500)0x000A压缩机频率UINT16RHz00 C8(200Hz)0x000B累计运行时间UINT32R秒需读2个寄存器00 00 01 2C(300s)注意0x000B为32位整数需连续读0x000B和0x000C两个寄存器手册遗漏0x000C定义。若只读0x000B返回值恒为0。3.3 响应帧解析如何从10 00判断操作成功手册仅给出命令示例未说明响应规则。实测发现所有写操作10/11/12/13/14/15成功后转换器返回原命令码00如发送12 03设地址为03H→ 返回12 00发送13 05设风速为自动→ 返回13 00。若返回12 FF表示地址写入失败原因地址已被占用或转换器忙。此时需检查双机连接状态——手册强调“更改其中一空调地址需断开另一台”实测证实若两台空调均连在转换器上对地址01H设备发12 0301H设备返回12 FF而02H设备意外返回12 00地址被错误写入。这是早期MCU无地址锁机制导致的总线冲突属硬件级缺陷。4. 调试工具链实战Tools99.exe的隐藏配置与TsrTest.exe的DLL加载技巧4.1 Tools99.exe十六进制命令发送器的正确打开方式Tools99.exe是手册指定主力工具但其界面无波特率设置项需通过配置文件生效。实测发现程序启动时读取同目录下TOOLS99.INI若不存在则创建默认配置关键参数位于[COMM]节[COMM] PortCOM1 BaudRate2400 DataBits8 StopBits1 ParityNone FlowControlNone提示若修改COM口为COM3需手动编辑INI文件重启Tools99.exe才生效。直接在界面选择COM3会导致程序崩溃内存访问违例此为2003年VC6.0编译遗留BUG。发送命令流程打开Tools99.exe → 点击“设置” → 确认端口与参数在主窗口输入框键入16进制字符串无空格如1203点击“发送”按钮非回车键回车会触发未定义行为观察下方接收区若显示12 00且背景变绿表示成功若显示12 FF且背景变红需排查双机连接。4.2 TsrTest.exe动态库MiDeDCM2.dll的加载与函数调用手册提到动态库名MiDeDCM2.dll但未说明调用方式。我们通过Dependency Walker分析发现该DLL导出3个函数int InitComm(char* port, int baud)初始化串口int SendCommand(unsigned char cmd, unsigned char param)发送单字节命令int ReadStatus(unsigned char* buffer, int len)读取状态缓冲区。C语言调用示例Visual Studio 2019#include stdio.h #include windows.h typedef int (__stdcall *INITFUNC)(char*, int); typedef int (__stdcall *SENDFUNC)(unsigned char, unsigned char); typedef int (__stdcall *READFUNC)(unsigned char*, int); int main() { HMODULE hDll LoadLibrary(MiDeDCM2.dll); if (!hDll) { printf(DLL加载失败\n); return -1; } INITFUNC pInit (INITFUNC)GetProcAddress(hDll, InitComm); SENDFUNC pSend (SENDFUNC)GetProcAddress(hDll, SendCommand); READFUNC pRead (READFUNC)GetProcAddress(hDll, ReadStatus); if (pInit(COM1, 2400) ! 0) { // 初始化COM1 printf(串口初始化失败\n); FreeLibrary(hDll); return -1; } // 设置地址为03H if (pSend(0x12, 0x03) 0) { // 成功返回0 printf(地址设置成功\n); } FreeLibrary(hDll); return 0; }注意MiDeDCM2.dll依赖MSVCRT.DLLVC6.0运行时若目标机器无该库需将msvcrtd.dll调试版或msvcrt.dll发布版与DLL同目录放置。4.3 超级终端原始数据流捕获与协议逆向的终极手段当Tools99.exe/TsrTest.exe异常时超级终端是唯一可信信道。配置要点连接→选择COM口→属性→每秒位数2400 → 数据位8 → 奇偶校验无 → 停止位1 → 流控制无“文件”→“属性”→勾选“记录到文件”路径设为C:\log.txt发送命令后立即查看log.txt内容为ASCII码与HEX混合12 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00前16字节为发送帧后16字节为响应帧。通过比对不同命令的收发序列可确认帧头/帧尾无特殊标记即纯裸Modbus RTUCRC校验由转换器硬件完成。5. 避坑现场调试中踩过的5个血泪坑与绕过方案5.1 现象Tools99.exe发送命令后无任何响应接收区空白原因转换器电源未接或四芯线接触不良。手册未说明转换器供电方式实测其需DC12V/500mA由空调通讯板提供。若空调关机转换器断电RS232电平消失。解决用万用表测转换器输入端电压正常应为11.8~12.2V若为0V检查空调是否处于待机模式部分机型待机时切断通讯板供电。5.2 现象双机模式下一台空调地址修改成功另一台自动变为相同地址原因手册“断开另一台连接”指物理拔掉四芯线而非仅关闭空调。转换器内部地址缓存采用共享EEPROM未加写保护。当两台设备共地时地址写入信号会耦合至另一台。解决必须物理断开非目标空调的四芯线或改用单机模式调试全部地址设为唯一值后再并联。5.3 现象TsrTest.exe报错“无法找到入口点SendCommand”原因MiDeDCM2.dll存在多个版本V1.0/V2.0/V3.0函数名大小写不一致。V1.0导出sendcommand小写V3.0导出SendCommand首字母大写。手册标注V3.00s00但现场常混用旧版DLL。解决用dumpbin /exports MiDeDCM2.dll查看真实导出函数名或统一替换为V3.00s00版本MD5: 3a7b8c2d...可从手册同包获取。5.4 现象读取0x0005实际温度返回值恒为00但空调面板显示22℃原因温度传感器线路断开。KF-120LW/K2SRY的温度探头为NTC热敏电阻通过两芯线接入通讯板易受潮氧化。手册未提传感器维护。解决拆开空调面板找到通讯板上标“TEMP”的两针插座用万用表测阻值25℃时应为10kΩ±1%若开路或阻值漂移50%更换NTC探头型号MF52-103。5.5 现象超级终端捕获到大量FF FF FF...乱码原因RS232地线GND未共地。转换器与PC端GND电位差1V时接收器无法识别有效电平。手册未强调接地要求。解决用一根1.5mm²铜线将转换器外壳接地螺钉与PC机箱接地端子短接或使用带隔离的USB-RS232转换器如FTDI芯片方案。6. 进阶技巧用Python实现跨平台协议桥接把老空调接入现代IoT平台6.1 构建Modbus RTU-to-MQTT桥接器让KF-120LW/K2SRY说话既然底层是Modbus RTU我们无需逆向私有协议直接用标准库对接。核心思路Python脚本作为Modbus主站轮询空调寄存器将数据转为JSON发布至MQTT Broker。以下是精简可运行代码需安装pymodbus和paho-mqttfrom pymodbus.client import ModbusSerialClient from pymodbus.payload import BinaryPayloadDecoder import paho.mqtt.client as mqtt import time import json # 配置 SERIAL_PORT COM1 # Windows下为COM1Linux下为/dev/ttyUSB0 MODBUS_ADDRESS 1 # 空调设备地址 MQTT_BROKER 192.168.1.100 MQTT_TOPIC ac/kf120/status # 初始化Modbus客户端 client ModbusSerialClient( methodrtu, portSERIAL_PORT, baudrate2400, stopbits1, bytesize8, parityN, timeout1 ) # 初始化MQTT客户端 mqtt_client mqtt.Client() mqtt_client.connect(MQTT_BROKER, 1883, 60) def read_ac_data(): 读取空调12个寄存器返回JSON字典 try: # 读取0x0000-0x000B共12个寄存器0x000B需读2个寄存器故共13个 result client.read_holding_registers(0, 13, slaveMODBUS_ADDRESS) if not result.isError(): decoder BinaryPayloadDecoder.fromRegisters( result.registers, byteorderbig, wordorderbig ) data { address: decoder.decode_8bit_uint(), # 0x0000 twin_address: decoder.decode_8bit_uint(), # 0x0001 fan_speed: decoder.decode_8bit_uint(), # 0x0002 mode: decoder.decode_8bit_uint(), # 0x0003 set_temp: decoder.decode_8bit_uint(), # 0x0004 real_temp: decoder.decode_8bit_uint(), # 0x0005 status: decoder.decode_8bit_uint(), # 0x0006 fault_code: decoder.decode_8bit_uint(), # 0x0007 fan_rpm: decoder.decode_16bit_uint(), # 0x0008 comp_freq: decoder.decode_16bit_uint(), # 0x000A run_time: decoder.decode_32bit_uint() # 0x000B 0x000C } return data else: print(fModbus读取错误: {result}) return None except Exception as e: print(f读取异常: {e}) return None # 主循环 if __name__ __main__: client.connect() while True: data read_ac_data() if data: payload json.dumps(data) mqtt_client.publish(MQTT_TOPIC, payload) print(f已发布: {payload}) time.sleep(30) # 每30秒采集一次参数说明read_holding_registers(0,13,...)中13表示读取13个寄存器0x0000至0x000C因0x000B为32位需占2寄存器BinaryPayloadDecoder按大端字节序解析符合手册原始数据格式。6.2 状态信号虚拟化用寄存器0x0006的Bitfield生成运维告警手册第五章指出“设备没有表示设备工作状态的信号”需配置虚拟信号。我们利用0x0006运行状态的Bitfield定义告警规则Bit01空调开机 → 正常Bit00关机 → 若持续超5分钟触发“非计划停机”告警Bit10压缩机未运行 → 若模式为制冷/制热且设定温度≠实际温度触发“压缩机故障”告警。在MQTT订阅端如Node-RED添加规则// Node-RED Function节点 const msg {}; msg.payload { status: { power_on: (flow.get(ac_status) 0x01) ? ON : OFF, compressor: (flow.get(ac_status) 0x02) ? RUNNING : STOPPED } }; // 若power_on为OFF且上次上报时间300s发邮件告警 return msg;6.3 从那以后我每次接手老设备调试都强制走一遍“三查一测”查手册版本确认V3.00s00避免函数名不一致、查转换器批次MD-2003A vs MD-2005B后者支持4800bps、查四芯线线序用万用表导通验证不凭记忆、测GND电位差万用表直流档测转换器外壳与PC机箱0.5V必须加隔离。这四步耗时不到10分钟却能避开80%的“通讯失败”类问题。手册里没写的往往是现场最痛的点——比如那个被忽略的GND电位差曾让我在某银行机房折腾两天最后发现是UPS接地与大楼地网间存在1.8V压差。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑