編集の要約なし |
|||
| (同じ利用者による、間の2版が非表示) | |||
| 391行目: | 391行目: | ||
RS-485通信を実装する際には、以下の特徴と注意点を理解する必要がある。<br> | RS-485通信を実装する際には、以下の特徴と注意点を理解する必要がある。<br> | ||
<br> | <br> | ||
* 差動信号方式について | |||
RS-485は、2本の信号線であるA線とB線を使用して、電位差でデータを伝送する。 | *: RS-485は、2本の信号線であるA線とB線を使用して、電位差でデータを伝送する。 | ||
この方式により、ノイズの影響を受けにくく、長距離通信に適している。 | *: この方式により、ノイズの影響を受けにくく、長距離通信に適している。 | ||
ノイズは両方の線に均等に影響するため、電位差を見ることでノイズの影響を打ち消すことができる。 | *: ノイズは両方の線に均等に影響するため、電位差を見ることでノイズの影響を打ち消すことができる。 | ||
<br> | <br> | ||
* 半二重通信 | |||
一般的な2線式RS-485では、送信と受信を同時に行えない半二重通信となる。 | *: 一般的な2線式RS-485では、送信と受信を同時に行えない半二重通信となる。 | ||
送信時には受信を停止し、受信時には送信を停止する必要がある。 | *: 送信時には受信を停止し、受信時には送信を停止する必要がある。 | ||
RTS信号を使用して、送受信の切り替えを制御する。 | *: RTS信号を使用して、送受信の切り替えを制御する。 | ||
この制御を適切に行わないと、データの衝突や損失が発生する可能性がある。 | *: この制御を適切に行わないと、データの衝突や損失が発生する可能性がある。 | ||
<br> | <br> | ||
* マルチポイント接続 | |||
1つのバスに複数のデバイスを接続できるという特徴がある。 | *: 1つのバスに複数のデバイスを接続できるという特徴がある。 | ||
各デバイスには一意のアドレスを割り当てる必要があり、通常は1から247までの値を使用する。 | *: 各デバイスには一意のアドレスを割り当てる必要があり、通常は1から247までの値を使用する。 | ||
マスター・スレーブ方式またはマルチマスター方式で通信を行うが、産業用途ではマスター・スレーブ方式が一般的である。 | *: マスター・スレーブ方式またはマルチマスター方式で通信を行うが、産業用途ではマスター・スレーブ方式が一般的である。 | ||
<br> | <br> | ||
* バス終端抵抗 | |||
*: バスの両端に120[Ω]の終端抵抗を接続する必要がある。 | |||
これは信号の反射を防ぎ、通信の信頼性を向上させるための重要な要素である。 | *: これは信号の反射を防ぎ、通信の信頼性を向上させるための重要な要素である。 | ||
終端抵抗はハードウェア側の設定であり、ソフトウェアでは制御しない。 | *: 終端抵抗はハードウェア側の設定であり、ソフトウェアでは制御しない。 | ||
<br> | <br> | ||
* 通信距離と速度 | |||
RS-485は最大約1200メートルの通信が可能である。 | *: RS-485は最大約1200メートルの通信が可能である。 | ||
ただし、ボーレートは通信距離に応じて調整する必要がある。 | *: ただし、ボーレートは通信距離に応じて調整する必要がある。 | ||
高速通信では距離が短くなり、長距離では低速になる傾向がある。< | *: 高速通信では距離が短くなり、長距離では低速になる傾向がある。 | ||
*: <u>例えば、9600[bps]では約1200メートル、115200[bps]では約100メートル程度が目安となる。</u> | |||
<br> | <br> | ||
==== RTS制御による半二重通信 ==== | ==== RTS制御による半二重通信 ==== | ||
RS-485では、RTS信号を使用して送信と受信を切り替える。<br> | RS-485では、RTS信号を使用して送信と受信を切り替える。<br> | ||
| 648行目: | 649行目: | ||
Modbusは、産業用機器間の通信に特化したシンプルで信頼性の高いプロトコルである。<br> | Modbusは、産業用機器間の通信に特化したシンプルで信頼性の高いプロトコルである。<br> | ||
<br> | <br> | ||
Modbus | * Modbus RTUの基本構造 | ||
メッセージは、デバイスアドレス、ファンクションコード、データ、CRCの順に構成される。 | *: メッセージは、デバイスアドレス、ファンクションコード、データ、CRCの順に構成される。 | ||
** デバイスアドレス | |||
**: 1バイトで、通信相手のデバイスを識別する。 | |||
データは可変長で、読み書きするデータやアドレスを含む。 | ** ファンクションコード | ||
**: 1バイトで、実行する操作を指定する。 | |||
**: データは可変長で、読み書きするデータやアドレスを含む。 | |||
** CRC | |||
**: 2バイトで、エラー検出用のチェックサムとして使用される。 | |||
<br> | <br> | ||
* 主要なファンクションコードについて | |||
*: これらのファンクションコードを使用することで、ほとんどの産業用制御が可能になる。 | |||
** 0x03 | |||
**: ホールディングレジスタの読み取りに使用される。 | |||
** 0x06 | |||
**: 単一レジスタへの書き込みに使用される。 | |||
** 0x10 | |||
**: 複数レジスタへの書き込みに使用される。 | |||
<br> | <br> | ||
<u>CRC計算</u>において、Modbus RTUでは、CRC-16を使用してデータの整合性を確認する。<br> | <u>CRC計算</u>において、Modbus RTUでは、CRC-16を使用してデータの整合性を確認する。<br> | ||
CRCは、メッセージ全体であるアドレスからデータまでに対して計算される。<br> | CRCは、メッセージ全体であるアドレスからデータまでに対して計算される。<br> | ||
受信側では、受信したCRCと計算したCRCを比較して、データの正当性を検証する。<br> | 受信側では、受信したCRCと計算したCRCを比較して、データの正当性を検証する。<br> | ||
<br> | |||
* CRCの初期化: | |||
*: <math>\mathrm{CRC} = \texttt{0xFFFF} \quad</math> (初期値は全ビット1)<br> | |||
* 各バイト <math>D_i</math> に対して: | |||
*: <math>\mathrm{CRC} = \mathrm{CRC} \oplus D_i \quad</math> (排他的論理和)<br> | |||
* 8回繰り返し (各ビットに対して) : | |||
*: <math>\text{if } (\mathrm{CRC} \;\&\; \texttt{0x0001}) = 1 \text{ then}</math> | |||
*: <math>\quad \mathrm{CRC} = (\mathrm{CRC} \gg 1) \oplus \texttt{0xA001}</math> | |||
*: <math>\text{else}</math> | |||
*: <math>\quad \mathrm{CRC} = \mathrm{CRC} \gg 1</math> | |||
*: <br> | |||
*: <u>反復計算の詳細:</u> | |||
*: <math> | |||
\begin{aligned} | |||
&\mathrm{CRC}_0 = \texttt{0xFFFF} \\ | |||
&\mathrm{CRC}_{i+1} = \mathrm{CRC}_i \oplus D_i | |||
\end{aligned} | |||
</math> | |||
*: <br> | |||
*: 各ビット <math>j \in \{0, 1, \ldots, 7\}</math> に対して: | |||
*: <math> | |||
\begin{aligned} | |||
&\mathrm{CRC}_{j+1} = \begin{cases} | |||
\left\lfloor \frac{\mathrm{CRC}_j}{2} \right\rfloor \oplus \texttt{0xA001} & \text{if } \mathrm{CRC}_j \;\&\; 1 = 1 \\ | |||
\left\lfloor \frac{\mathrm{CRC}_j}{2} \right\rfloor & \text{if } \mathrm{CRC}_j \;\&\; 1 = 0 | |||
\end{cases} | |||
\end{aligned} | |||
</math> | |||
* 最終結果: | |||
*: <math>\mathrm{CRC}_{\text{final}} = (\mathrm{CRC}_{\text{low}}, \mathrm{CRC}_{\text{high}}) \quad</math> (リトルエンディアン形式) | |||
<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
// ModbusRTU.hファイル | // ModbusRTU.hファイル | ||
| 990行目: | 1,028行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== マルチドロップ通信 ==== | ==== マルチドロップ通信 ==== | ||
RS-485では、複数のデバイスを1つのバスに接続するマルチドロップ構成が可能である。<br> | RS-485では、複数のデバイスを1つのバスに接続するマルチドロップ構成が可能である。<br> | ||