ST基础学习

jmfans 发布于 2024-08-30 1.05k 次阅读


AI 摘要

**控制风扇和马达,计数和触发事件,并处理异常。**

ST简单使用

程序功能分解

  1. 控制一个风扇的开关基于温度传感器的输入。
  2. 使用不同的模式来控制马达。
  3. 实现一个简单的计数器。
  4. 处理上升沿和下降沿触发事件。
  5. 实现一个基本的运动控制。
  6. 处理异常情况(如除0保护、数组越界等)。

实战程序

PROGRAM MainProgram
VAR
    temperature: REAL := 0.0; // 温度传感器输入
    fan: BOOL := FALSE; // 风扇状态
    mode: INT := 0; // 模式选择
    motor: BOOL := FALSE; // 马达状态
    i, j, k, m: INT := 0; // 计数器
    signal: BOOL := FALSE; // 输入信号
    rising_edge, falling_edge: BOOL := FALSE; // 上升沿和下降沿
    r_trig_ins: R_TRIG; // 上升沿触发实例
    f_trig_ins: F_TRIG; // 下降沿触发实例
    array: ARRAY[1..10] OF INT := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; // 数组
    index: INT := 0; // 数组下标
    result: REAL; // 计算结果
END_VAR

// 控制风扇的开关
IF temperature > 100 THEN
    fan := TRUE;
ELSIF temperature > 80 THEN
    fan := TRUE;
    alarm := TRUE;
ELSE
    fan := FALSE;
    alarm := FALSE;
END_IF;

// 根据模式控制马达
CASE mode OF
    1: motor := TRUE;
    2: motor := FALSE;
    3, 4, 5: motor := TRUE;
ELSE
    motor := FALSE;
END_CASE;

// 简单计数器
WHILE i < 10 DO
    i := i + 1;
END_WHILE;

REPEAT
    j := j + 1;
UNTIL j >= 10
END_REPEAT;

// 使用EXIT指令
WHILE TRUE DO
    k := k + 1;
    IF k >= 5 THEN
        EXIT;
    END_IF;
END_WHILE;

// FOR循环
FOR m := 1 TO 10 DO
    x := x + m;
END_FOR;

// 上升沿和下降沿触发
r_trig_ins(CLK := signal, Q => rising_edge);
f_trig_ins(CLK := signal, Q => falling_edge);

// 异常处理示例
// 除0保护
IF denominator = 0 THEN
    denominator := 1;
END_IF;
result := numerator / denominator;

// 数组越界处理
index := 11; // 故意设置一个越界的下标
IF index > 10 THEN
    index := 10;
END_IF;
value := array[index];

// 死循环检测
WHILE TRUE DO
    // 模拟死循环
    EXIT; // 提前退出以避免实际死循环
END_WHILE;

END_PROGRAM

解释

  1. 风扇控制:根据温度传感器的输入来控制风扇的开关。如果温度超过100度,风扇开启;如果温度在80到100度之间,风扇和报警都开启;否则,风扇和报警都关闭。

  2. 马达控制:根据模式选择来控制马达的状态。如果模式为1或3、4、5,马达开启;否则,马达关闭。

  3. 计数器:使用WHILE和REPEAT循环来实现简单的计数器。

  4. EXIT指令:在一个无限循环中使用EXIT指令来提前退出。

  5. FOR循环:通过FOR循环来实现累加操作。

  6. 上升沿和下降沿触发:使用R_TRIG和F_TRIG功能块来检测信号的上升沿和下降沿。

  7. 异常处理:包括除0保护和数组越界处理。并且模拟了一个死循环的检测。

轴控等其他程序

实战程序

PROGRAM MainProgram
VAR
    // 基本轴控变量
    Axis: AXIS_REF; // 轴引用
    PowerStatus: BOOL;
    AxisError: BOOL;
    CurrentPosition: REAL;
    CurrentVelocity: REAL;
    CurrentTorque: REAL;
    MoveComplete: BOOL;
    ErrorID: INT;

    // 编码器变量
    EncoderStatus: BOOL;
    EncoderPosition: REAL;

    // 定时器变量
    Timer: TONR;
    TimerElapsed: BOOL;

    // 中断变量
    InterruptEnabled: BOOL;

    // 字符串变量
    SourceString: STRING[20] := 'Hello World';
    TargetString: STRING[20];

    // 其他变量
    RealResult: REAL;
    MemoryBlock: ARRAY[1..10] OF BYTE;
END_VAR

// 基本轴控指令
// 使能轴
MC_Power(Axis := Axis, Enable := TRUE, Status => PowerStatus, Error => AxisError, ErrorID => ErrorID);

// 读取轴状态
MC_ReadStatus(Axis := Axis, Status => PowerStatus, Error => AxisError, ErrorID => ErrorID);

// 读取轴故障
MC_ReadAxisError(Axis := Axis, Error => AxisError, ErrorID => ErrorID);

// 读取当前位置信息
MC_ReadActualPosition(Axis := Axis, Position => CurrentPosition);

// 读取当前速度信息
MC_ReadActualVelocity(Axis := Axis, Velocity => CurrentVelocity);

// 读取当前力矩信息
MC_ReadActualTorque(Axis := Axis, Torque => CurrentTorque);

// 设置当前位置
MC_SetPosition(Axis := Axis, Position := 0.0, Execute := TRUE, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 相对定位
MC_MoveRelative(Axis := Axis, Distance := 100.0, Velocity := 10.0, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 绝对定位
MC_MoveAbsolute(Axis := Axis, Position := 50.0, Velocity := 10.0, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 速度指令
MC_MoveVelocity(Axis := Axis, Velocity := 10.0, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 点动
MC_Jog(Axis := Axis, JogForward := TRUE, Velocity := 5.0, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 力矩控制指令
MC_TorqueControl(Axis := Axis, Torque := 5.0, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 原点回归指令
MC_Home(Axis := Axis, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 停止指令
MC_Stop(Axis := Axis, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 急停指令
MC_ImmediateStop(Axis := Axis, Done => MoveComplete, Error => AxisError, ErrorID => ErrorID);

// 编码器指令
// 使能编码器
ENC_Counter(Encoder := EncoderStatus, Enable := TRUE, Error => AxisError, ErrorID => ErrorID);

// 读取编码器状态
ENC_ReadStatus(Encoder := EncoderStatus, Status => EncoderStatus, Error => AxisError, ErrorID => ErrorID);

// 读取编码器位置
ENC_SetUnit(Encoder := EncoderStatus, Position := EncoderPosition, Error => AxisError, ErrorID => ErrorID);

// 通讯指令
// 读取从站参数
ETC_ReadParameter_CoE(Slave := 1, Index := 0x2000, SubIndex := 1, Data := CurrentPosition, Error => AxisError, ErrorID => ErrorID);

// 写入从站参数
ETC_WriteParameter_CoE(Slave := 1, Index := 0x2000, SubIndex := 1, Data := 100, Error => AxisError, ErrorID => ErrorID);

// 重启主站
ETC_RestartMaster(Master := 1, Error => AxisError, ErrorID => ErrorID);

// 定时器指令
// 接通延时定时器
TONR(IN := TRUE, PT := T#5S, Q => TimerElapsed, ET => Timer.ET);

// 中断指令
// 开启中断
EI();

// 关闭中断
DI();

// 字符串指令
// 移动字符串
STRMOV(Source := SourceString, Dest := TargetString);

// 其他指令
// 实数取余
RealResult := ModReal(10.5, 3.2);

// 内存设置
MSET(DstAddr := ADR(MemoryBlock), SrcAddr := ADR(SourceString), Size := SIZEOF(SourceString));

// 内存复位
MCPY(DstAddr := ADR(MemoryBlock), SrcAddr := ADR(SourceString), Size := SIZEOF(SourceString));

END_PROGRAM