这段代码是用西门子S7系列PLC的语句表(STL)编写的。它实现了一个带有限幅和标度转换功能的PID控制器输出处理程序。
代码功能解析:
PID参数赋值 (A7ec - A7e7):
将内部变量 #Panteil, #Ianteil, #Danteil 的值分别传送给系统的PID功能块接口变量 #LMN_P, #LMN_I, #LMN_D。
将 #ErKp 和 #Ianteil 的值存储到 #sInvAlt 和 #sIanteilAlt,这通常用于计算积分饱和。
将 #rVal 的值传递给 #Ianteil。
高低限位比较与输出 (A7e7 - A7ef):
代码读取计算后的PID输出值 #dLmn。
首先判断 #dLmn 是否大于等于高限值 #LMN_HLM:
如果是,则将输出 #QLMN_HLM 置位,#QLMN_LLM 复位,并将 #dLmn 设为高限值。同时设置标志位 #sbArwHLmOn。
如果不是,则进入下一步。
接着判断 #dLmn 是否小于等于低限值 #LMN_LLM:
如果是,则将输出 #QLMN_LLM 置位,#QLMN_HLM 复位,并将 #dLmn 设为低限值。同时设置标志位 #sbArwLLmOn。
如果不是,则两个限位输出 #QLMN_HLM 和 #QLMN_LLM 都被复位。
标度变换与限幅 (A7ee - A7f2):
线性变换: 将经过限幅的 #dLmn 通过公式 #dLmn = #dLmn * #LMN_FAC + #LMN_OFF 进行线性标度变换,结果存入 #dLmn 并最终输出到 #LMN。
工程量程转换: 将 #dLmn 乘以系数 2.764800e+02 (即276.48),这个系数通常是将浮点数形式的百分比(0-100%)转换为STEP 7中标准模拟量输出的整型格式 (0 - 27648)。
最终钳位: 最后,将计算结果 #dLmn 与最大值 3.251100e+04 (32511) 和最小值 -3.251200e+04 (-32512) 进行比较,确保其在INT类型的有效范围内,超出则强制设为边界值。
四舍五入: 使用 RND 指令对最终结果进行四舍五入,并通过 T 指令传输给 #LMN_PER。
程序结束 (A7d1):
CLR 清除RLO(逻辑运算结果)。
A L 68.1 是一个无操作指令,常用于调试或作为跳转目标。
SAVE 将当前RLO状态保存到BR(位堆栈寄存器),用于块调用后的返回状态。
BE 结束当前逻辑块的执行。
转换成SCL
// --- PID 参数赋值 ---
LMN_P := Panteil;
LMN_I := Ianteil;
LMN_D := Danteil;
sInvAlt := ErKp;
sIanteilAlt := Ianteil;
Ianteil := rVal;
// --- 高低限位比较与输出 ---
sbArwHLmOn := FALSE; // 初始状态复位
sbArwLLmOn := FALSE;
// 判断是否高于高限
IF dLmn >= LMN_HLM THEN
QLMN_HLM := TRUE;
QLMN_LLM := FALSE;
dLmn := LMN_HLM; // 将输出钳位到高限值
sbArwHLmOn := TRUE;
ELSE // 如果不高于高限,则检查是否低于低限
QLMN_HLM := FALSE; // 先复位高限输出
IF dLmn <= LMN_LLM THEN
QLMN_LLM := TRUE;
dLmn := LMN_LLM; // 将输出钳位到低限值
sbArwLLmOn := TRUE;
ELSE
QLMN_LLM := FALSE; // 不在限值内,复位所有报警输出
END_IF;
END_IF;
// --- 标度变换与限幅 ---
sLmn := dLmn; // 可能的内部状态反馈
// 应用线性变换因子和偏移量
dLmn := (dLmn * LMN_FAC) + LMN_OFF;
LMN := dLmn; // 输出中间结果
// 转换为S7标准模拟量输出格式 (INT)
dLmn := dLmn * 2.7648e+02;
// 对最终输出值进行钳位,防止溢出 INT 范围
IF dLmn >= 32511.0 THEN
dLmn := 32511.0;
ELSIF dLmn <= -32512.0 THEN
dLmn := -32512.0;
END_IF;
// 四舍五入并赋值给最终输出变量
LMN_PER := ROUND(dLmn);