問題タブ [minimalmodbus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 最小限の modbus 再接続
USB経由で接続されたArduinoを使用してラズベリーで作業しています。minimalmodbus ライブラリで python 通信中 エラーで接続コードをもう一度繰り返してみましたが、役に立ちませんでした。シリアル接続が失われたときに再接続する機能はありますか?
minimalmodbus - 最小 modbus で有効なスレーブアドレスまたはスレーブアドレスの数を見つける
ドキュメンテーションはこれを行う方法を提供していません。私が知る限り、バスはこれを行うように設計されていません。しかし、何かを邪魔することなく、そこにあるデバイスを特定するためにデバイスから得ることができる、ある種の答えがあるのではないでしょうか?
controller - Modbus レジスタは読み取りのみ可能で、書き込みはできません
Modbus プロトコルを介して、気水チラー用の uC2 SE コントローラーと通信しようとしています。USB ポート COM へのシリアル RS485 がコントローラに接続されており、レジスタを読み取ることができましたが、write_register 関数を使用してそれらの値を変更することはできません。テスターでも試しました。exe および Modscan64 ソフトウェアと結果は同じで、読み取りのみ可能で、書き込みは不可能です。ここでコードの一部が実行され、デバッグ応答を確認できることを紹介しました。事前に助けてくれてありがとう!
温度設定値の変更
冷却_設定値_REG = 41
試してください: print(instrument.read_register(COOLING_SETPOINT_REG,1)) を除いて IOError: print('Failed to read from instrument')
NEW_TEMPERATURE = 20.1
return_flag = instrument.write_register(COOLING_SETPOINT_REG, NEW_TEMPERATURE,1,functioncode = 6, signed = True) # レジスタ番号、値、ストレージの小数点以下の桁数 output_flag = 'SUCCESS' if return_flag else 'FAILURE' print('単一レジスタステータスの書き込み ' + output_flag + '\n' )
試してください: print(instrument.read_register(COOLING_SETPOINT_REG,1)) を除いて IOError: print('Failed to read from instrument')
Respuesta デバッグ:
MinimalModbus デバッグ モード。計測器に書き込みます (7 バイトが戻ることを期待): '\x01\x03\x00)\x00\x01UÂ' (01 03 00 29 00 01 55 C2) MinimalModbus デバッグ モード。ポート COM8 MinimalModbus デバッグ モードを開きます。ポート COM8 MinimalModbus デバッグ モードのシリアル バッファをクリアしています。書き込み前にスリープする必要はありません。前回の読み取りからの時間: 334030.00 ミリ秒、最小サイレント期間: 4.01 ミリ秒。MinimalModbus デバッグ モード。ポート COM8 MinimalModbus デバッグ モードを閉じています。計測器からの応答: '\x01\x03\x02\x00ȹÒ' (01 03 02 00 C8 B9 D2) (7 バイト)、往復時間: 62.0 ms。読み取りのタイムアウト: 1000.0 ミリ秒。
20.0 MinimalModbus デバッグ モード。計測器に書き込みます (8 バイトが戻ることを期待): '\x01\x06\x00)\x00É\x98T' (01 06 00 29 00 C9 98 54) MinimalModbus デバッグ モード。ポート COM8 MinimalModbus デバッグ モードを開きます。ポート COM8 MinimalModbus デバッグ モードのシリアル バッファをクリアしています。書き込み前にスリープする必要はありません。前回の読み取りからの時間: 47.00 ミリ秒、最小サイレント期間: 4.01 ミリ秒。MinimalModbus デバッグ モード。ポート COM8 MinimalModbus デバッグ モードを閉じています。計測器からの応答: '\x01\x06\x00)\x00É\x98T' (01 06 00 29 00 C9 98 54) (8 バイト)、往復時間: 47.0 ms。読み取りのタイムアウト: 1000.0 ミリ秒。
シングル レジスタ ステータスの書き込み FAILURE
MinimalModbus デバッグ モード。計測器に書き込みます (7 バイトが戻ることを期待): '\x01\x03\x00)\x00\x01UÂ' (01 03 00 29 00 01 55 C2) MinimalModbus デバッグ モード。ポート COM8 MinimalModbus デバッグ モードを開きます。ポート COM8 MinimalModbus デバッグ モードのシリアル バッファをクリアしています。書き込み前にスリープする必要はありません。前回の読み取りからの時間: 46.00 ミリ秒、最小サイレント期間: 4.01 ミリ秒。MinimalModbus デバッグ モード。ポート COM8 MinimalModbus デバッグ モードを閉じています。機器からの応答: '\x01\x03\x02\x00ȹÒ' (01 03 02 00 C8 B9 D2) (7 バイト)、往復時間: 47.0 ms。読み取りのタイムアウト: 1000.0 ミリ秒。
python - Minimalmodbus、間違った CRC をランダムに生成
現在、RaspberryPi を使用したデータ取得のプロジェクトに取り組んでいます。リクエスト スクリプトを起動すると、スレーブ (コンピュータ) が CRC エラーまたは無効な長さを検出することがあります (まれではありますが、頻繁に発生します)。私のスクリプトは高速で、数秒で数百のレジスタを要求するため、メッセージが不完全で、スレーブがそれを間違ったメッセージとして検出することがあるという事実から、エラーが発生する可能性があると推測しています。私は、minimalmodbus のタイミングが適切でなく、間違った、またはリクエストの一部 (不完全) を送信する可能性があるかどうかを知りたかったのです。
スレーブで返されたエラー:
これは、スレーブが何を答えればよいかわからない場合に、マスターで発生する典型的なエラーです。
スレーブで modbus_tk を使用して modbus スレーブをエミュレートします。次は通常、値の型に依存するスレーブからの値を要求するコードの一部です。
私の最初の推測はタイミングの問題だったので、「time.sleep」をランダムに挿入してリクエストの時間を計りましたが、まだエラーが発生しています。そして、それは完全にランダムで、最初の CRC エラーの前に 5 分間機能することもあれば、ほんの数秒しか機能しないこともあります。私がどこを調べればよいか、何か考えはありますか?よろしくお願いします。
編集: 私の PC は、複数のスレーブをエミュレートする modbus_tk スクリプトを使用してスレーブとして機能します。RPI は、レジスターとその値を要求するマスターです。スレーブはすべて、IllegalAddress エラーを回避するために、これらの特定のレジスタに値を持つように構成されています。物理的な接続は USB から RS485 へのコンバーターで、RPI には RS485 入出力を処理する HAT が装備されています。つまり、実際には ModBus RTU 通信です。スレーブは、リクエストが来るとループして応答を送信します。
EDIT2: それで、もう少し調査したところ、興味深いものが見つかりました。エラーを受け取りました (今回はマスターで) スレーブが間違ったチェックサムを送信したようです...調べているうちに、modbus_tk によって生成されたチェックサムは問題ないことがわかりましたが、マスターが受け取った回答は同じではありませんでした。途中でいくつかのバイトが変更されたように見えますが、これは奇妙なことです。それはどこから来たのでしょうか?ハードウェアの問題?ただし、複数のレジスタをポーリングする場合にのみこのエラーが発生します (一度に 2 つ以上)。要求されたレジスタの数が 1 または 2 の場合、他のすべての要求は問題ありません。