华光电气综保Modbus规约V7.0 (1)
- 格式:pdf
- 大小:939.79 KB
- 文档页数:24
DSSD332-9Z说明书1概述1.1产品简介DSSD332(配置号为9Z)型三相电子式多功能电能表是一款集测量记录、电能计量、遥信遥控、大屏幕LCD显示和网络通信功能于一体的电力仪表。
本仪表可测量电压、电流、功率、功率因数和频率等多项电网参数;具有2~50次谐波分析功能,计算多项电能质量参数;可计量有功和无功电能;具有复费率电能和复费率需量功能;可配置两路独立的RS-485通信接口,支持MODBUS-RTU和DL/T645双通信规约;具有开关量输入和输出功能,可配置模拟量变送输出功能。
本仪表广泛适用于变配电自动化系统、工业控制和工业自动化系统、能源管理系统和小区电力监控等场合。
DSSD332(配置号为9Z)三相电子式多功能电能表符合以下标准:GB/T17215.301-2007 多功能电能表特殊要求GB/T17215.322-2008 静止式有功电能表(0.2S级和0.5S级)GB/T17215.323-2008 静止式无功电能表(2级和3级)DL/T614-2007 多功能电能表DL/T645-2007 多功能电能表通信规约Modbus-RTU业务咨询电话:0731-1.2产品特点本仪表采用了高精度采样计量单元和高速MCU数据处理单元,可实现高精度宽范围准确计量和快速数据分析;采用段码式多行宽视角液晶显示屏,显示内容很丰富;液晶配备白色背光,可满足黑暗环境下查阅数据的要求;采用非易失存储器存储各类数据,可长时间保存数据且掉电不丢失;采用高精度带温补功能的时钟芯片,在工作温度范围内有效保证了时钟的准确性;支持双通信端口和工业标准通信规约,组网便捷灵活;选配不同通信模块,可满足多种用户的不同接口需求。
2 技术指标产品型号:第 3 页 共 44 页3 功能介绍3.1参数测量功能本仪表具有丰富的测量功能,可测量的电网参数和指标如下: (1)各相电压值及平均电压值。
(2)各线电压值及平均线电压值。
(3)各相电流值、平均电流值以及零线电流值。
SIMATICS7S7-200 SMART 系统手册Siemens AGDivision Digital Factory Postfach 48 4890026 NÜRNBERG A5E03822234-AFⓅ 02/2019 本公司保留更改的权利Copyright © Siemens AG 2019. 保留所有权利法律资讯警告提示系统为了您的人身安全以及避免财产损失,必须注意本手册中的提示。
人身安全的提示用一个警告三角表示,仅与财产损失有关的提示不带警告三角。
警告提示根据危险等级由高到低如下表示。
危险表示如果不采取相应的小心措施,将会导致死亡或者严重的人身伤害。
警告表示如果不采取相应的小心措施,可能导致死亡或者严重的人身伤害。
小心表示如果不采取相应的小心措施,可能导致轻微的人身伤害。
注意表示如果不采取相应的小心措施,可能导致财产损失。
当出现多个危险等级的情况下,每次总是使用最高等级的警告提示。
如果在某个警告提示中带有警告可能导致人身伤害的警告三角,则可能在该警告提示中另外还附带有可能导致财产损失的警告。
合格的专业人员本文件所属的产品/系统只允许由符合各项工作要求的合格人员进行操作。
其操作必须遵照各自附带的文件说明,特别是其中的安全及警告提示。
由于具备相关培训及经验,合格人员可以察觉本产品/系统的风险,并避免可能的危险。
按规定使用 Siemens 产品请注意下列说明:警告 Siemens产品只允许用于目录和相关技术文件中规定的使用情况。
如果要使用其他公司的产品和组件,必须得到 Siemens推荐和允许。
正确的运输、储存、组装、装配、安装、调试、操作和维护是产品安全、正常运行的前提。
必须保证允许的环境条件。
必须注意相关文件中的提示。
商标所有带有标记符号 ® 的都是 Siemens AG的注册商标。
本印刷品中的其他符号可能是一些其他商标。
若第三方出于自身目的使用这些商标,将侵害其所有者的权利。
第11章:归档系统目录:第11章 归档系统 (3)1.变量记录 (3)1.1 变量 (3)1.2 周期 (4)1.3 归档类型 (6)1.3.1 周期性过程值归档 (6)1.3.2 非周期性过程值归档 (7)1.3.3 变化时的过程值归档 (8)1.3.4 周期选择性过程值归档 (8)1.3.5 过程控制型过程值归档 (9)1.3.6 压缩的归档 (9)1.4 T ag Logging的组态 (11)1.4.1 在SIMATIC管理器中组态 (11)1.4.2 最小采集周期 (13)1.5 组态归档 (15)1.5.1 归档的大小 (15)1.5.2 为归档计算存储空间需求 (17)1.5.3 使用归档向导 (17)1.5.4 设置变量属性 (19)1.5.5 归档属性 (22)1.6 趋势控件 (23)1.6.1 组态 WinCC 的在线趋势控件 (23)1.6.2 运行时刻的趋势 (25)1.6.3 在线趋势 (27)1.7 功能趋势控件 (29)1.8 WinCC在线表格控件 (31)2.消息 (33)2.1 PCS 7消息 (33)2.1.1 PCS 7和报警归档编辑器 (33)2.1.2 Loop-in-alarm报警回路 (38)2.1.3 PCS 7中的消息设置 (39)2.2 消息概念 (40)2.2.1 单个消息和组消息 (40)2.2.2 消息等级和消息类型 (44)2.2.3 消息事件和消息状态 (45)2.2.4 确认机制 (45)2.2.5 初始值消息和新值消息 (47)2.2.6 确认变量 (47)2.2.7 消息块 (47)2.2.8 消息控件 (47)2.2.9 消息行 (49)2.2.10 消息归档 (50)2.3 组态消息显示 (53)2.3.1 报警控件 (53)2.3.2 消息块和消息等级的选择 (54)2.3.3 组态消息行 (56)2.3.4 根据文本选择消息 (57)2.4 在WinCC中组态消息 (58)2.5 组态Horn (64)3.使用WinCC StoragePlus进行数据交换 (66)4.中央归档服务器 (66)4.1 系统结构和原理 (66)4.2 组态中央归档服务器 (67)练习 (69)练习11.1在工厂画面中加入趋势和表格 (69)练习11.2根据文本对消息进行分类 (69)第11章 归档系统过程运行时生成的各类过程数据,都可以在PCS 7项目内进行归档,例如过程值、消息等。
通信协议Modbus手册M1M 电力智能监控仪表目录1. Modbus 通信协议概述 (1)1.1. Modbus-RTU (1)1.1.1. 概述 (1)1.1.2. 线拓扑 (1)1.1.3. 线序 (1)1.1.4. 推荐线缆 (2)1.2. Modbus-TCP/IP (2)1.2.1. 概述 (2)1.2.2. 线拓扑 (2)1.2.3. 推荐线缆 (2)2. Modbus传输格式 (4)2.1. 字节格式 (4)2.2. 数据帧格式 (4)2.2.1. Modbus-RTU数据帧格式 (4)2.2.2. Modbus-TCP/IP数据帧格式 (5)2.3. 功能码03H帧格式 (5)2.4. 功能码10H帧格式 (5)2.5. 错误帧格式 (5)3. M1M寄存器读写 (7)3.1. 内容说明 (7)3.2. 电能 (7)3.3. 实时数据 (8)3.4. 平均值、最大值和最小值 (9)3.5. 电力质量 (12)3.6. IO口状态 (13)3.7. 设备信息 (13)3.8. 时间日期 (14)3.9. 电流和电压互感器变比、接线方式 (15)3.10. Modbus-RTU通信参数 (16)3.11. Modbus-TCP/IP通信参数 (17)3.12. 无小数点的功率 (18)1.Modbus 通信协议概述M1M产品使用标准的Modbus-RTU或Modbus-TCP/IP通信协议。
Modbus协议在Modbus应用协议规范中有完整定义,具体可以参考Modbus官网(https:///specs.php)。
本文档主要说明M1M系列电表的通信协议,如果想了解ABB其他系列电表通信协议,请查阅相关电表的Modbus通信手册。
1.1.Modbus-RTU1.1.1.概述Modbus-RTU 通讯协议是比较常用的一种通讯协议,主从应答式连接(半双工),三线制(差分信号A、B 以及公共端C)。
ForceControl V7.0 深入报道第5季高可靠的冗余与容错—让系统运行“毫无风险”某些设备或者通讯网络往往成为整个系统的关键或者薄弱环节,如果这些环节出现问题导致系统的可靠性大大下降。
为了保证监控系统的可靠性,可以用冗余和热备的方案来保证系统的不间断运行。
ForceControl V7.0支持控制设备和通道冗余,支持普通的RS232、RS485、以太网等控制网络的冗余,支持控制硬件的软冗余切换和硬冗余切换,支持ForceControl V7.0的实时数据库服务器之间的冗余热备,支持监控网络的冗余。
同时保证了客户端的HMI系统能自动识别运行正确的服务器。
ForceControl V7.0监控组态软件的高可靠冗余与容错技术可让您的系统运行“毫无风险”。
其特点为:★真正的完整冗余解决方案★无需编程或特别进行设计★实现完全的自动切换ForceControl V7.0全方位的冗余解决方案★I/O设备冗余在工厂自动化和其他重要任务的应用中,硬件的故障会导致生产损失,还有可能导致潜在的严重后果。
ForceControl V7.0支持完全的热备功能,提供完整的I/O 设备冗余。
通过指定一个设备为主设备,另一个为备用设备,ForceControl V7.0可以在一个设备出现故障时自动地切换到另一个设备。
利用“力控”系列软件的可以向主I/O 设备和备用I/O 设备写入设定点变化的能力,即使是I/O设备并未设计为冗余也能在冗余的组态下使用。
★I/O通讯链路冗余通讯介质造成的通讯中断也是工业中经常发生的问题。
相应的ForceControl V7.0允许为每一个I/O设备安装两根通讯电缆,通过数据通道的冗余,可以尽可能地减少由于通讯通道的问题对系统操作的影响。
ForceControl V7.0的冗余通讯还支持带有主从处理器的现场控制器(PLC),当主处理器故障时ForceControl V7.0自动切换到从处理器而不需要任何用户干预,可以通过冗余变量切换不需要编写特殊程序脚本。
XJ9200D多功能表MODBUS的通讯协议(ver 0.3)一.功能码介绍16码代表设置参数03码代表查询参数01码读继电器输出状态02码读数字输入状态05码是控制继电器20码是读取文件信息(SOE波形记录和故障录波信息)通讯应用格式说明1、读命令功能码03从机响应返回帧格式(数据为16进制):说明:03码读取测量模拟显示,具体定义见后边附录1。
也可以用03码读取设置信息。
2、写命令功能码16查询数据帧功能码16(十进制)(十六进制为10H)允许用户改变多个寄存器的内容。
主机向从机写N个字的数据帧格式:预置多寄存器查询数据帧响应数据帧对于预置多寄存器请求的正常响应是在寄存器值改变以后回应机器地址、功能号、数据预置多寄存器响应数据帧3、控制继电器控制和输出状态3.1继电器控制(功能码05)请求数据帧:响应数据帧:请求帧响应帧 Value含义:发送“合”命令,继电器不动作。
同样发送“分”命令,也是先发启动命令,再发释放命令。
发送“启动”命令后,必须在30秒内发送“分”或者“合”命令,否则不予响应,如果超过30秒,还需要重新发送“启动”命令,然后在30秒内再发送“分”或者“合”命令。
3.2.读继电器输出状态(功能码01)请求帧读取Relay1到Relay2的状态。
响应数据帧响应数据帧,从机回应主机的数据帧。
包含从机地址、功能码、数据的数量和CRC错误校验,数据包中每个继电器状态占用一位(1 = ON,0 = OFF),第一个字节的最低位为寻址到的继电器状态值,其余的依次向高位排列,无用位填为0。
读数字输出状态响应的实例。
4. 读数字输入状态(功能码02)查询数据帧此功能允许用户获得数字输入量DI的状态 ON / OFF(1 = ON, 0 = OFF),除了从机地址和功能域,数据帧还需要在数据域中包含将被读取DI的初始地址和要读取的DI 数量。
XJ-RTU800系列中DI 的地址从0000H开始(DI1=0000H,DI2=0001H ... 依次类推)。
HART转Modbus转换器使用说明书型号:SG_HART_Modbus第一节功能说明天津三格电子的HART转Modbus模块实现将HART信号中的数字信号转换为符合Modbus RTU/ASCII标准的RS485信号和RS232信号,实现仪表的数据读取功能。
第二节主要技术指标第三节接线方法以及指示灯24V_IN 24 V_OUT 24 V_OUT 24 V_OUT CH4CH3CH2CH1 GNDMo d b u s 通信端传感器接入端RS485-B2RS485-A224V-IN :供电端口,7-24V 都可以。
RS232-T ,RS232-R ,GND :一路串口。
RS485-A1、RS485-B1:一路RS485,RS485-A1是RS485+,RS485-B1是RS485-。
可以和计算机或者处理器通信。
24V-OUT :是电源输出端口,输出电压和24V-IN 大小一样,假如需要给仪表24V 供电,则24V-IN 就需要输入24V 。
CH1-4:是信号输入端口,接入HART 仪表。
Powe r 灯:电源灯.Modbus1灯:是485_1通信指示灯,当有485数据通信时刻,灯闪烁。
Modbus2灯:是485_2通信指示灯,保留不用。
HART 灯:是HART 数据灯,闪烁代表模块与仪表通过HART 总线124V信号输入端2、四线制仪表接线:信号输入端3、外置电源,两线制接线:端接外置电源的负端第四节测试软件该软件主要为了用户调试本公司生产的HART转Modbus转换器,也可以测试、配置HART仪表。
如图1:第一步,第一栏菜单选择系统参数,配置转换器模块通信参数。
第一栏串口参数是转换器是转换器的232口的通信参数。
配置完成,点击打开串口。
第二步:工作方式选择。
是指配置本转换器的工作方式。
模块工作方式有Modbus-HART方式、透明工作方式。
Modbus-HART方式传输到计算机的数据格式是Modbus,符合Modbus协议规范。
杭州华光电气MODBUS通讯规约 1 CSR-03系列综保装置 MODBUS通讯规约 V2.0 1. 通讯参数和传输特性 传输方式:异步串行通信方式。 MODBUS规约模式: RTU模式。 传输速率:2400 bps,4800bps,9600bps。 串行口通讯数据格式:1 个起始位,8 个数据位, 无校验位,1个停止位。 最大传输距离:1200米。 通讯介质:推荐采用0.5mm的双绞线,不带屏蔽层。(原因是如果使用屏蔽双绞线,但现场接地处理不好反而影响通讯质量)。 网络连接主站数目:1个。 网络连接从站数目:最多31个。 应答时间:小于 4.5个byte传输时间(帧间隔最小时间) + 10ms。
2.网络连接
RS-485网络的匹配电阻选取:双绞线网络两端的匹配电阻选取,以现场通信正常为准,一般
地1.2km时取120Ω,600m时取220Ω,300m时取330Ω,如通信误码率较大,观察通信时的波形,匹配电阻做适当改变:
3.通信参数选择 通信站号:在通讯参数中修改装置地址,范围1~99,禁止使用0作为装置地址,地址0作为广播地址使用。 通信波特率: 通讯参数中修改装置485口,修改通信波特率:选择范围: 2400bps, 4800bps,9600bps。
4.MODBUS协议通用格式 4.1 支持的MODBUS功能码 功能码02H: 读取开关量输入(读实遥信和虚遥信)。 功能码03H: 读取保持寄存器(读事件记录等) 功能码04H: 读取输入寄存器(读远动遥测) 功能码05H: 强制单点继电器输出(远方复归)。 功能码06H: 向保持寄存器写单个字(遥控跳闸、遥控合闸的选择和执行操作) 功能码10H: 向保持寄存器(内存区)写多个16位的字(通讯对时)。
末端匹配电阻合适 末端匹配电阻偏小 末端匹配电阻偏大 杭州华光电气MODBUS通讯规约 2 4.2 异常响应报文格式 由于软件编程错误,对协议理解错误或通讯干扰等原因,MODBUS通信子站接收到主站的报文后,可以采用异常响应报文给予回答,异常响应报文格式举例如下:
子站通过校验,发现主站报文有问题,将响应报文将主站的功能码最高位(D7)置1,如例子中的85H,异常响应报文中有固定的一个字节作为“异常代码”,表示异常原因。
异常代码 含义
01 非法功能码。子站无法处理主站报文中的功能码。 02 非法数据地址。子站无法处理主站报文中的数据地址。 03 非法数据内容。主站报文中的数据不能满足子站的要求格式。 04 子站设备错误。当子站试图执行主站报文,会产生无法恢复的设备错误。 05 确认帧。 子站接改到主站报文并执行,但由于执行时间比较长,采用本报文通知主站,防止产生主站接收报文超时错误。 06 子站忙。
4.3 时间格式 本规约中使用到的对时报文的时间格式,事件记录中的时间格式,参见下面说明。 七个八位位组的二进制时间 27 毫秒 20 215 毫秒 28 IV (RES1)0 25 分 20
0(SU) (RES2) 0 0 24 时 20 22 星期 20 24 日 20 (RES3) 0 0 0 0 23 月 20
FC 05H 主站=>子站:远方复归 报文 内容含义 备注 1字节 MODBUS地址 01H 举例 1字节 功能码 05H 1字节 线圈地址高字节 01H 1字节 线圈地址低字节 07H 1字节 强制线圈数值高字节 FFH 1字节 强制线圈数值低字节 00H 1字节 CRC高字节 3CH 1字节 CRC低字节 07H 异常响应报文 子站=>主站 报文 内容含义 备注 1字节 MODBUS地址 01H 举例 1字节 功能码 85H 1字节 异常代码 02H
1字节 CRC高字节 C3H 1字节 CRC低字节 51H 杭州华光电气MODBUS通讯规约
3 (RES4) 0 26 年 20 杭州华光电气MODBUS通讯规约
4 4.4 MODBUS规约中CRC码的计算 采用RTU通讯方式的MODBUS规约,要将报文中除CRC码外的所有字节进行CRC码校验,校验程序如下: static unsigned char auchCRCHi[] = { /* Table of CRC values for high-order byte */ 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 }; static unsigned char auchCRCLo[] = { /* Table of CRC values for low-order byte */ 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 Modbus_CRC16(unsigned char *puchMsg, unsigned short usDataLen) { unsigned char uchCRCHi = 0xFF ; /* high CRC byte initialized */ unsigned char uchCRCLo = 0xFF ; /* low CRC byte initialized */ unsigned short uIndex ; /* will index into CRC lookup*/ while (usDataLen--) /* pass through message buffer */ { uIndex = uchCRCHi ^ *puchMsg++ ; /* calculate the CRC */ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; uchCRCLo = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo) ; }