Ved hjælp af følgende programeksempel kan du repræsentere din Web-IO Digital med dens indgange og udgange i et Windows-program. Du kan også skifte mellem Web-IO-udgangene.

Kom i gang - bestil en prøveversion i 30 dage.

Prøv vores produkter fra Wiesemann & Theis gratis i 30 dage ved at skrive det i ordrenoten:
Ønsker at teste produktet.

Hvis du ikke ønsker at gøre brug af din returret inden for 30 dage, skal du blot betale den medfølgende faktura. Gratis forsendelse i Danmark.

Læs produktspecifikationen her:

Forberedelser

Du har allerede angivet din Web-IO Digital

1. Kombination af de forskellige betjeningselementer og visningsobjekter i VB.net-formularen

Ud over de objekter, der er vist her, har programmet også brug for en timer til polling (timer_polling).

Når du navngiver de enkelte objekter, er det en god idé at bruge logiske navne. I dette eksempel beskriver den første del af navnet objekttypen og den anden del funktionen.

2. Start af programmet

Mens det er lige så nemt at konstruere grafiske brugergrænseflader i Visual Basic 2005 Express som i de tidligere versioner, kan andre opgaver i starten kræve lidt tilvænning.

VB 2005 indeholder f.eks. ikke kontrolelementet Winsock, som VB5 og VB6 gjorde.

I stedet skal du bruge Import-sætningen til at eksemplificere navnerummet for socket-klasserne i kildetekstens header. Derudover skal den socket, som kommunikationen skal foregå over, oprettes, og du skal definere en buffer til inputdataene.

Desuden blev indkapslingen af individuelle objekter i VB 2005 udviklet så langt, at objekter, der oprettes i en tråd, ikke kan tilgås fra en anden tråd. For eksempel kan et afkrydsningsfelt, der blev oprettet i tråd A, ikke indstilles fra tråd B.

For stadig at gøre objektets egenskaber tilgængelige for andre tråde, skal underprocedurer for objektskift oprettes i en separat tråd. Derefter dannes der delegater til disse underprocedurer, som de andre tråde kan få adgang til.

For eksempel for at aktivere kontrolelementer i formularen, når det er lykkedes at åbne en forbindelse, eller for at blokere dem, når forbindelsen er lukket, men også for at justere input/output-afkrydsningsfelterne til de faktiske I/O-tilstande, når data er modtaget.

Imports System.Net.Sockets
				Imports System.Net
				Public Class Form1
						Public Structure IO_State
						Dim outputstate0 As Boolean
						Dim outputstate1 As Boolean
						Dim inputstate0 As Boolean
						Dim inputstate1 As Boolean
						Dim countervalue0 As Long
						Dim countervalue1 As Long
						End Structure
				Private Delegate Sub DelegateSub()
					Private connectenable As New DelegateSub(AddressOf connect_enable)
					Private disconnectenable As New DelegateSub(AddressOf
				disconnect_enable)
					Private formupdate As New DelegateSub(AddressOf form_update)
					Dim TCP_client As Socket
					Dim connection_ar As IAsyncResult
					Dim receivebuffer(511) As Byte
					Dim IOState As IO_State
				Private Sub connect_enable()
					bt_connect.Enabled = False
					gb_io.Enabled = True
					bt_disconnect.Enabled = True
					Timer_polling.Enabled = True
					ToolStripStatusLabel1.Text = "Connected to " + tb_ip.Text + " : " + tb_port.Text
					End Sub
				Private Sub disconnect_enable()
					bt_connect.Enabled = True
					gb_io.Enabled = False
					bt_disconnect.Enabled = False
					timer_polling.Enabled = False
					ToolStripStatusLabel1.Text = "No Connection"
					End Sub
					Private Sub form_update()
					If IOState.inputstate0 = True Then
						cb_input0.Checked = True
					Else
						cb_input0.Checked = False
					End If
					If IOState.inputstate1 = True Then
						cb_input1.Checked = True
					Else
						cb_input1.Checked = False
					End If
					If IOState.outputstate0 = True Then
						cb_output0.Checked = True
					Else
						cb_output0.Checked = False
					End If
					If IOState.outputstate1 = True Then
						cb_Output1.Checked = True
					Else
						cb_Output1.Checked = False
					End If
					tb_counter0.Text = IOState.countervalue0
					tb_counter1.Text = IOState.countervalue1
					End Sub

3. Kontrol af tilslutning

Etablering af forbindelsen

Forbindelsen åbnes ved at indtaste Web-IO’ens IP-adresse i tekstfeltet ed_ip og klikke på knappen bt_connect.

Private Sub bt_connect_Click(ByVal sender As System.Object, _
				ByVal e As System.EventArgs) Handles bt_connect.Click
				Dim WebIOep As New IPEndPoint(IPAddress.Parse(tb_ip.Text),
					Val(tb_port.Text))

					If tb_ip.Text <> "" And tb_port.Text <> "" Then
					TCP_client = New Socket(AddressFamily.InterNetwork, SocketType.Stream, _ ProtocolType.Tcp)
					bt_connect.Enabled = False
					Try
						TCP_client.BeginConnect(WebIOep, New AsyncCallback(AddressOf callback_connect), _
						TCP_client)
						Catch ex As Exception
					End Try
					End If
				End Sub
Åbning af forbindelsen

Til TCP/IP-håndtering defineres først et IPEndPoint ud fra IP-adresse og TCP-port, som bruges til at initialisere TCP_client-socket. Som en del af forbindelsesanmodningen oprettes en reference til en callback-procedure.

Forbindelsen er oprettet

Så snart Web-IO’en accepterer forbindelsen, køres callback-proceduren. En invoke bruges til at påkalde delegaten for proceduren, som aktiverer kontrolelementerne og viser forbindelsesstatus i statuslinjen. Derudover oprettes en reference til en callback-rutine til datamodtagelse.

Private Sub callback_connect(ByVal ar As IAsyncResult)
				Invoke(connectenable)
				connection_ar = ar
				Try
					TCP_client.EndConnect(ar)
					TCP_client.BeginReceive(receivebuffer, 0, 512, SocketFlags.None, _
					New AsyncCallback(AddressOf callback_readdata), TCP_client)
					Catch ex As Exception
					closeconnections()
					End Try
				End Sub
Frakobling

Forbindelsen forbliver åben, indtil den afsluttes ved, at brugeren klikker på knappen Afbryd forbindelsen, eller Web-IO’en afslutter forbindelsen.

Private Sub bt_disconnect_Click(ByVal sender
						As System.Object, _
						ByVal e As System.EventArgs) Handles bt_disconnect.Click
						Invoke(disconnectenable)
						closeconnections()
						End Sub

I dette tilfælde påkaldes en tilsvarende procedure.

Private Sub closeconnections()
						Try
							TCP_client.EndReceive(connection_ar)
						Catch ex As Exception
						End Try
						Try
							TCP_client.Shutdown(SocketShutdown.Both)
						Catch ex As Exception
						End Try
						Try
							TCP_client.Close()
						Catch ex As Exception
						End Try
						Invoke(disconnectenable)
						End Sub
Forbindelsesfejl

Alle handlinger, der påvirker TCP/IP-kommunikation, udføres i Try-instruktionen. Hvis der opstår fejl, aktiveres CloseConnection-proceduren også.

4. Drift og kommunikation fra klientsiden

Så snart der er oprettet forbindelse til Web-IO, kan brugeren bruge de tilsvarende programelementer til at sende kommandoer til Web-IO.

Private Sub sendcommand(ByVal sendstring As String)
					Dim senddata As Byte() = System.Text.Encoding.ASCII.GetBytes(sendstring)
					Try
					TCP_client.Send(senddata)
					Catch ex As Exception
					closeconnections()
					End Try
				End Sub
Indstilling af udgange

Brugeren indstiller udgangene ved hjælp af de to afkrydsningsfelter cb_outputx. Programmet bruger MouseUP-hændelsen for dette objekt. Hvis man bruger MouseUp, dvs. slipper afkrydsningsfeltet for output, udfører programmet den tilsvarende procedure og – afhængigt af om afkrydsningsfeltet er sat eller ej – sender den relevante kommando til Web-IO.

Private Sub cb_output0_MouseUp(ByVal sender As Object, _
						ByVal e As System.Windows.Forms.MouseEventArgs) Handles cb_output0.MouseUp
						If cb_output0.Checked Then
							sendcommand("GET /outputaccess0?PW=" + tb_password.Text + "&State=ON&")
						Else
							sendcommand("GET /outputaccess0?PW=" + tb_password.Text + "&State=OFF&")
						End If
						End Sub
Private Sub cb_output1_MouseUp(ByVal sender As Object, _
					ByVal e As System.Windows.Forms.MouseEventArgs) Handles cb_output1.MouseUp
					If cb_output1.Checked Then
						sendcommand("GET /outputaccess1?PW=" + tb_password.Text + "&State=ON&")
					Else
						sendcommand("GET /outputaccess1?PW=" + tb_password.Text + "&State=OFF&")
					End If
					End Sub
Forespørgsel på output/input-status

Brugeren kan anmode om status for udgangene og indgangene ved at klikke på den tilsvarende knap.

Private Sub bt_outputs_read_Click(ByVal
					sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_outputs_read.Click
						sendcommand("GET /output?PW=" + tb_password.Text + "&")
					End Sub
Private Sub bt_inputs_read_Click(ByVal
					sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_inputs_read.Click
						sendcommand("GET /input?PW=" + tb_password.Text + "&")
					End Sub
Læs/ryd tællere

Indgangstællernes tællertilstande kan også aflæses eller slettes.

Private Sub bt_counter_read0_Click(ByVal sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_counter_read0.Click
						sendcommand("GET /counter0?PW=" + tb_password.Text + "&")
					End Sub
Private Sub bt_counter_read1_Click(ByVal sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_counter_read0.Click
						sendcommand("GET /counter1?PW=" + tb_password.Text + "&")
					End Sub
Private Sub bt_counter_clear0_Click(ByVal sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_counter_clear0.Click
						sendcommand("GET /counterclear0?PW=" + tb_password.Text + "&")
					End Sub
Private Sub bt_counter_clear1_Click(ByVal sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_counter_clear0.Click
						sendcommand("GET /counterclear1?PW=" + tb_password.Text + "&")
					End Sub

Naturligvis kan alle tællere aflæses eller slettes på samme tid.

Private Sub bt_counter_readall_Click(ByVal sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_counter_readall.Click
						sendcommand("GET /counter?PW=" + tb_password.Text + "&")
					End Sub
Private Sub bt_counter_clearall_Click(ByVal sender As System.Object, _
					ByVal e As System.EventArgs) Handles bt_counter_clearall.Click
						sendcommand("GET /counterclear?PW=" + tb_password.Text + "&")
					End Sub

5. Modtagelse af data fra Web-IO

Behandle og vise de modtagne data
Alle kommandoer og anmodninger til Web-IO kvitteres med en svarstreng. Svarene har en bestemt struktur afhængigt af typen.

  • For udgangene: output;<binær værdi af udgangsstatus i hexadecimalt format>
  • For indgangene: input;<binær værdi af indgangsstatus i hexadecimalt format>
  • For tællerne: counterx;<decimal tællerstatus>
  • eller counter;<decimal counter state 0 >; <decimal counter state 0 >;….. hvis du vil læse alle tællere på samme tid.
  • Alle svarstrenge afsluttes med en 0-byte.
  • Når data modtages, aktiveres den tilsvarende Callback-procedure.
Private Sub callback_readdata(ByVal ar As IAsyncResult)
					If TCP_client.Connected Then
					Dim bytesread As Integer
					Try
					bytesread = TCP_client.EndReceive(ar)
					Catch ex As Exception
					End Try
					If bytesread = 0 Then
						closeconnections()
					Else
						Dim receivestring As String
						receivestring = System.Text.Encoding.ASCII.GetString(receivebuffer, 0, _
						receivebuffer.Length)
						receivebuffer.Clear(receivebuffer, 0, 512)
						Try
						TCP_client.BeginReceive(receivebuffer, 0, 512, SocketFlags.None, New AsyncCallback(AddressOf
						callback_readdata), TCP_client)
						Catch ex As Exception
						closeconnections()
						End Try
						Select Case Mid(receivestring, 1, 1)
						Case "i"
							If (Val(Mid(receivestring, 7, 1)) And 1) = 1 Then
							IOState.inputstate0 = True
							Else
							IOState.inputstate0 = False
							End If
							If (Val(Mid(receivestring, 7, 1)) And 2) = 2 Then
							IOState.inputstate1 = True
							Else
							IOState.inputstate1 = False
							End If
						Case "o"
							If (Val(Mid(receivestring, 8, 1)) And 1) = 1 Then
							IOState.outputstate0 = True
							Else
							IOState.outputstate0 = False
							End If
							If (Val(Mid(receivestring, 8, 1)) And 2) = 2 Then
							IOState.outputstate1 = True
							Else
							IOState.outputstate1 = False
							End If
						Case "c"
							Dim tabpos
							If Mid(receivestring, 8, 1) = "0" Then _
							IOState.countervalue0 = Mid(receivestring, 10)
							If Mid(receivestring, 8, 1) = "1" Then _
							IOState.countervalue1 = Mid(receivestring, 10)
							If Mid(receivestring, 8, 1) = ";" Then
							tabpos = InStr(9, receivestring, ";")
							IOState.countervalue0 = Val(Mid(receivestring, 9, tabpos - 9))
							IOState.countervalue1 = Val(Mid(receivestring, tabpos + 1, _
							Len(receivestring) - tabpos - 1))
							End If
						End Select
					Invoke(formupdate)
					End If
				End If
				End Sub

Receive-proceduren bruger det første tegn i de modtagne data til at kontrollere, om der er tale om input-, output- eller tællerbeskeder. Afhængigt af dette afgøres det for eksempel, hvilken udgang der har hvilken status. Med tællerne er det muligt både at forespørge på individuelle tællerværdier og at udlæse alle tællerne på én gang. De enkelte tællertilstande udlæses derefter i decimalformat i en semikolonafgrænset streng.

6. Afstemning

Cyklisk afstemning af bestemte værdier

For at muliggøre automatisk opfriskning af displayet bruges en timer.

Afhængigt af afkrydsningsfelterne for output, input og counter polling hentes de tilsvarende oplysninger fra Web-IO med et bestemt interval.

Private Sub timer_polling_Elapsed(ByVal sender
					As System.Object, _
					ByVal e As System.Timers.ElapsedEventArgs) Handles timer_polling.Elapsed
					If (cb_input_polling.Checked And TCP_client.Connected)
					Then
						sendcommand("GET /input?PW=" + tb_password.Text + "&")
					End If
					If (cb_output_polling.Checked And TCP_client.Connected)
					Then
						sendcommand("GET /output?PW=" + tb_password.Text + "&")
					End If
					If (cb_output_polling.Checked And TCP_client.Connected)
					Then
						sendcommand("GET /output?PW=" + tb_password.Text + "&")
					End If
					If (cb_counter_polling.Checked And TCP_client.Connected)
					Then
						sendcommand("GET /counter?PW=" + tb_password.Text + "&")
					End If
					End Sub

Det ønskede interval kan indtastes i det tilsvarende tekstfelt. Når der foretages ændringer, justeres timerintervallet automatisk.

Private Sub tb_interval_TextChanged(ByVal sender As System.Object, _
						ByVal e As System.EventArgs) Handles tb_interval.TextChanged
						timer_polling.Interval = Val(tb_interval.Text)
						End Sub

programmet eksemplet understøtter alle almindelige funktioner i Web-IO i kommandostrengstilstand, optimeret til Web-IO 2x Digital Input, 2x Digital Output. For de andre Web-IO-modeller kan det være nødvendigt at tilpasse programmet. Yderligere programeksempler til socket-programmering kan findes på værktøjssiderne for Web-IO. En detaljeret beskrivelse af socket-grænsefladen til Web-IO Digital-modellerne findes i referencemanualen.

Download programeksempel

Wiesemann & Theis GmbH blev grundlagt i 1979 af Reinhard Wiesemann og Rüdiger Theis. Med 50 ansatte producerer virksomheden mikrocomputer- og netværksteknologi i Wuppertal. I 2001 introducerede Wiesemann & Theis den første industrielle temperatursensor med et netværksinterface, Web-Thermometer, og har næsten 20 års erfaring inden for områderne Industri 4.0 og Internet of Things.

Active Communication har været distributør for W&T siden 1992 i Danmark og siden 2002 også i Sverige, Norge og Island. W&T’s produkter er ekstremt brugervenlige og pålidelige til en konkurrencedygtig pris.