PHP和Go언어Modbus库使用指南:phpmodbus与go-modbus实战

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

PHP和Go语言Modbus库使用指南:phpmodbus与go-modbus实战

PHP Modbus 库(phpmodbus)

phpmodbus 是一个用 PHP 实现的 Modbus UDP/TCP 통신库,项目托管在 Google Code Archive:code.google.com/p/phpmodbus(已归档)。它实现了 Modbus UDP 프로토콜的基本功能,支持 FC03(读유지 레지스터)、FC16(写多레지스터)、FC23(读/写多레지스터)。

尽管 Modbus UDP 在工业现场远不如 Modbus TCP 常见,但 phpmodbus 在某些特殊的 Web 적용시나리오中有独特价值——比如在 PHP 编写的 SCADA 看板웹사이트中直接읽기 Modbus UDP 设备的데이터、或者通过浏览器界面원격 제어 Modbus 设备。

安装与基础使用

<?php
// 引入 phpmodbus 库
require_once 'PhpModBus.php';

// 创建 Modbus UDP 마스터实例
$modbus = new ModbusUdpMaster('192.168.1.100', 502);

try {
    // FC03: 읽기슬레이브 1,시작주소 0,10 个유지 레지스터
    $데이터 = $modbus->readMultiple회원가입s(1, 0, 10);
    
    // 출력结果
    echo "읽기到的레지스터데이터:n";
    for ($i = 0; $i < count($데이터); $i++) {
        echo sprintf("  주소 %d: %d (0x%04X)n", $i, $데이터[$i], $데이터[$i]);
    }
} catch (Exception $e) {
    echo "Modbus 통신错误: " . $e->getMessage();
}
?>

FC16 写多个유지 레지스터

<?php
$modbus = new ModbusUdpMaster('192.168.1.100', 502);

// 要쓰기的데이터
$values = [100, 200, 300, 400];

// FC16: 슬레이브 1,시작주소 10,쓰기 4 个레지스터
$modbus->writeMultiple회원가입(1, 10, $values);
echo "쓰기成功n";
?>

FC23 组合读写

<?php
$modbus = new ModbusUdpMaster('192.168.1.100', 502);

// FC23: 读주소 0-9,同时写주소 10-13
$valuesToWrite = [99, 88, 77, 66];
$read데이터 = $modbus->readWrite회원가입s(1, 0, 10, 10, $valuesToWrite);

echo "읽기데이터: ";
print_r($read데이터);
echo "쓰기데이터: ";
print_r($valuesToWrite);
?>

Go Modbus 库(goburrow/modbus)

go-modbus(全称 github.com/goburrow/modbus)是一个用 Go 언어编写的 Modbus 프로토콜클라이언트库,GitHub 주소:github.com/goburrow/modbus。它被설명为"fault-tolerant, fail-fast"的实现——在设计上注重错误处理和快速失败,适合在可靠性和稳定性要求较高的工业边缘게이트웨이시나리오中使用。

⚠️ 注意:根据 modbus.org 2024 年的最新설명,该库仍处于"incubating"阶段,"do not use in production yet (more testing needed)"。虽然 API 设计优秀,但在生产환경中使用前需要充分测试。

安装

go get github.com/goburrow/modbus

Modbus TCP 클라이언트예제

package main

import (
    "fmt"
    "time"
    "github.com/goburrow/modbus"
)

func main() {
    // 创建 TCP 클라이언트
    handler := modbus.NewTCPClientHandler("192.168.1.100:502")
    handler.Timeout = 5 * time.Second
    handler.SlaveId = 1
    
    // 建立연결
    err := handler.Connect()
    if err != nil {
        fmt.Printf("연결失败: %vn", err)
        return
    }
    defer handler.닫기()
    
    client := modbus.NewClient(handler)
    
    // 읽기 10 个유지 레지스터(주소 0-9)
    results, err := client.ReadHolding회원가입s(0, 10)
    if err != nil {
        fmt.Printf("읽기失败: %vn", err)
        return
    }
    
    fmt.Println("레지스터데이터:")
    for i := 0; i < len(results)-1; i += 2 {
        value := uint16(results[i])<<8 | uint16(results[i+1])
        fmt.Printf("  주소 %d: %d (0x%04X)n", i/2, value, value)
    }
    
    // 단일 레지스터 쓰기 (FC06)
    err = client.WriteSingle회원가입(0, 1234)
    if err != nil {
        fmt.Printf("쓰기失败: %vn", err)
    } else {
        fmt.Println("쓰기成功")
    }
}

Modbus RTU 시리얼 포트클라이언트

package main

import (
    "fmt"
    "github.com/goburrow/modbus"
)

func main() {
    // 创建 RTU 클라이언트(RS-485)
    handler := modbus.NewRTUClientHandler("/dev/ttyUSB0")
    handler.BaudRate = 9600
    handler.데이터Bits = 8
    handler.Parity = "N"   // 패리티 없음
    handler.StopBits = 1
    handler.SlaveId = 1
    handler.Timeout = 3 * time.Second
    
    err := handler.Connect()
    if err != nil {
        panic(err)
    }
    defer handler.닫기()
    
    client := modbus.NewClient(handler)
    results, _ := client.ReadHolding회원가입s(0, 5)
    fmt.Printf("RTU 읽기结果: % Xn", results)
}

Go 언어在工业物联网中的优势

Go 언어近年来在工业物联网边缘게이트웨이领域越来越受欢迎,原因有几个:

  • 原生并发:goroutine 让同时연결数百个 Modbus 슬레이브变得简单高效
  • 单2진수部署:编译后是一个独立可执行文件,无需运行时依赖(如 JVM、Python 解释器),部署极其简单
  • 跨平台编译:GOOS=linux GOARCH=arm64 go build 即可交叉编译到 ARM Linux(树莓派、산업 제어机)
  • 内存安全:相比 C 언어,Go 提供的自动垃圾回收和内存安全检查更适合编写稳定的长时间运行服务

Python Modbus Test Kit(modbus-tk)

Modbus Test Kit(modbus-tk)是一个 Python 实现的 Modbus 프로토콜库,项目在 Google Code Archive。它支持 Modbus RTU 和 Modbus TCP,可以同时编写클라이언트和服务器。对于 Python 用户来说,另一个更现代的选择是 pymodbus,两者 API 风格不同但功能覆盖类似。

#!/usr/bin/env python3
# modbus-tk 基本使用예제
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_tcp

# 创建 TCP 마스터
master = modbus_tcp.TcpMaster(host="192.168.1.100", port=502)
master.set_timeout(5.0)

# 읽기슬레이브 1 的유지 레지스터 0-9
try:
    values = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)
    print(f"읽기结果: {values}")
except modbus_tk.modbus.Modbus오답 as exc:
    print(f"Modbus 错误: {exc}")

各언어 Modbus 库选择建议

使用시나리오推荐库언어状态
Web 적용통합phpmodbusPHP停更(UDP only)
边缘게이트웨이服务goburrow/modbusGoIncubating
自动化测试스크립트modbus-tk / pymodbusPython活跃
嵌入式 LinuxlibmodbusC稳定

总结

Modbus 虽然是一个诞生超过 40 年的老프로토콜,但在各种现代编程언어中都有对应的实现。PHP 的 phpmodbus 适合 Web 통합시나리오(尽管只支持 UDP),Go 的 goburrow/modbus 展现了 Go 언어在工业物联网边缘계산的潜力,Python 的 pymodbus 和 modbus-tk 则是编写自动化测试스크립트和研究原型的最佳选择。根据你的项目언어栈和稳定性需求选择合适的库即可。

실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注