主题
11.5 批量写 DDC 程序(电气工程师专用)
尊敬的电气工程师:DDC(Direct Digital Control,直接数字控制)程序用于做连续的寄存器运算与逻辑(如 D100 = 777、定时翻转、比较报警等)。它和梯形图一样,REPL 没有单独简写命令,用一行 JSON 调用 write_ddc_program 即可批量下发。
适用:给一批设备写入相同的 DDC 控制逻辑。文件是一个
ddc.json程序(由 DDC 编辑器"生成 JSON"得到,或手写)。
第一步:准备 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 适合复杂时序与通讯;梯形图适合继电器逻辑。三类都能批量下发,按现场需求选。