⽤VB编写的Modbus通讯CRC16校验程序
⽤VB编写的Modbus通讯CRC16校验程序
(2007-09-2721:48:19)
转载▼
标签:
IT/科技
Rem声明CRC16冗余校验函数ACS510_CRC
PrivateDeclareFunctionACS510_CRCLib""(ByValaAsLong,ByValaAsLong)AsLong
PublicFunctionACS510_Cmd(ByValStationIDAsLong,ByValWRcmdAsLong,ByValWRAddressAsLong,ByValData
AsLong)AsString
DimStatIDAsString'定义从机地址缓存区
DimCmdAsString'定义功能命令缓存区
DimAddressAsString'定义读写地址缓存区
DimWRAddressHiAsString'定义读写地址的⾼半字节缓存区
DimWRAddressLoAsString'定义读写地址的低半字节缓存区
DimhDataAsString'定义读写数据缓存区
DimDataHiAsString'定义读写数据⾼半字节缓存区
DimDataLoAsString'定义读写数据低半字节缓存区
DimCRCBuffer1AsString'定义从机地址校验缓存区
DimCRCBuffer2AsString'定义命令校验缓存区
DimCRCBuffer3AsString'定义读写地址⾼字节校验缓存区
DimCRCBuffer4AsString'定义读写地址低字节校验缓存区
DimCRCBuffer5AsString'定义读写数据⾼半字节校验缓存区
DimCRCAsString'定义读写数据低半字节校验缓存区(也即是CRC计算的最后结果)
DimCRCHiAsString'定义校验⾼半字节缓存区
DimCRCLoAsString'定义校验低半字节缓存区
DimCRC_EvenAsString'定义校验
结果取反缓存区
Rem取从机的地址
StatID=Trim(Hex(StationID))
IfStatID=""Then
MsgBox"⽬的地地址不能为空!",vbInformation+vbOKOnly,"系统提⽰!"
ExitFunction
El
IfLen(StatID)=1Then
StatID="0"+StatID
EndIf
IfLen(StatID)>=2Then
StatID=Trim(Right(StatID,2))
EndIf
EndIf
Rem取读写命令
Cmd=Trim(Hex(WRcmd))
IfCmd=""Then
MsgBox"读写命令不能为空!",vbInformation+vbOKOnly,"系统提⽰!"
ExitFunction
El
IfLen(Cmd)=1Then
Cmd="0"+Cmd
EndIf
IfLen(Cmd)>=2Then
Cmd=Trim(Right(Cmd,2))
EndIf
EndIf
Rem取读写数据的地址
Address=Trim(Tran_Format(Trim(Hex(WRAddress))))
WRAddressHi=Trim(Mid$(Address,1,2))
WRAddressLo=Trim(Mid$(Address,3,2))
Rem取读写的数据(读时为字节数,写时为要写的数据)
hData=Trim(Tran_Format(Trim(Hex(Data))))
DataHi=Trim(Mid$(hData,1,2))
DataLo=Trim(Mid$(hData,3,2))
Rem计算从机地址的校验
CRCBuffer1=ACS510_CRC(65535,StationID)
Rem计算读写命令的校验
CRCBuffer2=ACS510_CRC(CRCBuffer1,WRcmd)
Rem计算读写地址⾼半字节的校验
IfReadAddressHi="00"Then
ReadAddressHi=""
CRCBuffer3=CRCBuffer2
El
CRCBuffer3=ACS510_CRC(CRCBuffer2,Tran_HD(WRAddressHi))
EndIf
Rem计算读写地址低半字节的校验
CRCBuffer4=ACS510_CRC(CRCBuffer3,Tran_HD(WRAddressLo))
Rem计算读写数据⾼半字节的校验
IfDataHi="00"Then
CRCBuffer5=CRCBuffer4
DataHi=""
El
CRCBuffer5=ACS510_CRC(CRCBuffer4,Tran_HD(DataHi))
EndIf
Rem计算读写数据低半字节的校验,既最终的校验
CRC=Trim(Tran_Format(Hex(ACS510_CRC(CRCBuffer5,Tran_HD(DataLo)))))Rem取校验的⾼半字节
CRCHi=Trim(Mid$(CRC,1,2))
Rem取校验的低半字节
CRCLo=Trim(Mid$(CRC,3,2))
Rem重新组合校验的结果
CRC_Even=CRCLo+CRCHi
Rem返回发送字符串
ACS510_Cmd=StatID+Cmd+WRAddressHi+WRAddressLo+DataHi+DataLo+CRC_Even
EndFunction
本文发布于:2022-12-03 07:02:28,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/42951.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |