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
Comments NOTHING