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:
- Servidor Modbus: Software para simular dispositivos esclavos, utilizado como servidor en pruebas. PHP actúa como cliente para obtener datos.
- Modbus Poll: Simulador de dispositivo maestro, usado para pruebas y depuración. En este contexto se emplea como cliente.
- ModScan32: Programa para simular dispositivos maestros/esclavos, mencionado en secciones futuras.
- 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
- 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;