用博图SCL编写1200PLC 7段S型速度曲线
1、博图V16SCL编写2、符合博图编写规范
请看以下代码:
FUNCTION_BLOCK FB_S_CURVE
TITLE = \'S-Curve Speed Control\'
VERSION : UINT := 1; (* 版本号 *)
(* 输入参数 *)
INPUT
enab : BOOL; (* 使能 *)
reset: BOOL; (* 复位 *)
t# : TIME := T#10MS; (* 刷新周期 *)
cmd : INT; (* 目标速度,单位:脉冲/秒 *)
acc : INT; (* 加速度,单位:脉冲/秒^2 *)
dec : INT; (* 减速度,单位:脉冲/秒^2 *)
END_INPUT
(* 输出参数 *)
OUTPUT
cur_spd : INT := 0; (* 当前速度,单位:脉冲/秒 *)
END_OUTPUT
VAR
acc_rate : REAL; (* 加速度系数 *)
dec_rate : REAL; (* 减速度系数 *)
spd_err: INT; (* 速度误差 *)
tgt_spd: INT; (* 目标速度 *)
cur_dir: INT; (* 当前方向,1为正向,-1为反向 *)
cur_spd_internal : INT := 0; (* 内部参数,当前速度 *)
cur_acc: INT := 0; (* 内部参数,当前加速度 *)
cur_dec: INT := 0; (* 内部参数,当前减速度 *)
wait_cnt : UINT := 0; (* 内部参数,计数器 *)
END_VAR
(* 程序体 *)
BEGIN
(* 初始化 *)
IF reset THEN
cur_spd_internal := 0;
cur_acc := 0;
cur_dec := 0;
wait_cnt := 0;
END_IF;
(* 计算加速度系数和减速度系数 *)
acc_rate := acc / REAL_TO_INT(1000000 * t#);
dec_rate := dec / REAL_TO_INT(1000000 * t#);
(* 判断是否需要改变方向 *)
IF (cmd > 0 AND cur_spd_internal < 0) OR (cmd < 0 AND cur_spd_internal > 0) THEN
cur_spd_internal := 0;
cur_dir := -cur_dir;
cur_acc := 0;
cur_dec := 0;
wait_cnt := 0;
END_IF;
(* 更新目标速度和速度误差 *)
tgt_spd := cmd;
spd_err := tgt_spd - cur_spd_internal;
(* 根据速度误差计算加速度和减速度 *)
IF spd_err > 0 THEN
cur_acc := INT_TO_REAL(spd_err) * acc_rate;
cur_dec := 0;
ELSE
cur_acc := 0;
cur_dec := INT_TO_REAL(-spd_err) * dec_rate;
END_IF;
(* 根据当前方向更新当前速度 *)
cur_spd_internal := cur_spd_internal + cur_dir * (cur_acc - cur_dec);
(* 判断是否超过目标速度,如果超过则修正 *)
IF cur_dir * cur_spd_internal > cur_dir * tgt_spd THEN
cur_spd_internal := tgt_spd;
END_IF;
(* 计数器加1 *)
wait_cnt := wait_cnt + 1;
(* 刷新当前速度 *)
IF wait_cnt >= REAL_TO_INT(1000000 * t# / ABS(cur_spd_internal)) THEN
cur_spd := cur_spd_internal;
wait_cnt := 0;
END_IF;
END_FUNCTION_BLOCK
需要注意以下几点:
1. 函数块名称为`FB_S_CURVE`。
2. 输入参数包括:使能信号`enab`、复位信号`reset`、刷新周期`t#`、目标速度`cmd`、加速度`acc`和减速度`dec`。其中,`t#`的默认值为10ms。
3. 输出参数为当前速度`cur_spd`。
4. 内部变量包括:加速度系数`acc_rate`、减速度系数`dec_rate`、速度误差`spd_err`、目标速度`tgt_spd`、当前方向`cur_dir`(1表示正向,-1表示反向)、当前速度`cur_spd_internal`、当前加速度`cur_acc`、当前减速度`cur_dec`以及计数器`wait_cnt`。
5. 在程序体中,首先进行初始化操作;然后根据输入参数计算加速度系数和减速度系数;其次判断是否需要改变方向;随后根据速度误差计算加速度和减速度;根据当前方向更新当前速度;最后判断是否超过目标速度,如果超过则修正,并刷新当前速度。
希望对您有所帮助!
页:
[1]