Blog
Kom i gang med at programmere Web-IO-enheder!
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 tilsluttet din Web-IO Digital
- med strømforsyning,
- 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.
1. Start af programmet
Mens det er lige så nemt at konstruere grafiske brugergrænseflader i Delphi 2005 som med de ældre Delphi-versioner, er det noget sværere at konstruere netværkskommunikation under Delphi.net. Det skyldes primært, at ClientSocket-kontrolelementet til framework-applikationer ikke længere findes. I stedet skal du angive navnerummet for socket-klasserne i anvendelsesområdet for at få netværksadgang.
uses
System.Drawing, System.Collections, System.ComponentModel,
System.Windows.Forms, System.Data, System.Net,
System.Net.Sockets, System.IO, System.Text, System.Configuration;Nogle procedurer, som ikke oprettes af Delphi selv, skal deklareres i kildetekstens header. (Mere om indholdet af disse procedurer senere)
private
{ Private-Deklarationen }
public
constructor Create;
procedure callback_connect(ari : IAsyncResult);
procedure callback_readdata(ari : IAsyncResult);
procedure sendcommand(sendstring : String);
procedure close();
end;Desuden skal den socket, som kommunikationen skal foregå på, oprettes, og der skal defineres en buffer til inputdata og en AsyncResult-variabel.
var
TCP_Client : Socket;
ReceiveBuffer : array [0..512] of byte;
ar : IAsyncResult;2. Kontrol af tilslutning
Etablering af forbindelsen
Forbindelsen åbnes ved at indtaste Web-IO’ens IP-adresse i tekstfeltet tb_ip og klikke på knappen bt_connect.
procedure TWinForm.bt_connect_Click(sender: System.Object; e: System.EventArgs);
var WebioEP : IPEndPoint;
begin
if (tb_ip.Text <> '') and (tb_port.Text <> '') then
begin
bt_connect.Enabled := false;
WebioEP := IPEndPoint.Create(IPaddress.Parse(tb_ip.Text),convert.ToInt16(tb_port.Text ));
TCP_Client := Socket.Create (AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.TCP);
StatusBar1.Text := 'Try to connect to ' + tb_ip.Text;
timer_polling.Enabled := true;
try
TCP_Client.BeginConnect(WebioEP,callback_connect, TCP_Client);
except
on ex : Exception
do
begin
StatusBar1.Text := 'ERROR on connecting';
close();
end;
end;
end;
end;Å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 der er oprettet forbindelse til Web-IO, køres callback-proceduren. Statuslinjen viser, at forbindelsen er åbnet, at betjeningselementerne er klar til brug, og at knappen Disconnect kan betjenes. Connect-knappen er blokeret for betjening. Derudover oprettes en reference til en callback-rutine til datamodtagelse.
procedure TWinForm.callback_connect(ari : IAsyncResult);
begin
gb_io.enabled := true;
bt_disconnect.Enabled := True;
statusbar1.Text := 'Connected to' + tb_ip.Text;
try
TCP_Client.EndConnect(ari);
TCP_Client.BeginReceive(ReceiveBuffer, 0, 512, SocketFlags.None, callback_readdata, ari.AsyncState);
except on
ex : Exception
do
begin
StatusBar1.Text := 'ERROR on connect: ' + ex.ToString;
close();
end;
end;
end;Frakobling
Forbindelsen forbliver åben, indtil den afsluttes ved, at brugeren klikker på knappen Afbryd forbindelsen, eller Web-IO’en afslutter forbindelsen.
I dette tilfælde påkaldes en tilsvarende procedure.
procedure TWinForm.close();
begin
timer_polling.Enabled := False;
Try
TCP_client.EndReceive(ar);
except
end;
Try
TCP_client.Shutdown(SocketShutdown.Both);
except
end;
Try
TCP_client.Close()
except
end;
bt_connect.Enabled := True;
gb_io.Enabled := False;
bt_disconnect.Enabled := False;
StatusBar1.Text := 'no connection';
end;procedure TWinForm.bt_disconnect_Click(sender: System.Object; e: System.EventArgs);
begin
close();
end;Forbindelsesfejl
Alle handlinger i forbindelse med TCP/IP-kommunikation udføres i Try-instruktionen. Hvis der opstår fejl, påkaldes CloseConnection-proceduren ligeledes.
3. 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.
procedure TWinForm.sendcommand(sendstring: String);
var
SendBuffer : array[0..512] of byte;
begin
SendBuffer := System.Text.Encoding.ASCII.GetBytes(sendstring);
try
TCP_Client.Send(SendBuffer, 0, sendstring.Length, SocketFlags.None );
except on ex : Exception
do
begin
StatusBar1.Text := 'ERROR on send: ' + ex.ToString;
close();
end;
end;
end;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.
procedure TWinForm.cb_output0_MouseUp(sender: System.Object; e: System.Windows.Forms.MouseEventArgs);
begin
if cb_output0.Checked Then
sendcommand('GET /outputaccess0?PW='+ tb_password.Text + '&State=ON&')
else
sendcommand('GET /outputaccess0?PW='+ tb_password.Text + '&State=OFF&')q;
end;procedure TWinForm.cb_output1_MouseUp(sender: System.Object; e: System.Windows.Forms.MouseEventArgs);
begin
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;Forespørgsel på output/input-status
Brugeren kan anmode om status for udgangene og indgangene ved at klikke på den tilsvarende knap.procedure TWinForm.bt_outputs_read_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /output?PW='+ tb_password.Text + '&');
end;procedure TWinForm.bt_inputs_read_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /input?PW='+ tb_password.Text + '&');
end;Læs/ryd tællere
Indgangstællernes tællertilstande kan også aflæses eller slettes.
procedure TWinForm.bt_counter_read0_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /counter0?PW='+ tb_password.Text + '&');
end;procedure TWinForm.bt_counter_read1_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /counter0?PW='+ tb_password.Text + '&');
end;procedure TWinForm.bt_counter_clear0_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /counterclear0?PW='+ tb_password.Text + '&');
end;procedure TWinForm.bt_counter_clear1_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /counterclear1?PW='+ tb_password.Text + '&');
end;Naturligvis kan alle tællere aflæses eller slettes på samme tid.
procedure TWinForm.bt_counter_readall_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /counter?PW='+ tb_password.Text + '&');
end;procedure TWinForm.bt_counter_clearall_Click(sender: System.Object; e: System.EventArgs);
begin
sendcommand('GET /counterclear?PW='+ tb_password.Text + '&');
end;4. 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.
procedure TWinForm.callback_readdata(ari : IAsyncResult);
var
bytesread : Integer;
receivestring : string;
begin
try
bytesread := TCP_Client.EndReceive(ari)
except
end;
if Bytesread = 0 then
close()
else
begin
receivestring := System.Text.Encoding.ASCII.GetString(ReceiveBuffer,0,bytesread);
try
TCP_Client.BeginReceive(ReceiveBuffer,0, 512,SocketFlags.None, callback_readdata,ari.AsyncState);
except on ex : Exception
do
begin
statusbar1.Text :='ERROR on read: ' + ex.ToString;
close();
end;
end;
if receivestring[1] = 'o' then
begin
if(convert.ToInt16(receivestring[8]) and 1) = 1 then
cb_output0.Checked := true
else
cb_output0.Checked := false;
if(convert.ToInt16(receivestring[8]) and 2) = 2 then
cb_output1.Checked := true
else
cb_output1.Checked := false;
end;
if receivestring[1] = 'i' then
begin
if(convert.ToInt16(receivestring[7]) and 1) = 1 then
cb_input0.Checked := true
else
cb_input0.Checked := false;
if(convert.ToInt16(receivestring[7]) and 2) = 2 then
cb_input1.Checked := true
else
cb_input1.Checked := false;
end;
if receivestring[1] = 'c' then
begin
if copy(ReceiveString, 8, 1) = '0' then
tb_counter0.Text := copy(ReceiveString, 10,length(ReceiveString)-10);
if copy(ReceiveString, 8, 1) = '1' then
tb_counter1.Text := copy(ReceiveString, 10,length(ReceiveString)-10);
if copy(ReceiveString, 8, 1) = ';' then
begin
ReceiveString[8] := ' ';
tb_counter0.Text := copy(ReceiveString, 9, pos(';',ReceiveString)-9);
tb_counter1.Text := copy(ReceiveString,pos(';',ReceiveString)+1,length(ReceiveString)-pos(';',ReceiveString)-1);
end;
end;
end;
end;Modtagerproceduren 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.
5. 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.
procedure TWinForm.timer_polling_Tick1(sender: System.Object; e: System.EventArgs);
begin
if TCP_Client.Connected then
begin
if cb_output_polling.Checked then
sendcommand('GET/output?PW=' + tb_password.Text + '&');
if cb_input_polling.Checked then
sendcommand('GET/input?PW=' + tb_password.Text + '&');
if cb_counter_polling.Checked then
sendcommand('GET/counter?PW=' + tb_password.Text + '&');
end;
end;Det ønskede interval kan indtastes i det tilsvarende tekstfelt. Når der foretages ændringer, justeres timerintervallet automatisk.
procedure TWinForm.tb_interval_TextChanged(sender: System.Object; e: System.EventArgs);
begin
timer_polling.Interval := convert.ToInt16(tb_interval.Text);
end;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.