西门子1200PLC S型加减速曲线程序
博图版本v16
程序块写在FB那种
可以设置加速度减速度
好的,以下是西门子1200PLC S型加减速曲线程序的代码:
FUNCTION_BLOCK FB_AccDecCurve
TITLE = \'S型加减速曲线程序\'
VAR_INPUT
bStart : BOOL; // 启动标志
bStop : BOOL; // 停止标志
nTargetPos : INT; // 目标位置
nCurrentPos : INT;// 当前位置
nMaxSpeed : INT; // 最大速度
nAccTime : REAL; // 加速时间
nDecTime : REAL; // 减速时间
END_VAR
VAR_OUTPUT
bDone : BOOL; // 完成标志
nSpeed : INT; // 当前速度
END_VAR
VAR
nAccDist : REAL; // 加速距离
nDecDist : REAL; // 减速距离
nRunDist : REAL; // 运行距离
nAccSpeed : REAL; // 加速速度
nDecSpeed : REAL; // 减速速度
nCurrSpeed : REAL;// 当前速度
nCurrDist : REAL; // 当前运行距离
bInAcc : BOOL; // 是否在加速段
bInDec : BOOL; // 是否在减速段
bInRun : BOOL; // 是否在匀速段
END_VAR
// 初始化
IF bStart THEN
bInAcc := TRUE;
bInDec := FALSE;
bInRun := FALSE;
nAccDist := nMaxSpeed / 2 * nAccTime;
nDecDist := nMaxSpeed / 2 * nDecTime;
nRunDist := ABS(nTargetPos - nCurrentPos) - nAccDist - nDecDist;
nAccSpeed := nMaxSpeed / nAccTime;
nDecSpeed := nMaxSpeed / nDecTime;
nCurrSpeed := 0;
nCurrDist := 0;
bDone := FALSE;
END_IF
// 计算速度
IF bInAcc THEN
nCurrSpeed := nCurrSpeed + nAccSpeed * T#1S;
IF nCurrSpeed >= nMaxSpeed THEN
bInAcc := FALSE;
bInRun := TRUE;
nCurrSpeed := nMaxSpeed;
END_IF
ELSIF bInDec THEN
nCurrSpeed := nCurrSpeed - nDecSpeed * T#1S;
IF nCurrSpeed <= 0 THEN
bInDec := FALSE;
nCurrSpeed := 0;
END_IF
ELSIF bInRun THEN
nCurrSpeed := nMaxSpeed;
END_IF
// 计算位置
nCurrDist := nCurrDist + nCurrSpeed * T#1S;
IF nCurrDist >= nRunDist THEN
nCurrDist := nRunDist;
bDone := TRUE;
END_IF
nSpeed := INT_TO_REAL(nCurrSpeed);
// 停止
IF bStop THEN
bDone := TRUE;
END_IF
END_FUNCTION_BLOCK
在主程序中调用该函数块,传入输入参数bStart、bStop、nTargetPos、nCurrentPos、nMaxSpeed、nAccTime和nDecTime,接收输出参数bDone和nSpeed。其中,bStart为TRUE时表示启动该函数块,bStop为TRUE时表示停止该函数块,nTargetPos为目标位置,nCurrentPos为当前位置,nMaxSpeed为最大速度,nAccTime为加速时间,nDecTime为减速时间。
该函数块通过计算加速距离、减速距离和运行距离,以及加速速度、减速速度和当前速度,控制机器人按照S型加减速曲线移动到指定位置。函数块执行完成后,bDone为TRUE表示机器人已到达目标位置,nSpeed为当前速度。 程序段 1,运算符“ #nAccSpeed” 与“Real” 和T#1S“Time” 的数据类型不兼容。
#nCurrSpeed := #nCurrSpeed + #nAccSpeed * T#1S; 这种错误通常表示数据类型不匹配。在这个例子中,#nAccSpeed是一个REAL类型的变量,而T#1S是一个TIME类型的常量。由于REAL和TIME类型无法直接相乘,因此编译器会产生错误。
要解决此问题,请使用相应的转换函数将时间转换为浮点数。您可以使用函数REAL_TO_TIME将实际值转换为时间值,也可以使用函数TIME_TO_REAL将时间值转换为实际值。以下是您可以尝试的更改:
// 计算速度
IF bInAcc THEN
nCurrSpeed := nCurrSpeed + nAccSpeed * REAL_TO_TIME(T#1S);
IF nCurrSpeed >= nMaxSpeed THEN
bInAcc := FALSE;
bInRun := TRUE;
nCurrSpeed := nMaxSpeed;
END_IF
ELSIF bInDec THEN
nCurrSpeed := nCurrSpeed - nDecSpeed * REAL_TO_TIME(T#1S);
IF nCurrSpeed <= 0 THEN
bInDec := FALSE;
nCurrSpeed := 0;
END_IF
ELSIF bInRun THEN
nCurrSpeed := nMaxSpeed;
END_IF
请注意,在上面的代码中,我们使用了REAL_TO_TIME函数将T#1S(以秒为单位)转换为浮点值。这使我们能够将速度与时间相乘,并得到正确的结果。同样地,如果需要将时间值转换为实际值以进行其他计算,则可以使用TIME_TO_REAL函数。
页:
[1]