【VB.NET】リアルタイムグラフのBITMAP展開<その1小技在り>

土日月とハマっていたのですが、火曜日にアイデアが浮かんで小技(間欠クリア)で逃げきりました。動画を見ると瞬いているのが間欠クリアです。私のThinkPadX230のような遅いPCを使うと小技が必要となります。瞬きをしない方法のアイデアも今後考えていきます。
VB.NETのシリアル受信の基礎 と リアルタイムグラフを学習済みの方を対象とした記事です

 

●その1:とりあえず右から左へ波形が流れる機能を作り込みました。
以後、その2で、スクロールバーで過去データを素早く閲覧できる機能追加
その3で、カーソル機能、CSV読み書き機能をつけていきたいです。

●流れるグラフの原理
ソースBITMAPからリアルタイムに切り取りながらPictureBoxへ表示させます。
切取り点:現在時刻のデータから過去データへPictureBoxの幅分戻します。startX点
Y軸:ソースBITMAPと同じスケールにしました。
■Bitmap定義
①ソースBItMap:
Dim sourceBitmap As New Bitmap(2000, 400)で幅を2000と倍とりました
②切取りBitMap:
Dim trimmedBitmap As New Bitmap(1000, 400) PictureBoxと同じサイズ

■グラフィック処理定義
③ソース用グラフィック:
Dim g1 As Graphics = Graphics.FromImage(sourceBitmap)
④張り込み用グラフィック
Dim g2 As Graphics = Graphics.FromImage(trimmedBitmap)

▼ハマった点
ハマった点1:DrawImageで拡大縮小など入れると、急激に遅くなるので、等倍コピーにしました。
ハマった点2:ソースBitmap幅を大きくとると、急激に遅くなるので、できるだけ小さい幅にした。PCの性能次
第です。グラフィックが速いPCなら大きな幅でソースBitMap確保できます。
ハマった点3:遅いPCを使う場合の小技「間欠クリア」
g2を毎回クリアすると、消去処理が間に合わなくて、線が残ってしまって崩れてしまったので
g2のクリアを4回に1回の間欠クリアで逃げた。(私の遅いPC ThinkPadX230だとそうなります)

 

●コードの肝
本ブログでVB.NETのシリアル基礎プログラムを学習されている方対象です。
Sub Printdata内にグラフ描画を全部いれてありますので、PrintDataみるだけで判ります。
GISTにアップしてあります。
https://gist.github.com/dj1711572002/0cd77df9d085e1d57f72aa0fe6d306dd
1:信号波形:DIYのフォースプレートから3CHロードセルの電圧値がUSBシリアルでPCへ入ります。
2:受信したデータsdataをPrintDataで受け取って、Splitでカンマ区切りでばらしてarr1()配列データにします。
3:ソースBitMapへDrawLineで描画します。ラインの1個前の点を保持してあります。
pxの一個前は、px-1,py0の1個前のデータはpy0_1と保持
ここで注意するのは、前のデータ保持するために、クラス直下で変数py0_1,py1_1,py2_1を定義する必要が有り
4:ソースBitMap幅が2000データしかないので、折り返しさせて表示させます。
px=rn mod 2000  ‘ rnは、データ番号で2000を超えるとゼロからカウントします。
5:BitMapのクリアは、2か所あります。
g1は、データ数が2000を超えた時にクリアかけます。
g2は、間欠で4データに1回クリアをかけてます。(PCによって変わるので実験で決める)

6:プログラムの火入れ時点では、Bitmap切取り機能ではなく、通常のリアルタイムグラフの
やり方を試してみて、グラフがきちんと描けているか確認するほうが良いです。
通常のやり方は、を使う方法です。
Sub DirectPlot(px As Integer, py0 As Integer, py1 As Integer, py2 As Integer)が下のほうに用意してあります。
67行目にDirectPlot(px,py0,py1,py2)と1行加えて、66行目~104行目をコメントアウトします。
リアルタイムに点がプロットされていれば、OKです。
何も描画されてない場合は,電圧データが1600mV近辺から外れている場合が多いです。
対策は、63行目64行目65行目の電圧計算式で1600mV±100mVに収まるようにします。


●操作
①プログラムを起動する前に、USBシリアル接続して3CH以上のASCIIカンマ区切りの
整数、もしくは浮動小数点のデータを流してください。データの最後はCRLFをつけてください。周期は10msecで動作確認してますが、遅いほうがPCの負荷が減ります。
ポート番号を選んでOPENするだけでグラフが走ります。
値は、3300mVフルスケールの中間点1650mV±100mV程度になってますが、
数式を変えれば調整がききます。

②波形は、最初は、先端が右端に向かって走りますが、1000データから2000データまでは
最先端波形は右端に固定で、波形が右から左に流れていきます。

③サンプリングが終わったら、RadioButton2に変更して、Reciving On/Offのチェックボックスをはずすと、しばらく待つとデータグリッドビューに全データがログされて表示されます。
データグリッドビューにマウスをクリックしてCtrl-Aで全データ選択して、ctrl-Cでコピーしてから、Excelの真っ白シートにctrl-Vすれば、コピペでログデータをExcelで保管できます。

●写真
DIYフォースプレート上にPCを載せて、手で台をたたきながら、リアルタイム信号を入力して
デバッグしました。

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です