在通信架构中,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