ST基础学习
ST简单使用
程序功能分解
- 控制一个风扇的开关基于温度传感器的输入。
- 使用不同的模式来控制马达。
- 实现一个简单的计数器。
- 处理上升沿和下降沿触发事件。
- 实现一个基本的运动控制。
- 处理异常情况(如除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
解释
-
风扇控制:根据温度传感器的输入来控制风扇的开关。如果温度超过100度,风扇开启;如果温度在80到100度之间,风扇和报警都开启;否则,风扇和报警都关闭。
-
马达控制:根据模式选择来控制马达的状态。如果模式为1或3、4、5,马达开启;否则,马达关闭。
-
计数器:使用WHILE和REPEAT循环来实现简单的计数器。
-
EXIT指令:在一个无限循环中使用EXIT指令来提前退出。
-
FOR循环:通过FOR循环来实现累加操作。
-
上升沿和下降沿触发:使用R_TRIG和F_TRIG功能块来检测信号的上升沿和下降沿。
-
异常处理:包括除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
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!

