news 2026/4/23 9:45:52

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/4/19 10:32:27

电子世界的奇妙冒险:03 电感:电路的“惯性王者和噪音杀手”

👉03 电感:电路的“惯性王者和噪音杀手” 电阻是刹车片,电容是蓄水池,现在咱们迎来电路里的“惯性大王”——电感!想象一下,你推着一辆重重的购物车,突然想停下来,它还会往前滑一段才停稳。这就是惯性!电流在电感里也一样:它讨厌突然改变速度(电流大小),会拼命“…

作者头像 李华
网站建设 2026/4/23 9:45:27

原生Android程序如何实现多线程编程?

目录一、Android介绍二、什么是多线程三、什么是线程池四、如何在Android中实现多线程与线程池一、Android介绍 Android是一种基于Linux内核的开源操作系统&#xff0c;由Google公司领导开发。它最初于2007年发布&#xff0c;旨在为移动设备提供一种统一、可扩展的操作系统。A…

作者头像 李华
网站建设 2026/4/18 2:10:08

定稿前必看!9个AI论文工具:研究生毕业论文写作全维度测评

随着人工智能技术的不断进步&#xff0c;学术写作正迎来一场深刻的变革。对于研究生群体而言&#xff0c;从选题构思到文献综述、从初稿撰写到格式调整&#xff0c;每一个环节都可能成为耗时耗力的“重灾区”。而AI工具的出现&#xff0c;为这一过程带来了全新的解决方案。为了…

作者头像 李华
网站建设 2026/4/18 15:17:02

中专学财务,2026年就业方向全解析:从出纳到财务BP的进阶路

中专学财务2026年就业方向解析2026年财务领域的就业方向呈现多元化趋势&#xff0c;中专学历的财务从业者可通过考取CDA数据分析师证书等专业资质&#xff0c;提升竞争力。以下是详细职业路径分析及对应能力要求。基础岗位&#xff1a;出纳/会计助理适合初入行业的从业者&#…

作者头像 李华
网站建设 2026/4/16 9:06:39

对比一圈后!专科生必备的AI论文写作神器 —— 千笔AI

你是否曾为论文的选题而发愁&#xff1f;是否在写到一半时突然卡壳&#xff0c;不知如何继续&#xff1f;又或者反复修改后仍对结果不满意&#xff1f;对于专科生来说&#xff0c;论文写作不仅是学业的一部分&#xff0c;更是一场与时间、压力和自我怀疑的较量。面对文献查找困…

作者头像 李华
网站建设 2026/4/15 5:25:25

java+vue基于springboot框架的WeJob求职招聘网站

目录WeJob求职招聘网站摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;WeJob求职招聘网站摘要 技术架构 采用SpringBoot作为后端框架&#xff0c;Vue.js作为前端框架&#xff0c;实现前后端分离开发。后端使用MyBatis或JPA…

作者头像 李华