W&T conecta
Interfaces para TCP/IP, Ethernet, RS-232, RS-485, USB, 20mA, fibra óptica de vidrio y de plástico, http, SNMP, OPC, Modbus TCP, I/O digital, I/O analógico, ISA, PCI

Aplicación al Web-IO digital:

Dirigir y supervisar Web-IO digital con Delphi 2005


Como sucesor de Borland Delphi, Delphi 2005 se basa en el Microsoft.net Framework. Delphi 2005 (Delphi.net) ofrece todo lo que es necesario para programar aplicaciones TCP/IP. Con ello Delphi 2005 es también un auxiliar apreciado para crear aplicaciones que comunican con el Web-IO digital. No se necesitan excitadores o DLLs adicionales.

Dirigir con Visual Basic

Con el ejemplo siguiente de programa puede representar su Web-IO Digital con sus Inputs y Outputs en una aplicación Windows. Además de ello puede conmutar los Outputs del Web-IO.

¿No tiene todavía un Web-IO y quiere probar el ejemplo presentado?

No hay problema: Le ponemos a disposición el Web-IO Digital 2xInput, 2xOutput gratis durante 30 días. Rellene sencillamente un pedido muestra y le enviaremos el Web-IO para probar a cuenta abierta. Si nos devuelve el aparato dentro de los 30 días, le abonamos la factura completa.

Al pedido muestra

Preparativos

Ya ha abastecido su Web-IO Digital

1. Recopilación de los diferentes elementos de mando y objetos de indicación en VB.net-Form

Elementos de manejo Visual Basic

Además de los objetos aquí mostrados el programa necesita además un Timer para el Polling (timer_polling).

Al denominar cada uno de los objetos, es de gran ayuda usar nombres con sentido. En este ejemplo la primera parte del nombre describe la clase de objeto y la segunda la función.

1. Arranque de programa

Mientras que la formación de superficies gráficas de usuario en Delphi 2005 es igual de fácil de hacer que con las versiones antiguas de Delphi, resulta algo más difícil la comunicación de red en Delphi. Esto reside en primera línea en que el elemento de mando ClientSocket no está más a disposición para aplicaciones Framework. En lugar de ello se tiene que indicar el espacio del nombre para las clases de zócalo utilizadas para tener acceso a la red en el área de uses.


							uses
								System.Drawing, System.Collections, System.ComponentModel,
								System.Windows.Forms, System.Data, System.Net,
								System.Net.Sockets, System.IO, System.Text, System.Configuration;
						

Algunos procedimientos que no han sido depositados por Delphi mismo, tienen que declararse en el cabezal del texto de origen. (Más tarde hablaremos sobre el contenido de estos procedimientos)


							private
								{ Private-Deklarationen }
								public
								constructor Create;
								procedure callback_connect(ari : IAsyncResult);
								procedure callback_readdata(ari : IAsyncResult);
								procedure sendcommand(sendstring : String);
								procedure close();
								end;
						

Además de ello se tiene que instalar el zócalo en el que se debe tramitar la comunicación, y tiene que definirse un Buffer para los datos de entrada y una variable AsyncResult.


							var
								TCP_Client : Socket;
								ReceiveBuffer : array [0..512] of byte;
								ar : IAsyncResult;
						

2. El control de conexión

Introducir la conexión

La conexión se arranca entrando la dirección IP del Web-IO en el campo de texto tb_ip y chasqueando el botón 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;
						
La conexión

Para la tramitación del manejo TCP/IP se define primero un IPEndPoint de la dirección Ip y puerto TCP y así inicializar el zócalo TCP_client. En el transcurso de la solicitud de conexión se crea una referencia a un procedimiento Callback.

Se establece la conexión

Tan pronto como el Web-IO acepta la conexión, se ejecuta el procedimiento Callback. En la línea de estado aparece la realización de la conexión, los elementos de manejo se liberan para el uso y puede manejarse el botón Disconnect. El botón Connect se bloquea para el manejo. Además de ello se cera una referencia a una rutina Callback para la recepción de datos.


							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;
						
Separar la conexión

La conexión permanece tanto tiempo hasta que el usuario la finalice chasqueando el botón Disconnect o el Web-IO finalice la conexión.

En este caso se llama un procedimiento correspondiente.


							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;
						
Error de conexión

Todas las acciones correspondientes a la comunicación TCP/IP se ejecutan dentro de la orden Try. Si aparecen errores, se llama igualmente el procedimiento CloseConnection.

3. Manejo y comunicación por parte del cliente

Tan pronto como se ha establecido la conexión con el Web-IO, el usuario puede enviar comandos al Web-IO manejando los correspondientes elementos de programa.


							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;
						
Poner Outputs

El usuario puede poner los Outputs a través de dos casillas de verificación cb_outputx. El programa utiliza para ello el suceso de MouseUP de este objeto. Si se registra un MouseUp, es decir soltar la casilla de verificación Output, el programa realiza el correspondiente procedimiento y transmite el adecuado comando al Web-IO - según si está puesta la casilla o no.


							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&');
								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;
						

Solicitar estado de Output/Input
El usuario puede solicitar el estado de los Outputs e Inputs chasqueando el botón correspondiente.


							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;
						
Contadores preguntar/borrar

También se pueden preguntar o borrar los estados de contador de los Input-Counter.


							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;
						

Naturalmente también se pueden leer o borrar al mismo tiempo todos los contadores.


							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. Recepción de datos del Web-IO

Evaluar e indicar los datos recibidos
  • Todos los comandos y solicitudes al Web-IO se confirman con un String de respuesta. Aquí las respuestas presentan una estructura específica según el tipo.
  • Para los Outputs: output;<valor binario del estado de salida en formato hexadecimal>
  • Para los Inputs: input;<valor binario del estado de salida en formato hexadecimal>
  • Para los contadores: counterx;<estado decimal de contador >
  • o counter;<estado decimal de contador 0 >; <estado decimal de contador 0 >; ...... si todos los contadores se deben leer de una sola vez.
  • Todos los Strings de respuesta se finalizan con un Byte 0.
  • Al recibir datos se llama el procedimiento correspondiente Callback.

							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;
						

El procedimiento de recepción verifica según el primer signo de los datos de recepción, si se trata de mensajes de Input, Output o del contador. Dependiendo de ello se constata p. ej. qué Output tiene qué estado. En los contadores es posible tanto preguntar valores de contador separados como también leer todos los contadores de un viaje. Cada uno de los estados de contador se emiten decimalmente separados por punto y coma en una cadena (String).

5. Polling

Solicitud cíclica de determinados valores

A fin de posibilitar una actualización automática de la indicación, se utiliza un Timer.

Dependiendo de las casillas de verificación para el Polling de Output, Input y Counter se llaman las informaciones correspondientes a un intervalo ajustado del Web-IO.


							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;
						

El intervalo deseado puede entrarse en el campo correspondiente de texto. En caso de un cambio el intervalo del Timer se adapta automáticamente.


						procedure TWinForm.tb_interval_TextChanged(sender: System.Object; e: System.EventArgs);
							begin
								timer_polling.Interval := convert.ToInt16(tb_interval.Text);
							end;
						

El programa ejemplo asiste todas las funciones corrientes del Web-IO en el modo String de comando, optimado para el Web-IO 2x entradas digitales, 2x salidas digitales. Para los otros modelos Web-IO tienen que realizarse en caso necesario adaptaciones en el programa. Otros ejemplos de programa para la programación del zócalo los encontrarán en las páginas de herramientas al Web-IO. Una descripción detallada de la interfaz del zócalo de los modelos Web-IO digitales la encontrarán en el manual de referencia.

Descargar el programa ejemplo

¿No tiene todavía un Web-IO y quiere probar el ejemplo presentado?

No hay problema: Le ponemos a disposición el Web-IO Digital 2xInput, 2xOutput gratis durante 30 días. Rellene sencillamente un pedido muestra y le enviaremos el Web-IO para probar a cuenta abierta. Si nos devuelve el aparato dentro de los 30 días, le abonamos la factura completa.

Al pedido muestra