当前位置:首页 > PHP

php实现modbus

2026-02-14 10:03:41PHP

PHP 实现 Modbus 通信

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

Modbus TCP/IP 实现

使用 PHP 的 socket 函数与 Modbus TCP 设备通信:

$host = '192.168.1.1'; // Modbus 设备 IP
$port = 502;           // Modbus 默认端口

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);

// 构建 Modbus 请求帧 (读取保持寄存器)
$transactionId = 1;
$unitId = 1;
$functionCode = 3; // 读取保持寄存器
$startAddress = 0;
$quantity = 2;

$data = pack('nnnn', $transactionId, 0, 6, $unitId);
$data .= pack('Cnn', $functionCode, $startAddress, $quantity);

socket_write($socket, $data, strlen($data));

$response = socket_read($socket, 1024);
socket_close($socket);

// 解析响应
if ($response) {
    $data = unpack('ntransactionId/nprotocolId/nlength/CunitId/CfunctionCode/CbyteCount', $response);
    $values = unpack('n*', substr($response, 9));
    print_r($values);
}

Modbus RTU (串口) 实现

对于串口通信,需要使用 PHP 扩展或外部工具:

  1. 安装 php-serial 扩展或使用 exec() 调用外部程序
  2. 通过串口发送 Modbus RTU 帧
// 使用 php-serial 示例
require_once 'PhpSerial.php';

$serial = new PhpSerial;
$serial->deviceSet('/dev/ttyUSB0');
$serial->confBaudRate(9600);
$serial->confParity('none');
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();

// 构建 RTU 帧 (读取输入寄存器)
$unitId = 1;
$functionCode = 4;
$startAddress = 0;
$quantity = 2;

$data = pack('Cnn', $unitId, $functionCode, $startAddress, $quantity);
$crc = crc16($data);
$frame = $data . pack('v', $crc);

$serial->sendMessage($frame);
$response = $serial->readPort();
$serial->deviceClose();

// CRC16 计算函数
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;
}

使用第三方库

推荐使用成熟的 PHP Modbus 库简化开发:

  1. Adduc/PhpModbus:

    require 'vendor/autoload.php';
    use Adduc\PhpModbus\ModbusMaster;
    
    $modbus = new ModbusMaster('192.168.1.1', 'TCP');
    $values = $modbus->readMultipleRegisters(1, 0, 2);
  2. Elephant418/Modbus:

    use Elephant418\Modbus\ModbusMaster;
    $client = new ModbusMaster('tcp://192.168.1.1:502');
    $response = $client->readHoldingRegisters(1, 0, 2);

注意事项

  • Modbus TCP 需要确保网络连通性和端口开放
  • Modbus RTU 需正确配置串口参数(波特率、校验位等)
  • 工业环境中考虑添加错误处理和重试机制
  • 大数据量读取时分批请求,避免超时

php实现modbus

标签: phpmodbus
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $n…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…