1

我正在使用结构化文本为 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 有一些库使用返回布尔值的方法,并且似乎在我的程序中按我预期的那样工作。也就是说:当循环第一次到达对方法的调用时,程序流程以某种方式“偏离”,以便在下一个循环中再次进入该方法,直到它完成。有没有办法有这种行为?

4

2 回答 2

2

通常,OOP 不是人们在使用 IEC61131 语言时会采用的方法。您最好的选择可能是将您的代码实现为状态机。我过去曾使用这种方法来简化复杂序列,以便工厂维护人员更容易解释。

通常,如果您要采用这种方法,我建议您尝试将您的状态机本身与您的工作代码隔离开来;您可以实现 X 步骤的状态机,然后让您的工作代码引用状态机步骤。

一个简单的示例可能如下所示:

stepNo := 0;
IF (start AND stepNo = 0) THEN
    StepNo = 1;
END_IF;

(* there's a shortcut unity operation for resetting this array to zeroes which is faster, but I can't remember it off the top of my head... *)
ActiveStepArray := BlankStepArray;

IF stepNo > 0 THEN
  IF StepComplete[stepNo] THEN
      stepNo := stepNo +1;
  END_IF;

  ActiveStepArray[stepNo] := true;
END_IF;

然后在其他代码部分中,您可以放置​​...

IF ActiveStep[1] THEN
   (* Do something *)

   StepComplete[1] := true;
END_IF;

IF ActiveStep[2] THEN
   (* Do Something *)
   StepComplete[2] := true;
END_IF;

(* etc *)

这种方法的好处是,您实际上可以将所有状态机代码(包括跳转、重置等)放入 DFB,对其进行测试,然后将其搁置,然后只需使用活动步骤、完成步骤和任何其他您需要的输入。

您的代码仍将始终执行整个逻辑部分,但如果您真的想避免这种情况,那么您将不得不使用大量的 IF 语句,这将阻碍可读性。

希望有帮助。

于 2016-04-14T14:22:03.440 回答
0

为什么不使用 SFC 在很多情况下它会让你的生活更轻松,因为它本身就是状态机语言。做子程序,等待条件做另一个.. rince 并重复。:)

不要只为 ST 挂起,其他 IEC 语言在其他一些任务中更好,并尽可能保持清晰。工业 PLC 编程界不应该像许多其他编程领域那样有“这是我的蛋糕”的心态,因为应用程序的时间线可能是 40 年,而你在 20 年前离开公司去更好的工作和程序几乎总是位置/客户或至少硬件特定。

http://www.automation.com/pdf_articles/IEC_Programming_Thayer_L.pdf

于 2016-05-06T02:45:35.843 回答