运动PLC的不同编程风格
Different programming styles for motion PLC
对于一个用ST编写的motionPLC项目,我使用了很多这样的步进结构函数:
stepNum := 1;
CASE stepNum OF
1: (* Move axis to upper positon *)
axis.in.position := 0;
axis.start := true;
IF(axis.out.position = 0) THEN
stepNum := 2;
END_IF
2: (* Do something else *)
这种方法背后的目标是能够等待驱动器完成其任务,然后再转到下一个任务。
这行得通,但是随着程序变得越来越复杂,并且步骤并不总是需要按顺序进行(您可以从等待状态进入运行状态,进入故障状态然后返回等待状态),代码开始看起来更像在 qBASIC 时代编写的意大利面条代码。
是否有其他方式可以编写此程序,使我能够等待驱动器完成其任务,但不会变得如此复杂?
如果这个问题是 'too broad',请告诉我,我不知道还能问哪里。
老实说,case
声明是我发现的完成您所谈论内容的最佳方式。但是,您可以在 function
或 function block
中组合功能以减少每个步骤中编写的代码量......或者可能在 function blocks
中包含迷你 case
语句以减少一个地方的代码量使其更多 "readable".
我同意 mrsargent 的观点,case 语句是在循环 运行.
的程序中实现状态机的好方法
我建议还使用枚举而不是数值来表示您的状态。在下面的示例中,motorState 是枚举类型的变量,与数值相比,它使代码更易于阅读。
CASE motorState OF
MOTOR_DISABLED:
//do something here
MOTOR_READY:
//do something here
MOTOR_RUNNING:
//do something here
END_CASE
对于一个用ST编写的motionPLC项目,我使用了很多这样的步进结构函数:
stepNum := 1;
CASE stepNum OF
1: (* Move axis to upper positon *)
axis.in.position := 0;
axis.start := true;
IF(axis.out.position = 0) THEN
stepNum := 2;
END_IF
2: (* Do something else *)
这种方法背后的目标是能够等待驱动器完成其任务,然后再转到下一个任务。
这行得通,但是随着程序变得越来越复杂,并且步骤并不总是需要按顺序进行(您可以从等待状态进入运行状态,进入故障状态然后返回等待状态),代码开始看起来更像在 qBASIC 时代编写的意大利面条代码。
是否有其他方式可以编写此程序,使我能够等待驱动器完成其任务,但不会变得如此复杂?
如果这个问题是 'too broad',请告诉我,我不知道还能问哪里。
老实说,case
声明是我发现的完成您所谈论内容的最佳方式。但是,您可以在 function
或 function block
中组合功能以减少每个步骤中编写的代码量......或者可能在 function blocks
中包含迷你 case
语句以减少一个地方的代码量使其更多 "readable".
我同意 mrsargent 的观点,case 语句是在循环 运行.
的程序中实现状态机的好方法我建议还使用枚举而不是数值来表示您的状态。在下面的示例中,motorState 是枚举类型的变量,与数值相比,它使代码更易于阅读。
CASE motorState OF
MOTOR_DISABLED:
//do something here
MOTOR_READY:
//do something here
MOTOR_RUNNING:
//do something here
END_CASE