C#で三菱PLCと通信する最短コード！9行のコードで PLCとデータ連携！

## はじめに
三菱電機製PLC（MELSEC）とPCでデータ通信を行うには、MCプロトコル（MELSEC Communication Protocol）という専用の通信仕様を使う必要があります。

MCプロトコルの公式マニュアルは、三菱電機のWebサイトで公開されていますが、その内容は、500ページほど…
ちょっと値を読みたいだけでも、「フレーム形式」、「コマンドの構造」、「アドレスの表記法」などを理解しなければならず、気軽に試すには少し敷居が高いのが実情です。

また、三菱公式のライブラリ MX Component もありますが、こちらは有償かつWindows専用なので、LinuxやRaspberry Piなどの環境でバッチ処理・ロギング・IoT連携を行うには、ライセンスや実行環境の制約がネックになってしまいます。

この記事では、手軽に**C#でPLCと通信する最短コード**をご紹介します。

## 使用ライブラリ 
- [McpX](https://yudaikitamura.github.io/McpX/index.html)

## 実行環境
- Windows 11 Professional
- Visual Studio 2017 Professional(Community版でも可)
- .NET Framework 4.6.2
- GX Works2
- Q03UDECPU

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

## PLCパラメータ設定
GX WorksでPLCのパラメータ設定します。
IPアドレス、ポートは環境に合わせて変更してください。
[こちら](https://yudaikitamura.github.io/McpX/docs/plc_parameter_setting.html)に画像付きの説明を記載してます。

### 設定内容
- IPアドレス `192.168.12.88`
- ポート `10000`
- プロトコル `TCP`
- オープン方式 `MCプロトコル`
- 交信データコード `バイナリ`

## ライブラリをインストール
1. VisualStudioを起動
2. 「ファイル」→「プロジェクト」で「コンソールアプリ」を選択し、プロジェクト名を入力後、「OK」を押下してプロジェクトを作成
![Screenshot_20250418_214006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/a68d547d-0045-497b-a3c0-f6f958bd219e.png)
3. 「ツール」→「NuGet パッケージマネージャー」で`mcpx`を検索
4. 「McpX」を選択し、インストールするプロジェクトを指定後、「インストール」を押下して、ライブラリをインストール
![Screenshot_20250418_214705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/4520a86d-e47a-4a7d-8720-42c82057223d.png)
:::note info
環境によっては、「変更のプレビュー」が表示されますが、その際は、「OK」を押下してインストールを進めてください。
:::

## コードを記述
ソリューションエクスプローラで`Program.cs`を開いて、`Main`メソッドに下記コードを貼り付けてください。
また、`ip`、`port`は、環境に合わせて変更してください。

```csharp
using (var mcpx = new McpXLib.McpX(ip: "192.168.12.88", port: 10000))
{
    var dArr = mcpx.BatchRead<short>(McpXLib.Enums.Prefix.D, "0", 1000);
    for (int i = 0; i < 1000; i++)
    {
        Console.WriteLine($"D{i}:{ dArr[i] }");
    }
    Console.ReadLine();
}
```

:::note info
このコードは、PLCからD0からD999までの1000点のワードデータを一括で読み出し、コンソールに一覧表示するコードです。
:::

↓最終的なコード
```diff_c_sharp
using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
+           using (var mcpx = new McpXLib.McpX(ip: "192.168.12.88", port: 10000))
+           {
+               var dArr = mcpx.BatchRead<short>(McpXLib.Enums.Prefix.D, "0", 1000);
+                
+               for (int i = 0; i < 1000; i++)
+               {
+                   Console.WriteLine($"D{i}:{ dArr[i] }");
+               }
+               Console.ReadLine();
+           }
        }
    }
}
```

## 実行結果
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/d3aae89c-ff04-488b-82ae-42b00fd8b4d4.gif)

## パフォーマンス測定結果
Dレジスタの読み込み点数ごとの処理時間の測定結果です。

| 点数 | 処理時間 |
|-----------|-----------|
| 500       | 2.36      |
| 1000      | 4.16      |
| 2000      | 7.05      |
| 3000      | 10.05     |
| 4000      | 12.89     |
| 5000      | 15.25     |
| 6000      | 18.02     |
| 7000      | 21.02     |
| 8000      | 24.03     |
| 9000      | 27.01     |
| 10000     | 29.91     |

:::note info
- PCとPLCの環境および通信状況より、処理時間は異なります
- 処理時間がそのままスキャンタイムに加算されることはありませんが、スキャンタイムへの影響も考慮した開発が必要です
:::

https://qiita.com/YudaiKitamura/items/978e404649221183ff7b

## まとめ
この記事では、C#用の通信ライブラリ McpX を使って、  
三菱PLCとたった9行でデータ連携する方法をご紹介しました。

今回は Windows 環境での紹介でしたが、.NET 7 以降に対応しており、**Linux や macOS でも動作可能**です。

また、McpX は **読み出しだけでなく、書き込みやビットデバイスにも対応**しています。  
そのあたりの活用方法は、次回以降の記事で詳しく取り上げていきます！

## 参考リンク
- [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)をチェックしてみてください。  
よければ ⭐スター もよろしくお願いします！