投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/6/12 17:09:33
> "非共有メンバーを参照するには、オブジェクト参照が必要です。"

『非共有メンバー(インスタンス メンバー)』と
『共有メンバー』の違いはわかりますか?


TextBox クラス の 「Focus メソッド」や「Text プロパティ」は『非共有メンバー』ですし、
MessageBox クラスの「Show メソッド」は『共有メンバー』です。



フォームにラベルを貼って、そこにデータを書き込む場合を考えてみると、

 Label1.Text = "ABC"
 Label2.Text = "XYZ"

のように書くかと思いますが、これを

 Label.Text = "ABC"

とは書けませんよね。 

「どの Label インスタンスの Text プロパティを操作しているか」を示さねば、
どのラベルが操作されるのか分からなくなってしまいます。

ModbusClient の場合も同様です。Shared か否かを意識してコーディングしてみてください。



たとえば ConvertRegistersToDouble メソッド等は「共有」メンバーらしいので、

Dim x As Integer() = {0, 0}
' 『クラス名 . メンバー名』で呼び出す 
Dim y As Double = ModbusClient.ConvertRegistersToDouble(x)

のような構文で呼び出せそうですが、ReadHoldingRegisters メソッドは「非共有」メンバーらしいので、

Dim modbusClient As New ModbusClient(ipAddress, port)
'''' ** 中略 ** 
' 『変数名 . メンバー名』で呼び出す 
Dim z As Integer() = modbusClient.ReadHoldingRegisters(startingAddress, quantity) 

などとせねばならないでしょう。


掲示板の左上「Visual Basic 中学校」のリンクから、
「初級講座」が辿れるので、そちらも参考にしてみてください。

Visual Basic 中学校 > 初級講座 > 第9回 クラスの使い方 > 5.メンバの種類
http://rucio.a.la9.jp/main/dotnet/shokyu/standard9.htm

Visual Basic 中学校 > 初級講座 > 第48回 高度なメソッド・プロパティ
http://rucio.a.la9.jp/main/dotnet/shokyu/standard48.htm



> Registers = ModbusClient.ReadHoldingRegisters(0, 3)

それだと、
「ModbusClient クラスの ReadHoldingRegisters を呼んでいる」
ことになりますよね。先の私の回答は、
「ModbusClient インスタンスの ReadHoldingRegisters を呼び」
だったはずですよ。


ReadHoldingRegisters メソッドは非共有なメソッドですので、
ModbusClient という「データ型そのもの」に対して呼び出すのではなく、
「ModbusClient 型の変数」に対して呼び出す必要があります。


それともう一つ。
代入式の左辺にある、メソッドの戻り値を受け取るための Registers 変数は
どこに宣言していますか? この変数の宣言文も見せてください。


> ModbusClient.Connect()
> ModbusClient.Disconnect()

EasyModbus 環境が手元に無いので検証はできないのですが、
上記の Connect / Disconnect は共有メソッドなのでしょうか。

最初に提示頂いたコードでは共有メソッドとして呼び出していたようなので、
恐らく大丈夫だとは思うのですが…検索でヒットした ModbusClient クラスの実装を見ると、
非共有なメソッドのように見受けられたので、念のために確認しています。