■前置き
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でやるようにしないといけません。