Modify ModbusUtilities.vb, in the AdvancedHMIDrivers project, at line 22 to be this code:
'* Loop through extracting each value AND avoid exceeding the number of bytes in the RawData
While (ResultingValuesIndex < address.NumberOfElements) AndAlso (startByte + (Math.Ceiling(ResultingValuesIndex * (address.BitsPerElement / 8))) + BytesPerElement - 1) <= (rawData.Count)
'* Bit or byte read?
If address.BitsPerElement > 1 Then
'Dim Result As Integer = 0
Dim ValueDataBytes(CInt(address.BitsPerElement / 8) - 1) As Byte
'* Ensure there is enought data to process
If rawData.Count >= (startByte + ResultingValuesIndex * BytesPerElement + BytesPerElement) Then
For i = 0 To BytesPerElement - 1
ValueDataBytes(i) = rawData(startByte + ResultingValuesIndex * BytesPerElement + i)
Next
If address.Address.IndexOf("F4", 0, System.StringComparison.InvariantCultureIgnoreCase) >= 0 Then
'* F4 address designates it is a floating point type
ModbusUtilities.SwapBytes(ValueDataBytes, 0)
ModbusUtilities.SwapBytes(ValueDataBytes, 2)
ResultingValues(ResultingValuesIndex) = CStr(BitConverter.ToSingle(ValueDataBytes, 0))
ElseIf address.Address.IndexOf("L4", 0, System.StringComparison.InvariantCultureIgnoreCase) >= 0 Then
'* Convert bytes to a long integer
ModbusUtilities.SwapBytes(ValueDataBytes, 0)
ModbusUtilities.SwapBytes(ValueDataBytes, 2)
ResultingValues(ResultingValuesIndex) = CStr(BitConverter.ToInt32(ValueDataBytes, 0))
Else
ModbusUtilities.SwapBytes(ValueDataBytes, 0)
ResultingValues(ResultingValuesIndex) = CStr(BitConverter.ToInt16(ValueDataBytes, 0))
End If
'* Is a bit number designated?
If address.BitNumber >= 0 Then
ResultingValues(ResultingValuesIndex) = CStr(CBool((CInt(2 ^ address.BitNumber) And CInt(ResultingValues(ResultingValuesIndex))) > 0))
End If
End If
Else
'* It is a bit read, so extract from the byte
'* Byte 0 Bit 0 is always the first bit specified in the address
Dim ByteNumber As Integer = CInt(Math.Floor((ResultingValuesIndex) / 8))
Dim BitNumber As Integer = CInt(((ResultingValuesIndex) / 8 - ByteNumber) * 8)
ResultingValues(ResultingValuesIndex) = CStr(((rawData(ByteNumber + startByte)) And CByte(2 ^ BitNumber)) > 0)
End If
ResultingValuesIndex += 1
End While