2012-12-31 38 views
5

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

私は、(Modbusゲートウェイを介して)デバイスと正常に通信し、デバイスからデータにアクセスするためにデフォルトの方法(例えば、ReadHoldingRegisters、WriteCoilsなどのModbusの共通の機能)を使用し、それらに書き戻すことができます。現時点では、私ができることは、通常使用されるModbusコード(1,2,3,4など)を公開するデフォルトのNModbusメソッドです。

Iは、2羽の問題があります

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

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

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

一般的なもの以外の機能コード(1,2,3など)を試してみると、さまざまな例外が発生します。さらに、私はどのようにメッセージと一緒にサブ機能を送信すべきかわかりません!

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

はより明白な例外です:タイプの

"例外『Modbus.SlaveExceptionは』投げられたファンクションコード:198例外コード:3 - クエリデータ フィールドに含まれる値ではありませんが。サーバー(またはスレーブ)の許容値。これは、 の複雑な要求の残りの構造に障害があることを示します( など)。暗黙の長さが正しくないため、具体的には、 レジスタはアプリケーションプログラムの期待外の値 を持っています。なぜなら、MODBUS プロトコルは、 特定のレジスタの特定の値の意義を認識していません。

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

+0

質問2)の解決策は見つかりましたか? – Norbert

+0

私は、私が過去にModbusをやったことは助けてくれることを望みましたが、自宅で育った裸のもので、NModbusを使ったことはありません... –

答えて

0

パート - NModbusでは、TCPまたはUDPクライアントを介してASCIIマスターを作成できます。質問の最初の部分に関しては

using (TcpClient client = new TcpClient("127.0.0.1", 502)) 
{ 
    ModbusSerialMaster master = ModbusSerialMaster.CreateAscii(client); 

    // Use the master here 
} 

、NModbusは基礎のための素晴らしいですが、それは、それは任意に拡張することが可能となる抽象化の層を欠いています。 Modbus RTUの仕様の一部であっても、GetServerId関数を追加して動作させるためには大幅な変更が必要になることがわかったとき、私自身の経験は終了しました。私の解決策は、最初からコンパイルして実行するよりも、NModbusソースを取得するよりも時間がかかりませんでした。これは、ログ用の3番目のライブラリに依存しているためです。& IEnumerableクラス)。

関連する問題