当前位置:首页 > PHP

php实现modbus

2026-02-28 09:11:16PHP

PHP 实现 Modbus 通信

Modbus 是一种工业通信协议,常用于设备间的数据交换。PHP 可以通过 TCP/IP 或串口(RTU)与 Modbus 设备通信。以下是两种常见的实现方式:

使用 PHP-Modbus 库

PHP-Modbus 是一个开源的 PHP 库,支持 Modbus TCP 和 RTU。安装方式如下:

composer require adduc/phpmodbus

示例代码(Modbus TCP):

require_once 'vendor/autoload.php';

use ModbusTcpClient\Network\BinaryStreamConnection;
use ModbusTcpClient\Packet\ModbusFunction\ReadHoldingRegistersRequest;
use ModbusTcpClient\Packet\ModbusFunction\ReadHoldingRegistersResponse;

$connection = BinaryStreamConnection::getBuilder()
    ->setPort(502)
    ->setHost('192.168.1.1')
    ->build();

$request = new ReadHoldingRegistersRequest(1, 0, 2);
$response = $connection->connect()->sendAndReceive($request);

if ($response instanceof ReadHoldingRegistersResponse) {
    $data = $response->getData();
    print_r($data);
}

$connection->close();

使用 socket 直接通信

如果不使用库,可以通过 PHP 的 socket 函数直接与 Modbus 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 = 0x0002;

$request = pack('nnnnnCCnn', $transactionId, $protocolId, $length, $unitId, $functionCode, $startAddress, $quantity);
socket_write($socket, $request);

$response = socket_read($socket, 1024);
$data = unpack('C*', $response);
print_r($data);

socket_close($socket);

串口通信(Modbus RTU)

对于串口通信,可以使用 php_serial 类或 dio 扩展。

示例代码(使用 dio):

php实现modbus

$serial = dio_open('/dev/ttyUSB0', O_RDWR | O_NOCTTY | O_NONBLOCK);
dio_tcsetattr($serial, [
    'baud' => 9600,
    'bits' => 8,
    'stop' => 1,
    'parity' => 0
]);

// 构建 Modbus RTU 请求(读取保持寄存器)
$unitId = 0x01;
$functionCode = 0x03;
$startAddress = 0x0000;
$quantity = 0x0002;

$request = pack('CCnn', $unitId, $functionCode, $startAddress, $quantity);
$crc = crc16($request);
$request .= pack('v', $crc);

dio_write($serial, $request);
$response = dio_read($serial, 1024);

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 = ($crc >> 1) ^ 0xA001;
            } else {
                $crc >>= 1;
            }
        }
    }
    return $crc;
}

注意事项

  • Modbus TCP 默认端口为 502,需确保防火墙允许通信。
  • Modbus RTU 需配置正确的串口参数(波特率、数据位等)。
  • 处理二进制数据时需注意字节序(大端或小端)。
  • 错误处理需检查 Modbus 异常响应(功能码 + 0x80)。

标签: phpmodbus
分享给朋友:

相关文章

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php实现定时

php实现定时

PHP 实现定时任务的方法 PHP 本身是脚本语言,通常需要借助外部工具或框架实现定时任务。以下是几种常见方法: 使用 Cron 任务 Linux 系统自带的 Cron 是常用的定时任务工具。通过编…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…