【VB.NET】7CH移動平均モジュール作ってみた<文字表示はGraphicが速い>

■前置き
VB.NETの練習を進めてます。目標は、6分力センサの自動校正システムです。6分力センサの校正は、何百水準で荷重の大きさと方向を組み合わせて測定しないといけませんので、何日もかかるし集中力が必要な測定なのでとても老体では、もちません。そこで、テンションゲージを手で押すだけで
6分力センサの校正と干渉補正を自動化するシステムを数か月かけて作ろうとしてます。そのために、まとまったシステムをVB.NETで作ろうとしてます。今まで使っていたVBAでは遅すぎるし、ProcessingではUIに弱いし、C#は、まだ手が届かないので将来に回して2020年度はVB.NETのシステムを制作していくために基本学習を初めた次第です。
練習1:
Visual Basic .NET を使用して Excel のイベントを処理する方法<Excelオートメーション学習>
練習2:シリアル受信7CHデータをSPLITして個別表示<配列宣言ではまる>
練習3:行列計算Imaginsolution様ライブラリ動作確認<動作OK>


■練習4:統計計算の最初移動平均のメソッドを作ってみました。
●仕様

メソッド名
Function
MovAve(ByRef dA(,) As Long, ByVal colN As Integer, ByVal MA As Integer, ByVal rowN As Integer) As Double()
機能:多CHで指定回数の移動平均をとって、結果を2次元配列で戻す Double()
引数1:ByREf dA(,)=>2次元データ配列を参照渡し
引数2:ByVal colN As Integer=>値渡列指定、配列の0~colN列まで移動平均する列指定
引数3:ByVal MA As Integer=>値渡移動平均回数、指定したrowNからMA個手前から平均計算
引数4:ByVal rowN As Integer=>値渡移動平均の最終行No、ここから手前にMA個計算

●はまった点
①渡したデータ配列がゼロになってしまって計算できなくなった。
=>計算メソッド内で配列宣言をしていたので、移動平均にプログラムカウンタが移った瞬間に消滅していた。
対策:CLASSの直下にデータ配列とデータカウントを宣言した。

②移動平均メソッド内で、次元数未定で配列宣言した後、変数をそのままつかったらエラーがでてだめだった。
Redim:MSの解説ページ
対策:配列を使う手前でRedim()して、わかっている次元数をいれて具体的に記憶領域を確保しないと以後使えません。

 

●ソースコードとFORM1(デザイン)

ソリューションファイルをZIPにしてあります。
SerialSample_DataCalc00
ソースを閲覧、コピペされるのはGISTにアップしてあります。
1:Form1.vbのコード
https://gist.github.com/dj1711572002/e0dfc4cd23a32f7327bc07eb603bb344

2:stat00.vbのコード(stat関係の関数メソッドをいれたモジュール)

https://gist.github.com/dj1711572002/0b9357d5693f6aca09dd5c47ca46bb77

FORM1は、ご自分で作っていただきます。
ボタン2個、ListBox1個、TextBox1から11まで11個

●動作確認

マイコンから115200bpsで送信してTEXTBOXへの表示されるか見てみましたがこのプログラムでは、マイコン側の送信周期は30msecより遅くないと受信データがTEXTBOXに表示されないことがわかりました。ですので、私のシステムの場合10msec以下が多いのでリアルタイムに数値をTEXTBOXで見ることはできないので、表示は間引いて30msecでやるようにしないといけません。

 

※追記2021年6月 
表示速度についてグラフィックで文字を表示したほうが速いことが判りました。
TextBoxなどコントロールを介するよりビットマップデータに直接文字を書いてグラフと同時に
更新すれば一瞬(数msec)で表示更新できます。g.DrawStringを使います。
こちらに使い方が判り易く書いてあります。感謝です。https://dobon.net/vb/dotnet/graphics/drawstring.html

グラフ用に既にPictureBox1を用意してある場合は、g.DrawStringだけ追加すれば文字描画できます。

グラフィックによる文字表示
①PictureBox コントロールをToolBoxからドラッグドロップしてFORM上に作成
②PictureBoxは額縁なので、絵を描くキャンバスとしてBitmapオブジェクトを作成
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)③bitmapであるcanvasに描画するためにGraphicsクラスを宣言
Dim g = Graphics FromImage(canvas)

④Graphicsで文字を描くためのフォント定義
Dim fnt As New Font(“MS UI Gothic”, 20

文字列を位置(0,0)、青色で表示
g.DrawString(“これはテストです。”, fnt, Brushes.Blue, 0, 0)

⑥リソースを開放(やらなくても動作はするが、他で使うときにメモリーを食う)
fnt.Dispose()
g.Dispose()

⑥PictureBox1にcanvasを貼り付けて表示
PictureBox1.Image = canvas

この場合は、毎回canvasを宣言してりいるので前回描いた文字は残らない。

私の最新作をご覧ください。グラフ全体を移動させながら先頭部を中央部に保持してスクロールしてます。左上の文字も画面と同時に更新されてます。

 

※追記2020年10月
リアルタイム性に関しては、その後USB2ポートプログラムで、表示にかかる時間を測定したのですが、PCのグラフィック性能によるところが大きいので、できるだけグラフィックボードが高速なPCを使うことをお勧めします。実験レポートは下記です。

【VB.NET】リアルタイム受信Pgmの処理別速度測定した<描画速度ネック>

 

コメントを残す

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