主题
🔀 流程控制
掌握 Lua 条件判断、循环和跳转控制
Lua 的流程控制就这四种结构,看懂这张图再往下看代码会轻松很多:
🔀 条件判断
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)
endrepeat-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
endreturn
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