Armadilloフォーラム

RS485通信の制御について

yuki_nishizaki

2021年6月22日 11時31分

お世話になっております。
ある機器を制御するプログラム(RS485通信)をArmadillo 上で作成しています。
Armadillo→機器へ要求送信後に機器→Armadilloの応答(数msec)を返す仕様なのですが、
応答受信時にArmaddilloのポートオープンが間に合わずデータを受信できない事象が発生しています。

過去のフォーラム投稿からArmadillo側で対処が必要だと考えていますが、
お恥ずかしながら知見がない為、なぜ時間がかかるのか原因が特定できていません。
本事象で何かわかること、回避方法等がありました、ご教授いただけると大変助かります。

●機器との通信仕様
 ・RS485 半二重方式
●環境
 ・Armadillo-IoT-G3L (linux-4.9-x1-at15)
・言語はpython3.8(pyserialのserialを利用)

●大まかなプログラムの流れ
 ①シリアル通信をオープンする(ser=serial.Serial('/dev/ttymxc1',201600,timeout=1)
 ②Armadiiillo→機器への要求を送信(ser.write(message))
 ③シリアルバッファを消去するためシリアル通信をクローズ(ser.close())
 ④シリアル通信をオープンする(①と同ポート)
 ⑤シリアルバッファにデータ(受信)があれば読みこむ
機器の応答時間が早くないとき(50msec)は上記のプログラムの流れでデータを受信できています。
そのため、機器の応答が速いと③→④がArmadilloでは追い付いていなと判断しました。
 

コメント

at_syunya.ohshio

2021年6月22日 14時05分

大塩です。

> お世話になっております。
> ある機器を制御するプログラム(RS485通信)をArmadillo 上で作成しています。
> Armadillo→機器へ要求送信後に機器→Armadilloの応答(数msec)を返す仕様なのですが、
> 応答受信時にArmaddilloのポートオープンが間に合わずデータを受信できない事象が発生しています。
>
> 過去のフォーラム投稿からArmadillo側で対処が必要だと考えていますが、
> お恥ずかしながら知見がない為、なぜ時間がかかるのか原因が特定できていません。
> 本事象で何かわかること、回避方法等がありました、ご教授いただけると大変助かります。
>
> ●機器との通信仕様
>  ・RS485 半二重方式
> ●環境
>  ・Armadillo-IoT-G3L (linux-4.9-x1-at15)
> ・言語はpython3.8(pyserialのserialを利用)
>
> ●大まかなプログラムの流れ
>  ①シリアル通信をオープンする(ser=serial.Serial('/dev/ttymxc1',201600,timeout=1)
>  ②Armadiiillo→機器への要求を送信(ser.write(message))
>  ③シリアルバッファを消去するためシリアル通信をクローズ(ser.close())
>  ④シリアル通信をオープンする(①と同ポート)
>  ⑤シリアルバッファにデータ(受信)があれば読みこむ
> 機器の応答時間が早くないとき(50msec)は上記のプログラムの流れでデータを受信できています。
> そのため、機器の応答が速いと③→④がArmadilloでは追い付いていなと判断しました。

at15 以降にて、シリアル通信に対するいくつかの修正が行われています。
ご利用のカーネルを最新版(at19) に変更し、動作検証を行ってみてください。

ご参考までに、最新の製品アップデートページを記載します。
■at19 製品アップデート
https://armadillo.atmark-techno.com/news/20210325/software-update-aiotg…

以上です。

> 大塩です。
>
> > お世話になっております。
> > ある機器を制御するプログラム(RS485通信)をArmadillo 上で作成しています。
> > Armadillo→機器へ要求送信後に機器→Armadilloの応答(数msec)を返す仕様なのですが、
> > 応答受信時にArmaddilloのポートオープンが間に合わずデータを受信できない事象が発生しています。
> >
> > 過去のフォーラム投稿からArmadillo側で対処が必要だと考えていますが、
> > お恥ずかしながら知見がない為、なぜ時間がかかるのか原因が特定できていません。
> > 本事象で何かわかること、回避方法等がありました、ご教授いただけると大変助かります。
> >
> > ●機器との通信仕様
> >  ・RS485 半二重方式
> > ●環境
> >  ・Armadillo-IoT-G3L (linux-4.9-x1-at15)
> > ・言語はpython3.8(pyserialのserialを利用)
> >
> > ●大まかなプログラムの流れ
> >  ①シリアル通信をオープンする(ser=serial.Serial('/dev/ttymxc1',201600,timeout=1)
> >  ②Armadiiillo→機器への要求を送信(ser.write(message))
> >  ③シリアルバッファを消去するためシリアル通信をクローズ(ser.close())
> >  ④シリアル通信をオープンする(①と同ポート)
> >  ⑤シリアルバッファにデータ(受信)があれば読みこむ
> > 機器の応答時間が早くないとき(50msec)は上記のプログラムの流れでデータを受信できています。
> > そのため、機器の応答が速いと③→④がArmadilloでは追い付いていなと判断しました。
>
> at15 以降にて、シリアル通信に対するいくつかの修正が行われています。
> ご利用のカーネルを最新版(at19) に変更し、動作検証を行ってみてください。
>
> ご参考までに、最新の製品アップデートページを記載します。
> ■at19 製品アップデート
> https://armadillo.atmark-techno.com/news/20210325/software-update-aiotg…
>
> 以上です。

大塩様
ご教示ありがとうございます。
at19への製品アップデートとプログラムの流れ自体を見直して検証してみようと思います。
それでも解決できない場合はまた質問させていただきます。

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

yuki_nishizakiさん:
>>at15 以降にて、シリアル通信に対するいくつかの修正が行われています。
>>ご利用のカーネルを最新版(at19) に変更し、動作検証を行ってみてください。
>>
>>ご参考までに、最新の製品アップデートページを記載します。
>>■at19 製品アップデート
>>https://armadillo.atmark-techno.com/news/20210325/software-update-aiotg…
>>
>>以上です。
>
>大塩様
>ご教示ありがとうございます。
>at19への製品アップデートとプログラムの流れ自体を見直して検証してみようと思います。
>それでも解決できない場合はまた質問させていただきます。

at19 へのアップデートでも問題が解決しない場合ですが、以下の (3) と (4) を無くしたらどうなるか、試してみて下さいませ。つまり、write() の後、シリアルポートをクローズして再オープンするのではなく、シリアルポートはオープンしたままで、write() の後 read() するように変えることで改善されないか、試してみて下さい。

>>>●機器との通信仕様
>>> ・RS485 半二重方式
>>>●環境
>>> ・Armadillo-IoT-G3L (linux-4.9-x1-at15)
>>> ・言語はpython3.8(pyserialのserialを利用)
>>>
>>>●大まかなプログラムの流れ
>>> ①シリアル通信をオープンする(ser=serial.Serial('/dev/ttymxc1',201600,timeout=1)
>>> ②Armadiiillo→機器への要求を送信(ser.write(message))
>>> ③シリアルバッファを消去するためシリアル通信をクローズ(ser.close())
>>> ④シリアル通信をオープンする(①と同ポート)
>>> ⑤シリアルバッファにデータ(受信)があれば読みこむ
>>>機器の応答時間が早くないとき(50msec)は上記のプログラムの流れでデータを受信できています。
>>>そのため、機器の応答が速いと③→④がArmadilloでは追い付いていなと判断しました。

Armadillo-X1 の場合ですが、RS485 半二重通信を Python で行った例として、こちらの質問スレッドが、もしかすると参考になるかも知れません:
https://armadillo.atmark-techno.com/forum/armadillo/6759