CSV一括アップロード (/ui/connect/csv)
複数のOPC + タグを一度に登録する画面。Excelや外部ツールで定義したタグカタログをそのままimportできます。50タグ以上のサイトでは最速の方法です。
ホーム → プロトコル接続する → 右上の 📥 CSV一括アップロード、または直接 /ui/connect/csv。
1. 画面構成
📥 CSV 일괄 업로드 [← 뒤로] [💾 업로드]
⚠ 주의사항 패널 (빨강)
- CSV 형식 [,로 구분]
- 빈 공백 금지
- 1행 = 헤더 (절대 삭제 금지)
- OPC: 드라이버명/IP/포트 정확히
- TAG: PLC_ADDRESS 정확히 (잘못 입력 시 수집 실패)
- 이미 등록된 TAG_ID → 업데이트 안 함 (중복 무시)
📊 OPC
────────────────
[CodeMirror 에디터 — 150px]
헤더: OPC_ID,OPC_NAME,OPC_TYPE,OPC_AGENT_IP,OPC_AGENT_PORT,TIMECYCLE,ASYNC,AUTO_COLLECT,DESCRIPTION
🏷 TAG
────────────────
[CodeMirror 에디터 — 400px]
헤더: OPC_ID,TAG_ID,TAG_NAME,DATA_TYPE,PLC_ADDRESS,FORMAT,LINKED_ASSET_ID,ALIAS_NAME,DESCRIPTION
2. OPC CSVカラム (9個)
| 順序 | カラム | 意味 | 例 |
|---|---|---|---|
| 1 | OPC_ID | 一意の識別子 (英字/数字/_) | OPC_LS_LINE1 |
| 2 | OPC_NAME | ユーザー表示名 | 라인1 LS PLC |
| 3 | OPC_TYPE | ゲートウェイコード (LS / MELSEC / S7 / MODBUS / OPCUA / EIP / LOGIX / HTTP など) | LS |
| 4 | OPC_AGENT_IP | PLCのIP | 192.168.100.50 |
| 5 | OPC_AGENT_PORT | TCPポート | 2004 |
| 6 | TIMECYCLE | 収集周期(ms) | 1000 |
| 7 | ASYNC | 非同期read | true / false |
| 8 | AUTO_COLLECT | 起動後の自動収集開始 | true / false |
| 9 | DESCRIPTION | 自由メモ | 라인1 메인 PLC |
OPC_TYPE別のポート / IP一覧は PLC種類別ガイド の比較表を参照してください。
3. TAG CSVカラム (9個)
| 順序 | カラム | 意味 | 例 |
|---|---|---|---|
| 1 | OPC_ID | 上記OPC表の OPC_ID とマッチング | OPC_LS_LINE1 |
| 2 | TAG_ID | 一意のID (英字/数字/_) | TAG_LINE1_TEMP |
| 3 | TAG_NAME | ユーザー表示名 | 라인1 온도 |
| 4 | DATA_TYPE | Integer / Long / Float / Double / String / Boolean | Integer |
| 5 | PLC_ADDRESS | ドライバ別のアドレス (例: D00309 LS、DB1.DBW0 S7、holding-register:1 Modbus) | D00309 |
| 6 | FORMAT | 形式の補助 (DW / REAL / STR[10] / BIN[3] など) | DW |
| 7 | LINKED_ASSET_ID | (任意) 資産マッピング | ASSET_PUMP_01 |
| 8 | ALIAS_NAME | (任意) 外部システム用エイリアス | temp_01 |
| 9 | DESCRIPTION | 自由メモ | 라인1 메인 펌프 온도(℃) |
PLC_ADDRESS と FORMAT の正確な入力については PLCアドレス入力 (44ドライバ完全ガイド) を参照してください。
4. 作成例 (実践)
4.1 OPC 2個 + TAG 5個
OPC領域 (ヘッダー + 2行):
OPC_ID,OPC_NAME,OPC_TYPE,OPC_AGENT_IP,OPC_AGENT_PORT,TIMECYCLE,ASYNC,AUTO_COLLECT,DESCRIPTION
OPC_LS_LINE1,라인1 LS PLC,LS,192.168.100.50,2004,1000,false,true,라인1 메인 PLC
OPC_S7_LINE2,라인2 S7 PLC,S7,192.168.100.60,102,1000,false,true,라인2 메인 PLC
TAG領域 (ヘッダー + 5行):
OPC_ID,TAG_ID,TAG_NAME,DATA_TYPE,PLC_ADDRESS,FORMAT,LINKED_ASSET_ID,ALIAS_NAME,DESCRIPTION
OPC_LS_LINE1,TAG_LINE1_TEMP,라인1 온도,Float,D00450,REAL,,,라인1 메인 펌프 온도(℃)
OPC_LS_LINE1,TAG_LINE1_QTY,라인1 누적생산량,Integer,D00600,DW,,,32-bit 누적
OPC_LS_LINE1,TAG_LINE1_RUN,라인1 가동상태,Boolean,M02704,,,,
OPC_S7_LINE2,TAG_LINE2_PRESS,라인2 압력,Float,DB1.DBD0,REAL,,,bar
OPC_S7_LINE2,TAG_LINE2_FAULT,라인2 알람,Boolean,DB1.DBX2.0,,,,
,,, は空のカラム — LINKED_ASSET_ID、ALIAS_NAME は未使用です。
4.2 Excelで作成する
- Excelに上記の表をそのまま貼り付け (ヘッダー1行 + データ)
- 名前を付けて保存 → CSV UTF-8 (カンマ区切り) 形式 (default
cp949では日本語/韓国語が文字化けするので注意) - CSVファイルをテキストエディタで開き、セル内のカンマが自動で引用符(
"...")で囲まれているかを確認 - CSV本文をそのまま OPC 領域または TAG 領域に貼り付け
5. アップロードの流れ
| ステップ | 動作 |
|---|---|
| 1. 💾 アップロード をクリック | POST /connect/csv-upload (body: {opcs, tags} の2つのテキスト) |
| 2. サーバー検証 | ヘッダー / カラム数 / 型 / OPC_IDマッチングの検証 |
| 3. DB登録 | pe.app_opc + pe.app_tag upsert (既存のTAG_IDは更新しない — skip) |
| 4. トースト | 「サーバーを再起動すると、登録したOPC接続およびタグ生成を開始します。」 |
アップロード後 — ゲートウェイキャッシュ (OPCAndTagsCache) が新しいOPC/タグを読み込むよう 再起動を推奨 (bin/restart.sh、約6秒)。自動開始 (AUTO_COLLECT=true) で登録したOPCは再起動後すぐに収集を開始します。
6. よく陥る落とし穴
| 症状 | 原因 / 対処 |
|---|---|
| アップロード後0件 | ヘッダー欠落 / カラム数の不一致 / エンコーディング (UTF-8 BOM) |
| 文字化け | Excelのdefault cp949 で保存している。UTF-8 を強制 — 名前を付けて保存 → CSV UTF-8 |
| 同じTAG_IDが更新されない | 正常動作 — 重複TAG_IDはskip。変更する場合は タグ登録 画面またはREST PUT /api/v1/tag/{tagId} から |
| OPCは登録されたのにTAGが表示されない | TAG CSVの OPC_ID がOPC CSVの OPC_ID と完全に一致していない。大文字小文字 / 空白を確認 |
ASYNC、AUTO_COLLECT がfalseとして処理される | True / TRUE はどちらもOKだが、空セルの場合は false になる。明示的に true を入力 |
| PLC_ADDRESSカラムが空で登録される | CSVのセル内カンマが行を分割している。セル内にカンマがある場合は "..." で引用 |
| 行末に空白 (trailing space) → カラムmismatch | Excel → CSV変換時にtrailing spaceが追加されることがある。テキストエディタで一括trim |
| アップロードは成功するがチャートに値が入らない | OPCを AUTO_COLLECT=false で登録したが、再起動後に開始を押していない。/ui/connect/list の ▶ 開始を実行 |
7. さらに詳しく
- 単件登録 (対話型): タグ登録
- アドレス表記: PLCアドレス入力 (44ドライバ完全ガイド)
- 登録後のリアルタイム監視: 接続一覧 / タグ一覧
- 一括変更 (REST): REST API の
PUT /api/v1/tag/{tagId}を繰り返し実行