- 1. PHP Modbus 库(phpmodbus)
- 2. 安装与基础使用
- 3. FC16 写多个保持Register.
- 4. FC23 组合读写
- 5. Go Modbus 库(goburrow/modbus)
- 6. 安装
- 7. Modbus TCP 客户端Beispiel
- 8. Modbus RTU Die Serie客户端
- 9. Go 语言在Das industrielle Internet der Dinge中的优势
- 10. Python Modbus Test Kit(modbus-tk)
- 11. 各语言 Modbus 库Empfehlungen wählen
- 12. 总结
PHP Modbus 库(phpmodbus)
phpmodbus 是一个用 PHP 实现的 Modbus UDP/TCP Kommunikation库,项目托管在 Google Code Archive:code.google.com/p/phpmodbus(已归档)。它实现了 Modbus UDP Vereinbarung的基本Funktion,支持 FC03(Lesen Sie das Register)、FC16(写多Register.)、FC23(读/写多Register.)。
尽管 Modbus UDP 在Industrie-Standort远不如 Modbus TCP Häufig,但 phpmodbus 在某些特殊的 Web Anwendungsszenarien中有独特价值——比如在 PHP 编写的 SCADA 看板Webseite中直接Lesen Modbus UDP Ausrüstung的Daten、或者通过浏览器界面Fernsteuerung Modbus Ausrüstung。
安装与基础使用
<?php
// 引入 phpmodbus 库
require_once 'PhpModBus.php';
// 创建 Modbus UDP Hauptstation实例
$modbus = new ModbusUdpMaster('192.168.1.100', 502);
try {
// FC03: LesenVon der Station 1,Ausgang Adresse 0,10 个保持Register.
$data = $modbus->readMultipleRegisters(1, 0, 10);
// 输出Ergebnis
echo "Lesenzu的Registerdaten:n";
for ($i = 0; $i < count($data); $i++) {
echo sprintf(" Adresse %d: %d (0x%04X)n", $i, $data[$i], $data[$i]);
}
} catch (Exception $e) {
echo "Modbus KommunikationFehler.: " . $e->getMessage();
}
?>
FC16 写多个保持Register.
<?php
$modbus = new ModbusUdpMaster('192.168.1.100', 502);
// 要写入的Daten
$values = [100, 200, 300, 400];
// FC16: Von der Station 1,Ausgang Adresse 10,写入 4 ein Register.
$modbus->writeMultipleRegister(1, 10, $values);
echo "写入成功n";
?>
FC23 组合读写
<?php
$modbus = new ModbusUdpMaster('192.168.1.100', 502);
// FC23: 读Adresse 0-9,同时写Adresse 10-13
$valuesToWrite = [99, 88, 77, 66];
$readData = $modbus->readWriteRegisters(1, 0, 10, 10, $valuesToWrite);
echo "Daten lesen: ";
print_r($readData);
echo "写入Daten: ";
print_r($valuesToWrite);
?>
Go Modbus 库(goburrow/modbus)
go-modbus(全称 github.com/goburrow/modbus)是一个用 Go 语言编写的 Das Modbus-Protokoll客户端库,GitHub Adresse:github.com/goburrow/modbus。它被描述为”fault-tolerant, fail-fast”的实现——在设计上注重Fehler.处理和快速失败,适合在可靠性和稳定性要求较高的工业边缘网关Szene中使用。
⚠️ 注意:根据 modbus.org 2024 Jahr的最新描述,该库仍处于”incubating”阶段,”do not use in production yet (more testing needed)”。虽然 API 设计优秀,但在生产环境中使用前需要充Unterteilung测试。
安装
go get github.com/goburrow/modbus
Modbus TCP 客户端Beispiel
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
// 建立Verbindung
err := handler.Connect()
if err != nil {
fmt.Printf("Verbindung失败: %vn", err)
return
}
defer handler.Close()
client := modbus.NewClient(handler)
// Lesen 10 个保持Register.(Adresse 0-9)
results, err := client.ReadHoldingRegisters(0, 10)
if err != nil {
fmt.Printf("Lesen gescheitert: %vn", err)
return
}
fmt.Println("Registerdaten:")
for i := 0; i < len(results)-1; i += 2 {
value := uint16(results[i])<<8 | uint16(results[i+1])
fmt.Printf(" Adresse %d: %d (0x%04X)n", i/2, value, value)
}
// Schreiben in ein einzelnes Register
err = client.WriteSingleRegister(0, 1234)
if err != nil {
fmt.Printf("写入失败: %vn", err)
} else {
fmt.Println("写入成功")
}
}
Modbus RTU Die Serie客户端
package main
import (
"fmt"
"github.com/goburrow/modbus"
)
func main() {
// 创建 RTU 客户端(RS-485)
handler := modbus.NewRTUClientHandler("/dev/ttyUSB0")
handler.BaudRate = 9600
handler.DataBits = 8
handler.Parity = "N" // 无Prüfungen
handler.StopBits = 1
handler.SlaveId = 1
handler.Timeout = 3 * time.Second
err := handler.Connect()
if err != nil {
panic(err)
}
defer handler.Close()
client := modbus.NewClient(handler)
results, _ := client.ReadHoldingRegisters(0, 5)
fmt.Printf("RTU LesenErgebnis: % Xn", results)
}
Go 语言在Das industrielle Internet der Dinge中的优势
Go 语言近Jahr来在Das industrielle Internet der Dinge边缘网关领域越来越受欢迎,原因有几个:
- 原生并发:goroutine 让同时Verbindung数百个 Modbus Von der Station变得简单高效
- 单Binärsystem部署:编译后是一个独立可执行文件,无需Betrieb时依赖(如 JVM、Python 解释器),部署极其简单
- 跨平台编译:
GOOS=linux GOARCH=arm64 go build即可交叉编译zu ARM Linux(Raspberry Pi、Arbeitskontrolle机) - 内存安全:相比 C 语言,Go 提供的自动垃圾回收和内存安全检查更适合编写稳定的长ZeitBetrieb服务
Python Modbus Test Kit(modbus-tk)
Modbus Test Kit(modbus-tk)是一个 Python 实现的 Das Modbus-Protokoll库,项目在 Google Code Archive。它支持 Modbus RTU 和 Modbus TCP,可以同时编写客户端和Der Server。对于 Python 用户来说,另一个更现代的Auswahl是 pymodbus,两者 API 风格不同但Funktion覆盖类似。
#!/usr/bin/env python3
# modbus-tk 基本使用Beispiel
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_tcp
# 创建 TCP Hauptstation
master = modbus_tcp.TcpMaster(host="192.168.1.100", port=502)
master.set_timeout(5.0)
# LesenVon der Station 1 的保持Register. 0-9
try:
values = master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 10)
print(f"LesenErgebnis: {values}")
except modbus_tk.modbus.ModbusError as exc:
print(f"Modbus Fehler.: {exc}")
各语言 Modbus 库Empfehlungen wählen
| 使用Szene | 推荐库 | 语言 | Status |
|---|---|---|---|
| Web 应用集成 | phpmodbus | PHP | 停更(UDP only) |
| 边缘网关服务 | goburrow/modbus | Go | Incubating |
| 自动化测试Drehbuch | modbus-tk / pymodbus | Python | 活跃 |
| Eingebettet Linux | libmodbus | C | 稳定 |
总结
Modbus 虽然是一个诞生超过 40 Jahr的老Vereinbarung,但在各种现代编程语言中都有对应的实现。PHP 的 phpmodbus 适合 Web 集成Szene(尽管只支持 UDP),Go 的 goburrow/modbus 展现了 Go 语言在Das industrielle Internet der Dinge边缘Berechnung的潜力,Python 的 pymodbus 和 modbus-tk 则是编写自动化测试Drehbuch和研究原型的最佳Auswahl。根据你的项目语言栈和稳定性需求Auswahl合适的库即可。
Antwort veröffentlichen