Armadilloフォーラム

uImage-x1-v4.9-at16でRS-485(Modbus)通信ができなくなりました

nkd

2020年12月21日 14時18分

WMS-PE1NというModbus製品を2台つなげた時、
2台目と通信するとmodbus_read_input_registersがタイムアウトとなってしまいます。
たまに通信成功となります。
1台だけつなげた際には発生しません。
at14では発生しません。

at16の影響のようなのですが
何が問題でしょうか。

コメント

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との接続方法

以上です。

ご対応ありがとうございます。
> ・ご利用のG3L でmodbus 通信をする際のrs485 設定
> ・G3Lと2台のWMS-PE1Nとの接続方法
回答いたします。
・rs485の設定:19200bps、パリティなし、ストップビット1、データ長8bit となります。
・接続方法:G3L-WMS-WMS を全長で1メートルほど有線で接続しています。

以上よろしくお願いいたします。

at_syunya.ohshio

2021年1月6日 18時53分

大塩です。

> 回答いたします。
> ・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台目とは通信が必ず成功するか。

以上です。

回答いたします。
> ・各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

2021年1月14日 11時47分

大塩です。

> 回答いたします。
> > ・各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

2021年2月2日 18時12分

大塩です。

> 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

2021年2月2日 18時14分

動作検証の説明文の一部が崩れていたため、追記致します。

[終端抵抗付きG3L]----[WMS-PE1N(1)]----[WMS-PE1N(2) 終端抵抗設定有]

以上です。

お世話になります。ご確認ありがとうございました。
いただいたサンプルだと、こちらの環境でも発生しませんでした。

いただいたサンプルプログラムに以下の改造をしました。
 1.起動時に一度Modbusコネクションを行い、プログラム終了までコネクションを継続。
 2.WMS-PE1N(1)への通信、WMS-PE1N(2)への通信、1秒sleep、を繰り返す
このプログラムで確認すると、at16では1回目のWMS-PE1N(2)への通信でタイムアウトエラー発生となります。
at14ではエラー発生しません。

ご確認よろしくお願いいたします。

ファイル ファイルの説明
libmodbus_test2.tar.gz 使い方は前回のサンプルと同じ

at_syunya.ohshio

2021年2月8日 17時25分

大塩です。

> お世話になります。ご確認ありがとうございました。
> いただいたサンプルだと、こちらの環境でも発生しませんでした。
>
> いただいたサンプルプログラムに以下の改造をしました。
>  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にてご確認いただけますでしょうか。

以上です。

ご確認ありがとうございます。
ご指摘のように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

2021年2月18日 13時41分

大塩です。

ご回答が遅くなり申し訳ございません。
いただいた情報を基に試験を行ったところ、
こちらでも同様の現象が発生することを確認致しました。

この現象の原因につきましては、現在調査中です。

以上です、宜しくお願い致します。

大塩様
現在調査中とのことですがご状況はいかがでしょうか。
弊社プログラムリリースのタイミングを決めたいため、
原因解決の完了予定などありましたら教えてください。
また、
パッチで解決できるなど対策はありますでしょうか。

at_syunya.ohshio

2021年2月25日 15時59分

大塩です。

調査状況ですが、発生原因の詳細まで掴めておらず
解決の完了予定や対策方法は明確にお答えすることができません。

ご迷惑をおかけしており、申し訳ございません。

大塩様

お世話になっております。
こちらの件、ご状況いかがでしょうか。
発生原因の詳細は掴めましたでしょうか。

アットマークテクノ古関です。

本件、ご迷惑をおかけし、大変申し訳ございません。
営業より個別にご連絡・対応させていただきたいと思います。

よろしくお願いいたします。

古関です。

本件の対策パッチを添付します。
月末に製品アップデートを実施する予定です。

不具合の原因ですが、
imxのシリアルドライバーのSDMA制御方法のバグになります。
詳しくは製品アップデートのお知らせに記載いたします。

本件、ご迷惑をおかけし大変申し訳ありませんでした。

ファイル ファイルの説明
imx-uart.patch

古関様

ご対応ありがとうございます。
製品アップデートについて引き続きよろしくお願いいたします。