我正在尝试在Twincat 3.1中构建一个复合模式。
激活配置和第一次新的下载或在线更改似乎一切都很好。无论我添加或删除多少对象,第二个新下载都会导致一般保护错误或BSOD。
为简单起见,Object是实现I_SYS_COMP_Object接口的FB。
项目使用FB_init和FB_exit从全局对象列表中添加或删除对象。以前的迭代使用call_after_init属性,结果相同。
由于代码变得冗长,我添加了一个到存储库的链接。GitHub代表
我应该如何处理这种问题?
编辑26/11:
核心转储和异常模式不工作。
到目前为止,我已经发现:
IF object <> 0 THEN
RETURN;
END_IF
_this_object = THIS^;
IF object.parent <> THIS^ THEN
RETURN;
END_IF
是问题的一部分。现在我在
下面几行看到了BSOD_last_child := object;
这很奇怪,因为这应该是一个简单的赋值。目前,_last_child仅在有问题的方法中使用。我输入一个RETURN;在完成任务后,我仍然收到BSOD。
我不能就你的问题提供具体的指导,但我的经验是调试从FB_Init调用的代码是非常令人沮丧的,因为你不能进入代码。
因此,我开发了一种方法,我使用FB_Init非常简单的事情(主要是赋值,经常REF=赋值)和延迟实际初始化代码,直到FB_Init方法调用之后。我实现了我自己的,独立的,初始化和执行框架,这使得这很容易。多亏了这种方法,我掉头发的速度变慢了。
我大量使用断言(特别是方法中的前提条件,包括FB_Init),并且在观察到超出规范的情况时使运行时崩溃。我在FB_Init调用中检查它们,但框架实际上延迟崩溃,直到正常执行开始。这样,我就不会像在FB_Init执行期间发生崩溃那样丢失有关崩溃原因的信息。捕获传递给FB_Init的无效引用是一种常见的情况,这可以节省很多麻烦。