连接列表与标签列表
在一个画面中查看网关已知的所有 OPC(连接)列表 及其内部的 标签列表 — 启动 / 停止 / 编辑 / 删除 / 写入值 / 立即读取,这是操作的核心画面。

首页卡片 已连接列表 (N) → 点击,或直接进入 http://<gateway>/ui/connect/list。
1. 画面结构
┌────────────────────────────────────────────────────────────────┐
│ ⊙ 연결 목록 [←] [↻] [+ 연결 추가] │
├────────────────────────────────────────────────────────────────┤
│ [OPC 목록 테이블 — 14개 컬럼] │
│ PLC | 프로토콜 연결상태 OPC ID ... 수집상태 액션 │
│ ───────────────────────────────────────────────────────── │
│ (행 클릭 → 아래 태그 테이블 채워짐 / 행 하이라이트) │
├────────────────────────────────────────────────────────────────┤
│ 선택된 연결의 TAG 목록을 표시합니다 │
│ [태그 목록 테이블 — 14개 컬럼] │
│ ▣ TAG ID TAG 명 ... 마지막 값 업데이트시간 액션 │
└────────────────────────────────────────────────────────────────┘
当选择 MOTOR_SENSE 协议的 OPC 时,代替标签表格的是 HEALTH INDEX / SIGNAL 卡片容器(请参考单独章节)。
2. 顶部栏 — 按钮
| 按钮 | 操作 |
|---|---|
| ←(返回图标) | 返回 /ui/main |
| ↻(同步图标) | connect.search() — 重新查询列表(数据表会自动更新 — 用于强制刷新) |
| + 添加连接(蓝色按钮) | 转到 /ui/connect/connect 添加新连接的画面 |
3. OPC 列表表格(14 列)
/connect/opc/list 数据表绘制 API 结果。
| # | 列 | 含义 / 显示 |
|---|---|---|
| 1 | PLC | 协议 | 各协议的徽标图像 — MELSEC=mitsubishi.png / S7=siemens.png / MODBUS=modbus.svg / OPCUA=opcua.png / EIP=eip.png / LS=ls.png / GE=ge.png / PROFINET=profinet.png / FINS=fins.png / LOGIX=rockwell.png / CANOPEN=canopen.png / HTTP=http.png / OP=op.png / MOTOR_SENSE=MotorSense_Logo.svg |
| 2 | 连接状态 | 圆形徽章 — 🟢 已连接 / 🔴 已断开 / ⬜ 未知(从未启动过) |
| 3 | OPC ID | 唯一 ID(例如:OPC_LS_TEST) — 排序标准(默认升序) |
| 4 | OPC 名称 | 用户自定义名称 |
| 5 | 描述 | 自由备注 |
| 6 | PLC IP | OPC 连接的 PLC IP |
| 7 | PLC 端口 | OPC 端口(LS 2004, S7 102, MODBUS 502 等) |
| 8 | 采集周期 | timecycle(毫秒) — 右对齐,千位逗号分隔 |
| 9 | 自动启动 | 如果是 auto_collect=true 则 ✓,否则 - |
| 10 | 异步 | 如果是 async=true 则 ✓,否则 - |
| 11 | 已连接标签数 | 此 OPC 中注册的标签数量 — 右对齐 |
| 12 | 采集数量 | 累计读取次数(point_count) — 大数字通过水平滚动查看 |
| 13 | 采集状态 | 圆形徽章 — 🟢 正常(scan_status=START,旋转同步图标) / 🟧 异常(NOT COLLECT,警告三角形) / ⬜ 已停止(STOP,停止图标) |
| 14 | 操作 | ▶ 启动 / ⏹ 停止 / 🔧 编辑 / 🗑 删除(4 个图标) |
3.1 操作图标 — 详细信息
| 图标 | 操作 | 调用 |
|---|---|---|
▶ 启动(fa-play) | 开始采集 | connect.start(opcId) → POST /connect/start |
⏹ 停止(fa-stop) | 停止采集(保持 TCP 连接) | connect.stop(opcId) → POST /connect/stop |
🔧 编辑(fa-wrench) | 根据 OPC 类型转到编辑画面(例如:/ui/connect/ls 等,根据 opc_type 分支) | connect.edit(opcId&opcType) |
🗑 删除(fa-trash) | 确认对话框 → 批量删除 OPC 及其子标签 | connect.del(opcId&opcType) |
删除 OPC 时,其底下的标签行也会一并消失。时序数据(Cassandra tm_tag_point) 在 TTL 到期前仍然保留,但不会再有新的读取数据进入。
3.2 连接状态 与 采集状态 的区别
同一个 OPC 的两个状态可能不同:
| 连接 | 采集 | 含义 |
|---|---|---|
| 🟢 已连接 | 🟢 正常 | 正常运行 |
| 🟢 已连接 | 🟧 异常 | TCP 连接仍存活,但读取响应在一定时间内未到达 — 怀疑 PLC 程序 / 地址拼写 / 权限问题 |
| 🟢 已连接 | ⬜ 已停止 | 用户按了 ⏹ 停止 |
| 🔴 已断开 | ⬜ 已停止 | 正常的 未启动 状态 |
| 🔴 已断开 | 🟧 异常 | 曾经运行过,但 PLC 断开 — 检查 IP/端口/防火墙 |
| ⬜ 未知 | ⬜ 已停止 | 仅注册但从未启动过的新 OPC |
4. 选择行 → 标签列表
点击 OPC 行时:
- 该行以 selected 类高亮(其他行取消)
- 调用
connect.tag_list(opcId)→ 获取该 OPC 的标签并显示在下面的 标签列表表格 中 - 如果该 OPC 的
opc_type为MOTOR_SENSE,则显示 HEALTH INDEX / SIGNAL 卡片容器,而不是标签表格
行选择结果存储在
window.__connect_list_selected_opc_id— 标签内联写入时用作 opc_id 参数。
5. 标签列表表格(14 列)
显示选定 OPC 内的标签。最后的值 / 时间 / 读取状态在页面内定期更新(writejs.value() — 单独轮询)。
| # | 列 | 含义 / 显示 |
|---|---|---|
| 1 | (图标) | 标签图标(fa-tag) |
| 2 | TAG ID | 唯一 ID(例如:TAG_LS_TEST_1000) |
| 3 | TAG 名称 | 用户自定义名称 |
| 4 | 描述 | 自由备注 |
| 5 | 数据类型 | Integer / Boolean / Float / Long / String 等 |
| 6 | PLC 地址 | 各协议的 PLC 地址(例如:D1000, ns=2;s=...) |
| 7 | PLC 数据格式 | 格式选项(X / B / W / DW / Float 等 — 用于按驱动进行精确的读/写分支) |
| 8 | 计算 | 计算公式(fomula) — 如 ${VALUE} * 10 这样的简单算术应用 |
| 9 | 采集数量 | 累计读取次数 — 右对齐 |
| 10 | 最后的值 | 最近的值 — 绿色背景 + 白色文字。长文本(STRING/数组)的单元格水平滚动 |
| 11 | 最后更新时间 | 深灰色背景 + 白色文字,精确到毫秒 |
| 12 | 读取状态 | 🟢 SUCCESS(绿色) / 🔴 ERROR(红色) |
| 13 | 读取错误消息 | 仅当状态为 ERROR 时填充 — 红色背景 + 白色文字 |
| 14 | 操作 | ✏ 写入 / 🔄 立即读取(2 个图标) |
5.1 标签操作 — 详细信息
✏ 写入(fa-pen)
一次性向该标签写入值的内联操作。
1. 클릭 → prompt 창: "태그 [<TAG_ID>] 에 쓸 값을 입력하세요"
2. 값 입력 후 OK → confirm: "<OPC_ID> / <TAG_ID> 에 [<VALUE>] 쓰기?"
3. POST /connect/write { tag_id, opc_id, value }
4. 성공 시 toastr: "쓰기 완료: <TAG_ID> = <VALUE>"
5. 서버가 write 직후 같은 connection 으로 즉시 read 한 결과를 함께 반환:
- 동일 ↔ 동일하지 않음 비교 후 추가 안내
"읽기 확인" (info) — 같음 → 정상
"읽기 결과 다름" (warning) — PLC 자체 프로그램이 즉시 덮어쓴 가능성
6. 약 800ms 후 화면의 마지막 값 셀도 자동 갱신
内部根据 PLC 协议进行分支的 ConnectService.tagWriteByTagId()(支持 HTTP / OPC-UA / Modbus / MELSEC / S7 / LS / EIP 全部)。
写入实际设备标签前,请先用 模拟器 OPC 或 测试标签 进行验证。写入权限仅授予与运维团队协商过的标签。
🔄 立即读取(fa-sync-alt)
绕过采集器缓存,直接从 PLC 现在读取。
GET /api/v1/tag/<TAG_ID>/value?fresh=true
→ 성공: toastr.info "지금 읽기: <TAG_ID> = <VALUE>"
→ 값 없음: toastr.warning "읽음 (값 없음): <TAG_ID>"
→ 실패: toastr.error "읽기 실패: ..."
适用于长采集周期的 PLC(例如 30 秒)的手动更新。频繁使用会增加 PLC 负载。
6. MOTOR_SENSE 专用区域
选择 opc_type=MOTOR_SENSE OPC 时,将显示以下内容,而不是标签表格。
6.1 状态信息区域
| 项目 | 含义 |
|---|---|
| 最后更新时间 | MOTOR_SENSE 资产的最新能源数据时间点 |
| 读取状态 | SUCCESS / ERROR |
6.2 HEALTH INDEX 部分
❤ 图标 + 按资产区分的卡片 — 水平滚动。每张卡片包含资产 ID + 测量指标(level, alarm 等)。卡片颜色:浅蓝色背景 + 深蓝色边框。
6.3 SIGNAL 部分
📶 图标 + 按资产区分的卡片 — 水平滚动。时序信号指标。卡片颜色:浅灰色。
即使资产很多,两个部分都只允许水平滚动,禁止垂直滚动,使卡片无限向右延伸。
7. 常见陷阱
| 症状 | 原因 / 解决方法 |
|---|---|
| 单击行但标签表格为空 | 该 OPC 中注册的标签不存在。通过编辑进入添加标签 |
| 已连接 但 采集异常 | 检查地址格式 / 数据类型(格式)/ PLC 写入权限 |
| 最后的值单元格长时间不更新 | 采集周期(timecycle)较长,或 PLC 值未变化 — 用立即读取强制读取 |
| ✏ 写入后出现读取结果不同警告 | PLC 程序在 1 秒内自发覆盖。可能正常(例如锁存线圈等) |
| 最后的值太长难以阅读 | 该单元格会自动出现水平滚动条 — 在单元格内左右滚动 |
| MOTOR_SENSE 卡片为空 | 资产检索尚未完成(/connect/motor-sense/asset-list 未响应) — 稍等片刻或重启 OPC |
| 启动后立即显示采集状态为未知 | 扫描循环尚未完成第一轮 — 等待 timecycle + α 的时间 |
| 删除后重新添加时以未知状态启动 | 正常 — 如果 auto_collect 为开启,则自动转换为已连接 + 正常 |
8. 了解更多
- 添加新连接: 添加新 PLC 连接
- 标签注册 / 编辑: 标签注册
- 查看时序图表: 查看采集历史
- 测试/演示: 使用外部
plantpulse-simulator或测试标签 - 电机感知: 电机感知 (Motor Sense)
- 用代码处理相同数据: REST API, 流程 (Node-RED)