Blog
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.
Forberedelser
Du har allerede angivet din Web-IO Digital
- med magt,
- konfigurerede ind- og udgange,
- tilsluttet den til dit netværk,
- tildelt den en IP-adresse – hvilket med WuTility ikke er noget problem.
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 forbindelsenForbindelsen å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 oprettetSå 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ærdierFor 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.
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.