【VS2019】VisualBasicで1時間でシリアル受信Pgmできた<CONTEC社様へ感謝>

学習が進んで、応用編のシリアル6CHリアルタイムグラフ その2     その1
※本記事は、EXCEL VBAでUserFormを使ったプログラムを作ったご経験がある方を対象としております。私もそうですがVisualStudioが敷居が高くてなかなか使えない方には、本記事でVSでVB.NETを短時間触ってみることで、敷居が低くなるご体験が重要だと存じます。

※マイコンからのシリアル通信データを至急処理したいならこちらです
※マイコンシリアル通信の基礎学習はこちらの記事にあります。


■Program作成環境は、住めば都で、慣れれば使えるのですが、慣れるまでどれだけの時間と集中力が必要かという点で、VBAに慣れている私は、
3日間x5時間=15時間ほぼ集中して、3本Pgmを作ってVB.NETに慣れました。=>VisualBasicよりC++に慣れている方なら、C#でVS2019に慣れるほうが宜しいかと存じます。MSの分析ではVBとC#両刀使いが多いようです

■本記事は基本Pgmですがその後学習して機能追加してきてます。
・現在(2020.9.3)までの学習記録備忘録

【VB.NET】リアルタイムグラフ第二弾<折れ線>
【VB.NET】6chシリアル受信データをリアルタイムグラフできた<Chartでは遅すぎる>

【VB.NET】行列計算Imaginsolution様ライブラリ動作確認<動作OK>
【VB.NET】シリアル受信7CHデータをSPLITして個別表示<配列宣言ではまる>
【VB.NET】 Visual Basic .NET を使用して Excel のイベントを処理する方法<Excelオートメーション学習>
【VB.NET】7CH移動平均モジュール作ってみた<表示間隔は30msec以上必要>

■動画解説

「フォームを作って、codeをコピペだけ」なので簡単で5分でできます。
VS2019の操作手順は動画をご覧になるとわかりやすいです。
1時間はVS2019インストール時間含むです。
用意1:VS2019のインストール済み VisualBasicがインストールされているWin10PC

用意2:マイコン等USBシリアルでPCへデータを入力する機器、ボーレート115200bpsでASCIIデータ

 ■詳細解説

●VisualStudio 2019をインストール
 MSのページにいって、ダウンロードしますが、30分程度時間かかります。
https://visualstudio.microsoft.com/ja/vs/
 ■WINDOWSフォームアプリケーション(VBAと同じ使い方)
・フォームアプリの導入解説は、MSDOCにあります
https://docs.microsoft.com/ja-jp/visualstudio/ide/create-a-visual-basic-winform-in-visual-studio?view=vs-2019
これは、VBAで使い慣れているプログラム方法です。FORMにオブジェクト(ボタン等)を並べて、オブジェクト単位でメソッド(関数)を作成していくプログラム形式です。

 インストールしたら、下記のように新規プロジェクトをVisualBasic のWindowsフォームアプリケーションで作成すればあとは、フォームのプログラム作成に移れます。

●CONTEC社のVB用シリアル通信プログラム解説ページ
=>何故CONTEC社様へ感謝かというと、VB.NETでシリアル通信をマルチタスクするプログラムを解説されているからです。VB素人にはマルチタスクのプログラミングは敷居が高すぎるため、コピペさせていただいて動作できて感謝しております。
https://www.contec.com/jp/support/basic-knowledge/daq-control/serial-communicatin/

タグが順についていて、3個のタグを見ながらプログラムを組めば完成しました。
プログラミングの方法=>オープン、クローズ=>データ受信だけです。

これらを見ながら、いざフォームをつくってプログラムを作ります。
プログラム作りだけなら小一時間で動作確認までできました。その前に
●マイコン側プログラム
マイコンで、9600bpsで文字を送信するプログラムを作っておきます。
私は、mbed で作成しました。”NO.i”を0.2秒ごとに送信します。
計測器からでも、Arduinoでもmbedでもシリアルで9600bps短い文字送信ならなんでもかまいません。

#include “mbed.h”

Serial pc(USBTX,USBRX);

int main() {
int i=0;
pc.baud(9600);
while(1) {
pc.printf(“No%d\n\r”,i);
i++;
wait(0.2);
}
}

●プログラム作業
CONTECのページ順に作りますが、まとめてメモします。
①フォームを作る
メニューの表示ー>ツールボックスでツールボックスウィンドウが現れます。ボタン等のオブジェクトが大量にでてきます。Form1へドラッグ&ドロップして配置していきます。
Button1(接続),Button2(切断)
TEXT1(COM入力),TEXT2(受信データ)

②Serial オブジェクトをドラッグドロップ
これが、VBの良さです。他の言語なら、ライブラリーを呼び出したり登録するのでややこしい記述があるのですが、VBでは、表示ー>ツールボックスからドラッグドロップでボタンとかテキストボックスと同等の扱いでプログラムに登録できます。

③プログラムをコピペ
CONTEC社のプログラムを取捨選択してつなぎ合わせます。
私の場合は、とにかくシンプルなプログラムということで以下のものでとりあえず動作しました。

formオブジェクトを作成してこのコードをコンパイルすれば走ります。
GISTにvbファイルソースアップしてあります。
https://gist.github.com/dj1711572002/bd3b2f1e58db04f231bbbcc7aa6715eb

Imports System.IO.Ports

Public Class Form1
Delegate Sub DataDelegate(ByVal sdata As String)
Private Sub PrintData(ByVal sdata As String)
TextBox2.Text = sdata
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
SerialPort1.PortName = TextBox1.Text ‘オープンするポート名を格納
SerialPort1.Open() ‘ポートオープン
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
If SerialPort1.IsOpen = True Then ‘ポートオープン済み
SerialPort1.Close() ‘ポートクローズ
End If
End Sub

Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim ReceivedData As String = ” ” ‘受信データ用変数を宣言します
Try
ReceivedData = SerialPort1.ReadLine ‘データを受信します
Catch ex As Exception
ReceivedData = ex.Message ‘例外処理を行います
End Try
‘Invokeメソッドにより実行されるメソッドへのデリゲートの宣言を行い、受信データを表示します
Dim adre As New DataDelegate(AddressOf PrintData)
Me.Invoke(adre, ReceivedData)

End Sub

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged

End Sub
End Class

●動作
開始ボタンを押すとフォームが表れて、COM番号を入力して接続ボタンをおすと
受信したデータが下のテキストボックスに表示されるはずです。

==上記までが基本のサンプルプログラムです========
暇をみて、以下の改良を加えて一歩一歩学習を進めていきます。
コードは、GISTにアップしてあります。(GITが使えないので)

VBのCategoryはこちらです

【VB.NET】行列計算Imaginsolution様ライブラリ動作確認<動作OK>
【VB.NET】シリアル受信7CHデータをSPLITして個別表示<配列宣言ではまる>
【VB.NET】 Visual Basic .NET を使用して Excel のイベントを処理する方法<Excelオートメーション学習>
【VB.NET】7CH移動平均モジュール作ってみた<表示間隔は30msec以上必要>

▽▽▽▽▽▽▽▽▽▽▽▽改良点▽▽▽▽▽▽▽▽▽▽▽▽

●シリアル受信7CHデータをSPLIT処理でばらして整数配列まで処理しました。解説記事は下記です。

【VB.NET】シリアル受信7CHデータをSPLITして個別表示<配列宣言ではまる>

 

●EXCELのイベントをVBで取得するプログラム8分でできるので動画にしました。
解説記事は、こちら

●改良3:ListBoxを使ってデータをスクロール閲覧する
TextBoxを使ってデータログしようとしたのですが、
改行が難しくて?できなかったので、ListBoxでitemをaddしていく方法でデータをログしました。Propertyでscrollをtrueにしておくだけで、データの閲覧できます。参考にさせていただいた記事
変更はデザインのFORMのTextBoxを消して、ツールボックスでListBoxに代えて、コードも1行だけ変更すればOKです。
 

Private Sub PrintData(ByVal sdata As String)
‘TextBox1.text=sdata
ListBox1.Items.Add(sdata) ’TextBox1をコメントアウトして、ListBox1に代えるだけです。End Sub

 

 

◆改良0:debug.print()を利用
参照:https://www.atmarkit.co.jp/fdotnet/dotnettips/140debugonvs/debugonvs.html
text boxに1回ずつ表示されても、データ全体を確認できないので記録したいのですが、ファイル保存文を作成するのも大変面倒なので、TextBox2.Text = sdataの下にdebug.print(sdata)を1行いれれば
実行開始して停止すると出力ウィンドウに全受信データログされてますので
その場で確認できます。保存したいならctrl+A ctrl+Cでコピーして
EXCELやEDITORにペーストすればOKです。
出力ウィンドウは、動作停止後、表示=>出力 クリックで右側に現れます。
この受信データは、マイコンから460800bpsでデータNoと時刻をマイクロ秒単位で出力されたものです。EXCELにコピーしてデータ欠落を調べます。

 

 

◆改良1:SerialPortオブジェクトのPropertyを書き換え
COM番号を入力するのが面倒なら、SerialPortオブジェクトを右クリックしてProperty欄をだして
COM番号やボーレートをデフォルト設定できます。その場合は SerialPort1.PortName = TextBox1.Text は削除します。
=>フォームアプリの便利さは、フォームオブジェクト類をPropertyで
デフォルト設定できるのでプログラム内で記述しなくても済む部分が多い点です。下記図では、SerialPortオブジェクトのProperty欄で
PortNameをCOM8、
Baud Rateを460800 に設定変更してあります。

◆改良2:大量のデータをログしたい場合はCSVファイル保存します。

CSV保存はdobon.net様のページ https://dobon.net/vb/dotnet/file/writecsvfile.html

■VB.NETを使う前の調査
フォームへオブジェクトを貼り付けるだけでUIの発展性がある便利なプログラムが作れますが、
VBAほどの融通性はありませんので、VBAに慣れていると不便です。
C++に慣れていたらC#”のほうが便利かもしれません。
VisualStudioは、プログラムを仕事にしている人が扱うIDEですので、
私のようなソフトウェアのアマチュアの機械屋はとっつきにくいです。
シリアル通信プログラム言語とIDEでなかなか自分にあった便利なものが無いのが現状です。
ご自分の目的と環境に合わせて言語とIDEを選ぶしかないです。
●VBAとVB.NETの違い
 ExcelVBAは、インタープリタで昔からのBASICの形態ですが、VB.NETは、VisualStudioの言語として
コンパイラ言語です。.NET FRAMEWORKという環境を使ってますので、C++と同様な速度で実行できる
BASIC言語です。そのかわり、WINDOWSシステムで使うための手続きが入っています。
私が初めて触れるのがスレッド処理です。リアルタイムOSでは、タスクが複数同時に動作するので
スレッド処理をしてプログラムの動作を制御しないとリアルタイムで動かないので、その処理が
VB.NETのシリアル通信プログラムにも必要な点が、相違点として新しい学習ポイントとなります。
同一な点は、フォームアプリケーションであること、フォーム上のオブジェクトのProperty基準で
イベント起動型のプログラム構造になっている点は、同じですので、VBAに慣れた方は入りやすいです。
しかし、Propertyの種類がVBAの何倍もあって、同じ意味のものがあまりありません。
●VB.NETの将来性=>C#のほうが間違いないが似たかよったかである
2020年3月ZDNETで扱ったMSのVB対応記事があります

マイクロソフト、.NET 5でVisual Basicをサポートするも進化計画はなし

VBユーザーは膨大に存在していて、何故VBかというと、開発チームは下記説明している。
「VBを使用しているプログラマーは非常に多いが、これはこの言語の安定性や記述スタイルが評価されていることを示している」
=>だから、今後も
「今後、Visual Basicを言語として進化させる計画はない」
=>このほうがユーザーが安心して使えて歓迎される

同社はVisual Basicのユーザーは数十万人に及ぶが、その大部分はC#も知っており、C#のユーザーは数百万人に及ぶと語っていた。」
今後は、
「Visual Basicは優れた言語であり、生産性の高い開発環境だ。Visual Basicの未来には.NET Frameworkと.NET Coreの両方が含まれる。今後は安定性、前述したアプリケーションタイプ、そして.NET Core版VBと.NET Framework版VBの互換性に注力していく」と.NETチームは述べた。

C#がメインだが、VB.NETも限定して継続していくということみたいです。

◆ご注意
VB.NETでもちょこちょことプログラムを学習しているのですが、WEB検索してもサンプル紹介記事が少なくて、学習が進まないことを
発見しました。

日本国内だとVB.NET人口が少ないみたいです。
圧倒的に多いのはExcelVBAです。VBとはユーザー人口が三桁違う感じで記事が膨大にありますので、TIPSとサンプルが無くて迷うことがありません。
同じBASICでも VisualBasicとVisualBasic for applicationとではWEB検索サンプル数で圧倒的な差があります。

VBAの次に検索記事が多いのはPCのC++、マイコン系C++です。
ArduinoのCも多いので安心です。

 Processingも大学関係で授業に使っているので解説記事が網羅的に検索できて実用的に使えます。

 ◆日本でソフトウェアのアマチュアがPC用のプログラムを組むなら、
 安全安心なのは VBA>>Processing>C++ だと感じてます。
    VB.NETは、検索事例の少なさでお勧めではないと考えてます。
私自身はProcessingを使うことが一番多いです。JAVAをアマチュア用に
改良した言語なので、
PCとスマホとラズパイ用が1本のプログラムを作れば3つのプラットフォームで使えるのが非常に便利です。
   さらに、Processingは、世界の大学の研究者が多用しているので、
   サンプルと解説が豊富でJAVAそのものなので発展性があります。

しかし、本記事を書いた責任もあるので、VB.NETでのマイコン接続用プログラムに特化して作ってみてVB.NETとProcessing、C#などのメリットデメリットを追求していこうと思ってます。
1)VB.NETのデータ配列をEXCELシートへ書き込むプログラム
EXCELのオブジェクトライブラリーをVB.NETで使う方法を
MSドキュメントで紹介されてます。
配列をシート書き込む

  これを動かしてみた記事、CSVファイルをEXCEL読み込む手間
なしで直接シートに書き込めるので、VBAとリンクして自動処理する
プログラムを作ってみたいです。

【VB.NET】Visual Basic .NET から Excel を自動化して、配列を使用して範囲内のデータを入力または取得する方法

●経緯
本ブログで最もアクセス数の多い記事の一つが2年前の記事でVS2017 C++でシリアル通信サンプルを動作
させる記事ですが。最近2年前の再現でVS2017でビルドしてもエラーがでて記事の内容の再現ができなくなりました。改めて、VSを使ったシリアルプログラミングを調べてみると、素人がC++をいじってWIN32でWINDOWSアプリをつくる意味がないらしいことをしりました。.NET FRAMEWORKを使わないと意味がないということです。
https://qiita.com/tadnakam/items/be20c836a122f7fa1b69

https://www.atmarkit.co.jp/ait/articles/1704/10/news026.html

【3月27日】Visual Studio2017いじる<シリアル通信サンプルを動かす>

●VS C++でシリアルプログラムはややこしくて、初心者はとっつきにくい
2年前の記事を見て、本ブログでは、自分のレベル(プログラム素人機械屋)で
VSのC++は、無理だと判断して、新たにVS2019のVisualBasicでシリアル通信プログラム
にトライしてみました。
※本記事は、EXCEL VBA(マクロ)を使ったご経験のある方を対象としております。シリアルデータは、計測器からでもマイコンのプログラムからでいいです。

●以後
このプログラムをベースに表示をかえたりCSVファイル保存や、速度をあげたりいろいろできますので、機会をみていじっていきます。
その後、シリアルの調査をしていたら、WINDOWSでのシリアル通信について詳細な解説がありました。
https://www.technoveins.co.jp/dev/vb2005/serialport.htm

●プログラム組み前にアプリ+EXCELで済むことが多いです。
本記事平日の昼間にアクセス数急増しております、理由はマイコンからUSBシリアルでデータを受信して処理する実験測定を急いでいる方が来訪されているのではないかと存じます。しかし、プログラムを作ること自体で時間を食いますので、30分以内でデータを手のひらに乗せたいなら既存アプリとEXCELで処理するのが一般的な手段です。
TeraTermでマイコンと接続してデータ受信してCSVファイルでログ

CPLTでマイコンからのデータをリアルタイムグラフで監視しながらCSVログ
この2つが一番早いログ方法です。そのあとCSVをEXCELで読み込んで
所望の処理をすればアプリのダウンロード開始から30分以内にデータはみられると思いますのでVBでプログラム作るより早くて便利です。これをやってからシリアル受信プログラムを検討されるのが物事の順番です。
=>CPLTの使い方はこちらの記事にあります。
=>私が便利に使っている方法の記事です。


 

●学習本の紹介もありました

【VB.NET】数あるVisualBasic本の中で評価の高い本8選

③VB.NET 全体的な解説ブログ
https://itsakura.com/vbnet

 

※2020年7月末記「時代はローコードプログラミングへ」

一年ぶりにVS2019を触ってみて、やはりVSは、初めての人にはしきいが高すぎると改めて感じました。
私は、VBA、Processing言語とか、arduino,mbedでC++を自由にプログラムできますが、VSでは一切手がでません。プログラムを作るコアの作業までたどり着くことができないからです。VSの対象としているユーザー層はプログラミングを仕事にしていて、一人ではなくチームで仕事をしている人たちに特化していると思います。ですので、趣味のMAKERなど一人で家庭で、プログラミングをしている人には全く不向きなIDEではないかと一年経て一層感じてます。市民開発者の重要性がクローズアップされてきてますので、プログラミング環境もMSがパワープラットフォームという概念を打ち出してます。ローコード言語といって、プログラマーでない人々が使えるプログラム環境です。

「Power Platform は Power Apps、Power Automate、Power BI でデータの収集から解析・予測までロー コーディングで実現するプラットフォームです。Microsoft Office を使い慣れたユーザーであれば、新しい業務アプリケーションの構築を容易に行うことができます。」ということで、2020年8月で、いじってみようかと思います。

https://www.microsoft.com/ja-jp/biz/dynamics/power-platform.aspx

 

==========VS落ちこぼれの私の現状===================
●正直に申しますと、私自身は、VBでなくProcessingを常用してます。IDEがArduinoに似ていて、ArduinoIDE
を使っていれば使い勝手似てます。さらに、WINDOWSで作ったプログラムがAndroidスマホとRaspiなどLinuxマシンでも動作するしJAVA同様の処理速度が強みです。

=>VSを使うのはプログラムを仕事にしている人で、たぶん、本記事にたどりついたお方は、プログラムを仕事にしていない方が多いと存じます。そいう場合は、ExcelVBAもしくは、Processing言語をおすすめします。Processingを使う人は、「市民開発者(Citizen Developper)」ではないかと思ってます。VBAはWEB上の検索すれば膨大な記事があります。
YOUTUBEでも丁寧なチュートリアルあるので入門に最適です。

=>
私は5年間MAKER活動をして、多軸力覚センサ、GNSS cm級GPSシステム等を開発してますが、マイコンC++とVBAとProcessingで十分対応できてます。大事なのはプログラミングではなく何を目的として開発活動をおこなうかのコト作りであって、モノ作りの手段としてのプログラミング作業で言語IDEなどに縛られて本来の目的であるコト作りがおろそかになると開発全体がうまくいかない経験をしてます。例えば、今マイコンから出てくるセンサデータを処理してログしてグラフにしたいという要求があった場合、既存のアプリでどこまでできるかを調査してからプログラムを作る必要があるかを考えたほうがいいです。大抵は、CPLTで済んでしまう場合が多いです。計算はCPLTでログしたCSVファイルをEXCELで処理すればいいです。プログラムが必要な場合でも、VSは、自由に使えるようになるのに時間がかかりすぎて開発活動に支障が生じたので、結局使わないで済ませるという私の結論です。
◆例えば時系列データの平均ばらつき処理は、マイコンからCPLTでグラフを見ながらログして直後にVBAで簡単に処理できてます、VBAできればマイコンデータ処理の90%はできると思います。

【ロードセル】CPLT静荷重データを処理するVBATool<CPLTキャリブレータ>

Processingは、EXCELVBAが不得意な数十万行にわたるような大きなデータの一括処理とか115200bps~460800bpsの高速データをUSBポート複数CHリアルタイム受信などの高度なデータログで使ってます。===============================================

※2020年6月記
 VBも脱落してしまってので、Processingでシリアル受信 リアルタイムグラフプログラム作ってます。2時間でできてしまうので
 VB.NETより速いです。多分史上最速でシリアル受信リアルタイムグラフが作れるのはProcessingだと思います。
 こちらが、2時間で作ったプログラムの解説ですVSを使う必然性の無い方はProcessingがおすすめです。
Processingで1本プログラムを作ると、WINDOWS以外にAndroidとかLinux上でも動作するので、スマホのプログラム作れるので超便利です。VSを使っていてもスマホのプログラムを作るのは大変ですが、Processingだとワンタッチでスマホプログラムができます。

【PowerMeter2020】ProcessingでリアルタイムグラフサンプルPgm<2時間で出来た>

 

 

コメントを残す

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