Files
weinviews-unitouch/设计文档/宏指令.md
T
admin 903ab099f1 更新工程、素材与文档
- unitouch.cmtp/备份/debug、XD、素材更新(banner/close/open/title/x3y2 等)
- 文档:X3Y6 启用(LW-72=127),禁用页清单与位图说明同步
2026-09-26 13:40:54 +08:00

78 KiB
Raw Blame History

宏指令(全部,逐行注释)

摘自同目录 开发主文件.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                                         // 宏结束