Blog
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 ordrebekræftelsen: Ø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.
Kom i gang med at programmere Web-IO-enheder!
Du har allerede angivet din Web-IO Digital
- med magt,
- konfigurerede ind- og udgange,
- tilsluttet den til dit netværk,
- tildelt den en IP-adresse – hvilket med WuTility ikke er noget problem.
1. Kombination af de forskellige betjeningselementer og displayobjekter i Delphi-format

2. Start af programmet
Opsætning af betjeningselementerne
I første omgang er gruppen med betjeningselementerne til Web-IO spærret for brug. Statuslinjen angiver, at der endnu ikke er en forbindelse.
procedure Twebio_ascii_client.FormCreate(Sender:TObject);
begin
StatusBar1.SimpleText := 'No Connection';
bt_disconnect.Enabled := False;
gb_io.Enabled := False;
end;3. Kontrol af tilslutning
- Etablering af forbindelsen
Forbindelsen åbnes ved at indtaste Web-IO’ens IP-adresse i tekstfeltet ed_ip og klikke på knappen bt_connect.
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; - Forbindelsen er oprettet
Så snart Web-IO’en accepterer forbindelsen, udfører ClientSocket-kontrolelementet den tilsvarende procedure. Statuslinjen viser, at forbindelsen er etableret, at betjeningselementerne er klar til brug, og at knappen Disconnect er aktiv igen.
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; - Åbning af forbindelsen
Delphi ClientSocket-kontrollen bruges til at udføre TCP/IP-håndtering.
Denne kontrol gør det muligt at specificere procedurer og starte dem, når forskellige forbindelsestilstande opstår, her f.eks. ved forsøg på at åbne en forbindelse. Proceduren skriver en tilsvarende besked i statuslinjen og deaktiverer bt_connect-knappen, så brugeren ikke kan starte et nyt forbindelsesforsøg, mens det første stadig er i gang.procedure Twebio_ascii_client.ClientSocket1Connecting(Sender:TObject;Socket: TCustomWinSocket); begin StatusBar1.SimpleText := 'Try to connect to ' + ed_ip.Text; bt_connect.Enabled := False; end; - Forbindelsen er oprettet
Så snart Web-IO’en accepterer forbindelsen, udfører ClientSocket-kontrolelementet den tilsvarende procedure. Statuslinjen viser, at forbindelsen er etableret, at betjeningselementerne er klar til brug, og at knappen Disconnect er aktiv igen.
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; - Frakobling
Forbindelsen forbliver åben, indtil den afsluttes ved, at brugeren klikker på knappen Afbryd forbindelsen, eller Web-IO’en afslutter forbindelsen.
procedure Twebio_ascii_client.bt_disconnectClick(Sender:TObject); begin ClientSocket1.Active := False; end;Her påkalder ClientSocket-kontrolelementet igen en tilsvarende procedure
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; - Forbindelsesfejl
Også i tilfælde af en forbindelsesfejl udfører ClientSocket-kontrolelementet en tilsvarende procedure, der i det væsentlige er som Disconnect-proceduren. Statuslinjen angiver også Winsock-fejlnummeret, og ErrorCode sættes derefter til 0, så der ikke opstår nogen runtime-fejl.
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. Drift og kommunikation fra klientsiden
Så snart der er oprettet forbindelse til Web-IO’en, kan brugeren bruge de tilsvarende programelementer til at sende kommandoer til Web-IO’en.
- Indstilling af udgange
Brugeren indstiller udgangene ved hjælp af de to afkrydsningsfelter cb_outputx. Programmet bruger MouseUP-hændelsen for dette objekt. Hvis der registreres en Mouse Up, dvs. at afkrydsningsfeltet for output slippes, udfører programmet den tilsvarende procedure og – afhængigt af om afkrydsningsfeltet er sat eller ej – sender den relevante kommando til Web-IO.
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; - Forespørgsel på output/input-status
Brugeren kan anmode om status for udgangene og indgangene ved at klikke på den tilsvarende knap.
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; - Læs slettede tællere
Indgangstællernes tællertilstande kan også aflæses eller slettes.
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;Naturligvis kan alle tællere aflæses eller slettes på samme tid.
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. 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.
- Hvis der modtages data fra ClientSocket-kontrolelementet, påkalder sidstnævnte den tilsvarende procedure
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;Modtagelsesproceduren bruger det første tegn i de modtagne data til at kontrollere, om det er en input-, output- eller tællerbesked. Afhængigt af dette bestemmes det for eksempel, hvilken udgang der har hvilken status. Da outputstatussen sendes i hexadecimalt format, skal den først konverteres til en heltalsværdi for at kunne beregne de efterfølgende trin. Til konverteringen er der indbygget en tilsvarende funktion i programmet. Når det gælder tællerne, er det også muligt at aflæse individuelle tællerværdier eller at aflæse alle tællerne på én gang. De enkelte tællertilstande udlæses derefter i decimalformat i en semikolonafgrænset streng.
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. Afstemning
Cyklisk afstemning af bestemte værdier
For at muliggøre automatisk opdatering af displayet bruges en timer.
Afhængigt af afkrydsningsfelterne for output-, input- og tællerpolling hentes de tilsvarende oplysninger fra Web-IO med et indstillet interval.
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;Det ønskede interval kan indtastes i det tilsvarende tekstfelt. Når der foretages ændringer, justeres timerintervallet automatisk.
procedure Twebio_ascii_client.ed_intervalChange(Sender:TObject);
begin
timer_polling.Interval := strtoint(ed_interval.Text);
end;Eksempelprogrammet understøtter alle almindelige funktioner i Web-IO i kommandostrengstilstand, optimeret til Web-IO 2x Digital Input, 2x Digital Output PoE. 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.
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.