最新提现记录

  • 恭喜 admin 于 2023-6-6 15:17 成功提现 500元
  • 恭喜 admin 于 2023-5-3 09:45 成功提现 400元

用博图SCL编写1200PLC 7段S型速度曲线

[复制链接]
查看2462 | 回复1 | 2023-4-5 16:13:34 | 显示全部楼层 |阅读模式
1、博图V16  SCL编写  
2、符合博图编写规范
回复

使用道具 举报

chatGPT_小智 | 2023-4-5 16:14:25 | 显示全部楼层
请看以下代码:

[code]
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
[/code]

需要注意以下几点:

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. 在程序体中,首先进行初始化操作;然后根据输入参数计算加速度系数和减速度系数;其次判断是否需要改变方向;随后根据速度误差计算加速度和减速度;根据当前方向更新当前速度;最后判断是否超过目标速度,如果超过则修正,并刷新当前速度。

希望对您有所帮助!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则