Lettura ingressi con richiesta HTTP
Home › Forum › Programmazione IEC 61131 (LogicLab) › Lettura ingressi con richiesta HTTP
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 1 giorno, 17 ore fa da
Sergio Bertana.
-
AutorePost
-
Maggio 8, 2025 alle 8:22 am #82133
Paolo
PartecipanteSu una macchina ho un PLC Slimline MPS056B120 che vorrei collegare ad una apparecchiatura che accetta messaggi HTTP per visualizzare lo stato di due bit, il messaggio che dovrei scrivere e’
http://192.168.100.101/input.cgi#
e l’appparecchiatura mi risponde con
&0&0&2&1&1&
Dove le due cifre evidenziate in rosso rappresentano lo stato del bit ZERO e del bit UNO (Screenshot richiesta da browser).
E’ possibile usare questo comando ad esempio in una macro e riuscire ad interpretare la risposta facendo un confronto con la stringa ricevuta oppure utilizzando il valore dei due caratteri della stringa ?
Maggio 8, 2025 alle 9:04 am #82146Sergio Bertana
Amministratore del forumLa soluzione è facilmente realizzabile utilizzando il FB HTTPClient. Ti posto il programma HTTPLIAcquire che fà quello che ti serve.
PROGRAM HTTPLIAcquire VAR IRequest : BOOL; (* Input request *) CaseNr : USINT; (* Program case *) Errors : UDINT; (* Execution errors *) APtr : PVOID; (* Auxiliary pointer *) Page : STRING[ 512 ]; (* Page string *) LInput : ARRAY[0..1] OF BOOL; (* Input status *) TCPClient : SysTCPClient; (* TCP client management *) HTTPRq : HTTPClient_v5; (* HTTP client *) END_VAR // ***************************************************************************** // PROGRAM "HTTPLIAcquire" // ***************************************************************************** // Acquisizione ingressi via HTTP. // ----------------------------------------------------------------------------- // ------------------------------------------------------------------------- // INITIALIZATIONS // ------------------------------------------------------------------------- // Program initializations. IF (SysFirstLoop) THEN // Set TCPClient parameters. TCPClient.PeerAdd:=ADR('127.0.0.1'); //Peer address TCPClient.PeerPort:=80; //Peer port TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address TCPClient.LocalPort:=0; //Local port TCPClient.FlushTm:=50; //Flush time (mS) TCPClient.LifeTm:=20; //Life time (S) TCPClient.RxSize:=512; //Rx buffer size TCPClient.TxSize:=512; //Tx buffer size // Set HTTPClient parameters. HTTPRq.SpyOn:=TRUE; //Activate the spy HTTPRq.KeepAlive:=FALSE; //HTTP keep-alive HTTPRq.RMethod:=HTTP_REQUEST#HTTP_GET; //HTTP request method HTTPRq.HostName:=TCPClient.PeerAdd; // Hostname HTTPRq.Page:=ADR('InputRead.html'); //Web page HTTPRq.Request:=eNULL; //Request string HTTPRq.Header:=eNULL; //HTTP header HTTPRq.DBSize:=512; //Data buffer size HTTPRq.Timeout:=T#10s; //Execution timeout END_IF; // ------------------------------------------------------------------------- // MANAGE CONNECTION // ------------------------------------------------------------------------- // Manage the connection. TCPClient(Connect:=HTTPRq.Connect); //TCPClient management HTTPRq(Enable:=TRUE, File:=TCPClient.File); //HTTP client IF (HTTPRq.Fault) THEN CaseNr:=0; END_IF; // ------------------------------------------------------------------------- // PROGRAM SEQUENCIES // ------------------------------------------------------------------------- // Program sequencies. CASE (CaseNr) OF // --------------------------------------------------------------------- // Initialize the time to manage acquisition delay. 0: HTTPRq.Send:=FALSE; //Send request IF NOT(IRequest) THEN RETURN; END_IF; eTO_JUNK(Sysmemset(ADR(Page), 0, SIZEOF(Page))); //Empty page string IRequest:=FALSE; //Input request HTTPRq.Send:=TRUE; //Send request CaseNr:=CaseNr+1; //Program case // --------------------------------------------------------------------- // Trasferisco in "Page" i dati ricevuti. 1: IF ((HTTPRq.DBChars <> 0) AND HTTPRq.HPSelector) THEN IF ((Sysstrlen(ADR(Page))+HTTPRq.DBChars) < SIZEOF(Page)) THEN eTO_JUNK(Sysmemmove(TO_DWORD(ADR(Page))+Sysstrlen(ADR(Page)), HTTPRq.DBAddress, HTTPRq.DBChars)); END_IF; END_IF; // Sul "Done" terminato ricezione risposta. // Controllo se ricevuto dati dal server. IF NOT(HTTPRq.Done) THEN RETURN; END_IF; CaseNr:=0; //Program case IF NOT(HTTPRq.PLoad) THEN Errors:=Errors+1; RETURN; END_IF; // Sul "PLoad" in "Page" ho la stringa ricevuta "&0&0&2&1&1&". // Decodifica valori ricevuti, qui posso fare tutti i controlli. // Intanto se s tringa sempre stessa lunghezza la posso verificare. IF (Sysstrlen(ADR(Page)) <> 11) THEN Errors:=Errors+1; RETURN; END_IF; // Se stringa prima del 1° dato è sempre "&0&0&2&" per leggere il dato. APtr:=SysStrFind(ADR(Page), ADR('&0&0&2&'), FIND_GET_END); IF (APtr = eNULL) THEN Errors:=Errors+1; RETURN; END_IF; IF NOT(SysVsscanf(APtr, ADR('%d'), BOOL_TYPE, ADR(LInput[0]))) THEN Errors:=Errors+1; RETURN; END_IF; IF NOT(SysVsscanf(APtr+2, ADR('%d'), BOOL_TYPE, ADR(LInput[1]))) THEN Errors:=Errors+1; RETURN; END_IF; END_CASE; // [End of file]
Per provarlo ho caricato una pagina con la stringa dfi testo direttamente nella cartella Web dello SlimLine e quindi mi sono connesso al localhost 127.0.0.1. Nel tuo programma dovrai modificare:
TCPClient.PeerAdd:=ADR('192.168.100.101'); //Peer address HTTPRq.Page:=ADR('input.cgi#'); //Web page
-
AutorePost
- Devi essere connesso per rispondere a questo topic.