丹佛斯(Danfoss FC51)与VB6.0 串口RS485通讯实例
丹佛斯变频器modbus通讯

丹佛斯变频器Modbus通讯济南创恒科技发展有限公司满建江∙FC系列变频器通过内置的RS485接口,以Modbus RTU格式进行通讯。
参数设置如表∙FC系列变频器需要设置的参数:8-01,控制地点,选择【2】控制字,或者【0】数字和控制字;8-02,控制来源,选择【1】RS 485;8-03,控制字超时时间;8-04,控制字超时功能,选择当控制字丢失,变频器采取的动作;8-30,【2】选择为Modbus RTU通讯协议;8-31,变频器的通讯地址,1-126范围内地址有效;8-32,设置通讯速度,各站速度要求一致;8-33,奇偶校验方式,各站要求设置一致;8-50,惯性停车的实现方式,当8-01选择为【0】时,请注意该参数。
丹佛斯变频器所要通讯的MODBUS地址为参数号码乘以10减去1,西门子PLC不需要减1. 例如:变频器的频率地址为3-10那么对应的MODBUS地址即是:(310×10)-1=3099(十进制)西门子200PLC 地址不需要减1 为43100在PLC的modbus指令块写入要通讯变频器地址,参数的地址,和参数的值后,即可更改此参数。
∙电报结构(十六进制)∙地址字段包含8位数据,有效的地址范围为0-247(十进制),0为广播模式;1-247对相应地址的从站进行寻址。
功能字段包含8位数据,有效地代码范围为1-FF,功能字段用于在主站和从站之间发送消息。
当从主站向从站发送时,功能字段为主站的控制字;当从从站向主站传送时,功能字段为从站的状态字。
∙数据字段,是由几组字节两个十六进制数字(00至FF)构成,根据不同的功能代码,数据字段包含的位长、作用不一,针对常用的功能代码,举例如下:∙1、功能代码=1,读取线圈状态∙ 2、功能代码=5,写入单个线圈数值∙ 3、功能代码=F,写入多个线圈数值∙线圈及位的意义。
地址0-31为主站写入用控制位,32-63为从站返回的状态位,如下表所示:∙例如,使电机启动并运转在50%*最大参考值的报文如下∙其中位的个数为 20H=32个位,也就是从00地址起始到31为止的位;字节数,是指写入数值为4个字节;写入数值 047C 对应00-16位,在传送时低位在前,因此为7C 04;2000 对应16-31位,50%*最大参考值,在传送时低位在前,因此为00 20;对于停止,应发043C代码4、功能代码=3,读取保持寄存器状态,保存寄存器保持2字节(即16位)∙ 5、功能代码=6,写入单个寄存器∙ 6、功能代码=10,写入多个寄存器数值∙寄存器列表:∙例如,当要读取3-41,加速时间时,需要写的报文:∙计算参数3-41的地址 3-41 → 341*10-1=3409 → D51(十六进制);保持寄存器状态都为双字节,因此在字个数位置应该为 2 ;正常情况下,变频器返回的报文为,∙012C 为读出的加速度时间,转换成十进制并考虑到控制单位,得到加速时间为3秒。
C51很简洁易懂的RS458串口通信接收发送程序

{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
SendFlag = 1;
}
}
/*******************************************************************************
*标题: RS485串口通信试验(接受与发送) *
**
* 1.通过本例程了解串口的基本原理及使用,理解并掌握对串口进行初始化*
**
* 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机(发送)数据和(接受)数据,
void ser_int (void) interrupt 4 usin
TI = 0;
SendFlag = 0;
}
if(RI == 1) //RI接受中断标志
{
RI = 0;//清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
*请在字符串输入框中输入字符和数字(HEX),按发送按钮。观看接受窗显示情况.也可以用自动循环发送。
*
* 3.试验RS485需要用RS232转485的转换头。RS485的A对应串口头的9针B对应4针.接法大家可以参考原理图。
**
*请学员认真消化本例程,学会用C语言操作串口和485的实现*
51单片机与三菱PLC RS485通讯实例

我用的是天祥单片机实验板,由于没有RS485接口,我利用ADM485芯片自制了一个485接口,如图,但如果要进行半双工通讯,须将P3.0口到下载程序的RS232芯片的线断开可用一个跳线,用RS485的时候断开RS232,用RS232的时候插上跳线帽。硬件连接如图
PLC程序:
通讯我用单片机做主机(只发送指令),PLC做从机(只接收指令),单工单向,以便初学着掌握。
sbit led=P1^1;/*将RS485置为发送数据模式*/
unsigned char i;
void init()
{
SCON=0x50;/*串口中断开*/
TMOD=0x20;/*定时器设置*/
TH1=0xfd;/*定时时间的高位*/
TL1=0xfd;/*定时时间的低位,速度为9600BPS*/
TR1=1;/*定时器开*/
格式:1位启始,8位数据,一位停止。
所以PLC寄存器D8120:0C81.
plc程序很简单不懂的可以看下三菱PLC的通讯手册。如下图:
三:单片机程序:
#include<reg52.h>/*单片机的头文件*/
unsigned char code tab[]={0x17,0xff};/*PLC输出的Y点数,PLC输出Y灯0125678亮*/
QQ:79814563注明时工控交友
电话:15250151540
姓名:黄辉
2011年12月17日Saturday
51单片机与三菱PLC无协议通讯成功
我用了两个晚上的时间查阅一些资料,利用三菱PLC的扩展RS485通讯板与其51单片机连接通讯,可写PLC任意的地址。长度可达1000米,看见网上写的都很烦且对三菱和单片机不是很熟的朋友来说有一定的阅读难度,今天将它与大家分享。希望在此基础上大家能扩展出自己想要的功能,过些时间有空我在写个半双工的程序。
丹佛斯FC51通讯详列

关于丹佛斯FC51通讯的部分介绍前言丹佛斯FC51系列变频器通讯:硬件集成485通讯口(两线制);软件上集成两种通讯协议FC协议(丹佛斯自行研制)和MODBUS RTU协议(国际标准通讯协议),本文主要对于FC51变频器MODBUS RTU通讯协议上面做相关介绍。
关键词丹佛斯FC51 通讯MODBUS协议关于MODBUS通讯协议丹佛斯FC51通讯设定参数8-30 设为2 通讯协议为MODBUS协议8-31 设为1 通讯子机地址8-32 设为2 通讯波特率为96008-33 设为0 通讯数据格式8,E,1此通讯主要介绍写频率读电压读电流读输出频率丹佛斯FC51通讯设定参数8-30 设为2 通讯协议为MODBUS协议8-31 设为1 通讯子机地址8-32 设为2 通讯波特率为96008-33 设为0 通讯数据格式8,E,13-02 频率参考值(MIN)*3-03 频率参考值(MAX)*注*:变频器频率通过通讯设定的是百分比(P),实际设定的频率就是(MAX-MIN)×P÷10000(P的设定有两个小数位)此通讯主要介绍写频率读输出电压读输出电流读输出频率1,变频器MODBUS地址的定义丹佛斯变频器所要通讯的MODBUS地址为参数号码乘以10减去1例如:变频器的频率地址为3-10那么对应的MODBUS地址即是:(310×10)-1=3099(十进制)16进制为0C1B2,读写变频器的操作(1)写频率命令代码:01 06 0C 1B ** ** CRC则变频器返回代码为:01 06 0C 1B ** ** CRC其中:01 代表变频器地址一个字节06 代表MODBUS写功能码一个字节0C 1B 代表变频器内部MODBUS地址两个字节** ** 代表所要写的频率的百分比两个字节CRC 代表冗余校验码两个字节其中低位在前高位在后(2)读电机参数参数为:16-12 电机运行电压对应MODUBS地址为(1612×10)-1=3EF7 16-13 电机运行频率对应MODUBS地址为(1613×10)-1=3F0116-14 电机运行电流对应MODUBS地址为(1614×10)-1=3F0B命令代码:01 03 3E F7 00 01 CRC则变频器返回:01 03 3E F7 00 02 ** ** CRC其中:01 代表变频器地址一个字节03 代表MODBUS读功能码一个字节3E F7 代表变频器内部MODBUS地址两个字节00 01 代表读一个字两个字节CRC 代表冗余校验码两个字节其中低位在前高位在后00 02 代表返回2个字节两个字节** ** 代表返回的电压值两个字节3,启动/停止变频器写047C 到地址50000-1=49999(HC34F)启动变频器写043C 到地址50000-1=49999(HC34F)停止变频器3-10的八段速每段速的设定,需要在K8里面写相应的地址号0-7八段速设定里面当K8厘米的值等于0时为0段速,当K8里的值等于1时为第一段速,依此类推,当K8的值等于7时为第7段速本文转自亿万论坛:/a/a.asp?B=302&ID=1117512。
丹佛斯变频器rs485fc协议控制汇总及应用例程

丹佛斯变频器RS485 FC协议控制汇总及应用例程连接方式按下述方式将变频器连接至 RS-485 网络(另请参阅图解):1. 将信号线连接至变频器主控制板的68 (P+) 和 69 (N-) 号端子上。
2. 将电缆屏蔽连接到电缆夹上。
注意:为了降低导体之间的噪声,建议采用屏蔽的双绞线电缆。
3.使用变频器主控制板上的端接器 DIP 开关来端接RS-485 总线。
注意:DIP 开关的出厂设置为 OFF(关闭)。
FC 协议概述FC 协议(也称为 FC 总线或标准总线)是 Danfoss 的标准现场总线。
它定义了一种符合主-从原理的访问技术来实现串行总线通讯。
最多可以将一个主站和 126 个从站连接至总线。
主站通过报文中的地址字符来选择各个从站。
如果没有事先请求,从站自身不会传输任何消息。
此外,各个从站之间无法直接传送消息。
通讯以半双工模式进行。
不能将主站的功能转移到另一节点上(单主站系统)。
物理层是 RS-485,因此需要利用变频器内置的 RS-485端口。
FC 协议支持不同的报文格式:•用于过程数据的 8 字节短格式。
•同时包含参数通道的 16 字节长格式。
•用于文本的格式。
(1) PKE占用两个字节,包括参数命令类型和参数数目;(2) IND为索引,也占用两个字节,索引字节用于表明它是一个读命令还是写命令。
在读命令中必须具有0400H的格式,在写命令中必须具有0500H的格式;(3) PWE为参数值块。
占用四个字节,分为高字(PWE H)和低字(PWE L)。
“比如主机要改变当前的变频器参数,新的参数就应写在参数PWE中发送给变频器;”(4) PCD为过程块,占用4个字节。
它有两种状态,当主机发给从机时,PCD1为控制字,PCD2为参考值;当从机发给主机时,PCD1为状态字,PCD2为当前的输出频率;(5) BCC为数据控制字节。
由它来对接收到的命令进行检验正确与否。
它的初始值为0,然后对该字节以前的所有字节进行异或。
丹佛斯变频器FC串口通讯协议介绍

实例1 丹佛斯FC协议详解和艾默生PLC通讯济南创恒科技发展有限公司满建江2012-6-13 VLT变频器的串行通讯为异步半双工的方式,使用字节奇偶校验和块传送异或校验方法。
每个变频器都配备有一个标准的RS-485通讯端口,使协议可以通过RS-485电气接口来进行传输。
PLC为主机,变频器为从机,系统电码的传输由主机控制,主机不断发出某个地址的电码给从机,等待从机的响应。
主机最多能带31个从机,在有中继器的情况下,可以增加到126个从机,也就是从机的地址最多可以设定到126。
通讯时,每一个字节从一个起始位开始实行传送,然后再传递8个数据位,相应地组成一个字节,每个字节由一个奇偶校验位来验证传送的正确性,然后由一个终止位结束。
这样一个字节共由11个位组成。
每个电码由一个起始字节(STX)开始,这个起始字节为STX=02H。
随后紧跟一个表示电码长度(LGE)的字节和表示变频器地址的字节(ADR)。
然后是一些数据字节(随电码类型而变)。
整个电码由一个数据控制字节(BCC)来结束。
结构如附表。
表4-1 Danfoss变频器通讯协议格式Table 4-1 The format of danfoss communcation1.PKE占用两个字节,包括参数命令类型和参数数目。
2.IND为索引,也占用两个字节,索引字节用于表明它是一个读命令还是写命令。
在读命令中必须具有0400H的格式,在写命令中必须具有0500H的格式。
3.PWE为参数值块。
占用四个字节,分为高字(PWE H)和低字(PWE). )。
“比如主机要改变当前的变频器参数,新的参数就应写在参数PWE中发送给变频器。
4.PCD为过程块,占用4个字节。
它有两种状态,当主机发给从机时,PCD1为控制字,PCD2为参考值;当从机发给主机时,PCD1为状态字,PCD2为当前的输出频率。
5.BCC为数据控制字节。
由它来对接收到的命令进行检验正确与否。
它的初始值为0,然后对该字节以前的所有字节进行异或。
PLC与VB6.0串口通讯案例

1、引言可编程控制器以其高可靠性,配置灵活和完善的功能,在工业控制系统中得到越来越广泛的应用。
但对于操作员所需要的报表打印、趋势图形显示、工况查寻、参数在线修改等功能,PLC却不能直接方便地提供。
所以通常采用计算机PC与PLC组成一个完整的监控系统。
本文以台安TP02系列PLC为例,讨论用Visual Basic(VB)实现PLC与上位机的通讯2、VB在通讯控件中的使用可编程控制器PLC与上位机PC之间的通信,下位机为PLC,基于其可靠性极高,主要承担控制功能,而上位PC机主要承担监察管理功能,有时兼备部分控制功能,如发出运行,停止命令。
VB语言是基于WINDOWS操作系统的功能强、易学易用、主要是面向学习对象的程序设计语言。
VB带有专门管理串行通讯的MSComm控件,只需设置几个主要参数就可以实现PLC与PC串行通讯。
要完成通信必须设置MSComm的相关属性值:(1)CommPort:设置或传回通信连接端口代号(2)Settings:设置初始化参数。
以字符串的形式设置或传回连接速度、奇偶校验、数据位、停止位等4个参数(3)PortOpen:设置或传回通信连接端口的状态(4)Input:从输入寄存器传回并移除字符(5)Output:将一个字符串写入输出寄存器(6)InputLen:指定由串行端口读入的字符串长度(7)InBu FF erCount:传回在接收寄存器中的字符数3、软硬件之间:台安TP02与上位机PC通信时,为了实现两者的通信需要配备通信线。
4、通信程序的实现4.1 通信初始化程序首先,在窗体开始设计之前,添加MSComm控件。
4.2程序编写:4.2.1 通信控件MSComm1属性设置:mPort = 1 设置端口号MSComm1.Settings = "19200,E,7,2" 设置通信参数MSComm1.InputLen = 0 设置读入字符串长度MSComm1.PortOpen = True 设置通信端口状态4.2.2 PLC运行程序:STX$ = "::"TransmitBuf$ = "01?5RUN"sum$ = CheckSum(transmitBuf$)ETX$ = Chr$(13)SXD$ = STX$ + transmitBuf$ + sum$ + ETX$MSComm1.Output = SXD$DoDoEventsLoop Until MSComm1.InBu FF erCount >= 12In1$ = MSComm1.Input4.2.3 从PLC读取资料,将寄存器内的数据资料在PC上显示以便观察监控(反应时间50ms):STX$ = "::"transmitBuf$ = "01?5MRVD000102"sum$ = CheckSum(transmitBuf$)ETX$ = Chr$(13)SXD$ = STX$ + transmitBuf$ + sum$ + ETX$MSComm1.Output = SXD$DoDoEventsLoop Until MSComm1.InBufferCount >= 20InData$ = MSComm1.InputLabel2.Caption = Mid$(InData$, 10, 4)Label3.Caption = Mid$(InData$, 14, 4)4.2.4从PLC读取资料,将RelayC0001状态通过PC显示进行监控(反应时间50ms):STX$ = "::"transmitBuf$ = "01?5MCRC0001"sum$ = CheckSum(transmitBuf$)ETX$ = Chr$(13)SXD$ = STX$ + transmitBuf$ + sum$ + ETX$MSComm1.Output = SXD$DoDoEventsLoop Until MSComm1.InBufferCount >= 13In4$ = MSComm1.InputCoil$ = Mid$(In4$, 10, 1)C1% = CInt(Coil$)Label6.Caption = C1%4.2.5 设定Relay状态,将Relay设定为ON(反应时间50ms):Dim C1 As IntegerSTX$ = "::"transmitBuf$ = "01?5SCSY00011"sum$ = CheckSum(transmitBuf$)ETX$ = Chr$(13)SXD$ = STX$ + transmitBuf$ + sum$ + ETX$MSComm1.Output = SXD$DoDoEventsLoop Until MSComm1.InBufferCount >= 12In2$ = MSComm1.Input4.2.6 PLC停止运行:STX$ = "::"transmitBuf$ = "01?5STP"sum$ = CheckSum(transmitBuf$)ETX$ = Chr$(13)SXD$ = STX$ + transmitBuf$ + sum$ + ETX$MSComm1.Output = SXD$DoDoEventsLoop Until MSComm1.InBufferCount >= 12In3$ = MSComm1.Input4.2.7 VB6.0下CheckSum函数代码如下:Private Function CheckSum(transmitBuf$)L = Len(transmitBuf$)Add = 0Dim k, sum As IntegerFor k = 1 To LTJ$ = Mid$(transmitBuf$, k, 1)Add = Add + Asc(TJ$)Next kDo While Add >= 256Add = Add - 256LoopAdd = 255 - Add + 1tempBuf$ = Hex$(Add)CheckSum = LTrim(tempBuf$)End Function5、结论PLC与上位机的结合,并通过VB6.0传送数据所构成的计算机监控系统,对于近距离传输数据的现场控制来说是一种性价比很高的解决方案。
丹佛斯变频器FC51应用说明

丹佛斯变频器FC51应用说明丹佛斯变频器FC51应用说明1.简介1.1 变频器概述1.2 应用范围2.安装及调试2.1 安装位置选择2.2 电气接线2.3 软件调试3.参数设置3.1 基本参数设置3.2 控制模式设置3.3 输出特性设置3.4 保护参数设置4.运行控制4.1 启动和停止控制4.2 运行模式选择4.3 运行参数监测4.4 故障诊断与处理5.扩展应用5.1 外部输入输出控制5.2 外部通信接口应用5.3 PLC编程接口应用6.维护与保养6.1 清洁与防尘6.2 温度与湿度要求6.3 维护周期与内容7.常见问题与解决方案7.1 变频器无法启动7.2 变频器输出功率不稳定7.3 变频器故障报警解决方法8.附件8.1 变频器安装图纸8.2 变频器接线示意图8.3 变频器参数设置表格法律名词及注释:- 变频器:一种电子设备,用于控制电动机的转速和输出功率。
- 应用范围:指在何种情况下可以使用该变频器。
- 安装位置选择:选择变频器安装的最佳位置。
- 电气接线:将变频器与电源和电动机进行正确的接线连接。
- 软件调试:根据实际需要对变频器进行软件参数的调整和优化。
- 基本参数设置:设置变频器的基本运行参数,如电压、电流等。
- 控制模式设置:设置变频器的控制模式,如V/F控制、矢量控制等。
- 输出特性设置:设置变频器的输出特性,如电流限制、过载保护等。
- 保护参数设置:设置变频器的保护参数,如过热保护、短路保护等。
- 启动和停止控制:控制变频器的启动和停止。
- 运行模式选择:选择变频器的运行模式,如运行、停止、调速等。
- 运行参数监测:监测变频器的运行参数,如电流、电压、频率等。
- 故障诊断与处理:根据变频器故障报警进行故障诊断和解决。
- 外部输入输出控制:通过外部设备控制变频器的工作状态。
- 外部通信接口应用:使用变频器的外部通信接口进行数据传输和控制。
- PLC编程接口应用:使用PLC编程接口控制变频器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
丹佛斯(Danfoss FC51)与VB6.0 串口RS485通讯实例通过实验室功能测试和现在使用稳定性测试,VB源码如下:‘****************************************************************************** ******************************************************************************* *******************************************************************************Dim HiByte As ByteDim LoByte As ByteDim CRC16Lo As ByteDim CRC16Hi As ByteDim ReturnData(1) As ByteDim k As IntegerPrivate Sub Command1_Click()k = Text9.Text '写6 个字节'=========== 数组赋值输入代码=============================================================================== ========'<< 算法一>>Dim WriteStr() As ByteDim u As IntegerReDim WriteStr(k + 2)For u = 0 To kWriteStr(u) = Val("&H" & Text1(u).Text)Next'<< 算法二>>Dim CRC_2() As ByteDim v As IntegerReDim CRC_2(k)For v = 0 To kCRC_2(v) = Val("&H" & Text1(v).Text)Next'============================================================================== ====================Call CRC161(CRC_2())Call CRC16(WriteStr(), k)MSComm1.InBufferCount = 0'========== 显示发送代码=============================================================================== =========Dim m As IntegerFor m = 0 To 23If m <= k ThenText8(m).Text = Hex(WriteStr(m))ElseText8(m).Text = ""End IfNext'============================================================================== ====================WriteStr(k + 1) = LoByteWriteStr(k + 2) = HiByte' 发送代码Text4.Text = ""Dim g As IntegerFor g = 0 To k + 2Text4.Text = Text4.Text + " " + Hex(WriteStr(g))NextMSComm1.Output = WriteStr'写命令发送后,当接收到8 个字节时中断CmdLenth = 8MSComm1.RThreshold = CmdLenthEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Command3_Click()Dim inx() As ByteSelect Case mEventCase comEvReceive '判断为接收事件MSComm1.InputLen = CmdLenth '接收数据的长度inx = MSComm1.Input '接收数据MSComm1.InBufferCount = 0For k = 3 To CmdLenth - 3tmpstr = tmpstr & "/" & Hex(inx(k))NextText14.Text = tmpstr '以十六进制显示所接收长度的数据BeepEnd Select' Dim n As Integer' Dim tmp As String' Do While Len(tmp) < 8' tmp = tmp + MSComm1.Input' n = n + 1' If n >= 3000 Then' MSComm1.PortOpen = False'' End If' Loop' tmp = Mid$(tmp, 2, 4)' Text13.Text = tmp'Word_Read = Hex2Dec(Right$(tmp, 2) + Left$(tmp, 2))' MSComm1.PortOpen = FalseEnd SubPrivate Sub Form_Load()MSComm1.Settings = "9600,N,8,1"mPort = 1MSComm1.SThreshold = 0If Not MSComm1.PortOpen Then MSComm1.PortOpen = True End SubPrivate Sub Timer1_Timer()'显示<< 算法一>>结果Text2.Text = Hex(HiByte)Text3.Text = Hex(LoByte)'显示<< 算法二>>结果Text6.Text = Hex(CRC16Hi)Text7.Text = Hex(CRC16Lo)If Text5.Text <> "" Then '十进制转十六进制Text10.Text = Hex(Text5.Text)End IfIf Text11.Text <> "" Then '十六进制转十进制Text12.Text = Val("&H" & Text11.Text)End IfText14.Text = MSComm1.OutBufferCountEnd Sub'========== CRC校验<< 算法一>> =============================================================================== =========Function CRC16(ByRef cmdstring() As Byte, ByVal j As Integer)Dim data As IntegerDim I As IntegerAddressreg_crc = &HFFFFFor I = 0 To jAddressreg_crc = Addressreg_crc Xor cmdstring(I)For j = 0 To 7data = Addressreg_crc And &H1If data ThenAddressreg_crc = Int(Addressreg_crc / 2) '右移1位,除2取整就可以做到右移。
Addressreg_crc = Addressreg_crc And &H7FFF '最高位用“0”补齐Addressreg_crc = Addressreg_crc Xor &HA001 '与A001异或ElseAddressreg_crc = Addressreg_crc / 2 '右移1位Addressreg_crc = Addressreg_crc And &H7FFF '最高位用“0”补齐End IfNext jNext IIf Addressreg_crc < 0 ThenAddressreg_crc = Addressreg_crc - &HFFFF0000End IfLoByte = Addressreg_crc And &HFFHiByte = (Addressreg_crc And &HFF00) / &H100End Function'========== CRC校验<< 算法二>> =============================================================================== =========Function CRC161(data() As Byte) As String 'CRC计算函数' Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器Dim CL As Byte, CH As Byte '多项式码&HA001Dim SaveHi As Byte, SaveLo As ByteDim I As IntegerDim Flag As IntegerCRC16Lo = &HFFCRC16Hi = &HFFCL = &H1CH = &HA0For I = 0 To UBound(data)CRC16Lo = CRC16Lo Xor data(I) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2 '高位右移一位CRC16Lo = CRC16Lo \ 2 '低位右移一位If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1End If '否则自动补0If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext IDim ReturnData(1) As ByteReturnData(0) = CRC16Hi 'CRC高位ReturnData(1) = CRC16Lo 'CRC低位asd = Right("00" + Hex(CRC16Lo), 2) + Right("00" + Hex(CRC16Hi), 2)End Function。