13,002
回編集
(ページの作成:「== 概要 == 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> | ||