---
name: melsec-iqr-simple-cpu-comm-csv
description: MELSEC iQ-Rシリーズ（三菱電機シーケンサ）のCPUユニット内蔵Ethernetポート部「シンプルCPU通信機能」の設定CSVファイルを生成・検証・解析する。GX Works3 が "シンプルCPU通信設定" 画面でインポート／エクスポートする UTF-16LE BOM付タブ区切りCSV（バイト一致レベル）を生成する。ユーザが「シンプルCPU通信」「Simple CPU Communication」「内蔵Ethernet」「GX Works3 のCSVインポート／エクスポート」「機器種別」「定期交信」「要求時交信」「実行間隔」「通信開始待ち時間」「初回交信設定」「異常監視時間」「交信相手IPアドレス」「対象号機」「シンプルCPU通信診断」などに言及した場合、または iQ-R から iQ-R/Q/L/iQ-F/iQ-L/A/AnS/FX3/SLMP対応機器 とのEthernet経由デバイス送受信パラメータの設定ファイルを作成・編集・検証したい場合は必ずこのSkillを参照すること。デバイスそのものの分類体系・命名規則は姉妹Skill `melsec-iqr-device-overview`、個別デバイスの数値スペックは `melsec-iqr-device-specifications` を併用すること。
---

# MELSEC iQ-R シンプルCPU通信 設定CSV ジェネレータ

このSkillは、MELSEC iQ-RシリーズCPUユニットの **シンプルCPU通信機能** （内蔵Ethernetポート部）の設定を、GX Works3 と完全互換の CSVファイル として生成・検証・逆解析する。

出典: **MELSEC iQ-R Ethernetユーザーズマニュアル(応用編) 1.15節 (p.220-242)**。

## このSkillの守備範囲

| 扱う | 扱わない |
|------|----------|
| シンプルCPU通信設定 (1.15節) のCSV生成・検証・解析 | 他のEthernet通信機能（MELSOFT接続、SLMP通信、ソケット通信、CC-Link IEFB Basic等） |
| 機器種別 16/17/18/19/20/22/23/25/26/30 の交信相手対応 | 安全CPU通信（RnSF/RnPSF）の安全デバイス通信 |
| ヘッダー部 (`ファイルバージョン`/`対象ユニット`/`自局IPアドレス`/`IPアドレス入力形式`/`デバイス割付方法`/`通信開始待ち時間`/`初回交信設定`) | 自局CPU の Ethernet 自ノード設定／二重化設定（`自ノード設定`/`B系IPアドレス`等は別途設定） |
| 設定No.1～64 の各カラム（通信パターン／交信設定／実行間隔／IP／ポート／対象号機／ビット・ワードデバイス／タイムアウト／リトライ／異常監視時間／コメント） | リモートパスワード設定／セキュリティ設定 |
| デバイス種別の機器種別ごとの可否・範囲（PDF p.224-228 完全反映） | エンジニアリングツールGUIの操作手順 |
| ビット先頭16倍数チェック・1設定512ワード上限・全体8192ワード上限 | エラーコードCFB4H 等の異常応答コード解析（マニュアル参照） |

## ⚠️ iQ-Rプロジェクトの固定制約（重要）

GX Works3 のシンプルCPU通信設定画面で iQ-Rプロジェクト時に **編集不可（グレーアウト）** な項目があり、それらに値を入れた CSV をインポートすると **GX Works3 が該当行を破棄してデフォルト値の空行に置き換える**。本スクリプトはこれらを違反した時点でバリデーションエラーで停止する。

| 項目 | iQ-R での値 | 備考 |
|------|------------|------|
| `IPアドレス入力形式` (`header.ip_format`) | **`"DEC"` 固定** | 10進数のみ。HEX は GUI で選択不可 |
| `オプション(16進数)` (`settings[].target.option_hex`) | **`""` 固定** | GUI で編集不可。SLMP 含めて全機器種別で空欄必須 |

これは MELSEC iQ-R Ethernetマニュアル本文には明記されていない、GX Works3 GUI実装上の制約。
他CPU(QnUDV等)では HEX 指定可能と推測されるが、本スキルは **iQ-R 専用** のため上記を強制する。

## 根本原則

1. **GX Works3 が出力する CSV と完全バイト一致 を目標とする** ── UTF-16LE+BOM／タブ区切り／CRLF／全セル `"..."` 囲み。手書きで編集して壊さないこと。
2. **生成前に必ず `validate` で検証する** ── デバイス番号・点数・ポート規則・パターン制約は機器種別ごとに異なり、エラーがあると GX Works3 がインポートを拒否する。
3. **このスキルはCSV専用** ── ユニットパラメータ書込みやCPUリセット等の実機操作は別途エンジニアリングツールで行う必要がある。

## ディレクトリ構成

```
melsec-iqr-simple-cpu-comm-csv/
├── SKILL.md                          ← 本ファイル
├── scripts/
│   ├── generate_csv.py               ← メインCLI（generate / validate / parse）
│   └── device_ranges.json            ← 機器種別ごとのデバイス範囲データ
├── examples/
│   └── example_config.json           ← 添付サンプルと同等のCSVを再現する設定例
└── references/
    ├── csv_format.md                 ← CSVフォーマット仕様（バイト構造・カラム並び・基数）
    └── validation_rules.md           ← 全バリデーション規則の一覧
```

## 使い方

### CLI

```bash
# JSON設定からCSVを生成（生成前に自動検証）
python3 scripts/generate_csv.py generate <config.json> <out.csv>

# JSONを検証のみ（CSVは書かない）
python3 scripts/generate_csv.py validate <config.json>

# 既存CSVをJSON設定にデコード（編集ベース作成や差分確認に有用）
python3 scripts/generate_csv.py parse <in.csv> [<out.json>]
```

`parse` → 編集 → `generate` のラウンドトリップはバイト一致を保つ。既存CSVを起点に差分修正したい場合に推奨。

### 最小JSON設定

```json
{
  "header": {
    "target_unit": "R04CPU",
    "local_ip": "192.168.3.39"
  },
  "settings": [
    {
      "no": 1,
      "pattern": "Read",
      "schedule": "periodic",
      "interval": 100,
      "target": {
        "device_type": "iQ-R",
        "ip": "192.168.3.40"
      },
      "word_device": {
        "src": {"type": "D", "start": 0, "end": 99},
        "dst": {"type": "D", "start": 0, "end": 99}
      }
    }
  ]
}
```

ヘッダーで省略されたキーは妥当なデフォルトが入る:

| キー | デフォルト |
|------|-----------|
| `file_version` | `"1"` |
| `title` | `""` |
| `ip_format` | `"DEC"` |
| `device_assignment` | `"Start/End"` |
| `comm_start_wait` | `0` |
| `initial_comm` | `"Disable"` |

設定行で省略されたキーのデフォルト:

| キー | デフォルト |
|------|-----------|
| `target.tcp_udp` | `"UDP"` |
| `target.cpu_no` | `0` (指定なし) |
| `target.option_hex` | `""` |
| `timeout_ms` | `1000` |
| `retry_count` | `3` |
| `error_monitor_sec` | `30` (periodic時) ／ 不要 (request時) |
| `comment` | `""` |

完全な設定例は `examples/example_config.json` 参照。これは添付の `simpcomsample.csv` をバイト一致で再現する。

## 機器種別コードの早見表

PDF p.230 のCSV格納値マッピング。`device_type` には数値・別名文字列どちらでも指定可。

| コード | 機器種別 | 別名 |
|--------|---------|------|
| 16 | 三菱iQ-R(内蔵Ethernet) | `iQ-R`, `R` |
| 17 | 三菱Q(内蔵Ethernet) | `Q` |
| 18 | 三菱L(内蔵Ethernet) | `L` |
| 19 | 三菱iQ-F(内蔵Ethernet) | `iQ-F` |
| 20 | 三菱iQ-L(内蔵Ethernet) | `iQ-L` |
| 22 | 三菱Q(Ethernetユニット) | `Q-EU` |
| 23 | 三菱L(Ethernetユニット) | `L-EU` |
| 25 | 三菱A/AnS(Ethernetユニット) | `A`, `AnS` |
| 26 | 三菱FX3(Ethernetブロック・アダプタ) | `FX3` |
| 30 | SLMP対応機器(QnA互換3Eフレーム) | `SLMP` |

## ポート番号規則の早見表

PDF p.222 の表に基づく。**コード 16-23 は `port` / `local_port` の指定不可（CSV上は空欄必須）**。

| 機器種別 | port (相手) | local_port (自局) |
|---------|------------|-------------------|
| 16, 17, 18, 19, 20, 22, 23 | 空欄必須 | 空欄必須 |
| 25 (A/AnS) | 256 ～ 65534 | 1～4999, 5010～65534 |
| 26 (FX3) | 1025～5548, 5552～65534 | 1～4999, 5010～65534 |
| 30 (SLMP) | 1～4999, 5010～65534 | 1～4999, 5010～65534 |

注意: PDF p.222 の表は `自局ポート番号` 列がセル結合されており、A/AnS / FX3 / SLMP の3行で同じ値（`1～4999, 5010～65534`）を共有している。`port` (相手側) は機器種別ごとに異なる。
**SLMP の port は 5000～5009 の隙間がNG** で、ここを指定すると GX Works3 がインポート時に行を破棄する。

## ビットデバイスの絶対制約 ⚠️

PDF p.224 が明示する **絶対制約**:

- **ビットデバイスの先頭は `0` または `16の倍数`**（`M5` は不可、`M0`/`M16`/`M32` はOK）
- **ビットデバイスの点数は `16の倍数`、最小 16、最大 8192**
- **ワードデバイスの点数は最大 512**
- **1設定の点数 ≤ 512ワード**（ビット n 点 = n/16 ワード換算）
- **全64設定の合計 ≤ 8192ワード**

これらは生成時にハードフェイルする。

## 通信パターンとデバイス側の対応関係

「自局」と「交信相手」のどちらが転送元・転送先になるかは `pattern` で決まる:

| pattern | src(転送元) | dst(転送先) |
|---------|------------|------------|
| `Read` (読出) | 交信相手 | 自局 |
| `Write` (書込) | 自局 | 交信相手 |

タイマ／積算タイマ／カウンタの **接点・コイル(TS/TC/STS/STC/CS/CC)** は方向制約あり:
- 交信相手側に置けるのは **Read時のみ**（接点は読出専用）
- 自局側に置けるのは **Write時のみ**

## CPUユニット側の事前設定（CSVには現れないが必要）

CSVをインポートしただけでは動作しない。実機側で以下も必要（PDF p.221, 223参照）:

1. ユニットパラメータ「応用設定」→「シンプルCPU通信設定」→「シンプルCPU通信使用有無」を **使用する** に設定
2. 自局の自ノード設定（IPアドレス、サブネットマスク、デフォルトゲートウェイ）
3. 交信相手機器側の事前設定（PDF p.223 表参照、相手機器ごとに異なる）
4. CPUユニットへ書込み後、**リセットまたは電源OFF→ON** で通信開始

リモートパスワードが設定された交信相手にはシンプルCPU通信は実行できない（PDF p.241）。

## 二重化システム（プロセスCPU）の場合

PDF p.236-240 参照。

- A系・B系で異なるIPアドレス（`自ノード設定`の`IPアドレス`(A系) と `二重化設定`の`B系IPアドレス`）を持つ
- 交信相手が **三菱FX3 / 三菱A/AnS** の場合、A系用とB系用で **異なるポート番号** を設定する必要あり（同IPに対し同ポート不可）
- そのため、同一交信相手に対し設定No.1（A系用）と設定No.2（B系用）を別々に作る

このスキルは単体ではA系／B系を意識しないので、二重化用CSVを作る場合は2件の設定として記述する。

## 詳細仕様への参照

- バイトレベルのCSV構造・カラム並び・基数規則 → `references/csv_format.md`
- 全バリデーション規則の網羅的列挙 → `references/validation_rules.md`
- 機器種別ごとのデバイス範囲（プログラムから参照） → `scripts/device_ranges.json`

デバイスの **概念的な知識**（分類体系・グローバル/ローカル区分・ラッチ・インデックス修飾など）が必要な場合は姉妹Skill `melsec-iqr-device-overview` を、**個別デバイスの数値スペック**（点数・範囲・基数）の補強情報が必要な場合は `melsec-iqr-device-specifications` を併用すること。

## トラブルシューティング

| 症状 | 確認ポイント |
|------|-------------|
| GX Works3 でインポート時にエラー | エンコードがUTF-16LE+BOMか、行区切りCRLFか、全セル `"` 囲みか |
| インポート後パラメータ書込みできない | 「応用設定→シンプルCPU通信設定→使用有無」が「使用する」になっているか |
| 通信が開始しない | CPUのリセット／電源OFF→ON済みか、相手機器の事前設定（p.223）が済んでいるか |
| `エラーコードCFB4H` が格納される | 交信相手 (FX3 / A/AnS) からの異常応答 — 異常応答コードバッファメモリ参照 |
| 実行間隔が設定値より長くなる | 他通信機能との同時実行で遅延 — TCPに切替えるか実行間隔に余裕を持たせる (PDF p.241) |
| 初回交信が始まらない | 初回交信設定が `Disable` で交信相手未起動だった可能性 — `Enable` に変更 |
