CSV 批量上传 (/ui/connect/csv)
用于一次性注册多个 OPC + 标签的界面。可直接导入在 Excel 或外部工具中定义好的标签目录。对于 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 2 个 OPC + 5 个 TAG
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. 服务器校验 | 校验表头 / 列数 / 类型 / 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 均可,但单元格为空时为 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}