- unitouch.cmtp/备份/debug、XD、素材更新(banner/close/open/title/x3y2 等) - 文档:X3Y6 启用(LW-72=127),禁用页清单与位图说明同步
78 KiB
宏指令(全部,逐行注释)
摘自同目录
开发主文件.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-90179022 → LW-4045,置 LB-120 |
set-time |
12 号窗「设定」 | LW-4045 → LW-90179022(设置 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 // 宏结束