Utilizzando un convertitore ethernet/seriale è possibile con un semplice script PHP eseguire la lettura di registri da un nostro sistema Netlog utilizzando il protocollo modbus over IP.
Lo script PHP esegue l'apertura del socket verso il convertitore TRP-C31, invia sul socket la stringa di comando per la lettura del registro ed attende la risposta dal convertitore.
Il convertitore TRP-C31, provvede ad inviare sulla linea seriale la stringa modbus ricevuta dal socket che inviata alla porta seriale del sistema Netlog genererà il messaggio di risposta che il convertitore TRP-C31 invierà al socket. Download script.
// Eseguo definizioni per connessione TRP-C31.
$IPAddress="192.168.0.20"; //Indirizzo IP convertitore $PortNr=4000; //Porta host convertitore set_time_limit(5); //Imposto tempo limite socket (5 Sec)
// Eseguo creazione e connessione al socket.
if (($TRPSkt=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {echo "socket_create ".socket_strerror(socket_last_error()); return;}
if (!socket_connect($TRPSkt, $IPAddress, $PortNr )) {echo "socket_connect ".socket_strerror(socket_last_error()); socket_close($TRPSkt); return;}
// Eseguo interrogazione valore registro 0x0000 da nodo 0x01.
echo "Value is: ".ModbusRead($TRPSkt, 0x01, 0x0000); socket_close($TRPSkt);
function ModbusRead($Skt, $Node, $Register) { // Genero valore di transaction identifier.
// Eseguo attesa ricezione stringa di risposta. // La stringa di risposta contiene il valore del registro 9o e 10o byte.
$TimeBf=time(); //Salvo tempo per timeout while (socket_recv($Skt, $IString, 1024, PHP_BINARY_READ)) if (time() > $TimeBf+2) { // Eseguo controllo se ricevuto frame di risposta corretto. // Se valore di transaction identifier stringa di risposta diverso // da stringa di richiesta considero valore errato e ritorno "0".
if ($TrnIdf != (ord($IString[0])*256+ord($IString[1]))) return(0); return(ord($IString[9])*256+ord($IString[10])); } }
Ricordo che per poter gestire i socket da script PHP occorre controllare che in fase di installazione del PHP sia stata caricata la dll di gestione socket php_sockets.dll e che nel file php.ini, nella sezione Dynamic Extensions sia stata abilitata l'estensione socket.