重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
用 vb.net socket通信
創(chuàng)新互聯(lián)建站自2013年起,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元岐山做網(wǎng)站,已為上家服務(wù),為岐山各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
Dim th As Threading.Thread
2 Dim tcpl As System.Net.Sockets.TcpListener
3
4 Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
5 th = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf MyListen))
6 th.Start()
7 End Sub
8
9 Public Sub SendMessage()Sub SendMessage(ByVal IP As String, ByVal SendMsg As String)
10 Try
11 If IP "" Then
12 Dim tcpc As New System.Net.Sockets.TcpClient(IP, 5656)
13 Dim tcpStream As Net.Sockets.NetworkStream = tcpc.GetStream
14 Dim reqStream As New IO.StreamWriter(tcpStream)
15 reqStream.Write(SendMsg)
16 reqStream.Flush()
17 tcpStream.Close()
18 tcpc.Close()
19 End If
20 Catch ex As Exception
21 MsgBox(ex.Message.ToString)
22 End Try
23 End Sub
24 Private Sub MyListen()Sub MyListen()
25 Try
26 Dim ipAddress As System.Net.IPAddress = System.Net.Dns.Resolve(System.Net.Dns.GetHostName).AddressList(0)
27 tcpl = New System.Net.Sockets.TcpListener(ipAddress, 5656)
28 tcpl.Start()
29 While True
30 Dim s As System.Net.Sockets.Socket = tcpl.AcceptSocket()
31 Dim MyBuffer(1024) As Byte
32 Dim i As Integer
33 i = s.Receive(MyBuffer)
34 If i 0 Then
35 Dim lstrRec As String
36 Dim j As Integer
37 For j = 0 To i - 1
38 TextBox1.Text += Chr(MyBuffer(j)) ","
39 Next
40 End If
41 End While
42 Catch ex As Exception
43 MsgBox(ex.Message.ToString)
44 End Try
45 End Sub
46
47 Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
48 SendMessage("192.168.0.61", TextBox2.Text)
49 End Sub
沒(méi)用過(guò)modbus通信寫(xiě)過(guò),但是使用自由通信可以
VB.net帶有通信控件,在里面設(shè)置波特率、奇偶效驗(yàn)、數(shù)據(jù)位、COM口
在PLC里做個(gè)自由通信就可以
得說(shuō)明是什么型號(hào)的PLC啊,串口還是網(wǎng)口,VB6還是VB.NET?
算了,寫(xiě)段代碼,VB.NET與Q系列以太網(wǎng)通訊的:
Imports?System.Net
Imports?System.Runtime.InteropServices
Public?Class?Form1
Dim?Handle1?As?Int32
Dim?EntLink1?As?Boolean
Dim?ScanCount1?As?Long
Dim?PLC?As?New?EntQsPlc_Asc.PlcClient'EntQsPlc_ASC.DLL是Q系列以太網(wǎng)通訊組件
Public?Declare?Function?timeGetTime?Lib?"winmm.dll"?()?As?UInt32
Private?Sub?Form1_Load(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?MyBase.Load
Me.CenterToScreen()
cmbReadMry.Items.Clear()
cmbReadMry.Items.Add("X")
cmbReadMry.Items.Add("Y")
cmbReadMry.Items.Add("M")
cmbReadMry.Items.Add("D")
cmbReadMry.Items.Add("R")
cmbReadMry.Items.Add("Z")
'
cmbWriteMry.Items.Clear()
cmbWriteMry.Items.Add("X")
cmbWriteMry.Items.Add("Y")
cmbWriteMry.Items.Add("M")
cmbWriteMry.Items.Add("D")
cmbWriteMry.Items.Add("R")
cmbWriteMry.Items.Add("Z")
'
cmbBitMry.Items.Clear()
cmbBitMry.Items.Add("X")
cmbBitMry.Items.Add("Y")
cmbBitMry.Items.Add("M")
'
cmbReadType.Items.Clear()
cmbReadType.Items.Add("INT16")
cmbReadType.Items.Add("UINT16")
cmbReadType.Items.Add("DINT32")
cmbReadType.Items.Add("HEX32")
cmbReadType.Items.Add("REAL32")
cmbReadType.Items.Add("BIN16")
'
cmbWriteType.Items.Clear()
cmbWriteType.Items.Add("INT16")
cmbWriteType.Items.Add("UINT16")
cmbWriteType.Items.Add("DINT32")
cmbWriteType.Items.Add("HEX32")
cmbWriteType.Items.Add("REAL32")
cmbWriteType.Items.Add("BIN16")
cmbReadMry.SelectedIndex?=?3
cmbWriteMry.SelectedIndex?=?3
cmbBitMry.SelectedIndex?=?2
cmbReadType.SelectedIndex?=?0
cmbWriteType.SelectedIndex?=?0
lstRead.Items.Clear()
txtWrite.Text?=?""
'
cmbCmdType.SelectedIndex?=?0
End?Sub
Private?Sub?butLink_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butLink.Click
Dim?re?As?Short
Dim?restr?As?String?=?""
re?=?PLC.EntLink(Trim(txtLocalIP.Text),?Val(txtLocalPort.Text),?Trim(txtRemoteIP.Text),?Val(txtRemotePort.Text),?"DEMO",?Handle1,?1000,?CBool(cmbCmdType.SelectedIndex))
txtReLink.Text?=?re.ToString
If?re?=?0?Then
EntLink1?=?True
MsgBox("PLC聯(lián)接成功!?")
Else
EntLink1?=?False
MsgBox("PLC聯(lián)接失敗:?"??restr)
End?If
End?Sub???????????
Private?Sub?butClose_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butClose.Click
Dim?re?As?Short
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
re?=?PLC.DeLink(Handle1)
txtReClose.Text?=?re.ToString
End?Sub
Private?Sub?butRead_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butRead.Click
Dim?re?As?Short
Dim?i?As?Short
Dim?RD()?As?Object
ReDim?RD(Val(txtReadCnt.Text?-?1))
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
'?Exit?Sub
End?If
Dim?mry?As?EntQsPlc_Asc.PlcClient.PlcMemory?=?cmbReadMry.SelectedIndex?+?1
Dim?typ?As?EntQsPlc_Asc.PlcClient.DataType?=?cmbReadType.SelectedIndex?+?1
re?=?PLC.CmdRead(Handle1,?mry,?typ,?CInt(txtReadAdd.Text),?CUShort(txtReadCnt.Text),?RD)
txtReRead.Text?=?re.ToString
lstRead.Items.Clear()
For?i?=?0?To?UBound(RD)?Step?1
If?Not?IsNothing(RD(i))?Then?lstRead.Items.Add(RD(i))
Next?i
If?re??0?Then
Timer1.Enabled?=?False
butScan.Text?=?"Cycle?R/W"
End?If
End?Sub
Private?Sub?butWrite_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butWrite.Click
Dim?re?As?Short
Dim?i?As?Short
Dim?temp()?As?String
Dim?WD()?As?Object
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
ReDim?WD(Val(txtWriteCnt.Text)?-?1)
temp?=?Split(txtWrite.Text,?vbCrLf)
For?i?=?0?To?UBound(WD)?Step?1
If?i??UBound(temp)?Then
WD(i)?=?0
Else
WD(i)?=?Trim(temp(i))
End?If
Next?i
Dim?mry?As?EntQsPlc_Asc.PlcClient.PlcMemory?=?cmbWriteMry.SelectedIndex?+?1
Dim?typ?As?EntQsPlc_Asc.PlcClient.DataType?=?cmbWriteType.SelectedIndex?+?1
re?=?PLC.CmdWrite(Handle1,?mry,?typ,?CInt(txtWriteAdd.Text),?CUShort(txtWriteCnt.Text),?WD)
txtReWrite.Text?=?re.ToString
If?re??0?Then
Timer1.Enabled?=?False
butScan.Text?=?"Cycle?R/W"
End?If
End?Sub
Private?Sub?butScan_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butScan.Click
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
Timer1.Enabled?=?Not?Timer1.Enabled
If?Timer1.Enabled?Then
ScanCount1?=?0
butScan.Text?=?"Stop?R/W"
Else
butScan.Text?=?"Cycle?R/W"
End?If
End?Sub
Private?Sub?Timer1_Tick(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Timer1.Tick
Timer1.Enabled?=?False
Dim?tim?As?Integer?=?timeGetTime
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
'
Call?butRead_Click(Nothing,?Nothing)
Call?butWrite_Click(Nothing,?Nothing)
'
If?(Val(txtReRead.Text)??0)?Or?(Val(txtReWrite.Text)??0)?Then
butScan.Text?=?"Cycle?R/W"
Exit?Sub
Else
ScanCount1?+=?1
txtScanCnt.Text?=?ScanCount1
txtScanPrd.Text?=?(timeGetTime?-?tim)??"ms"
End?If
Timer1.Enabled?=?True
End?Sub
Private?Sub?butBitTest_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butBitTest.Click
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
Dim?rd?As?Boolean
Dim?re?As?Short
Dim?mry?As?EntQsPlc_Asc.PlcClient.PlcMemory?=?cmbBitMry.SelectedIndex?+?1
re?=?PLC.Bit_Test(Handle1,?mry,?CUShort(txtBitAdd.Text),?rd)
txtBitTest.Text?=?rd
txtReBit.Text?=?re
End?Sub
Private?Sub?butBitSet_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butBitSet.Click
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
Dim?re?As?Short
re?=?PLC.Bit_Set(Handle1,?cmbBitMry.SelectedIndex?+?1,?Val(txtBitAdd.Text))
txtReBit.Text?=?re
End?Sub
Private?Sub?butBitRst_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butBitRst.Click
If?Not?EntLink1?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
Dim?re?As?Short
re?=?PLC.Bit_Reset(Handle1,?cmbBitMry.SelectedIndex?+?1,?Val(txtBitAdd.Text))
txtReBit.Text?=?re
End?Sub
End?Class
提供一個(gè)VB.NET與OMRON以太網(wǎng)通訊的代碼,是我項(xiàng)目里面復(fù)制出來(lái)的:
Dim?Handle1?As?Int32?'PLC的連接句柄
Dim?EntLink?As?Boolean?'連接標(biāo)志
Dim?PLC?As?New?FinsTcp.PlcClient?'引用OMRON的通訊組件
Private?Sub?butLink_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butLink.Click
Dim?re?As?Short
Dim?restr?As?String?=?""
re?=?PLC.EntLink(Trim(txtLocalIP.Text),?Val(txtLocalPort.Text),?Trim(txtRemoteIP.Text),?Val(txtRemotePort.Text),?"DEMO",?Handle1)
txtReLink.Text?=?re.ToString
If?re?=?0?Then
EntLink?=?True
MsgBox("PLC聯(lián)接成功!?")
Else
EntLink?=?False
MsgBox("PLC聯(lián)接失敗:?"??restr)
End?If
End?Sub
Private?Sub?butClose_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butClose.Click
Dim?re?As?Short
EntLink?=?False
re?=?PLC.DeLink(Handle1)
txtReClose.Text?=?re.ToString
End?Sub
Private?Sub?butRead_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butRead.Click
Dim?re?As?Short
Dim?i?As?Short
Dim?RD()?As?Object
ReDim?RD(Val(txtReadCnt.Text?-?1))
If?Not?EntLink?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
Dim?mry?As?FinsTcp.PlcClient.PlcMemory?=?cmbReadMry.SelectedIndex?+?1
Dim?typ?As?FinsTcp.PlcClient.DataType?=?cmbReadType.SelectedIndex?+?1
re?=?PLC.CmdRead(Handle1,?mry,?typ,?CUShort(Val(txtReadAdd.Text)),?CUShort(Val(txtReadCnt.Text)),?RD)
txtReRead.Text?=?re.ToString
lstRead.Items.Clear()
For?i?=?0?To?UBound(RD)?Step?1
If?Not?IsNothing(RD(i))?Then?lstRead.Items.Add(RD(i))
Next?i
If?re??0?Then
Timer1.Enabled?=?False
butScan.Text?=?"Cycle?R/W"
End?If
End?Sub
Private?Sub?butWrite_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?butWrite.Click
Dim?re?As?Short
Dim?i?As?Short
Dim?temp()?As?String
Dim?WD()?As?Object
If?Not?EntLink?Then
MsgBox("還未與PLC建立聯(lián)接!")
Exit?Sub
End?If
ReDim?WD(Val(txtWriteCnt.Text)?-?1)
temp?=?Split(txtWrite.Text,?vbCrLf)
For?i?=?0?To?UBound(WD)?Step?1
If?i??UBound(temp)?Then
WD(i)?=?0
Else
WD(i)?=?Trim(temp(i))
End?If
Next?i
Dim?mry?As?FinsTcp.PlcClient.PlcMemory?=?cmbWriteMry.SelectedIndex?+?1
Dim?typ?As?FinsTcp.PlcClient.DataType?=?cmbWriteType.SelectedIndex?+?1
re?=?PLC.CmdWrite(Handle1,?mry,?typ,?CUShort(Val(txtWriteAdd.Text)),?CUShort(Val(txtWriteCnt.Text)),?WD)
txtReWrite.Text?=?re.ToString
If?re??0?Then
Timer1.Enabled?=?False
butScan.Text?=?"Cycle?R/W"
End?If
End?Sub
最簡(jiǎn)單的辦法是用句柄操作窗體,這種方法就好比是計(jì)算機(jī)在代替你在打開(kāi)設(shè)置窗口,完成設(shè)置。
比較難實(shí)現(xiàn)的方法是用API,不過(guò)我不知道用那些API,而且還要驅(qū)動(dòng)支持
因?yàn)関b。net是高級(jí)語(yǔ)言,不能直接操作驅(qū)動(dòng),所以直接寫(xiě)匯編是不可行的
關(guān)于串口通訊的問(wèn)題:
很明顯,你還不知道(不會(huì)、不習(xí)慣)使用事件驅(qū)動(dòng)的方式接收數(shù)據(jù)。
建議你仔細(xì)看看串口組件(無(wú)論VB6還是VB.net)的OnComm事件,你的問(wèn)題很容易解決。
關(guān)于以太網(wǎng)通訊:
在TCP通訊中端口確實(shí)可以重用,你百度一下“TCP端口重用”能查到很多示例。
但絕大多數(shù)情況下不推薦端口重用,而應(yīng)該采取服務(wù)器端建立連接池的方法。
或者,干脆不用TCP,用UDP解決也可以。