AIエージェントからPLCにアクセスしてみた【第2回:MCPサーバをバイブコーディング】

「AIのプロンプトからPLCのデバイスメモリを読み出してみたい?」そんな単純な思いつきと、「生成AIに関するセキュリティについて考察したい」という自身のスキルアップのために、PLCと通信するMCPサーバを作成してみました。

その第2回では、MCPサーバをバイブコーディングします。

PLC:Programmable Logic Controller(工場の機械設備などを自動で動かすための制御コントローラ)
MCP:Model Context Protocol(AIと外部のデータソースやツールを安全かつ統一的に接続するための標準規格)

PLC通信の前提事項

まず、PLCと通信するにあたっての、前提事項を以下にあげておきます。

  • テストで用いるPLCの機種
    接続テストするPLCの機種ですが、今回は手元にある三菱電機の「MELSEC-Qシリーズ」を使いました。すでに生産終了がアナウンスされている古い機種であり、後継の「MELSEC iQ-Rシリーズ」などへの更新が進んでいるかと思います。ただ、実際の生産現場では、今でも現役で動いているものも多いのではないでしょうか。
    テスト用として、ミニベースユニットに「電源ユニット(Q61P)」と「CPUユニット(Q04UDEHCPU)」、そして「Ethernetユニット(QJ71E71-100)」だけを載せています。

    テスト用PLCの構成

     

  • PLCとの通信プロトコル
    SLMP(Seamless Message Protocol)を使います。SLMPは、三菱電機のMELSECシリーズで用いられていたMCプロトコル(MELSEC コミュニケーションプロトコル)を、他社製PLCなどでも使用できるように標準化したものです。基本的に、MCプロトコルと機能や電文フォーマットは同じです。

    SLMPリファレンスマニュアル(出所:三菱電機)

テンプレートコードを作成

バイブコーディングでは、「Cursor」や「Claude Code」、「Codex」など、いろいろなAIエージェントが用いられます。それで今回は、初版となるテンプレートコードを「Gemini Notebook」で作成しました。その理由ですが、そもそも「vibe(バイブ)」は、「(物事が発する)雰囲気・フィーリング・ノリ」といった意味合いがあります。よって、個人的にいろいろ試した結果、(その時点で)一番良さそうな感じのコードが作成できたからです。バイブ!バイブ!です(笑)

Gemini Notebookに、「SLMPリファレンスマニュアル」のPDFファイルはもちろん、その他ウェブ上から10件のソースを追加し、「SLMPプロトコルのAPIを使用するAIのMCPサーバを作成したいです。どういった手順で開発を進めればいいでしょうか。」と質問しました。

MCPサーバの開発手順を把握(Gemini Notebook)

 

そうすると、
SLMP対応MCPサーバ 開発ロードマップ」として
1. システム構成の設計
2. PLC(SLMPサーバ)側の事前設定
3. 開発環境のセットアップ (Python)
4. MCPサーバの実装
5. MCPサーバの実行テスト
の流れで(なるほど)納得の回答を得ました。
また、続いて「MCPサーバの具体的なボイラープレート(テンプレートコード)の設計を進めましょうか?」との提案があり、その依頼をすると「mcp-slmp-server.py」が作成されました。PythonでSLMP(MCプロトコル)を非常にシンプルに扱える「pymcprotocol」というライブラリが使用されています。
そして、開発ロードマップで示された項目に従いながら、このテンプレートコード(mcp-slmp-server.py)をCursorで仕上げていくことにします。

テンプレートコードを出力(Gemini Notebook)

 

OTセキュリティ対策のご相談はこちら

システム構成の設計

Cursorでテンプレートコードを編集しながら、AIエージェントに実装・テストをする関係から、この後のAIエージェントは「Cursor」を使うことにしました。

Cursorでテンプレートコードを開く

 

SLMPには、伝文フォーマットに「3Eフレーム」と「4Eフレーム」の2種類があります。また、交信データのコードとして、「ASCIIコード」と「バイナリコード(デフォルト)」があります。今回は、仕様がシンプルで互換性の高い「3Eフレーム」で、交信データ量が少なく交信時間も短くなる「バイナリコード」になっています。また、SLMPでは、TCP/IPとUDP/IPを使用することができますが、今回はTCP/IPを用いています。

PLC(SLMPサーバ)側の事前設定

今回のPLC構成では、CPUユニットとEthernetユニットの両方にLANポートがあります(どちらも使用できます)が、Ethernetユニット側を使用することにしました。

そして、AIエージェントからのTCP/IP接続用として、
IPアドレス:192.168.200.3
ポート番号:5100
を設定します。設定には、三菱電機のPLCのエンジニアリングツール(WindowsOSで動くソフトウェア)である「GX Works2」を用います(※ツールの設定方法等の詳細は今回省略します)。

開発環境のセットアップ (Python)

今回はWindowsにPythonをインストールした環境を用いました(Pythonのインストール方法等については今回省略します。また、WSLを使うことも可能です)。

  1. Pythonの仮想環境とその有効化
    最初にPythonの仮想環境とその有効化を行います。
    python -m venv mcp_env
    mcp_env\Scripts\activate

    Pythonの仮想環境とその有効化(ブルーの下線は、最初エラーが発生したので解消のために追加)

     

  2. 必須ライブラリのインストール
    次に2つの必須ライブラリをインストールします。
    pip install pymcprotocol # SLMP(MCプロトコル)を実現するライブラリ
    pip install mcp # MCP公式のPython SDK

    pymcprotocol と mcp のライブラリをインストール

お使いのPythonの環境によっては、何らかのエラーが発生する場合があります(今回もいくつかエラーが発生しました)。その際には、エラーメッセージをCursorのプロンプトに貼り付けることで、エラー内容の説明とその解消方法が提案されるので、それを受け入れて進めていきます。

MCPサーバの実装

「Cursor Settings」の「Customize」からMCPを登録します。「mcp.json」にplc-controllerを設定し、起動します。

mcp.jsonの記載内容

 

ここでも、エラーが発生したので、Cursorプロンプトからエラー内容の確認と解消を行いました。

MCPサーバを起動するとエラーが発生
エラー内容を確認(これをCursorのプロンプトに貼り付けて、エラー内容の説明とその解消方法の提案を受け入れる)

 

そうすると、作成したMCPサーバで定義された次の4つのツール(AIから呼び出し可能なAPI)が立ち上がりました。
read_word_devices
write_word_devices
read_bit_devices
write_bit_devices

MCPサーバの実行テスト

では、実際にプロンプトからテストしてみます。PLCのD0からD4までのデバイスメモリを読み出します。

結果が正しいことを確認しました(別途、GX Works2でデバイスメモリの値をモニタリング)。

次回(第3回)の話は

次回は、今回説明した内容をさらに深掘りし、バイブコーディングでMCPサーバのプログラムを改修(機能を追加)してみます。

よくある質問(FAQ)

本記事で解説されている内容は、最終的にどのようなシステム連携を実現するためのものですか?

生成AIやAIエージェントの機能を、産業用の制御機器であるPLC(プログラマブル・ロジック・コントローラ)へシームレスに連携・拡張するための仕組みを実現します。

本記事の開発(プログラミング)ではどのような開発スタイルやツールが活用されていますか?

AIエージェントを活用した開発手法である「バイブコーディング」を取り入れ、ツールとしてCursorを使用しています。

AIエージェントからPLCにアクセスするために、どのような仕組みを実装していますか?

AIエージェントとPLCの間を接続し、データやり取りを中継するための「MCP(Model Context Protocol)サーバ」をPythonで実装しています。

おすすめの記事