将 FB 实例传递到不同功能块的不同实例的初始化中

问题描述 投票:0回答:1

我是 twincat3 的新手,尤其是与 oop 一起使用它。 我试图将 FB_EventLogger 的实例传递给 O2_Sensor 实例的 FB_init。 例如: 主要的 瓦尔 EventLogger:FB_EventLogger(I_PersistantEventStrotagr:= CSV); O2_传感器:O2_传感器(EventLogger:= EventLogger); 结束变量

结束_主要

O2_传感器 变量 EventLogger :参考 FB_EventLogger ; 事件信息:某事; 结束变量

method_addEvent

Eventlogger.AddEvent(eventinfo); end_method_addEvent

end_O2_传感器

我希望允许 O2_sensor FB 的任何实例都能够创建自己的事件,因为这将使代码变得更好,而不是使用单独的函数来检查所有不同的输入,然后发出警报或发送消息。

我想到的第一件事是传递 eventlogger fb 的实例并在传感器的 fb 中使用它,但这不起作用。但是,如果我创建一个接受事件记录器引用的方法,即 O2_Sensor.addevent(EventLogger),它就可以工作。

oop plc twincat structured-text twincat-hmi
1个回答
2
投票

我无法完全理解您尝试阅读您的问题。初始化可能非常棘手。这里有一些提示:

  • 封闭功能块实例的 FB_Init 在其包含的嵌套功能块的 FB_Init 之后调用。您不能将由封闭功能块自己的 FB_Init 设置的任何内容作为参数传递给嵌套功能块的 FB_Init。

  • 但是,当使用继承时,如果CHILD_FB扩展了PARENT_FB,则在PARENT_FB.FB_Init中分配的变量可以用作CHILD_FB的嵌套功能块的参数。因此,您可以通过引入继承级别来绕过该限制。代码多了一点,但编写起来很容易,并且可以避免其他地方变得更丑陋。

  • 请注意,您可以使用“THIS”指针作为嵌入式功能块实例的参数,并且该指针在调用嵌入式实例的 FB_Init 时有效。指针是有效的(并且可以用于引用注入),但是在其上调用方法并不能本质上保证工作(请参阅下一点)。

  • 因为您可以接收到实例的有效引用(或指针)并不意味着您可以对其执行任意方法,因为这些方法可能依赖于尚未准备好的东西。这并不意味着它不能工作:可以调用代码,并且可以使用“普通”变量(即不是功能块)和(可能嵌套的)普通变量的数组/结构。

  • 我大量使用引用注入,我使用 FB_Init 进行赋值(包括引用赋值),但不调用方法,除非我知道这些方法仅使用同一实例的普通变量或结构。这使得 FB_Init 独立于初始化顺序(对我来说非常重要,您的情况可能会有所不同)。

  • 由于 FB_Init 执行的时间/方式,您无法单步执行它包含或调用的代码。因此,FB_Init 中的错误非常难以调试,只做简单的事情有助于避免令人沮丧的调试会话。

  • 您可能需要或受益于独立于 FB_Init 的初始化机制来完成工作。我有一个完整的框架来为我管理这个(初始化和执行),在任何复杂的事情上“手动”进行它可能会是开发和维护的一场噩梦。

© www.soinside.com 2019 - 2024. All rights reserved.