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.

Bestil prøveversionen her:

Forberedelser

Du har allerede tilsluttet 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.

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.

Download program eksempel

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.