Integración de PHP con dispositivos Modbus: Guía completa

1. Descarga de la biblioteca ModbusMaster

Referencia: https://hotexamples.com/examples/-/ModbusMaster/-/php-modbusmaster-class-examples.html

Opción 1: https://github.com/sergejey/majordomo-modbus // Funcionalidad completa, sin ejemplos

Opción 2: https://github.com/krakorj/phpmodbus // Biblioteca con funcionalidad limitada, incluye ejemplos

Herramientas:

  1. Servidor Modbus: Software para simular dispositivos esclavos, utilizado como servidor en pruebas. PHP actúa como cliente para obtener datos.
  2. Modbus Poll: Simulador de dispositivo maestro, usado para pruebas y depuración. En este contexto se emplea como cliente.
  3. ModScan32: Programa para simular dispositivos maestros/esclavos, mencionado en secciones futuras.
  4. MThings: Software chino gratuito que permite simular tanto dispositivos maestros como esclavos, cubierto en secciones posteriores.

Operación de hreramientas:

Configuración de Modbus Poll

  1. Establecer conexión TCP/IP.

(1) Acceder a conexión → conexión, mostrará una ventana de parámetros.

(2) Ingresar la dirección IP y puerto del dispositivo esclavo, guardar cambios.

(3) Verificar configuración de lectura/escritura, aceder a ajustes → definición de lectura/escritura.

Parámetros clave:

  • ID del dispositivo esclavo
  • Código de función
  • Configuración de escaneo (ejemplo: 1000 ms)

(4) En caso de falla, la interfaz mostrará errores en color rojo. Indicadores importantes:

  • Tx = 4: número de tramas enviadas
  • Error = 0: cantidad de errores de comunicación
  • ID = 1: dirección del dispositivo esclavo simulado
  • F = 03: código de función utilizado
  • SR = 1000 ms: período de escaneo

(5) Visualización de datos: Ejemplo de uso del código de función 03 (readMultipleRegisters)

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';
$modbus = new ModbusMaster($IP_SERVIDOR, $PROTOCOLO);
$datos = $modbus->leerRegistrosMultiples($ID_DISPOSITIVO, $POSICION_INICIAL, $CANTIDAD_DATOS);<br></br><br></br>

Nota:

IP_SERVIDOR: Dirección IP del dispositivo Modbus

PROTOCOLO: Protocolo de comunicación (TCP/UDP)

ID_DISPOSITIVO: Identificador del dispositivo esclavo

POSICION_INICIAL: Posición inicial del registro

CANTIDAD_DATOS: Cantidad de datos a leer. Los resultados devueltos son un array unidimensional con claves numéricas, requiriendo combinaciones de dos elementos hexadecimales para convertir a decimal.

Ejemplo de uso del código de función 03

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';

$modbus = new ModbusMaster("192.168.0.15", "TCP");
try {
    $datos = $modbus->leerRegistrosMultiples(1, 0, 5);
}
catch (Exception $e) {
    echo $modbus;
    echo $e;
    exit;
}

foreach($datos as $clave =>$valor){
    $datos[$clave] = dechex($valor); // Conversión a hexadecimal
}
$resultados = [];
for($i=0;$i<count($datos);$i++){
    $indice = $i%2;
    if($indice == 0){
        $cadenaHex = $datos[$i].$datos[$i+1]; // Combinación de pares
        $resultados[] = hexdec($cadenaHex); // Conversión a decimal
    }
}
print_r($resultados);die;

Ejemplo de uso del código de función 05 (writeSingleCoil)

Ejemplo de escritura de estado individual

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';

$modbus = new ModbusMaster("192.168.0.100", "TCP");
$valores = array(TRUE);
try {
    $modbus->escribirCoilIndividual(1, 0, $valores);
}
catch (Exception $e) {
    echo $modbus;
    echo $e;
    exit;
}

echo $modbus;

Ejemplo de uso del código de función 06 (writeSingleRegister)

Ejemplo de escritura de parámetro individual

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';

$modbus = new ModbusMaster("192.168.0.14", "TCP");
$valores = array(16000);
$tiposDatos = array("INT"); 
$intercambiarRegistros = false;
try {
    $resultado = $modbus->escribirRegistroIndividual(1, 0, $valores, $tiposDatos, $intercambiarRegistros);
}
catch (Exception $e) {
    $registro['LOG'] = date('Y-m-d H:i:s') . " FC6 Error: $modbus $e\n" . $registro['LOG'];
    exit;
}

echo $modbus;

Etiquetas: Modbus PHP Función Modbus comunicación industrial Protocolo TCP

Publicado el 10-7 08:17