php ошибка использования Modbus при чтении и записи в одной программе php (как функции) - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать библиотеку 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 как функцию, и она работает. Спасибо

...