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.
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.
Preparativi
- Mettere sotto tensione il Web-IO e collegare gli IO
- Collegare il Web-IO alla rete
- Assegnazione di indirizzi IP
Nel Web-IO nell’area Vie di comunicazione >> API socket Attivare i socket ASCII TCP e autorizzare gli output per l’attivazione
Collocazione dei diversi elementi di comando e oggetti di visualizzazione nel modulo 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.
Avvio del programma
Inizializzazione degli elementi di comandoIl 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;
Controllo del collegamento
Inizializzazione del collegamentoImmettendo 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;
Utilizzo e comunicazione della 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 outputL’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;
Ricezione dei dati dal Web-IO
Analisi e visualizzazione dei dati ricevutiTutti 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;
Polling
Interrogazione ciclica di determinati valoriPer 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.