版本:2025年06月 第1.0版
通讯时数据以字(WORD— 2 字节)的形式回送,回送的每个字中,高字节在前,低字节在后,如果2 个字连续回送(如:长整形),则高字在前,低字在后。
| 数据类型 | 寄存器数 | 字节数 | 说明 |
|---|---|---|---|
| 字符型 | 1 | 1 | 一次送回两个字符,不足两个用0补充 |
| 整型 | 1 | 2 | 一次送回,高字节在前,低字节在后 |
| 长整型 | 2 | 4 | 分两个字回送,高字在前,低字在后 |
查询的起始地址和结束地址必须是一个完整数据块的起始地址和结束地址,否则返回的数据不正确。例如:设备序列号的寄存器起始地址是186,长度是12,则查询时起始地址不能在186~198之间,同样结束地址(起始地址+读取的寄存器个数)不能落在这个范围。
| 字节顺序 | 代码 | 示例 | 说明 |
|---|---|---|---|
| 0 | 设备地址 | 01H | 设备地址(1~247) |
| 1 | 03H | 03H | 功能码 |
| 2 | 起始寄存器地址高字节 | 00H | 寄存器地址高8位 |
| 3 | 起始寄存器地址低字节 | 10H | 寄存器地址低8位 |
| 4 | 寄存器个数高字节 | 00H | 寄存器个数高8位 |
| 5 | 寄存器个数低字节 | 02H | 寄存器个数低8位 |
| 6 | CRC16校验高字节 | C0H | CRC16校验高8位 |
| 7 | CRC16校验低字节 | CBH | CRC16校验低8位 |
| 字节顺序 | 代码 | 说明 |
|---|---|---|
| 0 | 设备地址 | 设备地址(1~247) |
| 1 | 03H | 功能码 |
| 2 | 回送数据字节数(N) | N = 请求的寄存器个数*2 |
| 3 | 第1个寄存器数据高字节 | |
| 4 | 第1 个寄存器数据低字节 | |
| ...... | ...... | |
| ...... | ...... | |
| 第N 个寄存器数据高字节 | ||
| 第N 个寄存器数据低字节 | ||
| N+3 | CRC16校验高字节 | CRC之前的字节均要参与校验 |
| N+4 | CRC16校验低字节 |
| 字节顺序 | 代码 | 说明 |
|---|---|---|
| 0 | 设备地址 | 设备地址(1~247) |
| 1 | 03H | 功能码 |
| 2 | 回送数据字节数(N) | N = 请求的寄存器个数*2 |
| 3 | 第1个0 | 总共回送N个0 |
| 4 | 第2个0 | |
| ...... | ...... | |
| ...... | ...... | |
| 第N-1 个0 | ||
| 第N 个0 | ||
| N+3 | CRC16校验高字节 | CRC之前的字节均要参与校验 |
| N+4 | CRC16校验低字节 |
读取市电电压有效值(起始寄存器202)到市电功率平均值的数据,其中市电电压返回230.0v,市电频率返回50.0Hz,市电功率平均值返回1200w
上位机:01 03 00 CA 00 03 25 F5
下位机:01 03 06 08 FC 13 88 04 B0 F7 F3
| 字节顺序 | 代码 | 示例 | 说明 |
|---|---|---|---|
| 0 | 设备地址 | 01H | 设备地址(1~247) |
| 1 | 10H | 10H | 功能码 |
| 2 | 起始寄存器地址高字节 | 01H | 寄存器地址高8位 |
| 3 | 起始寄存器地址低字节 | 10H | 寄存器地址低8位 |
| 4 | 寄存器个数高字节 | 00H | 寄存器个数高8位(恒等于0) |
| 5 | 寄存器个数低字节 | 02H | 寄存器个数低8位 |
| 6 | 待写入的字节数(N) | N = 寄存器个数*2 | |
| 7 | 第1个寄存器数据高字节 | ||
| 8 | 第1个寄存器数据低字节 | ||
| ...... | ...... | ||
| ...... | ...... | ||
| 第N个寄存器数据高字节 | |||
| 第N个寄存器数据低字节 | |||
| N+7 | CRC16校验高字节 | CRC16校验高8位 | |
| N+8 | CRC16校验低字节 | CRC16校验低8位 |
| 字节顺序 | 代码 | 示例 | 说明 |
|---|---|---|---|
| 0 | 设备地址 | 01H | 设备地址(1~247) |
| 1 | 10H | 10H | 功能码 |
| 2 | 起始寄存器地址高字节 | 01H | 寄存器地址高8位 |
| 3 | 起始寄存器地址低字节 | 10H | 寄存器地址低8位 |
| 4 | 寄存器个数高字节 | 00H | 寄存器个数高8位(恒等于0) |
| 5 | 寄存器个数低字节 | 02H | 寄存器个数低8位 |
| 6 | CRC16校验高字节 | 41H | CRC16校验高8位 |
| 7 | CRC16校验低字节 | F1H | CRC16校验低8位 |
| 字节顺序 | 代码 | 说明 |
|---|---|---|
| 0 | 设备地址 | 设备地址(1~247) |
| 1 | 90H | 功能码 |
| 2 | 错误代码 | 错误代码 |
| 3 | CRC16校验高字节 | CRC16校验高8位 |
| 4 | CRC16校验低字节 | CRC16校验低8位 |
| 代码 | 说明 |
|---|---|
| 01H | 操作了只读寄存器 |
| 03H | 写入超过可接受范围的数据 |
| 07H | 当前工作模式不允许修改的寄存器 |
设置输出电压(起始寄存器320)为220v
上位机:01 10 01 40 00 01 02 08 98 BE 3A
下位机:01 10 01 40 00 01 01 E1
R:表示可读即支持03 H 命令。W:表示可写即支持10 H 命令。
Int:整型;Long:长整型;UInt:无符整型;ULong:无符长整型;ASC:ASCII码
Max:取最大值;Min:取最小值
下表中的地址均以十进制表示
| 数据名称 | 单位 | 数据格式 | 起始地址 | 寄存器数 | 读写 | 备注 |
|---|---|---|---|---|---|---|
| 设备故障码 | ULong | 100 | 2 | R | 32位故障代码,每一位对应一个故障码,详见故障代码表,故障码1对应bit1,故障码2对应bit2,以此类推 | |
| 预留 | 102 | 2 | 预留地址 | |||
| 获取无屏蔽处理的警告码 | 104 | 2 | 32位警告代码详见警告码说明 | |||
| 预留 | 106 | 2 | 预留地址 | |||
| 获取屏蔽处理后的警告码 | ULong | 108 | 2 | R/W | 32位警告代码详见警告码说明 | |
| 预留 | 110 | 61 | 预留地址 | |||
| 设备类型 | UInt | 171 | 1 | R | ||
| 设备名称 | ASC | 172 | 12 | R/W | 设备名称,以ASCII码形式写入或读取 | |
| 无效数据 | UInt | 184 | 1 | R | 协议号,本协议返回1 | |
| 预留 | 185 | 1 | 预留地址 | |||
| 设备序列号 | ASC | 186 | 12 | R | ||
| 预留 | 198 | 2 | 预留地址 | |||
| 无效数据 | UInt | 200 | 1 | 内部命令 | ||
| 工作模式 | UInt | 201 | 1 | R | 0:开机模式 1:待机模式 2:市电模式 3:离网模式 4:旁路模式 5:充电模式 6:故障模式 | |
| 市电电压有效值 | 0.1v | Int | 202 | 1 | R | |
| 市电频率 | 0.01Hz | Int | 203 | 1 | R | |
| 市电功率平均值 | 1w | Int | 204 | 1 | R | |
| 逆变电压有效值 | 0.1v | Int | 205 | 1 | R | |
| 逆变电流有效值 | 0.1A | Int | 206 | 1 | R | |
| 逆变频率 | 0.01Hz | Int | 207 | 1 | R | |
| 逆变功率平均值 | 1w | Int | 208 | 1 | R | 正数表示逆变输出,负数表示逆变输入 |
| 逆变充电功率 | 1w | Int | 209 | 1 | R | |
| 输出电压有效值 | 0.1v | Int | 210 | 1 | R | |
| 输出电流有效值 | 0.1A | Int | 211 | 1 | R | |
| 输出频率 | 0.01Hz | Int | 212 | 1 | R | |
| 输出有功功率 | 1w | Int | 213 | 1 | R | |
| 输出视在功率 | 1VA | Int | 214 | 1 | R | |
| 电池电压平均值 | 0.1v | Int | 215 | 1 | R | |
| 电池电流平均值 | 0.1A | Int | 216 | 1 | R | |
| 电池功率平均值 | 1w | Int | 217 | 1 | R | |
| 无效数据 | 218 | 1 | 内部命令 | |||
| PV电压平均值 | 0.1v | Int | 219 | 1 | R | |
| PV电流平均值 | 0.1A | Int | 220 | 1 | R | |
| 预留 | 221 | 2 | 预留地址 | |||
| PV功率平均值 | 1w | Int | 223 | 1 | R | |
| PV充电功率平均值 | 1w | Int | 224 | 1 | R | |
| 负载百分比 | 1% | Int | 225 | 1 | R | |
| DCDC温度 | 1℃ | Int | 226 | 1 | R | |
| 逆变温度 | 1℃ | Int | 227 | 1 | R | |
| 预留 | 228 | 1 | 预留地址 | |||
| 电池百分比 | 1% | UInt | 229 | 1 | R | |
| 无效数据 | 230 | 1 | 内部命令 | |||
| 电力流状态 | UInt | 231 | 1 | R | 详见电力流标志位说明 | |
| 电池电流滤波平均值 | 0.1A | Int | 232 | 1 | R | 正数表示充电,负数表示放电 |
| 逆变充电电流平均值 | 0.1A | Int | 233 | 1 | R | |
| PV充电电流平均值 | 0.1A | Int | 234 | 1 | R | |
| 无效数据 | 235 | 1 | 内部命令 | |||
| 无效数据 | 236 | 1 | 内部命令 | |||
| 预留 | 237 | 63 | 预留地址 | |||
| 输出模式 | Uint | 300 | 1 | R/W | 0:单机; 1:并机; 2:三相组合-P1 3:三相组合-P2 4:三相组合-P3 | |
| 输出优先级 | Uint | 301 | 1 | R/W | 0:市电-PV-电池(UTI) 1:PV-市电-电池(SOL)[优先逆变] 2:PV-电池-市电(SBU) 3:PV-市电-电池(SUB)[优先市电] | |
| 输入电压范围 | Uint | 302 | 1 | R/W | 0:APL; 1:UPS; | |
| 蜂鸣器模式 | Uint | 303 | 1 | R/W | 0:所有情况静音; 1:输入源有变换或有特定警告或故障时鸣响; 2:有特定警告或故障时鸣响; 3:故障时鸣响; | |
| 预留 | 304 | 1 | R/W | 预留地址 | ||
| LCD背光 | Uint | 305 | 1 | R/W | 0:定时关闭; 1:常亮; | |
| LCD自动返回主页 | Uint | 306 | 1 | R/W | 0:不自动返回; 1:1分钟后自动返回; | |
| 节能模式开关 | Uint | 307 | 1 | R/W | 0:节能模式关; 1:节能模式开; | |
| 过载自动重启 | Uint | 308 | 1 | R/W | 0:过载故障不重启; 1:过载故障自动重启; | |
| 过温自动重启 | Uint | 309 | 1 | R/W | 0:过温故障不重启; 1:过温故障自动重启; | |
| 过载转旁路使能 | Uint | 310 | 1 | R/W | 0:禁止; 1:使能; | |
| 预留 | 311 | 2 | 预留地址 | |||
| 电池Eq模式使能 | Uint | 313 | 1 | R/W | 0:禁止; 1:使能; | |
| 警告掩码[I] | ULong | 314 | 2 | R/W | 对应为1的警告正常显示,对应为0的警告被屏蔽 | |
| 干接点 | Uint | 316 | 1 | R/W | 0:正常模式; 1:接地盒子模式; | |
| 预留 | 317 | 3 | 预留地址 | |||
| 输出电压 | 0.1v | Uint | 320 | 1 | R/W | 2200:220v输出; 2300:230v输出; 2400:240v输出; |
| 输出频率 | 0.01Hz | Uint | 321 | 1 | R/W | 5000:50Hz输出; 6000:60Hz输出; |
| 电池类型 | Uint | 322 | 1 | R/W | 0:AGM; 1:FLD; 2:USER; 3:Li1 4:Li2 5:Li3 6:Li4 | |
| 电池过压保护点[A] | 0.1v | Uint | 323 | 1 | R/W | 范围:(B + 1v * J) ~ 16.5v*J |
| 最大充电电压[B] | 0.1v | Uint | 324 | 1 | R/W | 范围:C ~ (A - 1v) |
| 浮充电电压[C] | 0.1v | Uint | 325 | 1 | R/W | 范围:(12v * J) ~ B |
| 市电模式电池放电恢复点[D] | 0.1v | Uint | 326 | 1 | R/W | 范围:(B - 0.5v * J) ~ Max(12v * J , E) 设置为0则表示充满恢复 |
| 市电模式电池低压保护点[E] | 0.1v | Uint | 327 | 1 | R/W | 范围: Min(14.3v * J , D) ~ Max(11v * J , F) |
| 预留 | 328 | 1 | 预留地址 | |||
| 离网模式电池低压保护点[F] | 0.1v | Uint | 329 | 1 | R/W | 范围:(10v * J) ~ Min(13.5v * J , E) |
| 恒压转浮充等待时间 | min | Uint | 330 | 1 | R/W | 范围:1~900min 设置为0则默认为10min |
| 电池充电优先级 | Uint | 331 | 1 | R/W | 0:市电优先; 1:PV优先; 2:PV与市电同级; 3:只允许PV充电 | |
| 最大充电电流[G] | 0.1A | Uint | 332 | 1 | R/W | 范围:Max(10A , H) ~ 80A |
| 最大市电充电电流[H] | 0.1A | Uint | 333 | 1 | R/W | 范围:2A ~ G |
| Eq充电电压 | 0.1v | Uint | 334 | 1 | R/W | 范围:C ~ (A - 0.5v * J) |
| bat_eq_time | min | Uint | 335 | 1 | R/W | 范围:0 ~ 900 |
| Eq超时退出 | min | Uint | 336 | 1 | R/W | 范围:0 ~ 900 |
| 两次Eq充电间隔 | day | Uint | 337 | 1 | R/W | 范围:1 ~ 90 |
| 自动市电输出使能 | Uint | 338 | 1 | R/W | 0:不按开机键不会市电输出 1:不按开机键也会自动市电输出 | |
| 预留 | 339 | 2 | 预留地址 | |||
| 市电模式电池放电SOC保护值[K] | 1% | Uint | 341 | 1 | R/W | 范围:5%~96% |
| 市电模式电池放电SOC恢复值 | 1% | Uint | 342 | 1 | R/W | 范围:10%~100% |
| 离网模式电池放电SOC保护值 | 1% | Uint | 343 | 1 | R/W | 范围:0%~Min(K , 95%) |
| 预留 | 344 | 7 | ||||
| 最大放电电流保护 | 1A | Uint | 351 | 1 | R/W | 单机模式下最大放电电流保护值 |
| 预留 | 352 | 3 | ||||
| 市电识别时间 | s | Uint | 355 | 1 | R/W | 机器从识别到市电到认为市电可用所需等待的时间。范围:5 ~ 300 |
| 锂电激活时间 | s | Uint | 356 | 1 | R/W | 范围:6 ~ 300 |
| 锂电池停止充电SOC | 1% | Uint | 357 | 1 | R/W | 锂电通讯成功后获取SOC值,充电达到设置的SOC时停止充电。范围:20 ~100 |
| BMS跟随模式 | Uint | 358 | 1 | R/W | 0:充电电压电流都不跟随BMS的值 1:CV,Float电压跟随BMS且不可设置,充电电流不跟随BMS 2:CV,Float电压,最大充电电流跟随BMS且不可设置 3:充电根据设置的SOC停止而不是根据电压,充电电流不跟随BMS 4:充电根据设置的SOC停止而不是根据电压,最大充电电流跟随BMS且不可设置 | |
| EEPROM最大充电电压 | 0.1v | Uint | 359 | 1 | R | |
| EEPROM浮充电电压 | 0.1v | Uint | 360 | 1 | R | |
| EEPROM最大充电电流 | 0.1A | Uint | 361 | 1 | R | |
| 预留 | 362 | 38 | ||||
| 开机方式 | Uint | 406 | 1 | R/W | 0:可以本地或远程开机 1:只能本地开机 2:只能远程开机 | |
| 预留 | 407 | 13 | 预留地址 | |||
| 远程开关 | Uint | 420 | 1 | R/W | 0:远程关机 1:远程开机 | |
| 无效数据 | 421 | 1 | 内部命令 | |||
| 预留 | 422 | 3 | 预留地址 | |||
| 强制Eq充电 | Uint | 425 | W | 1:手动强制Eq充电一次 | ||
| 退出故障锁定状态 | Uint | 426 | W | 1:退出故障锁定状态(只有机器进入故障模式才会生效) | ||
| 无效数据 | 427 | 1 | 内部命令 | |||
| 预留 | 428 | 22 | 预留地址 | |||
| 无效数据 | 450 | 7 | 内部命令 | |||
| 预留 | 457 | 3 | 预留地址 | |||
| 清除记录 | 460 | 1 | W | 0xAA:清除运行记录及故障记录(工作在非离网模式生效) | ||
| 重置用户参数 | 461 | 1 | W | 0xAA:用户参数恢复默认值(工作在非离网模式生效) | ||
| 无效数据 | 462 | 6 | 内部命令 | |||
| 预留 | 468 | 32 | 预留地址 | |||
| 无效数据 | 500 | 34 | 内部命令 | |||
| 预留 | 534 | 66 | 预留地址 | |||
| 无效数据 | 600 | 34 | 内部命令 | |||
| 程序版本 | ASC | 626 | 8 | R | ||
| 预留 | 634 | 7 | 预留地址 | |||
| 额定功率 | w | UInt | 643 | 1 | R | |
| 额定电池节数[J] | PCS | UInt | 644 | 1 | R | |
| 预留 | 645 | 55 | 预留地址 | |||
| 故障记录存储信息[K] | ULong | 700 | 2 | R | 高16位:最新记录的位置; 低16位:现存故障信息总条数 | |
| 故障信息查询索引[L] | Uint | 702 | 1 | R/W | 设置欲查询的故障信息索引,范围:0 ~ 现存故障信息总条数 | |
| 故障记录[M] | 703 | 26 | R | 详见故障记录格式 | ||
| 运行日志 | 729 | 16 | R | 详见运行日志说明 | ||
| 预留 | 745 | 5 | 预留地址 |
| 故障码 | 说明 |
|---|---|
| 1 | 逆变过温 |
| 2 | DCDC过温 |
| 3 | 电池过压 |
| 4 | PV过温 |
| 5 | 输出短路 |
| 6 | 逆变过压 |
| 7 | 输出过载 |
| 8 | 母线过压 |
| 9 | 母线软起超时 |
| 10 | PV过流 |
| 11 | PV过压 |
| 12 | 电池过流 |
| 13 | 逆变过流 |
| 14 | 母线低压 |
| 15 | 保留 |
| 16 | 逆变直流分量过高 |
| 17 | 保留 |
| 18 | 输出电流零偏过大 |
| 19 | 逆变电流零偏过大 |
| 20 | 电池电流零偏过大 |
| 21 | PV电流零偏过大 |
| 22 | 逆变低压 |
| 23 | 逆变负功保护 |
| 24 | 并机系统主机丢失 |
| 25 | 并机系统同步信号异常 |
| 26 | 电池类型不兼容 |
| 27 | 并机版本不兼容 |
系统警告是一个32位的无符号长整型,每一位对应一个警告,每一位也可以通过警告掩码I进行屏蔽,屏蔽后对应警告将不会在LCD读到,也不会通过命令读到。
| 警告码 | 说明 |
|---|---|
| bit 0 | 市电过零丢失 |
| bit 1 | 市电波形异常 |
| bit 2 | 市电过压 |
| bit 3 | 市电欠压 |
| bit 4 | 市电过频 |
| bit 5 | 市电欠频 |
| bit 6 | PV欠压 |
| bit 7 | 过温 |
| bit 8 | 电池电压较低 |
| bit 9 | 电池未接 |
| bit 10 | 过载 |
| bit 11 | 电池Eq充电 |
| bit 12 | 电池放电低压且还未充回恢复点 |
| bit 13 | 输出功率降额 |
| bit 14 | 风扇堵转 |
| bit 15 | PV能量过低无法使用 |
| bit 16 | 并机通讯中断 |
| bit 17 | 单并机输出模式不一致 |
| bit 18 | 并机电池压差过大 |
| bit19 | 锂电通讯异常 |
| bit20 | 电池放电电流超过设置值 |
| bit 21~31 | 保留 |
电力流有一个16位无符整型表示,各个位的意义如下表:
| 位 | 说明 |
|---|---|
| bit0~1 | 0:PV未接入系统 1:PV已接入系统 |
| bit2~3 | 0:市电未接入系统 1:市电已接入系统 |
| bit4~5 | 0:电池不充不放 1:电池充电 2:电池放电 |
| bit6~7 | 0:系统不输出带载 1:系统输出带载 |
| bit8 | 0:市电未充电 1:市电充电 |
| bit9 | 0:PV未充电 1:PV充电 |
| bit10 | 0:电池图标亮 1:电池图标灭 |
| bit11 | 0:PV图标亮 1:PV图标灭 |
| bit12 | 0:市电图标亮 1:市电图标灭 |
| bit13 | 0:负载图标亮 1:负载图标灭 |
参数模型:CRC-16/MODBUS X16+X15+X2+1
C语言代码
const char auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ;
const char auchCRCLo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 } ;
unsigned short sModbusCrc16(INT8U *chMsg, INT16U dataLen){ unsigned char ubCRCHi = 0xFF; unsigned char ubCRCLo = 0xFF; unsigned char duwIndex; while (dataLen --) { duwIndex = 0xff&(ubCRCHi ^ *chMsg++); ubCRCHi = 0xff&(ubCRCLo ^ auchCRCHi[duwIndex]); ubCRCLo = auchCRCLo[duwIndex]; } return (ubCRCHi << 8 | ubCRCLo);}