Files
weinviews-unitouch/界面开发记录.md
T
admin 04aa36be43 重置:仅保留最新版本快照
原 master 12f4831「更新工程/XD/素材 (x1Y2, 组1982)」。仓库瘦身:历史合并为单一根提交;unitouch.cxob(EB Pro 编译产物)不再入库。
2026-09-25 12:38:39 +08:00

568 lines
24 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# JOYEA 触摸屏开发记录(CMT2167X / EasyBuilder Pro 6.10)
工程目录:`E:\AiCodeGitea\weinveiw-touch` | 远程:`http://124.220.63.9:30000/admin/weinviews-unitouch.git`
## 1. 目标与环境
- 硬件:WEINTEK **CMT2167X**,1920×1080,arm64,24VDC。
- 软件:**EasyBuilder Pro 6.10.02.421**。
- 通讯/设备:与现有 `unitouch` 工程一致(不改 PLC 与地址映射)。
## 2. 工程资产
| 文件 | 说明 |
| --- | --- |
| `unitouch.cmtp`(+ bak1~3) | EB Pro 工程文件 |
| `unitouch.cxob` | 编译输出(gzip→tar:`config`/`mt8000/project`/`runtime`/`fonts`) |
| `unitouch.debug` | 调试数据 |
| `lwaddr.xls` / `lwaddr.csv` | 系统地址大全(1429 条,查系统寄存器用) |
| `制丸线HMI界面UniTouch布局202500915.xd` | XD 设计源(18 画板) |
| `msg-login.txt` | 登录提示宏源码(记事本复制用) |
`config`:`MachineIds=[216702]` / `Resolution=1920x1080` / `SocType=arm64`。
XD 画板:`A_start`、`B_PID`、`C_运行1~3`、`D_点动1/2`、`E_配方1~3`、`F_设备参数2`、`G_清洗主机1`、`H_报警1`、`I_数据1~3`、`J_关于`。
## 3. 窗口结构
| 窗口 | 名称 | 用途 |
| --- | --- | --- |
| 4 | — | 白色底窗口(层叠底层) |
| 10 | `start-login` | 启动登录页 |
| 11 | — | 无权限提示弹窗(600×300,位 `LB-110`) |
| 12 | — | 修改时间弹窗(位 `LB-120`) |
| 13 | `about` | 关于(1200×800 弹窗,位 `LB-123`) |
| 14 | `用户管理` | 用户管理弹窗(位 `LB-122`) |
| 15 | — | 删除确认弹窗(位 `LB-121`) |
| 20 | `点检` | 启动点检页(1920×1080 全屏) |
| 100 | `common window joyea` | 公共窗口(顶部栏/导航/常驻元件) |
| 101~128 | `X1Y1` ~ `X4Y7` | 主画面,共 28 个 |
## 4. 命名与导航
- 画面名:`X{段}Y{功能}_{工艺段}_{功能}`
- **X(工艺段)**:`X1 配料/上料`、`X2 制丸1`、`X3 制丸2`、`X4 清洗`
- **Y(功能)**:`Y1 初始状态`、`Y2 运行`、`Y3 配方`、`Y4 设备参数`、`Y5 I/O监控`、`Y6 报警`、`Y7 数据趋势`
- **窗口号**:`WIN = 101 + (X-1)*7 + (Y-1)`(101~128)
- **导航机制**:按钮宏把 X/Y 与目标窗口号写入 `LW-0/1/2`,由 **PLC 控制元件「切换基本窗口」**(触发地址 `LW-2`,回写 `LW-3`)执行切窗。
- 顶部「运行/点动」为全局状态,暂不参与 X/Y 导航。
## 5. 地址规划
### 5.1 导航 / 公共
| 地址 | 用途 |
| --- | --- |
| `LW-0` | X(1~4) |
| `LW-1` | Y(1~7) |
| `LW-2` | 目标窗口号(PLC 控制元件触发地址) |
| `LW-3` | 当前窗口号(PLC 控制元件回写) |
| `LW-9222` | 当前登录用户类别位(bit0=A 工程师 / bit1=B 管理员 / bit2=C 上料 / bit3=D 制丸;0=未登录) |
### 5.2 弹窗 / 状态位
| 位 | 用途 |
| --- | --- |
| `LB-110` | 无权限提示弹窗(→ 11 号窗) |
| `LB-120` | 修改时间弹窗(→ 12 号窗) |
| `LB-121` | 删除确认弹窗(→ 15 号窗) |
| `LB-122` | 用户管理弹窗(→ 14 号窗) |
| `LB-123` | 关于弹窗(→ 13 号窗) |
| `LB-131` | 三个 PLC 联机汇总(触发条件 AND → 位状态指示灯) |
### 5.3 控制地址(高级安全模式)
| 地址 | 用途 |
| --- | --- |
| `LW-100` | 命令(见 5.4) |
| `LW-101` | 命令结果(结果码见 5.5) |
| `LW-102` | 用户索引(列表选中 / 读剩余时间的结果) |
| `LW-103` | 用户权限位(bit0=A / bit1=B / bit2=C / bit3=D) |
| `LW-104`~`111` | 用户名(ASCII,8 words) |
| `LW-112`~`119` | 密码(ASCII,8 words) |
### 5.4 `LW-100` 命令表
| 值 | 命令 | 配合地址 |
| --- | --- | --- |
| `1` / `2` | 名称登入 / **索引登入** | `LW-104`+`LW-112` / **`LW-102`+`LW-112`** |
| `3` | 注销 | — |
| `4` | 改当前账号密码 | 名=原密码、密=新密码 |
| `5` | **新增** | `LW-104`+`LW-112`+`LW-103` |
| `6` / `15` | 新增临时账号(分/天) | 上述 + `LW-102`=有效期(0=永久) |
| `7` / `8` | 名称删除 / **索引删除** | `LW-104` / **`LW-102`** |
| `9` / `10` | 名称设权限 / **索引设权限** | +`LW-103` |
| `11` / `12` | 名称设密码 / **索引设密码** | +`LW-112` |
| `13` / `14` | 名称读权限 / **索引读权限** | 结果→`LW-103` |
| `16` / `17` | 新增限期账号(分/天) | 有效期不得为 0 |
| `18`~`21` | 读剩余分钟/天数 | 结果→`LW-102` |
### 5.5 `LW-101` 结果码
| Hex | 含义 | 排查 |
| --- | --- | --- |
| `01` | 成功 | — |
| `02` | 错误命令 | `LW-100` 值无效 |
| `04` | 账户已存在 | `LW-104` 重名 |
| `08` | 账户不存在 | `LW-104`/`LW-102` 对不上 |
| `10` | 密码错误 | `LW-112` 内容 |
| `20` | 命令无法执行 | 删当前账号 / `admin` |
| `40` | 名称不合法 | `LW-104` |
| `80` | 密码含无效字符 | `LW-112` |
| `100` / `200` | 导入无效 / 超期 | U 盘 / 安全密钥 |
### 5.6 提示 / 点检 / 时间
| 地址 | 用途 |
| --- | --- |
| `LW-260` | 登录提示字符串(字符框 16 words) |
| `LW-261` | 登录提示**字符串表编号**(0 空 / 1 成功 / 2 不存在 / 3 密码错 / 4 无法执行 / 5 名称不合法 / 6 密码无效 / 7 登录失败) |
| `LW-20` | 点检位(`LW_Bit-2000`~`2008` 设备状态 9 项;`LW_Bit-2009`/`2010` 物料状态 2 项;全勾=`2047`) |
| `LW-9017`~`9022` | RTC:秒/分/时/日/月/年(写入即设置时间) |
| `LW-40`~`45` | 改时间暂存:秒/分/时/日/月/年 |
### 5.7 网络 / 版本(关于页)
| 项目 | 地址 | 元件 |
| --- | --- | --- |
| HMI IP | `LW-9129`~`9132` | 数值 ×4(16-bit,3 位) |
| 子网掩码 | `LW-10750`~`10753` | 数值 ×4 |
| 网关 | `LW-9125`~`9128` | 数值 ×4 |
| MAC | `LW-9135`(6 words) | **字符元件,字长 6** |
| 以太网端口 | `LW-9133` | 数值 |
| DNS | `LW-10804`~`10807` | 数值 ×4 |
| 连接速度 | `LW-10815` | 数值(0 失败/10/100/1000) |
| DHCP | `LW-10812` | 数值(0 关/1 开) |
| 程序版本 | `LW-9120` | 数值 **32-bit** |
| OS 版本 | `LW-9026`/`9027`/`9028` | 数值(年/月/日) |
| 工程名称 | `LW-9100`(14 words) | 字符,字长 14 |
| 工程编译日期 | `LW-9122`/`9123`/`9124` | 数值(年/月/日) |
| HMI 名称 | `LW-10884`(16 words) | 字符,字长 16 |
| HMI 机型 ID | `LW-9054` | 数值 **32-bit** |
| HMI 识别码 | `LW-9046` | 数值 **32-bit** |
| 工程文件大小 | `LW-9118` | 数值 32-bit(K bytes) |
| 工程校验和 | `LW-12752`(16 words) | 字符,字长 16 |
> 网络写回控制位:`LB-12041` 刷新、`LB-12094`/`LB-12095` 更新(写 IP/掩码/网关后置 ON)、`LB-12822` 桥接模式。
## 6. 宏清单
> 命名:导航/权限类 = `btn-*`、登录 = `main-init`/`btn-login-index`/`logout`、用户管理 = `usr-*`、点检 = `insp-*`、时间 = `open-time`/`set-time`/`close-time`/`-`、提示 = `msg-login`、弹窗 = `close-msg`。
> 权限判定统一用 `LW-9222` 的类别位(`GETBIT` 取值 + `if`,不用 `and`/`&`)。
**`main-init`**(开机执行一次)
```
macro_command main()
short x = 1, y = 1, win = 0
SetData(x, "Local HMI", LW, 0, 1)
SetData(y, "Local HMI", LW, 1, 1)
SetData(win, "Local HMI", LW, 2, 1)
end macro_command
```
**`btn-x1`**(X1,权限 A/B/C) x2/x3 换 `x = 2`/`3` 且取位改为 A/B/D;`btn-x4` 换 `x = 4` 且取 A/B/C/D
```
macro_command main()
short cls = 0, x = 1, y = 0, win = 0, ok = 0
short pop = 1
short bA = 0, bB = 0, bC = 0
GetData(cls, "Local HMI", LW, 9222, 1)
GETBIT(cls, bA, 0)
GETBIT(cls, bB, 1)
GETBIT(cls, bC, 2)
if bA == 1 then
ok = 1
end if
if bB == 1 then
ok = 1
end if
if bC == 1 then
ok = 1
end if
if ok == 1 then
SetData(x, "Local HMI", LW, 0, 1)
GetData(y, "Local HMI", LW, 1, 1)
win = 101 + (x - 1) * 7 + (y - 1)
SetData(win, "Local HMI", LW, 2, 1)
else
SetData(pop, "Local HMI", LB, 110, 1)
end if
end macro_command
```
**`btn-y1`**(Y1~Y3 全开放:取 A/B/C/D) Y4~Y7 仅 A/B:只取 `bA`/`bB`
```
macro_command main()
short cls = 0, x = 0, y = 1, win = 0, ok = 0
short pop = 1
short bA = 0, bB = 0, bC = 0, bD = 0
GetData(cls, "Local HMI", LW, 9222, 1)
GETBIT(cls, bA, 0)
GETBIT(cls, bB, 1)
GETBIT(cls, bC, 2)
GETBIT(cls, bD, 3)
if bA == 1 then
ok = 1
end if
if bB == 1 then
ok = 1
end if
if bC == 1 then
ok = 1
end if
if bD == 1 then
ok = 1
end if
if ok == 1 then
SetData(y, "Local HMI", LW, 1, 1)
GetData(x, "Local HMI", LW, 0, 1)
win = 101 + (x - 1) * 7 + (y - 1)
SetData(win, "Local HMI", LW, 2, 1)
else
SetData(pop, "Local HMI", LB, 110, 1)
end if
end macro_command
```
**`btn-login-index`**(登录:索引登入 → 按组定位;`31` 为 `msg-login` 的宏编号)
```
macro_command main()
short cmd = 2, res = 0, cls = 0, x = 1, y = 1, win = 0
short bA = 0, bB = 0, bC = 0, bD = 0
SetData(cmd, "Local HMI", LW, 100, 1)
DELAY(2000)
GetData(res, "Local HMI", LW, 101, 1)
ASYNC_TRIG_MACRO(31)
if res == 1 then
GetData(cls, "Local HMI", LW, 9222, 1)
GETBIT(cls, bA, 0)
GETBIT(cls, bB, 1)
GETBIT(cls, bC, 2)
GETBIT(cls, bD, 3)
if bD == 1 then
x = 2
end if
if bA == 1 then
x = 1
end if
if bB == 1 then
x = 1
end if
if bC == 1 then
x = 1
end if
win = 101 + (x - 1) * 7 + (y - 1)
SetData(x, "Local HMI", LW, 0, 1)
SetData(y, "Local HMI", LW, 1, 1)
SetData(win, "Local HMI", LW, 2, 1)
end if
end macro_command
```
**`logout`**(注销并回登录页;10 号窗「打开窗口时执行」也用它)
```
macro_command main()
short cmd = 3, win = 10, z = 0
SetData(cmd, "Local HMI", LW, 100, 1)
SetData(z, "Local HMI", LW, 0, 1)
SetData(z, "Local HMI", LW, 1, 1)
SetData(win, "Local HMI", LW, 2, 1)
end macro_command
```
**`msg-login`**(把 `LW-101` 结果码转成字符串表编号 → `LW-261`)
```
macro_command main()
short res = 0, idx = 0
GetData(res, "Local HMI", LW, 101, 1)
idx = 7
if res == 1 then
idx = 1
end if
if res == 8 then
idx = 2
end if
if res == 16 then
idx = 3
end if
if res == 32 then
idx = 4
end if
if res == 64 then
idx = 5
end if
if res == 128 then
idx = 6
end if
if res == 0 then
idx = 0
end if
SetData(idx, "Local HMI", LW, 261, 1)
end macro_command
```
**`close-msg`**(关闭无权限提示窗)
```
macro_command main()
short z = 0
SetData(z, "Local HMI", LB, 110, 1)
end macro_command
```
**用户管理 `usr-*`**
| 宏 | 命令 | 说明 |
| --- | --- | --- |
| `usr-init` | — | 14 号窗「打开窗口时执行」:清 `LW-104`/`LW-112`/`LW-103`/`LW-101`,清 `LB-121` |
| `usr-open` | — | 顶部按钮:仅 B/admin → 置 `LB-122` |
| `usr-back` | — | 清 `LB-122` |
| `usr-add` | `5` | 新增(`LW-104`+`LW-112`+`LW-103`) |
| `usr-del` | — | 置 `LB-121` 弹确认 |
| `usr-del-ok` | `8` | 按索引删除 |
| `usr-del-cancel` | — | 清 `LB-121` |
| `usr-getlevel` | `14` | 按索引读权限 → `LW-103` |
| `usr-setlevel` | `10` | 按索引设权限 |
| `usr-setpwd` | `12` | 按索引设密码 |
```
macro_command main()
short cmd = 14
SetData(cmd, "Local HMI", LW, 100, 1)
end macro_command
```
> 其余 `usr-*` 同上模板:`cmd` = 5 / 8 / 10 / 12;`usr-open`/`usr-back`/`usr-del`/`usr-del-cancel`/`usr-init` 见 6.21.5。
**点检 `insp-*`**
`insp-init`(20 号窗「打开窗口时执行」)
```
macro_command main()
short z = 0
SetData(z, "Local HMI", LW, 20, 1)
end macro_command
```
`insp-next`(可选:11 项全勾才进主画面)
```
macro_command main()
short v = 0, cls = 0, x = 1, y = 1, win = 0
short bA = 0, bB = 0, bC = 0, bD = 0, np = 1
GetData(v, "Local HMI", LW, 20, 1)
if v == 2047 then
GetData(cls, "Local HMI", LW, 9222, 1)
GETBIT(cls, bA, 0)
GETBIT(cls, bB, 1)
GETBIT(cls, bC, 2)
GETBIT(cls, bD, 3)
if bD == 1 then
x = 2
end if
if bA == 1 then
x = 1
end if
if bB == 1 then
x = 1
end if
if bC == 1 then
x = 1
end if
win = 101 + (x - 1) * 7 + (y - 1)
SetData(x, "Local HMI", LW, 0, 1)
SetData(y, "Local HMI", LW, 1, 1)
SetData(win, "Local HMI", LW, 2, 1)
else
SetData(np, "Local HMI", LB, 110, 1)
end if
end macro_command
```
**修改时间**
| 宏 | 触发 | 作用 |
| --- | --- | --- |
| `open-time` | 时钟上透明按钮(仅 B) | 读 `LW-9017`~`9022` → `LW-40`~`45`,置 `LB-120` |
| `set-time` | 12 号窗「设定」 | `LW-40`~`45` → `LW-9017`~`9022`(设置 RTC),清 `LB-120` |
| `close-time` | 12 号窗「取消」 | 清 `LB-120` |
```
macro_command main() // set-time
short v[6] = {0,0,0,0,0,0}
short z = 0
GetData(v[0], "Local HMI", LW, 40, 6)
SetData(v[0], "Local HMI", LW, 9017, 6)
SetData(z, "Local HMI", LB, 120, 1)
end macro_command
```
## 7. 各页面要点
### 7.1 登录页(10 号窗)
- 项目选单(来源=用户账号)→ 写 `LW-102`;密码字符输入(勾系统键盘)→ `LW-112`。
- 底部字符框读 `LW-260`(或文字元件用字符串表,编号 `LW-261`)。
- 「登录」按钮 → `btn-login-index`。
- 窗口属性 → 「打开窗口时执行」= `logout`(每次回来强制重新登录)。
- 顶部账户显示读 `PLW-10754`,上面盖透明功能键 → 长按 1s(安全页最少按键时间=1)→ `logout`。
### 7.2 公共窗口(100 号窗)
- 顶部:品牌、页签、`?`/首页/用户/报警图标;右上角「日期/时间」元件。
- PLC 联机:触发条件(3 台联机位 AND)→ `LB-131` → 位状态指示灯。
- 直接窗口 ×5:`LB-110`→11、`LB-120`→12、`LB-121`→15、`LB-122`→14、`LB-123`→13。
- 入口按钮:点检(功能键→切换基本窗口=20);关于(仅 A,安全页操作类别=类别 A);用户管理(`usr-open`)。
- X/Y 导航按钮:`btn-x1~x4`、`btn-y1~y7`。
### 7.3 用户管理(14 号窗,1200×800 弹窗)
见 6.21.10:列表(`LW-102`)+ 用户名/密码 + 4 个权限开关(`LW_Bit-10300~10303`)+ 读取权限/修改权限/修改密码/删除/新增/关闭 + 结果 `LW-101`。
只读管理员(B/admin)可用;改权限前先「读取权限」。
### 7.4 点检(20 号窗,1920×1080)
- 布局按 XD `B_PID`:左「设备状态」9 项、右「物料状态」2 项(`LW_Bit-2000~2010`),右侧两个提示框,右下插画 `pic/pid-illustration.png`。
- 「关闭」= 功能键 → 返回上一个窗口;「下一步」= `insp-next`。
- 点检暂不强制。
### 7.5 关于(13 号窗,1200×800 弹窗)
- 字段与地址见 5.7;`LB-123` 弹窗。
- 入口仅工程师(A)。
### 7.6 修改时间(12 号窗)
- 6 个数值输入(`LW-40`~`45` 秒/分/时/日/月/年)+ 设定/取消。
- 入口:100 号窗时钟上透明功能键(仅 B)→ `open-time`。
### 7.7 主画面(101~128)
- 每个画面 = 某工艺段 × 某功能组合,底图按 XD/`pic` 素材放置,控件按各功能需求(待逐个设计)。
### 7.7 主画面设计
#### 7.7.1 X1Y1(配料/上料 · 初始状态)完整操作表
> 地址栏留空(`__`)处待 PLC 工程师填写;元件先建好、地址后补。
**布局(1920×1080;内容区 x 110~1900,y 90~1000)**
| # | 区域 | 控件 | 元件 | 地址 | 位置(x,y) | 尺寸 |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | 批次行 | 「产品配方」标签 | 文字 | — | 190,110 | — |
| 2 | 批次行 | 产品配方 | `数值输入` | `LW-__` | 250,105 | 210×44 |
| 3 | 批次行 | 选择 | `功能键` / `位状态设置` | `LB-__` | 470,105 | 90×46 |
| 4 | 批次行 | 「料次」标签 | 文字 | — | 580,110 | — |
| 5 | 批次行 | 料次 | `数值输入` | `LW-__` | 640,105 | 100×44 |
| 6 | 批次行 | 「批号」标签 | 文字 | — | 760,110 | — |
| 7 | 批次行 | 批号(存储) | `字符输入`(8 words) | `RW-__` | 820,105 | 220×44 |
| 8 | 批次行 | 「报警信息」标签 | 文字 | — | 1060,110 | — |
| 9 | 批次行 | 报警信息 | `报警条`(一行滚动) | 事件登录 | 1140,105 | 500×44 |
| 10 | 批次行 | 变频器复位 | `功能键` / `位状态设置` | `LB-__` | 1700,105 | 180×46 |
| 11 | 流程1组 | 节点1~6 | `多状态指示灯` | `LW-__` ×6 | x=680/850/1020/1190/1360/1530,y=300 | 160×56 |
| 12 | 流程1组 | 节点1~6 修正 | `数值输入`(仅工程师) | 同节点地址 | 同 x,y=362 | 100×40 |
| 13 | 状态区 | 圆形开关 | `位状态指示灯` | `LB-__` | 700,430 | 80×50 |
| 14 | 状态区 | 进度条 | `棒图`(0~100) | `LW-__` | 250,470 | 400×20 |
| 15 | 状态区 | 「投料 / 输送1」标签 | 文字 | — | 250,435 | — |
| 16 | 流程2组 | 节点7~12 | `多状态指示灯` | `LW-__` ×6 | 同 x,y=560 | 160×56 |
| 17 | 流程2组 | 节点7~12 修正 | `数值输入`(仅工程师) | 同节点地址 | 同 x,y=622 | 100×40 |
| 18 | 状态区 | 圆形开关 | `位状态指示灯` | `LB-__` | 700,690 | 80×50 |
| 19 | 状态区 | 进度条 | `棒图`(0~100) | `LW-__` | 250,730 | 400×20 |
**节点状态配色(多状态指示灯「状态设置」)**
| 值 | 含义 | 颜色/图片 |
| --- | --- | --- |
| 0 | 未开始 | 灰 |
| 1 | 进行中 | 绿 |
| 2 | 已完成 | 蓝 |
| 3 | 异常 | 红 |
**操作步骤(从上到下逐个做)**
**0. 准备**
1. 打开 **101 号窗口**(X1Y1)。
2. `工程文件 → 地址`(地址标签库)建标签(地址先用占位,PLC 给了再换):
产品配方 `LW-330`、料次 `LW-331`、批号 `RW-0`、节点状态 `LW-300`~`311`、进度 `LW-320`/`321`、圆形开关 `LB-300`/`301`、选择 `LB-311`、变频器复位 `LB-310`。
**① 批次信息行(y≈105)**
3. `元件 → 绘图 → 文字/批注` 放 4 个标签:「产品配方」`(190,110)`、「料次」`(580,110)`、「批号」`(760,110)`、「报警信息」`(1060,110)`。
4. 产品配方:`元件 → 输入 → 数值`,地址 `LW-330`,`(250,105) 210×44`;属性「数值输入」页勾 **系统键盘**。
5. 料次:`数值输入`,地址 `LW-331`,`(640,105) 100×44`,勾系统键盘。
6. 批号:`元件 → 输入 → 字符`,地址 **`RW-0`**、字长 8,`(820,105) 220×44`,勾系统键盘(`RW` 掉电保持 → 自动保存)。
7. 「选择」:`元件 → 按钮/开关 → 功能键`,动作选 `位状态设置` 或 `宏指令`,写 `LB-311`,`(470,105) 90×46`;「图片」标签可设按钮底图。
8. 「变频器复位」:`功能键`,写 `LB-310`,`(1700,105) 180×46`。
9. 报警信息:`元件 → 报警 → 报警条`,`(1140,105) 500×44`(报警来源见 ⑥)。
**② 流程节点(两组 × 6)**
10. `元件 → 指示灯 → 多状态指示灯`,放 6 个:`x = 680 / 850 / 1020 / 1190 / 1360 / 1530`,`y = 300`,`160×56`;地址 `LW-300`~`305`。
11. 「状态设置」给 4 个状态配图/色:`0` 灰(未开始)、`1` 绿(进行中)、`2` 蓝(完成)、`3` 红(异常)。
12. 复制这 6 个到第二组 `y = 560`,地址改 `LW-306`~`311`。
**③ 节点人工修正(显示+可改都用同一地址)**
13. `元件 → 输入 → 数值`,放在每个节点下方:同 `x`、`y = 362`、`100×40`;地址=对应节点状态字(`LW-300`~`305`)。
14. 属性 **「安全」页 → 操作类别 = 类别 A(工程师)**(只有工程师能改);可勾 **「操作前先确认」** 防误改。
15. 第二组同样:`y = 622`,地址 `LW-306`~`311`。
**④ 圆形开关**
16. `元件 → 指示灯 → 位状态指示灯`,`(700,430) 80×50`,地址 `LB-300`;状态 `0`/`1` 各配一张圆图(灰/绿)。
17. 第二组 `(700,690)`,地址 `LB-301`。
**⑤ 进度条**
18. `元件 → 图例 → 棒图`,`(250,470) 400×20`,地址 `LW-320`,方向横向、范围 `0~100`、绿色。
19. 上方加文字「投料 / 输送1」`(250,435)`。
20. 第二组 `(250,730)`,地址 `LW-321`。
**⑥ 报警**
21. `工程文件 → 事件/报警` 新建报警条目(地址、触发条件、显示文字、颜色)。
22. 本页用 **报警条**(步骤 9)做滚动提示;完整列表与**确认**放在 **Y6 报警表页**(见 7.7.2)。
**⑦ 收尾**
23. 各元件「安全」页按需限制操作类别(只显示/只工程师可改)。
24. 保存编译;等 PLC 地址到位后,把占位地址逐个替换即可,元件与布局不动。
**底部 X 页签**:由 100 号公共窗口的 4 个功能键实现(配料/制丸1/制丸2/清洗 → 切换基本窗口)。
#### 7.7.2 Y6 报警表页面(106 / 113 / 120 / 127)
> Y6 = 报警功能;各工艺段各有一个报警表页:`106`(配料/上料)、`113`(制丸1)、`120`(制丸2)、`127`(清洗)。
| 控件 | 元件 | 关键设置 |
| --- | --- | --- |
| 报警列表 | **报警显示**(或事件显示) | 显示全部/未确认报警,**一行一条**,可上下滚动/翻页 |
| 顶部滚动条 | **报警条** | 一行滚动显示最新报警(同 X1Y1 的报警行) |
| 报警确认 | 报警显示元件属性 → **「确认地址」** = `LW-__` | 操作员确认时,系统把该报警的**确认值**写入此地址(PLC 可读,用于联动/记录) |
| 清除(当前记录) | `位状态设置` → **`LB-9021`**(OFF→ON 重置当前事件记录) | 系统位 |
| 删除事件记录文件 | `位状态设置` → **`LB-9023`**(删除 HMI 内存全部事件记录) | 系统位 |
| 翻页 / 确认按钮 | 报警显示元件自带按钮,或自定义功能键 | — |
**做法**
1. `工程文件 → 事件/报警` 里逐条建立报警(地址、触发条件、文字、颜色、类别)。
2. 在 Y6 页放 **报警显示** 元件(多行列表);X1Y1 等页放 **报警条** 元件(一行滚动)。
3. 报警显示的属性里设 **确认地址**,并为每条报警配**确认值** → 操作员确认后写回该地址给 PLC。
4. 需要"清除"按钮就放 `位状态设置` 写 `LB-9021`(重置)/`LB-9023`(删除文件)。
5. 4 个 Y6 页可共用同一套事件登录,也可按**类别**过滤(配料/制丸/清洗各自的报警)。
### 7.8 弹窗规范(统一用直接窗口)
- 所有弹窗(11/12/13/14/15)都用 **直接窗口**元件,放在 **100 号公共窗口**,由触发位置位弹出。
- **关键**:直接窗口元件属性里的 **「重叠」必须选「独立窗口」**(cMT/cMT X),否则子窗口画在公共窗口那一层,会被主画面元素盖住;选「独立窗口」后显示在当前画面之上。
- 弹窗内容做在各自窗口里;关闭用宏清位(如 `close-msg` 清 `LB-110`)。
| 弹窗 | 触发位 | 窗口号 |
| --- | --- | --- |
| 无权限提示 | `LB-110` | 11 |
| 修改时间 | `LB-120` | 12 |
| 关于 | `LB-123` | 13 |
| 用户管理 | `LB-122` | 14 |
| 删除确认 | `LB-121` | 15 |
## 8. 素材清单(`pic/`)
| 素材 | 说明 |
| --- | --- |
| `common-bg.png` / `bottom-y.png` | 早期背景与按钮底板 |
| `white-bg.png` | 1920×1080 纯白底 |
| `transparent.png` | 240×48 全透明(透明功能键底图) |
| `start-bg.png` / `start-equip.png` | 启动屏厂区航拍 / 设备渲染 |
| `pid-illustration.png` / `btn-back.png` / `btn-next.png` / `pid-logo.png` | 点检页素材(取自 XD `B_PID`) |
| `lwaddr.csv` | 系统地址大全 |
## 9. 变更记录(里程碑)
| 日期 | 内容 |
| --- | --- |
| 09-23 | 解包分析现有工程;确定机型/分辨率/运行时与 XD 设计源 |
| 09-23 | 建立窗口骨架与命名规则(X1~X4 × Y1~Y7 → 101~128) |
| 09-23 | 导航机制落地:宏算 `LW-2` + PLC 控制元件切换基本窗口 |
| 09-23 | 完成登录页、权限控制(`LW-9222`)、按钮宏与无权限弹窗 |
| 09-24 | 完成用户管理(索引命令)、点检页、关于页、修改时间、PLC 联机状态、登录提示框 |
| 09-24 | 文档精简;准备开始 28 个主画面的设计 |