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;typecycle 时必填且必须大于 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 必须为 cycleeventtypecyclecycle 必须大于 0,校验失败应答 CMD_ACK + STATUS_INVALID_PARAM (0x03)
  4. PLC 程序文件由网关后端通过 PUT /api/v1/uploadPLC 上传至其运行目录 plc/ 子目录,program 字段为该文件的绝对路径,服务端直接读取该路径即可
  5. 调试模式的具体行为(如单步运行、跳过输出等)由软PLC运行时实现约定,协议层面仅区分启动/停止通道
相关推荐
做萤石二次开发的哈哈1 小时前
海康班班通交互一体机技能接入实战:ISAPI透传+OTAP双协议封装,Web/App/小程序教学管理应用一站生成
前端·物联网·小程序·交互·萤石开放平台·蓝海aiot一站式工作台·aiot开发
希艾席帝恩1 小时前
数字孪生平台与数据内容工具对比:山海鲸可视化VS镝数
大数据·人工智能·物联网·低代码·信息可视化·数字化转型
(Charon)1 小时前
【C++】网络缓冲区设计(四):epoll + Reactor中Buffer的完整读写流程
开发语言·c++
绿蕉2 小时前
输电线路的“数字孪生”守护者:支持蜂窝物联网通信的智能激光雷达点云监测装置
物联网
csdn_aspnet2 小时前
C++ 未排序数组中第 k 个最小/最大元素 | 最坏情况下的线性时间
数据结构·c++·算法
RuoZoe12 小时前
从 2026 年 3 月 1 日开源,到 26.10.9:Jalium UI 半年时间到底走了多远?
c语言·c++
鱼子星_13 小时前
【C++】继承和多态(上)
c++·笔记
D_codingXuChu14 小时前
2026物联网应用开发服务商:D-coding定制开发指南
物联网·开发经验·d-coding
郝学胜-神的一滴14 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生