当前位置:首页 > 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:

    php实现modbus

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

注意事项

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

标签: phpmodbus
分享给朋友:

相关文章

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mod_…

php实现重定向

php实现重定向

使用header函数进行重定向 在PHP中,header()函数是实现重定向的常用方法。通过发送HTTP头信息Location,浏览器会自动跳转到指定URL。需确保在调用header()前没有输出任何…