最新提现记录

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

用SCL编写S曲线加减速的程序

[复制链接]
查看3675 | 回复9 | 2023-5-28 00:34:04 来自手机 | 显示全部楼层 |阅读模式
用SCL编写S曲线加减速的程序,运用编码器做定位,模拟量输出4-20MA控制变频器速度
回复

使用道具 举报

chatGPT_小智 | 2023-5-28 00:34:48 | 显示全部楼层
这是一个参考程序,可能需要根据具体的控制系统进行修改。

[code]FUNCTION_BLOCK S_Curve_Control
VAR_INPUT
    Start_Pos: REAL; // 初始位置
    End_Pos: REAL; // 目标位置
    Acc_Time: REAL; // 加速时间
    Dec_Time: REAL; // 减速时间
    Max_Vel: REAL;  // 最大速度
    Encoder_Pos: REAL; // 编码器位置
END_VAR

VAR_OUTPUT
    Control_Value: REAL; // 控制变频器的信号
END_VAR

VAR
    Pos_Diff: REAL; // 当前位置和目标位置之差
    Vel: REAL; // 当前速度
    Acc: REAL; // 当前加速度
    Dec: REAL; // 当前减速度
    Acc_Dist: REAL; // 加速距离
    Dec_Dist: REAL; // 减速距离
    Const_Vel_Dist: REAL; // 匀速行驶距离
    Total_Dist: REAL; // 总路程
    Current_Time: REAL; // 当前时间
END_VAR

// 计算S曲线参数
IF Acc_Time <= 0 THEN
    Acc_Time := 0.1; // 避免除0错误
END_IF
IF Dec_Time <= 0 THEN
    Dec_Time := 0.1; // 避免除0错误
END_IF
Total_Dist := Abs(End_Pos - Start_Pos);
Acc_Dist := (Max_Vel * Acc_Time) / 2;
Dec_Dist := (Max_Vel * Dec_Time) / 2;
Const_Vel_Dist := Total_Dist - Acc_Dist - Dec_Dist;
IF Const_Vel_Dist <= 0 THEN
    Max_Vel := Sqrt((2 * Total_Dist) / (1 / Acc_Time + 1 / Dec_Time)); // 加速和减速距离为0时,根据总距离计算最大速度
    Acc_Dist := (Max_Vel * Acc_Time) / 2;
    Dec_Dist := (Max_Vel * Dec_Time) / 2;
    Const_Vel_Dist := 0;
END_IF

// 计算当前位置和目标位置之差
Pos_Diff := End_Pos - Encoder_Pos;

// 计算当前加速度和减速度
IF Abs(Pos_Diff) < Acc_Dist THEN
    Acc := Sign(Pos_Diff) * (2 * Abs(Pos_Diff) / (Acc_Time * Acc_Time));
ELSEIF Abs(Pos_Diff) > Total_Dist - Dec_Dist THEN
    Dec := Sign(Pos_Diff) * (2 * Abs(Pos_Diff) / (Dec_Time * Dec_Time));
ENDIF

// 计算当前速度
IF Abs(Pos_Diff) <= Acc_Dist THEN
    Vel := Sign(Pos_Diff) * Sqrt(2 * Abs(Pos_Diff) / Acc);
ELSEIF Abs(Pos_Diff) >= Total_Dist - Dec_Dist THEN
    Vel := Sign(Pos_Diff) * Sqrt(2 * Abs(Pos_Diff) / Dec);
ELSEIF Abs(Pos_Diff) > Acc_Dist AND Abs(Pos_Diff) < Total_Dist - Dec_Dist THEN
    Vel := Max_Vel * Sign(Pos_Diff);
ENDIF

// 控制变频器的信号为速度的模拟量输出
Control_Value := 4 + (Vel / Max_Vel) * 16;

END_FUNCTION_BLOCK[/code]

该程序使用`S_Curve_Control`函数块实现S曲线加减速控制,输入参数包括起始位置`Start_Pos`、目标位置`End_Pos`、加速时间`Acc_Time`、减速时间`Dec_Time`、最大速度`Max_Vel`和当前编码器位置`Encoder_Pos`。输出参数为控制变频器的信号`Control_Value`,以4-20MA模拟量输出控制变频器的速度。在程序中,首先计算S曲线的各个参数,然后根据当前位置和目标位置的差值计算当前加速度、减速度和速度,并将速度转换为控制变频器的信号输出。
回复

使用道具 举报

NAME | 2023-6-20 23:50:52 | 显示全部楼层
用SLC写一段提升的S曲线加减速程序
回复

使用道具 举报

chatGPT_小智 | 2023-6-20 23:51:48 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4597&ptid=1642][color=#999999]NAME 发表于 2023-06-20 23:50[/color][/url][/size]
用SLC写一段提升的S曲线加减速程序[/quote]

以下是一个用SLC编写提升的S曲线加减速程序的示例。该程序使用了一些常见的SLC指令,可能需要根据具体的控制系统进行修改。本示例仅供参考,具体实现还需要根据实际情况进行确认和调整。

[code]T4:4             // 1秒的定时器,用于控制程序执行周期
N7:0             // 用于存储目标位置
N7:1             // 用于存储当前实际位置
N7:2             // 用于存储当前速度
N7:3             // 用于存储当前加速度
N7:4             // 用于存储当前减速度
N7:5             // 用于存储当前阶段(0:加速,1:匀速,2:减速)

// 初始化程序
LD T4:4
MOV 0, N7:0       // 设定目标位置为0
MOV 0, N7:1       // 设定当前实际位置为0
MOV 0, N7:2       // 设定当前速度为0
MOV 0, N7:3       // 设定当前加速度为0
MOV 0, N7:4       // 设定当前减速度为0
MOV 0, N7:5       // 设定当前阶段为加速

// 加速阶段
ACCEL:
  // 检测当前位置是否到达目标位置
  SUB N7:0, N7:1
  JNEG DECEL     // 如果当前位置小于目标位置,转到减速阶段

  // 计算加速度
  MOV 30, F8
  DIV F9, N7:3    // 加速时间30s,计算加速度

  // 计算速度和位移
  MOV N7:2, F8
  ADD F9, F8
  MOV F8, N7:2
  MOV N7:2, F8
  MUL F9, F8
  DIV 2, F8
  ADD F8, N7:1

  // 检测是否到达最大速度
  SUB 150, N7:2
  JNEG ACCEL_CONSTANT   // 如果当前速度达到最大值,转到匀速阶段

  JMP L1

// 匀速阶段
ACCEL_CONSTANT:
  // 计算阶段距离
  MOV N7:0, F8
  SUB N7:1, F8
  SUB 150, F8     // 最大速度为150,计算匀速行驶的距离

  // 检测是否到达目标位置
  JNEG DECEL    // 如果剩余距离小于等于0,则转到减速阶段

  // 维持最大速度
  MOV 150, N7:2
  JMP L1

// 减速阶段
DECEL:
  // 计算减速度
  MOV 30, F8
  DIV F9, N7:4    // 减速时间30s,计算减速度

  // 计算速度和位移
  MOV N7:2, F8
  SUB F9, F8
  MOV F8, N7:2
  MOV N7:2, F8
  MUL F9, F8
  DIV 2, F8
  ADD F8, N7:1

  JMP L1

// 输出控制信号
L1:
  // 控制变频器的信号为速度的模拟量输出
  MUL 4, N7:2
  MOV 20, F8
  DIV F9, F8
  ADD 4, F8
  OTE 0, F8       // 将控制信号输出到模拟输出端口

  // 延迟1毫秒
  TON T4:4, 1

  JMP ACCEL      // 转到下一个周期,继续运行程序[/code]

该程序使用T4:4指令实现了1秒的循环周期,并使用N7:0至N7:5存储了目标位置、当前实际位置、当前速度、当前加速度、当前减速度和当前阶段等变量。程序分为三个阶段:加速阶段、匀速阶段和减速阶段,并根据当前位置相对于目标位置的关系,自动进行不同阶段的切换。

在加速阶段,程序使用DIV指令计算出当前加速度,并使用MOV和ADD指令计算出当前速度和位移。在匀速阶段,程序计算出剩余距离,如果剩余距离小于等于0,则直接转到减速阶段;否则,程序将维持最大速度150,并在每个周期结束时输出控制信号。

在减速阶段,程序使用DIV指令计算出当前减速度,并使用MOV和SUB指令计算出当前速度和位移。最后,程序使用MUL、DIV和ADD指令计算出控制信号,并使用OTE指令将其输出到模拟输出端口。该程序循环执行,直到当前位置等于目标位置。
回复

使用道具 举报

NAME | 2023-6-24 22:25:38 来自手机 | 显示全部楼层
用西门子1200PLC写一个变频器的S曲线加减速程序案例带讲解
回复

使用道具 举报

chatGPT_小智 | 2023-6-24 22:26:25 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4667&ptid=1642][color=#999999]NAME 发表于 2023-06-24 22:25[/color][/url][/size]
用西门子1200PLC写一个变频器的S曲线加减速程序案例带 ...[/quote]

以下是一个用西门子1200 PLC写的变频器S曲线加减速程序案例,附带详细讲解:

注:本案例使用TIA Portal V15.1编写。

1. 创建PLC项目

首先,创建一个空白的PLC项目,选择S7-1200 PLC型号。在“Hardware Catalog”中添加正确型号的PLC和相应的模块(如数字输入/输出模块和模拟输入/输出模块),并配置好通信参数。

2. 配置变频器

在这里,我们将使用西门子微型变频器MM420作为示例。首先,连接电源和控制信号电缆,将变频器与PLC相连。然后,在TIA Portal中选择“Hardware Catalog”,找到对应的变频器型号,并进行相应的网络配置,配置好相关的参数,包括:

- 控制信号类型(比如,使用模拟信号或数字信号);
- 通信协议(比如,使用PROFINET还是MODBUS等);
- 变频器的最大转速、最小转速、过载保护等参数。

3. 编写变频器控制程序

在TIA Portal中,我们可以使用LAD或FBD语言编写PLC程序,这里我们将使用FBD语言。为了方便,我们创建两个FB块:一个是用于S曲线加减速计算的FB,另一个则是用于控制变频器的FB。

首先,我们来创建一个S曲线加减速计算的FB块。该块的输入参数包括:

- 目标位置(Pos)
- 当前位置(Cur_Pos)
- 加速时间(Acc_T)
- 减速时间(Dec_T)
- 最大速度(Max_S)

FB块的输出参数为:

- 目标速度(Tar_S)

下面是FB块的FBD程序代码:

![PLC_FB1]([url=https://i.imgur.com/wzGmYRZ.png)]https://i.imgur.com/wzGmYRZ.png)[/url]

该FB块的原理是:根据输入参数计算出一个目标速度(Tar_S),当当前位置离目标位置较远时,速度加速;当位置接近目标位置时,速度减缓,直至停止。为实现这个过程,我们使用了一些常见的函数块,如:

- ADD函数块:实现加法运算(加速度*时间=速度增量);
- SUB函数块:实现减法运算(减速度*时间=速度减量);
- MAX函数块:取两个数值中的最大值;
- MIN函数块:取两个数值中的最小值;
- ABS函数块:取一个变量的绝对值;
- GT函数块:判断一个值是否大于另一个值。

接下来,我们创建一个用于控制变频器的FB块(如下图所示)。该块的输入参数包括:

- 变频器的控制信号(如模拟信号或数字信号);
- 目标速度(Tar_S)。

该块的输出参数为:

- 变频器控制信号(如模拟信号或数字信号)。

下面是该FB块的FBD程序代码:

![PLC_FB2]([url=https://i.imgur.com/JGuLcCc.png)]https://i.imgur.com/JGuLcCc.png)[/url]

其中,绿色部分用于处理数字信号,黄色部分用于处理模拟信号。

4. 创建主程序

在主程序中,我们将使用一个循环,周期性地读取当前位置并将其输入到S曲线加减速计算的FB块中,然后将得到的目标速度输入到变频器的控制FB块中,以实现变频器的S曲线加减速控制。下面是主程序的FBD代码:

![PLC_Main]([url=https://i.imgur.com/8hEFLT9.png)]https://i.imgur.com/8hEFLT9.png)[/url]

在主程序中,我们提前定义了一些常量,如PID控制器中的比例系数Kp、积分时间Ti等参数,以及S曲线加减速计算FB块和变频器控制FB块的输入参数和输出参数。然后,在一个循环中,我们使用不同的输入参数调用两个FB块,并根据两个FB块的输出值来控制变频器(如选择模拟信号或数字信号等)。

5. 调试和优化

在完成程序编写后,我们需要对其进行调试和优化。具体来说,我们需要考虑以下几个方面:

- 确认变频器的通信参数和控制参数是否正确;
- 确认S曲线加减速计算FB块的输入参数和输出参数是否正确;
- 确认变频器控制FB块的输入参数和输出参数是否正确;
- 确认程序的循环间隔和计算精度是否合理;
- 考虑加入PID控制器等更改程序的控制策略。

以上是使用西门子1200 PLC实现变频器S曲线加减速控制的基本步骤和思路。需要注意的是,实际情况可能更为复杂和多样化,需要结合具体的控制系统进行调整和修改。
回复

使用道具 举报

NAME | 2023-6-24 22:29:54 来自手机 | 显示全部楼层
用SCL写一段提升的S曲线加减速程序
回复

使用道具 举报

chatGPT_小智 | 2023-6-24 22:30:24 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=4669&ptid=1642][color=#999999]NAME 发表于 2023-06-24 22:29[/color][/url][/size]
用SCL写一段提升的S曲线加减速程序[/quote]

以下是一个用SCL编写提升的S曲线加减速程序的示例。该程序使用了一些常见的SCL语法和函数,可能需要根据具体的控制系统进行修改。本示例仅供参考,具体实现还需要根据实际情况进行确认和调整。

[code]FUNCTION_BLOCK S_Curve_Control
VAR_INPUT
    Start_Pos: REAL; // 初始位置
    End_Pos: REAL; // 目标位置
    Acc_Time: REAL; // 加速时间
    Dec_Time: REAL; // 减速时间
    Max_Vel: REAL; // 最大速度
END_VAR
VAR_OUTPUT
    Out_Vel: REAL; // 输出速度
    Move_Done: BOOL; // 运动是否完成
END_VAR
VAR
    Acc_Rate: REAL; // 加速度
    Dec_Rate: REAL; // 减速度
    Vel: REAL; // 当前速度
    Pos_Err: REAL; // 位置误差
    T: TIME; // 时间变量
END_VAR

// 初始化变量
Acc_Rate := Max_Vel / Acc_Time;
Dec_Rate := Max_Vel / Dec_Time;
Vel := 0.0;
Pos_Err := End_Pos - Start_Pos;
Move_Done := FALSE;

// 控制运动
IF Pos_Err > 0 THEN // 上升运动
    IF Vel < Max_Vel THEN // 加速阶段
        Vel := Vel + Acc_Rate * DT;
        IF Vel > Max_Vel THEN
            Vel := Max_Vel;
        END_IF
    ELSEIF Vel > Max_Vel AND Vel <= (Max_Vel + Dec_Rate * DT) THEN // 减速阶段
        Vel := Vel - Dec_Rate * DT;
        IF Vel < Max_Vel THEN
            Vel := Max_Vel;
        END_IF
    ELSEIF Vel > Max_Vel + Dec_Rate * DT THEN // 匀速阶段
        Vel := Max_Vel;
    END_IF
ELSE // 下降运动
    IF Vel > -Max_Vel THEN // 加速阶段
        Vel := Vel - Acc_Rate * DT;
        IF Vel < -Max_Vel THEN
            Vel := -Max_Vel;
        END_IF
    ELSEIF Vel < -Max_Vel AND Vel >= (-Max_Vel - Dec_Rate * DT) THEN // 减速阶段
        Vel := Vel + Dec_Rate * DT;
        IF Vel > -Max_Vel THEN
            Vel := -Max_Vel;
        END_IF
    ELSEIF Vel < -Max_Vel - Dec_Rate * DT THEN // 匀速阶段
        Vel := -Max_Vel;
    END_IF
END_IF

IF ABS(Pos_Err) <= ABS(Vel * DT) THEN // 运动完成
    Move_Done := TRUE;
    Out_Vel := 0.0;
ELSE // 运动未完成
    Out_Vel := Vel;
END_IF[/code]

该程序定义了一个FB函数块“S_Curve_Control”,输入包括初始位置、目标位置、加速时间、减速时间、最大速度等参数,输出为当前速度和运动是否完成的信号。

在程序中,首先定义了一些变量,包括加速度、减速度、当前速度、位置误差和时间。然后根据位置误差的正负来判断上升还是下降运动,并分别进行加速、匀速和减速三个阶段的控制。最后根据位置误差是否小于等于当前速度乘以时间的绝对值来判断运动是否完成,如果完成,则输出速度为0,否则输出当前速度。

在使用该程序时,需要根据具体的控制系统设置输入参数,并将FB函数块与实际的控制器和变频器进行连接。
回复

使用道具 举报

NAME | 2023-7-6 16:57:23 | 显示全部楼层
用SCL编写一个自适应S速度曲线的程序,运用运用编码器做定位,模拟量输出4-20MA控制变频器速度
回复

使用道具 举报

chatGPT_小智 | 2023-7-6 16:58:39 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=5005&ptid=1642][color=#999999]NAME 发表于 2023-07-06 16:57[/color][/url][/size]
用SCL编写一个自适应S速度曲线的程序,运用运用编码器 ...[/quote]

以下是一个用SCL编写自适应S速度曲线的程序示例,使用编码器进行定位控制,并通过模拟量输出4-20mA来控制变频器的速度。请注意,这只是一个基本的框架,具体的实现细节还需要根据实际情况进行调整和完善。

VAR
  Target_Pos: REAL; // 目标位置
  Max_Velocity: REAL; // 最大速度
  Acceleration: REAL; // 加速度
  Deceleration: REAL; // 减速度
  Current_Pos: REAL; // 当前位置
  Velocity: REAL; // 当前速度
  Error: REAL; // 位置误差
  Output: REAL; // 输出信号

METHOD MoveToTargetPosition : BOOL
  VAR
    Start_Pos: REAL; // 初始位置
    Distance: REAL; // 位移距离
    Ramp_Up_Time: REAL; // 加速时间
    Ramp_Down_Time: REAL; // 减速时间
    T: TIME; // 时间变量
  END_VAR
  
  Start_Pos := Current_Pos;
  Distance := ABS(Target_Pos - Start_Pos);
  Ramp_Up_Time := Max_Velocity / Acceleration; // 计算加速时间
  Ramp_Down_Time := Max_Velocity / Deceleration; // 计算减速时间
  
  // 加速阶段
  FOR T := 0 TO Ramp_Up_Time STEP 1 DO
    Velocity := (T / Ramp_Up_Time) * Max_Velocity; // 计算当前速度
    Error := Target_Pos - Current_Pos; // 计算位置误差
    Output := (4.0 + (16.0 * (Error / Distance))); // 计算输出信号
  
    // 控制变频器速度
    SetVariableSpeed(Velocity);
  
    WAIT FOR 1ms;
  END_FOR;
  
  // 匀速阶段
  WHILE ABS(Current_Pos - Target_Pos) > 0.01 DO // 当位置误差小于0.01时停止
    Velocity := Max_Velocity; // 维持最大速度
    Error := Target_Pos - Current_Pos; // 计算位置误差
    Output := (4.0 + (16.0 * (Error / Distance))); // 计算输出信号
  
    // 控制变频器速度
    SetVariableSpeed(Velocity);
  
    WAIT FOR 1ms;
  END_WHILE;
  
  // 减速阶段
  FOR T := 0 TO Ramp_Down_Time STEP 1 DO
    Velocity := Max_Velocity - ((T / Ramp_Down_Time) * Max_Velocity); // 计算当前速度
    Error := Target_Pos - Current_Pos; // 计算位置误差
    Output := (4.0 + (16.0 * (Error / Distance))); // 计算输出信号
  
    // 控制变频器速度
    SetVariableSpeed(Velocity);
  
    WAIT FOR 1ms;
  END_FOR;
  
  // 停止
  Velocity := 0.0;
  Output := 4.0;
  SetVariableSpeed(Velocity);
  
  RETURN TRUE;
  
END_METHOD

METHOD SetVariableSpeed(Velocity: REAL)
  VAR
    Frequency: REAL; // 变频器频率
    Analog_Output: REAL; // 模拟量输出值
  END_VAR
  
  Frequency := Velocity / Max_Velocity; // 计算变频器频率
  Analog_Output := (Frequency * 16.0) + 4.0; // 计算模拟量输出值
  
  // 控制变频器速度和模拟量输出
  ControlVariableSpeed(Frequency);
  ControlAnalogOutput(Analog_Output);
  
END_METHOD

METHOD ControlVariableSpeed(Frequency: REAL)
  // 控制变频器速度的代码
  // 这里可以写入具体的变频器控制函数
  
END_METHOD

METHOD ControlAnalogOutput(Value: REAL)
  // 控制模拟量输出的代码
  // 这里可以写入具体的模拟量输出函数
  
END_METHOD
回复

使用道具 举报

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

本版积分规则