konishi.ews.jp
2020年2月5日 12時30分
小西といいます。
Armadillo-IoT ゲートウェイ G3L の Linux 4.9 環境を利用しています。
RS485 を利用した Modbus RTU の通信ができなくなる現象が発生します。
・Modbus RTU で通信時に、タイムアウトが発生する。
・一旦問題が発生すると、/dev/ttymxc1 をクローズするまで問題が継続する。
・タイムアウト発生後は、/dev/ttymxc1 をクローズするのに 30 秒かかる。
・タイムアウト発生時は、オシロスコープで確認したところ RS485 のピンがハイレベルのままとなる。
・/dev/ttymxc1 クローズ後に、再オープンすると、正常に通信できるようになる。
下記のコードで再現します。
#!/usr/bin/ruby require 'rmodbus' include ModBus File.write('/sys/class/leds/led5/trigger', 'none') RTUClient.new('/dev/ttymxc1', 115200, data_bits: 8, stop_bits: 1, parity: SerialPort::EVEN, read_timeout: 200) do |cl| cl.read_retry_timeout = 0.2 cl.read_retries = 3 while true do cl.with_slave(4) do |slave| begin puts slave.holding_registers[0..7].join(',') rescue => e File.write('/sys/class/leds/led5/trigger', 'default-on') throw e end end #sleep(0.05) # sleep しても問題は発生する。 end end
ModbusRTU 対応機器を接続し、上記スクリプトを実行し、数時間くらいで問題が発生しました。
問題発生前後の RS485 端子の波形を wav ファイルと画像で添付しました。
19.1 秒のあたりが、この問題が発生したタイミングです。
振幅幅の小さいものが Armadillo の出力で、
振幅幅の大きいものが接続している ModbusRTU 対応機器の出力です。
対応方法等をご存じの方がいれば、ご教示いただけると助かります。
よろしくお願いします。
ファイル | ファイルの説明 |
---|---|
modbusrtu.png | 問題発生時の RS485 端子の波形の抜粋 |
modbusrtu.zip | 問題発生時の RS485 端子の波形 |
コメント
y.nakamura
中村です。
> 追加確認の結果、Modbus は利用せず、ただの文字列を RS485 で送受信しても同様の現象が発生しました。
1年以上前の話ですが、
G3のカーネル4.9で、RS-485を使ったときに複数の問題が発生し、
DMAを使わないようにするパッチを当てたら問題がでなくなった、
ということがありました。
参考にしてみてください。
https://users.atmark-techno.com/forum/armadillo/3520
いろいろ調べながらのかなり長いやりとりなので、
最後のパッチ(2つあります)のところだけを
見てもらえればいいと思います。
--
なかむら
konishi.ews.jp
中村さん
ご返信ありがとうございます。
以下のパッチをあてたカーネルで動作確認を行ってみます。
https://users.atmark-techno.com/comment/6525#comment-6525
動作確認の結果は、また書き込みたいと思います。
取り急ぎ、お礼まで。
小西
konishi.ews.jp
y.nakamura
konishi.ews.jp
2020年2月14日 13時35分
追加確認の結果、Modbus は利用せず、ただの文字列を RS485 で送受信しても同様の現象が発生しました。