C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 組込みマイコンと接続し、データ計測


(過去ログ 134 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■79058 / inTopicNo.1)  組込みマイコンと接続し、データ計測
  
□投稿者/ さくらとあおい (1回)-(2016/03/04(Fri) 17:30:56)

分類:[VB.NET/VB2005 以降] 

VB2015を使って、組込みマイコンからのデータをUSB通信で取得し、データ保存・グラフ表示
を行う事を考えています。

ソフトの構成としては、下記のイメージでよいでしょうか?
信号の動作を把握したいので、デジタルオシロの様に横スクロールさせたいです。

通信開始ボタンを押す

タイマー開始

バッファからデータ取得
グラフ表示
データ保存

 継続する↑
終了

タイマー停止

検索したのですが、PictureBoxに固定のグラフは多くサンプルが
ありましたが、上記のイメージのサンプルソフトを見つけられませんでしたので
ご存知でしたら教えて頂きたいです。
また、ソフト作成に関してアドバイス頂けば助かります。

とりあえず、1波形のみタイマーを使って横スクロールさせる所までは
できました。タイマーのズレが積算するのが気になるので、これは別途質問させて
頂きます。


引用返信 編集キー/
■79060 / inTopicNo.2)  Re[1]: 組込みマイコンと接続し、データ計測
□投稿者/ kiku (85回)-(2016/03/04(Fri) 17:44:14)

>VB2015を使って、組込みマイコンからのデータをUSB通信で取得し、データ保存・グラフ表示
>を行う事を考えています。

USBはシリアルポートとして利用しており、
組み込みマイコンからあるフォーマットに従って、
定期的にデータが出力されている。

何かの波形のようなデータみたいですので
その時間間隔も例えば100ms間隔でデータが出力されているのでしょうか?

まずは、もう少し具体的にどのようなデータが
どのような方法で出力されるのか説明した方が良いと思います。

引用返信 編集キー/
■79063 / inTopicNo.3)  Re[2]: 組込みマイコンと接続し、データ計測
□投稿者/ kiku (86回)-(2016/03/04(Fri) 18:24:43)

>とりあえず、1波形のみタイマーを使って横スクロールさせる所までは
>できました。

すみません。
データの読み込みは出来てるんですね。
しかもスクロールもできている。
あとは何がしたいんでしょうか?
引用返信 編集キー/
■79070 / inTopicNo.4)  Re[3]: 組込みマイコンと接続し、データ計測
□投稿者/ さくらとあおい (2回)-(2016/03/05(Sat) 08:14:47)
No79063 (kiku さん) に返信

書き込みありがとうございます。

・現状を説明します。
(1)組込みマイコン側
当方がソフトを作成するので、変更は自由ですが10msec間隔程度でセンサー値等(3データ)を計測したいので
イメージですが、10msec間隔で計測したデータを100msec毎にまとめて送信する。
データは垂れ流しかマスター&スレーブは今のところ垂れ流しにしようかと思ってます。

(2)ソフトの現状
VBソフトですが、組込みボードの通信のみ別ソフトを作成し、現在はグラフ表示ソフトを作成していますので、
これからあわせこんで作成していく所です。
現状のグラフ表示は適当な波形をスクロールさせています。

(3)質問の意図(内容)
当方、20年くらい前にVCを使って、組込みマイコンと通信させデータ測定は行ってましたが、
エクセルのVBAは触ってますが、VBでこのようなソフトを作るのが初めてです。
グラフをスクロールさせるソフトのつくり方や通信しながら画面表示を行うソフトの作成に関して
VBを使った場合にこのように作るという間隔が一般的な考え方とあっているか疑問があり質問させて
頂きました。若い時は動けば何でも良いと思いましたが、あとで機能を追加した時に破綻したり、
途中で思ったとおりの事ができないいとかにならないか分かってないので、質問させて頂きました。

自分の様な用途は多いと思ったので、どこかに近いサンプルソフトが無いか質問させて頂きました。
知りたい事は、上記ソフトの作り方(構成)、グラフのスクロール方法になります。

引用返信 編集キー/
■79083 / inTopicNo.5)  Re[4]: 組込みマイコンと接続し、データ計測
□投稿者/ daive (79回)-(2016/03/07(Mon) 08:00:42)
参考程度の書込みです。

画面的には、
 ペーパーレス 記録計
 https://www.google.co.jp/search?hl=ja&q=%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC%E3%83%AC%E3%82%B9%E3%80%80%E8%A8%98%E9%8C%B2%E8%A8%88&lr=lang_ja&gws_rd=ssl#lr=lang_ja&hl=ja&tbs=lr:lang_1ja&q=%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC%E3%83%AC%E3%82%B9%E3%80%80%E8%A8%98%E9%8C%B2%E8%A8%88
 トレンド画面
 http://www.m-system.co.jp/products/telemeter/telemeter01_index04.html
 データマルデモサイト
 http://www.m-system.co.jp/telemeter/dl8_demo.html
の様な、
縦移動:時刻が、上から下、下から上
横移動:時刻が、左から右、右から左
の、4種類だとおもいます。

1.MSChart コントロール:マイクロソフト製
  https://www.google.co.jp/search?hl=ja&q=MS-Chart&lr=lang_ja&gws_rd=ssl
2.zedgraph : オープンソース、メンテ終了済み?、長期未更新
  https://www.google.co.jp/search?hl=ja&q=zedgraph&lr=lang_ja&gws_rd=ssl
  https://osdn.jp/projects/sfnet_zedgraph/
私は、新規では、1.のMSChart へ移行してしまいました。
3.描画機能で、自前描画する。
  自由度が高いが、面倒。
  ドット描画か、ライン描画か、書直しを全体として行うのか、最新だけにするのか。
  トレンドが、スクロールしているように見えれば良いのだから、方法はあります。

100ms毎のイベントを定期的に発生させるには、
1.PCの時刻ではなく、計測装置、収集装置側の時計を使う。何処の時計を基準にするかは、計測の悩み処。
2.100ms毎でなく、もっと細かく時刻をチェックする。33ms毎に100ms経過したかチェックするなど。
  ⇒根本的には、高精度の計時が必要なので、見てくれだけの対応です。(計量検定機器の精度は出ないと思っています。)
   例えば、Realtime Windows / Windows Real Time Extension
   で、意図する情報がでてくるかどうか、検索してみてください。
  (古くは、Realtime Windows システムが販売されていました。専用コンパイラ+RealTimeカーネル付加型だったはず。)
   PCの時計は、月差数分が当たり前です。(チップ代が、数100円未満では精度は、、、)
   時刻同期も、制御系に必要とされる、合せ込み型の時刻同期ではないです。1秒を、0.01秒早く、遅くが出来ない。
  (アプリによっては可能かも。)
   RTCの誤差補正は、一部のPCでは可能ですが、誤差要因が温度だけではないので、補正が利くかどうかは別。
   Windows Industry 系で、何か処置があるかどうかは、未評価なので知りません。
3.SCADA のヒストリ機能、トレンド機能を使う。
  フリー系SCADAが何処まで出来るかは、知らないので、調べてみてください。
引用返信 編集キー/
■79089 / inTopicNo.6)  Re[5]: 組込みマイコンと接続し、データ計測
□投稿者/ さくらとあおい (9回)-(2016/03/07(Mon) 09:08:43)
No79083 (daive さん) に返信

今後の事も考えて、ソフトは自作する事を考えています。
VBの初心者なので、画面描画等は、ネットでサンプルを見て
作成していますが、グラフをスクロールさせるサンプルソフトが
探しても出てこないので、サンプルソフトがあれば紹介頂きたいです。
引用返信 編集キー/
■79099 / inTopicNo.7)  Re[6]: 組込みマイコンと接続し、データ計測
□投稿者/ Jitta (181回)-(2016/03/07(Mon) 20:11:30)
No79089 (さくらとあおい さん) に返信

こんな感じ?
「参照設定」に、System.Windows.Forms.DataVisualization を追加。
Form の上に FlowLayoutPanel と Chart を置く。
FlowLayoutPanel の上に Button を置く。
「開始する」をクリックすると、スクロールが始まる。
要は、「新しいデータを最後に追加し、最初のデータを削除する」ってこと。
「データを更新する」と「描画する」を別スレッドにしたので、「描画中にデータが更新される」ことを防ぐ必要が出てきてしまった。

using System;
using System.Data;
using System.Windows.Forms;

namespace Wankuma79058
{
    public partial class Form1 : Form
    {
        private System.Threading.Timer dataTimer;
        private System.Threading.Timer drawTimer;
        private System.Threading.SpinLock locker;
        private DataTable dataTable;
        private int additionalTime;
        private Action drawAction;

        public Form1()
        {
            InitializeComponent();
            this.flowLayoutPanel1.Dock = DockStyle.Bottom;
            this.flowLayoutPanel1.AutoSize = true;
            this.chart1.Dock = DockStyle.Fill;
            this.button1.Text = "開始する";
            this.button1.Click += this.StartTimer;
            this.FormClosing += new FormClosingEventHandler(FormClosingHandler);

            this.additionalTime = 0;
            this.drawAction = new Action(this.drawGraph);
            this.locker = new System.Threading.SpinLock();

            this.dataTable = new DataTable();
            this.dataTable.Columns.Add("time", typeof(int));
            this.dataTable.Columns.Add("data", typeof(float));
            for (int i = 0; i < 20; ++i)
            {
                var row = this.dataTable.NewRow();
                row["time"] = (++this.additionalTime);
                row["data"] = 0;
                this.dataTable.Rows.Add(row);

            }

            this.chart1.Series.Clear();
            var data = this.chart1.Series.Add("data");
            data.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.SplineArea;
            data.XValueMember = "time";
            data.YValueMembers = "data";
            this.chart1.DataSource = this.dataTable;

            this.dataTimer = new System.Threading.Timer(this.DataTimerCallback, null, System.Threading.Timeout.Infinite, 200);
            this.drawTimer = new System.Threading.Timer(this.drawTimerCallback, null, 200, 200);
        }

        void FormClosingHandler(object sender, FormClosingEventArgs e)
        {
            this.button1.Enabled = false;
            this.dataTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
            this.drawTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
        }

        void StartTimer(object sender, EventArgs e)
        {
            this.dataTimer.Change(200, 200);
            this.button1.Text = "停止する";
            this.button1.Click -= this.StartTimer;
            this.button1.Click += this.StopTimer;
        }

        void StopTimer(object sender, EventArgs e)
        {
            this.dataTimer.Change(System.Threading.Timeout.Infinite, 200);
            this.button1.Text = "開始する";
            this.button1.Click -= this.StopTimer;
            this.button1.Click += this.StartTimer;
        }

        private void DataTimerCallback(object state)
        {
            ++this.additionalTime;
            var row = this.dataTable.NewRow();
            row["time"] = this.additionalTime;
            row["data"] = Math.Sin(this.additionalTime) + 1;
            bool taken = false;
            this.locker.Enter(ref taken);
            this.dataTable.Rows.Add(row);
            this.dataTable.Rows.RemoveAt(0);
            if (taken)
            {
                this.locker.Exit();
            }
        }

        private void drawTimerCallback(object state)
        {
            if (this.IsDisposed == false)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(this.drawAction);
                }
                else
                {
                    this.drawGraph();
                }
            }
        }

        private void drawGraph()
        {
            bool taken = false;
            this.locker.Enter(ref taken);
            this.chart1.DataBind();
            if (taken)
            {
                this.locker.Exit();
            }
        }
    }
}

引用返信 編集キー/
■79148 / inTopicNo.8)  Re[7]: 組込みマイコンと接続し、データ計測
□投稿者/ さくらとあおい (1回)-(2016/03/11(Fri) 08:14:45)
No79099 (Jitta さん) に返信

回等ありがとうございます。
書かれた内容どおりにVB2015で配置、ソース記述を行いましたが、
エラーがでてしまい、根本的にわかってない事が多いので
そのままになっております。

恥ずかしながら、この回答でchartとdatasetを知りましたので
現在習得中です。

自分で線を書いてグラフをスクロールさせるソフトを作ってましたが、
将来的に縦軸をAD値と他の物理量を切り替えたり、レンジやオフセットも
設定で変えたいと考えていたので、chartの方が用途にあっているかと
思います。



引用返信 編集キー/
■79186 / inTopicNo.9)  Re[8]: 組込みマイコンと接続し、データ計測
□投稿者/ Jitta (184回)-(2016/03/13(Sun) 20:51:26)
No79148 (さくらとあおい さん) に返信

要は、「新しいデータを最後に追加し、最初のデータを削除する」ってこと。

と、書いた通り。
昔、モデムでNifty-Servceにつなげていたころ、エスケープシーケンスでアニメを作って遊んでいた。
@CR
 @CR
  @CR
   @CR
CRはカーソルを左端に戻す。
これを少しの間をおいて書いたら、@記号が右側に進んでいくように見えます。
同じところに少しだけ違うグラフを描くことを繰り返せば、スクロールしていくように見えます。
1〜10の期間のグラフを表示し、少しの時間をおいて2〜11の期間のグラフを表示する。
また少しおいて3〜12、4〜13、5〜14・・・と繰り返せば、スクロールして見えます。

プログラムと、コードは別のものです。
プログラムは、結果に至るための方法、手段を手順通りに並べることです。
コードは、そうやって作ったプログラムを、特定のプログラミング言語に翻訳することです。
実現手段を日本言で整理すれば、どんな言語を使おうが関係ありません。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -