Skip to content

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。

某台没读到怎么办 ​

按顺序看三点,基本都能解决:

  1. 设备在线吗 —— 在上位机界面里搜一下,能搜到才读得到。刚上电的设备等几十秒再试。
  2. 是不是跨网段 —— 设备和电脑不在同一个网段时读不到,先用界面确认能连上。
  3. 设备当时正忙 —— 偶尔会提示"应答超时",稍等重试一次即可。

都不是的话,把窗口里的结果发给技术支持,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 自动停。

相关页面 ​

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