投稿者 素人  (学生) 投稿日時 2019/6/11 13:49:31
[実現させたいこと]
通信データをグラフに"リアルタイム"で表示させたい。

[実現できていること]
・通信データの受信
・グラフへの描画

ここまではできているのですが、通信データから受信する値をリアルタイムで受信したいです。
(リアルタイムといっても、タイムラグが発生するのは承知しています。)

今のプログラムを掲載しますが、
今は、ボタン1をクリックすると、その時に受信したデータを描画し続けるという結果になります。
受信データの変化をグラフに反映させるためには、ボタン1をクリックしなければなりませんが、
これを自動で(ボタン1をクリックしなくて)行えるようにしたいです。


いろいろ試してみたのですが、今の状態が、「実現させたいこと」に一番近い状態です。
どのようにコードを変更すれば良いのでしょうか。


    Private Registers As Integer()
    Private xdata As Double

    Private Sub Button1_Click() Handles Button1.Click

        Dim ComError = 0
        Dim ModbusClient As EasyModbus.ModbusClient = New EasyModbus.ModbusClient(TextBox1.Text, 502)
        Try
            ModbusClient.Connect()
        Catch ex As Exception
            Label10.ForeColor = Color.Red
            Label10.Text = "Error!"
            ComError = 1
        End Try

        If ComError = 0 Then
            Label10.ForeColor = Color.Black
            Label10.Text = "Data..."


            Registers = ModbusClient.ReadHoldingRegisters(0, 3)
            Label1.Text = Registers(0)
            Label2.Text = Registers(1)
            Label3.Text = Registers(2)
            ModbusClient.Disconnect()
        End If



        'Chart背景設定
        'Load時に設定した画像をここで削除し、背景を白に変更
        Chart1.ChartAreas("ChartArea1").InnerPlotPosition.Auto = True

        Chart1.BackImage = ""
        Chart1.BackImageAlignment = ChartImageAlignmentStyle.Center
        Chart1.BackImageWrapMode = ChartImageWrapMode.Scaled

        '背景色設定
        Chart1.BackColor = Color.White
        Chart1.BackImageTransparentColor = Color.Black


        '/////////////////////////////Series設定/////////////////////////////
        '同じスレッドからの呼び出しならそのまま実行
        Chart1.Series.Clear()   '既存の Series をクリアする場合 

        'Dim xaxis, yaxis As Series
        Dim xaxis = Chart1.Series.Add("受信データ")

        '凡例の見た目設定
        Chart1.Legends(0).Font = New Font("MS Pゴシック", 10.0F, FontStyle.Bold)

        '枠線色
        Chart1.Legends(0).BorderColor = Color.Black
        '背景色
        Chart1.Legends(0).BackColor = Color.Yellow
        '枠に影付け
        Chart1.Legends(0).ShadowOffset = 4


        'グラフタイプの設定
        '接続時はとりあえずPoint表示
        xaxis.BorderWidth = 3
        xaxis.BorderDashStyle = ChartDashStyle.Solid
        xaxis.ChartType = SeriesChartType.Point

        '500msec/繰り返しTrueに設定
        TextBox2.Text = CStr(CInt(500))
        CheckBox1.Checked = True

        'Timer1(受信用タイマー)を有効にする
        Timer1.Enabled = True

        '時間をリセット
        time = 0
        '*1000は、msecのため秒表記へ変更
        CountData = CDbl(maxX / (CDbl(TextBox2.Text) / 1000))

        Chart1.Series(0).Points.AddXY(time, xdata)


        xdata = Registers(0)

    End Sub



    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        Chart1.Series("受信データ").Points.AddXY(time, xdata)

        time += CDbl(TextBox2.Text) / 1000

    End Sub