VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例

主要是项目需要,本身是plc工程师,但有上位机编程的需求,就试着去自己做编程,主要是觉得VB要简单点,于是就下载了微软的vs2019个人版,电脑系统是win10.。
下面从两个方面来介绍,一个是PLC的配置和编程,一个是VB.net的编程,其中并不涉及复杂的功能,只是简单的应用,达到数据交换的目的即可。

一、PLC
本例中,PLC使用的是西门子的S7-1200系列,具体型号是1214C DC/DC/DC,订货号是6ES7 214-1AG40-0XB0,固件版本是V4.4。

在西门子PLC中,socket通信属于开放式通信,所以本例中使用的指令为:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第1张图片
其中主要用到TCON(建立连接)、TDISCON(断开连接)、TSEND(发送数据)、TRCV(接收数据)、TRESET(终止现有连接并开启新的连接)。
这其中,TCON需要进行一定的设置,如下:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第2张图片
点开箭头所指的图表,进入socket的组态页面:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第3张图片
如上图,我大致标了6个地方,
1:这里需要设置和PLC进行socket连接的伙伴,也就是上位机,这里设置为未指定即可。
2:选择本地PLC的端口即可。
3:此处设置连接类型等数据,因为本例中使用TCP,所以连接类型选择TCP,连接ID是用于区别多个TCP连接的,比如你要连接两个上位机,那么这个ID是不同的,可以随意设置(范围:W#16#0001 到 W#16#0FFF),但后面的发送接收数据等数据块设置的时候,都要依据此处设置的。连接数据是用于保存数据的DB块,可以在下拉菜单中选择新建,PLC会自动创建一个DB块,如图中的“PLC_1_Connection_DB”。
4:伙伴的地址,填上你的上位机(或者和PLC连接的任意终端的IP)的IP地址即可。
5:因为socket连接有服务器和客户端之分,所以在此处选择哪个做客户端(主动连接),哪个做服务器(被动监听),本例中PLC为服务器,上位机选择“主动建立连接”。
6:设置PLC本地端口,用于上位机(客户端)主动连接时所用,一般建议设为2000-5000中的一个,可根据实际情况调整。
以上,关于TCON的连接组态就完成了。
下面说一下各功能块调用:
TCON:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第4张图片
可以看到,TCON块的调用,需要添加触发(REQ)、ID(前面组态里配置的)、连接数据块(前面组态配置的)。当给REQ一个上升沿脉冲后,TCON即进入等待连接状态(监听):
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第5张图片
其中status的值16#7002即表示PLC在等待连接,一旦有客户端连接上,busy的值为false,done为true,status变为0000.

TSEND:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第6张图片
tsend需要添加触发(REQ)、ID(同上)、LEN(发送数据长度)、DATA(发送数据缓存区)。其中,如果发送数据长度LEN的值为0 ,即不指定长度,那么默认会发送缓存区所有数据。

TRCV:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第7张图片
TRCV需要添加触发(EN_R)、ID(同上)、LEN(接收数据长度)、ADHOC(动态长度数据,仅TCP使用)、DATA(数据缓存区),本例中LEN的值设为0,即接收数据以DATA中实际数据为准,其实际长度,以RCVD_LEN中的值为准。

TDISCON:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第8张图片
断开连接就非常简单,只需要触发(REQ)和ID(同上),当REQ有上升沿脉冲后,即可断开ID对应的socket连接。

TRESET:
VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第9张图片
TRESET也很简单,REQ触发,ID指定连接,当REQ有上升沿,便复位指定连接,并重新建立一个新的连接(socket)。

到这里,关于PLC这边的事就差不多了。

二、VB.net中的socket程序
此处主要是参考了微软本身的MSDN中提供的关于socket连接(服务器和客户端程序),在此基础上,根据实际需要做了更改。
打开VisualStudio2019,新建一个VB.net窗体项目:

Imports System.Net
Imports System.Net.Sockets
Imports System.Text


Public Class Form1

    Dim ip As IPAddress
    Dim ipe As IPEndPoint
    Dim port As Integer
    Dim host As String
    Dim s As Socket
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = "192.168.0.1"
        TextBox2.Text = 2000

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ip = IPAddress.Parse(TextBox1.Text)
        port = Integer.Parse(TextBox2.Text)
        ipe = New IPEndPoint(ip, port)
        s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        s.Connect(ipe)
        Console.WriteLine("connect ok")
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If s.Connected = True Then
            s.Close()
            Console.WriteLine("connect close")
        End If
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        Dim bytes(100) As Byte
        Dim a As Integer
        bytes = Encoding.ASCII.GetBytes(TextBox3.Text)
        a = s.Send(bytes)
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Dim bytes(100) As Byte
        Dim a As Integer
        s.Receive(bytes)
        TextBox4.Text = Encoding.ASCII.GetString(bytes)
    End Sub
End Class

上面是比较简单的读写数据的程序,但已经满足和PLC的数据交换。案例中程序都是使用按钮触发,如果需要自动读取,可以使用定时器Timer触发即可。本例中并没有使用异步通信、线程等比较复杂的功能,主要在于能满足使用为准。

VisaulStudio2019下用VB.net实现socket与西门子PLC进行通讯案例_第10张图片

你可能感兴趣的:(socket)