Pymodbus:応答のバイト数が間違っています

クリストバルレンコレット

RS485デバイスから14の応答を要求していますが、取得した応答に、設定されている9バイトがない場合があります。それは時々3つの引数で応答しているからです。

Normal: 
CALL->     01 04 00 00 00 02 71 CB 
RESPONSE-> 01 04 04 43 59 E6 66 F4 59


Error:
CALL->      01 04 00 00 00 02 71 CB 
RESPONSE -> 01 04 04 43
            59 CC CD AA 86 

エラーが発生すると、pymodbusから次のメッセージが表示されます。

DEBUG:pymodbus.transaction: Incomplete message received, Expected 9 bytes Recieved 4 bytes !!!!
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x1 0x4 0x4 0x3e
DEBUG:pymodbus.framer.rtu_framer:Frame check failed, ignoring!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer - 0x1 0x4 0x4 0x3e
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'

にスリープを入れてみたので、デバイスが通話で崩壊することはありませんが、どちらの方法でも取得できます。https://wingpath.co.uk/docs/modtest/troubleshoot.htmlも読んだことがありますが、次のように言われています。

"Wrong byte count in response: XXX when expecting XXX"

The byte count in the response sent by the slave is not what was expected for the count that ModTest sent in the request.

Turn on tracing to get more information.

Check that your slave is functioning correctly.

If you want ModTest to accept the response even though it is incorrect, you could deselect Strict Checking.

しかし、PYMODBUSでトレースをアクティブにする方法がわかりません。関数は正しく、もう1つは使用していないライブラリ用です。

コードはこのように見えます

from __future__ import division
import pymodbus
import serial
from pymodbus.pdu import ModbusRequest
from pymodbus.client.sync import ModbusSerialClient as ModbusClient #initialize a serial RTU client instance
from pymodbus.transaction import ModbusRtuFramer
from time import sleep
from pymodbus.constants import Endian              # Nodig voor 32-bit float getallen (2 registers / 4 bytes)
from pymodbus.payload import BinaryPayloadDecoder  # Nodig voor 32-bit float getallen (2 registers / 4 bytes)
from pymodbus.payload import BinaryPayloadBuilder  # Nodig om 32-bit floats te schrijven naar register

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

method = "rtu"
port = "COM1"
baudrate = 2400
stopbits = 1
bytesize = 8
parity = "N"
timeout = 10 # I SET THIS TO 10 MAYBE IT WOULD HELP BUT DIDN'T
retries = 5  # SAME THING WITH THIS ONE
try:
    client = ModbusClient(method = method, port = port, stopbits = stopbits, bytesize = bytesize, parity = parity, baudrate = baudrate, timeout = timeout, retries = retries)
    connection = client.connect()
    print (connection)
except:
    print ("Modbus connectie error")
def 420 (y):
    variables = [0,6,12,18,24,30,36,70,72,74,76,78,342,344]
    labels = ["Voltage","Corriente","Potencia_Activa","Potencia_Aparente","Potencia_Reactiva","Factor_Potencia","Angulo_Fase","Frecuencia","Potencial_Activa_Consumida","Potencia_Activa_Inyectada","Potencia_Reactiva_Consumida","Potencia_Reactiva_Inyectada","Energia_Activa_Total","Energia_Reactiva_Total"]
    unidades = ["V","A","W","VA","VAr","%","Grados","HZ","kWh","kWh","kVArh","kVArh","kWh","kVArh"]
    LISTA = []
    h = 0
    hh = 0
    for xx in variables:
        try:
            data = client.read_input_registers(xx, 2, unit=1)
            decoder = BinaryPayloadDecoder.fromRegisters(data.registers, Endian.Big)
            eastron = round(decoder.decode_32bit_float(), 3)
            weaito = str(labels[h]) + " = " + str(eastron) + " " + str(unidades[hh])
            LISTA.append(weaito)
            h = h + 1
            hh = hh + 1
            sleep(0.5)
        except:
            print ("PICO")
            sleep(1)
    print(LISTA)

私は問題を回避する方法が欲しいです、多分私が正しい答えを得るまでもう一度相談するだけです。私は試してみるのが苦手で、他の人を除いて答えがあるかもしれません。

マルコスG。

文字間の間隔に関する既知の問題が発生しているようです

ただし、簡単な回避策があります。まず、pymodbusバージョン2.2.0を使用していることを確認します(pip listパスが正しく設定されている場合は、Windowsでコマンドラインターミナルを開いて入力します。それ以外の場合pip.exeは、保存されているスクリプトPythonフォルダーに移動する必要があります)。

次に、コードを変更して、次のようにstrict宣言され引数を追加しますFalse

....
client = ModbusClient(method = method, port = port, stopbits = stopbits, bytesize = bytesize, parity = parity, baudrate = baudrate, timeout = timeout, retries = retries)
client.strict = False    #Use Modbus interchar spacing as timeout to prevent missing data for low baudrates
connection = client.connect()
...

これにより、Modbus仕様に従って、デフォルトのfrom socket.interCharTimeoutを使用する代わりに、選択したボーレートでのビット時間の1.5倍に文字間隔が定義されます

self._t0 = float((1 + 8 + 2)) / self.baudrate
self.inter_char_timeout = 1.5 * self._t0

このソリューションで問題を修正できれば、必要な28個のレジスタを一度に読み取るデバイスのオーバーヘッドを減らすことができるはずです。

問題が解決しない場合は、ハードウェアに問題がある可能性があります。コードをしばらく脇に置いて、QModMasterなどでレジスターを読み取って、ハードウェアが意図したとおりに動作していることを確認することをお勧めします。(フレームを短くするノイズや接地の問題が発生する可能性があります。前面にいくつかのポインタが必要な場合は、質問を編集して、ハードウェアの詳細(デバイスの種類と接続方法など)を含めてください)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

リダイレクト後のHttpClientの応答が間違った応答を取得しています

分類Dev

偽のHATEOS応答に間違ったサーバー、ポート情報が含まれています

分類Dev

IE11でホバー応答間違っています

分類Dev

COM_STMT_PREPARE の応答サイズが間違っています。受信 7. LARAVEL ERROR

分類Dev

第1引数のタイプが間違っています

分類Dev

geom_dotplotのドット数が間違っています

分類Dev

キーをバインドするときの引数の数が間違っています

分類Dev

CSS要素のタイトルが間違っています

分類Dev

https URLのデバイスで日付が間違っているため、AndroidでAPI応答を読み込めません

分類Dev

Django-pdf応答のエンコーディングが間違っています-reportlab

分類Dev

AEM DAMアセット:Web対応レンディションのサイズが間違っています

分類Dev

Reactコンポーネントの状態、応答からの配列内のオブジェクトの順序が間違っています

分類Dev

Chromeモバイルデバイスのビューポートが間違っています

分類Dev

応答がすでにコミットされているため、要求のエラーページに転送できません... その結果、応答のステータスコードが間違っている可能性があります

分類Dev

スプリング法のMockitoテストは、応答の結果が間違っているために失敗します

分類Dev

幅が90の倍数のCVPixelBufferを作成する場合、行あたりのバイト数が間違っています

分類Dev

パンダ:バッファの次元数が間違っています

分類Dev

C#UnityonClickイベントの関数の引数が間違っています

分類Dev

デバイスの画像サイズが間違っています

分類Dev

私は2つの数を割ろうとしますが、答えは間違っています

分類Dev

この場合、clangが間違っているか、gccが間違っているか、またはその両方が間違っていますか?メンバーポインタでconstnessをキャストします

分類Dev

インクリメントする型引数が間違っています

分類Dev

IFへの引数の数が間違っています

分類Dev

DjangoNoReverseMatchの引数の数が間違っています

分類Dev

初期化時の引数の数が間違っています

分類Dev

csvファイルをインポートするときの列数が間違っています

分類Dev

物理デバイスでのDialogFragmentの表示が間違っています

分類Dev

iPhone 6のiAdバナーのサイズが間違っていますか?

分類Dev

jqueryからのaspxのバインドが間違っています

Related 関連記事

  1. 1

    リダイレクト後のHttpClientの応答が間違った応答を取得しています

  2. 2

    偽のHATEOS応答に間違ったサーバー、ポート情報が含まれています

  3. 3

    IE11でホバー応答間違っています

  4. 4

    COM_STMT_PREPARE の応答サイズが間違っています。受信 7. LARAVEL ERROR

  5. 5

    第1引数のタイプが間違っています

  6. 6

    geom_dotplotのドット数が間違っています

  7. 7

    キーをバインドするときの引数の数が間違っています

  8. 8

    CSS要素のタイトルが間違っています

  9. 9

    https URLのデバイスで日付が間違っているため、AndroidでAPI応答を読み込めません

  10. 10

    Django-pdf応答のエンコーディングが間違っています-reportlab

  11. 11

    AEM DAMアセット:Web対応レンディションのサイズが間違っています

  12. 12

    Reactコンポーネントの状態、応答からの配列内のオブジェクトの順序が間違っています

  13. 13

    Chromeモバイルデバイスのビューポートが間違っています

  14. 14

    応答がすでにコミットされているため、要求のエラーページに転送できません... その結果、応答のステータスコードが間違っている可能性があります

  15. 15

    スプリング法のMockitoテストは、応答の結果が間違っているために失敗します

  16. 16

    幅が90の倍数のCVPixelBufferを作成する場合、行あたりのバイト数が間違っています

  17. 17

    パンダ:バッファの次元数が間違っています

  18. 18

    C#UnityonClickイベントの関数の引数が間違っています

  19. 19

    デバイスの画像サイズが間違っています

  20. 20

    私は2つの数を割ろうとしますが、答えは間違っています

  21. 21

    この場合、clangが間違っているか、gccが間違っているか、またはその両方が間違っていますか?メンバーポインタでconstnessをキャストします

  22. 22

    インクリメントする型引数が間違っています

  23. 23

    IFへの引数の数が間違っています

  24. 24

    DjangoNoReverseMatchの引数の数が間違っています

  25. 25

    初期化時の引数の数が間違っています

  26. 26

    csvファイルをインポートするときの列数が間違っています

  27. 27

    物理デバイスでのDialogFragmentの表示が間違っています

  28. 28

    iPhone 6のiAdバナーのサイズが間違っていますか?

  29. 29

    jqueryからのaspxのバインドが間違っています

ホットタグ

アーカイブ