エンディアンとは、コンピュータが「複数バイトで構成されるデータ」をどの順番でメモリに保存するかを決めるルールです。
一見マニアックに思えるかもしれませんが、通信やファイル解析、PLC(プログラマブルロジックコントローラ)との接続など、現場では非常に実用的な話です。
この記事では、初心者でも理解できるようにやさしく説明しながら、実務でのトラブルを避けるための知識も正確にまとめていきます。
エンディアンとは?
例えば、0x12345678
という16進数の数値(4バイト=32ビット)をメモリに保存する場合、コンピュータはこの値を1バイトずつ分解して保存します。
このとき、どのバイトを先に保存するかによって結果が変わります。
その順番を決める方式がエンディアンであり、次の2種類があります。
ビッグエンディアン(Big Endian)
数値の上位バイト(大きい桁)から順にメモリへ保存します。
例:0x12345678
を保存すると…
アドレス順: 0 1 2 3
↓ ↓ ↓ ↓
[12] [34] [56] [78]
これは、人間が左から読む数値の並び方に近く、直感的です。
リトルエンディアン(Little Endian)
数値の下位バイト(小さい桁)から順にメモリへ保存します。
アドレス順: 0 1 2 3
↓ ↓ ↓ ↓
[78] [56] [34] [12]
完全に前後が反転しているように見えるのが特徴です。
「前後が反転する」とはどういうこと?
ここで言う「反転」とは、バイト(8ビット)単位で順番が逆になるということです。
つまり 0x12345678
という数値を構成する4つのバイトを、前から読むか、後ろから読むかの違いです。
値そのものは変わりませんが、読み取り方法によって全く違う数値になることがあります。
どちらが主流なのか?
用途・環境 | 採用されているエンディアン |
---|---|
パソコン・サーバー | リトルエンディアン(Intel系CPU) |
ネットワーク通信 | ビッグエンディアン(Network Byte Order) |
多くのPLC | ビッグエンディアン(例外あり) |
なぜ違う?
リトルエンディアンは、下位バイトから処理できるため演算効率が良いという利点があります。
一方、ビッグエンディアンは人間にとって読みやすい順序であり、ネットワークなどで統一ルールが必要な場面で使われます。
PLCでの違いと注意点
PLC(プログラマブルロジックコントローラ)は、産業機械を制御するコンピュータです。
このPLCとPCが通信を行うときにも、エンディアンの違いによってデータが正しく伝わらないことがあります。
メーカーごとの傾向(例)
PLCメーカー | 傾向 | 備考 |
---|---|---|
三菱電機(MELSEC) | ビッグエンディアン | Q/Lシリーズなど |
オムロン(OMRON) | リトルエンディアン | CJ/NJ/NXシリーズなど |
キーエンス(KEYENCE) | ビッグエンディアン | KVシリーズ |
シーメンス(SIEMENS) | ビッグエンディアン | S7シリーズ |
Allen-Bradley(Rockwell) | リトルエンディアン | ControlLogix、CompactLogixなど |
※モデルや通信モードによって例外もあります。必ずマニュアルで確認が必要です。
通信プロトコルとの関係:Modbusでのトラブル例
たとえば、Modbusという通信規格では、PLCはビッグエンディアン、PC側はリトルエンディアンということがよくあります。
例:PLCが 0x1234
を送ったつもりでも、PC側では 0x3412
に見えてしまう。
これは、バイトの並び順が逆になっているためで、数値が大きくズレる原因になります。
対策:ソフトウェアでバイトスワップする
多くの通信ライブラリ(PLCソフトやPythonなど)では、バイト順を変える機能(バイトスワップ、エンディアン変換)が用意されています。
例:Pythonでの指定
import struct
# ビッグエンディアンとして解釈('>'がポイント)
value = struct.unpack('>H', b'\x12\x34')[0]
print(value) # → 4660(0x1234)
>
はビッグエンディアン、<
はリトルエンディアンを意味します。
PLC通信ミドルウェアの例
- Modbusツールで「Swap Words」や「Swap Bytes」というチェックボックスがある
- OPCサーバでデータ型やバイト順を個別に指定できる場合がある
実務での確認手順
- PLCの仕様書でエンディアンを確認する
- 通信先(PCや外部機器)の仕様も確認
- 試験通信で「既知の値(例:0x1234)」を送受信してみる
- 受け取り側の値が逆になっていたら、変換を加える
まとめ:初心者が必ず押さえるべきポイント
- エンディアンとは、バイトの並び順を決めるルール
- リトルエンディアン=小さいバイトから先、PCで主流
- ビッグエンディアン=大きいバイトから先、ネットワークやPLCでよく使われる
- 「前後が反転する」というのは、バイト単位で順番が逆になるという意味
- 通信時はエンディアンの違いにより、数値がずれてしまうことがある
- その場合はソフトウェア側で「バイトスワップ(変換)」を行う
この違いを理解しておくだけで、通信やバイナリ処理のトラブルを大きく減らすことができます。
Comment