6a480e0265
- unitouch.cmtp、XD、素材(x1Y2/X2Y2 相关)更新 - 文档:新增 7.7.3 X2Y2 分区聚焦弹窗(4 区透明键 + 间接窗口 LW-50) - 宏指令新增 area-1~4 / area-close;地址表加 LW-50;表格修正
1089 lines
80 KiB
Markdown
1089 lines
80 KiB
Markdown
# 宏指令(全部,逐行注释)
|
||
|
||
> 摘自同目录 `开发主文件.md` 第 6 章,直接复制到 EB Pro 宏编辑器。
|
||
|
||
## 6. 宏清单
|
||
|
||
> 命名:导航 = `btn-*`、登录 = `main-init`/`btn-login-index`/`logout`、管理员登录 = `admin-open`/`admin-login`/`admin-close`、用户管理 = `user-open` + `usr-*`(你的工程删除类为 `usr-delete*`)、关于窗 = `about-open`/`about-close`、时间 = `open-time`/`set-time`/`close-time`、弹窗 = `close-msg`/`close-nopage`。
|
||
> **登录提示已内联**:`LW-101` 结果码 → `LW-261` 的映射直接写在 `btn-login-index`/`admin-login` 内,零延迟、不轮询、不依赖宏编号。`net-apply` 用宏属性「当 HMI 启动时即执行一次」。
|
||
> 权限判定统一用 `LW-9222` 的类别位(`GETBIT` 取值 + `if`,不用 `and`/`&`)。
|
||
|
||
**`main-init`**(开机执行一次)
|
||
```
|
||
macro_command main() // 宏入口:HMI 启动时执行一次
|
||
short x = 1 // X 初值 = 1
|
||
short y = 1 // Y 初值 = 1
|
||
short win = 0 // 目标窗口号初值 = 0(不切窗)
|
||
short r1 = 127 // X1 段存在位图:bit0=Y1…bit6=Y7,1=有内容(X1 全有 = 127)
|
||
short r2 = 18 // X2 段:只留 Y2/Y5(缺 Y1/Y3/Y4/Y6/Y7)→ 2+16=18
|
||
short r3 = 127 // X3 段:Y1~Y7 全有(X3Y6 已启用)→ 127
|
||
short r4 = 18 // X4 段:只留 Y2/Y5(缺 Y1/Y3/Y4/Y6/Y7)→ 2+16=18
|
||
short one = 1 // 常量 1(默认制丸线别)
|
||
SetData(x, "Local HMI", LW, 0, 1) // X → LW-0
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y → LW-1
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 0 → LW-2(不触发切窗)
|
||
SetData(r1, "Local HMI", LW, 70, 1) // X1 位图 → LW-70
|
||
SetData(r2, "Local HMI", LW, 71, 1) // X2 位图 → LW-71
|
||
SetData(r3, "Local HMI", LW, 72, 1) // X3 位图 → LW-72
|
||
SetData(r4, "Local HMI", LW, 73, 1) // X4 位图 → LW-73
|
||
SetData(one, "Local HMI", RW, 61, 1) // 开机默认制丸线别 = A(只有人工切换才变 B)
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**导航宏说明**:先查权限(`LW-9222` 类别位)→ 再查当前 Y 页面是否存在(`LW-70`~`73` 位图)→ 有内容才切窗,无内容弹 16 号窗。
|
||
|
||
**`btn-x1`**(X1 配料/上料 · 权限 A/B/C)
|
||
```
|
||
macro_command main() // 宏入口:按下 X1 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 1 // 本按钮固定切到 X=1
|
||
short y = 0 // 运行时读回的当前 Y(1~7)
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // X1 段页面存在位图(LW-70)
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 继续查页面
|
||
GetData(y, "Local HMI", LW, 1, 1) // 读当前 Y → y
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段存在位图 → vpm
|
||
if y == 1 then // 当前 Y=1?
|
||
GETBIT(vpm, bv, 0) // 取位 0(Y1)→ bv
|
||
end if // 结束判断
|
||
if y == 2 then // 当前 Y=2?
|
||
GETBIT(vpm, bv, 1) // 取位 1(Y2)→ bv
|
||
end if // 结束判断
|
||
if y == 3 then // 当前 Y=3?
|
||
GETBIT(vpm, bv, 2) // 取位 2(Y3)→ bv
|
||
end if // 结束判断
|
||
if y == 4 then // 当前 Y=4?
|
||
GETBIT(vpm, bv, 3) // 取位 3(Y4)→ bv
|
||
end if // 结束判断
|
||
if y == 5 then // 当前 Y=5?
|
||
GETBIT(vpm, bv, 4) // 取位 4(Y5)→ bv
|
||
end if // 结束判断
|
||
if y == 6 then // 当前 Y=6?
|
||
GETBIT(vpm, bv, 5) // 取位 5(Y6)→ bv
|
||
end if // 结束判断
|
||
if y == 7 then // 当前 Y=7?
|
||
GETBIT(vpm, bv, 6) // 取位 6(Y7)→ bv
|
||
end if // 结束判断
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(x, "Local HMI", LW, 0, 1) // X=1 → LW-0
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-x2`**(X2 上料清洗 · 权限 A/B/C)
|
||
```
|
||
macro_command main() // 宏入口:按下 X2 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 2 // 本按钮固定切到 X=2
|
||
short y = 0 // 运行时读回的当前 Y(1~7)
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // X2 段页面存在位图(LW-71)
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 继续查页面
|
||
GetData(y, "Local HMI", LW, 1, 1) // 读当前 Y → y
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段存在位图 → vpm
|
||
if y == 1 then // 当前 Y=1?
|
||
GETBIT(vpm, bv, 0) // 取位 0(Y1)→ bv
|
||
end if // 结束判断
|
||
if y == 2 then // 当前 Y=2?
|
||
GETBIT(vpm, bv, 1) // 取位 1(Y2)→ bv
|
||
end if // 结束判断
|
||
if y == 3 then // 当前 Y=3?
|
||
GETBIT(vpm, bv, 2) // 取位 2(Y3)→ bv
|
||
end if // 结束判断
|
||
if y == 4 then // 当前 Y=4?
|
||
GETBIT(vpm, bv, 3) // 取位 3(Y4)→ bv
|
||
end if // 结束判断
|
||
if y == 5 then // 当前 Y=5?
|
||
GETBIT(vpm, bv, 4) // 取位 4(Y5)→ bv
|
||
end if // 结束判断
|
||
if y == 6 then // 当前 Y=6?
|
||
GETBIT(vpm, bv, 5) // 取位 5(Y6)→ bv
|
||
end if // 结束判断
|
||
if y == 7 then // 当前 Y=7?
|
||
GETBIT(vpm, bv, 6) // 取位 6(Y7)→ bv
|
||
end if // 结束判断
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(x, "Local HMI", LW, 0, 1) // X=2 → LW-0
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-x3`**(X3 制丸 · 权限 A/B/D)
|
||
```
|
||
macro_command main() // 宏入口:按下 X3 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 3 // 本按钮固定切到 X=3
|
||
short y = 0 // 运行时读回的当前 Y(1~7)
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // X3 段页面存在位图(LW-72)
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bD == 1 then // 含类别 D?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 继续查页面
|
||
GetData(y, "Local HMI", LW, 1, 1) // 读当前 Y → y
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段存在位图 → vpm
|
||
if y == 1 then // 当前 Y=1?
|
||
GETBIT(vpm, bv, 0) // 取位 0(Y1)→ bv
|
||
end if // 结束判断
|
||
if y == 2 then // 当前 Y=2?
|
||
GETBIT(vpm, bv, 1) // 取位 1(Y2)→ bv
|
||
end if // 结束判断
|
||
if y == 3 then // 当前 Y=3?
|
||
GETBIT(vpm, bv, 2) // 取位 2(Y3)→ bv
|
||
end if // 结束判断
|
||
if y == 4 then // 当前 Y=4?
|
||
GETBIT(vpm, bv, 3) // 取位 3(Y4)→ bv
|
||
end if // 结束判断
|
||
if y == 5 then // 当前 Y=5?
|
||
GETBIT(vpm, bv, 4) // 取位 4(Y5)→ bv
|
||
end if // 结束判断
|
||
if y == 6 then // 当前 Y=6?
|
||
GETBIT(vpm, bv, 5) // 取位 5(Y6)→ bv
|
||
end if // 结束判断
|
||
if y == 7 then // 当前 Y=7?
|
||
GETBIT(vpm, bv, 6) // 取位 6(Y7)→ bv
|
||
end if // 结束判断
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(x, "Local HMI", LW, 0, 1) // X=3 → LW-0
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-x4`**(X4 制丸清洗 · 权限 A/B/D)
|
||
```
|
||
macro_command main() // 宏入口:按下 X4 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 4 // 本按钮固定切到 X=4
|
||
short y = 0 // 运行时读回的当前 Y(1~7)
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // X4 段页面存在位图(LW-73)
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bD == 1 then // 含类别 D?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 继续查页面
|
||
GetData(y, "Local HMI", LW, 1, 1) // 读当前 Y → y
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段存在位图 → vpm
|
||
if y == 1 then // 当前 Y=1?
|
||
GETBIT(vpm, bv, 0) // 取位 0(Y1)→ bv
|
||
end if // 结束判断
|
||
if y == 2 then // 当前 Y=2?
|
||
GETBIT(vpm, bv, 1) // 取位 1(Y2)→ bv
|
||
end if // 结束判断
|
||
if y == 3 then // 当前 Y=3?
|
||
GETBIT(vpm, bv, 2) // 取位 2(Y3)→ bv
|
||
end if // 结束判断
|
||
if y == 4 then // 当前 Y=4?
|
||
GETBIT(vpm, bv, 3) // 取位 3(Y4)→ bv
|
||
end if // 结束判断
|
||
if y == 5 then // 当前 Y=5?
|
||
GETBIT(vpm, bv, 4) // 取位 4(Y5)→ bv
|
||
end if // 结束判断
|
||
if y == 6 then // 当前 Y=6?
|
||
GETBIT(vpm, bv, 5) // 取位 5(Y6)→ bv
|
||
end if // 结束判断
|
||
if y == 7 then // 当前 Y=7?
|
||
GETBIT(vpm, bv, 6) // 取位 6(Y7)→ bv
|
||
end if // 结束判断
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(x, "Local HMI", LW, 0, 1) // X=4 → LW-0
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-y1`**(Y1 初始状态 · 权限 A/B/C/D)
|
||
```
|
||
macro_command main() // 宏入口:按下 Y1 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 0 // 运行时读回的当前 X(1~4)
|
||
short y = 1 // 本按钮固定切到 Y=1
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // 当前 X 段页面存在位图
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bD == 1 then // 含类别 D?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 查当前 X 段位图
|
||
GetData(x, "Local HMI", LW, 0, 1) // 读当前 X → x
|
||
if x == 1 then // 当前在 X1 段?
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段位图 LW-70
|
||
end if // 结束判断
|
||
if x == 2 then // 当前在 X2 段?
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段位图 LW-71
|
||
end if // 结束判断
|
||
if x == 3 then // 当前在 X3 段?
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段位图 LW-72
|
||
end if // 结束判断
|
||
if x == 4 then // 当前在 X4 段?
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段位图 LW-73
|
||
end if // 结束判断
|
||
GETBIT(vpm, bv, 0) // 取位 0(Y1)→ bv
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y=1 → LW-1
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-y2`**(Y2 运行 · 权限 A/B/C/D)
|
||
```
|
||
macro_command main() // 宏入口:按下 Y2 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 0 // 运行时读回的当前 X(1~4)
|
||
short y = 2 // 本按钮固定切到 Y=2
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // 当前 X 段页面存在位图
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bD == 1 then // 含类别 D?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 查当前 X 段位图
|
||
GetData(x, "Local HMI", LW, 0, 1) // 读当前 X → x
|
||
if x == 1 then // 当前在 X1 段?
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段位图 LW-70
|
||
end if // 结束判断
|
||
if x == 2 then // 当前在 X2 段?
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段位图 LW-71
|
||
end if // 结束判断
|
||
if x == 3 then // 当前在 X3 段?
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段位图 LW-72
|
||
end if // 结束判断
|
||
if x == 4 then // 当前在 X4 段?
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段位图 LW-73
|
||
end if // 结束判断
|
||
GETBIT(vpm, bv, 1) // 取位 1(Y2)→ bv
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y=2 → LW-1
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-y3`**(Y3 配方 · 权限 A/B/C/D)
|
||
```
|
||
macro_command main() // 宏入口:按下 Y3 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 0 // 运行时读回的当前 X(1~4)
|
||
short y = 3 // 本按钮固定切到 Y=3
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // 当前 X 段页面存在位图
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bD == 1 then // 含类别 D?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 查当前 X 段位图
|
||
GetData(x, "Local HMI", LW, 0, 1) // 读当前 X → x
|
||
if x == 1 then // 当前在 X1 段?
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段位图 LW-70
|
||
end if // 结束判断
|
||
if x == 2 then // 当前在 X2 段?
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段位图 LW-71
|
||
end if // 结束判断
|
||
if x == 3 then // 当前在 X3 段?
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段位图 LW-72
|
||
end if // 结束判断
|
||
if x == 4 then // 当前在 X4 段?
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段位图 LW-73
|
||
end if // 结束判断
|
||
GETBIT(vpm, bv, 2) // 取位 2(Y3)→ bv
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y=3 → LW-1
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-y4`**(Y4 设备参数 · 权限仅 A/B)
|
||
```
|
||
macro_command main() // 宏入口:按下 Y4 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 0 // 运行时读回的当前 X(1~4)
|
||
short y = 4 // 本按钮固定切到 Y=4
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // 当前 X 段页面存在位图
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 查当前 X 段位图
|
||
GetData(x, "Local HMI", LW, 0, 1) // 读当前 X → x
|
||
if x == 1 then // 当前在 X1 段?
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段位图 LW-70
|
||
end if // 结束判断
|
||
if x == 2 then // 当前在 X2 段?
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段位图 LW-71
|
||
end if // 结束判断
|
||
if x == 3 then // 当前在 X3 段?
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段位图 LW-72
|
||
end if // 结束判断
|
||
if x == 4 then // 当前在 X4 段?
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段位图 LW-73
|
||
end if // 结束判断
|
||
GETBIT(vpm, bv, 3) // 取位 3(Y4)→ bv
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y=4 → LW-1
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-y5`**(Y5 I/O 监控 · 权限仅 A/B)
|
||
```
|
||
macro_command main() // 宏入口:按下 Y5 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 0 // 运行时读回的当前 X(1~4)
|
||
short y = 5 // 本按钮固定切到 Y=5
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // 当前 X 段页面存在位图
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 查当前 X 段位图
|
||
GetData(x, "Local HMI", LW, 0, 1) // 读当前 X → x
|
||
if x == 1 then // 当前在 X1 段?
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段位图 LW-70
|
||
end if // 结束判断
|
||
if x == 2 then // 当前在 X2 段?
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段位图 LW-71
|
||
end if // 结束判断
|
||
if x == 3 then // 当前在 X3 段?
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段位图 LW-72
|
||
end if // 结束判断
|
||
if x == 4 then // 当前在 X4 段?
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段位图 LW-73
|
||
end if // 结束判断
|
||
GETBIT(vpm, bv, 4) // 取位 4(Y5)→ bv
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y=5 → LW-1
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-y6`**(Y6 报警 · 权限 A/B/C/D)
|
||
```
|
||
macro_command main() // 宏入口:按下 Y6 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 0 // 运行时读回的当前 X(1~4)
|
||
short y = 6 // 本按钮固定切到 Y=6
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // 当前 X 段页面存在位图
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bD == 1 then // 含类别 D?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 查当前 X 段位图
|
||
GetData(x, "Local HMI", LW, 0, 1) // 读当前 X → x
|
||
if x == 1 then // 当前在 X1 段?
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段位图 LW-70
|
||
end if // 结束判断
|
||
if x == 2 then // 当前在 X2 段?
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段位图 LW-71
|
||
end if // 结束判断
|
||
if x == 3 then // 当前在 X3 段?
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段位图 LW-72
|
||
end if // 结束判断
|
||
if x == 4 then // 当前在 X4 段?
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段位图 LW-73
|
||
end if // 结束判断
|
||
GETBIT(vpm, bv, 5) // 取位 5(Y6)→ bv
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y=6 → LW-1
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-y7`**(Y7 数据趋势 · 权限 A/B/C/D)
|
||
```
|
||
macro_command main() // 宏入口:按下 Y7 按钮时执行
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 0 // 运行时读回的当前 X(1~4)
|
||
short y = 7 // 本按钮固定切到 Y=7
|
||
short win = 0 // 计算出的目标窗口号
|
||
short ok = 0 // 权限通过标志:1=放行
|
||
short bv = 0 // 页面存在标志:1=有内容
|
||
short vpm = 0 // 当前 X 段页面存在位图
|
||
short pop = 1 // 弹窗置位常量 1
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bA == 1 then // 含类别 A?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if bD == 1 then // 含类别 D?
|
||
ok = 1 // 权限通过
|
||
end if // 结束判断
|
||
if ok == 1 then // 权限通过 → 查当前 X 段位图
|
||
GetData(x, "Local HMI", LW, 0, 1) // 读当前 X → x
|
||
if x == 1 then // 当前在 X1 段?
|
||
GetData(vpm, "Local HMI", LW, 70, 1) // 读 X1 段位图 LW-70
|
||
end if // 结束判断
|
||
if x == 2 then // 当前在 X2 段?
|
||
GetData(vpm, "Local HMI", LW, 71, 1) // 读 X2 段位图 LW-71
|
||
end if // 结束判断
|
||
if x == 3 then // 当前在 X3 段?
|
||
GetData(vpm, "Local HMI", LW, 72, 1) // 读 X3 段位图 LW-72
|
||
end if // 结束判断
|
||
if x == 4 then // 当前在 X4 段?
|
||
GetData(vpm, "Local HMI", LW, 73, 1) // 读 X4 段位图 LW-73
|
||
end if // 结束判断
|
||
GETBIT(vpm, bv, 6) // 取位 6(Y7)→ bv
|
||
if bv == 1 then // 该页面有内容?
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y=7 → LW-1
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
else // 该页面无内容
|
||
SetData(pop, "Local HMI", LB, 124, 1) // 置 LB-124 → 弹 16 号窗
|
||
end if // 结束判断
|
||
else // 权限不通过
|
||
SetData(pop, "Local HMI", LB, 110, 1) // 置 LB-110 → 弹 11 号无权限窗
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`btn-login-index`**(登录:索引登入 → 按组定位;结果提示已内联,无宏编号依赖)
|
||
```
|
||
macro_command main() // 宏入口:点登录按钮时执行
|
||
short cmd = 2 // 命令=2:使用索引登入(读 LW-102 选中的账号)
|
||
short res = 0 // 存放命令结果(读 LW-101)
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 1 // 登录后入口 X 初值 = 1
|
||
short y = 1 // 登录后入口 Y = 1
|
||
short win = 0 // 计算出的目标窗口号
|
||
short idx = 7 // 提示编号(默认 7=登录失败)
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
short z = 0 // 常量 0(清命令/清旧结果用)
|
||
SetData(z, "Local HMI", LW, 101, 1) // 先清旧结果 → 防止读到上一次的码
|
||
SetData(z, "Local HMI", LW, 261, 1) // 清底部提示 → 不显示上一次的信息
|
||
SetData(z, "Local HMI", LW, 100, 1) // 命令先清 0(保证 0→2 有跳变)
|
||
SetData(cmd, "Local HMI", LW, 100, 1) // 发命令 2 → LW-100(索引登入)
|
||
DELAY(300) // 等 0.3 秒
|
||
GetData(res, "Local HMI", LW, 101, 1) // 读命令结果 → res(1=成功)
|
||
if res == 0 then // 结果仍为 0?
|
||
DELAY(300) // 再等 0.3 秒
|
||
GetData(res, "Local HMI", LW, 101, 1) // 再读一次
|
||
end if // 结束判断
|
||
if res == 1 then // 结果=1?
|
||
idx = 1 // 提示编号 1:登录成功
|
||
end if // 结束判断
|
||
if res == 8 then // 结果=8?
|
||
idx = 2 // 提示编号 2:账号不存在
|
||
end if // 结束判断
|
||
if res == 16 then // 结果=16?
|
||
idx = 3 // 提示编号 3:密码错误
|
||
end if // 结束判断
|
||
if res == 32 then // 结果=32?
|
||
idx = 4 // 提示编号 4:命令无法执行
|
||
end if // 结束判断
|
||
if res == 64 then // 结果=64?
|
||
idx = 5 // 提示编号 5:名称不合法
|
||
end if // 结束判断
|
||
if res == 128 then // 结果=128?
|
||
idx = 6 // 提示编号 6:密码含无效字符
|
||
end if // 结束判断
|
||
if res == 0 then // 结果=0?
|
||
idx = 0 // 提示编号 0:不显示
|
||
end if // 结束判断
|
||
SetData(idx, "Local HMI", LW, 261, 1) // 提示编号 → LW-261(立即显示)
|
||
if res == 1 then // 登录成功?
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA(A 工程师)
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB(B 管理员)
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC(C 上料)
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD(D 制丸)
|
||
if bD == 1 then // 含类别 D(制丸)?
|
||
x = 3 // 只有制丸组 → 入口 X3
|
||
end if // 结束判断
|
||
if bA == 1 then // 含类别 A?
|
||
x = 1 // 入口 X1
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
x = 1 // 入口 X1
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
x = 1 // 入口 X1
|
||
end if // 结束判断
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算目标窗口号:101+(X-1)*7+(Y-1)
|
||
SetData(x, "Local HMI", LW, 0, 1) // X → LW-0
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y → LW-1
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`logout`**(注销并回登录页;10 号窗「打开窗口时执行」也用它)
|
||
```
|
||
macro_command main() // 宏入口:点注销按钮 / 进 10 号窗时执行
|
||
short cmd = 3 // 命令=3:注销当前账号
|
||
short win = 10 // 目标窗口号 = 10(登录页)
|
||
short z = 0 // 常量 0
|
||
short z8[8] = {0,0,0,0,0,0,0,0} // 8 个 0(清用户名/密码框用)
|
||
SetData(cmd, "Local HMI", LW, 100, 1) // 发命令 3 → LW-100(注销)
|
||
SetData(z, "Local HMI", LW, 0, 1) // X 清 0
|
||
SetData(z, "Local HMI", LW, 1, 1) // Y 清 0
|
||
SetData(z8[0], "Local HMI", LW, 104, 8) // 清用户名框 LW-104~111(下次默认下拉登入)
|
||
SetData(z8[0], "Local HMI", LW, 112, 8) // 清密码框 LW-112~119
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 10 → LW-2(切回登录页)
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`admin-open`**(登录页 logo 上透明按钮,长按 3 秒)
|
||
```
|
||
macro_command main() // 宏入口:长按登录页隐藏按钮时执行
|
||
short on = 1 // 置位常量 1
|
||
short z8[8] = {0,0,0,0,0,0,0,0} // 8 个 0(先清输入框)
|
||
SetData(z8[0], "Local HMI", LW, 104, 8) // 清用户名框 LW-104~111
|
||
SetData(z8[0], "Local HMI", LW, 112, 8) // 清密码框 LW-112~119
|
||
SetData(on, "Local HMI", LB, 125, 1) // 置 LB-125 → 弹 17 号管理员登录窗
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`admin-login`**(17 号窗「登录」:固定名称登入)
|
||
```
|
||
macro_command main() // 宏入口:点 17 号窗「登录」时执行
|
||
short cmd = 1 // 命令=1:使用名称登入(读 LW-104 + LW-112)
|
||
short res = 0 // 命令结果(读 LW-101)
|
||
short cls = 0 // 当前用户类别位(读 LW-9222)
|
||
short x = 1 // 入口 X 初值 = 1
|
||
short y = 1 // 入口 Y = 1
|
||
short win = 0 // 计算出的目标窗口号
|
||
short idx = 7 // 提示编号(默认 7=登录失败)
|
||
short bA = 0 // 类别 A 位(工程师)
|
||
short bB = 0 // 类别 B 位(管理员)
|
||
short bC = 0 // 类别 C 位(上料)
|
||
short bD = 0 // 类别 D 位(制丸)
|
||
short z = 0 // 常量 0
|
||
SetData(z, "Local HMI", LW, 101, 1) // 先清旧结果 → 防止读到上一次的码
|
||
SetData(z, "Local HMI", LW, 261, 1) // 清旧提示
|
||
SetData(z, "Local HMI", LW, 100, 1) // 命令先清 0
|
||
SetData(cmd, "Local HMI", LW, 100, 1) // 发命令 1 → LW-100(名称登入)
|
||
DELAY(300) // 等 0.3 秒
|
||
GetData(res, "Local HMI", LW, 101, 1) // 读命令结果 → res(1=成功)
|
||
if res == 0 then // 结果仍为 0?
|
||
DELAY(300) // 再等 0.3 秒
|
||
GetData(res, "Local HMI", LW, 101, 1) // 再读一次
|
||
end if // 结束判断
|
||
if res == 1 then // 结果=1?
|
||
idx = 1 // 提示编号 1:登录成功
|
||
end if // 结束判断
|
||
if res == 8 then // 结果=8?
|
||
idx = 2 // 提示编号 2:账号不存在
|
||
end if // 结束判断
|
||
if res == 16 then // 结果=16?
|
||
idx = 3 // 提示编号 3:密码错误
|
||
end if // 结束判断
|
||
if res == 32 then // 结果=32?
|
||
idx = 4 // 提示编号 4:命令无法执行
|
||
end if // 结束判断
|
||
if res == 64 then // 结果=64?
|
||
idx = 5 // 提示编号 5:名称不合法
|
||
end if // 结束判断
|
||
if res == 128 then // 结果=128?
|
||
idx = 6 // 提示编号 6:密码含无效字符
|
||
end if // 结束判断
|
||
if res == 0 then // 结果=0?
|
||
idx = 0 // 提示编号 0:不显示
|
||
end if // 结束判断
|
||
SetData(idx, "Local HMI", LW, 261, 1) // 提示编号 → LW-261(立即显示)
|
||
if res == 1 then // 登录成功?
|
||
SetData(z, "Local HMI", LB, 125, 1) // 清 LB-125 → 关 17 号弹窗
|
||
GetData(cls, "Local HMI", LW, 9222, 1) // 读当前用户类别位 → cls
|
||
GETBIT(cls, bA, 0) // 取 bit0 → bA
|
||
GETBIT(cls, bB, 1) // 取 bit1 → bB
|
||
GETBIT(cls, bC, 2) // 取 bit2 → bC
|
||
GETBIT(cls, bD, 3) // 取 bit3 → bD
|
||
if bD == 1 then // 含类别 D?
|
||
x = 3 // 只有制丸组 → X3
|
||
end if // 结束判断
|
||
if bA == 1 then // 含类别 A?
|
||
x = 1 // 入口 X1
|
||
end if // 结束判断
|
||
if bB == 1 then // 含类别 B?
|
||
x = 1 // 入口 X1
|
||
end if // 结束判断
|
||
if bC == 1 then // 含类别 C?
|
||
x = 1 // 入口 X1
|
||
end if // 结束判断
|
||
win = 101 + (x - 1) * 7 + (y - 1) // 算目标窗口号
|
||
SetData(x, "Local HMI", LW, 0, 1) // X → LW-0
|
||
SetData(y, "Local HMI", LW, 1, 1) // Y → LW-1
|
||
SetData(win, "Local HMI", LW, 2, 1) // 窗口号 → LW-2(触发切窗)
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`admin-close`**(17 号窗「取消」)
|
||
```
|
||
macro_command main() // 宏入口:点 17 号窗「取消」时执行
|
||
short z = 0 // 常量 0
|
||
short z8[8] = {0,0,0,0,0,0,0,0} // 8 个 0
|
||
SetData(z, "Local HMI", LB, 125, 1) // 清 LB-125 → 关 17 号窗
|
||
SetData(z8[0], "Local HMI", LW, 104, 8) // 清用户名框
|
||
SetData(z8[0], "Local HMI", LW, 112, 8) // 清密码框
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`close-msg`**(关闭无权限提示窗)
|
||
```
|
||
macro_command main() // 宏入口:点 11 号窗「确定」时执行
|
||
short z = 0 // 常量 0
|
||
SetData(z, "Local HMI", LB, 110, 1) // 清 LB-110 → 关闭 11 号无权限窗
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`close-nopage`**(关闭 16 号「无内容」提示窗)
|
||
```
|
||
macro_command main() // 宏入口:点 16 号窗「确定」时执行
|
||
short z = 0 // 常量 0
|
||
SetData(z, "Local HMI", LB, 124, 1) // 清 LB-124 → 关闭 16 号无内容窗
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**用户管理 `usr-*`**
|
||
|
||
| 宏 | 命令 | 说明 |
|
||
| --- | --- | --- |
|
||
| `usr-init` | — | 14 号窗「打开窗口时执行」:清 `LW-104`/`LW-112`/`LW-103`/`LW-101`,清 `LB-121` |
|
||
| `user-open` | — | 顶部按钮:仅 B/admin → 置 `LB-122` |
|
||
| `usr-back` | — | 清 `LB-122` |
|
||
| `usr-add` | `5` | 新增(`LW-104`+`LW-112`+`LW-103`) |
|
||
| `usr-delete` | — | 置 `LB-121` 弹确认 |
|
||
| `usr-delete-ok` | `8` | 按索引删除 |
|
||
| `usr-delete-cancel` | — | 清 `LB-121` |
|
||
| `usr-getlevel` | `14` | 按索引读权限 → `LW-103` |
|
||
| `usr-setlevel` | `10` | 按索引设权限 |
|
||
| `usr-setpwd` | `12` | 按索引设密码 |
|
||
|
||
```
|
||
macro_command main() // 宏入口:用户管理按钮(以 cmd=14 读取权限为例)
|
||
short cmd = 14 // 命令值:改成 5/8/10/12 等即为对应功能
|
||
SetData(cmd, "Local HMI", LW, 100, 1) // 发命令 → LW-100
|
||
end macro_command // 宏结束
|
||
```
|
||
> 其余 `usr-*` 同上模板:`cmd` = 5 / 8 / 10 / 12;`user-open` 置 / `usr-back` 清 `LB-122`,`usr-delete` / `usr-delete-cancel` 置 / 清 `LB-121`,`usr-init` 清输入。
|
||
|
||
**关于窗 `about-*`**:`about-open` 置 `LB-123`(弹 13 号窗);`about-close` 清 `LB-123`。
|
||
|
||
**修改时间**
|
||
|
||
| 宏 | 触发 | 作用 |
|
||
| --- | --- | --- |
|
||
| `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() // 宏入口:改时间弹窗点「设定」时执行
|
||
short v[6] = {0,0,0,0,0,0} // 暂存数组:秒/分/时/日/月/年
|
||
short z = 0 // 常量 0
|
||
GetData(v[0], "Local HMI", LW, 40, 6) // 从 LW-40~45 读入 6 个值 → v
|
||
SetData(v[0], "Local HMI", LW, 9017, 6) // v 写入 RTC 寄存器 LW-9017~9022(设置时间)
|
||
SetData(z, "Local HMI", LB, 120, 1) // 清 LB-120 → 关闭 12 号弹窗
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**网络设置 `net-*`**
|
||
|
||
**`net-read`**(13 号窗「打开窗口时执行」:系统值 → 暂存 RW)
|
||
```
|
||
macro_command main() // 宏入口:进 13 号窗时执行
|
||
short v[4] = {0,0,0,0} // 4 字暂存数组
|
||
short line = 1 // 制丸线别(1=A / 2=B)
|
||
GetData(line, "Local HMI", RW, 61, 1) // 读 RW-61 线别
|
||
GetData(v[0], "Local HMI", LW, 9129, 4) // 读 HMI IP
|
||
SetData(v[0], "Local HMI", RW, 20, 4) // → RW-20~23
|
||
GetData(v[0], "Local HMI", LW, 10750, 4) // 读 HMI 掩码
|
||
SetData(v[0], "Local HMI", RW, 24, 4) // → RW-24~27
|
||
GetData(v[0], "Local HMI", LW, 9125, 4) // 读 HMI 网关
|
||
SetData(v[0], "Local HMI", RW, 28, 4) // → RW-28~31
|
||
GetData(v[0], "Local HMI", LW, 9600, 4) // 读上料 PLC(设备4)IP
|
||
SetData(v[0], "Local HMI", RW, 40, 4) // → RW-40~43
|
||
GetData(v[0], "Local HMI", LW, 9605, 4) // 读制丸 PLC(设备5)IP
|
||
if line == 1 then // 当前选 A 线?
|
||
SetData(v[0], "Local HMI", RW, 44, 4) // → RW-44~47(制丸A)
|
||
else // 当前选 B 线
|
||
SetData(v[0], "Local HMI", RW, 48, 4) // → RW-48~51(制丸B)
|
||
end if // 结束判断
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`net-apply`**(13 号窗「应用」按钮;另勾选宏属性「当 HMI 启动时即执行一次」,开机自动套用)
|
||
```
|
||
macro_command main() // 宏入口:点「应用」/ 开机自动套用
|
||
short v[4] = {0,0,0,0} // 4 字暂存数组
|
||
short hmi0 = 0 // HMI IP 第一段(判断是否配置过)
|
||
short role = 0 // 本机角色(1上料/2制丸A/3制丸B)
|
||
short line = 1 // 制丸线别(1=A/2=B)
|
||
short okp = 0 // 是否连接制丸设备:1=连
|
||
short on = 1 // 置位常量
|
||
short z = 0 // 常量 0
|
||
GetData(hmi0, "Local HMI", RW, 20, 1) // 读 RW-20(HMI IP 第一段)
|
||
GetData(role, "Local HMI", RW, 60, 1) // 读 RW-60(本机角色)
|
||
GetData(line, "Local HMI", RW, 61, 1) // 读 RW-61(线别)
|
||
if line == 0 then // 线别未设置/无效?
|
||
line = 1 // 默认 A 线
|
||
end if // 结束判断
|
||
if role == 1 then // 上料屏?
|
||
okp = 1 // 连制丸设备(线别按 RW-61)
|
||
end if // 结束判断
|
||
if role == 2 then // 制丸A屏?
|
||
line = 1 // 强制 A 线
|
||
okp = 1 // 连制丸设备
|
||
end if // 结束判断
|
||
if role == 3 then // 制丸B屏?
|
||
line = 2 // 强制 B 线
|
||
okp = 1 // 连制丸设备
|
||
end if // 结束判断
|
||
SetData(line, "Local HMI", RW, 61, 1) // 回写线别(界面显示一致)
|
||
if hmi0 == 0 then // HMI IP 没填 → 跳过 HMI 部分
|
||
hmi0 = 0 // (保持原 HMI 网络)
|
||
else // 已填 → 应用 HMI 网络
|
||
GetData(v[0], "Local HMI", RW, 20, 4) // RW → HMI IP
|
||
SetData(v[0], "Local HMI", LW, 9129, 4) // 写 LW-9129~9132
|
||
GetData(v[0], "Local HMI", RW, 24, 4) // RW → HMI 掩码
|
||
SetData(v[0], "Local HMI", LW, 10750, 4) // 写 LW-10750~10753
|
||
GetData(v[0], "Local HMI", RW, 28, 4) // RW → HMI 网关
|
||
SetData(v[0], "Local HMI", LW, 9125, 4) // 写 LW-9125~9128
|
||
SetData(on, "Local HMI", LB, 12094, 1) // 置 LB-12094 → HMI 网络生效
|
||
end if // 结束判断
|
||
GetData(v[0], "Local HMI", RW, 40, 4) // RW → 上料 PLC IP
|
||
SetData(v[0], "Local HMI", LW, 9600, 4) // 写上料 PLC(设备4)
|
||
SetData(on, "Local HMI", LB, 10070, 1) // 重连设备4
|
||
if okp == 1 then // 需要连制丸设备?
|
||
if line == 1 then // 选 A 线
|
||
GetData(v[0], "Local HMI", RW, 44, 4) // RW → 制丸A IP
|
||
else // 选 B 线
|
||
GetData(v[0], "Local HMI", RW, 48, 4) // RW → 制丸B IP
|
||
end if // 结束判断
|
||
SetData(v[0], "Local HMI", LW, 9605, 4) // 写制丸 PLC(设备5)
|
||
SetData(on, "Local HMI", LB, 10071, 1) // 重连设备5
|
||
end if // 结束判断(角色=0:不连制丸设备,防误连)
|
||
DELAY(1000) // 等 1 秒
|
||
SetData(z, "Local HMI", LB, 12094, 1) // 清 LB-12094
|
||
SetData(z, "Local HMI", LB, 10070, 1) // 清 LB-10070
|
||
SetData(z, "Local HMI", LB, 10071, 1) // 清 LB-10071
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`line-ab-switch`**(13 号窗「A/B 切换」按钮;仅本机角色=1 生效)
|
||
```
|
||
macro_command main() // 宏入口:点 A/B 线切换按钮
|
||
short v[4] = {0,0,0,0} // 4 字暂存数组
|
||
short role = 0 // 本机角色(读 RW-60)
|
||
short line = 1 // 当前线别
|
||
short on = 1 // 置位常量
|
||
short z = 0 // 常量 0
|
||
GetData(role, "Local HMI", RW, 60, 1) // 读本机角色
|
||
if role == 1 then // 只有上料屏允许切换
|
||
GetData(line, "Local HMI", RW, 61, 1) // 读当前线别
|
||
if line == 1 then // 当前 A → 切 B
|
||
line = 2 // 目标 B
|
||
else // 当前 B → 切 A
|
||
line = 1 // 目标 A
|
||
end if // 结束判断
|
||
SetData(line, "Local HMI", RW, 61, 1) // 写回 RW-61
|
||
if line == 1 then // 目标 A 线
|
||
GetData(v[0], "Local HMI", RW, 44, 4) // 取制丸A IP
|
||
else // 目标 B 线
|
||
GetData(v[0], "Local HMI", RW, 48, 4) // 取制丸B IP
|
||
end if // 结束判断
|
||
SetData(v[0], "Local HMI", LW, 9605, 4) // 写设备5 IP
|
||
SetData(on, "Local HMI", LB, 10071, 1) // 重连设备5
|
||
DELAY(1000) // 等 1 秒
|
||
SetData(z, "Local HMI", LB, 10071, 1) // 清重连位
|
||
end if // 非上料屏:无动作(线别锁定)
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**X2Y2 分区聚焦弹窗 `area-*`**(配合间接窗口 `LW-50`,见主文件 7.7.3)
|
||
|
||
**`area-1`**(X2Y2 区域「物料输送管道系统」透明键)
|
||
```
|
||
macro_command main() // 宏入口:点该区域时执行
|
||
short win = 141 // 目标弹窗窗口号
|
||
SetData(win, "Local HMI", LW, 50, 1) // 写 LW-50 → 间接窗口显示 141
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`area-2`**(X2Y2 区域「浸膏输送和称量系统」透明键)
|
||
```
|
||
macro_command main() // 宏入口:点该区域时执行
|
||
short win = 142 // 目标弹窗窗口号
|
||
SetData(win, "Local HMI", LW, 50, 1) // 写 LW-50 → 间接窗口显示 142
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`area-3`**(X2Y2 区域「混合机」透明键)
|
||
```
|
||
macro_command main() // 宏入口:点该区域时执行
|
||
short win = 143 // 目标弹窗窗口号
|
||
SetData(win, "Local HMI", LW, 50, 1) // 写 LW-50 → 间接窗口显示 143
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`area-4`**(X2Y2 区域「软材缓存料斗(随制丸机清洗)」透明键)
|
||
```
|
||
macro_command main() // 宏入口:点该区域时执行
|
||
short win = 144 // 目标弹窗窗口号
|
||
SetData(win, "Local HMI", LW, 50, 1) // 写 LW-50 → 间接窗口显示 144
|
||
end macro_command // 宏结束
|
||
```
|
||
|
||
**`area-close`**(弹窗「关闭」按钮 / X2Y2 打开窗口时)
|
||
```
|
||
macro_command main() // 宏入口:关闭区域弹窗
|
||
short z = 0 // 常量 0
|
||
SetData(z, "Local HMI", LW, 50, 1) // 写 LW-50=0 → 间接窗口收起
|
||
end macro_command // 宏结束
|
||
```
|