Hallo,
ich habe momentan ein kleines Problem. Ich wollte mich mal an Modbus TCP herantasten und habe mir dafür ein Codebeispiel von Youtube geholt.
drive.google.com/drive/folders…SiEA3H8asJJsnSlTK3OKy2vpU
Nun folgendes Problem - über den Button btnReadHoldingRegisters werden die einzelnen Register gelesen. In den Textboxen txtReceiMsg und txtResult wird die Rückgabe des Gerätes als Byte (txtReceiMsg) und als UShort (txtResult) zurückgegeben.
Beispiel:
txtReceiMsg = 00 03 00 00 00 07 FF 03 04 00 7E 92 4B
txtResult = 126/ 37451/
Das Problem ist, dass die letzten 4 Bytes, also 00 7E 92 4B einen Messwert als DWORD enthalten. Der Messwert soll dezimal (8.294.987) ausgegeben werden.
Wie stelle ich dies an? Ich finde keinen Weg es richtig zu konvertieren und erhalte nie das gewünschte Ergebnis...
btw: mit welchem Datentyp wäre DWORD in VB.NET zu vergleichen? Integer?
ich habe momentan ein kleines Problem. Ich wollte mich mal an Modbus TCP herantasten und habe mir dafür ein Codebeispiel von Youtube geholt.
drive.google.com/drive/folders…SiEA3H8asJJsnSlTK3OKy2vpU
Nun folgendes Problem - über den Button btnReadHoldingRegisters werden die einzelnen Register gelesen. In den Textboxen txtReceiMsg und txtResult wird die Rückgabe des Gerätes als Byte (txtReceiMsg) und als UShort (txtResult) zurückgegeben.
Beispiel:
txtReceiMsg = 00 03 00 00 00 07 FF 03 04 00 7E 92 4B
txtResult = 126/ 37451/
Das Problem ist, dass die letzten 4 Bytes, also 00 7E 92 4B einen Messwert als DWORD enthalten. Der Messwert soll dezimal (8.294.987) ausgegeben werden.
Wie stelle ich dies an? Ich finde keinen Weg es richtig zu konvertieren und erhalte nie das gewünschte Ergebnis...
btw: mit welchem Datentyp wäre DWORD in VB.NET zu vergleichen? Integer?
VB.NET-Quellcode
-
- Private Sub btnReadHoldingRegisters_Click(sender As Object, e As EventArgs) Handles btnReadHoldingRegisters.Click
- Try
- Dim slaveAddress As Byte = 255 ' The Unit Identifier
- Dim functionCode As Byte = 3 ' Function.
- Dim id As UShort = functionCode ' Transaction Identifier .
- Dim startAddress As UShort = 50780 ' Starting Address .
- Dim numberOfPoints As UShort = 2 ' Quantity of Registers . Read 2 real(float) number. Note: Unit Word(1 Word = 2byte= 16bit, 1 Real/Float = 4byte= 2 Word = 32 bits).
- Dim frame As Byte() = Me.ReadHoldingRegisters(id, slaveAddress, startAddress, functionCode, numberOfPoints)
- txtSendMsg.Text = Me.Display(frame) ' Display frame: Sends.
- Me.Write(frame) ' Send message(frame) to device.
- Thread.Sleep(100) ' Delay 100ms.
- ' Received data.
- Dim buffRecei As Byte() = Me.Read()
- If IsDBNull(buffRecei) Then
- Return
- End If
- Dim sizeBytes = buffRecei(8) ' The data byte received.
- If (functionCode = buffRecei(7)) Then
- Dim byteMsg As Byte() = New Byte(8 + sizeBytes) {}
- Array.Copy(buffRecei, 0, byteMsg, 0, byteMsg.Length)
- txtReceiMsg.Text = Me.Display(byteMsg) ' Display frame: received.
- Dim data As Byte() = New Byte(sizeBytes - 1) {} ' Okay: Ready!!!
- Array.Copy(buffRecei, 9, data, 0, data.Length)
- ' Process data.
- Dim result As UShort() = DataType.Word.ToArray(data) ' Convert byte array to ushort array.
- txtResult.Text = String.Empty
- For Each item As UShort In result
- txtResult.Text += String.Format("{0}/ ", item)
- Next
- 'Exception Response
- Else
- 'slave may answer with error at 8th and 9th byte
- '8th byte: hex 81,82,83,84,85,86,8f,90 means that response answers with error ex: if request function was 03 then error response will be 83
- '9th byte: the exception code
- Select Case buffRecei(7)
- Case 129, 130, 131, 132, 133, 134, 143, 144
- Dim byteMsg As Byte() = New Byte(8) {}
- Array.Copy(buffRecei, 0, byteMsg, 0, byteMsg.Length)
- txtReceiMsg.Text = Me.Display(byteMsg) ' Display frame: received.
- Select Case buffRecei(8)
- Case 1 : txtResult.Text = "Slave Exception: Illegal Function !!!"
- Case 2 : txtResult.Text = "Slave Exception: Illegal Data Address !!!"
- Case 3 : txtResult.Text = "Slave Exception: Illegal Data Value !!!"
- Case 4 : txtResult.Text = "Slave Exception: Slave Device Failure !!!"
- Case 5 : txtResult.Text = "Slave Exception: Acknowledge !!!"
- Case 6 : txtResult.Text = "Slave Exception: Slave Device Busy !!!"
- Case 7 : txtResult.Text = "Slave Exception: Negative Acknowledge !!!"
- Case 8 : txtResult.Text = "Slave Exception: Memory Parity Error !!!"
- Case 10 : txtResult.Text = "Slave Exception: Gateway Path Unavailable !!!"
- Case 11 : txtResult.Text = "Slave Exception: Gateway Target Device Failed to Respond !!!"
- End Select
- End Select
- End If
- Catch ex As Exception
- MessageBox.Show(Me, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
- End Try
- End Sub