Funzioni ed FB gestione modem (eLLabModemLib) --------------------------------------------- **Attenzione! Per utilizzare la libreria occorre importarla nel proprio progetto**. Vedere capitolo relativo all'\ `import delle librerie <#7.2.1.Import libreria|outline>`__. Le funzioni ed i blocchi funzione per la gestione del modem utilizzano un modem GSM connesso ad un terminale di I/O del sistema (Tipicamente è utilizzata una porta seriale). Nel modem deve essere inserita una tessera SIM **non protetta dal codice PIN**. Nella descrizioni successive si fa riferimento alle seguenti definizioni generali. **Numero di telefono** Il numero di telefono consiste in una stringa lunga da 10 a 16 caratteri numerici conforme al seguente formato: Prefisso internazionale senza lo zero davanti (es. +39 per Italia, +49 per Germania, +44 per Gran Bretagna ecc.) Codice dell’operatore mobile (es. 338, 320, 347, ecc.) Numero di telefono (es. 7589951) Esempio: +393337589951,+3933812345,+49172123456 **Messaggio SMS** Un messaggio SMS può essere lungo fino a 160 caratteri alfanumerici facenti parte del seguente set: A…Z, a…z, 0…9, Spazio bianco, sono da evitare tutti gli altri caratteri. ModemCore_v5, modem core management ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +----------+----------------+ | **Type** | **Library** | | | | +----------+----------------+ | FB | eModemLib_E200 | +----------+----------------+ |image0| Questo blocco funzione gestisce un modem connesso al dispositivo di I/O definito in **File**, questo è un blocco funzione protetto per utilizzarlo occorre richiedere il codice di protezione, vedi `protezione funzioni e blocchi funzione <#ChpFctFBProtection>`__. E' comunque possibile utilizzarlo liberamente in modo test per 30 Min. L'FB gestisce il dialogo con il modem, ne esegue l'inizializzazione e ne controlla lo stato, controlla se il modem è connesso alla rete GSM e ritorna l'operatore di rete **Operator** ed il livello del segnale **Rssi**. Nel caso in cui il modem si sganci dalla rete l'FB provvede al suo riaggancio automatico. L'FB ritorna un **ModemID** che deve essere passato alle FB collegate (Esempio invio SMS, ricezione SMS, ecc.).L'ingresso **SpyOn** se attivo permette di spiare il funzionamento della FB. L'uscita **Done** si attiva se il modem è correttamente inizializzato, mentre l'uscita **Fault** si attiva per un loop di programma in caso di errori di gestione. E' previsto un comando **PowerOn** per la gestione della alimentazione del modem, in questo modo l'FB può spegnere e riaccendere il modem in caso riscontri una non funzionalità dello stesso. Su ricezione chiamata telefonica viene rilevato il CLIP del chiamante che è ritornato in uscita **CLIPNumber**, contemporaneamente ad ogni squillo del telefono si attiva per un loop di programma l'uscita **CLIPRxd**. Su connessione GPRS viene ritornato l'indirizzo IP assegnato dal gestore alla connessione **IPAddress**. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Abilitazione blocco funzione, | | | attivandolo viene gestito il | | | modem. | +-----------------------------------+-----------------------------------+ | **AutoHangUp** (BOOL) | Abilita l'HangUp automatico alla | | | ricezione di una chiamata | | | telefonica, viene comunque | | | ritornato il CLIP. | +-----------------------------------+-----------------------------------+ | **SpyOn** (BOOL) | Se attivo permette di spiarne il | | | funzionamento. | +-----------------------------------+-----------------------------------+ | **Type** (USINT) | Definizione tipo di modem da | | | gestire. | | | | | | 0: Configurazione adatta a tutti | | | modem standard. | | | | | | 1: Configurazione per gestire | | | router Advantech. | +-----------------------------------+-----------------------------------+ | **File** (FILEP) | Flusso dati **stream** ritornato | | | dalla funzione **Sysfopen**. | +-----------------------------------+-----------------------------------+ | **APN** (STING[32]) | Definizione APN per connessione | | | GPRS. **Se non definito | | | disabilitata gestione GPRS**. | +-----------------------------------+-----------------------------------+ | **DNS** (STING[16]) | Definizione indirizzo IP server | | | DNS. **Se non definito | | | disabilitata gestione GPRS**. | +-----------------------------------+-----------------------------------+ | **Enabled** (BOOL) | Blocco funzione abilitato. | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Modem correttamente inizializzato | | | e funzionante. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop di programma | | | se errore gestione modem. | +-----------------------------------+-----------------------------------+ | **PowerOn** (BOOL) | Comando di gestione uscita | | | alimentazione modem. | +-----------------------------------+-----------------------------------+ | **CLIPRxd** (BOOL) | Attivo per un loop di programma | | | ad ogni ricezione CLIP | | | (Tipicamente ad ogni RING del | | | modem). | +-----------------------------------+-----------------------------------+ | **ModemID** (UDINT) | ID modem da passare alle FB | | | collegate | +-----------------------------------+-----------------------------------+ | **CnStatus** (USINT) | Stato connessione. | | | | | | | 0: | | | | Not registred | | | | | | | 1: | | | | Registered to home network | | | | | | | 2: | | | | Not Registered but ME is | | | | currently searching for a new | | | | | | | 3: | | | | Registration denied. | | | | | | | 4: | | | | Unknown (Not used) | | | | | | | 5: | | | | Registered roaming. | | | | +-----------------------------------+-----------------------------------+ | **Operator** (STRING[16]) | Contiene la stringa con il nome | | | dell'operatore telefonico. | +-----------------------------------+-----------------------------------+ | **Rssi** (USINT) | Valore potenza segnale radio. | +-----------------------------------+-----------------------------------+ | **CLIPNumber** (STRING[16]) | Contiene la stringa con il numero | | | di CLIP ricevuto. | +-----------------------------------+-----------------------------------+ | **IPAddress** (STING[16]) | Indirizzo IP assegnato dal | | | gestore su connessione GPRS. | +-----------------------------------+-----------------------------------+ **Trigger di spy** Se **SpyOn** attivo viene eseguita la funzione `SysSpyData <#FctSysSpyData>`__ che permette di spiare il funzionamento della FB. Sono previsti vari livelli di triggers. +-------------+-------------------------------------------------+ | **TFlags** | **Descrizione** | +-------------+-------------------------------------------------+ | 16#00000001 | 'Rx' Ricezione stringa da modem | +-------------+-------------------------------------------------+ | 16#00000002 | 'R>' Stringa ricevuta da modem troppo lunga | +-------------+-------------------------------------------------+ | 16#00000004 | 'Tx' Trasmissione stringa verso modem | +-------------+-------------------------------------------------+ | 16#00000010 | 'Mr' Ricezione messaggio SMS | +-------------+-------------------------------------------------+ | 16#01000000 | '--' Etichette di segnalazione operazioni modem | +-------------+-------------------------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#SysGetLastError>`__ è possibile rilevare il codice di errore. +-------------+----------------------------------------------------------+ | **Codice** | **Descrizione** | +-------------+----------------------------------------------------------+ | 10002010 | Valore di **File** non definito. | +-------------+----------------------------------------------------------+ | 10002020 | FB protetta, terminato tempo funzionamento in modo demo. | +-------------+----------------------------------------------------------+ | 10002050 | Timeout esecuzione. | +-------------+----------------------------------------------------------+ | 10002080 | Errore case gestione. | +-------------+----------------------------------------------------------+ | 10002100 | FB eseguita in task diversa da quella di background. | +-------------+----------------------------------------------------------+ | 10002200~3 | Errore ricezione CLIP. | +-------------+----------------------------------------------------------+ | 10002300~4 | Errore nelle sequenze power on del modem. | +-------------+----------------------------------------------------------+ | 10002400~15 | Errore nelle sequenze di controllo del modem. | +-------------+----------------------------------------------------------+ | 10002500~7 | Errore nella ricezione del messaggio SMS. | +-------------+----------------------------------------------------------+ **Esempi** """"""""""""" Forniamo di seguito due esempi di utilizzo del FB ModemCore in linguaggio FBD. Nel primo viene gestito un modem standard (Esempio il BGS2 della Gemalto) connesso in seriale sulla porta “COM0”. Nel secondo viene gestito un router (UR5v2 della Advatech) connesso in ethernet con indirizzo IP 192.168.0.184 sulla porta 1000. Il FB ModemCore gestisce in uscita la variabile *ModemID* che deve essere passata a tutti i FB relativi al modem. Negli esempi riportati con i successivi FB, ci si collegherà a questa variabile per il riferimento al modem. **Definizione variabili** |image1| **Esempio FBD** *(Ptp118b400, FBD_ModemCoreSerial)* |image2| **Esempio ST** *(Ptp118b400, ST_ModemCoreSerial)* .. code-block:: none (\* Program initializations. \*) IF (SysFirstLoop) THEN (\* Serial port initialization. \*) Sp.COM:=ADR('COM0'); (\* COM port definition \*) Sp.Baudrate:=115200; (\* Baudrate \*) Sp.Parity:='N'; (\* Parity \*) Sp.DataBits:=8; (\* Data bits \*) Sp.StopBits:=1; (\* Stop bits \*) Sp.DTRManagement:=DTR_OFF; (\* DTR management \*) Sp.DTRComplement:=FALSE; (\* DTR complement \*) Sp.EchoFlush:=FALSE; (\* Received echo flush \*) Sp.DTROnTime:=0; (\* DTR On time delay (mS) \*) Sp.DTROffTime:=0; (\* DTR Off time delay (mS) \*) Sp.FlushTm:=0; (\* Flush time (mS) \*) Sp.RxSize:=0; (\* Rx buffer size \*) Sp.TxSize:=0; (\* Tx buffer size \*) (\* Modem initialization. \*) Mdm.Type:=0; (\* Modem type: Any serial modem \*) Mdm.SpyOn:=TRUE; (\* Spy On \*) Mdm.AutoHangUp:=FALSE; (\* Auto hangup \*) Mdm.APN:=ADR('M2Mbis.vodafone.it'); (\* APN definition \*) Mdm.DNS:=ADR('8.8.8.8'); (\* DNS definition \*) END_IF; (\* Eseguo gestione modem core. \*) Sp(Open:=TRUE); (\* Serial port management \*) Mdm.File:=Sp.File; (\* File pointer \*) Mdm(Enable:=Sp.Opened); (\* Gestione modem core \*) (\* [End of file] \*) **Definizione variabili** |image3| **Esempio FBD** *(Ptp118b400, FBD_ModemCoreEthernet)* |image4| **Esempio ST** *(Ptp118b400, ST_ModemCoreEthernet)* .. code-block:: none (\* Program initializations. \*) IF (SysFirstLoop) THEN (\* TCP Client initialization. \*) TCPClient.PeerAdd:=ADR('192.168.0.184'); (\* Peer address \*) TCPClient.PeerPort:=1000; (\* Peer port \*) TCPClient.LocalAdd:=ADR('0.0.0.0'); (\* Local address \*) TCPClient.LocalPort:=0; (\* Local port \*) TCPClient.FlushTm:=50; (\* Flush time (mS) \*) TCPClient.LifeTm:=60; (\* Life time (S) \*) TCPClient.RxSize:=128; (\* Rx buffer size \*) TCPClient.TxSize:=128; (\* Tx buffer size \*) (\* Modem initialization. \*) Mdm.Type:=1; (\* Modem type: Router Advantech \*) Mdm.SpyOn:=FALSE; (\* Spy On \*) Mdm.AutoHangUp:=TRUE; (\* Auto hangup \*) Mdm.APN:=NULL; (\* APN definition \*) Mdm.DNS:=NULL; (\* DNS definition \*) END_IF; (\* Eseguo gestione modem core. \*) TCPClient(Connect:=TRUE); (\* TCPClient management \*) Mdm.File:=TCPClient.File; (\* File pointer \*) Mdm(Enable:=TCPClient.Connected); (\* Gestione modem core \*) (\* [End of file] \*) ModemSMSReceive_v1, receive a SMS message ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eModemLib_E000 | +-----------------------+-----------------------+ |image5| Questo blocco funzione esegue la ricezione di un messaggio SMS, si collega al blocco funzione di gestione modem **ModemCore**, occorre passare il **ModemID** in uscita dal blocco funzione di gestione modem. Alla ricezione di un messaggio SMS si attiva per un loop di programma l'uscita **Done**, sull'uscita **SMSText** viene ritornato l'indirizzo del buffer con il messaggio ricevuto, all'uscita **CLIPNumber** della FB **ModemCore** è ritornato il numero di telefono da cui il messaggio è stato ricevuto. L'indirizzo del buffer messaggio ricevuto rimane presente in uscita per un solo loop di programma. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Abilita la ricezione dei messaggi | | | SMS. | +-----------------------------------+-----------------------------------+ | **ModemID** (UDINT) | ID modem fornito in uscita dalla | | | **ModemCore**. | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop se ricevuto | | | messaggio SMS. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop se errore. | +-----------------------------------+-----------------------------------+ | **Text** (@STRING) | Indirizzo del buffer con il | | | messaggio SMS ricevuto (Lunghezza | | | massima 160 caratteri). | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#SysGetLastError>`__ è possibile rilevare il codice di errore. +----------+---------------------------+ | 10003010 | **ModemID** non definito. | +----------+---------------------------+ | 10003020 | **ModemID** non corretto. | +----------+---------------------------+ **Esempi** """"""""""""""" Nell'esempio è gestita la ricezione di un messaggio SMS dal modem definito nella variabile **ModemID**. **Definizione variabili** |image6| **Esempio LD** *(Ptp118b400, FBD_ModemSMReceive)* |image7| ModemSMSRxCmd_v1, receive a SMS command ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eModemLib_E000 | +-----------------------+-----------------------+ |image8| Questo blocco funzione esegue la ricezione di un comando tramite un messaggio SMS, si collega al blocco funzione di gestione modem **ModemCore**, occorre passare il **ModemID** in uscita dal blocco funzione di gestione modem. Alla ricezione di un messaggio SMS se nel testo del messaggio è presente la stringa definita in **Command**, si attiva per un loop di programma l'uscita **Done**, all'uscita **CLIPNumber** della FB **ModemCore** è ritornato il numero di telefono da cui il messaggio è stato ricevuto. Attivando **Cin** il controllo sulla stringa definita in **Command** verrà fatto non considerando il case (Maiuscolo/minuscolo) dei caratteri. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Abilita la ricezione del comando. | +-----------------------------------+-----------------------------------+ | **ModemID** (UDINT) | ID modem fornito in uscita dalla | | | **ModemCore**. | +-----------------------------------+-----------------------------------+ | **CIn** (BOOL) | Se attivo, controllo di | | | **Command** non considerando case | | | (Maiuscolo/minuscolo) dei | | | caratteri. | +-----------------------------------+-----------------------------------+ | **Command** (@USINT) | Pointer al testo del comando da | | | eseguire. | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop se ricevuto | | | messaggio SMS contenente il testo | | | indicato in **Command**. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop se errore. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#SysGetLastError>`__ è possibile rilevare il codice di errore. +----------+---------------------------+ | 10004010 | **ModemID** non definito. | +----------+---------------------------+ | 10004020 | **ModemID** non corretto. | +----------+---------------------------+ **Esempi** """"""""""" Nell'esempio è gestito un comando di Accensione/Spegnimento di una uscita logica su ricezione messaggio SMS dal modem definito nella variabile **ModemID**. **Definizione variabili** |image9| **Esempio LD** *(Ptp118b200, LD_ModemSMSRxCmd)* |image10| ModemSMSSend_v2, send a SMS message ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +----------+----------------+ | **Type** | **Library** | | | | +----------+----------------+ | FB | eModemLib_E000 | +----------+----------------+ |image11| Questo blocco funzione esegue l'invio di un messaggio SMS, si collega al blocco funzione di gestione modem **ModemCore**, occorre passare alla FB il **ModemID** in uscita dal blocco funzione di gestione modem. Su fronte attivazione ingresso di **Send** viene prenotato l'invio del messaggio, non appena sarà possibile il messaggio definito in **Text** verrà inviato al numero definito in **Number**. Terminato l'invio verrà attivata per un loop di programma l'uscita **Done**. **TLgt** definisce il numero di caratteri da inviare del messaggio definito in **Text**, se non definito o definito “0” viene inviato l'intero messaggio **Text**. +-----------------------------------+-----------------------------------+ | **Send** (BOOL) | Sul fronte di attivazione comanda | | | l'invio del messaggio SMS. | | | **Attenzione!** Il messaggio sarà | | | inviato non appena il modem è | | | libero per l'invio. | +-----------------------------------+-----------------------------------+ | **ModemID** (UDINT) | ID modem fornito in uscita dalla | | | **ModemCore**. | +-----------------------------------+-----------------------------------+ | **Number** (@USINT) | Pointer al numero di telefono a | | | cui eseguire l'invio del | | | messaggio. | +-----------------------------------+-----------------------------------+ | **TLgt** (UDINT) | Numero di caratteri del messaggio | | | da inviare. Se “0” viene inviato | | | l'intero messaggio. | +-----------------------------------+-----------------------------------+ | **Text** (@USINT) | Pointer al testo messaggio da | | | inviare. | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop al termine | | | dell'invio del messaggio SMS. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop se errore | | | invio messaggio SMS. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#SysGetLastError>`__ è possibile rilevare il codice di errore. +------------+----------------------------+ | 10005010 | **ModemID** non definito. | +------------+----------------------------+ | 10005020 | **ModemID** non corretto. | +------------+----------------------------+ | 10005080 | Errore case gestione. | +------------+----------------------------+ | 10005100~3 | Errore gestione invio SMS. | +------------+----------------------------+ **Esempi** """"""""""""""" Nell'esempio attivando l'ingresso **Di00CPU** viene eseguito l'invio di un messaggio SMS sul modem definito nella variabile **ModemID**. **Definizione variabili** |image12| **Esempio LD** *(Ptp118b200, LD_ModemSMSSend)* |image13| **Invio di un messaggio a più numeri** Molte volte succede di dover inviare su un evento (Esempio ingresso digitale) diversi messaggi SMS ognuno con il proprio testo a diversi numeri telefonici. Il blocco funzione **ModemSMSend** permette la gestione dell'invio sullo stesso evento di più messaggi, ogni messaggio è contraddistinto dal numero di telefono e dal testo del messaggio. Nell'esempio è gestito l'invio di un messaggio a più numeri di telefono. Come si può vedere attivando l'ingresso digitale **Di01CPU** verranno inviati due messaggi a due diversi numeri di telefono. E' possibile aggiungere altri rami con il blocco funzione **ModemSMSSend** ognuno con il proprio messaggio e numero di telefono sempre attivati dallo stesso ingresso. **Definizione variabili** |image14| **Esempio LD** *(Ptp118b200, LD_ModemSMSSendMultiple)* |image15| ModemPhoneCall_v1, executes a phone call ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eModemLib_E000 | +-----------------------+-----------------------+ |image16| Questo blocco funzione esegue una chiamata telefonica al numero indicato, si collega al blocco funzione di gestione modem **ModemCore**, occorre passare il **ModemID** in uscita dal blocco funzione di gestione modem. Su fronte attivazione ingresso di **Call** viene prenotata l'esecuzione della chiamata, non appena sarà possibile verrà eseguita la chiamata al numero definito in **Number**. Terminato il tempo definito in **Time** la chiamata verrà terminata. Se non vi sono problemi verrà attivata per un loop di programma l'uscita **Done**. +-----------------------------------+-----------------------------------+ | **Call** (BOOL) | Sul fronte di attivazione comanda | | | 'esecuzione della chiamata. | | | **Attenzione!** La chiamata verrà | | | eseguita non appena il modem è | | | libero. | +-----------------------------------+-----------------------------------+ | **ModemID** (UDINT) | ID modem fornito in uscita dalla | | | **ModemCore**. | +-----------------------------------+-----------------------------------+ | **Number** (@USINT) | Pointer al numero di telefono da | | | chiamare. | +-----------------------------------+-----------------------------------+ | **Time** (UINT) | Tempo di durata chiamata (Sec). | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop al termine | | | della esecuzione chiamata. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop se errore | | | esecuzione chiamata. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#SysGetLastError>`__ è possibile rilevare il codice di errore. +------------+--------------------------------------+ | 10037010 | **ModemID** non definito. | +------------+--------------------------------------+ | 10037020 | **ModemID** non corretto. | +------------+--------------------------------------+ | 10037080 | Errore case gestione. | +------------+--------------------------------------+ | 10037100~3 | Errore gestione chiamata telefonica. | +------------+--------------------------------------+ **Esempi** """""""""""" Nell'esempio è gestita una chiamata al numero indicato. Dopo 15 secondi la chiamata viene conclusa. **Definizione variabili** |image17| **Esempio LD** *(Ptp118b200, LD_ModemPhoneCall)* |image18| ModemHTTPGet, executes a HTTP Get request ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eModemLib_E000 | +-----------------------+-----------------------+ |image19| Questo blocco funzione esegue una richiesta HTTP inserendo in linea dei parametri GET, si collega al blocco funzione di gestione modem **ModemCore**, occorre passare il **ModemID** in uscita dal blocco funzione di gestione modem. Su fronte attivazione ingresso **Send** viene eseguita la connessione al **Server** HTPP sulla porta **Port**, e richiesta la pagina **Page**. La pagina viene richiesta con i parametri GET definiti nel buffer puntato da **GETPars**. La pagina ricevuta dal server viene trasferita nel buffer puntato da **RxBuffer**, i dati ricevuti che superano la dimensione del buffer **RxSpace** sono scartati. Terminata la ricezione della pagina richiesta si attiva per un loop l'uscita **Done**, se pagina non è ritornata nel tempo definito in **TimeOut** l'esecuzione termina con errore. +-----------------------------------+-----------------------------------+ | **Send** (BOOL) | Sul fronte di attivazione comanda | | | richiesta pagina HTTP. | | | **Attenzione!** La richiesta | | | verrà eseguita non appena il | | | modem è libero. | +-----------------------------------+-----------------------------------+ | **ModemID** (UDINT) | ID modem fornito in uscita dalla | | | **ModemCore**. | +-----------------------------------+-----------------------------------+ | **Server** (@USINT) | Pointer alla stringa di | | | definizione del server HTTP. | +-----------------------------------+-----------------------------------+ | **Port** (UINT) | Porta su cui effettuare la | | | connessione. | +-----------------------------------+-----------------------------------+ | **Page** (@USINT) | Pointer alla stringa di | | | definizione pagina richiesta. | +-----------------------------------+-----------------------------------+ | **GETPars** (@USINT) | Pointer alla stringa parametri | | | GET da inserire nella richiesta | | | (Max 512 caratteri). | +-----------------------------------+-----------------------------------+ | **RxBuffer** (@USINT) | Pointer al buffer di ricezione | | | pagina richiesta (Max 360 | | | caratteri). | +-----------------------------------+-----------------------------------+ | **RXSpace** (UINT) | Dimensione in bytes del buffer di | | | ricezione pagina. | +-----------------------------------+-----------------------------------+ | **TimeOut** (UINT) | Tempo massimo attesa ricezione | | | pagina (mS). | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop al termine | | | della ricezione pagina. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop se errore | | | ricezione pagina. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#SysGetLastError>`__ è possibile rilevare il codice di errore. +------------+--------------------------------------------------+ | 10042010 | **ModemID** non definito. | +------------+--------------------------------------------------+ | 10042020 | **ModemID** non corretto. | +------------+--------------------------------------------------+ | 10042080 | Errore case gestione. | +------------+--------------------------------------------------+ | 10042100~8 | Errore gestione richiesta pagina da server HTTP. | +------------+--------------------------------------------------+ | 10042200 | Stringa GET parametri troppo lunga. | +------------+--------------------------------------------------+ **Esempi** """"""""""""" L'utilizzo tipico di questa FB è di collegarsi ad un server HTTP dove sono eseguite pagine script (ASP, PHP, Phyton, ecc) richiedendo la pagina fornendo in linea alla chiamata dei parametri in GET. Lo script della pagina potrà eseguire operazioni con i dati passati in linea e ritornare dei valori come risultato. **Definizione variabili** |image21| **Esempio ST** *(Ptp118b200, ST_ModemHTTPGet)* .. code-block:: none (\* Program initializations. \*) IF (SysFirstLoop) THEN HTTP.ModemID:=ModemID; (\* Modem ID \*) HTTP.Server:=ADR('slimline.altervista.org'); (\* HTTP server \*) HTTP.Page:=ADR('Mdp095a000/Ptp118b200/Division.php'); (\* Page name \*) HTTP.Port:=80; (\* HTTP port \*) HTTP.TimeOut:=5000; (\* Connection timeout (mS) \*) HTTP.GETPars:=ADR(TxBuffer); (\* GET parameters pointer \*) HTTP.RxBuffer:=ADR(RxBuffer); (\* Rx buffer pointer \*) HTTP.RxSpace:=30; (\* Rx buffer space \*) END_IF; (\* Create the GET parameters string to add to page request. \*) IF (HTTP.Send) THEN i:=SysVarsnprintf(ADR(TxBuffer), SIZEOF(TxBuffer), 'Dividend=%.3f', REAL_TYPE, ADR(Dividend)); i:=SysLWVarsnprintf(ADR(TxBuffer), SIZEOF(TxBuffer), '&Divisor=%.3f', REAL_TYPE, ADR(Divisor)); END_IF; (\* Execute the "ModemHTTPGet" FB and count the execution errors. \*) HTTP(); HTTP.Send:=FALSE; IF (HTTP.Fault) THEN HTTPCECtr:=HTTPCECtr+1; END_IF; (\* If a correct TCP packet has been received, acquire the value. \*) IF (HTTP.Done) THEN IF NOT(SysVarsscanf(SysStrFind(ADR(RxBuffer), ADR('The result is:'), FIND_GET_END), '%f', REAL_TYPE, ADR(Result))) THEN Result:=0.0; (\* Division result \*) END_IF; END_IF; (\* Execute HTTP connection on command. \*) IF (Di00CPU <> Pulse) THEN Pulse:=Di00CPU; (\* Auxiliary pulse \*) IF (Pulse) THEN HTTP.Send:=TRUE; END_IF; END_IF; (\* [End of file] \*) Vediamo di spiegare come funziona il programma, sul fronte di attivazione dell'ingresso **Di00CPU** viene effettuata la connessione al server **www.slimline.altervista.org** e richiesta l pagina **Mdp095a000/Ptp118b200/Division.php**. In linea alla chiamata della pagina sono posti i campi GET **Dividend=200.0&Divisor=10.0**. Sul server è presente una pagina con uno script PHP che esegue la divisione e ritorna il risultato. Il funzionamento dello script si può testare con un comune browser digitando l'indirizzo: **http:\ **\ *\ *\ `\\\www.slimline.altervista.org\Mdp095a000/Ptp118b200/Division.php?Dividend=200.0&Divisor=10.0 `__ Se lo script funziona nella pagina del browser verrà visualizzato: **The result is: 20** Lo script PHP sul server è del tipo: Come si vede lo script invia in echo il risultato della divisione. I parametri posti in GET alla richiesta sono automaticamente trasferiti negli statements **$_REQUEST['Dividend']** e **$_REQUEST['Divisor']**. Come si vede è quindi possibile passare in GET allo script tutti i valori che si desiderano. Il valore di ritorno dallo script definito con lo statement echo verrà trasferito nel buffer **RxBuffer** del nostro programma e quindi è possibile operare su di esso con le istruzioni di gestione stringa. .. |image0| image:: media/image1.jpg :width: 1.54306in :height: 2.44861in .. |image1| image:: media/image2.jpg :width: 7.08681in :height: 0.55139in .. |image2| image:: media/image3.jpg :width: 7.08681in :height: 3.02361in .. |image3| image:: media/image4.jpg :width: 7.08681in :height: 0.56319in .. |image4| image:: media/image5.jpg :width: 7.08681in :height: 2.575in .. |image5| image:: media/image6.jpg :width: 1.74028in :height: 0.96875in .. |image6| image:: media/image7.jpg :width: 7.08681in :height: 1.08681in .. |image7| image:: media/image8.jpg :width: 7.08681in :height: 2.79931in .. |image8| image:: media/image9.jpg :width: 1.74028in :height: 1.1375in .. |image9| image:: media/image10.jpg :width: 7.08681in :height: 0.53542in .. |image10| image:: media/image11.jpg :width: 6.91736in :height: 5.75208in .. |image11| image:: media/image12.jpg :width: 1.74028in :height: 1.35417in .. |image12| image:: media/image13.jpg :width: 7.08681in :height: 0.3625in .. |image13| image:: media/image14.jpg :width: 6.92917in :height: 3.22847in .. |image14| image:: media/image15.jpg :width: 7.08681in :height: 0.56319in .. |image15| image:: media/image16.jpg :width: 6.29931in :height: 6.31111in .. |image16| image:: media/image17.jpg :width: 1.70833in :height: 1.12569in .. |image17| image:: media/image18.jpg :width: 7.08681in :height: 0.37014in .. |image18| image:: media/image19.jpg :width: 6.87431in :height: 2.54306in .. |image19| image:: media/image20.jpg :width: 1.34236in :height: 2.06319in .. |image20| image:: media/image21.jpg :width: 7.08681in :height: 1.83889in .. |image21| image:: media/image21.jpg :width: 7.08681in :height: 1.83889in