对于用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时代写的意大利面条代码。
是否还有其他样式来编写此程序,使我能够等待驱动器完成其任务,但是这不会让人感到如此错综复杂?
如果这个问题“过于宽泛”,请告诉我,我不知道还能在哪里问。
答案 0 :(得分:1)
老实说,case
声明是我找到的最好的方式来实现你所说的。但是,您可以将function
或function block
中的功能组合在一起,以减少每个步骤中编写的代码量...或者在case
中使用迷你function blocks
语句来减少一个地方的代码量使其更具“可读性”。
答案 1 :(得分:1)
我同意mrsargent,并且case语句是在循环运行的程序中实现状态机的好方法。
我建议您也为您的州使用枚举而不是数值。在下面的示例中,motorState是枚举类型的变量,与具有数值相比,它使代码更易于阅读。
class Other(models.Model):
poster = models.ImageField(upload_to="articlepic", blank=True)
text = models.CharField(max_length=300, blank=False)
created_at = models.DateTimeField("created at", auto_now_add=True)