多语言混合源码调试
多语言混合源码调试用于在同一个 PLC 工程中调试 ST、C/C++、Rust 等不同语言编写的程序和功能块。进入调试状态后,可以在不同语言的源码中设置断点,程序运行到对应调用位置时会自动停在当前源码行,并在右侧调试面板中查看调用栈和变量值。
前提条件
使用多语言混合调试前,请先确认:
- 工程中已经包含需要调试的 ST、C/C++、Rust 等程序或功能块。
- 多语言程序已被 PLC 主程序或任务调用。
- 工程已经编译通过,并成功下载到目标 PLC。
- PLC 已连接,调试器可以正常启动。
查看多语言工程结构
在项目树中可以查看当前工程包含的多语言对象。视频示例中,工程同时包含 ST 主程序、C/C++ 函数、Rust 函数、CFC/LD 程序和功能块。
常见对象说明如下:
| 对象 | 说明 |
|---|---|
| ST 程序 | 作为主控制逻辑,调用其他语言实现的函数或功能块。 |
| C/C++ 函数或功能块 | 用于实现计算、算法或外部扩展逻辑。 |
| Rust 函数或功能块 | 用于实现 Rust 编写的用户函数或功能块。 |
| LD/CFC 程序 | 用于梯形图、连续功能图等图形化控制逻辑。 |
启动调试器
工程下载完成并连接 PLC 后,点击工具栏中的 调试 按钮启动调试器。进入调试状态后,右侧会出现调试面板,并显示调用栈、变量、断点等区域。
调试面板中可以重点查看以下内容:
| 区域 | 说明 |
|---|---|
| 调用栈 | 显示当前停住的源码位置,以及从主程序到被调函数的调用关系。 |
| Locals | 显示当前语言源码上下文中的局部变量和参数值。 |
| Globals | 查看工程全局变量。 |
| Registers | 查看底层寄存器信息,适合高级排查场景。 |
| 断点 | 管理 ST、C/C++、Rust 等源码中的断点。 |
在 Rust 源码中调试
在项目树中打开 Rust 函数或功能块源码,在需要暂停的位置设置断点。程序运行到 Rust 调用位置时,编辑器会高亮当前停住的源码行,右侧调用栈会显示当前位于 Rust 函数或功能块中。
调试 Rust 源码时,可以观察:
- 当前函数或功能块名称。
- 输入参数和实例数据。
- 当前停住的源码行。
- 调用栈中上一级 ST 程序或其他调用者。
如果底部终端提示某语言缺少调试插件,仍可进行基本源码定位,但部分帧变量检查能力可能受限。
在 C/C++ 源码中调试
打开 C/C++ 函数源码并设置断点。程序执行到 C/C++ 函数时,调试器会切换到对应源码文件,并在当前执行行高亮显示。
右侧变量区域会显示函数输入参数,例如 IN1、IN2 等变量值。通过这些值可以确认 ST 主程序传入 C/C++ 函数的参数是否正确。
返回 ST 调试调用关系
从 C/C++ 或 Rust 函数单步返回后,可以回到 ST 主程序,继续观察 ST 中的调用语句、返回值和后续控制逻辑。
在 ST 调用位置可以重点检查:
- 调用的函数或功能块名称是否正确。
- 输入参数是否来自预期变量。
- 输出变量是否写入正确位置。
- 多语言函数返回后,后续 ST 逻辑是否按预期执行。
单步切换语言源码
多语言混合调试时,可以使用调试工具条在不同语言源码之间切换:
| 操作 | 说明 |
|---|---|
| 继续 | 让程序继续运行到下一个断点。 |
| 单步进入 | 从 ST 调用语句进入 C/C++、Rust 或其他语言源码。 |
| 单步跳过 | 执行当前调用,但不进入被调函数内部。 |
| 跳出 | 从当前 C/C++、Rust 函数返回到上一级调用位置。 |
| 停止 | 结束本次调试会话。 |
如果需要分析跨语言调用链,建议先在 ST 调用语句处设置断点,再使用单步进入被调函数。这样可以清楚看到从 PLC 主程序进入用户函数、再返回主程序的完整过程。
使用建议
- 多语言调试前先确认所有源码已经保存并重新编译。
- 在 ST 调用语句和被调语言源码入口处同时设置断点,便于观察调用链。
- 查看变量时同时关注输入参数、输出参数和实例变量。
- 如果断点没有命中,请检查该函数是否被当前任务调用,以及调用条件是否满足。
- 修改 C/C++ 或 Rust 源码后,需要重新编译、下载,再重新进入调试。