HOME >> 鉄道模型実験室 > リアルタイム表示トライ その1

鉄道模型実験室 No.211  リアルタイム表示トライ その1

 Python を使用し測定データをリアルタイムで表示できないか検討しています。 まず、課題の2と3から始めました。

 

  .

  

■ トライ1

 最初に、Python とライブラリー openpyxl を使って、 課題の2と3の項目を検討することにしました。 課題2は、受信データはコンマ区切りの一行のデータとして送られて来るので、これをコンマ毎に区切ってひとつづつのデータに分解する方法です。 課題3は、分解したデータをEXCELの指定のセルに書込んでいく方法です。

  .

 実証済みのプログラムである 「スケッチとExcelファイルの設定」(2020/10/5 ) にて記述したEXCSLのマクロの処理アルゴリズムを参考にして、右のようなプログラムを記述しました。 そのマクロの一部を次に示す。

        buf$ = Replace(buf$, vbNullChar, "")
		
        sn = 2
        While InStr(buf$, ",") > 0
            N = InStr(buf$, ",")
            a$ = Left(buf$, N - 1)
            buf$ = Mid$(buf$, N + 1)
            Sheet2.Cells(rn + m, sn) = a$
            sn = sn + 1
        Wend

 ここで、buf$ は整形された受信データです。 この内容をPython の記述方法に置き換えながら記述しています。

  *************************************

 このプログラムを実行させると、エラーとなりました。 指摘された内容をヒントにいろいろ修正したのですが、それでもクリアーすることが出来ませんでした。 16行目の buf の部分は根拠のない 文法であるとのことでしたので、いろいろ変えてみたのですがダメでした。

 そこで、while 文の代わりに for 文を使ってみたのですが、やはりダメでした。

 あれこれ考えたのですが、ここは単純化して記述してみました。 データをあらかじめ split 文で分解しておいてリスト化してしまい、そのリスト変数を順番に表示するようにしました。

 これだ! スマートなアルゴリズムでは無いのだが、ダサイけれどもシンプルな記述方法で充分なのである。

  .

 

■ トライ2

 トライ1にて課題の2をクリアーすることが出来たので、課題3にトライしよう。

 Arduino から送信されてくるデータは、7個のデータをコンマ区切りのデータとして送信してきます。 個数も順番も決まっていますので、これを上記の方法で分解して、セルの書込んで行けばよいのです。

  ***********************************************

 プログラムの内容を右に示します。

  1. ライブラリー openpyxl を呼び込む。
  2. 使用するExcsl ファイル名とシート名を指定する。
  3. ファイル名とシート名を変数として関係付けする。
  4. コンマ区切りの一行のテストデータを設定し、それをリスト変数に変換する。
  5. 書込む行の行番号をシートのセルから読み取る。
  6. セルにリスト変数の値を順番に書き込む。
  7. 行番号をプラスしてセル(4,2)に書込む。

としている。 そして、Excslファイルを開いた状態で、実行ファイル実行させたのであるが・・・・・・・・・。

 Excslファイルはダンマリなのだ!  

 コマンドラインにはエラーが出ていないのに、ダンマリとは?  いろいろ調べてみると、save() メソッドで保存しない限り、いくら openpyxl でエクセルを編集しても記録に残らないとのことである。 そこで命令を一行したのであるが・・・・・・・・・・。

 そして、エクセルファイルが開いているとNGであることに気が付いたのだ。 正確には、エクセルは開いていてもOKだが、対象ファイルが開いているとダメなのである。

 エクセルの対象ファイルを閉じた状態でプログラムを実行させ、その後、対象ファイルを開くと、上に示すように、見事にセルに値が書き込まれているので確認できた。 プラグラムの実行は問題ない事がわかったのだが・・・・・・・・・。 

これではリアルタイムモニターにはならないのだ!                        

 対象ファイルは開いたままであることが須条件なのである。

 

■ 結論

 ライブラリーopenpyxl を使用するとエクセルとのデータのやり取りが可能であることが分かった。 しかし、エクセルが開いている状態ではそれが出来ないことも分かった。 このことは、取得したデータをグラフとしてリアルタイムで表示できないことを意味している。 即ち、自分が求めているテーマには使えのことが判明した。

 対策として、アクティブなエクセルとコンタクトできる Python のライブラリーはないだろうか、探してみることにした。

      ありますね! pywin32 というライブラリーが使えそうなので、次回トライしてみましょう。

 

ページトップへ戻る  .


 2022/6/14