aldas / modbus-tcp-client

PHP client for Modbus TCP and Modbus RTU over TCP (can be used for serial)
Apache License 2.0
191 stars 55 forks source link

packet length more bytes than expected error #128

Closed ranjithphptech closed 1 year ago

ranjithphptech commented 1 year ago
root@ubuntu:/home/rkphptech# php /var/www/html/modbus-tcp-client-master/examples/write_usb_serial.php
RTU Binary to sent (in hex):   0106000d0001d9c9
2023-01-25 10:12:55.876190: [debug] msg: "Connected"
2023-01-25 10:12:55.880604: [debug] msg: "Data sent", data: array (
  1 => '0106000d0001d9c9',
)
2023-01-25 10:12:55.917155: [debug] msg: "Polling data"
2023-01-25 10:12:55.917287: [debug] msg: "Stream 37 @ index: 0 received data: ", data: array (
  1 => '0106000d0001d9c9',
)
An exception occurred
packet length more bytes than expected
#0 /var/www/html/modbus-tcp-client-master/examples/write_usb_serial.php(16): ModbusTcpClient\Utils\Packet::isCompleteLengthRTU()
#1 /var/www/html/modbus-tcp-client-master/src/Network/StreamHandler.php(78): {closure}()
#2 /var/www/html/modbus-tcp-client-master/src/Network/BinaryStreamConnection.php(60): ModbusTcpClient\Network\BinaryStreamConnection->receiveFrom()
#3 /var/www/html/modbus-tcp-client-master/src/Network/BinaryStreamConnection.php(83): ModbusTcpClient\Network\BinaryStreamConnection->receive()
#4 /var/www/html/modbus-tcp-client-master/examples/write_usb_serial.php(32): ModbusTcpClient\Network\BinaryStreamConnection->sendAndReceive()
#5 {main}

my code use ModbusTcpClient\Network\BinaryStreamConnection; use ModbusTcpClient\Packet\ModbusFunction\WriteSingleRegisterRequest; use ModbusTcpClient\Packet\ModbusFunction\WriteSingleRegisterResponse; use ModbusTcpClient\Packet\RtuConverter; use ModbusTcpClient\Utils\Packet;

require DIR . '/../vendor/autoload.php'; require DIR . '/logger.php';

$connection = BinaryStreamConnection::getBuilder() ->setUri('/dev/ttyUSB0') ->setProtocol('serial') ->setIsCompleteCallback(static function ($binaryData, $streamIndex): bool { return Packet::isCompleteLengthRTU($binaryData); }) ->setLogger(new EchoLogger()) ->build();

aldas commented 1 year ago

Seems that Packet::isCompleteLengthRTU is little buggy with for write* responses.

This should work for FC6 response:

->setIsCompleteCallback(static function ($binaryData, $streamIndex): bool {
return strlen($binaryData) == 8;
})

FC6 RTU response has 6 bytes of data + 2 bytes for CRC https://github.com/aldas/modbus-tcp-client/blob/48c46a8327667cbe25a59a33078eff2d6d482748/src/Packet/ModbusFunction/WriteSingleRegisterResponse.php#L17-L20

aldas commented 1 year ago

Hey, I have released new version 3.1.1 that fixes Packet::isCompleteLengthRTU to understand write response length correctly

aldas commented 1 year ago

@ranjithphptech could you recheck with latest version?