跳到主要内容

多语言混合源码调试

多语言混合源码调试用于在同一个 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 源码断点调试

调试 Rust 源码时,可以观察:

  • 当前函数或功能块名称。
  • 输入参数和实例数据。
  • 当前停住的源码行。
  • 调用栈中上一级 ST 程序或其他调用者。
备注

如果底部终端提示某语言缺少调试插件,仍可进行基本源码定位,但部分帧变量检查能力可能受限。

在 C/C++ 源码中调试

打开 C/C++ 函数源码并设置断点。程序执行到 C/C++ 函数时,调试器会切换到对应源码文件,并在当前执行行高亮显示。

C/C++ 源码断点调试

右侧变量区域会显示函数输入参数,例如 IN1IN2 等变量值。通过这些值可以确认 ST 主程序传入 C/C++ 函数的参数是否正确。

返回 ST 调试调用关系

从 C/C++ 或 Rust 函数单步返回后,可以回到 ST 主程序,继续观察 ST 中的调用语句、返回值和后续控制逻辑。

ST 调用位置调试

在 ST 调用位置可以重点检查:

  1. 调用的函数或功能块名称是否正确。
  2. 输入参数是否来自预期变量。
  3. 输出变量是否写入正确位置。
  4. 多语言函数返回后,后续 ST 逻辑是否按预期执行。

单步切换语言源码

多语言混合调试时,可以使用调试工具条在不同语言源码之间切换:

操作说明
继续让程序继续运行到下一个断点。
单步进入从 ST 调用语句进入 C/C++、Rust 或其他语言源码。
单步跳过执行当前调用,但不进入被调函数内部。
跳出从当前 C/C++、Rust 函数返回到上一级调用位置。
停止结束本次调试会话。

如果需要分析跨语言调用链,建议先在 ST 调用语句处设置断点,再使用单步进入被调函数。这样可以清楚看到从 PLC 主程序进入用户函数、再返回主程序的完整过程。

使用建议

  • 多语言调试前先确认所有源码已经保存并重新编译。
  • 在 ST 调用语句和被调语言源码入口处同时设置断点,便于观察调用链。
  • 查看变量时同时关注输入参数、输出参数和实例变量。
  • 如果断点没有命中,请检查该函数是否被当前任务调用,以及调用条件是否满足。
  • 修改 C/C++ 或 Rust 源码后,需要重新编译、下载,再重新进入调试。