Vai al contenuto

Lettura ingressi con richiesta HTTP

Home Forum Programmazione IEC 61131 (LogicLab) Lettura ingressi con richiesta HTTP

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #82133
    Paolo
    Partecipante

    Su 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 ?

    #82146
    Sergio Bertana
    Amministratore del forum

    La 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
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.