Armadilloフォーラム

RS485 を利用した Modbus RTU の通信ができなくなる

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 端子の波形
コメント

追加確認の結果、Modbus は利用せず、ただの文字列を RS485 で送受信しても同様の現象が発生しました。

中村です。

> 追加確認の結果、Modbus は利用せず、ただの文字列を RS485 で送受信しても同様の現象が発生しました。

1年以上前の話ですが、
G3のカーネル4.9で、RS-485を使ったときに複数の問題が発生し、
DMAを使わないようにするパッチを当てたら問題がでなくなった、
ということがありました。

参考にしてみてください。
https://users.atmark-techno.com/forum/armadillo/3520

いろいろ調べながらのかなり長いやりとりなので、
最後のパッチ(2つあります)のところだけを
見てもらえればいいと思います。

--
なかむら

中村さん

その後、パッチをあてたカーネルでは問題が発生していません。
このカーネルで問題が発生した際には、あらためて書き込みたいと思います。
対応、ありがとうございました。

小西

中村です。

> その後、パッチをあてたカーネルでは問題が発生していません。

報告ありがとうございます。

--
なかむら