aiDgeController软PLC控制通讯协议文档

aiDgeController软PLC控制通讯协议文档

概述

本文档定义网关后端(aiDgeController,下称客户端 )与网关主程序(下称服务端)之间,通过 UnixSocket 进行软PLC启停、调试模式启停及运行状态查询的命令联动协议。

  • 客户端:网关后端进程,作为 UnixSocket 客户端主动连接网关主程序
  • 服务端:网关主程序进程,作为 UnixSocket 服务端监听命令通道,接收命令并控制软PLC运行时
  • 通道建立:服务端先创建并监听 UnixSocket;客户端连接后即可发送命令,每次命令采用"发送 → 等待应答"的同步方式

命令通道 UnixSocket 路径由网关后端配置文件 etc/config.xml 中 /IPCUnixSock/sockName 指定,未配置时默认使用 /tmp/aiDg_UnixSOCK。

协议特性

  • 协议版本: 1
  • 传输方式: UnixSocket (AF_UNIX, SOCK_STREAM)
  • 序列化方式: 二进制包头 + JSON 数据体
  • 字节序: 主机字节序(小端)

协议结构

1. 协议包头 (ProtocolHeader)

固定 12 字节,每个数据包必须包含包头(与网关通讯协议 GATEWAY_PROTOCOL.md 包头格式一致):

偏移 长度 字段名 类型 说明
0 4 magic uint32_t 魔数,固定值 0x4E474154(ASCII "NGAT")
4 1 version uint8_t 协议版本,当前为 1
5 1 cmdType uint8_t 命令类型(见下文命令定义)
6 2 dataLength uint16_t 数据体长度,0 ~ 65523
8 2 checksum uint16_t 校验和
10 2 reserved uint16_t 保留字节

2. 完整数据包格式

复制代码
[ProtocolHeader (12B)] [Data (0~65523B)]

3. 校验和计算

  1. 先将包头中的 checksum 字段置 0
  2. 计算整个包(包头 + 数据体)所有字节的累加和
  3. 取结果的低 16 位作为 checksum
  4. 将结果填入包头 checksum 字段

命令定义

软PLC启停命令

值 名称 说明 方向 数据体
0x01 CMD_START_PLC 启动软PLC 客户端→服务端 JSON(运行参数)
0x02 CMD_STOP_PLC 停止软PLC 客户端→服务端 无
0x06 CMD_GET_PLC_STATUS 查询软PLC运行状态 客户端→服务端 无

软PLC调试模式启停命令

值 名称 说明 方向 数据体
0x08 CMD_START_PLC_DEBUG 调试模式启动软PLC 客户端→服务端 JSON(运行参数)
0x09 CMD_STOP_PLC_DEBUG 调试模式停止软PLC 客户端→服务端 无

应答命令

值 名称 说明 方向 数据体
0xFF CMD_ACK 确认/应答 服务端→客户端 视命令而定

数据体格式

1. CMD_START_PLC / CMD_START_PLC_DEBUG 运行参数(JSON)

客户端启动软PLC时,将运行参数以 JSON 格式置于数据体中:

字段 类型 必填 说明
type string 是 运行方式:cycle 周期扫描方式 / event 事件触发方式
cycle int 条件 周期扫描周期,单位 ms;type 为 cycle 时必填且必须大于 0
program string 否 PLC 程序文件绝对路径(网关后端上传目录 plc/ 下的文件)
debug bool 否 调试模式标记;CMD_START_PLC_DEBUG 命令中固定为 true

示例(周期扫描方式启动):

json 复制代码
{"type":"cycle","cycle":100,"program":"/opt/cnetgate/bin/plc/main.bin"}

示例(事件触发方式调试启动):

json 复制代码
{"type":"event","program":"/opt/cnetgate/bin/plc/main.bin","debug":true}

2. CMD_ACK 应答数据体

CMD_START_PLC / CMD_STOP_PLC / CMD_START_PLC_DEBUG / CMD_STOP_PLC_DEBUG 应答:数据体为 1 字节执行状态(ResponseStatus):

值 名称 说明
0x00 STATUS_SUCCESS 执行成功
0x01 STATUS_FAILED 执行失败
0x02 STATUS_UNKNOWN_CMD 未知命令
0x03 STATUS_INVALID_PARAM 无效参数
0x04 STATUS_TIMEOUT 超时

CMD_GET_PLC_STATUS 应答:数据体为 1 字节运行状态:

值 说明
0x01 运行中
0x00 已停止

交互流程

1. 启动软PLC(含调试模式启动)

复制代码
网关后端(客户端)                          网关主程序(服务端)
      |                                        |
      |--- CMD_START_PLC + JSON运行参数 ----->|
      |                                        | 校验参数,加载PLC程序,
      |                                        | 按指定运行方式启动软PLC
      |<-- CMD_ACK + STATUS_SUCCESS(0x00) ----|
      |                                        |

调试模式启动使用 CMD_START_PLC_DEBUG(0x08),流程相同。

2. 停止软PLC(含调试模式停止)

复制代码
网关后端(客户端)                          网关主程序(服务端)
      |                                        |
      |--- CMD_STOP_PLC --------------------->|
      |                                        | 停止软PLC运行
      |<-- CMD_ACK + STATUS_SUCCESS(0x00) ----|
      |                                        |

调试模式停止使用 CMD_STOP_PLC_DEBUG(0x09),流程相同。

3. 查询软PLC运行状态

复制代码
网关后端(客户端)                          网关主程序(服务端)
      |                                        |
      |--- CMD_GET_PLC_STATUS --------------->|
      |                                        | 读取软PLC运行状态
      |<-- CMD_ACK + 运行状态(0x01/0x00) -----|
      |                                        |

数据包示例

以"周期扫描方式(100ms)启动软PLC"为例:

请求数据包 (CMD_START_PLC,JSON 数据体 {"type":"cycle","cycle":100} 共 30 字节):

复制代码
偏移 0x00: 54 41 47 4E  magic = 0x4E474154 ("NGAT",小端存储)
偏移 0x04: 01           version = 1
偏移 0x05: 01           cmdType = 0x01 (CMD_START_PLC)
偏移 0x06: 1E 00        dataLength = 30
偏移 0x08: XX XX        checksum(按校验和算法计算)
偏移 0x0A: 00 00        reserved
偏移 0x0C: 7B 22 74 79 70 65 22 3A 22 63 79 63 6C 65 22 2C 22 63 79 63 6C
           65 22 3A 31 30 30 7D    数据体 {"type":"cycle","cycle":100}

应答数据包(CMD_ACK,1 字节状态 0x00):

复制代码
偏移 0x00: 54 41 47 4E  magic = 0x4E474154
偏移 0x04: 01           version = 1
偏移 0x05: FF           cmdType = 0xFF (CMD_ACK)
偏移 0x06: 01 00        dataLength = 1
偏移 0x08: XX XX        checksum
偏移 0x0A: 00 00        reserved
偏移 0x0C: 00           STATUS_SUCCESS

与网关后端 REST 接口的对应关系

REST 接口(api.md 16 软PLC) 协议命令
GET /api/v1/startPLC CMD_START_PLC
GET /api/v1/stopPLC CMD_STOP_PLC
PUT /api/v1/uploadPLC 无命令(仅保存文件到运行目录 plc/ 子目录)
POST /api/v1/setPLCRuntime 无命令(仅持久化配置,启动时随 CMD_START_PLC 下发)
GET /api/v1/PLCStatus CMD_GET_PLC_STATUS

注意事项

  1. 客户端每次命令等待应答超时时间为 3 秒,超时后判定命令失败
  2. 服务端收到无法识别的 cmdType 时,应答 CMD_ACK + STATUS_UNKNOWN_CMD (0x02)
  3. 服务端应校验 JSON 运行参数:type 必须为 cycle 或 event;type 为 cycle 时 cycle 必须大于 0,校验失败应答 CMD_ACK + STATUS_INVALID_PARAM (0x03)
  4. PLC 程序文件由网关后端通过 PUT /api/v1/uploadPLC 上传至其运行目录 plc/ 子目录,program 字段为该文件的绝对路径,服务端直接读取该路径即可
  5. 调试模式的具体行为(如单步运行、跳过输出等)由软PLC运行时实现约定,协议层面仅区分启动/停止通道
相关推荐
LuminousCPP18 分钟前
从零开始学 C++(三):类和对象入门|从 struct 到 class,理解封装、对象与 this 指针
c++·笔记·学习·类和对象
郝学胜-神的一滴23 分钟前
游戏引擎原理与实践 01:聊聊游戏引擎的前世今生
开发语言·c++·游戏引擎·产品运营·软件工程·产品经理·untiy
晴天的雨.9921 小时前
【C++算法】三数之和
开发语言·c++·算法
pippocao1 小时前
王者荣耀日志组件BqLog 为何如此快之3——压缩日志执行路径优化
c++
AC赳赳老秦1 小时前
公开 CSV 数据集批量处理实战:用 OpenClaw 高效完成下载、清洗与标准化分析样本生成
java·开发语言·汇编·c++·python·deepseek·openclaw
TDengine (老段)2 小时前
TDengine TSDB 实战排障三(集群高可用)
数据库·物联网·时序数据库·tdengine·涛思数据·问题排查
凉茶钱2 小时前
【吃透C++】static、友元、内部类、匿名对象与拷贝编译器优化全解析
c++·青少年编程·visual studio
悟天特斯2 小时前
AI驱动的楼宇节能:从经验粗放到数据精准的转型路径
人工智能·物联网
无名猿2 小时前
左值引用、右值引用与万能引用:引用折叠全解
c++·现代c++·模板元编程·语法基础
多多爱学习2 小时前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试