Примерно так выглядит процедура подсчета контрольной суммы для Modbus-пакета:
а так выглядит функция формирования, отправки и приема:Код:Public Function Modbus_CRC(ByVal Data As String) As Long Dim iByte, iBit As Integer Modbus_CRC = &HFFFF& For iByte = 1 To Len(Data) Modbus_CRC = Modbus_CRC Xor Asc(Mid(Data, iByte, 1)) For iBit = 0 To 7 If Modbus_CRC Mod 2 > 0 Then Modbus_CRC = Modbus_CRC \ 2 Modbus_CRC = Modbus_CRC Xor &HA001& Else Modbus_CRC = Modbus_CRC \ 2 End If Next Next End Function
И главное помните: "Дорогу осилит идущий."Код:Public Function Modbus_Query(ByVal Device As Integer, ByVal cmd As Integer, ByVal Addr As Long, ByVal Count As Long, Optional Value As String) As Boolean Dim mCRC As Long Dim mQuery As String mQuery = Chr(Device) mQuery = mQuery + Chr(cmd) mQuery = mQuery + Chr(Int(Addr / 8)) + Chr(Addr Mod 256) mQuery = mQuery + Chr(Int(Count / 8)) + Chr(Count Mod 256) mQuery = mQuery + Value mCRC = Modbus_CRC(mQuery) mQuery = mQuery + Chr(Int(mCRC / 256)) + Chr(mCRC Mod 256) Modbus_Query = Query(mQuery) If Modbus_Query And ErrCode = 0 Then If Len(Packet) < 2 Then ErrCode = -1: Exit Function End If If Modbus_CRC(Mid(Packet, 1, Len(Packet) - 2)) <> Modbus_readWord(Len(Packet) - 1) Then ErrCode = -2: Exit Function End If If readByte(2) > 127 Then ErrCode = readByte(3): Exit Function End If End If End Function




Ответить с цитированием