nkd
2020年12月21日 14時18分
WMS-PE1NというModbus製品を2台つなげた時、
2台目と通信するとmodbus_read_input_registersがタイムアウトとなってしまいます。
たまに通信成功となります。
1台だけつなげた際には発生しません。
at14では発生しません。
at16の影響のようなのですが
何が問題でしょうか。
コメント
at_syunya.ohshio
大塩です。
> 回答いたします。
> ・rs485の設定:19200bps、パリティなし、ストップビット1、データ長8bit となります。
> ・接続方法:G3L-WMS-WMS を全長で1メートルほど有線で接続しています。
情報ありがとうございます。
追加のご質問なのですが、以下の情報をいただけますでしょうか。
・各WMSのスレーブID
・modbus_read_input_registers がエラーとなるWMS(終端抵抗のついているWMS or 中間のWMS)
・「2台目と通信するとmodbus_read_input_registersがタイムアウトとなってしまいます。」との情報ですが、2台つながっている場合でも、1台目とは通信が必ず成功するか。
以上です。
nkd
回答いたします。
> ・各WMSのスレーブIDは
WMS(1):スレーブID=1
WMS(2):スレーブID=2
としています。
> ・modbus_read_input_registers がエラーとなるWMS(終端抵抗のついているWMS or 中間のWMS)
終端抵抗のついているWMSとは限りません。
G3LからはスレーブIDの小さい順に通信を行うようにしていて
エラーとなるのは必ずスレーブIDが大きい側となります。
WMS(1)のスレーブIDを3とすると、今度はWMS(1)でエラーが発生するようになります。
> ・「2台目と通信するとmodbus_read_input_registersがタイムアウトとなってしまいます。」との情報ですが、2台つながっている場合でも、1台目とは通信が必ず成功するか。
そのとおりです。1台目との通信は必ず成功します。
以上よろしくお願いいたします。
at_syunya.ohshio
大塩です。
> 回答いたします。
> > ・各WMSのスレーブIDは
> WMS(1):スレーブID=1
> WMS(2):スレーブID=2
> としています。
>
> > ・modbus_read_input_registers がエラーとなるWMS(終端抵抗のついているWMS or 中間のWMS)
> 終端抵抗のついているWMSとは限りません。
> G3LからはスレーブIDの小さい順に通信を行うようにしていて
> エラーとなるのは必ずスレーブIDが大きい側となります。
> WMS(1)のスレーブIDを3とすると、今度はWMS(1)でエラーが発生するようになります。
>
> > ・「2台目と通信するとmodbus_read_input_registersがタイムアウトとなってしまいます。」との情報ですが、2台つながっている場合でも、1台目とは通信が必ず成功するか。
> そのとおりです。1台目との通信は必ず成功します。
情報ありがとうございます。
渡辺電機製 WMB-D108R を用いて再現試験を行いましたが、
at16 環境下で スレーブ1、スレーブ2共にレスポンスが返ってくることを確認しました。
試験に使用したテストプログラムを送付致しますので、
こちらで同様の現象が発生するかご確認いただけますでしょうか。
■使用方法
・libmodbus_test.tar.gz を以下コマンドで解凍し、ディレクトリに入ります。
tar zxf libmodbus_test.tar.gz cd libmodbus_test
・libmodbus_test.c 内の REGISTER_ADDRESS
定数を、読み込みたいアドレスに変更します。
・必要に応じて、modbus_read_input_registers
の読み込みバイト数を変更します。
・make
コマンド で実行ファイルを生成し、以下コマンドでコードを実行します。
./libmodbus_test /dev/ttymxc1
以上です。
ファイル | ファイルの説明 |
---|---|
libmodbus_test.tar.gz |
大塩様
ご確認ありがとうございます。
WMB-DIO8Rでの確認ありがとうございました。
WMB-DIO8Rはこちらでも確認していて問題ないことが分かっております。
WMS-PE1Nで問題が発生するのです。
状況を整理しますと
1.WMS-PE1Nを2台つなげた時、1台目は正常、2台目はエラーになる。(たまに正常)
2.1台目というのはModbusIDが小さいほう(先に通信しているほう)でエラーは一度も発生しない。
3.接続状況や機器を変更せず、G3Lをat14に戻すとエラーは発生しない。
4.WMB-DIO8Rなどほかの機器では発生しない。
引き続きよろしくお願いいたします。
at_syunya.ohshio
大塩です。
> WMB-DIO8Rはこちらでも確認していて問題ないことが分かっております。
> WMS-PE1Nで問題が発生するのです。
> 状況を整理しますと
> 1.WMS-PE1Nを2台つなげた時、1台目は正常、2台目はエラーになる。(たまに正常)
> 2.1台目というのはModbusIDが小さいほう(先に通信しているほう)でエラーは一度も発生しない。
> 3.接続状況や機器を変更せず、G3Lをat14に戻すとエラーは発生しない。
> 4.WMB-DIO8Rなどほかの機器では発生しない。
WMS-PE1Nを用意し、動作検証を行いました。
■動作環境
・Armadillo-IoT G3L
・Linux v4.9-at16
・接続
<終端抵抗付きG3L> ---- ----
■動作検証内容
・WMS-PE1NのスレーブIDを設定し、それぞれ単体で通信を行う
・フォーラムに送った動作検証ソフトで動作検証
・12時間以上のロングラン
・スレーブIDを逆にして、上記テストを実施
■結果
動作検証内容のすべてにて、
modbus_read_input_registers がタイムアウトにならず
通信が出来ていることを確認しました。
・通信出来ていると確認できた理由
1.modbus_read_input_registers に指定したアドレスからデータが返ってきている
2.WMS-PE1N の 通信中を示すランプが、それぞれ通信時にのみ点灯していた
可能であれば、送付できる範囲で構いませんので
read がタイムアウトになる現象を確認できているテストコードを送付いただけないでしょうか。
以上です。
at_syunya.ohshio
nkd
お世話になります。ご確認ありがとうございました。
いただいたサンプルだと、こちらの環境でも発生しませんでした。
いただいたサンプルプログラムに以下の改造をしました。
1.起動時に一度Modbusコネクションを行い、プログラム終了までコネクションを継続。
2.WMS-PE1N(1)への通信、WMS-PE1N(2)への通信、1秒sleep、を繰り返す
このプログラムで確認すると、at16では1回目のWMS-PE1N(2)への通信でタイムアウトエラー発生となります。
at14ではエラー発生しません。
ご確認よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
libmodbus_test2.tar.gz | 使い方は前回のサンプルと同じ |
at_syunya.ohshio
大塩です。
> お世話になります。ご確認ありがとうございました。
> いただいたサンプルだと、こちらの環境でも発生しませんでした。
>
> いただいたサンプルプログラムに以下の改造をしました。
> 1.起動時に一度Modbusコネクションを行い、プログラム終了までコネクションを継続。
> 2.WMS-PE1N(1)への通信、WMS-PE1N(2)への通信、1秒sleep、を繰り返す
> このプログラムで確認すると、at16では1回目のWMS-PE1N(2)への通信でタイムアウトエラー発生となります。
> at14ではエラー発生しません。
>
> ご確認よろしくお願いいたします。
改造、送付ありがとうございます。
頂いたサンプルプログラムをそのまま実行したところ、現象を確認しました。
内容を確認したところ、ループ内にてスレーブ1通信終了後からスレーブ2の通信開始時にsleep が記載されておらず、
「Modbus通信仕様書」のアイドル時間が守られていないように見えました。
そのため、main 関数のwhile 文を以下のように修正したところ、現象が発生しませんでした。
while (1) { ret = modbus_read(argv[1], slave_id); if (ret != EXIT_SUCCESS) { break; } sleep(1); if (slave_id == 2) { slave_id = 1; } else { slave_id++; } }
at16にてご確認いただけますでしょうか。
以上です。
nkd
ご確認ありがとうございます。
ご指摘のようにmodbsuコマンド間にsleep(1);を入れるように修正し
at16で確認したところ問題は発生しませんでした。
1秒1通信ではなく最速で通信させたいため、
Modbus通信仕様の通り3.5キャラ(19200bpsのとき1.82ms)のスリープを入れるように修正しました。
while (1) { ret = modbus_read(argv[1], slave_id); if (ret != EXIT_SUCCESS) { break; } usleep(1820); if (slave_id == 2) { slave_id = 1; } else { slave_id++; } }
そうすると、やはりタイムアウトエラー発生となります。
usleep(6000);にするとエラーが発生しなくなります。
at14ではusleep(1820)でエラー発生しません。
ご確認よろしくお願いいたします。
at_syunya.ohshio
at_syunya.ohshio
at_koseki
at_koseki
古関です。
本件の対策パッチを添付します。
月末に製品アップデートを実施する予定です。
不具合の原因ですが、
imxのシリアルドライバーのSDMA制御方法のバグになります。
詳しくは製品アップデートのお知らせに記載いたします。
本件、ご迷惑をおかけし大変申し訳ありませんでした。
ファイル | ファイルの説明 |
---|---|
imx-uart.patch |
at_syunya.ohshio
2020年12月24日 17時10分
大塩です。
> WMS-PE1NというModbus製品を2台つなげた時、
> 2台目と通信するとmodbus_read_input_registersがタイムアウトとなってしまいます。
> たまに通信成功となります。
> 1台だけつなげた際には発生しません。
> at14では発生しません。
>
> at16の影響のようなのですが
> 何が問題でしょうか。
情報ありがとうございます。
いただいた情報を基に調査いたします。
念の為、以下内容についてお教えいただけますでしょうか。
・ご利用のG3L でmodbus 通信をする際のrs485 設定
・G3Lと2台のWMS-PE1Nとの接続方法
以上です。