Skip to content

🔀 流程控制 ​

掌握 Lua 条件判断、循环和跳转控制


Lua 的流程控制就这四种结构,看懂这张图再往下看代码会轻松很多:

四种流程结构:条件判断 / while / repeat-until / for

🔀 条件判断 ​

if 语句 ​

lua
-- 基本 if
local temp = plc.d(100)
if temp > 80 then
    print("温度过高!")
end

-- if-else
local status = plc.x(0)
if status == 1 then
    print("设备运行中")
else
    print("设备已停止")
end

-- if-elseif-else
local level = plc.d(200)
if level >= 90 then
    print("高液位报警")
elseif level >= 70 then
    print("高液位预警")
elseif level <= 10 then
    print("低液位报警")
else
    print("液位正常")
end

🔁 循环 ​

while 循环 ​

lua
-- 先判断后执行
local count = 0
while count < 10 do
    count = count + 1
    plc.d(100, count)
    system.sleep(100)
end

repeat-until 循环 ​

lua
-- 先执行后判断(至少执行一次)
local count = 0
repeat
    count = count + 1
    print("第 " .. count .. " 次尝试")
until plc.x(0) == 1 or count >= 10

别用 system.sleep 轮询等事件

tcp_client / mqtt / com 这些模块都没有 recv() 之类的同步读接口,数据是通过 reg() 注册的回调送上来的。而主线程里的 system.sleep 不泵消息队列,所以 repeat ... system.sleep(100) until data ~= nil 这种写法永远等不到数据 —— 循环期间回调一次都不会执行。等事件请用回调,见 并发模型概述。

数值 for 循环 ​

lua
-- 计数循环:从 1 到 10,步长为 1
for i = 1, 10 do
    print(i)
end

-- 指定步长
for i = 10, 1, -1 do    -- 从 10 倒数到 1
    print(i)
end

-- 遍历 D 寄存器
for i = 100, 109 do
    local val = plc.d(i)
    print("D" .. i .. " = " .. val)
end

注意:for 的循环变量 i 是局部变量,循环结束后不可访问。控制表达式只在循环开始时计算一次。

泛型 for 循环 ​

lua
-- 遍历数组
local arr = {10, 20, 30, 40, 50}
for i, v in ipairs(arr) do
    print(i, v)    -- 1 10, 2 20, ...
end

-- 遍历字典
local config = {ip = "192.168.1.1", port = 502}
for k, v in pairs(config) do
    print(k, v)    -- ip 192.168.1.1, port 502
end

-- 遍历字符串
for ch in string.gmatch("A1B2C3", "%w") do
    print(ch)      -- A, 1, B, 2, C, 3
end

⏭️ 跳转控制 ​

break ​

lua
-- 查找第一个大于 50 的 D 寄存器
for i = 0, 99 do
    local val = plc.d(i)
    if val > 50 then
        print("找到: D" .. i .. " = " .. val)
        break
    end
end

return ​

lua
-- 从函数中提前返回
local function check_alarm(val)
    if val == nil then
        return false, "无效数据"
    end
    if val > 100 then
        return true, "超限报警"
    end
    return false, "正常"
end

local alarm, msg = check_alarm(plc.d(100))

注意:Lua 没有 continue 语句。如需跳过某次迭代,使用 if 包裹:

lua
-- 等效于 continue
for i = 1, 10 do
    if i % 2 == 0 then
        -- 跳过偶数
    else
        print(i)   -- 只打印奇数
    end
end

💡 实用模式 ​

超时等待模式 ​

lua
-- 等待设备上线,最多等 5 秒
local max_wait = 50  -- 50次 × 100ms = 5秒
local count = 0
while plc.x(0) ~= 1 and count < max_wait do
    system.sleep(100)
    count = count + 1
end

if count >= max_wait then
    print("等待超时")
else
    print("设备已上线")
end

轮询采集模式 ​

lua
-- 每秒采集一次,共采集 10 次
for i = 1, 10 do
    local temp = plc.d(100)
    local humi = plc.d(101)
    print("第" .. i .. "次: 温度=" .. temp .. " 湿度=" .. humi)
    system.sleep(1000)
end

上一篇:基础语法 | 下一篇:函数

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研