Questo blocco funzione esegue la richiesta di una pagina web con il protocollo HTTP. Attivando Enable viene inviata la richiesta HTTP della pagina definita in Page all'indirizzo IP o all'URL del server definito in HostAddress. E' possibile definire anche l'HostName che sarà utilizzato nella richiesta (Di solito è uguale a HostAddress). La pagina viene richiesta con i parametri definiti nel buffer Request passati secondo la definizione di Method (GET, POST, PUT).

In DBSize occorre definire la dimensione del buffers che l'FB alloca (Con SysRMalloc) per la gestione dei pacchetti TCP in trasmissione e ricezione. La dimensione minima è 256 bytes, aumentando la dimensione si velocizza il trasferimento (Sono effettuati meno frazionamenti). E' inutile definire lunghezze superiori al limite del pacchetto TCP 1500 bytes.

L'header e la pagina sono ricevuti in frammenti successivi in base al tipo di trasferimento del server, ad ogni ricezione di un frammento DBChars viene valorizzato (Per un solo loop di esecuzione) con il numero di bytes ricevuti che possono essere letti dal buffer all'indirizzo DBAddress. (HPSelector indica il tipo di dati ricevuti, FALSE dati header, TRUE dati pagina). In questo modo è possibile ricevere qualsiasi dimensione di dati, sarà cura del programma utente trasferire i dati ricevuti in una stringa o in un file.

Al termine dell'invio della richiesta si attiva per un loop di programma l'uscita RSent, su ricezione pagina si attiva per un loop di programma l'uscita PLoad ed in PLength è ritornata la lunghezza della pagina ricevuta, mentre in PLTime il tempo necessario per l'intera richiesta.

In caso di errore esecuzione o tempo di esecuzione comando superiore al tempo definito in Timeout, viene attivata per un loop di programma l'uscita Fault. L'uscita Done si attiva al termine della esecuzione della richiesta e su errore. Per acquisire nuovamente la pagina occorre disabilitare e poi riabilitare l'ingresso Enable.

Function block
CODESYS: Non disponibile
LogicLab: eLLabHTTPLib

Enable (BOOL) Comando richiesta pagina. Per eseguire una nuova richiesta occorre disattivare e riattivare l'ingresso.

Method (USINT) Metodo gestione richiesta (0=GET, 1=POST, 2=PUT).

SpyOn (BOOL) Se attivo permette di spiare il funzionamento del FB (Vedi articolo).

HostAddress (@STRING) Indirizzo IP o URL del server a cui connettersi.

HostName (@STRING) Nome del server utilizzato nella richiesta (Di solito è uguale a HostAddress).

HostPort (UINT) Numero porta TCP a cui connettersi (Default 80).

Page (@STRING) Stringa di definizione pagina richiesta.

Request (@STRING) Indirizzo buffer dati da inviare con la richiesta.

Header (@STRING) Indirizzo stringa header, se NULL viene inviato l'header standard. Se definito occorre indicare l'header completo da inviare con la richiesta al server.

DBSize (UINT) Dimensione buffers Rx/Tx allocati da FB (SysRMalloc). Minimo 256 massimo 1500.

Timeout (UINT) Timeout esecuzione richiesta pagina (mS).

Done (BOOL) Attivo a fine esecuzione, si attiva anche in caso di Fault. L'uscita rimane attiva fino a quando non viene settato Enable:=FALSE.

Fault (BOOL) Attivo per un loop di programma se errore gestione.

RSent (BOOL) Attivo per un loop di programma al termine dell'invio richiesta HTTP.

HPSelector (BOOL) FALSE: Si stanno ricevendo dati di header. TRUE: Si stanno ricevendo dati di pagina.

PLoad (BOOL) Attivo per un loop di programma su fine ricezione dati. Per acquisire dati (Header/Pagina) riferirsi a HPSelector. La lunghezza dei dati ricevuti è indicata in DBChars.

HTTPStatus (STRING[64]) Status risposta HTTP ricevuta.

DBAddress (@STRING) Indirizzo buffer dati ricevuti allocato da FB (Con SysRMalloc) di dimensione DBSize.

DBChars (UDINT) Bytes di pagina ricevuti, viene valorizzato per un loop. Ad ogni valorizzazione occorre estrarre i dati (Header/Pagina) da DBAddress.

PLength (UINT) Dimensione totale pagina ricevuta.

PLTime (REAL) Tempo impiegato per richiesta pagina (S).

Spionaggio funzionamento

Se SpyOn attivo viene eseguita la funzione SysSpyData che permette di spiare il funzionamento della FB. Sono previsti vari livelli di triggers.

Errori

In caso di errore si attiva l'uscita Fault, con la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Header richiesta

Nel parametro Header è possibile definire un campo header personalizzato da inviare al server, se definito NULL il FB invia l'header di default. Di seguito riportiamo un elenco di headers (Sono evidenziati quelli di default), occorre far seguire alla definizione i caratteri $r$n, è possibile definire più headers semplicemente accodandoli. Ecco un esempio:

HTTPRq.Header:=ADR('Accept: application/json$r$nAccept-Charset: ascii$r$nConnection: Close$r$n);

Esempi

Come utilizzare gli esempi.

ST_HTTPClient: Attivando da debug la variabile Execute viene eseguita la richiesta della pagina /Mdp095a000/Ptp119b000/Division.php dal sito www.slimline.altervista.org, passando in GET alla richiesta i parametri Dividend e Divisor. La pagina richiesta è uno script PHP che esegue la divisione tra i valori passati. E' possibile testare il funzionamento dello script a questo indirizzo. Se lo script è attivo viene ritornata una pagina con: The result is: 50, nelle variabili Header e Page è possibile visualizzare in debug i valori ritornati dal server.

ST_HTTPClient_ToFile: Attivando da debug la variabile Execute viene eseguita la richiesta della pagina /Mdp095a000/Ptp119b000/Division.php dal sito www.slimline.altervista.org, passando in GET alla richiesta i parametri Dividend e Divisor. La pagina richiesta è uno script PHP che esegue la divisione tra i valori passati. E' possibile testare il funzionamento dello script a questo indirizzo. Se lo script è attivo vengono creati 2 files uno che contiene l'header e l'altro la pagina con i valori ricevuti dal server.

LogicLab (Ptp156)
PROGRAM ST_HTTPClient
VAR
    Execute : BOOL; (* Execute command *)
    Error : BOOL; (* Execution error *)
    CaseNr : USINT; (* Program case *)
    i : UDINT; (* Auxiliary variable *)
    Header : STRING[ 256 ]; (* Header string *)
    Page : STRING[ 64 ]; (* Page string *)
    HTTPRq : HTTPClient_v1; (* HTTP client *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_HTTPClient"
// *****************************************************************************
// The program connects to a server om which is running a PHP script file like:
//
// <?php echo "The result is: ".($_REQUEST["Dividend"]/$_REQUEST["Divisor"]); ?>
//
// The program sends the "Dividend" and "Divisor" values and receives back from
// the server the result. If the server answers correctly the following result
// is expected.
// Header: 'HTTP/1.1 200 OK...
// Page: 'The result is: 50'
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATIONS
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN
        HTTPRq.Method:=0; //Request method, GET
        HTTPRq.SpyOn:=TRUE; //Activate the spy
        HTTPRq.HostAddress:=ADR('www.slimline.altervista.org'); //Server URL
        HTTPRq.HostName:=HTTPRq.HostAddress; // Hostname
        HTTPRq.HostPort:=80; //Server port
        HTTPRq.Page:=ADR('/Mdp095a000/Ptp119b000/Division.php'); //Web page
        HTTPRq.Request:=ADR('Dividend=500$26Divisor=10'); //Request string
        HTTPRq.Header:=NULL; //HTTP header
        HTTPRq.DBSize:=512; //Data buffer size
        HTTPRq.Timeout:=10000; //Execution timeout
    END_IF;

    // -------------------------------------------------------------------------
    // FB EXECUTION
    // -------------------------------------------------------------------------
    // FB Execution.

    HTTPRq(); //HTTP client

    // -------------------------------------------------------------------------
    // PROGRAM SEQUENCIES
    // -------------------------------------------------------------------------
    // Program sequencies.

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // Wait for the command, set the "Execute" variable by debug.

        0:
        IF NOT(Execute) THEN RETURN; END_IF;
        Execute:=FALSE; //Execute command
        Error:=FALSE; //Execution error

        // Initialize buffers and enable client.

        i:=Sysmemset(ADR(Header), 0, SIZEOF(Header)); //Empty header string
        i:=Sysmemset(ADR(Page), 0, SIZEOF(Page)); //Empty page string
         HTTPRq.Enable:=TRUE; //HTTP get page enable
        CaseNr:=CaseNr+1; //Program case

        // ---------------------------------------------------------------------
        // Header/Page data are received from server by chunked. When a chunk
        // has been received DBChars returns its length.

        1:
        IF (HTTPRq.DBChars <> 0) THEN

            // Transfer the received chunk on the proper buffer.

            IF NOT(HTTPRq.HPSelector) THEN
                IF ((Sysstrlen(ADR(Header))+HTTPRq.DBChars) < SIZEOF(Header)) THEN
                    i:=Sysmemmove(ADR(Header)+Sysstrlen(ADR(Header)), HTTPRq.DBAddress, HTTPRq.DBChars);
                END_IF;
            ELSE
                IF ((Sysstrlen(ADR(Page))+HTTPRq.DBChars) < SIZEOF(Page)) THEN
                    i:=Sysmemmove(ADR(Page)+Sysstrlen(ADR(Page)), HTTPRq.DBAddress, HTTPRq.DBChars);
                END_IF;
            END_IF;
        END_IF;

        // Check if request done.

        IF (HTTPRq.Done) THEN
            HTTPRq.Enable:=FALSE; //HTTP get page enable

            // On Done it's possible to test if page has been loaded.

            IF NOT(HTTPRq.PLoad) THEN Error:=TRUE; END_IF;
            CaseNr:=0; //Program case
        END_IF;
    END_CASE;

// [End of file]
LogicLab (Ptp156)

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 16 Marzo 2020