运动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 声明是我发现的完成您所谈论内容的最佳方式。但是,您可以在 functionfunction 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