Я пытаюсь использовать библиотеку aldas php из https://github.com/aldas/modbus-tcp-client Iam с использованием функций Modbus fc3 и fc6 (чтение и запись в регистры хранения). Примеры работают нормально, если каждый из них находится в отдельном файле php. Но для моего приложения мне нужно прочитать pl c, чтобы найти значения, прежде чем писать в них. Поэтому я положил оба в один php файл. Но затем он начинает выдавать ошибки в классе «ReadHoldingRegistersRequest». Тот же код работает в отдельном файле php. Я пытался использовать require __DIR__ . '/../vendor/autoload.php
внутри функции без особой помощи. Ниже приведен код
<?php
use ModbusTcpClient\Network\BinaryStreamConnection;
use ModbusTcpClient\Packet\ModbusFunction\WriteSingleRegisterRequest;
use ModbusTcpClient\Packet\ModbusFunction\WriteSingleRegisterResponse;
use ModbusTcpClient\Packet\ResponseFactory;
require __DIR__ . '/../../vendor/autoload.php';
$startAddress = 21;
$value = 1; // 0x0102
$parampassederror=0;
$errormessage='NA';
read_modbus();
//write_modbus($startAddress,$value);
function read_modbus()
{
$connection = BinaryStreamConnection::getBuilder()
->setPort(502)
->setHost('192.168.1.131')
->build();
$startAddress = 0;
$quantity = 30;
$packet1 = new ReadHoldingRegistersRequest($startAddress, $quantity);
//echo 'Packet to be sent (in hex): ' . $packet->toHex() . PHP_EOL;
try {
$binaryData = $connection->connect()
->sendAndReceive($packet1);
// @var $response ReadHoldingRegistersResponse
$response = ResponseFactory::parseResponseOrThrow($binaryData);
// echo 'Parsed packet (in hex): ' . $response->toHex() . PHP_EOL;
// echo 'Data parsed from packet (bytes):' . PHP_EOL;
// print_r($response->getData());
$numbers = array( 0, 0, 0, 0);
$numbers = $response->getData();
// $numbers = (int) $response->getBytes();
//print_r ($numbers);
$ind_numbers = array(0,0);
$loopctr =0;
;
$fp =0;
$sp=0;
$completeValue = 0;
$completeArray = array();
foreach ($numbers as $word) {
if ($loopctr == 0){
$fp = $word;
++$loopctr; // = loopctr+1
}
elseif ($loopctr == 1){
$sp = $word;
$completeValue = ($fp*256) + $sp;
// echo (" <br /> Complete Value $completeValue ");
array_push($completeArray, $completeValue);
$loopctr =0;
} // if ($loopctr == 0){
} //foreach ($numbers as $word) {
// print_r($completeArray);
} catch (Exception $exception) {
echo 'An exception occurred' . PHP_EOL;
echo $exception->getMessage() . PHP_EOL;
echo $exception->getTraceAsString() . PHP_EOL;
} finally {
$connection->close();
}
print_r($completeArray);
// echo ("In read_modbus ");
} //function read_modbus()
function write_modbus($startAddress,$value)
{
$connection = BinaryStreamConnection::getBuilder()
->setPort(502)
->setHost('192.168.1.131')
->build();
$packet = new WriteSingleRegisterRequest($startAddress, $value);
//echo 'Packet to be sent (in hex): ' . $packet->toHex() . PHP_EOL;
try {
$binaryData = $connection->connect()
->sendAndReceive($packet);
// echo 'Binary received (in hex): ' . unpack('H*', $binaryData)[1] . PHP_EOL;
// @var $response WriteSingleRegisterResponse
$response = ResponseFactory::parseResponseOrThrow($binaryData);
$errormessage = "successfulWrite";
//
} catch (Exception $exception) {
// echo 'An exception occurred' . PHP_EOL;
echo $exception->getMessage() . PHP_EOL;
// echo $exception->getTraceAsString() . PHP_EOL;
} finally {
$connection->close();
}
echo $errormessage;
}
?>
Мне нужна помощь дополнительной пары глаз. Я прокомментировал вызов write_modbus, чтобы увидеть, можно ли избежать ошибки, но бесполезно. Я также попытался в отдельном файле php, где я вызываю read_modbus как функцию, и она работает. Спасибо