2016-11-20 12 views
0

背景:QModbusTcpClientを使用していますModbus/TCPネットワークに接続されたデバイスからコンテンツを読み取ろうとしています。その目的のために、私は基本的にタイプは(アドレス1000に等しく、HoldingRegistersあるパラメータとしてQModbusDataUnit::QModbusDataUnit(RegisterType type, int address, quint16 size)QModbusClient::sendReadRequestを呼び出すのQt C++(Qtのバージョン5.7.0)に(7および10でテスト)Windowsプログラムを書かれています別のアドレスである可能性がありますが、この特定の問題では重要ではありません)。サイズは、デバイスから読み取るデータの長さです。QModbusTcpClientのデータサイズの制限

問題:size63以下の場合、すべて正常に動作します。この値を超えようとすると、エラーが発生します。これは、プログラムをテストしているデバイスに依存しますが、一般的に無効なリクエストです。

テスト:私はいくつかの実際のデバイスで、同じ結果を得るModbus/TCP simulatorでこれをテストした

  1. 、すなわちsize < = 63 - >大丈夫。 > size63 - >エラー
  2. Modpoll別の側面から、私は63レジスタ

いくつかの研究よりも大きいsizeと同じデバイスとシミュレータからのデータチャンクを読み取ることができます:Hereは、それが記載されています、確かに制限がありますが、それは128バイトの16ビットレジスタに等しい256バイトです。言い換えれば、私の読み込み試行の限界を超えています。

私の疑惑:それはQModbusTcpClient以上63レジスタを読み出すことはできませんことが表示されます。

質問:QModbusTcpClientを使用してこのような問題を経験したことがありますか?また、2回のパスでデータを読むことを除けば、この制限を克服する方法はありますか?

答えて

0

私の場合は、私の手で問題を解決し、自分のクラスを作成してModbusデバイスと通信するという解決策でした。クラスはQObjectから継承されるため、シグナルスロットシステムはまだ処分中ですが、実際の機能はwinsock2.hに基づいています。 Hereは、私が必要とする仕事をするサンプルプログラムです。私が遭遇したもう一つの有用な情報源は、this book、winsocket 2の参考文献のexample program、もちろんModbus specificationです。それはそれほど難しいことではなく、私が言及した情報源からの少しの助けを借りて、私が持っていた問題を解決することができたことが判明しました。