我正在使用结构化文本为 Schneider PLC 编写程序,并且我正在尝试使用面向对象的编程来完成它。
作为 PLC 编程的新手,我编写了一个简单的测试程序,如下所示:
okFlag:=myObject.aMethod();
IF okFlag THEN
// it's ok, go on
ELSE
// error handling
END_IF
aMethod
必须执行一些操作,等待结果(有一个“超时”检查以避免死锁)并返回 TRUE 或 FALSE
这是我在程序执行期间所期望的
1)okFlag:=myObject.aMethod();
到达时,执行里面的代码,aMethod
直到返回结果。当我说“已执行”时,我的意思是在下一个扫描周期中,执行aMethod
从之前到达的点继续执行。
2) 检查方法调用的结果,执行程序的主流程
这就是发生的事情:
1)aMethod
被执行,但程序流程继续。也就是说,当它到达aMethod
一个值的末尾时,它会被返回,即使aMethod
应该等待的事件仍在执行。
2) 在下一个循环中,aMethod
再次调用并从头开始
这是我找到的第一个解决方案:
VAR_STATIC
imBusy: BOOL
END_VAR
METHOD aMethod: INT;
IF NOT(imBusy) THEN
imBusy:=FALSE;
aMethod:=-1; // result of method while in progress
ELSE
aMethod:=-1;
<rest of code. If everything is ok, the result is 0, otherwise is 1>
END_IF
imBusy:=aMethod<0;
和主程序:
CASE (myObject.aMethod()) OF
0: // it's ok, go on
1: // error handling
ELSE
// still executing...
END_CASE
这似乎有效,但我不知道这是否是正确的方法。
Schneider 有一些库使用返回布尔值的方法,并且似乎在我的程序中按我预期的那样工作。也就是说:当循环第一次到达对方法的调用时,程序流程以某种方式“偏离”,以便在下一个循环中再次进入该方法,直到它完成。有没有办法有这种行为?