UDPとTCPの違い
UDP(User Datagram Protocol)は、OSI参照モデルのトランスポート層に属し、コネクション確立を行わずにデータグラムを送出する方式です。TCPのような再送制御や順序保証はありませんが、ヘッダが小さく遅延も少ないため、リアルタイム性が要求される産業機器で広く利用されています。
制御盤でUDPを採用するメリット
- 低オーバーヘッド:パケット生成・解析処理が軽量で、PLCやマイコンの負荷を抑制できます。
- 低遅延:コネクション確立が不要なため、指令値を即時に伝達できます。
- 実装容易:多くのPLCが標準機能として
sendto()
相当の命令を備えており、マイコン側もライブラリで簡単に受信処理を実装できます。
目次
制御盤からマイコンへ値を渡す仕組み
全体構成
- 送信側(PLC/制御盤)
- 送信先 IP アドレスとポート番号を設定
- 指令値をバイト列に整形し、周期タスクで
sendto()
- 受信側(マイコン)
- イーサネット/Wi-Fi モジュールを初期化
- 指定ポートで待ち受け、データグラムを取り込み
データフォーマット設計のポイント
項目 | 推奨例 | 解説 |
---|---|---|
先頭バイト | コマンドID(0x01 など) | 受信後の処理を分岐しやすくします。 |
データ部 | 32bit 浮動小数点 × n | 速度・温度などの実数値を効率的に格納できます。 |
シーケンス | 16bit 連番 | 欠落や入れ替わりの検出に利用します。 |
CRC | CRC-16 | UDP のチェックサムに加え、上位層で冗長性を確保します。 |
送信周期とリアルタイム性
- 例:20 ms 周期(50 Hz)で速度指令を送信すると、産業用サーボ制御でも遅延許容範囲内に収まります。
- 周期ジッタを抑えるため、PLC では「割込みタスク」や「高速スキャン」で送出すると安定します。
Arduino(Ethernet シールド)を例とした受信プログラム
必要なハードウェア
- マイコン本体(Arduino Uno など)
- W5500 搭載 Ethernet シールド
- 100 BASE-TX 対応のスイッチングハブまたはルータ
サンプルコード解説
以下は固定 IP(192.168.0.50)、ポート 50000 で受信待機し、ASCII 文字列をシリアルモニタへ出力する最小構成です。
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 50);
const unsigned int localPort = 50000;
EthernetUDP Udp;
char packetBuffer[32];
void setup() {
Ethernet.begin(mac, ip); // IP 設定
Udp.begin(localPort); // ポートをバインド
Serial.begin(115200);
}
void loop() {
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(packetBuffer, sizeof(packetBuffer) - 1);
packetBuffer[len] = '\0'; // 文字列終端
Serial.print(F("受信: "));
Serial.println(packetBuffer);
// ここで数値変換・CRC 判定などを実装
}
}
ESP32 では WiFiUDP
クラスが同一メソッド名を提供しているため、コードをほぼ流用できます。
信頼性を高めるための実践テクニック
ACK 応答と再送制御
マイコンが受領時刻とシーケンス番号を含む UDP パケットを返信し、PLC がタイムアウト監視を行います。1 〜 2 回の再送でほとんどのパケット損失を回復可能です。
シーケンス番号による欠落検知
16bit 連番を付け、受信側で番号飛びを検出することで取りこぼしを識別できます。再送要求の頻度を減らし、通信帯域を節約できます。
代替手段としての TCP
データロスが許容されない計測ログや設定値転送では、同一ネットワーク内でも TCP に切り替える選択肢があります。更新周期が 100 ms 以上の場合、TCP のオーバーヘッドは問題になりにくい傾向です。
まとめ
- UDP送信は低遅延・低オーバーヘッドのため、PLC からマイコンへリアルタイム指令値を送る用途に適しています。
- コネクションレスゆえにパケット欠落・順序入れ替わりが起こり得るため、シーケンス番号や ACK 応答でアプリ層の信頼性を補強すると安全です。
- Arduino Ethernet や ESP32 Wi-Fi では、ライブラリを活用することで数十行のコードで実装可能です。
- ロスに弱いデータでは TCP への切替も視野に入れ、システム要件に応じたプロトコル選定を行うと良好な結果が得られます。