Skip to content

SoftPLC Socket 通信协议 ​

适用于 rtl-25.01,核对日期:2026-09-10。以当前控制器命令分发、SoftPLC SDK 和示教器调用代码为准;每个命令独立列出功能、JSON、字段含义和响应命令。

通用说明 ​

  • 本文描述 Socket 帧中的 SoftPLC JSON 负载,外层 Socket 帧格式沿用通用协议。
  • JSON 使用 UTF-8。JSON 语法错误时不产生对应 PLC 回复。
  • 除 var_page 从 1 开始外,section、rung、变量和坐标索引均从 0 开始。
  • robot 是兼容字段。当前控制器只有一个 SoftPLC 实例,PLC handler 不读取该字段。
  • 梯形图固定 12 列,默认 8 行;当前控制器支持扩展至 1000 行。每个 rung 的实际行数由 nbr_lines_used 给出,x=0..11,y=0..nbr_lines_used-1。客户端应通过 0x7434 获取行列容量,不再按固定 8 行解析。
  • 编辑成功后工程保存到 ./plc/default.clprj。保存失败可能发生在内存修改之后,收到失败响应时应重新查询相关模型。
  • 开机自启配置单独保存到 ./plc/runtime.json,默认关闭;工程文件导入/导出不包含该配置。
  • 下文部分示例用空数组或空对象省略模型内容,例如 elements: []、changed_models.rungs: [];完整响应以字段表定义为准。

命令索引 ​

命令字名称类型
0x7400PLC 启动请求请求
0x7401PLC 停止请求请求
0x7402PLC 状态查询请求
0x7403PLC 状态响应响应
0x7404PLC 工程概要查询请求
0x7405PLC 工程概要响应响应
0x7406PLC section 数据查询请求
0x7407PLC section 数据响应响应
0x7411PLC rung 数据查询请求
0x7412PLC rung 数据响应响应
0x7413PLC 插入 rung / 行请求
0x7414PLC 插入 rung / 行响应响应
0x7415PLC 删除 rung / 行请求
0x7416PLC 删除 rung / 行响应响应
0x7420PLC 元素更新请求
0x7422PLC 元素更新响应响应
0x7423IEC Timer 更新请求
0x7424IEC Timer 更新响应响应
0x7425Counter 更新请求
0x7426Counter 更新响应响应
0x7427CTU 更新请求
0x7428CTU 更新响应响应
0x7429CTD 更新请求
0x742ACTD 更新响应响应
0x742BMOVE 更新请求
0x742CMOVE 更新响应响应
0x742D元素属性更新请求
0x742E元素属性更新响应响应
0x7430PLC 变量写入请求
0x7431PLC 变量读取请求
0x7432PLC 变量值响应响应
0x7433PLC 通用参数查询请求
0x7434PLC 通用参数响应响应
0x7435PLC 重置请求
0x7436PLC 重置响应响应
0x7437PLC 工程导出准备请求
0x7438PLC 工程导出准备响应响应
0x7439PLC 工程导入准备请求
0x743APLC 工程导入准备响应响应
0x743BPLC 工程导入应用请求
0x743CPLC 工程导入应用响应响应
0x743DPLC 开机自启查询请求
0x743EPLC 开机自启设置请求
0x743FPLC 开机自启响应响应

0x7410(PLC_UPDATE_RUNG_INFO_INQUIRE)和 0x7421(PLC_ELEMENT_INQUIRE)目前只在头文件中定义,未接入控制器命令分发,不属于可用请求。

0x7400 PLC 启动请求 ​

功能: 启动 SoftPLC。处理完成后用 0x7403 返回当前状态。

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,当前控制器忽略。

0x7401 PLC 停止请求 ​

功能: 停止 SoftPLC,随后执行 PLC reset。处理完成后用 0x7403 返回当前状态。

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,当前控制器忽略。

0x7402 PLC 状态查询 ​

功能: 查询 SoftPLC 当前运行状态。用 0x7403 响应。

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,当前控制器忽略。

0x7403 PLC 状态响应 ​

功能: 响应 0x7400、0x7401 或 0x7402。

json
{"state": 2}
字段类型含义
stateintPLC 当前状态。
state 值含义
0正在加载
1已停止
2正在运行
3运行冻结
4单周期运行

该响应没有 ok 和 error。启动或停止失败时会关闭 SoftPLC 运行时,调用方根据最终 state 判断结果。未初始化时 state=-3(PLC_API_ERR_NOT_INITIALIZED),不能将所有返回值都按 0 到 4 的状态枚举处理;其他响应中的 state 也遵循这一规则。

0x7404 PLC 工程概要查询 ​

功能: 查询 section 数量、rung 数量和工程修改状态。用 0x7405 响应。

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,当前控制器忽略。

0x7405 PLC 工程概要响应 ​

json
{
  "section_count": 1,
  "rung_count": 3,
  "current_section_index": 0,
  "dirty_flag": 0
}
字段类型含义
section_countint当前已使用的 section 数量。
rung_countint工程中的 rung 总数量。
current_section_indexint当前 section 的 0 基索引。
dirty_flagint0 表示无未保存修改,1 表示有未保存修改。

读取概要失败时控制器不发送本响应。

0x7406 PLC Section 数据查询 ​

功能: 查询一个 section。控制器按 rung 拆分,每个 rung 单独发送一帧 0x7407。

json
{
  "robot": 1,
  "section_no": 0,
  "rung_format": "compact-v1"
}
字段类型必填含义
robotint否兼容字段,当前控制器忽略。
section_noint否section 的 0 基索引,缺省为 0。
rung_formatstring否值为 compact-v1 时,0x7407 中 rung 元素使用紧凑数组;否则使用普通对象。

section 无效或 section 没有 rung 时不发送 0x7407。

0x7407 PLC Section 数据响应 ​

功能: 返回 section 基本信息、一个 rung 和该 rung 引用的功能块。一个 section 通常连续收到多帧。

json
{
  "section_index": 0,
  "section_no": 0,
  "used": 1,
  "name": "main",
  "language": 0,
  "sub_routine_number": -1,
  "first_rung": 0,
  "last_rung": 2,
  "sequential_page": 0,
  "rung_format": "compact-v1",
  "rung": {
    "index": 0,
    "data": {
      "rung_index": 0,
      "used": 1,
      "prev_rung": -1,
      "next_rung": 1,
      "nbr_lines_used": 8,
      "label": "",
      "comment": "",
      "elements": []
    }
  },
  "models": {
    "counters": [],
    "timers_iec": [],
    "ctus": [],
    "ctds": [],
    "moves": []
  }
}
字段类型含义
section_indexintsection 的 0 基索引。
section_noint与 section_index 相同,用于协议兼容。
usedint0 未使用,1 已使用。
namestringsection 名称。
languageint0 ladder,1 sequential。
sub_routine_numberint子程序编号;-1 表示主程序 section。
first_rungintsection 第一个 rung 索引。
last_rungintsection 最后一个 rung 索引。
sequential_pageintsequential 页号;ladder 通常为 0。
rung_formatstring仅请求 compact-v1 时存在。
rung.indexint本帧携带的 rung 索引。
rung.dataobject本帧的 rung 数据。
models.countersarray本 rung 引用的 Counter 模型。
models.timers_iecarray本 rung 引用的 IEC Timer 模型。
models.ctusarray本 rung 引用的 CTU 模型。
models.ctdsarray本 rung 引用的 CTD 模型。
models.movesarray本 rung 引用的 MOVE 模型。

rung.data 字段:

字段类型含义
rung_indexintrung 索引。
usedint0 未使用,1 已使用。
prev_rungint前一个 rung;-1 表示没有。
next_rungint后一个 rung;-1 表示没有。
nbr_lines_usedint本 rung 的逻辑行数,包含空行;普通和 compact-v1 格式都只返回这些行。
labelstringrung 标签。
commentstringrung 注释。
elementsarrayelements[y][x],共 nbr_lines_used 行,每行 12 列。

普通元素对象字段:

字段类型含义
typeint元素类型。
connected_with_topint是否与上方元素连接。
var_typeint变量类型。
var_numint变量 0 基编号。
indexed_var_typeint索引变量类型;-1 表示未使用。
indexed_var_numint索引变量编号。
dynamic_inputint运行时输入状态。
dynamic_stateint运行时元素状态。
dynamic_var_bakint运行时变量备份值。
dynamic_outputint运行时输出状态。
dynamic_var_settedint运行时变量是否已设置。
rung_index/x/yint元素所在 rung 和坐标。

compact-v1 元素为 [type,connected_with_top,var_type,var_num,indexed_var_type,indexed_var_num,runtime_bits]。runtime_bits 的 bit0 到 bit4 依次表示 dynamic_input、dynamic_state、dynamic_var_bak、dynamic_output、dynamic_var_setted。

0x7411 PLC Rung 数据查询 ​

功能: 查询单个 rung、批量完整模型或批量运行态。用 0x7412 响应。

单个查询:

json
{"rung_no": 0}

批量查询:

json
{"robot": 1, "rung_nos": [0, 1, 2]}
字段类型必填含义
robotint否兼容字段,控制器忽略。
rung_noint单个查询时必填要查询的 rung 索引。
rung_nosarray<int>批量查询时必填rung 索引数组。存在该数组时走批量路径。
rung_formatstring否当前命令忽略该字段;完整模型使用普通格式,运行态使用下面的专用结构。
runtime_onlyint否仅批量查询有效。缺省 0 返回完整模型;非 0 只返回运行态。
request_idJSON 值否仅批量运行态查询原样回传,可用于匹配请求;其他查询路径不回传。

运行态查询:

json
{"robot": 1, "rung_nos": [0, 1], "runtime_only": 1, "request_id": 12}

rung_nos 是数组时优先于 rung_no,包括空数组;没有该数组时走单 rung 路径,忽略 runtime_only 和 request_id。

0x7412 PLC Rung 数据响应 ​

单个查询响应是一个普通 rung:

json
{
  "rung_index": 0,
  "used": 1,
  "prev_rung": -1,
  "next_rung": 1,
  "nbr_lines_used": 8,
  "label": "",
  "comment": "",
  "elements": []
}
字段类型含义
rung_indexintrung 索引。
usedint0 未使用,1 已使用。
prev_rungint前一个 rung;-1 表示没有。
next_rungint后一个 rung;-1 表示没有。
nbr_lines_usedint本 rung 的逻辑行数,包含空行。
labelstringrung 标签。
commentstringrung 注释。
elementsarraynbr_lines_used x 12 普通元素对象数组。字段含义与 0x7407 相同。

单个 rung 无效时响应为 JSON null。

批量查询响应:

json
{
  "ok": 1,
  "rungs": [],
  "models": {
    "counters": [],
    "timers_iec": [],
    "ctus": [],
    "ctds": [],
    "moves": []
  }
}
字段类型含义
okint当前批量路径固定为 1。
rungsarray查询成功的普通 rung 对象。无效 rung 被跳过。
models.*array所有成功 rung 引用的功能块模型。

批量运行态响应(runtime_only != 0):

json
{
  "ok": 1,
  "runtime_only": 1,
  "request_id": 12,
  "rungs": [
    {
      "rung_no": 0,
      "nbr_lines_used": 8,
      "states": [
        0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0
      ],
      "runtime_values": [
        {"x": 0, "y": 0, "value": 0},
        {"x": 2, "y": 0, "current": 0, "preset": 10}
      ]
    }
  ]
}
字段类型含义
okint固定为 1;无效 rung 跳过,不代表每个请求的 rung 都有效。
runtime_onlyint固定为 1。
request_idJSON 值仅请求包含该字段时存在,原样回传。
rungs[].rung_nointrung 索引;注意这里使用 rung_no,不是完整模型中的 rung_index。
rungs[].nbr_lines_usedint本 rung 实际返回的逻辑行数。
rungs[].statesarray<int>一维数组,按行排列,长度为 nbr_lines_used * 12,坐标 (x,y) 对应 states[y * 12 + x]。
rungs[].runtime_valuesarray<object>可读取的元素数值;没有数值时整个字段省略。
runtime_values[].x/yint数值所属元素在 rung 内的坐标。
runtime_values[].valueint触点或线圈绑定的变量值,已解析索引变量偏移。
runtime_values[].current/presetintCounter、IEC Timer、CTU、CTD 的当前值和预置值。
runtime_values[].input/outputintMOVE 的输入值和输出值。

states 每项的 bit0 到 bit4 与 compact-v1 的 runtime_bits 相同。数值字段按元素类型和读取结果提供,可能只存在其中一部分,不能把缺失字段当作 0;本接口数值按 int 读取,GD 的小数部分不会保留。

运行态响应不含 elements、标签、注释及 models,应叠加到已获取的完整模型上。空请求数组或全部 rung 无效时返回 rungs: []。当前示教器用此路径轮询可见 rung。

0x7413 PLC 插入 Rung / 行请求 ​

功能: 未传 row_no 时,在 anchor rung 后插入新 rung;传入 row_no 时,在指定 rung 的该行之后插入一行。两种路径都用 0x7414 响应。

插入整个 rung:

json
{"robot": 1, "rung_no": 0, "rung_format": "compact-v1"}
字段类型必填含义
robotint否兼容字段,控制器忽略。
rung_noint是整个 rung 路径为 anchor 索引;行路径为要修改的 rung 索引。
rung_formatstring否插入整个 rung 时,仅 compact-v1 响应包含变更模型;插入行时始终返回变更模型,该字段只控制 rung 编码格式。
row_noint否存在时切换为行插入,表示插入位置之前的 0 基行号,范围为 0..nbr_lines_used-1。

在 rung 0 的第 0 行之后插入一行:

json
{"robot": 1, "rung_no": 0, "row_no": 0, "rung_format": "compact-v1"}

新行为空行,后续行下移,nbr_lines_used 加 1。已达最大行数、行号越界、插入位置跨越多行功能块或竖向连接时失败。

0x7414 PLC 插入 Rung / 行响应 ​

未传 row_no 时:

json
{
  "action": "insert",
  "anchor_rung_no": 0,
  "section_no": 0,
  "ok": 1,
  "inserted_rung_no": 1,
  "rung_format": "compact-v1",
  "changed_models": {"section": {}, "rungs": []}
}
字段类型含义
actionstring固定为 insert。
anchor_rung_noint请求中的 anchor rung。
section_noint所属 section 索引;找不到时为 -1。
okint1 成功,0 失败。
inserted_rung_noint新 rung 索引,仅成功时存在。
rung_formatstring仅 compact-v1 请求成功时存在。
changed_models.sectionobject仅 compact-v1 请求成功且找到 section 时返回变更后的 section。
changed_models.rungsarray仅 compact-v1 请求成功时返回 anchor、新 rung 和可能的后继 rung。
errorstring失败原因,仅失败时存在。

传入 row_no 时:

json
{
  "action": "insert_row",
  "rung_no": 0,
  "row_no": 1,
  "section_no": 0,
  "ok": 1,
  "rung_format": "compact-v1",
  "changed_models": {"section": {}, "rungs": []}
}
字段类型含义
actionstring固定为 insert_row。
rung_noint请求中的 rung 索引;行路径不返回 anchor_rung_no、inserted_rung_no。
row_noint新行索引,即请求的 row_no + 1;失败响应也按此规则回填。
section_noint所属 section 索引,找不到为 -1。
okint1 成功,0 失败。
rung_formatstring仅 compact-v1 请求成功时存在。
changed_models.sectionobject成功且找到 section 时返回的 section 元数据。
changed_models.rungsarray成功时返回修改后的当前 rung;未请求 compact-v1 时使用普通格式。
errorstring仅失败时存在。

0x7415 PLC 删除 Rung / 行请求 ​

功能: 未传 row_no 时删除整个 rung;传入 row_no 时删除 rung 内的一行。用 0x7416 响应。

删除整个 rung:

json
{"robot": 1, "rung_no": 1, "rung_format": "compact-v1"}
字段类型必填含义
robotint否兼容字段,控制器忽略。
rung_noint是整个 rung 路径为要删除的 rung;行路径为要修改的 rung 索引。
rung_formatstring否删除整个 rung 时,仅 compact-v1 响应包含变更模型;删除行时始终返回变更模型,该字段只控制 rung 编码格式。
row_noint否存在时切换为行删除,表示要删除的 0 基行号,范围为 0..nbr_lines_used-1。

删除 rung 0 的第 1 行:

json
{"robot": 1, "rung_no": 0, "row_no": 1, "rung_format": "compact-v1"}

后续行上移,nbr_lines_used 减 1。当前行数不得减到 8 以下;行号越界、目标行占用多行功能块或与上下行有竖向连接时失败。目标行不必为空,允许删除该行中的普通触点、线圈或水平连接。

0x7416 PLC 删除 Rung / 行响应 ​

未传 row_no 时:

json
{
  "action": "delete",
  "section_no": 0,
  "deleted_rung_no": 1,
  "ok": 1,
  "rung_format": "compact-v1",
  "changed_models": {"section": {}, "rungs": []}
}
字段类型含义
actionstring固定为 delete。
section_noint删除前所属 section。
deleted_rung_noint被删除的 rung。
okint1 成功,0 失败。
rung_formatstring仅 compact-v1 请求成功时存在。
changed_models.sectionobject仅 compact-v1 请求成功且找到 section 时返回。
changed_models.rungsarray仅 compact-v1 请求成功且有相邻 rung 时返回变更后的前驱和后继 rung。
errorstring失败原因。

传入 row_no 时:

json
{
  "action": "delete_row",
  "rung_no": 0,
  "row_no": 1,
  "section_no": 0,
  "ok": 1,
  "rung_format": "compact-v1",
  "changed_models": {"section": {}, "rungs": []}
}

action 固定为 delete_row,row_no 为请求中要删除的行号,rung_no 为所在 rung;不返回 deleted_rung_no。其余字段及存在条件与 insert_row 响应相同,成功时返回修改后的当前 rung。

0x7420 PLC 元素更新请求 ​

功能: 插入、替换或删除单个元素,也支持批量更新。用 0x7422 响应。

单元素:

json
{
  "robot": 1,
  "section_no": 0,
  "rung_format": "compact-v1",
  "rung_no": 0,
  "x": 0,
  "y": 0,
  "element": {
    "type": 1,
    "var_type": 400,
    "var_num": 0,
    "indexed_var_type": -1,
    "indexed_var_num": 0
  }
}

批量:

json
{
  "robot": 1,
  "rung_format": "compact-v1",
  "elements": [
    {"rung_no": 0, "x": 0, "y": 0, "element": {"type": 0}},
    {"rung_no": 0, "x": 1, "y": 0, "element": {"type": 0}}
  ]
}
字段类型必填含义
robotint否兼容字段,控制器忽略。
section_noint否兼容字段,当前定位实际使用 rung_no/x/y。
rung_formatstring否compact-v1 时 changed_models.rungs 使用紧凑格式。
rung_noint单元素时必填rung 索引。
x/yint单元素时必填元素坐标。
elementobject单元素时必填新元素数据;type=0 表示删除。
elementsarray批量时必填多个包含 rung_no/x/y/element 的项目。

element 字段:

字段类型含义
typeint元素类型;0 free,1 常开输入,2 常闭输入,3 上升沿,4 下降沿,9 水平连接,10 旧 Timer,11 Monostable,12 Counter,13 IEC Timer,14 Register,20 比较,50 到 53 输出,54 jump,55 call,60 operate,300 CTU,301 CTD,302 MOVE。编辑动作还支持 100 竖向连接、102 长连接、107 取反。
var_typeintPLC 变量类型,常用 400 到 407。
var_numint变量 0 基编号或功能块实例编号。
indexed_var_typeint索引变量类型,-1 表示不使用。
indexed_var_numint索引变量编号。

普通触点(1、2)可绑定 X/Y/M/T/C/GB/GI/GD;边沿触点(3、4)及线圈(50 到 53)当前属性校验仅接受 X/Y/GB,索引变量也按相同范围校验。X 仍是只读变量,线圈写出应使用 Y 或 GB。输出元素须放在末列,多格功能块受占用和边界约束。

type=100 设置与上方的竖向连接(要求 y>0);type=102 从当前空格向右补水平连接,遇非空格或输出列前停止;type=107 切换触点/线圈的对应类型(1/2、3/4、50/51、52/53)。这些值是编辑动作,不作为响应中的持久元素类型。

功能块插入时由控制器分配实例编号,不能依靠本请求的 var_num 指定新功能块实例;应重新读取 rung/功能块模型,再用对应的模型更新命令设置参数。connected_with_top 和运行态字段不从本请求的 element 对象读取。

批量处理不是事务,首次失败后停止;已成功项目会尝试保存。响应 ok=0 也可能包含已成功项目的 changed_models。单项内部先改元素类型、再设置属性,属性校验失败时前一步可能已经生效;失败后应重新查询对应 rung。

0x7422 PLC 元素更新响应 ​

json
{
  "action": "update_elements",
  "section_no": 0,
  "rung_no": 0,
  "x": 0,
  "y": 0,
  "processed_count": 2,
  "requested_count": 2,
  "ok": 1,
  "rung_format": "compact-v1",
  "changed_models": {"rungs": []}
}
字段类型含义
actionstring单元素为 insert_element,批量为 update_elements。
section_noint第一个处理元素所属 section;找不到时为 -1。
rung_noint第一个处理元素的 rung。
x/yint第一个处理元素坐标。
processed_countint成功处理的元素数量。
requested_countint批量请求总数,仅批量时存在。
okint1 全部成功,0 发生失败。
rung_formatstring请求 compact-v1 且有 changed rung 时存在。
changed_models.rungsarray已发生变化的 rung。
errorstring失败原因。

0x7423 IEC Timer 更新请求 ​

json
{
  "robot": 1,
  "timer_index": 0,
  "timer_iec": {
    "preset": {"type": 0, "num": 10},
    "value": {"type": 403, "num": 0},
    "base": 1000,
    "timer_mode": 0,
    "display_format": ""
  }
}
字段类型必填含义
robotint否兼容字段,控制器忽略。
timer_indexint是IEC Timer 实例索引。
timer_iec.presetobject是预置值引用。type=0 时 num 是常量。
timer_iec.valueobject是当前值变量引用。
timer_iec.baseint是时间基值,只接受 100、1000、60000 毫秒;省略时解析为 0,校验失败。
timer_iec.timer_modeint否0 TON,1 TOF,2 TP。
timer_iec.display_formatstring否ClassicLadder 显示格式。

请求中的运行态字段会被忽略。

IEC Timer、Counter、CTU、CTD 的 preset/value 均为 {"type": ..., "num": ...} 引用:type=0 时 num 为非负整数常量,其他情况为变量编号。当前可引用 X/Y/M/T/C/GI/GD,不接受 GB;MOVE 的 in/out 额外允许 GB。旧引用类型 1、2 分别兼容为 GI(406)、GD(407),响应使用规范化类型。变量编号须在对应容量范围内。

这些模型更新请求不是局部合并,未提供的引用或运行态字段通常按 0 解析;Timer 的 base 尤其必须显式传入。Counter、CTU、CTD 和 MOVE 会读取并写入请求中的运行态字段;Timer 更新则清零输入、备份输入、输出、启动标记和时间基累积值,并向当前值引用写入 0。

0x7424 IEC Timer 更新响应 ​

json
{
  "action": "update_timer_iec",
  "timer_index": 0,
  "ok": 1,
  "timer_iec": {}
}
字段类型含义
actionstring固定为 update_timer_iec。
timer_indexintTimer 索引。
okint1 成功,0 失败。
timer_iecobject成功时的完整模型。
errorstring失败原因。

timer_iec 包含 timer_index,preset,value,base,timer_mode,display_format,input,input_bak,output,timer_started,value_to_reach_one_base_unit。input/output 等字段是运行态。

0x7425 Counter 更新请求 ​

json
{
  "robot": 1,
  "counter_index": 0,
  "counter": {
    "preset": {"type": 0, "num": 10},
    "value": {"type": 404, "num": 0},
    "value_bak": 0,
    "input_reset": 0,
    "input_preset": 0,
    "input_count_up": 0,
    "input_count_up_bak": 0,
    "input_count_down": 0,
    "input_count_down_bak": 0,
    "output_done": 0,
    "output_empty": 0,
    "output_full": 0
  }
}
字段类型含义
robotint兼容字段,控制器忽略。
counter_indexintCounter 实例索引。
counter.presetobject预置值引用。
counter.valueobject当前值引用。
value_bakint上一次值。
input_resetintreset 输入状态。
input_presetintpreset 输入状态。
input_count_up/input_count_up_bakint加计数当前/备份输入。
input_count_down/input_count_down_bakint减计数当前/备份输入。
output_doneint完成输出。
output_emptyint空输出。
output_fullint满输出。

0x7426 Counter 更新响应 ​

json
{"action":"update_counter","counter_index":0,"ok":1,"counter":{}}
字段类型含义
actionstring固定为 update_counter。
counter_indexintCounter 索引。
okint1 成功,0 失败。
counterobject成功时的完整 Counter,字段同 0x7425,并额外带 counter_index。
errorstring失败原因。

0x7427 CTU 更新请求 ​

json
{
  "robot": 1,
  "ctu_index": 0,
  "ctu": {
    "preset": {"type":0,"num":10},
    "value": {"type":404,"num":0},
    "input_reset": 0,
    "input_count_up": 0,
    "input_count_up_bak": 0,
    "output_done": 0
  }
}
字段类型含义
robotint兼容字段,控制器忽略。
ctu_indexintCTU 实例索引。
ctu.presetobject预置值引用。
ctu.valueobject当前值引用。
input_resetintreset 输入。
input_count_upint加计数输入。
input_count_up_bakint上一次加计数输入。
output_doneint完成输出。

0x7428 CTU 更新响应 ​

json
{"action":"update_ctu","ctu_index":0,"ok":1,"ctu":{}}
字段类型含义
actionstring固定为 update_ctu。
ctu_indexintCTU 索引。
okint1 成功,0 失败。
ctuobject成功时完整 CTU,字段同 0x7427,额外带 ctu_index。
errorstring失败原因。

0x7429 CTD 更新请求 ​

json
{
  "robot": 1,
  "ctd_index": 0,
  "ctd": {
    "preset": {"type":0,"num":10},
    "value": {"type":404,"num":0},
    "input_load": 0,
    "input_count_down": 0,
    "input_count_down_bak": 0,
    "output_done": 0
  }
}
字段类型含义
robotint兼容字段,控制器忽略。
ctd_indexintCTD 实例索引。
ctd.presetobject预置值引用。
ctd.valueobject当前值引用。
input_loadintload 输入;兼容字段名 input_reset。
input_count_downint减计数输入。
input_count_down_bakint上一次减计数输入。
output_doneint完成输出。

0x742A CTD 更新响应 ​

json
{"action":"update_ctd","ctd_index":0,"ok":1,"ctd":{}}
字段类型含义
actionstring固定为 update_ctd。
ctd_indexintCTD 索引。
okint1 成功,0 失败。
ctdobject成功时完整 CTD,字段同 0x7429,额外带 ctd_index。
errorstring失败原因。

0x742B MOVE 更新请求 ​

json
{
  "robot": 1,
  "move_index": 0,
  "move": {
    "in": {"type":0,"num":10},
    "out": {"type":406,"num":0},
    "out_bak": 0,
    "en": 0,
    "en_bak": 0,
    "eno": 0
  }
}
字段类型含义
robotint兼容字段,控制器忽略。
move_indexintMOVE 实例索引。
move.inobject输入值引用。
move.outobject输出值引用。
out_bakint上一次输出值。
enint使能输入。
en_bakint上一次使能输入。
enoint使能输出。

0x742C MOVE 更新响应 ​

json
{"action":"update_move","move_index":0,"ok":1,"move":{}}
字段类型含义
actionstring固定为 update_move。
move_indexintMOVE 索引。
okint1 成功,0 失败。
moveobject成功时完整 MOVE,字段同 0x742B,额外带 move_index。
errorstring失败原因。

0x742D PLC 元素属性更新请求 ​

功能: 不改变元素类型,仅修改变量引用属性。

json
{
  "robot": 1,
  "section_no": 0,
  "rung_format": "compact-v1",
  "rung_no": 0,
  "x": 0,
  "y": 0,
  "element": {
    "type": 1,
    "var_type": 402,
    "var_num": 0,
    "indexed_var_type": -1,
    "indexed_var_num": 0
  }
}
字段类型含义
robotint兼容字段,控制器忽略。
section_noint兼容字段,控制器实际按 rung 定位。
rung_formatstringcompact-v1 时响应 rung 使用紧凑格式。
rung_nointrung 索引。
x/yint元素坐标。
element.typeint必须与当前位置可编辑元素的类型相同。
element.var_typeint新变量类型。
element.var_numint新变量编号。
element.indexed_var_typeint索引变量类型,-1 表示不使用。
element.indexed_var_numint索引变量编号。

触点/线圈的变量及索引变量范围与 0x7420 相同;功能块、jump/call 和表达式元素仅更新 var_num。若坐标落在多格功能块的占位格上,控制器会解析到可编辑主格;响应 x/y 仍回填请求坐标,客户端应应用返回的完整 rung。

0x742E PLC 元素属性更新响应 ​

json
{
  "action": "update_element_properties",
  "section_no": 0,
  "rung_no": 0,
  "x": 0,
  "y": 0,
  "ok": 1,
  "rung_format": "compact-v1",
  "changed_models": {"rungs":[]}
}
字段类型含义
actionstring固定为 update_element_properties。
section_noint元素所属 section。
rung_no/x/yint被修改元素的位置。
okint1 成功,0 失败。
rung_formatstring请求 compact-v1 且成功时存在。
changed_models.rungsarray修改后的 rung。
errorstring失败原因。类型不匹配时为 element type mismatch for property update。

0x7430 PLC 变量写入请求 ​

功能: 按页写入 10 个 PLC 变量。用 0x7432 返回结果。

json
{
  "var_type": 402,
  "var_page": 1,
  "value": [1,0,0,0,0,0,0,0,0,0]
}
字段类型必填含义
var_typeint是400 X、401 Y、402 M、403 T、404 C、405 GB、406 GI、407 GD。
var_pageint是1 基页码,每页 10 个变量。
valuearray<int>是10 个写入值。最后一页越界位置被忽略并在响应中返回 0。

X 是只读变量。写 X 仍会收到 0x7432,其中 ok=0,error="read_only",value 全为 0。无效类型、页码小于 1 或底层变量写入失败时不发送该响应。超出变量总数的整页返回 10 个 0,ok=1;成功响应的 value 是请求值回显,不是写后回读值。

0x7431 PLC 变量读取请求 ​

json
{"var_type": 402, "var_page": 1}
字段类型必填含义
var_typeint是400 X、401 Y、402 M、403 T、404 C、405 GB、406 GI、407 GD。
var_pageint是1 基页码,每页 10 个变量。

无效类型、页码小于 1 或底层变量读取失败时不发送 0x7432。超出变量总数的整页返回 10 个 -1,ok=1。

0x7432 PLC 变量值响应 ​

功能: 响应 0x7430 或 0x7431。

json
{
  "var_type": 402,
  "var_page": 1,
  "ok": 1,
  "value": [0,0,0,0,0,0,0,0,0,0]
}
字段类型含义
var_typeint请求的变量类型。
var_pageint请求的 1 基页码。
okint1 成功,0 失败。
valuearray<int>10 个变量值。读取最后一页时,越界位置为 -1;写入响应越界位置为 0。
errorstring失败原因;当前明确值包括 read_only。

变量数量:X 16、Y 16、M 999、T 99、C 99、GB/GI/GD 各 999。GD 在该接口中按 int 传输,小数会丢失。

0x7433 PLC 通用参数查询 ​

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,控制器忽略。

用 0x7434 响应。

0x7434 PLC 通用参数响应 ​

json
{
  "nbr_rungs": 0,
  "nbr_bits": 0,
  "nbr_words": 0,
  "nbr_counters": 0,
  "nbr_ctus": 0,
  "nbr_ctds": 0,
  "nbr_moves": 0,
  "nbr_timers_iec": 0,
  "nbr_registers": 0,
  "register_list_size": 0,
  "nbr_phys_inputs": 0,
  "nbr_phys_outputs": 0,
  "nbr_arithm_expr": 0,
  "nbr_sections": 0,
  "nbr_symbols": 0,
  "nbr_phys_words_inputs": 0,
  "nbr_phys_words_outputs": 0,
  "period_millis_task_logic": 0,
  "period_millis_task_scan_inputs": 0,
  "real_inputs_outputs_only_on_target": 0,
  "automatically_adjust_summer_winter_time": 0,
  "rung_width": 12,
  "rung_height_default": 8,
  "rung_height_max": 1000
}
字段类型含义
nbr_rungsintrung 容量。
nbr_bitsintClassicLadder 内部 bit 数量。
nbr_wordsintClassicLadder 内部 word 数量。
nbr_countersintCounter 数量。
nbr_ctusintCTU 数量。
nbr_ctdsintCTD 数量。
nbr_movesintMOVE 数量。
nbr_timers_iecintIEC Timer 数量。
nbr_registersintRegister 数量。
register_list_sizeintRegister 数据列表容量。
nbr_phys_inputsint物理 bit 输入数量。
nbr_phys_outputsint物理 bit 输出数量。
nbr_arithm_exprint算术表达式数量。
nbr_sectionsintsection 容量。
nbr_symbolsint符号表容量。
nbr_phys_words_inputsint物理 word 输入数量。
nbr_phys_words_outputsint物理 word 输出数量。
period_millis_task_logicintPLC 逻辑任务周期,单位 ms。
period_millis_task_scan_inputsint输入扫描任务周期,单位 ms。
real_inputs_outputs_only_on_targetint是否只在目标设备使用真实 IO。
automatically_adjust_summer_winter_timeint是否自动调整夏令时和冬令时。
rung_widthint每个 rung 的列数,当前为 12。
rung_height_defaultint默认行数及行删除下限,当前为 8。
rung_height_maxint每个 rung 的最大行数,当前控制器为 1000。

示例中其他容量和周期的 0 是占位值,实际值以控制器返回为准。

当前 SoftPLC 页面在初始化和成功导入后会发送本查询,响应信号由通信层转发;页面暂未连接消费这些字段的槽函数。协议接入方仍应读取新增的行列容量字段。

0x7435 PLC 重置请求 ​

功能: 调用 ClassicLadder reset。用 0x7436 响应。

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,控制器忽略。

reset 会重置 ClassicLadder 运行数据,并恢复原先的运行状态;它不是停止命令,运行中调用后可能继续运行。需要保持停止时使用 0x7401 并确认状态。

当前 reset 没有调用 PlcVariableSystem::resetRuntime(),因此不能保证扩展变量 M/T/C 全部清零。

0x7436 PLC 重置响应 ​

json
{"ok": 1, "state": 1}
字段类型含义
okint1 重置成功,0 重置失败。
stateint重置后的 PLC 状态,含义同 0x7403;运行中重置不保证变为 1,未初始化可返回 -3。
errorstring失败原因,仅失败时存在。

0x7437 PLC 工程导出准备请求 ​

功能: 将当前内存工程保存为可下载的 default.clprj 快照,用 0x7438 返回下载信息。调用前必须确认 PLC 为停止状态(state=1);未停止时先用 0x7401 停止并等待状态响应。

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,控制器忽略。

该命令只准备工程文件,不在 PLC JSON 响应中传输文件内容。

0x7438 PLC 工程导出准备响应 ​

json
{
  "ok": 1,
  "state": 1,
  "remote_path": "./plc/transfer/default.clprj",
  "file_name": "default.clprj",
  "size": 4096,
  "md5": "0123456789abcdef0123456789abcdef"
}
字段类型含义
okint1 准备成功,0 失败。
stateint当前 PLC 状态。
remote_pathstring成功时的控制器下载路径,当前固定为 ./plc/transfer/default.clprj。
file_namestring成功时的建议文件名,固定为 default.clprj。
sizeuint成功时的文件字节数,范围为 1 到 16777216(16 MiB)。
md5string成功时文件的 32 位小写十六进制 MD5。
codestring失败时的错误分类:plc_running、prepare_failed 或 export_failed。
errorstring仅失败时存在,错误说明。

示例中的 size、md5 仅为格式示意;下载完成后应校验文件实际大小和 MD5。每次导出准备都会重新生成该路径的快照。

0x7439 PLC 工程导入准备请求 ​

功能: 在 PLC 停止时准备上传路径,用 0x743A 响应。当前仅支持 .clprj 工程,文件大小不得超过 16 MiB。

json
{"robot": 1, "extension": "clprj", "size": 4096}
字段类型必填含义
robotint否兼容字段,控制器忽略。
extensionstring是必须为小写 clprj,不带点。
sizeuint是待上传文件的实际字节数,范围为 1 到 16777216。

准备成功会删除原暂存文件并登记新的待导入路径。此时尚未替换当前工程。

0x743A PLC 工程导入准备响应 ​

json
{
  "ok": 1,
  "state": 1,
  "remote_path": "./plc/transfer/import.clprj",
  "max_size": 16777216
}
字段类型含义
okint1 准备成功,0 失败。
stateint当前 PLC 状态。
remote_pathstring成功时的上传路径,当前固定为 ./plc/transfer/import.clprj。
max_sizeuint成功时返回最大文件字节数,当前为 16777216。
codestring失败时的错误分类:plc_running、invalid_file 或 prepare_failed。
errorstring仅失败时存在,错误说明。

收到成功响应后,通过通用文件传输通道上传到 remote_path;上传完成后再发送 0x743B。

0x743B PLC 工程导入应用请求 ​

功能: 校验已上传工程,备份当前工程,加载新工程并保存到 ./plc/default.clprj,重新加载后执行 reset。用 0x743C 响应。调用时仍须为停止状态。

json
{
  "robot": 1,
  "size": 4096,
  "md5": "0123456789abcdef0123456789abcdef"
}
字段类型必填含义
robotint否兼容字段,控制器忽略。
sizeuint是已上传文件的实际字节数,必须与暂存文件一致且在 1 到 16777216 之间。
md5string是已上传文件的 32 位小写十六进制 MD5;控制器按字符串精确比较。

请求不接受自选应用路径,始终使用最近一次成功准备的暂存路径。size、md5 必须由实际文件计算,不能照抄示例。

每次应用尝试都会消费待导入状态;校验失败、导入失败或调用时 PLC 已不在停止状态,均需重新执行准备、上传、应用流程。导入过程失败会尝试恢复原工程;不能仅凭文件上传成功判断工程已生效。

0x743C PLC 工程导入应用响应 ​

json
{
  "ok": 1,
  "state": 1,
  "project_summary": {
    "section_count": 1,
    "rung_count": 3,
    "current_section_index": 0,
    "dirty_flag": 0
  }
}
字段类型含义
okint1 已应用成功,0 失败。
stateint应用或错误处理后的 PLC 状态。成功后保持停止,不自动启动。
project_summaryobject成功且能读取概要时存在,字段与 0x7405 相同。
codestring仅失败时存在,取值见下表。
errorstring仅失败时存在,错误说明。

工程导入/导出错误分类:

code适用响应含义
plc_running0x7438/0x743A/0x743C当前状态不是 STOP(1),包括运行、冻结、加载或未初始化等状态。
prepare_failed0x7438/0x743A无法创建工程传输目录。
export_failed0x7438快照保存失败,或导出文件不存在、为空、超过大小限制。
invalid_file0x743A扩展名或声明的文件大小不合法。
not_prepared0x743C没有待应用的导入准备记录。
validation_failed0x743C暂存文件无效、大小不匹配或 MD5 不匹配。
backup_failed0x743C无法备份当前工程,尚未加载新工程。
import_failed0x743C导入失败,已恢复原工程。
rollback_failed0x743C导入及原工程恢复均失败,需检查控制器上的工程状态。

失败响应示例:

json
{
  "ok": 0,
  "code": "validation_failed",
  "error": "SoftPLC project validation failed",
  "state": 1
}

工程文件传输顺序 ​

工程二进制数据复用通用文件传输通道,PLC 命令只负责准备和应用:

  1. 导出:停止 PLC 并确认 state=1,发送 0x7437,收到成功的 0x7438 后,用 0x1074(REQUEST_DOWNLOAD_FILE)请求下载;等待通用文件传输完成,再核对大小和 MD5。
  2. 导入:停止 PLC 并确认 state=1,发送 0x7439,收到成功的 0x743A 后,用 0x1072(REQUEST_UPLOAD_FILE)请求上传;等待上传完成,再发送 0x743B。收到成功的 0x743C 后,重新查询工程概要、section 和通用参数。

通用下载请求 0x1074:

json
{"name": "./plc/transfer/default.clprj"}

通用上传请求 0x1072:

json
{"name": "./plc/transfer/import.clprj", "size": 4096}

这里的 name 应原样使用 PLC 准备响应中的 remote_path;通用请求分别通过 0x1075、0x1073 响应,后续数据帧和完成确认沿用通用文件协议。上传路径不匹配或尚未准备时,0x1073 返回 answer="no", cause="invalid_project_transfer_path";通道忙时返回 answer="busy"。

导入使用控制器级单个待导入路径,没有会话 ID 或并行任务队列。客户端应串行执行,避免多个客户端同时准备或覆盖暂存文件。工程文件不携带开机自启设置,成功导入后需启动时另发 0x7400。

0x743D PLC 开机自启查询请求 ​

功能: 查询持久化的开机自启配置,用 0x743F 响应。该配置与当前 PLC 运行状态分别查询。

json
{"robot": 1}
字段类型必填含义
robotint否兼容字段,控制器忽略。

./plc/runtime.json 不存在或配置对象未包含 auto_start 时,正常返回关闭。文件损坏、内容无效或读取失败时返回 ok=0。

0x743E PLC 开机自启设置请求 ​

功能: 持久化开机自启配置,用 0x743F 响应。只修改下次控制器启动时的行为,不立即启停 PLC,也不要求当前 PLC 停止。

json
{"robot": 1, "auto_start": true}
字段类型必填含义
robotint否兼容字段,控制器忽略。
auto_startbool / int是true/false,兼容整数 1/0;其他值及缺失字段均无效。

控制器下次启动时,只有 SoftPLC 初始化和默认工程准备成功,且配置读取成功、auto_start=true,才调用启动。读取配置失败时按关闭处理。

0x743F PLC 开机自启响应 ​

查询成功:

json
{"action": "query", "ok": 1, "auto_start": false}

设置成功:

json
{"action": "set", "ok": 1, "auto_start": true}
字段类型含义
actionstring查询为 query,设置为 set。
okint1 成功,0 失败。
auto_startbool查询返回配置值,读取失败时为 false;设置请求合法时返回请求值,只有 ok=1 才表示持久化成功。非法设置请求不返回本字段。
errorstring仅失败时存在,取值见下表。
error含义
Failed to read SoftPLC auto-start configuration配置读取失败。
Invalid SoftPLC auto-start value设置请求缺少字段或值不合法。
Failed to persist SoftPLC auto-start configuration配置持久化失败。

该响应不含 state 或 code;当前运行状态仍用 0x7402/0x7403 查询。

核对依据 ​