设为首页
收藏本站
开启辅助访问
切换到窄版
积分充值
登录
立即注册
微信扫码登录
首页
首页
共享资源
BBS
视频教程
AI聊天机器人
VIP充值
论坛
搜索
搜索
程序分享
文库分享
软件下载
变频手册
干货教程
成套课件
使用必看
GPT3.5免费体验版
万能程序翻译
WinCC脚本编程机器人(VIP免费)
GPT3.5完整版(VIP免费)
自控工程师3.5(VIP免费)
GPT4.0完整版-线路1(VIP免费)
自控工程师4.0版-线路1(VIP免费)
GPT更多线路及版本
最新提现记录
恭喜
admin
于 2023-6-6 15:17 成功提现
500元
恭喜
admin
于 2023-5-3 09:45 成功提现
400元
本版
用户
智控联盟
»
共享资源
›
精选专区
›
ChatGPT专区
›
编程序专区
›
用博图SCL编写1200PLC 7段S型速度曲线
返回列表
发新帖
用博图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. 在程序体中,首先进行初始化操作;然后根据输入参数计算加速度系数和减速度系数;其次判断是否需要改变方向;随后根据速度误差计算加速度和减速度;根据当前方向更新当前速度;最后判断是否超过目标速度,如果超过则修正,并刷新当前速度。
希望对您有所帮助!
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
1239969035
5
主题
6
帖子
32
积分
新手上路
新手上路, 积分 32, 距离下一级还需 18 积分
新手上路, 积分 32, 距离下一级还需 18 积分
积分
32
加好友
发消息
回复楼主
返回列表
用户使用心得及帮助
GPT3.5免费体验版
GPT3.5完整版(VIP免费)
自控工程师3.5(VIP免费)
伺服变频维修工程师(VIP免费)
GPT4.0-完整版-线路1(VIP免费)
GPT4.0-完整版-线路2(VIP免费)
GPT4.0-完整版-线路3(VIP免费)
自控工程师4.0版-线路1(VIP免费)
自控工程师4.0版-线路2(VIP免费)
自控工程师4.0版-线路3(VIP免费)
WinCC脚本编程机器人(VIP免费)
万能程序翻译
编程序专区