我用 Claude 读懂了 PLC 梯形图

我已经用 Python、MATLAB 和 C++ 实现过无数次 PID 控制了,数都数不清。但梯形逻辑呢?那是一种完全不同的视觉语言,是为考虑继电器电路的电气工程师设计的,而不是为考虑微分方程的控制工程师设计的。当我的运动控制系统实验要求我修改一个现有的梯形逻辑程序来实现 PI 控制时,我需要一个在这两个世界之间充当翻译的东西。

背景是这样的:实验 8,直流伺服电机的 PID 位置控制,完全通过 PLC 上的梯形逻辑来实现。我以前从未写过梯形逻辑,而实验手册假设我已经熟悉它了。

1、翻译问题

预习实验进行得很顺利。我推导了闭环传递函数,计算了临界阻尼增益,理解了为什么纯比例控制器会有稳态误差,而 PI 或 PID 控制器可以消除它。但到了实际实验呢?手册给了我一个现有的梯形逻辑程序,然后说"修改它来实现 PI 控制"。

我给 Claude 提供了 8 页的实验 PDF、3 页的预习推导,以及课程材料中现有的 .L5K 梯形逻辑文件。然后我不是求答案,而是求映射:解释这个梯形逻辑程序是如何结构的,这样我就可以自己修改它。

2、梯形逻辑实际上是什么样的

在任何过程式语言中,PID 控制大致如下:

error = setpoint - actual_position;
integral += error * dt;
derivative = (error - prev_error) / dt;
output = Kp * error + Ki * integral + Kd * derivative;

梯形逻辑看起来完全不同。它是一种读起来像电气原理图的视觉表示:

     |                                                           |
--+--| |------------------[encoder_position SUB setpoint = error]--+--
  |  ENABLE                                                      |
  |                                                              |
--+--| |--+---[error MUL Kp = P_term]--+--[P_term ADD I_term = output]--+--
     RUN |                             |                               |
         +---[error MUL Ki = I_inc]----+                               |
         |                             |                               |
         +---[I_acc ADD I_inc = I_acc]-+--[I_acc assigned to I_term]---+

每个水平的"梯级"从左到右流动。看起来像 | | 的符号是触点——它们检查条件,比如某个位是否为真。方括号中的块是操作:减法、乘法、加法。整个程序从上到下连续扫描,就像 PLC 每秒检查继电器状态几十次一样。

Claude 的解释直接在两种表示之间建立了映射。"这个触点检查 RUN 位是否被设置——那是你的使能条件。这个 SUB 块计算设定值减去编码器位置——那是你的误差项。这一系列 MUL 和 ADD 块呢?那是在累积积分。"

3、三梯级结构

现有程序有三个主要部分,理解这个结构使得修改变得直截了当:

初始化梯级: 这里配置了编码器分辨率(每转 4096 个计数)、设置了电机电压限制(±10V)、建立了采样率(1ms),并将位置计数器归零。缺少其中任何一个都会导致莫名其妙的故障——电机可能饱和,位置可能错误地回绕,或者控制循环可能以错误的速率运行。

控制律梯级: 实际计算发生的地方。原始程序只有比例控制:一个 MUL 块计算 Kp * error,直接馈送到输出。要添加积分控制,我需要插入三个元素:一个用于 Ki * error 的 MUL 块,一个将增量累加到运行总和中的 ADD 块,以及另一个将 P 和 I 项合并的 ADD 块。

输出梯级: 获取计算出的控制电压并将其发送到驱动电机放大器的模拟输出模块,包括 ±10V 范围的饱和限制。

4、让我豁然开朗的思维转换

有一个映射让我措手不及。在代码中,我会这样写积分饱和保护:

if (abs(integral) > max_integral) {
    integral = sign(integral) * max_integral;
}

在梯形逻辑中,没有 if 语句。相反,你使用触点作为条件门。抗饱和逻辑使用了一个比较块,当积分超过限制时设置一个位,然后该位控制一个旁通累加器的触点。

Claude 的解释是:"把这个比较块想象成一个在积分变得太大时跳闸的继电器。当它跳闸时,电流就无法再通过累加器路径了。"

那个电气隐喻——电流流动,而不是控制流——正是我需要的思维转换。

5、哪些地方不顺利

并非一切都能立即理解。Claude 对编码器配置的第一次解释太抽象了——它描述了正交编码而没有映射到这个 PLC 功能块中的具体参数。我不得不追问:"'Counts per Revolution' 字段实际上控制什么?如果设置错误会发生什么?"

答案是:PLC 使用该值将计数转换为工程单位。设置错误的话,你的位置反馈就会缩放不正确——1000 的设定值可能命令 900 或 1100 个实际计数,而你的稳态误差测量就会变得毫无意义。这种具体的、有后果的细节只有在来回讨论中才能得到。

6、具体的修改

这是实际的修改。原始的纯比例控制律梯级:

--[error MUL Kp = P_term]--[P_term copied to output]--

理解结构后,我将其修改为:

--[error MUL Kp = P_term]--+--[P_term ADD I_term = output]--
                            |
--[error MUL Ki = I_inc]---+
                            |
--[I_acc ADD I_inc = I_acc]--[I_acc copied to I_term]--

三个新块,接好线将累积的积分馈入输出求和。完整的 PID 微分项将再添加两个块:一个 SUB 来计算误差变化,一个 MUL 来乘以 Kd 增益。

7、为什么要求映射是有效的

如果我让 Claude "为 PI 控制编写梯形逻辑",我会得到一个当它不可避免地与这个特定 PLC 的功能块和变量命名约定不兼容时我无法调试的东西。相反,我问了现有代码是如何结构的,学习了这种范式,然后自己做了修改。

我提供的上下文越多——预习推导、实验 PDF、现有代码——Claude 就越能识别我已经理解的东西(PID 理论、控制数学),并专注于我不理解的东西(梯形逻辑语法、PLC 扫描行为、电气隐喻的思维模型)。

8、下一步

明天我将在实际硬件上运行这些试验。理论是扎实的,步骤是清晰的,我对梯形逻辑的理解足以在出现意外行为时进行故障排除。这就是复制代码和学习范式之间的区别:当电机做出奇怪的举动时,我会知道首先检查哪个梯级。


原文链接:How Claude Helped Me Decode My First Ladder Logic Program

汇智网翻译整理,转载请标明出处