news 2026/4/3 4:16:37

openplc runtime v4 调试协议(英译中)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
openplc runtime v4 调试协议(英译中)

调试协议

概述

OpenPLC Runtime v4 提供基于 WebSocket 的调试接口,用于实时变量检查和修改。这使得调试器(如 OpenPLC Editor)能够监控和控制 PLC 执行,而无需重复 HTTPS 连接的开销。

有关 WebSocket 连接和身份验证的详细信息,请参阅 webserver/DEBUG_WEBSOCKET.md。

连接详情

端点:wss://<主机>:8443/api/debug

身份验证:JWT 令牌(通过查询参数或认证字典)

协议:基于 WebSocket 的 Socket.IO

调试命令格式

调试命令以表示二进制协议消息的十六进制字符串形式发送。格式遵循 Modbus 风格的功能码模式。

命令结构

[功能码] [数据字节...]

所有命令和响应都以空格分隔的十六进制字节表示(例如,"41 DE AD 00 00")。

功能码

0x41 - DEBUG_INFO(调试信息)

获取 PLC 程序的调试信息。

请求:

41 DE AD 00 00

响应:

7E [信息字节...]

目的:检索已加载 PLC 程序的元数据,包括变量数量和程序哈希值。


0x42 - DEBUG_SET(设置调试)

设置变量的跟踪标志。

请求:

42 [变量索引] [跟踪标志] [附加数据...]

目的:启用或禁用特定变量的跟踪。启用跟踪后,变量值将被记录或传输以进行监控。

跟踪标志:

  • 0x00- 禁用跟踪
  • 0x01- 启用跟踪

0x43 - DEBUG_GET(获取调试)

获取变量的跟踪数据。

请求:

43 [变量索引] [数量] [附加数据...]

响应:

7E [跟踪数据字节...]

目的:检索指定变量的当前值和跟踪信息。


0x44 - DEBUG_GET_LIST(获取列表)

获取变量列表的值。

请求:

44 [数量高字节] [数量低字节] [索引1高字节] [索引1低字节] [索引2高字节] [索引2低字节] ...

示例:

44 00 03 00 00 00 01 00 02

(获取 3 个变量:索引 0, 1, 2)

响应:

7E [变量数据...]

响应格式:
响应中的每个变量包括:

  • 变量索引(2 字节)
  • 变量值(大小取决于类型)
  • 变量类型指示符

目的:在单个请求中高效地检索多个变量值。这是调试会话期间轮询变量的主要方法。


0x45 - DEBUG_GET_MD5(获取 MD5)

获取已加载 PLC 程序的 MD5 哈希值。

请求:

45 DE AD 00 00

响应:

7E [表示 MD5 哈希值的 32 个十六进制字符] 00

响应示例:

7E 61 62 63 64 65 66 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 00

(MD5: abcdef1234567890123456789012345678)

目的:验证调试器是否连接到预期的 PLC 程序。加载新程序时哈希值会改变。


响应格式

所有成功的响应都以0x7E(十进制 126,字符~)作为成功指示符开头。

错误响应可能返回不同的状态码或空响应。

变量类型

PLC 程序中的变量根据 IEC 61131-3 标准具有不同的类型:

布尔类型

  • BOOL- 1 位(传输为 1 字节)

整数类型

  • SINT- 8 位有符号整数
  • USINT- 8 位无符号整数
  • INT- 16 位有符号整数
  • UINT- 16 位无符号整数
  • DINT- 32 位有符号整数
  • UDINT- 32 位无符号整数
  • LINT- 64 位有符号整数
  • ULINT- 64 位无符号整数

实数类型

  • REAL- 32 位浮点数
  • LREAL- 64 位浮点数

时间类型

  • TIME- 持续时间
  • DATE- 日历日期
  • TIME_OF_DAY/TOD- 一天中的时间
  • DATE_AND_TIME/DT- 日期和时间

字符串类型

  • STRING- 可变长度字符串

位字符串类型

  • BYTE- 8 位
  • WORD- 16 位
  • DWORD- 32 位
  • LWORD- 64 位

使用示例

Python 客户端

importsocketio# 首先获取 JWT 令牌(请参阅 webserver/DEBUG_WEBSOCKET.md)TOKEN="你的_jwt_令牌_这里"sio=socketio.Client(ssl_verify=False)@sio.event(namespace='/api/debug')defdebug_response(data):ifdata.get('success'):print(f"响应:{data.get('data')}")else:print(f"错误:{data.get('error')}")# 连接sio.connect('https://localhost:8443',auth={'token':TOKEN},namespaces=['/api/debug'],transports=['websocket'])# 获取 MD5 哈希值sio.emit('debug_command',{'command':'45 DE AD 00 00'},namespace='/api/debug')# 获取变量列表(变量 0, 1, 2)sio.emit('debug_command',{'command':'44 00 03 00 00 00 01 00 02'},namespace='/api/debug')sio.sleep(2)sio.disconnect()

JavaScript 客户端

importiofrom'socket.io-client';// 首先获取 JWT 令牌consttoken='你的_jwt_令牌_这里';constsocket=io('wss://localhost:8443/api/debug',{transports:['websocket'],query:{token:token},rejectUnauthorized:false});socket.on('connected',(data)=>{console.log('已连接:',data);// 获取 MD5 哈希值socket.emit('debug_command',{command:'45 DE AD 00 00'});});socket.on('debug_response',(response)=>{if(response.success){console.log('数据:',response.data);}else{console.error('错误:',response.error);}});

轮询策略

对于变量的连续监控:

  1. 连接到 WebSocket 并使用 JWT 身份验证
  2. 获取 MD5以验证程序身份
  3. 轮询变量定期使用 DEBUG_GET_LIST(例如,每 100 毫秒)
  4. 解析响应提取变量值
  5. 断开连接当调试会话结束时

相较于 REST API 的优势:

  • 整个会话只需一次 TLS 握手
  • 延迟更低(无 HTTP 开销)
  • 双向通信
  • 持久连接

实现细节

运行时端

调试协议在 PLC 运行时核心中实现:

处理器:core/src/plc_app/debug_handler.c

关键函数:

  • process_debug_data()- 功能码的主要调度器
  • debugInfo()- 处理 DEBUG_INFO (0x41)
  • debugSetTrace()- 处理 DEBUG_SET (0x42)
  • debugGetTrace()- 处理 DEBUG_GET (0x43)
  • debugGetList()- 处理 DEBUG_GET_LIST (0x44)
  • debugGetMD5()- 处理 DEBUG_GET_MD5 (0x45)

Web 服务器端

WebSocket 接口在 Web 服务器中实现:

处理器:webserver/debug_websocket.py

关键函数:

  • init_debug_websocket()- 初始化 Socket.IO 服务器
  • handle_connect()- 验证连接
  • handle_debug_command()- 通过 Unix 套接字将命令转发到运行时

通信流程

[调试器] --WebSocket--> [Web 服务器] --Unix 套接字--> [PLC 运行时] | [调试处理器] | [变量访问]

安全性

身份验证

  • WebSocket 连接需要 JWT 令牌
  • 通过 REST API 登录端点获取令牌
  • 连接时验证令牌,并且可以撤销

授权

  • 调试访问需要经过身份验证的用户
  • 执行前验证命令
  • 命令解析中的缓冲区溢出保护

数据保护

  • 所有通信通过 WSS(WebSocket 安全)加密
  • 变量数据以二进制格式传输
  • 错误消息中不包含敏感信息

性能考虑

延迟

  • WebSocket:每个命令约 1-5 毫秒(本地网络)
  • REST API:每个请求约 10-50 毫秒(包括 TLS 握手)

吞吐量

  • 每秒可处理数百个变量读取
  • 受扫描周期时间限制(通常为 50 毫秒)
  • 使用 DEBUG_GET_LIST 进行批量请求以提高效率

资源使用

  • 每个调试会话一个 WebSocket 连接
  • CPU 开销最小(典型轮询速率下 <1%)
  • 内存使用与跟踪变量数量成正比

故障排除

连接被拒绝

原因:JWT 令牌无效或身份验证失败

解决方案:

  1. 通过/api/login获取新的 JWT 令牌
  2. 验证令牌是否正确传递(查询参数或认证字典)
  3. 检查令牌是否过期

无响应

原因:运行时未响应或命令格式错误

解决方案:

  1. 通过/api/status检查 PLC 运行时状态
  2. 验证命令格式(带空格的十六进制字符串)
  3. 检查运行时日志中的错误

无效数据

原因:变量索引超出范围或类型不匹配

解决方案:

  1. 使用 DEBUG_INFO 验证变量索引
  2. 检查 PLC 程序中的变量类型
  3. 确保程序已加载并正在运行

断开连接

原因:网络问题、超时或运行时重启

解决方案:

  1. 在客户端实现重连逻辑
  2. 重连后重新进行身份验证
  3. 重连后验证程序 MD5

相关文档

  • 编辑器集成 - OpenPLC Editor 如何连接到运行时
  • webserver/DEBUG_WEBSOCKET.md - WebSocket 连接详情
  • API 参考 - REST API 端点
  • 架构 - 系统概述
  • 安全性 - 身份验证和授权
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 18:37:17

哇哦!AI应用架构师谈AI驱动深度研究平台的智能算法

AI应用架构师视角&#xff1a;AI驱动深度研究平台的智能算法设计与落地 标题选项 《AI应用架构师谈&#xff1a;AI驱动深度研究平台的智能算法设计逻辑》《从“数据堆砌”到“智能洞察”&#xff1a;深度研究平台的AI算法落地实战》《AI如何成为研究的“最强大脑”&#xff1…

作者头像 李华
网站建设 2026/3/30 16:22:44

TRO不处理,弃店有什么后果

引言&#xff1a;弃店不是解脱&#xff0c;而是风险延续在跨境电商中&#xff0c;许多卖家面对美国法院或平台发出的TRO&#xff08;临时限制令&#xff09;&#xff0c;往往会产生一种直观想法&#xff1a;账户被冻结、资金被限制&#xff0c;不如直接弃店走人&#xff0c;放弃…

作者头像 李华
网站建设 2026/3/27 15:10:21

别再让你的客服机器人“机械回复”了:三步调教,教AI学会读心术

大家好&#xff0c;我是你们的AI技术博主。 在电商、金融、旅游等行业&#xff0c;大家一定都和智能客服打过交道。但令人遗憾的是&#xff0c;很多客服机器人的焦距往往像个“人工智障”&#xff1a;当一位焦急流程的顾客输入&#xff1a;“我的订单U2942怎么还没到&#xff…

作者头像 李华
网站建设 2026/3/30 19:10:30

基于深度学习YOLOv11的垃圾检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 随着城市化进程加快&#xff0c;垃圾分类与回收成为环境保护的重要议题。传统垃圾识别方法依赖人工分拣&#xff0c;效率低且成本高。本文基于深度学习目标检测算法YOLOv11&#xff0c;开发了一套高效准确的垃圾检测系统&#xff0c;可自动识别10类常见垃圾&…

作者头像 李华
网站建设 2026/3/31 14:32:18

信创环境下UEDITOR是否支持国产WPS文档转存?

【开发日记&#xff1a;Word图片一键转存大作战——从“秃头警告”到“真香现场”】 2023年X月X日 周X 晴&#xff08;但我的头顶在下雨&#xff09; 第一章&#xff1a;需求诞生——甲方爸爸的“五彩斑斓黑” 今天导师突然发来一个“小需求”&#xff1a;给我的CMS系统后台新…

作者头像 李华