【问题标题】:Sending FINS Commands from VB.net to PLC从 VB.net 向 PLC 发送 FINS 命令
【发布时间】:2014-06-16 23:14:01
【问题描述】:

我有一个简单的 vb.net 程序,我正在尝试发送 FINS 命令并使用 UDP 接收响应。我一直在使用以下问题作为参考点FINS Commands C#,但相信我的数据包有问题,或者我可能只是没有完全正确。

我当前的程序有 4 个文本框(TBIPTBPORTTBSENDTBReceive)。当我运行程序时,我输入要发送的 IP、端口、数据包信息,然后单击一个按钮。我希望收到的信息发送到TBReceive

我的表单加载代码如下所示:

Dim publisher As New Sockets.UdpClient(0)
Dim Subsriber As New Sockets.UdpClient(9600)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Subsriber.Client.ReceiveTimeout = 5000
        Subsriber.Client.Blocking = False


    End Sub

我的按钮点击:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        publisher.Connect(TBIP.Text, TBPort.Text)
        Dim Sendbytes() As Byte = ASCII.GetBytes(TBSend.Text)
        publisher.Send(Sendbytes, Sendbytes.Length)

        Subsriber.Client.Blocking = True


        Timer1.Start()

    End Sub

我的计时器:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Try
            Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0)
            Dim rcvbytes As [Byte]() = Subsriber.Receive(ep)
            Dim returndata As String = ASCII.GetString(rcvbytes)

            TBReceive.Text = returndata.ToString

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class

在 Omron PLC 上,我正在尝试读取 CIO 100。我的 IP 地址是 10.0.1.91,所以我的字符串在下面。 (5B 是最后一个八位字节):

80 00 02 01 02 00 01 5B 00 12 01 01 00 00 12 34

为了便于阅读,我在上面的 HEX 位之间添加了空格。

第一个问题是我正在转换或尝试将信息作为 ASCII 发送吗? 任何帮助将不胜感激。

【问题讨论】:

  • ASCII.GetBytes(TBSend.Text) 不可能产生这些字节值。非常不清楚你在做什么。
  • 我正在尝试使用 UDP 将上述十六进制值作为字符串发送到 PLC。所以基本上我需要将800002010200015B0012010100001234 作为 UDP 数据包的十六进制字符串发送,然后在响应中接收十六进制字符串。我只知道如何使用 ASCII 发送,我认为这对我没有任何作用,因为我需要将它作为 HEX 字符串发送..

标签: vb.net plc fins


【解决方案1】:

十六进制适用于人类,您的 PLC 将需要 二进制 数据。您需要在要在 TextBox 中输入的“800002010200015B0012010100001234”十六进制字符串和 PLC 喜欢的二进制字节之间进行转换。您可以使用的示例代码:

Module HexConversions
    Public Function HexToBinary(hex As String) As Byte()
        hex = hex.Replace(" ", "")
        If hex.Length mod 2 <> 0 then Throw New FormatException 
        Dim bytes = hex.Length \ 2 - 1
        Dim bin(bytes) As Byte
        For ix As Integer = 0 to bytes
            bin(ix) = Byte.Parse(hex.Substring(ix * 2, 2), Globalization.NumberStyles.HexNumber)
        Next
        Return bin
    End Function

    Public Function BinaryToHex(bytes() As Byte, Optional usespace As Boolean = False) As String
        Dim hex = BitConverter.ToString(bytes)
        Return hex.Replace("-", IIf(usespace, " ", ""))
    End Function
End Module

您将在现有代码中使用如下:

    Try         
        Dim Sendbytes() As Byte = HexConverter.HexToBinary(TBSend.Text)
        publisher.Send(Sendbytes, Sendbytes.Length)
    Catch ex As FormatException
        MessageBox.Show("Please enter a valid hex string")
        TBSend.Focus()
        TBSend.SelectAll()
    End Try

    Dim rcvbytes() As Byte = Subsriber.Receive(ep)
    TBReceive.Text = HexConverter.BinaryToHex(rcvbytes, True)

【讨论】:

  • 它抛出一个 InvalidOperationException:An error occurred creating the form. See Exception.InnerException for details. The error is: Only one usage of each socket address (protocol/network address/port) is normally permitted
  • 这当然与我发布的代码没有任何关系,它不使用套接字。问另一个关于它的问题。在您先查看 Google 命中后,这是一个非常常见的错误。
  • 这还不完全正确。命令发送,但我猜 PLC 不理解它,因为没有响应,甚至没有尝试响应......
猜你喜欢
  • 2012-03-30
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多