【问题标题】:PLC Object Oriented Programming - Using methodsPLC 面向对象编程 - 使用方法
【发布时间】: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


【解决方案1】:

通常,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 语句,这会妨碍可读性。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2013-04-09
      • 2015-03-20
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多