Skip to content

11.5 批量写 DDC 程序(电气工程师专用) ​

尊敬的电气工程师:DDC(Direct Digital Control,直接数字控制)程序用于做连续的寄存器运算与逻辑(如 D100 = 777、定时翻转、比较报警等)。它和梯形图一样,REPL 没有单独简写命令,用一行 JSON 调用 write_ddc_program 即可批量下发。

适用:给一批设备写入相同的 DDC 控制逻辑。文件是一个 ddc.json 程序(由 DDC 编辑器"生成 JSON"得到,或手写)。

批量下发 DDC 程序指令流:选中 → 下发(写后设备重启) → 退出,复制几组做更多台

第一步:准备 DDC 程序文件 ​

把 DDC 程序保存为 ddc.json(和批处理同目录)。最小合法结构(把 D100 写成 777):

json
{"version":1,"name":"demo","scan_ms":200,"lines":[{"op":"assign","target":{"op":"ref","device":"D","addr":100},"expr":{"op":"const","value":777}}],"libs":[]}

程序怎么来

上面的 ddc.json 是手写的最小样例。实际项目里,DDC 程序由上位机的 DDC 逻辑编程编辑器 画好后"生成 JSON"导出;寄存器写法固定为 {"op":"ref","device":"D|X|Y|M|...","addr":N},语句只支持 assign / if / call。照葫芦画瓢改 lines 即可。

第二步:写批处理 ​

在 @@CMDS@@ 之后,用一行 JSON 调用 write_ddc_program:

text
@@CMDS@@
# 第 1 台
SCAN
OPT 1
{"method":"write_ddc_program","params":{"content":{"$file":"ddc.json"},"restart":true}}
BYE
# 第 2 台
OPT 2
{"method":"write_ddc_program","params":{"content":{"$file":"ddc.json"},"restart":true}}
BYE
  • 这行以 { 开头,REPL 直接交给底层引擎。
  • "content":{"$file":"ddc.json"}:把 ddc.json 的原始文本当程序内容读入(也可用 "program":{"$json_file":"ddc.json"} 把文件当 JSON 对象读入,二选一)。
  • restart:true:写完后重启设备让 DDC 引擎重新加载程序(DDC 只在 Lua 主循环启动时加载,必须重启才生效)。
  • 做更多台:复制 OPT / {...} / BYE 三行。

第三步:双击运行 ​

双击 .bat,工具逐台写入 DDC 程序并重启设备。

跑完看到什么算成功 ​

这行 JSON 下面窗口里是空白的,不打印直观文字回执——正常,不代表失败。结果在窗口最下面「每条指令的实际结果」那一段:

json
{"errmsg":"","errno":0,"method":"write_ddc_program","result":{"bytes":158,"restarted":true},"seq":5,"type":"resp"}
  • "errno":0 写入成功;bytes:158 是程序字节数(= 您那份 ddc.json 的字节数);restarted:true 已重启设备。

确认真写进去了(实测跑通的读回写法) ​

写完后设备要几秒才回来,所以在同一个 @@CMDS@@ 后面接着写"等一下、重新搜、再读回":

text
@@CMDS@@
SCAN 6000
OPT 1
{"method":"write_ddc_program","params":{"content":{"$file":"ddc.json"},"restart":true}}
BYE
{"cli":"sleep","ms":8000}
SCAN 8000
OPT 1
{"method":"read_ddc_program"}
BYE

第二遍 read_ddc_program 的返回(下面这条是在软 PLC 模拟器 10000001 上实测的原文,为便于阅读换行了):

json
{"errno":0,"method":"read_ddc_program","result":{
  "content":"{\"version\":1,\"name\":\"demo\",\"scan_ms\":200,\"lines\":[{\"op\":\"assign\",\"target\":{\"op\":\"ref\",\"device\":\"D\",\"addr\":100},\"expr\":{\"op\":\"const\",\"value\":777}}],\"libs\":[]}\n",
  "exists":true,
  "program":{"libs":[],"lines":[{"expr":{"op":"const","value":777},"op":"assign","target":{"addr":100,"device":"D","op":"ref"}}],"name":"demo","scan_ms":200,"version":1}}}
  • exists:true 且 program 与您下发的内容一致 → 程序确实在设备上。
  • 再狠一点:本页示例是把 D100 写成 777,所以在读回那段里补一行 read D 100 1,"values":[777] 就是程序真的在扫描执行。

写入后要等重启

write_ddc_program 会重启设备。刚写完立刻读回会报 扫描完成,找到 0 台设备:,属正常现象——照上面那样先 {"cli":"sleep","ms":8000} 再 SCAN 即可。若等过之后仍搜不到,见 11.1 的注意事项(用模拟器练习时模拟器进程可能自行退出,需重新点「🖥 启动软PLC」)。

注意事项 ​

  • ddc.json 须与 .bat 同目录,UTF-8 保存。

  • 写的是真实程序且会重启设备,执行前确认目标设备;建议先拿软 PLC 模拟器验证程序逻辑。

  • 不同设备不同程序时,把 $file 后面的文件名换成各自的文件即可。

  • JSON 必须合法:写之前工具会校验,格式错会直接报错,不会把设备解析不了的文件写进去。实测把 lines 改坏后下发,返回的就是:

    json
    {"errmsg":"ddc.json 不是合法 JSON: * Line 1, Column 51\n  Syntax error: value, object or array expected.","errno":1,"method":"write_ddc_program"}

    而且设备原来那份程序没有被改动(紧接着读回仍是上一份正确的程序)——所以放心先试错,改对了再下发。

与 Lua / 梯形图的区别

DDC 是"寄存器级连续运算",适合做数据采集、标度变换、简单连锁;Lua 适合复杂时序与通讯;梯形图适合继电器逻辑。三类都能批量下发,按现场需求选。

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