Gestione convertitore Ethernet/seriale da pagina web
Home › Forum › Convertitori di interfaccia › Gestione convertitore Ethernet/seriale da pagina web
- Questo topic ha 14 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 13 anni, 7 mesi fa da
Sergio Bertana.
-
AutorePost
-
Agosto 9, 2011 alle 3:37 pm #35076
Vittorio
PartecipanteHo acquistato da Voi un convertitore Ethernet/seriale ATC 2000, prossimamente destinato ad essere interfacciato con una stufa a pellet da un tecnico manutentore della stufa. Nel frattempo per testare il dispositivo ed impratichirmi con i convertitori, i telecontrolli remoti ecc lo ho connesso, lato Ethernet, alla Rete di Casa, e, lato seriale, ad un vecchio modem seriale in disuso 56K di cui conosco i comandi AT e le risposte.
Tutto perfettamente funzionante! Seguendo le istruzioni e i Vs. Forum riesco ad arrivare sia da locale che da remoto alla interfaccia del dispositivo tramite Internet Explorer e tramite un programma Client TPC riesco ad impartire i comandi AT al modem collegato e a ricevere dallo stesso le risposte. Ma mi domando e Vi domando:
– Come posso lanciare i comandi (ora “AT”) alla seriale direttamente da una pagina web (del server web del dispositivo oppure di altro server web remoto) e ricevere le risposte seriali (nel server web del dispositivo o in un server web remoto) senza dover passare per l’apertura di un programma Client TCP e di una finestra terminale del programma ?
– Avete delle istruzioni o software o codice per poter passare ovvero registrare i dati che entrano o escono dal lato seriale del dispositivo in una pagina web sia essa residente nel dispositivo sia essa residente in server remoto ?
– Ovvero il server web del dispositivo serve solo per fornire l’interfaccia e la gestione web del dispositivo o può essere sfruttato per ricevere e trasmettere istanze provenienti o dirette da e a pagine web di altri server web ?
Scusate se ho fatto domande strane o insensate ma sono un neofita e avrei necessità di creare nel mio sito web (http://www.santamarianuova.com) una pagina dalla quale poter inviare con dei pulsanti i comandi al dispositivo collegato al convertitore e ricevere nella stessa pagina le risposte del dispositivo.
Agosto 9, 2011 alle 3:43 pm #36881Sergio Bertana
Amministratore del forumIl convertitore Ethernet/seriale ATC-2000 come tutti i dispositivi di questo tipo accetta una (o più) connessioni TCP o UDP dalla rete Ethernet su di una certa porta, e tutti i dati ricevuti da questa connessione sono ritrasmessi in uscita sulla porta seriale e viceversa. Il convertitore può essere configurato per operare da Server, in tal caso occorre aprire la connessione verso l’IP del convertitore con un programma client. Oppure da client, in tal caso appena acceso cercherà di connettersi ad un server (Esempio un programma su PC oppure un’altro convertitore per creare una rete seriale su TCP), il cui IP deve essere definito nella configurazione. La nostra utility Toolly permette di configurarsi sia come client che come server per testarne il funzionamento. Il server web del dispositivo serve solo per fornire una interfaccia web di configurazione, non è possibile gestire l’invio e la ricezione di dati. Per risolvere il tuo problema devi realizzare un programma sul tuo web server che gestisca l’apertura del socket verso il convertitore, e l’intera comunicazione con il dispositivo (Stufa a pellet) ad esso connesso, visualizzando i dati nella pagina web ritornata al browser. Puoi fare questo utilizzando qualsiasi programma di Server-side scripting (Php, ASP, Perl, Phyton, ecc).
Agosto 9, 2011 alle 4:10 pm #36882Sergio Bertana
Amministratore del forumAggiungo al post precedente alcune note relative all’interfacciamento verso la stufa a pellet o verso qualsiasi altro dispositivo anche non dotato di interfaccia seriale. E’ possibile utilizzare in alternativa al semplice convertitore Ethernet/seriale un dispositivo programmabile come i prodotti della nostra famiglia SlimLine. Questi prodotti sono programmabili secondo la IEC-61131 ed è possibile intefacciarli su rete ethernet utilizzando il protocollo modbus over IP. Ecco quindi che è possibile realizzare il programma che dialoga con la porta seriale della stufa a pellet, e/o acquisisce grandezze digitali e/o analogiche realizzando anche eventuali logiche di regolazione e di automazione. I dati utili per il preset e per la visualizzazione saranno poi appoggiati su variabili di memoria che lo script del web server andrà ad interrogare con il protocollo modbus over IP.
Agosto 12, 2011 alle 3:31 pm #36883Vittorio
PartecipanteTra i links richiamati nei posts precedenti mi incuriosisce il contenuto della discussione riguardante lo Script PHP realizzato per la lettura di un dato dal Vs. convertitore TRP-C31 tramite protocollo Modbus over IP perché mi sembra sostanzialmente di intravederci una risposta ovvero una soluzione alla mia originaria domanda ed esigenza.
Mi e Vi domando: Quello script mi sembra di capire che mi consentirebbe – da pagina web – l’apertura di un Socket tramite cui stabilire la connessione al convertitore ATC2000 e l’invio allo stesso di una stringa di comando (che nel mio caso sarebbe il comando “AT XXX” del Modem) allo stesso modo come invierei quel comando al convertitore dalla videata di un programma Client TCP.
Chiedo però se sia possibile, ovvero come dovrebbe essere modificato quello script PHP, per avere in ritorno a quella stringa di comando inviata la stringa risposta del dispositivo Modem connesso alla seriale del convertitore ATC2000 e corrispondente al messaggio che sarebbe visualizzato nella finestra terminale del Client TCP in risposta al comando AT.
E’ possibile? ovvero sto sbagliando qualche cosa ovvero sto farneticando ?
Agosto 12, 2011 alle 3:39 pm #36884Sergio Bertana
Amministratore del forumCerto che è possibile fare quello che desideri, naturalmente occorre conoscere la programmazione in PHP. Anche se và al di là del puro supporto tecnico, visto che in periodo di ferie c’è un po più di tempo, ti ho preparato un programma PHP che visualizza un form con la richiesta di definizione del comando AT da inviare in uscita al convertitore.
Definito il comando nella apposita casella di testo con il tasto Send si invia il form allo script PHP che invia il comando al convertitore ed aspetta la risposta. La risposta termina con la ricezione di <CR> o per timeout. La stringa di risposta ricevuta è ritornata nella pagina web in una casella di testo. Questa è la pagina web con lo script PHP pronto per l’uso (Download), di seguito lo script PHP.
Attenzione! Affinchè funzioni lo script và caricato su di un server IIS o Apache che gestisca l’interprete PHP.
$IPAddress=”192.168.0.95″; //Indirizzo IP convertitore
$PortNr=23; //Porta host convertitore
set_time_limit(5); //Imposto tempo limite socket (5 Sec)// Eseguo creazione e connessione al socket.
if (($Skt=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false)
{echo “socket_create “.socket_strerror(socket_last_error()); return;}
if (!socket_connect($Skt, $IPAddress, $PortNr ))
{echo “socket_connect “.socket_strerror(socket_last_error()); socket_close($TRPSkt); return;}// Eseguo invio comando e ricezione risposta.
$IString=””;
socket_set_nonblock($Skt); //Set nonblocking mode for socket
$TimeBf=time(); //Salvo tempo per timeout
socket_write($Skt, $_REQUEST[‘Command’].”r”);while(TRUE)
{
$Ch=socket_read ($Skt, 1, PHP_BINARY_READ);
$IString.=$Ch;// Esco su ricezione <CR> oppure per timeout.
if (($Ch == “r”) || (time() > $TimeBf+2))
{
echo “Answer: <input name=”Answer” type=”text” value=””.$IString.”” size=”20″/>”;
socket_close($Skt);
exit;
}
}Agosto 22, 2011 alle 6:34 am #36888Vittorio
PartecipantePrima di tutto “un Grazie infinito!!!” ma visto che ormai “hai fatto 30” se mi dai un ultimo aiutino per farmi funzionare il tutto (visto che non sono capace a farlo funzionare e che sono un emerito ignorante in materia di programmazione PHP).
Prima di tutto ho installato PHP sul mio Server locale IIS dove ho Windows XP Pro; ho verificato che sia correttamente indicata la Path delle extension_dir e abilitato extension=php_sockets.dll che è presente nella cartella Ext ; quindi lato PHP dovrebbe essere tutto a posto ed il test convenzionalmente usato per la verifica dell’interprete PHP (phpinfo()) funziona;
Salvo la pagina web che mi hai preparato contenente lo script, che modifico solo nell’indirizzo IP (192.168.1.5) e nel numero di Porta (50000) del mio ATC2000 nella directory “C:Inetpubwwwroot” con il nome “Send Command.php”.
Non so se questo basta o come o da quale altra parte devo salvare anche lo Script ovvero non so se devo creare una altra pagina collegata che debba essere richiamata o aperta per la risposta. Sta di fatto che quando lancio da broswer localhost/SendCommand.php mi si presenta prima correttamente il Form da te creato con la casella per l’input del comando AT ma dopo l’inserimento e alla pressione del pulsante Send mi si apre un messaggio di errore su una pagina con in indirizzo localhost/Procedures/ModbusSkt/ModbusSkt.php. Ma poiché per l’appunto /Procedures/ModbusSkt/ModbusSkt.php è la directory da te compilata nella funzione <form action=”/Procedures/ModbusSkt/ModbusSkt.php della prima parte HTML della pagina non so se ho mancato di effettuare altre modifiche necessarie o di creare qualche altra pagina collegata o non so cosa altro ancora non funziona. Dove sto sbagliando ?
Preciso per completezza che il convertitore ATC200 al momento del test è collegato al Router della rete di casa US Robotics con indirizzo IP fisso 192.168.1.5; porta 50000, è collegato al Pc dove risiede il Server IIS tramite Virtual Serial Comm com 20 attivata ed è perfettamente funzionante sia da locale che da remoto se interrogato da Hyper Terminal di Windows o da altro Client TCP.
Agosto 22, 2011 alle 6:40 am #36889Sergio Bertana
Amministratore del forumSembra tuto corretto tranne come hai correttamente notato tu stesso l’indirizzo di invio del form, devi modificare <form action=”/Procedures/ModbusSkt/ModbusSkt.php” method=”post”> con l’indirizzo di dove hai salvato la pagina sul tuo server <form action=”/Send Command.php” method=”post”>.
Non occorre creare altre pagine, come vedi la pagina php che ho creato contiene sia la parte HTML che viene visualizzata, con il form per la definizione dei comandi AT, sia la parte di script php che esegue la connessione con il convertitore ATC 2000. Sarà il server IIS ad inviare al browser la parte HTML della pagina ed ad eseguire la parte di script php.
Lo statement if (isset($_REQUEST[‘Command’])) infatti controlla se la richiesta di visualizazione della pagina contiene il parametro POST Command definito, se non è definito (Come nel caso di richiesta pagina da browser) lo script non fà nulla. Se è definito (come nel caso di richiesta pagina su invio del form), lo script esegue la connessione.
Non serve avere il virtual COM attivo, perchè tu non operi da porta seriale virtuale, anzi potrebbe essere dannoso, se il convertitore ATC 2000 è impostato per accettare una sola connessione TCP, il software virtual COM la impegna impedendo allo script php di potersi connettere.
Agosto 22, 2011 alle 10:32 am #36894Vittorio
PartecipanteL’inghippo dell’indirizzamento sbagliato del Form l’avevo scoperto e risolto stanotte dopo tanta lettura. Ma lo script non funziona in seguito ad un altro problema.
La pressione del tasto send mi restituisce questo errore: “php fatal error: call to undefinited function socket_create () in c:/inetpub/wwwroot/Send Command on line 29 (riga della chiamata nello script)” che mi fa pensare ad un problema di configurazione di PHP ovvero della estension_sockets.dll.
ll problema è che ho ricontrollato tutto e sembra a posto. Infatti nel file php.ini ho settato estension dir_ e la Path corretta “c:phpext” (nel pc php è installato in c:php e iI modulo estension sockets.dll è presente sulla cartella ext); ho tentato anche ad inserire in alternativa la path “./ext” senza risultato; risulta correttamente tolto il “;” e risulterebbe quindi abilitato.
Il modulo sockets, estension=sockets.dll. Può essere un problema di come gira php ? O che altro ? Come posso verificare se le estensioni sockets sono effettivamente abilitate e funzionanti ?
Agosto 22, 2011 alle 10:46 am #36895Sergio Bertana
Amministratore del forumNel mio php.ini ho le seguenti impostazioni:
extension_dir = “./ext”
extension=php_sockets.dllQuando si effettuano modifiche al file php.ini per renderle operative occorre riavviare IIS, meglio ancora riavviare l’intero PC.
Per verificare se le estensioni sono viste correttamente dal php, eseguendo phpinfo nella pagina ritornata ci deve essere una sezione sockets con una tabella che indica Sockets Support enabled.
Agosto 29, 2011 alle 11:57 am #36915Vittorio
PartecipanteSono ancora a disturbare per la comunicazione da pagina web al Convertitore ATC20000. Dopo notti insonni ho sistemato l’abilitazione dei Sockets in PHP (era una stupidaggine ma insidiosa: il salvataggio delle abilitazioni Sockets in PHP.ini avveniva nel file originario ad estensione.txt anziché in quello rinominato .php).
Ora il tuo Script gira (viene cioè eseguito sino alla fine) ma non funziona completamente nel senso che restituisce sempre e solo la stringa di input che io inserisco nell Form ma non restituisce la stringa di risposta ovvero una stringa concatenata composta dall’ input+la risposta come mi sembra tu abbia impostato nello Script.
Pensando in prima battuta ad una insufficienza del numero dei byt da leggere nella risposta, ho anche provato ad aumentare l’estensione dei byte letti nella istruzione :$Ch=socket_read da 1 a 15 ed oltre, ma pur ottenendo un allunganento del tempo di connessione aperta (la luce gialla che rileva la connessione all’ ATC 2000 tramite il Socket rimane accesa più a lungo) non ottengo la lstringa di risposta;
Ho anche provato a modificare la istruzione echo “Answer: della risposta nel campo value con =”$Ch” ovvero con=”$Ch.$Istring.” e similari ma ottengo sempre errori di sintassi. Non c’e sicuramente un blocco della Porta di comunicazione perché via Toolyy la connessione funziona e restituisce la risposta e perché credo altrimenti l’istruzione socket_set_nonblock(Skt) da te inserita nello script dovrebbe restituire falso al ciclo while e non consentire quindi l’esecuzione del ciclo della risposta.
Non capisco quindi se il problema è nel mancato funzionamento della funzione di lettura del Socket, Socket_read ($Skt, 1 , PHP_BINARY_READ) o nel passaggio di tale lettura all’echo di risposta tramite l’uso delle 2 variabili, IString=”” creata prima della scrittura nel Socket, e $Ch=socket_read, creata nel ciclo While per la lettura e la sua successiva restituzione; passaggio questo che, ignorante come sono in php, non riesco a comprendere pienamente.
Non so infine se ci possa essere invece un problema nellla scrittura della stringa nel socket (socket_write($Skt,$_REQUEST [‘Command’].”r”); o meglio nella concatenazione della parte .”r” alla stringa che credo serva ad inserire la simulazione del tasto invio e/o ritorno a capo; ma in effetti quando digito il comando da Vs.utility Toolly by ELSIST digito una stringa ATXXX + il Tasto Invio (che dovrebbe appunto corrispondere al tuo “.r” ).
Unico dubbio che mi rimane in mente e al quale non so dare una risposta è che mentre quando uso la comunicazione seriale diretta (Virtualcom da PC ) con Hyperterminal Windows la risposta all’invio dei comandi AT nel videoterminale avviene nella riga successiva a quella del comando, quando uso tcp ip client da Toolly o Hyper Terminal con impostazioneTCP/IP (Winsock) la risposta avviene nella stessa riga del comando. Può influire questo nella lettura della risposta del ATC20000 nel sockets ?
Agosto 29, 2011 alle 12:01 pm #36916Sergio Bertana
Amministratore del forumIn $Ch=socket_read ($Skt, 1, PHP_BINARY_READ); deve essere definito un solo carattere, perchè desidero leggere un solo carattere per controllare se è un <CR> di terminazione risposta.
Per eseguire le prove, in alternativa ad usare il convertitore ATC-2000, puoi usare Toolly, configurandolo come TCP/IP server e mettendolo in ascolto su una porta (Nell’esempio la 1234). Se dallo script Php configuri come IP lo stesso del tuo PC (Dove gira anche Toolly) e come porta la 1234, attivando lo script vedrai quello che scrivi in Set command apparire nella finestra di Toolly, ed agendo da pulsante Cmd1 potrai inviare la stringa di risposta che verrà visualizzata in Answer (Screenshot).
Attenzione! E’ importante terminare la stringa di risposta con $0D che corrisponde al <CR>, nello script Php indicato come “r”.
Settembre 3, 2011 alle 10:09 am #36924Vittorio
PartecipanteProvando lo script in simulazione tramite tramite la utilility Toolly settata da Server, in effetti lo Script funziona; alla pressione del tasto Send della pagina php la stringa viene inviata e visualizzata nella colonna Terminal di Toolly e inviando da pulsante Cmd1 “Risposta$0D” viene restituita nella casella Answer della pagina php la stringa “Risposta” proprio come nello Screenshot.
Il problema è che quando ripeto la procedura con ATC-2000 lo script non funziona e restituisce in Answer la stringa digitata in Set command e, solo talune volte niente; naturalmente ATC e Modem sono correttamente collegati e funzionanti e rispondono se interrogati da Toolly settata come TCP/IP Client.
Ho verificato anche accuratamente tutte le impostazioni di PHP.ini in riferimento anche al Server dove gira che è IIS 5.1 e avendo scaricato e studiato per molte notti tonnellate di casistiche ed esempi e forum mi sentirei di dire che dal lato PHP dovrebbe essere tutto a posto; ho solo qualche qualche dubbio sui settaggi “session.hash_bits_per_character = 5” e su “Colors for Syntax Highlighting mode” dove non è abilitato alcun codice, ma che non credo influiscano nella fattispecie. Ho anche cambiato IExplorer in Firefox.
Allora il problema dovrebbe essere nella struttura della stringa di risposta emessa da ATC2000 ovvero in come o perché php non riesce a leggere questo tipo di stringa di risposta e a restituirla passandola all’echo di risposta. Di fatto apparentemente sembrerebbe che php legga e restituisca la stringa scritta nel Socket in input anziché puntare, leggere e restituire quella ricevuta nel Socket da ATC. Non riesco a capire. Osservo solo che la risposta in Answer è pressoché immediata ovvero che lo script esce subito e mi domando se non sia per caso necessario un comando che consenta una pausa dopo la scrittura in Input nel Socket per per attendere una risposta di ATC prima di dar corso alla lettura della risposta nel Socket ?
Settembre 6, 2011 alle 7:44 am #36925Sergio Bertana
Amministratore del forumIl tuo script stà funzionando egregiamente. Devi solo ragionare un attimo su quello che stà succedendo, tu vedi in answer la stringa di comando perchè il modem ha settato l’echo dei comandi (Comando AT E1).
Quindi lo script visualizza in answer quello che riceve in input dalla seriale, che è esattamente l’echo del comando dato. Poi ricevuto il <CR> lo script termina senza visualizzare il resto dei dati che in realtà sono i dati che a te interessano, cioè la risposta al comando dato al modem.
Se tu provi a disabilitare l’echo dei comandi (Comando AT E0) sul modem, otterrai quello che hai bisogno. Certo lo script che ho fatto è un esempio, ora devi lavorarci tu per adattarlo alle tue necessità.
Settembre 9, 2011 alle 5:14 am #36936Vittorio
PartecipanteFinalmente funzionante !!!!
Però riesco a farlo funzionare solo lasciando nelle istruzioni di uscita dello script = “if (($Ch == “r”) || (time() > $TimeBf+2))”, la sola ipotesi di uscita per timeout=”(time() > $TimeBf+2)” e togliendo invece la condizione di uscita alla lettura del <cr> “($Ch == “r”)”.
Evidentemente, poiché il <cr> è presente sia nella stringa di scrittura in input nel socket, sia nella stringa di risposta del modem letta nel socket, lo script non riesce a distinguere questa ultima.
Settembre 9, 2011 alle 6:33 am #36937Sergio Bertana
Amministratore del forumEsatto… è proprio quello che ho cercato di spiegare nel post precedente, lo script è molto grezzo, controlla se riceve <CR> ed esce. Ora puoi agire sullo script per migliorarlo.Il <CR> della stringa di comando viene ricevuto perchè il modem ha l’echo settato, il modo più semplice per evitare questo problema è disabilitare l’echo dei comandi sul modem. Per farlo connetti il modem ad una seriale ed invia con un terminale il comando AT E0, puoi salvare la configurazione nella memoria del modem con il comando AT &W0, puoi dare una occhiata a questo documento.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.