【PyFMI】最小構成のMBD事例 第2章 その134【リアルタイム描画㉘】

【PyFMI】最小構成のMBD事例 第2章 その134【リアルタイム描画㉘】 事例
【PyFMI】最小構成のMBD事例 第2章 その134【リアルタイム描画㉘】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回はPythonでサブプロセスの生成と開始、Pipeによるデータ送信の話をした。

前回と比べて。今回は若干ややこしいところでPipe受信と受信確認の話となる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

Pipeで受信

フクさん
フクさん

次はPipe受信について。
コードはちょっとややこしいが以下になる。

tmp = conn.recv_bytes(128*1024)
deque_voltage = list(range(int(len(tmp)/8)))
for i in range(0,int(len(tmp)/8)):
	deque_voltage[i] = unpack('d',tmp[(i*8):(i*8+8)])[0]
太郎くん
太郎くん

なんか思ったよりも長いな・・・。

太郎くん
太郎くん

受信自体は
conn.recv_bytes
でやってるのかな?

太郎くん
太郎くん

そして、
でも取得されるのbyte配列で欲しいのがdouble配列だから
いろいろやってる感じか。

フクさん
フクさん

その通り。

フクさん
フクさん

以下で、double型を受け入れるリストを用意して

deque_voltage = list(range(int(len(tmp)/8)))
フクさん
フクさん

以下で、8byte分をdoubleとして認識し直している。
って感じだ。

for i in range(0,int(len(tmp)/8)):
	deque_voltage[i] = unpack('d',tmp[(i*8):(i*8+8)])[0]
太郎くん
太郎くん

これはメンドイ。

Pipeの受信確認

フクさん
フクさん

そして最後に「Pipeの受信確認」

太郎くん
太郎くん

これは必要なものなの?
受信処理は分かってるから、それをやればいいだけなような?

フクさん
フクさん

受信処理は受信するまで待ってしまうんで、
不要な時は呼び出したくないんだよね。

太郎くん
太郎くん

あー。
それの判断をするために受信確認をするのか。

フクさん
フクさん

そうそう。

フクさん
フクさん

コードとしては以下になる。

if conn.poll()
	# 受信処理
太郎くん
太郎くん

あ、一関数呼べば良いのね。
Trueが帰ってくれば受信があるってことか。

次回以降

フクさん
フクさん

次回以降は実際に改造コードを見せて、
それの動きを確認する感じだな。
負荷がどのように変わったかを確認する。

太郎くん
太郎くん

いい感じに改善されてると良いねー。

まとめ

フクさん
フクさん

まとめだよ。

  • Pipeの受信処理のコードを提示。
    • 受信自体は一関数だが、byte配列からdoubleに直すのに手間がかかってる感じ。
  • Pipeの受信確認。
    • 受信関数自体は受信が来るまで戻ってこないので、無条件では呼びたくない。
    • よって、poll関数で受信有無を確認した後に実際の受信処理をする。
  • 次回から実際のコードと動作確認。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました