5

C# プロジェクトで NModbus を使用して、多数の I/O デバイスとの間で Modbus データを読み書きしています。プログラムで Modbus TCP/IP プロトコル (ModbusIpMaster など) を使用しています。

(Modbus ゲートウェイ経由で) デバイスとの通信に成功し、既定のメソッド (例: ReadHoldingRegisters、WriteCoils などの一般的な Modbus 関数) を使用して、デバイスからデータにアクセスし、デバイスに書き戻すことができます。現時点でできることは、一般的に使用される Modbus コード (1、2、3、4 など) を公開するデフォルトの NModbus メソッドだけです。

私には2つの問題があります:

1) I/O デバイスの設定と追加情報には、Modbus コード 70 (0x46) でアクセスできます。また、設定を読み書きするために使用する必要があるサブ機能があります

たとえば、Func 07 (0x46)、Sub func 6 (0x06) を使用して、モジュールの通信設定を設定できます。この例では、設定 (ボーレートなど) を運ぶ 7 バイトの情報が送信されます。

NModbus には、この「カスタム」関数コード (70) に対する特定のメソッドがありません。したがって、私が理解していることから、NModbus の CustomMessage 機能を使用する必要があります。CustomMessage を実行してみましたが、一般的な Modbus 関数コード (1 または 2 など) を使用すると、NModbus のデフォルト メソッドを使用した場合と同じ結果が得られます (つまり、CustomMessage はこれまでのところ機能しています)。

一般的なもの以外の関数コード (例: 1、2、3...) を試すと、あらゆる種類の例外が発生します。さらに、メッセージでサブ関数を送信する方法がわかりません!

関数コードの直後にサブ関数を追加すると (たとえば、70 の後に 06 が続く)、データが送信されると、例外が発生します。この分野の専門家からの助けが本当に必要です。

より明白な例外を次に示します。

" タイプ 'Modbus.SlaveException' の例外がスローされました。機能コード: 198 例外コード: 3 - クエリ データ フィールドに含まれる値は、サーバー (またはスレーブ) の許容値ではありません。これは、暗示された長さが正しくないなど、複雑な要求の残りの部分 MODBUS プロトコルはその重要性を認識していないため、レジスタに保存するために送信されたデータ項目がアプリケーション プログラムの予想外の値を持っていることを特に意味するものではありません特定のレジスタの特定の値の。」

2) 2 番目の問題は、Modbus メッセージを変換する機能を持つモジュールの COM1 に接続された RS-232 デバイスを制御するために、Modbus を介して ASCII RS-232メッセージを送信することです。つまり、Modbus ゲートウェイと通信して ASCII データをその COM1 に送信し、COM1 がデータを RS-232 に変換してから RS-232 デバイスと通信することを計画しています。変換はゲートウェイの内部で行われることを意図しているため、私が知る必要があるのは、地球上でこれらの長さが異なるこれらのメッセージをどのように送信できるかだけです。それがどのように可能で、どこから始めればよいかわかりません。

4

1 に答える 1