投稿者 素人  (学生) 投稿日時 2019/6/12 16:46:07
魔界の仮面弁士さま
回答ありがとうございます。

私のほうで分かったこととの報告と、質問をさせてください。

①わかったこと
エラーの件ですが、通信タイムアウト時間の設定によることが分かりました。
ご指摘のあった内容をもとに調べていったところ、接続先で設定しているタイムアウト時間より短い時間でTimer1_Tickを実施すると、先ほどのエラーが発生しました。


②処理の流れについて
計測開始時(Form1_Load とか Button1_Click とか)に、ModbusClient を New しておき、
Timer1_Tick では、ModbusClient インスタンスのReadHoldingRegisters を呼ぶように記述しました。
↓のコードです。(コメントアウトしている部分は、Button1_Click内でModbusClientをNewしているので、ここでは、コメントアウトしています。)

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

        'Dim ModbusClient As EasyModbus.ModbusClient = New EasyModbus.ModbusClient(TextBox1.Text, 502)

        ModbusClient.Connect()

        Registers = ModbusClient.ReadHoldingRegisters(0, 3)

        Label1.Text = Registers(0)


        xdata = Registers(0)

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

        ModbusClient.Disconnect()


この記述にしてしまうと、Timer1_Tick 内のModbusClientを使用する箇所で、次のエラーが出てしまいます。
"非共有メンバーを参照するには、オブジェクト参照が必要です。"

このエラーを回避するためには、Timer1_Tick 内でもModbusClientをNewするしかありません。
何か根本的に間違えているのでしょうか。 


③受信データの値に応じてイベントを発生させたい。

例えば、受信データが800を超えたときにメッセージを表示させます。
当たり前ですが、Timer1_Tick 内に記述してしまうと、800を超えている間、ずっとメッセージが表示されてしまいます。

        If xdata > 800 Then
            MessageBox.Show("800を超えました!")
        End If

これを、ある値を超えたら、1度だけメッセージを表示させるためには、どうすればよいのでしょうか。