Armadilloフォーラム

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

nuritelecom

2020年8月3日 11時00分

Armadillo-IoT ゲートウェイ G3(M1-Dモデル) の絶縁RS485アドオンモジュール RS02を用いてModbus通信を行うプログラムを作成しています。
RS02の設定は、1,2,4をON。
RS-485は、ボーレート9600、データビット8ビット、ストップビット1、パリティなし。

カーネルのバージョンをv4.9-at15に上げたところ、それまで動いていたプログラム(java)でread_input_registersがCRCエラーを返すようになりました。

そこでArmadillo-400シリーズでModbusの通信をする
https://armadillo.atmark-techno.com/howto/armadillo-400-modbus
を参考にさせていただきlibmodbusを使用したプログラムでも試してみたところ、同様にread_input_registers関数がCRCエラーとなります。
エラーはCRCエラーですが、受信データは送信データと同じように見受けられます。
また、存在しないスレーブに対しても同様にCRCエラーが発生します。

このエラーの発生原因について、ご教示いただけますと幸いです。

[動作していたバージョン]
カーネル:uImage-x1-v4.9-at14
DTB:armadillo_iotg_g3_m1-v4.9-at14.dtb

[動作しなくなったバージョン]
カーネル:uImage-x1-v4.9-at15
DTB:armadillo_iotg_g3_m1-v4.9-at15.dtb

カーネルのバージョンアップはマニュアルの「11.2. 特定のイメージファイルだけを書き換える」に従いuImage,armadillo_iotg_g3_m1.dtbのコピーを行う方法で実施しました。(同様の方法でカーネル、DTBをat14に戻すと正常に動作します。)

[プログラム]
添付の modbus_master.c
「Armadillo-400シリーズでModbusの通信をする」
modbus_master.cのSLAVE_ID、REGISTER_ADDRESS、SERIAL_SPEED等を弊社の環境に合わせて変更したものです。

コンパイル環境
Armadillo-IoT ゲートウェイ G3(プログラム実行マシン)
apt-get install libmodbus-devで以下のライブラリを追加した上でgccでコンパイル
libmodbus-dev/oldstable,now 3.0.6-2 armhf [installed] libmodbus5/oldstable,now 3.0.6-2 armhf [installed,automatic]

[at14で正常動作していた際の実行結果]
root@armadillo:/home/emsjp/work/modbus_master# ./modbus_master /dev/ttymxc1 Opening /dev/ttymxc1 at 9600 bauds (N, 8, 1) [06][04][00][01][00][01][61][BD] Waiting for a confirmation...
<06><04><02><0F><89><70>
Fri Jul 31 14:24:49 2020
Temperature:4030

[at15でエラーになった際の実行結果]
root@armadillo:/home/emsjp/work/modbus_master# sudo ./modbus_master
/dev/ttymxc1
Opening /dev/ttymxc1 at 9600 bauds (N, 8, 1) [06][04][00][01][00][01][61][BD] Waiting for a confirmation...
<06><04><00><01><00>
ERROR CRC received 100 != CRC calculated 9301
faild: Invalid CRC
modbus error

存在しないスレーブ(5)に対して実行した場合でもタイムアウトにならずCRCエラーになります。
./modbus_master /dev/ttymxc1
Opening /dev/ttymxc1 at 9600 bauds (N, 8, 1) [05][04][00][01][00][01][61][8E] Waiting for a confirmation...
<05><04><00><01><00>
ERROR CRC received 100 != CRC calculated 6301
faild: Invalid CRC
modbus error

ファイル ファイルの説明
modbus_master.c Armadillo-400シリーズでModbusの通信をするを使って確認しました。
コメント

at_keita.mogaki

2020年8月3日 15時17分

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

at15 にて RS-485 の不具合に関する対処を行いましたが、
対処内容に不備がありまして、
正常に動作しなくなるパターンが発生しております。
現在原因解析を行っております。

お手数ですが、現状は at14 をご利用頂けますでしょうか?

原因が判明し次第、再度ご連絡致しますので、
何卒よろしくお願い致します。

nuritelecom

2020年8月3日 15時47分

承知しました。
対応よろしくお願いします。ご連絡お待ちしております。

nuritelecom

2020年8月20日 11時44分

お世話になります。
本件状況はいかがでしょうか?
at14 でも継続的にRS-485のModbus通信を使って収集していると、上記のようなCRCエラーが頻度は高くありませんが発生する場合があるようです。
エラーが発生した際、アプリケーションの再起動では復旧せず、機器全体の再起動が必要となる状況です。

Armadillo-IoT ゲートウェイ G3+絶縁RS485アドオンモジュール RS02でRS-485通信を使用する上で、制限事項があるようでしたらご教授いただけると助かります。

at_keita.mogaki

2020年8月25日 14時57分

> 本件状況はいかがでしょうか?

回答が遅れてしまい、大変申し訳ありません、
本件、現在も不具合解析中・対応中です。

解決次第、再度ご連絡致しますので、
何卒よろしくお願い致します。

nuritelecom

2020年8月27日 9時14分

お忙しいところ、ご回答ありがとうございます。
ArmadilloでModbus(RS-485: RS02)を使ったシステム提供を考えており、状況を確認させていただきました。
引き続きよろしくお願いいたします。

at_do.phanngoc

2020年9月24日 12時53分

連絡が遅れて、大変申し訳ありません、

本件の不具合の原因は次の通りです。

RS485の半二重通信を行う場合は、RX DMAが常時有効化されています。この状態でRX
FIFOにデータが残ったままRXをdisableからenableに設定すると、次回のRX
DMAに失敗します。

添付したパッチが暫定対策となりますので、ご確認ください。

こちらで確認した限りではmodbus通信で不具合は発生しませんでしたが、恐らく不具合の再現頻度が低下したことによるものです。

今後、恒久対策となるパッチを作成する予定です。

何卒よろしくお願い致します。

https://armadillo.atmark-techno.com/sites/armadillo.atmark-techno.com/f…

ファイル ファイルの説明
rs485-at15.patch

nuritelecom

2020年9月30日 17時00分

ご回答ありがとうございます。
「恐らく不具合の再現頻度が低下したことによるもの」とありますので、現状の暫定パッチですと問題が発生する可能性があるということでよろしいでしょうか?

現在、at14を使用し、1分間隔で10台前後の機器に対して、ModbusRTUにてデータ収集を行っています。
上記でも記載しましたCRCエラーの事象後再起動が必要となるケースが1日1回発生している状況です。

at15+パッチによって、事象や頻度が改善されるのであれば適用を検討したいのですが、at14と比較して改善されていると考えてよいでしょうか?次の恒久策を待つべきでしょうか?

また恒久対策に関しまして、今後の提供時期に関してもお知らせいただけると幸いです。