php实现modbus协议
PHP 实现 Modbus 协议
Modbus 是一种常用的工业通信协议,可以通过 PHP 实现 Modbus RTU 或 Modbus TCP 通信。以下是具体的实现方法。
使用现成的 PHP 库
PHP 有一些现成的库可以简化 Modbus 通信的实现,例如 phpmodbus 或 modbus-php。
安装 phpmodbus 库:
composer require adduc/phpmodbus
示例代码(Modbus TCP):
require_once 'vendor/autoload.php';
use Adduc\PhpModbus\ModbusMaster;
$modbus = new ModbusMaster("192.168.1.1", "TCP");
$data = $modbus->readMultipleRegisters(1, 0, 10); // 从设备地址 1 读取 10 个寄存器
print_r($data);
手动实现 Modbus TCP
如果不想依赖第三方库,可以手动实现 Modbus TCP 协议。

建立 TCP 连接:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '192.168.1.1', 502);
构造 Modbus TCP 请求帧:
$transactionId = 0x0001;
$protocolId = 0x0000;
$length = 0x0006;
$unitId = 0x01;
$functionCode = 0x03; // 读取保持寄存器
$startAddress = 0x0000;
$quantity = 0x000A;
$request = pack('nnnnnCCnn', $transactionId, $protocolId, $length, $unitId, $functionCode, $startAddress, $quantity);
socket_write($socket, $request, strlen($request));
解析响应数据:

$response = socket_read($socket, 1024);
$data = unpack('n*', substr($response, 9)); // 跳过 Modbus TCP 头部
print_r($data);
实现 Modbus RTU
Modbus RTU 通常通过串口通信(RS-232/RS-485),可以使用 php-serial 库处理串口通信。
安装 php-serial:
composer require majd/php-serial
示例代码:
require_once 'vendor/autoload.php';
use PhpSerial\Serial;
$serial = new Serial();
$serial->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();
$unitId = 0x01;
$functionCode = 0x03;
$startAddress = 0x0000;
$quantity = 0x000A;
// 构造 RTU 帧
$frame = pack('CCnn', $unitId, $functionCode, $startAddress, $quantity);
$crc = crc16($frame);
$frame .= pack('v', $crc);
$serial->sendMessage($frame);
$response = $serial->readPort();
$data = unpack('C*', $response);
print_r($data);
function crc16($data) {
$crc = 0xFFFF;
for ($i = 0; $i < strlen($data); $i++) {
$crc ^= ord($data[$i]);
for ($j = 0; $j < 8; $j++) {
if ($crc & 0x0001) {
$crc >>= 1;
$crc ^= 0xA001;
} else {
$crc >>= 1;
}
}
}
return $crc;
}
注意事项
- Modbus TCP 默认端口是 502,确保防火墙允许该端口通信。
- Modbus RTU 需要正确配置串口参数(波特率、数据位、停止位等)。
- 对于工业环境,建议增加错误处理和超时机制。
- 如果需要高性能通信,建议使用 C 或 Python 等语言,PHP 可能不适合高频数据采集场景。






