三菱PLCと最速通信！McpXとMX Componentの性能差を検証

## はじめに
三菱電機製のPLCとC#で通信を行う場合、一般的には **MX Component** を使用するのが定番です。
しかし、COMベースのMX ComponentはWindows環境に依存しており、パフォーマンス面での課題も少なくありません。
そこで本記事では、.NETネイティブで開発された軽量ライブラリ **McpX** を用いて、 **MX Component** との通信速度を比較し、実用上どの程度の差があるのかを検証します。


## 検証環境
### PC構成
- Windows 11 Professional
- CPU Intel(R) Xeon(R) CPU E3-1245 v5 @ 3.50GHz   3.50 GHz 
- メモリ 32GB
- ストレージ SSD 256GB
- .Net 9.0.203
- 使用ライブラリ
  - McpX 0.5.1
  - MX Component 4
- McpX使用プロトコル
  - 3Eフレーム
  - バイナリ
  - TCP
:::note warn
本環境は、Proxmoxにセットアップした仮想環境を使用しております。
:::

### ネットワーク構成
PLC に内蔵された Ethernet ポートと、PC を市販のスイッチングハブ経由で接続しています。

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/eb8fc66e-740c-4391-88bf-979ce02816ec.png)

## 測定方法
PLCのデバイスメモリに対して、連続領域の読み出し、書き込みを行い、その処理速度を比較対象としています。

測定は、読み書きするデバイス点数を 500点から10000点まで1000点刻みで変化させ、それぞれの条件での通信時間を記録しました。

各条件につき、同一処理を 100回連続で実行し、`System.Diagnostics.Stopwatch` クラスを用いて 実行時間（ms）の平均値を計測しています。

:::note warn
PLCのスキャンタイムによる影響を避けるため、PLCをSTOP状態にして測定を行いました。
:::

### 読み出しパフォーマンスの比較
McpX はすべての点数において MX Component よりも高速に読み出し処理を完了しており、特に 1000 点以上ではその差が明確に現れています。例えば 5000 点読み出す場合、McpX は 15.25ms に対し、MX Component は 19.62ms と、約 22% の高速化が見られます。

データ点数が増えるにつれて両者の差は広がっており、10000 点では **McpX が約 27% 高速**です。

![read-performance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/b70f5d7c-0e7f-4c28-8a6d-a9aac9ff810d.png)

| 点数 | McpX (ms) | MXComponent (ms) |
|-----------|-----------|------------------|
| 500       | 2.36      | 3.02             |
| 1000      | 4.16      | 6.06             |
| 2000      | 7.05      | 9.33             |
| 3000      | 10.05     | 12.85            |
| 4000      | 12.89     | 16.36            |
| 5000      | 15.25     | 19.62            |
| 6000      | 18.02     | 24.65            |
| 7000      | 21.02     | 31.24            |
| 8000      | 24.03     | 32.82            |
| 9000      | 27.01     | 36.95            |
| 10000     | 29.91     | 40.83            |



### 書き込みパフォーマンスの比較
McpX はすべての点数において MX Component よりも高速に書き込み処理を完了しており、特に 1000 点以上ではその差が明確に現れています。例えば 5000 点書き込む場合、McpX は 17.09ms に対し、MX Component は 22.75ms と、約 25% の高速化が見られます。

データ点数が増えるにつれて両者の差は広がっており、10000 点では **McpX が約 25% 高速**です。

![write-performance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/d4b75cea-bdfa-47b0-b690-372f06001e48.png)

| 点数 | McpX (ms) | MXComponent (ms) |
|------------|-----------|------------------|
| 500        | 2.08      | 3.08             |
| 1000       | 4.13      | 6.19             |
| 2000       | 7.92      | 10.39            |
| 3000       | 11.05     | 14.16            |
| 4000       | 14.07     | 18.52            |
| 5000       | 17.09     | 22.75            |
| 6000       | 20.38     | 26.96            |
| 7000       | 24.04     | 30.84            |
| 8000       | 27.03     | 35.48            |
| 9000       | 30.04     | 39.10            |
| 10000      | 33.06     | 43.92            |

## まとめ
本記事では、三菱PLCとの通信において一般的に使用される MX Component と、.NETネイティブで動作する軽量ライブラリ McpX を用いて、読み出し・書き込み処理のパフォーマンスを比較しました。

検証の結果、すべてのデータ点数において **McpX は MX Component よりも、平均して約 26% 高速に処理できることが確認できました。**

この差は、単なる COM オーバーヘッドの有無だけでなく、使用プロトコルの構造的な違いにも起因しています。

また、McpX は COM に依存しない純粋な .NET 実装であるため、クロスプラットフォームやクラウド実行環境への展開にも適しており、将来的な保守性や移植性の面でも有利ではないかと思います。

## 参考リンク
- [McpX ドキュメント](https://yudaikitamura.github.io/McpX/)
- [McpX GitHubリポジトリ](https://github.com/YudaiKitamura/McpX)
- [McpX NuGet](https://www.nuget.org/packages/McpX/)

---
💡 気になった方はぜひ[GitHubのリポジトリ](https://github.com/YudaiKitamura/McpX)をチェックしてみてください。  
よければ ⭐スター もよろしくお願いします！