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

Tutorial al Web-IO digital:

Dirigir y supervisar Web-IO digital con Delphi


Como idioma fácil de aprender Delphi ofrece todo lo que es necesario para programar aplicaciones TCP/IP. Con ello Delphi es también un auxiliar apreciado para crear aplicaciones que comunican con el Web-IO digital. No se necesitan excitadores o DLLs adicionales.

Dirigir Web-IO con Delphi

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.


Preparativos


Recopilación de los diferentes elementos de manejo y objetos de visualización en formulario Delphi

Elementos de manejo Delphi

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.

Para desarrollar la comunicación TCP se emplea el componente TIdTCPClient de Indy, que es parte integrante de los componentes Delphi.

Variables globales y procedimientos

En primer lugar hay que definir algunas variables globales.


var
  .......
  ClientSocketThread : TIdThreadComponent;
  Receivestring : string;
            

Es importante el componente del hilo de ejecución ClientSocketThread, para el que es necesario crear aún el correspondiente procedimiento. Más tarde ese thread ejecutará la recepción asíncrona de los datos de red entrantes.


private
  { Private-Deklarationen }
public
  procedure ClientSocketThreadRun(Sender: TIdThreadComponent);
end;
            

El procedimiento correspondiente tiene que ser creado en la sección de Implementación (ver más abajo).

Arranque de programa

Instalar los elementos de manejo
El grupo con los elementos de manejo para el Web-IO se bloquea primero para el manejo. En la línea de estado se visualiza que aún no hay conexión alguna.


procedure Twebio_ascii_client.FormCreate(Sender: TObject);
begin
  ClientSocketThread := TIdThreadComponent.Create();
  ClientSocketThread.onRun := ClientSocketThreadRun;
  StatusBar1.SimpleText := ’No Connection’;
  bt_disconnect.Enabled := False;
  gb_io.Enabled := False;
end;
            

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 ed_ip y el puerto TCP en el campo de texto ed_port y chasqueando el botón bt_connect.


procedure Twebio_ascii_client.bt_connectClick(Sender: TObject);
begin
  if ed_ip.Text <> ’’ then
  begin
    ClientSocket.Host := ed_ip.Text;
    ClientSocket.Port := strtoint(ed_port.Text);
    ClientSocket.Connect;
  end;
end;
						

Se establece la conexión

Tan pronto como el Web-IO acepta la conexión, el elemento de mando ClientSocket ejecuta el procedimiento correspondiente. 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.


procedure Twebio_ascii_client.ClientSocketConnected(Sender: TObject);
begin
  ClientSocketThread.Active := true;
  StatusBar1.SimpleText := ’Connected to ’ + ed_ip.Text;
  bt_connect.Enabled := False;
  bt_disconnect.Enabled := True;
  gb_io.Enabled := True;
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.


procedure Twebio_ascii_client.bt_disconnectClick(Sender: TObject);
begin
  ClientSocket.Disconnect;
end;
            

En este caso el elemento de mando ClientSocket también llama un procedimiento correspondiente.


procedure Twebio_ascii_client.ClientSocketDisconnected(Sender: TObject);
begin
  ClientSocketThread.Active := false;
  ClientSocket.Disconnect;
  StatusBar1.SimpleText := ’No Connection’;
  bt_connect.Enabled := True;
  bt_disconnect.Enabled := False;
  gb_io.Enabled := False;
end;
             

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.

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 Mouse Up, 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 Twebio_ascii_client.cb_outputMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if sender = cb_output0 then
    if cb_output0.Checked then
      ClientSocket.IOHandler.
          Write(’GET /outputaccess0?PW=’ + ed_password.Text + ’&State=ON&’)
    else
      ClientSocket.IOHandler.
          Write(’GET /outputaccess0?PW=’ + ed_password.Text + ’&State=OFF&’)
  else
    if cb_output1.Checked then
      ClientSocket.IOHandler.
          Write(’GET /outputaccess1?PW=’ + ed_password.Text + ’&State=ON&’)
    else
      ClientSocket.IOHandler.
          Write(’GET /outputaccess1?PW=’ + ed_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 Twebio_ascii_client.bt_outputs_readClick(Sender: TObject);
begin
  ClientSocket.IOHandler.Write(’GET /output?PW=’ + ed_password.Text + ’&’);
end;
            

procedure Twebio_ascii_client.bt_inputs_readClick(Sender: TObject);
begin
  ClientSocket.IOHandler.Write(’GET /input?PW=’ + ed_password.Text + ’&’);
end;
            

Preguntar/borrar contadores

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


procedure Twebio_ascii_client.bt_counter_readClick(Sender: TObject);
begin
  if sender = bt_counter_read0 then
    ClientSocket.IOHandler.Write(’GET /counter0?PW=’ + ed_password.Text + ’&’)
  else
    ClientSocket.IOHandler.Write(’GET /counter1?PW=’ + ed_password.Text + ’&’);
end;
            

procedure Twebio_ascii_client.bt_counter_clearClick(Sender: TObject);
begin
  if sender = bt_counter_clear0 then
    ClientSocket.IOHandler.Write(’GET /counterclear0?PW=’ + ed_password.Text + ’&’)
  else
    ClientSocket.IOHandler.Write(’GET /counterclear1?PW=’ + ed_password.Text + ’&’);
end;
            

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


procedure Twebio_ascii_client.bt_counter_readallClick(Sender: TObject);
begin
  ClientSocket.IOHandler.Write(’GET /counter?PW=’ + ed_password.Text + ’&’)
end;
            

procedure Twebio_ascii_client.bt_counter_clearallClick(Sender: TObject);
begin
  ClientSocket.IOHandler.Write(’GET /counterclear?PW=’ + ed_password.Text + ’&’)
end;
            

Recepción de datos del Web-IO

Evaluar e indicar los datos recibidos

Todos los comandos y todas las consultas al Web-IO son confirmados con una cadena de respuesta. De la recepción y la evaluación de las respuestas se encarga el hilo de ejecución citado al principio ClientSocketThreadRun.

Formato de las respuestas

Las respuestas tienen una estructura específica según el tipo.

  • Para las salidas: output;<Binärwert des Outputstatus im hexadezimalen Format>
  • Para las entradas: input;<Binärwert des Outputstatus im hexadezimalen Format>
  • Para los contadores: counterx;<dezimaler Zählerstand>
  • o counter;<dezimaler Zählerstand 0 >; <dezimaler Zählerstand 0 >; ......,
    cuando sea necesario leer todos los contadores a la vez.

Todas las cadenas de respuesta están cerradas con un byte 0. Cuando el elemento de control ClientSocket recibe datos, este inicia el procedimiento respectivo.


procedure Twebio_ascii_client.ClientSocketThreadRun(Sender: TIdThreadComponent);
var
  Receivechar : string;
  SemiPosition : integer;
  OutputValue : word;
  InputValue : word;
begin
  Receivechar := ClientSocket.IOHandler.ReadString(1);
  if Receivechar[1] <> chr(0) then
    Receivestring := Receivestring + Receivechar
  else
  begin
    if Receivestring[1] = ’o’ then
    begin
      OutputValue := StrtoInt(’$’+copy(ReceiveString,
       pos(’;’,ReceiveString)+1,length(ReceiveString)-pos(’;’,ReceiveString)));
      if OutputValue and 1 = 1 then
        cb_output0.Checked := True
      else
        cb_output0.Checked := False;
      if OutputValue and 2 = 2 then
        cb_output1.Checked := True
      else
        cb_output1.Checked := False;
    end;
    if Receivestring[1] = ’i’ then
    begin
      InputValue := StrtoInt(’$’+copy(ReceiveString,
         pos(’;’,ReceiveString)+1,
         length(ReceiveString)-pos(’;’,ReceiveString)));
      if InputValue and 1 = 1 then
        cb_input0.Checked := True
      else
        cb_input0.Checked := False;
      if InputValue 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
        ed_counter0.Text := copy(ReceiveString, 10,length(ReceiveString)-9);
      if copy(ReceiveString, 8, 1) = ’1’ then
        ed_counter1.Text := copy(ReceiveString, 10,length(ReceiveString)-9);
      if copy(ReceiveString, 8, 1) = ’;’ then
      begin
        ReceiveString[8] := ’ ’;
        ed_counter0.Text := copy(ReceiveString, 9, pos(’;’,ReceiveString)-9);
        ed_counter1.Text := copy(ReceiveString,
          pos(’;’,ReceiveString)+1,
          length(ReceiveString)-pos(’;’,ReceiveString));
      end;
    end;
    receivestring := ’’;
  end;
end;
						

El procedimiento de recepción comprueba, en base al primer carácter de los datos recibidos, si se trata de un mensaje de entrada, de salida o de contador. En función de ello se determina, por ejemplo, qué estado tiene qué salida. El estado de la salida es un dato hexadecimal, por lo que, para el cálculo de pasos posteriores, es necesario transformarlo en un valor entero. Esto se realiza anteponiendo ’$’ en la función StrToInt. En el caso de los contadores es posible tanto consultar contadores por separado como todos en una única operación. Los estados de los diferentes contadores se expresan en valores decimales separados por punto y coma.

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 Twebio_ascii_client.timer_pollingTimer(Sender: TObject);
begin
  if ClientSocket.Connected and cb_output_polling.Checked then
    ClientSocket.IOHandler.Write(’GET /output?PW=’ + ed_password.Text + ’&’);
  if ClientSocket.Connected and cb_input_polling.Checked then
    ClientSocket.IOHandler.Write(’GET /input?PW=’ + ed_password.Text + ’&’);
  if ClientSocket.Connected and cb_counter_polling.Checked then
    ClientSocket.IOHandler.Write(’GET /counter?PW=’ + ed_password.Text + ’&’);
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 Twebio_ascii_client.ed_intervalChange(Sender: TObject);
begin
  timer_polling.Interval := strtoint(ed_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 Digital 4.0 2xIn, 2xOut. 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

Productos