2017-03-01 9 views
0

私は、クライアントとしてラズベリーパイにpymodbusを使用して、値を保持してTCP経由でmodbusマスターが利用できるようにしています。PymodbusクライアントのsetValuesが100個のレジスタに限定されています

すべてが素晴らしいです。私はデータストアをセットアップするために以下を使用しています。 values = context [slave_id] .getValues(register、address、count = 350) 問題は、私が[98]以上に行くことができない値を設定しようとするときです。

私がcount = 5に設定した場合、[0]から[4]までの値を設定できますが、期待通りに[5]を設定するとエラーになります。

count = 350では値[99]を設定しようとするとエラーとなります。

これは、100個のレジスタの制限であることを示唆しています。この制限を延長できますか?

store.pyを見る私は何か制限があるわけではないので、制限がどこに設定されるのかちょっと混乱しています。

あなたの助けに感謝します。

乾杯

答えて

1

プロトコルを扱うことができるレジスタの量のModbusの仕様には限界があります。私が個人的に読んだり書いたりしたのは、120レジスタですが、ここではcontrol.comの説明があります:

"予想される応答の他のすべてのフィールドと組み合わせた読み込み量Modbusメッセージの許容長を超えてはならない:256バイト。 1バイト 機能コード:1人のバイト バイト数:1バイト

レジスタデータ:Nレジスタはそれぞれ2バイト

を*

機能へのModbus/RTU応答3要求は

ノードのアドレスを含みます

CRC:2バイト

したがって、単一のModbus/RTUクエリで読み取り可能なレジスタの最大数は125

あります3210

Modbus/TCPを使用している場合は、6バイトのヘッダーと1バイトのユニットIDに対してデバイスアドレスとCRC(合計3バイト)を交換します。単一の応答内のレジスタの最大数は123

Maximum amount of holding registers per request

+0

こんにちは。あなたの答えをありがとう。これはマスターではなくpyModbusのスレーブ実装です。あなたが言ったように、私は私のマスターからレジスタを読み込むと、私は100のレジスタのブロックで読みました。 – Winetec

+0

問題は、pyModbusのレジスタのデータストアを作成するときです – Winetec

+0

最初の98個以上のレジスタの値をスレーブに追加できません。 – Winetec

0

私は自分の質問に答えているように落ちます。スレーブとして動作するようにPyModbusを設定していて、100を超えるレジスタを使用できるようにするには、Pythonスクリプトで次のコード行を編集して、更新するレジスタの量を反映させる必要があります。

ここでは、データストアをPythonスクリプトで初期化します。

store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(0, [1]*100), 
    co = ModbusSequentialDataBlock(0, [2]*100), 
    hr = ModbusSequentialDataBlock(0, [3]*100), 
    ir = ModbusSequentialDataBlock(0, [4]*100)) 
context = ModbusServerContext(slaves=store, single=True) 

更新するレジスタの数を100に変更します。

ありがとうございましたStackOverflowと投稿者。あなたは問題への答えを見つけるための私の主なゴトです。素晴らしいサイト。乾杯。

関連する問題