PythonでKeyence PLCのデバイスを読み出す方法|上位リンク通信による設備IoT化
「設備のIoT化、何から始めればいいか分からない」
現場でそんな声をよく耳にします。
結論から言うと、最初の一歩は「PLCから設備データをPCに読み出すこと」です。
ここさえクリアできれば、生産数の見える化も、異常発生時のLINE通知も、すべて同じ仕組みの延長線上にあります。
この記事では、Keyence製PLC × Python × 上位リンク通信という、追加ライセンス不要で誰でも始められる組み合わせで、設備データを読み出す手順を最初から最後まで解説します。
読み終える頃には、DM100 に書き込んだ生産数や異常コードを、Python側のターミナルに表示できるようになっているはずです。
そもそも「上位リンク通信」とは?他の方式と何が違うのか
PLCからデータを取り出す方法は、実は何種類もあります。
その中で今回あえて上位リンク通信を選んだ理由を先にお伝えします。
PLC ↔ PC のデータ連携でよく使われる方式の比較
| 方式 | 追加ライセンス | 設定の手間 | 向いている用途 |
|---|---|---|---|
| 上位リンク通信(今回採用) | 基本的に不要 ※通信ユニット構成は機種による | 少ない | 小〜中規模IoT、検証、現場PCからのデータ取得 |
| OPC UA | 機種・構成による ※KV-8000はOPC UAサーバ機能を標準搭載 | 中〜多い | 工場全体の標準化、SCADA/MES連携、複数メーカー混在環境 |
| MODBUS TCP | 基本的に不要 ※対応ユニット/機種は要確認 | 中 | 他社機器・汎用機器との連携 |
| EtherNet/IP | 基本的に不要 ※対応ユニット/設定ファイル等は要確認 | 中〜多い | センサ、リモートI/O、ロボット、他社PLCとの周期通信 |
上位リンク通信を選ぶメリット
- PC側に専用のOPCサーバーソフトを用意しなくてもよい
- コマンドがASCII文字列なので、telnetやPythonで簡単に試せる
- 一般的なPythonの
socketモジュールだけで動く=追加ライブラリゼロ
※ ただし、使用するPLCにEthernetポート/通信ユニットが備わっているかは、機種選定時に必ず確認してください。
逆に向かないケース
- ms単位の高速データ収集が必要な用途(バイナリ通信のほうが速い)
- 100台以上の設備を統合管理したい場合(OPC UAのほうが拡張性が高い)
「まずは1台、データを取り出してみたい」というフェーズには上位リンク通信が最速の選択肢です。
規模が大きくなってからOPC UAに置き換えていくのも、十分現実的な進め方です。
必要なもの・前提条件
作業に入る前に、手元に揃っているか確認してください。
ハードウェア
- Keyence製PLC(Ethernetポート搭載モデル、または通信ユニット装着済み)
例:KV-7500/KV-8000(CPU内蔵Ethernet)、KV-Nano+KV-NC1EP、KV-XLE02搭載構成など。ご使用の機種の取扱説明書で「上位リンク通信」対応を確認してください。 - Windows PC(10/11どちらでもOK)
- LANケーブル(PCとPLCを直結する場合はクロス/ストレート問わずAuto-MDIXで通る機種が多い)
ソフトウェア
- KV STUDIO(PLCのIPアドレス設定用/Keyence公式から無償ダウンロード可)
- Python 3.x(標準ライブラリの
socketモジュールのみ使用。追加のインストールは不要)
知識レベル
- Pythonでファイルを実行できる程度
- KV STUDIOでユニット構成を開いたことがある
- IPアドレスとサブネットマスクの概念がなんとなく分かる
ポイント:今回はPLCとPCを1対1で直結する構成で進めます。
工場LANに接続する場合は、ネットワーク管理者にIPアドレスの割り当てを必ず確認してください。
ステップ1 — PLC側のネットワーク設定(KV STUDIO)
まずはPLC側のIPアドレスを設定していきます。
KV STUDIOを開き、画面左側のプロジェクトツリーから「Ethernet/IP」を右クリック → ユニットエディタを選択します。ユニットエディタ画面が開いたら設定開始です。

画面右側の「ユニット設定(2)」→「ポート設定」に進み、IPアドレスとサブネットマスクを入力します。今回は以下の値で進めます。
| IPアドレス | 192.168.0.10 |
| サブネットマスク | 255.255.255.0 |
ポイント:IPアドレスは固定IPで設定するのが基本です。DHCPだと再起動のたびにアドレスが変わってしまい、Python側から接続できなくなるためです。

入力が終わったら、右下の「適用」→「OK」で設定を反映します。
ステップ2 — PC側のネットワーク設定(Windows)
次にPC側のIPアドレスを、PLCと同じネットワークになるように設定します。今回はWindows 11の画面で説明します(Windows 10でもほぼ同じ手順です)。
画面右下のWi-Fi(またはネットワーク)アイコンをクリックし、表示されたパネル上の歯車アイコンを選択します。

設定画面が開いたら、「ネットワークとインターネット」→ 接続中のイーサネット → IP割り当ての「編集」をクリック。

編集ダイアログが開いたら、以下のように設定します。
| 編集方法 | 手動 |
| IPv4 | オン |
| IPアドレス | 192.168.0.20 |
| サブネットマスク | 255.255.255.0 |
ポイント:PCのIPはPLCと異なる末尾の番号にします(PLCが
.10ならPCは.20など)。同じアドレスにするとIPアドレス競合が発生し、通信できません。

「保存」をクリックすれば、ネットワーク設定は完了です。
ステップ3 — pingで疎通確認
PCとPLCが正しく繋がっているか、本格的なコードを書く前にpingで確認します。これをやらずにいきなりPythonに進むと、繋がらなかったときに「コードが悪いのか/配線が悪いのか/設定が悪いのか」の切り分けに時間がかかります。
Windowsの検索バーで「cmd」と入力し、コマンドプロンプトを立ち上げます。以下のコマンドを入力してEnterを押します。
ping 192.168.0.10
※ 192.168.0.10 の部分は、ステップ1で設定したPLCのIPアドレスに置き換えてください。

通信成功の場合

Reply from 192.168.0.10: と4回返ってくれば成功です。次のステップ4に進みます。
通信失敗の場合

Request timed out や 宛先ホストに到達できません と表示されたら、以下を順番にチェックしてください。
- LANケーブルは奥までしっかり挿さっているか
- PLCのIPアドレス(ステップ1)とコマンドで打ったIPアドレスは一致しているか
- PCのIPアドレス(ステップ2)はPLCと同じネットワーク(前3桁が同じ)か
- PCのファイアウォール/ウイルス対策ソフトがpingをブロックしていないか
ステップ4 — Pythonでデバイスを読み出す
疎通確認ができたら、いよいよPythonで実際にPLCのデバイスを読み出します。以下のコードを read_plc.py などの名前で保存して実行してください。
import socket # PLCのIPアドレスと上位リンク通信ポート PLC_IP = "192.168.0.10" PLC_PORT = 8501 def send_command(command): # 上位リンクコマンドの終端にCRを付ける command = command + "\r" # PLCへTCP接続 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(3) s.connect((PLC_IP, PLC_PORT)) # コマンド送信 s.sendall(command.encode("ascii")) # 応答受信 response = s.recv(1024) return response.decode("ascii").strip() # DM100〜DM104を5点分まとめて読み出し result = send_command("RDS DM100.U 5") print("受信データ:", result)
実行すると、PLCの DM100 から DM104 までの値がスペース区切りで返ってきます。
受信データ: 1234 5678 0 100 25
「受信データ: の後に数字が並ぶ」状態が見えたら、設備IoT化の第一歩はクリアです。
コマンド「RDS DM100.U 5」を分解して理解する
Pythonから送ったコマンド RDS DM100.U 5 は、上位リンク通信の「連続デバイス読み出し」コマンドです。4つの要素に分解できます。
| 位置 | 例 | 意味 |
|---|---|---|
| コマンド種別 | RDS | Read Devices in Series(連続デバイス読み出し) |
| 先頭デバイス | DM100 | 読み出しを開始するデバイスアドレス |
| データ型 | .U | 16bit 符号なし整数として扱う |
| 点数 | 5 | 先頭から何点読み出すか |
つまりこのコマンドは、「DM100から始まる5点(DM100〜DM104)を、16bit符号なし整数として読み出してください」という命令になります。
データ型サフィックスの一覧
用途に応じて、データ型を変えることができます。
| サフィックス | データ型 | 値の範囲 | よくある用途 |
|---|---|---|---|
.U | 16bit 符号なし | 0 〜 65,535 | 生産数、カウンタ |
.S | 16bit 符号付き | -32,768 〜 +32,767 | 温度(マイナス側あり)、補正値 |
.D | 32bit 符号付き | 約 ±21億 | 累積生産数、長時間カウント |
.L | 32bit 符号なし | 0 〜 約42億 | 大きい正の値 |
.H | 16bit HEX | 0x0000 〜 0xFFFF | ステータスビット、異常コード |
よく使うコマンド一覧
今回使った RDS 以外にも、現場でよく使うコマンドを覚えておくと応用が効きます。
| コマンド | 用途 | 例 |
|---|---|---|
RD | 1点だけ読み出し | RD DM100.U |
RDS | 連続点まとめて読み出し | RDS DM100.U 5 |
WR | 1点だけ書き込み | WR DM100.U 1234 |
WRS | 連続点まとめて書き込み | WRS DM100.U 3 100 200 300 |
?K | 接続中PLCの機種名取得(疎通確認に便利) | ?K |
次の記事予告
今回のサンプルコードは「まず動かす」ことを目的にした最小構成です。実際に現場で常時稼働させるには、通信エラー時のリトライ処理/ポーリング周期の設計/同時接続数の管理など、おさえておくべきポイントがいくつかあります。これらは別記事で詳しく解説します。
読み出したデータの活用例 — ここからが本当の設備IoT化
ここまでで、PLCのデバイス値をPythonで取得する仕組みが完成しました。でも、データを取得できただけでは「ただ数字が表示されているだけ」。本当の価値は、このデータをどう活かすかにあります。
同業者の方なら、自分の現場で「これができたら助かるのに…」という場面が思い浮かぶはずです。ここでは、実際の現場で価値が出やすい活用例を4つ紹介します。
活用例① 異常発生時にスマホへLINE通知
設備が異常停止したとき、現場に駆けつける前にスマホで把握できる仕組みです。夜間や休日の無人運転中こそ、効果を実感します。
異常コードDMが「0以外」になったら、Pythonがその瞬間にLINEへメッセージ送信。「ライン1の搬送異常、エラーコード205です」と通知が届くだけで、現場到着までの初動が変わります。
活用例② 生産数のリアルタイム見える化ダッシュボード
事務所のモニターや、スマホからアクセスできるWebダッシュボードに、生産数や稼働率を表示します。
Python の Streamlit や Grafana を使えば、生産数DMを1秒ごとに読み取り、グラフ化してブラウザに表示できます。タッチパネル増設に頼らずに済むので、設備投資を抑えられるのもメリットです。
活用例③ 生産データの自動CSVログ保存
設備の状態を、日報・週報用に自動でCSV保存します。「毎朝、班長が手書きで日報を書いていた」という工程をまるごと不要にできます。
Pythonの csv モジュール(標準ライブラリ)で、1分ごとに生産数・稼働状態・異常コードを取得し、日付別CSVに追記。蓄積したCSVは、Excelでグラフ化したり、後から生産性分析・故障傾向分析にそのまま使えます。
活用例④ 複数台のPLCを1台のPCで一括監視
工場内に散らばる複数のPLCを、1台のPCから順番にポーリングして、まとめて状況把握できます。各PLCに固定IPを割り当て、Pythonで PLC_LIST = ["192.168.0.10", "192.168.0.11", ...] のように管理し、ループで順次取得。
「ライン1〜5の稼働状況を1画面で確認」といった、設備全体の見える化への第一歩になります。
共通して言えること
ここで紹介した4つの活用例は、すべて今回作った send_command() 関数の延長線上にあります。つまり、「設備データをPCに取り出す」という今日の第一歩さえクリアできれば、残りはPythonの一般的なスキルで実現できるということです。
設備IoT化のハードルは、思っているより低いところにあります。
まとめ — 設備IoT化の「最初の一歩」を踏み出せました
今回の記事では、Keyence製PLC × Python × 上位リンク通信で、設備データをPCに読み出すまでの一連の流れを解説しました。振り返りとして、要点を3つに絞っておきます。
- 上位リンク通信は、追加ソフト・ライブラリ不要で始められる最短ルート
→ 検証や小〜中規模IoTには、まずこの方式で十分 - PLC側・PC側それぞれのIP設定 → ping確認 → Pythonコード、の順序が王道
→ いきなりコードに行かず、疎通確認を挟むのがトラブル回避のコツ RDS DM100.U 5のような1行のコマンドで、設備状態をまとめて取得できる
→ あとはデータをどう活かすかだけ
「設備のIoT化」と聞くと身構えてしまいがちですが、こうして分解してみると、意外と手の届く距離にあることが伝わったのではないでしょうか。
設備のIoT化、自社でも始めたい方へ
「自分の現場でも、生産数の見える化や異常通知をやりたい。でも、何から始めればいいか分からない…」そんなご相談を、これまで何件もいただいてきました。
私 FA-Tech Lab では、設備の制御設計から、PLC・Pythonを使った現場IoT化の支援まで、現場目線で対応しています。
- 「ウチの設備でも、今回のような仕組みを組めるか相談したい」
- 「PLCのデータをExcel/ダッシュボードで見えるようにしたい」
- 「異常時の通知システムを構築したい」
どんな粒度のご相談でも、まずはお気軽にお問い合わせください。

