Armadilloフォーラム

rs485の受信につきまして

nanopico

2022年11月28日 3時45分

はじめまして。
田口と申します。

独自プロトコルのrs485デバイスからのデータを処理するプログラムをC++で書いています。
これをコンテナ上で実行しましたが、シェルスクリプトからの実行で正常に動きません。
コマンドラインからの実行は正常に動作します。
どちらも /dev/ttymxc4 のopenはできるのですが、シェルスクリプトからの実行の場合は、readでデータ入力がありません。

コンテナ下ではなくbase OS下では、シェルスクリプトからの実行でも動きます。
もし原因、対処法がお分かりでしたら、教えて頂けると助かります。

また、base OS下で実行するたの方法を教えて頂きたいです。
/etc/config/ディレクトリが存在しないようですが、同様の機能があるのでしょうか?

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

コメント

at_reika.yamazaki

2022年11月29日 13時07分

アットマークテクノ 山崎です。

実行環境について3点確認です。
1. 実行に使用したシェルスクリプトはどのような内容なのでしょうか?シェルスクリプト内容を載せていただくことは可能でしょうか?
2. コンテナ上の適当な場所にシェルスクリプトとC++プログラムを配置して動かした、ということで相違ないでしょうか?
3. 配置したシェルスクリプトはどのように実行しているのでしょうか?コマンドラインからシェルスクリプトを実行しているのでしょうか?
お答えいただけますと幸いです。
どうぞよろしくお願いします。

nanopico

2022年11月30日 8時43分

お世話になっております。田口です。

> アットマークテクノ 山崎です。
>
> 実行環境について3点確認です。
> 1. 実行に使用したシェルスクリプトはどのような内容なのでしょうか?シェルスクリプト内容を載せていただくことは可能でしょうか?
★次のように実行のみのスクリプトです。

#/bin/sh
cd /root/gw_container/customize/
./test_rs485

> 2. コンテナ上の適当な場所にシェルスクリプトとC++プログラムを配置して動かした、ということで相違ないでしょうか?
★はい、そうです。

> 3. 配置したシェルスクリプトはどのように実行しているのでしょうか?コマンドラインからシェルスクリプトを実行しているのでしょうか?
★はい、そうです。

> お答えいただけますと幸いです。
> どうぞよろしくお願いします。
★よろしくお願いします。

at_reika.yamazaki

2022年12月2日 16時06分

お世話になっております。
アットマークテクノ 山崎です。

実行環境についての返答ありがとうございます。
弊社環境でも再現可能か確認したいため、差し支えなければ再現可能な最小構成をご提供いただけますと助かります。
また、コンテナについてはゲートウェイコンテナ(コンテナ名: a6e-gw-container)を使用しているという認識ですが、
違う場合は再現に必要なコンテナの構成情報をいただけると助かります。
どうぞよろしくお願いいたします。

nanopico

2022年12月8日 22時06分

お世話になっております。田口です。

現状ですが、既にあるPoCに適用し稼働中です。

・自社サーバーにREST APIでデータを上げています。
・rs232Cで出力する測定器のデータをUSBに変換し、A6Eに入力しています。
・コードはC++で書いています。
・アプリのビルドはATDEクロスではなく、A6Eにテンポラリにコンパイラを展開し、A6E上でビルドしています。
・コンテナは、a6e-gw-containerを使用しています。
・a6e-gw-container.confは、【add_devices /dev/ttyUSB0】を追加し、
 set_command行は、【set_command sh /root/gw_container/customize/gw-app.sh】に変更。
・gw-app.shの内容は、次のとおりです。
------------------------------------------
#/bin/sh

gpioset gpiochip3 18=1

KEY_FILE="/cert/key.pem"
CERT_FILE="/cert/device_cert.pem"

if [ ! -e $KEY_FILE ]; then
se05x_getkey 0xF0000110 /cert/key.pem /dev/i2c-1:0x48
fi

if [ ! -e $CERT_FILE ]; then
se05x_getkey 0xF0000111 /cert/device_cert.pem /dev/i2c-1:0x48
fi

if [ -e "/root/gw_container/customize/main.py" ]; then
cd /root/gw_container/customize/
./app.sh

python3 /root/gw_container/customize/main.py -d
else
python3 /root/gw_container/default/main.py -d
fi
------------------------------------------

・/root/gw_container/customize/ には、次のファイルを置いています。
 main.py
 gw-app.sh
 app.sh
 アプリケーション

・アプリケーションは、app.shから起動されると、デーモン化しています。
 アプリケーションとmain.pyが動いている状態になります。

usb(/dev/ttyUSB0)からの入力に対しては良い感じに動いています。
今回、rs485(/dev/ttymxc4)からの入力も加えたPoCの必要があり、質問させて頂いております。

色々試した結果、ttyUSB0と、ttymxc4を使うと、ttymxc4の受信が出来なくなっています。
ttymxc4だけを使うと、受信は出来て正常に動きます。

拙い説明ですみません。
よろしくお願いします。

nanopico

2022年12月9日 2時23分

追記

ttyUSB0とttymxc4の使用に関してですが、ttyUSB0とttymxc4の両方ともO_NONBLOCKでOPENし、受信を待つようにはしていません。
また、コンテナ内でなく、BASE OS下のコマンドラインからアプリを起動すると正常動作します。

at_reika.yamazaki

2022年12月13日 18時33分

お世話になっております。
アットマークテクノ 山崎です。

スクリプト内容ありがとうございます。
現在2つのアプリケーションが動いているという認識です。もし、この認識が誤りでしたらご指摘ください。
また、2つのアプリケーションが動いているものという認識で、以下2点確認です。

1 ./app.sh の実行アプリケーションについて
こちらはC++アプリケーションを動かすスクリプトという認識です。
このアプリケーションで usb(/dev/ttyUSB0) と rs485(/dev/ttymxc4)を使用しているということで合っているでしょうか?
違う場合は usb、 rs485 をそれぞれ使用しているアプリケーションはどこになるのでしょうか?

2. "python3 /root/gw_container/customize/main.py -d" の実行している main.py について
こちらの main.py は /root/gw_container/default/main.py と同じファイル・また内容でしょうか?
違う場合は何をする main.py なのか詳細を教えていただけますでしょうか。

以上、お答えいただけますと幸いです。
どうぞよろしくお願いします。

nanopico

2022年12月14日 17時07分

お世話になっております。田口です。

> 1 ./app.sh の実行アプリケーションについて
> こちらはC++アプリケーションを動かすスクリプトという認識です。
> このアプリケーションで usb(/dev/ttyUSB0) と rs485(/dev/ttymxc4)を使用しているということで合っているでしょうか?
★はい、合っています。

> 2. "python3 /root/gw_container/customize/main.py -d" の実行している main.py について
> こちらの main.py は /root/gw_container/default/main.py と同じファイル・また内容でしょうか?
★はい、変更は加えず、同じファイルをコピーしています。

よろしくお願いします。

at_reika.yamazaki

2022年12月14日 17時47分

お世話になっております。
アットマークテクノ 山崎です。

> > 1 ./app.sh の実行アプリケーションについて
> > こちらはC++アプリケーションを動かすスクリプトという認識です。
> > このアプリケーションで usb(/dev/ttyUSB0) と rs485(/dev/ttymxc4)を使用しているということで合っているでしょうか?
> ★はい、合っています。
こちら了解です。

> > 2. "python3 /root/gw_container/customize/main.py -d" の実行している main.py について
> > こちらの main.py は /root/gw_container/default/main.py と同じファイル・また内容でしょうか?
> ★はい、変更は加えず、同じファイルをコピーしています。
同じものということで了解です。
その場合はゲートウェイコンテナアプリケーションが動作します。
ゲートウェイコンテナアプリケーションではコンフィグ内容に従って RS485 の定期取得も行うようになっております。
そのためゲートウェイコンテナアプリケーションがポートを掴んでいる可能性があります。
試しに "python3 /root/gw_container/customize/main.py -d" の行をコメントアウトして動かすとどうなるでしょうか?

試していただけますと幸いです。
以上、どうぞよろしくお願いいたします。

nanopico

2022年12月15日 1時47分

お世話になっております。田口です。

> ゲートウェイコンテナアプリケーションではコンフィグ内容に従って RS485 の定期取得も行うようになっております。
> そのためゲートウェイコンテナアプリケーションがポートを掴んでいる可能性があります。
> 試しに "python3 /root/gw_container/customize/main.py -d" の行をコメントアウトして動かすとどうなるでしょうか?
★上記を試しますと、コンテナが立ち上がりません。(podman psで何も表示されない状態)
ちなみに、ゲートウェイコンテナアプリケーションのコンフィグは、何も変更していません。
状況をまとめると、

・main.pyを動かさないと、コンテナが立ち上がりません。
・main.pyを動かして、アプリでttymxc4だけを使うと正常に動きます。
・main.pyを動かして、アプリでttyUSB0だけを使うと正常に動きます。
・main.pyを動かして、アプリでttyUSB0とttymxc4の両方を使うと、なぜかttymxc4の受信ができません。
・アプリだけを、コンテナ下ではなく、bese osのコマンドラインから起動すると、ttyUSB0とttymxc4の両方使った場合でも正常に動きます。

よろしくお願いします。

at_reika.yamazaki

2022年12月15日 17時47分

お世話になっております。
アットマークテクノ 山崎です。

> ★上記を試しますと、コンテナが立ち上がりません。(podman psで何も表示されない状態)
コンテナが起動しないということなので、a6e-gw-container.conf の set_command のほうを、
お使いのスクリプトファイルを呼び出すように書き換えてみるとどうなるでしょうか?
やり方は以下です。

1. "/etc/atmark/containers/a6e-gw-container.conf" の set_command の行を書き換えます。
vi コマンドなどを使用してお使いのスクリプトファイルを実行するように変更します。いただいている情報からだと以下のようになると思われます。

set_command sh /root/gw_container/customize/app.sh

もし、パスが誤りでしたら修正してください。上記変更の上、ファイルを保存してください。

2. 書き換えた上記ファイルを保存します。
上記の変更が reboot すると失われてしまうため、下記コマンドを実行して保存します。

$ persist_file -rv /etc/atmark/containers/a6e-gw-container.conf

3. コンテナを起動しなおします。
下記コマンドを実行して下さい。

$ podman_start a6e-gw-container

これで、お使いのスクリプトファイルを実行するようになったコンテナが起動すると思います。

また、コンテナの起動状態については以下のコマンドを使用して確認してみてください。

$ podman ps -a

コンテナが起動していれば "STATUS" が "Up" 、終了していれば "Exited" となるかと思います。
また起動しているコンテナのログは以下のコマンドで取得できます。

$ podman logs a6e-gw-container

使用しているスクリプトファイルや作成したアプリケーションがログを出している場合は上記コマンドで取得できるかと思います。
もし意図しない動きをしている場合など、"podman logs a6e-gw-container" でその状況のログが取得できましたら、
なにかわかるかもしれないので取得内容を貼っていただけると助かります。

上記を試していただけますと幸いです。
以上、どうぞよろしくお願いいたします。

nanopico

2023年1月21日 21時16分

お世話になっております。田口です。

解決しました。
サポートありがとうございました。