在通信架構中,MODBUS TCP通常由**主站(Master)發起請求,並由從站(Slave)**響應命令。這種結構使得主站可以高效地集中控制多個工業設備,從而實現數據集中採集和遠程控制。
<?php
class ModbusTCP {
private $socket;
public function __construct($ip, $port) {
$this-> socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($this->socket, $ip, $port);
}
public function readRegisters($slaveId, $registerAddress, $registerCount) {
$buffer = pack("nnnn", $slaveId, 0x03, $registerAddress, $registerCount);
socket_send($this->socket, $buffer, strlen($buffer), 0);
$response = '';
$bytes = socket_recv($this->socket, $response, 2048, MSG_WAITALL);
$registers = unpack("n*", substr($response, 9));
return $registers;
}
public function writeRegister($slaveId, $registerAddress, $registerValue) {
$buffer = pack("nnn", $slaveId, 0x06, $registerAddress, $registerValue);
socket_send($this->socket, $buffer, strlen($buffer), 0);
}
public function __destruct() {
socket_close($this->socket);
}
}
// 使用示例$modbus = new ModbusTCP('192.168.0.1', 502);
$registers = $modbus->readRegisters(1, 0, 10);
foreach ($registers as $address => $value) {
echo "Register $address: $value\n";
}
$modbus->writeRegister(1, 0, 100);
這段代碼展示了一個基本的ModbusTCP類,它通過PHP的socket函數實現與從站的連接、寄存器的讀取與寫入功能。在實際使用中,開發者只需初始化類實例,並傳入設備IP和端口,即可實現工業設備的數據交互。
參考文獻:
[1] MODBUS Application Protocol Specification v1.1b3 — https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf