「C Sharpの基礎 - MODBUS」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == MODBUSは1979年にModicon (現Schneider Electric) により開発された産業用通信プロトコルである。<br> 単純で堅牢な設計により、製造業、ビル管理、エネルギー管理等の様々な産業分野で使用されている。<br> <br> 通信方式として、マスター・スレーブ方式を採用しており、1台のマスター機器が複数のスレーブ機器と通信を行う。<br> マスターからの要…」)
 
 
31行目: 31行目:
セキュリティおいては、認証機能は備えていないため、閉じたネットワーク内での使用が推奨される。<br>
セキュリティおいては、認証機能は備えていないため、閉じたネットワーク内での使用が推奨される。<br>
近年では、暗号化やセキュリティ機能を追加した拡張仕様も提案されている。<br>
近年では、暗号化やセキュリティ機能を追加した拡張仕様も提案されている。<br>
<br><br>
== MODBUSのデータ型 ==
Modbusには、4種類の主要なデータ型がある。<br>
<br>
==== コイル ====
1ビットのデジタル出力 (読み書き可能) が可能である。<br>
<br>
* アドレス範囲
*: 00001 - 09999
<br>
* ファンクションコード
** 01
**: Read Coils
** 05
**: Write Single Coil
** 15
**: Write Multiple Coils
<br>
用途例を以下に示す。<br>
* ON / OFF制御
*: バルブの開閉状態, モータの起動 / 停止, ランプの点灯 / 消灯
<br>
==== ディスクリート入力 ====
1ビットのデジタル入力 (読み取り専用) が可能である。<br>
<br>
* アドレス範囲
*: 10001 - 19999
<br>
* ファンクションコード
** 02
**: Read Discrete Inputs
<br>
用途例を以下に示す。<br>
* リミットスイッチの状態
* センサのON / OFF信号
* アラーム信号
<br>
==== 入力レジスタ ====
16ビットのデータレジスタ (読み取り専用) である。<br>
<br>
* アドレス範囲
*: 30001 - 39999
<br>
* ファンクションコード
** 04
**: Read Input Registers
<br>
用途例を以下に示す。<br>
* アナログ入力値
* 測定値 (温度、圧力等)
* カウンタ値
<br>
==== 保持レジスタ ====
16ビットのデータレジスタ (読み書き可能) である。<br>
<br>
* アドレス範囲
*: 40001 - 49999
<br>
* ファンクションコード
** 03
**: Read Holding Registers
** 06
**: Write Single Register
** 16
**: Write Multiple Registers
<br>
用途例を以下に示す。<br>
* 設定値
*: 温度、速度、時間等
* 制御パラメータ
* 出力値の調整
* アナログ出力の制御
<br>
==== 実装上の注意点 ====
* アドレッシング
*: プログラム内でのアドレス指定は通常0ベースである。
*: 例 : コイル00001は、実際にはアドレス0として指定する。
<br>
* データ形式
*: 保持レジスタは、16ビット整数値を扱う。
*: 浮動小数点数を扱う場合は、2つのレジスタを組み合わせて使用する。
*: ビッグエンディアン / リトルエンディアンを考慮する必要がある。
<br>
* アクセス制御
*: 読み取り専用、あるいは、読み書き可能かを判断する必要がある。
<br>
* エラーハンドリング
*: 不正なアドレスへのアクセス
*: 範囲外の値の書き込み
*: 通信エラー
<br>
==== 使用例 ====
以下の例では、コイルと保持レジスタを使用している。<br>
<br>
コイルはデジタル制御 (ON / OFF)、保持レジスタはアナログ値や設定値の制御に使用する。<br>
<br>
<syntaxhighlight lang="c#">
// コイルの制御
public async Task ControlValveExample(IModbusMaster master)
{
    // バルブの開閉制御
    await master.WriteSingleCoilAsync(
      slaveId: 1,
      coilAddress: 0,    // コイル00001
      value: true        // バルブを開く
    );
    // 複数のコイルの状態を一度に読み取る
    bool[] valveStates = await master.ReadCoilsAsync(
      slaveId: 1,
      startAddress: 0,  // コイル00001から
      numberOfPoints: 4  // 4つのコイルの状態を読む
    );
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="c#">
// 保持レジスタの制御
public async Task ControlTemperatureExample(IModbusMaster master)
{
    // 温度設定値の書き込み (例 : 25.5[℃])
    ushort temperatureValue = 255;  // 0.1[℃]単位で設定
    await master.WriteSingleRegisterAsync(
      slaveId: 1,
      registerAddress: 0,    // レジスタ40001
      value: temperatureValue
    );
    // 現在の設定値を読み取る
    ushort[] settings = await master.ReadHoldingRegistersAsync(
      slaveId: 1,
      startAddress: 0,    // レジスタ40001から
      numberOfPoints: 1  // 1つのレジスタを読む
    );
    decimal actualTemperature = settings[0] / 10.0m; // 実際の温度値に変換
}
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー