主题
11.7 用脚本批量读取设备程序(AI 与自动化)
想让 AI 帮您批量处理设备,或者自己写个脚本定时备份——把每台设备的 Lua 程序和梯形图都读回来,按序列号存好。这一节给您一段可以直接用的脚本。
适合:批量备份程序、交给 AI 分析控制逻辑、定期归档现场设备的程序。
用脚本 / AI 调用,直接用 lpplc-manager.exe 即可
上位机的 lpplc-manager.exe 既是界面程序、也是命令行工具:双击打开界面,命令行里 lpplc-manager.exe dev list 又能跑批。它是 GUI 子系统,所以 PowerShell 里要用下面 Run-Cli 函数(Start-Process -Wait + 重定向)包一层才能拿到结果,不能直接 &;在 cmd 里双击 .bat 则不受此限制。下面的例程默认就用它。
怎么用
第 1 步:新建一个文件夹,把上位机的 lpplc-manager.exe 放进去(就在您安装的上位机目录里,桌面图标右键"打开文件所在的位置"即可找到)。它是 GUI 程序,PowerShell 里需用下面 Run-Cli 封装(内部 Start-Process -Wait),cmd 双击 .bat 则直接可用。
第 2 步:在同一个文件夹里新建文本文档,把下面这段完整复制进去,保存为 导出程序.ps1。
第 3 步:右键这个文件 →「使用 PowerShell 运行」。
powershell
$cli = Join-Path $PSScriptRoot 'lpplc-manager.exe'
function Run-Cli {
param([string[]]$Args_)
# lpplc-manager.exe 是 GUI 子系统:PowerShell 里必须 Start-Process -Wait 等它跑完,
# 并把 stdout 重定向到临时文件再读回(cmd 里双击 .bat 无此限制)。
$tmp = Join-Path $env:TEMP ('mgr_' + [guid]::NewGuid().ToString('N') + '.txt')
$psi = @{ FilePath = $cli; ArgumentList = $Args_; Wait = $true; NoNewWindow = $true
RedirectStandardOutput = $tmp; RedirectStandardError = ($tmp + '.err') }
Start-Process @psi | Out-Null
return (Get-Content $tmp -Raw -ErrorAction SilentlyContinue)
}
function Get-Result {
param($json, $name)
foreach ($line in ($json -split "`n")) {
try { $o = ($line.Trim() | ConvertFrom-Json) } catch { continue }
if ($o.type -eq 'cli_result' -and $o.cli -eq $name) { return $o }
}
}
Run-Cli @('dev','list','--out','devices.json') | Out-Null
$devs = @()
foreach ($x in (Get-Content 'devices.json' -Raw -Encoding UTF8 | ConvertFrom-Json)) { $devs += $x }
Write-Host ("Found " + $devs.Count + " device(s)")
foreach ($d in $devs) {
$luaPath = "$($d.id)\main.lua"
$ladPath = "$($d.id)\ladder.il"
$r1 = Get-Result (Run-Cli @('lua','pull','--device',$d.id,'--out',$luaPath)) 'lua pull'
Write-Host ("Lua " + $d.id + " ok=" + $r1.ok + " link=" + $r1.link_type)
$r2 = Get-Result (Run-Cli @('ladder','pull','--device',$d.id,'--out',$ladPath)) 'ladder pull'
Write-Host ("Ladder " + $d.id + " ok=" + $r2.ok + " link=" + $r2.link_type)
}
Write-Host "Done."运行完成后您会得到
窗口里会显示每台设备的结果:
text
Found 2 device(s)
Lua 10000001 ok=True link=UDP
Ladder 10000001 ok=True link=UDP
Lua 12596159 ok=True link=UDP
Ladder 12596159 ok=True link=UDP
Done.文件夹里会自动生成(不用自己建文件夹):
text
10000001\main.lua 这台设备的 Lua 程序
10000001\ladder.il 这台设备的梯形图(指令表)
12596159\main.lua
12596159\ladder.il
devices.json 设备清单ok=True 就是读到了,ok=False 就是没读到。梯形图内容是 END 表示这台设备当前是空程序,属于正常。
不管设备是网线、WiFi、串口还是 4G 云连接,用 lua pull / ladder pull 一条命令即可——工具会按设备的连接方式自动走对应的专用读程序通道,您完全不用关心通道、也不用开透传。结果里的 link= 会告诉您这次实际走的是哪条链路。
想改成别的用途
| 想做什么 | 改哪里 |
|---|---|
| 只处理指定的几台 | 把 foreach ($d in $devs) 换成您的序列号列表 |
| 改成写入程序 | lua pull 改成 lua push --file 你的.lua --yes;ladder pull 改成 ladder push --file 你的.il --yes |
| 顺便读寄存器 | 加一行 Run-Cli @('plc','read','--device',$d.id,'--type','D','--start','500','--count','4') |
| 顺便读 DTU 配置 | 加一行 Run-Cli @('dtu','get','--device',$d.id,'--out',"$($d.id)\cfg.json") |
云连接设备要加 --cloud-wait-ms
dev list / dev scan 默认扫完就返回。如果现场有云连接设备,云没连上时它们不会出现在清单里——批量脚本可能在云设备刚上电时静默漏掉它们。加 --cloud-wait-ms <毫秒>(例如 --cloud-wait-ms 8000)会让工具等云连接就绪、云设备报到后再返回;结果里额外带回 cloud_status(connected / disconnected / timeout)和 cloud_devices(云设备数量),脚本一眼就能判断云是否就绪、要不要重试。
powershell
# 最多等 8 秒云连接,连上后才把设备清单写盘
Run-Cli @('dev','list','--cloud-wait-ms','8000','--out','devices.json')写操作要加 --yes
push / dtu set / plc write 会真的改动设备,必须加 --yes 才会执行。只想先看看会做什么、不真改,加 --dry-run。
某台没读到怎么办
按顺序看三点,基本都能解决:
- 设备在线吗 —— 在上位机界面里搜一下,能搜到才读得到。刚上电的设备等几十秒再试。
- 是不是跨网段 —— 设备和电脑不在同一个网段时读不到,先用界面确认能连上。
- 设备当时正忙 —— 偶尔会提示"应答超时",稍等重试一次即可。
都不是的话,把窗口里的结果发给技术支持,ok=False 那行会带上具体原因。
用 CLI 压测内置模拟器(task/event 并发库)
内置模拟器(进程内 lp_sim)是压测 task / event 并发库最直接的工具,比 WebSocket 调试服务更接近真实用法。
- 用随工具分发的
lpplc-cli.ps1的 session-host:它起一个常驻lpplc-manager.exe,模拟器状态跨多次调用保留(命名管道\\.\pipe\lpplc-session),适合"准备 → 跑 → 读输出 → 停"的循环。直接每次lpplc-manager.exe sim ...是新进程,内置模拟器状态不跨进程保留。 - 典型循环:
sim prepare→sim run --file 你的.lua(或sim load --file 你的.il)→sim output取打印 →sim status看 state/ticks →sim stop收尾。 - 限流说明(重要):
sim run/sim load已支持--max-ticks/--tick-ms/--max-wall-ms,但当前内置模拟器的周期预算限流尚未生效——给定--max-ticks后运行不会自动停(已知问题,后续版本修复)。在修好前,压测程序要靠event.wait自带超时,或显式sim stop收尾,不要依赖--max-ticks自动停。
相关页面
- 11.6 批量导出所有设备的程序 —— 同样的事,偏讲解场景与结果
- 11.1 命令行批量操作多台 PLC —— 批量写入改名、寄存器、Lua、DTU
- 11.4 批量写梯形图
- 11.8 上位机命令行参考 —— 命令面、参数默认值、退出码、since 版本的完整清单(web 客户也可只读)