0

私は MOXA Modbus TCP モジュール (M-4210 と NA-4010 ネットワーキング モジュールの組み合わせで、他のモジュールも接続されています) を持っています。これは 2 チャンネルのアナログ出力として機能し、それぞれが 0 から 10 ボルトの電圧を持っています。

私の C# アプリケーションでは、これらの出力の現在の値を取得する必要があります。これは、Modbus 全体にまったく慣れていないため、簡単ではありません。

私のコードでは、すでにその仕事をする動作している modbus tcp クライアントがあり、別のデジタル出力モジュールの単一コイルを読み書きしてテストしました。ただし、アナログ出力モジュールは、コイルではなくレジスタで動作するようです。

最初に、このモジュール内の 2 つのチャネルの modbus 設定を次に示します (MOXA ioAdmin ツールから取得)。

ここに画像の説明を入力

およびアドレス:

ここに画像の説明を入力

また、Web インターフェースの別のスクリーンショットを次に示します。

ここに画像の説明を入力

だから私はこのような値を読み取ろうとしました:

ModbusClient c = new ModbusClient();
c.Connect("172.17.6.15", 502);
int[] r = c.ReadHoldingRegisters(2048, 1);
for (int i = 0; i < r.Length; i++)
{
    textBox1.Text += r[i].ToString() + System.Environment.NewLine;
}

このコードは 1 つの値を返しますが、次のように変更されています。

  • チャネル #0 が の (生の) 値に設定されている場合1139、返される int 値は次のとおりです。29440

  • チャネル #0 が に設定されて1140いる場合、戻り値は29696

私は正しい軌道に乗っているようですが、オフセットと、値が戻ってきたときにチャネルを分離する方法がよくわかりません。誰かがこれに光を当てることができれば素晴らしいでしょう、事前に感謝します!

4

2 に答える 2

2

クライアントは Modbus エンディアンを正しく処理していますか? Modbus はビッグエンディアンです。

1140 は 0x474、29696 は 0x7400 です。1139 は 0x473、29440 は 0x7300 です。パターンが見えます。Modbus クライアントが LSB を 0 に設定し、受信した LSB を左にシフトして MSB を取得しているようです。

チャネルの値を 1141 に変更してみてください。クライアントではおそらく 29952 と表示されるでしょう。それは私の疑いを確認します。

于 2015-03-23T11:28:50.840 に答える
0

Holding Register 2047 を読んでみて、探している値が得られるかどうかを確認してください...

求めている値は 2 バイトではなく 1 バイトシフトされているように見えますが、2047 を読み取って 2 つのレジスタを要求し、自分でシフトする必要があるかもしれません。非常に奇妙な。

于 2015-03-14T13:29:37.973 に答える