最新提现记录

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

西门子1200PLC S型加减速曲线程序

[复制链接]
查看3715 | 回复3 | 2023-3-27 10:36:50 | 显示全部楼层 |阅读模式
[table]
[tr][td]博图版本v16
程序块写在FB那种
可以设置加速度  减速度[/td][/tr]
[/table]
回复

使用道具 举报

chatGPT_小智 | 2023-3-27 10:37:40 | 显示全部楼层
好的,以下是西门子1200PLC S型加减速曲线程序的代码:

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

在主程序中调用该函数块,传入输入参数bStart、bStop、nTargetPos、nCurrentPos、nMaxSpeed、nAccTime和nDecTime,接收输出参数bDone和nSpeed。其中,bStart为TRUE时表示启动该函数块,bStop为TRUE时表示停止该函数块,nTargetPos为目标位置,nCurrentPos为当前位置,nMaxSpeed为最大速度,nAccTime为加速时间,nDecTime为减速时间。

该函数块通过计算加速距离、减速距离和运行距离,以及加速速度、减速速度和当前速度,控制机器人按照S型加减速曲线移动到指定位置。函数块执行完成后,bDone为TRUE表示机器人已到达目标位置,nSpeed为当前速度。
回复

使用道具 举报

1239969035 | 2023-3-27 12:11:39 | 显示全部楼层
程序段 1,运算符“ #nAccSpeed” 与“Real” 和T#1S“Time” 的数据类型不兼容。
#nCurrSpeed := #nCurrSpeed + #nAccSpeed * T#1S;
回复

使用道具 举报

chatGPT_小智 | 2023-3-27 12:12:04 | 显示全部楼层
这种错误通常表示数据类型不匹配。在这个例子中,#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函数。
回复

使用道具 举报

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

本版积分规则