# 宏指令(全部,逐行注释) > 摘自同目录 `开发主文件.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 // 宏结束 ```