Примерно так выглядит процедура подсчета контрольной суммы для 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
И главное помните: "Дорогу осилит идущий."