W&T collega
Adattatori per TCP/IP, Ethernet, RS-232, RS-485, USB, 20 mA, Fibra ottica di vetro e plastica, http, SNMP, OPC, Modbus TCP, I/O digitale, I/O analogico, ISA, PCI

Applicazione relativa al Web-IO digitale:

Web-IO digitale controllo e monitoraggio con Delphi


Come linguaggio di alto livello di facile apprendimento, Delphi offre tutto ciò che è necessario per la programmazione di applicazioni TCP/IP. In tal modo Delphi è anche uno strumento ausiliario prediletto per la creazione di applicazioni che comunicano con il Web-IO digitale. Ulteriori driver o DLL non saranno necessari.

Web-IO controllo con Delphi

Con il seguente esempio di programma potete riprodurre il vostro Web-IO digitale con i suoi input e output in un’applicazione Windows. Inoltre potete collegare gli output del Web-IO.

Non disponete ancora di un Web-IO e desiderate semplicemente provarne il funzionamento come nell’esempio illustrato?

Nessun problema: vi mettiamo a disposizione gratuitamente per 30 giorni il Web-IO digitale 2x input, 2x output. Non dovete far altro che compilare l’ordinazione del campione e vi forniremo il Web-IO in prova in conto aperto. Se ci restituite l’apparecchio entro 30 giorni, vi accreditiamo completamente la fattura.

All’ordinazione del campione

Preparativi

Avete già alimentato con corrente

1. Collocazione dei diversi elementi di comando e oggetti di visualizzazione nel modulo Delphi

Elementi di comando Delphi

Nella denominazione dei singoli oggetti è utile utilizzare nomi che ne riprendono il significato. In questo esempio la prima parte del nome descrive il tipo di oggetto e la seconda parte la funzione.

2. Avvio del programma

Inizializzazione degli elementi di comando
Il gruppo con gli elementi di comando per il Web-IO viene innanzitutto bloccato per l’uso. Nella riga di stato viene visualizzato che non sussiste ancora alcun collegamento.


							procedure Twebio_ascii_client.FormCreate(Sender:TObject);
							begin
								StatusBar1.SimpleText := 'No Connection';
								bt_disconnect.Enabled := False;
								gb_io.Enabled := False;
							end;

3. Controllo del collegamento

  • Inizializzazione del collegamento

    Immettendo l’indirizzo IP del Web-IO nel campo di testo ed_ip e facendo clic sul pulsante bt_connect viene avviata la creazione del collegamento.

    
    							procedure Twebio_ascii_client.bt_connectClick(Sender:TObject);
    							begin
    								if ed_ip.Text <> '' then
    									begin
    									ClientSocket1.Host := ed_ip.Text;
    									ClientSocket1.Port := strtoint(ed_port.Text);
    									ClientSocket1.Active := True;
    									end;
    							end;
  • Collegamento realizzato

    Non appena il Web-IO accetta il collegamento, l’elemento di controllo ClintSocket esegue la corrispondente procedura. Nella riga di stato viene visualizzata la realizzazione del collegamento, gli elementi di comando vengono abilitati per l’utilizzo e il pulsante Disconnect risulta utilizzabile.

    
    							procedure Twebio_ascii_client.ClientSocket1Connect(Sender:TObject;Socket: TCustomWinSocket);
    							begin
    								StatusBar1.SimpleText := 'Connected to ' + ed_ip.Text;
    								bt_disconnect.Enabled := True;
    								gb_io.Enabled := True;
    							end;
  • Creazione del collegamento

    Per lo svolgimento della gestione TCP/IP viene utilizzato l’elemento di controllo ClientSocket di Delphi.
    Questo elemento di controllo permette, al verificarsi di diversi stati di collegamento, di prestabilire e avviare procedure come in questo caso per il tentativo di creare un collegamento. La procedura inserisce un corrispondente messaggio nella riga di stato e disattiva il pulsante bt_connect, affinché l’utente non esegua un secondo tentativo di connessione, mentre è ancora in corso il primo.

    
    							procedure Twebio_ascii_client.ClientSocket1Connecting(Sender:TObject;Socket: TCustomWinSocket);
    							begin
    								StatusBar1.SimpleText := 'Try to connect to ' + ed_ip.Text;
    								bt_connect.Enabled := False;
    							end;
  • Collegamento realizzato

    Non appena il Web-IO accetta il collegamento, l’elemento di controllo ClintSocket esegue la corrispondente procedura. Nella riga di stato viene visualizzata la realizzazione del collegamento, gli elementi di comando vengono abilitati per l’utilizzo e il pulsante Disconnect risulta utilizzabile.

    
    							procedure Twebio_ascii_client.ClientSocket1Connect(Sender:TObject;Socket: TCustomWinSocket);
    							begin
    								StatusBar1.SimpleText := 'Connected to ' + ed_ip.Text;
    								bt_disconnect.Enabled := True;
    								gb_io.Enabled := True;
    							end;
  • Disinserzione del collegamento

    Il collegamento rimane fino a quando non viene terminato dall’utente facendo clic sul pulsante Disconnect oppure il Web-IO termina il collegamento.

    
    							procedure Twebio_ascii_client.bt_disconnectClick(Sender:TObject);
    							begin
    								ClientSocket1.Active := False;
    							end;

    Anche in questo caso l’elemento di controllo ClientSocket richiama la corrispondente procedura

    
    							procedure Twebio_ascii_client.ClientSocket1Disconnect(Sender:TObject;Socket: TCustomWinSocket);
    							begin
    								ClientSocket1.Active := False;
    								StatusBar1.SimpleText := 'No Connection';
    								bt_connect.Enabled := True;
    								bt_disconnect.Enabled := False;
    								gb_io.Enabled := False;
    							end;
  • Errore di collegamento

    Anche nel caso di un errore di collegamento l’elemento di controllo ClientSocket esegue una corrispondente procedura che corrisponde a grandi linee alla procedura di disconnessione. Nella riga di stato viene inoltre visualizzato il numero di errore Winsock e l’ErrorCode viene alla fine impostato su 0, affinché non si arrivi ad un errore di run-time.

    
    							procedure Twebio_ascii_client.ClientSocket1Error(Sender:TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
    							begin
    								ClientSocket1.Active := False;
    								StatusBar1.SimpleText := 'Error ' + inttostr(ErrorCode) + ' - No Connection';
    								ErrorCode := 0;
    								bt_connect.Enabled := True;
    								bt_disconnect.Enabled := False;
    								gb_io.Enabled := False;
    							end;

4. Utilizzo e comunicazione delle parte client

Non appena viene realizzato un collegamento con il Web-IO, l’utente può inviare comandi al Web-IO utilizzando i corrispondenti elementi del programma.

  • Impostazione degli output

    L’impostazione degli output è resa possibile all’utente da due caselle di spunta cb_outputx. Il programma utilizza a tale scopo l’evento MouseUP di questo oggetto. Se viene registrato un MouseUp, ossia un abbandono della casella di spunta degli output, il programma esegue la corrispondente procedura e inoltra al Web-IO, in base all’eventuale impostazione della casella di spunta, il comando adatto.

    
    								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
    											ClientSocket1.Socket.SendText('GET/outputaccess0?PW=' + ed_password.Text + '&State=ON&')
    										else
    											ClientSocket1.Socket.SendText('GET/outputaccess0?PW=' + ed_password.Text + '&State=OFF&')
    									else
    										if cb_output1.Checked then
    											ClientSocket1.Socket.SendText('GET/outputaccess1?PW=' + ed_password.Text + '&State=ON&')
    										else
    											ClientSocket1.Socket.SendText('GET/outputaccess1?PW=' + ed_password.Text + '&State=OFF&');
    								end;
  • Interrogazione dello stato degli output/input

    L’utente può richiedere lo stato degli output e degli input facendo clic sul relativo pulsante.

    
    								procedure Twebio_ascii_client.bt_outputs_readClick(Sender:TObject);
    								begin
    									ClientSocket1.Socket.SendText('GET/output?PW=' + ed_password.Text + '&');
    								end;
    
    								procedure Twebio_ascii_client.bt_inputs_readClick(Sender:TObject);
    								begin
    									ClientSocket1.Socket.SendText('GET/input?PW=' + ed_password.Text + '&');
    								end;
  • Interrogazione/cancellazione dei counter

    È possibile interrogare o cancellare anche gli stati dei counter degli input.

    
    								procedure Twebio_ascii_client.bt_counter_readClick(Sender:TObject);
    								begin
    									if sender = bt_counter_read0 then
    										ClientSocket1.Socket.SendText('GET/counter0?PW=' + ed_password.Text + '&')
    									else
    										ClientSocket1.Socket.SendText('GET/counter1?PW=' + ed_password.Text + '&');
    								end;
    
    								procedure Twebio_ascii_client.bt_counter_clearClick(Sender:TObject);
    									begin
    										if sender = bt_counter_clear0 then
    											ClientSocket1.Socket.SendText('GET /counterclear0?PW='+ ed_password.Text + '&')
    										else
    											ClientSocket1.Socket.SendText('GET /counterclear1?PW='+ ed_password.Text + '&');
    									end;

    Naturalmente è possibile leggere o cancellare contemporaneamente tutti i counter.

    
    								procedure Twebio_ascii_client.bt_counter_readallClick(Sender:TObject);
    								begin
    									ClientSocket1.Socket.SendText('GET/counter?PW=' + ed_password.Text + '&')
    								end;
    
    								procedure Twebio_ascii_client.bt_counter_clearallClick(Sender:TObject);
    								begin
    									ClientSocket1.Socket.SendText('GET /counterclear?PW=' + ed_password.Text + '&')
    								end;

5. Ricezione dei dati dal Web-IO

Analisi e visualizzazione dei dati ricevuti

Tutti i comandi e le richieste al Web-IO vengono confermati con una stringa di risposta. Le risposte hanno una struttura specifica in base al tipo.

  • Per gli output: output;<valore binario dello stato degli output in formato esadecimale>
  • Per gli input: input;<valore binario dello stato degli input in formato esadecimale>
  • Per i counter: counterx;<stato del conteggio decimale>
  • oppure counter;<stato del conteggio decimale 0 >; <stato del conteggio decimale 0 >; ... se tutti i counter devono essere letti in un’unica volta.
  • Tutte le stringe di risposta terminano con 0 byte.
  • Se l’elemento di controllo ClientSocket riceve dati, esso richiama la corrispondente procedura

							procedure Twebio_ascii_client.ClientSocket1Read(Sender:TObject;Socket: TCustomWinSocket);
							var ReceiveString : String;
								OutputValue : word;
								InputValue : word;
							begin
								ReceiveString := ClientSocket1.Socket.ReceiveText;
								if Receivestring[1] = 'o' then
									begin
									OutputValue := HextoInt(copy(ReceiveString,pos(';',ReceiveString)+1,length(ReceiveString)-pos(';',ReceiveString)-1));
										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 := HextoInt(copy(ReceiveString,pos(';',ReceiveString)+1,length(ReceiveString)-pos(';',ReceiveString)-1));
										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)-10);
									if copy(ReceiveString, 8, 1) = '1'then
										ed_counter1.Text := copy(ReceiveString,10,length(ReceiveString)-10);
									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)-1);
										end;
									end;
							end;
							

La procedura di ricezione controlla, sulla base del primo carattere dei dati ricevuti, se si tratta di messaggi degli input, degli output o dei counter. In base a ciò viene ad es. stabilito quale stato ha quale output. Poiché lo stato degli output viene fornito in formato esadecimale, è innanzitutto necessaria una trasformazione in un valore intero per calcolare ulteriori fasi. Per la trasformazione è stata integrata nel programma una corrispondente funzione. Nei counter è possibile sia interrogare i valori dei singoli contatori che leggere tutti i counter contemporaneamente. Gli stati dei singoli contatori vengono visualizzati in una stringa in decimali separati mediante punto e virgola.


							function HexToInt(HexString: String) : longWord;
							var CharCount : integer;
								HexCharValue : longWord;
								HexValue : longWord;
							begin
								HexValue := 0;
								HexString := UpperCase(HexString);
								for CharCount := 1 to length(HexString) do
								begin
									HexCharValue := ord(HexString[CharCount]);
									if HexCharValue > 57 then
										HexCharValue := HexCharValue -55
									else
										HexCharValue := HexCharValue -48;
										HexCharValue := HexCharValue shl ((length(HexString)- CharCount) * 4);
										HexValue := HexValue or HexCharValue;
								end;
								HexToInt := HexValue;
							end;

6. Polling

Interrogazione ciclica di determinati valori

Per permettere anche un aggiornamento automatico della visualizzazione, viene utilizzato un timer.
In base alle caselle di spunta per il polling degli output, degli input e dei counter le corrispondenti informazioni vengono interrogate dal Web-IO nell’intervallo impostato.


							procedure Twebio_ascii_client.timer_pollingTimer(Sender:TObject);
							begin
								if	ClientSocket1.Active and cb_output_polling.Checked then
										ClientSocket1.Socket.SendText('GET /output?PW=' + ed_password.Text + '&');
								if	ClientSocket1.Active and cb_input_polling.Checked then
										ClientSocket1.Socket.SendText('GET /input?PW=' + ed_password.Text + '&');
								if	ClientSocket1.Active and cb_counter_polling.Checked then
										ClientSocket1.Socket.SendText('GET /counter?PW=' + ed_password.Text + '&');
							end;

L’intervallo desiderato può essere immesso nel corrispondente campo di testo. In caso di una modifica l’intervallo del timer viene adattato automaticamente.


							procedure Twebio_ascii_client.ed_intervalChange(Sender:TObject);
							begin
								timer_polling.Interval := strtoint(ed_interval.Text);
							end;

Il programma esempio supporta tutte le comuni funzioni del Web-IO nella modalità stringa di comando, ottimizzata per il Web-IO 2x Digital Input, 2x Digital Output PoE. Gli altri modelli Web-IO devono eventualmente essere adattati al programma. Ulteriori esempi di programma per la programmazione socket sono riportati nelle pagine dei tool per il Web-IO. Una descrizione dettagliata sull’interfaccia socket dei modelli Web-IO digitali è riportata nel manuale di riferimento.

Download esempio di programma
Non disponete ancora di un Web-IO e desiderate semplicemente provarne il funzionamento come nell’esempio illustrato?

Nessun problema: vi mettiamo a disposizione gratuitamente per 30 giorni il Web-IO digitale 2x input, 2x output. Non dovete far altro che compilare l’ordinazione del campione e vi forniremo il Web-IO in prova in conto aperto. Se ci restituite l’apparecchio entro 30 giorni, vi accreditiamo completamente la fattura.

All’ordinazione del campione