【发布时间】:2016-07-29 09:38:03
【问题描述】:
我正在使用结构化文本为 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 的库,它们使用返回布尔值的方法,并且似乎在我的程序中按我预期的那样工作。也就是说:当循环第一次到达对方法的调用时,程序流程以某种方式“偏离”,以便在下一个循环中再次进入该方法,直到它完成。有没有办法让这种行为?
【问题讨论】:
-
您使用的是 Somachine 还是 Unity?
-
SoMachine,4.1 版
标签: oop plc structured-text