基于CODESYS平台的库CAA_BehaviourModel.library之ETrigA详解

    上升沿开始动作,在动作完成或内部发生错误或外部中止之前下降沿,输出值仅变化1个周期,在动作完成或内部发生错误或外部中止之后下降沿,输出值保留到下降沿。外部中止, 动作立即停止并且输出复位到初始状态。

FUNCTION_BLOCK ETrigA IMPLEMENTS IFBCommand
VAR_INPUT
	xInExecute: BOOL;	
	xInAbort: BOOL;

END_VAR
VAR_OUTPUT
	xOutDone: BOOL;		    //完成
	xOutBusy: BOOL;		    //执行中
	xOutError: BOOL;		//出错
	xOutAborted : BOOL;	    //被用户中止
END_VAR
VAR
	xPreviousAbortInProgress: BOOL;	//上一周期xAbortInProgress的值
	xPreviousExecute: BOOL;			//上一周期xExecute的值
	xAbortInProgress: BOOL;			//中止处理中
	iError: INT;					//错误代码
END_VAR

IF xInAbort AND xOutBusy AND NOT xAbortInProgress THEN  //在功能执行中且内部未出现中止时用户中止
   xAbortInProgress:= TRUE;
END_IF;

IF NOT (xAbortInProgress OR xInAbort) THEN	//中止未请求
   IF NOT xOutBusy THEN
	  IF NOT xInExecute AND xPreviousExecute THEN	    //下降沿复位输出
		 prvResetOutputs();
	  ELSIF xInExecute AND NOT xPreviousExecute THEN	//上升沿开始动作
		 xOutBusy:= TRUE;
		 xPreviousExecute := TRUE;
		 prvStart();
	   END_IF;
	END_IF;

	IF xOutBusy THEN
	   prvCyclicAction();
	   IF xOutDone THEN
		  xOutBusy:= FALSE;
	   END_IF;
	END_IF;

	IF xOutBusy THEN
	   IF iError <> 0 AND NOT xPreviousAbortInProgress THEN
		  xAbortInProgress:= TRUE;
	   END_IF;
	END_IF;
END_IF;

IF NOT xInExecute AND xInAbort AND NOT xAbortInProgress AND xOutAborted THEN	//执行中出现错误 或被用户中止
   prvResetOutputs();
END_IF;

IF xAbortInProgress THEN
   prvAbort();
   IF NOT xAbortInProgress THEN	//中止完成
	  xOutBusy:= FALSE;
	  IF iError <> 0 THEN
		 xOutError:= TRUE;
	  END_IF;
	  IF xInAbort THEN
		 xOutAborted:= TRUE;
	  END_IF;
   END_IF;
END_IF;

xPreviousAbortInProgress:= xAbortInProgress;

  prvAbort(),prvCyclicAction(),prvResetOutputs(),prvStart()为标准接口IFBCommand中的4个方法。

CoDeSys 编译器中,遇到 `NullReferenceException`(空引用异常)发生在类型化阶段(typification phase)通常表明编译器在解析或处理变量类型时遇到了未预期的空引用。尽管用户提供的数组定义和赋值逻辑在语法和语义上是正确的,但此类错误仍可能由于以下原因发生: ### 数组类型定义与使用中的潜在问题 1. **数组维度定义错误或不完整** 在某些版本的 CoDeSys 中,如果数组维度未被明确指定或存在语法错误,编译器可能在类型解析阶段无法正确识别数组结构,从而导致空引用异常。例如: ```pascal arrTest: ARRAY [1..10] OF INT; ``` 若写成: ```pascal arrTest: ARRAY [] OF INT; ``` 则可能引发编译器内部错误[^1]。 2. **结构体中嵌套数组的初始化问题** 当数组作为用户定义结构体(UDT)的一部分时,若未正确初始化结构体实例,可能导致编译器在类型推导阶段访问空指针。例如: ```pascal TYPE UDT_Test: STRUCT arr: ARRAY [1..5] OF REAL; END_STRUCT END_TYPE ``` 若在实例化该结构体时未正确分配内存或初始化字段,可能触发 `NullReferenceException`。 3. **泛型或模板类中的数组使用不当** 在使用泛型功能块(FB)或函数块模板时,若数组类型参数未被正确绑定或推导,可能导致编译器在类型检查阶段访问空对象。 4. **编译器 Bug 或版本兼容性问题** 在某些 CoDeSys 版本(如 V2.3 或早期 V3.x)中,存在已知的编译器缺陷,特别是在处理复杂数组结构或与结构体混合使用时。例如,版本 2.3 SP14 之前的编译器在处理嵌套数组时可能因未正确处理类型引用而抛出空指针异常。 ### 解决方案与建议 1. **验证数组定义的完整性** 确保所有数组维度均被明确指定,避免使用未定义大小的数组声明。例如应避免: ```pascal arr: ARRAY OF INT; // 不推荐 ``` 2. **检查结构体初始化逻辑** 若数组嵌套在结构体中,确保在实例化结构体时正确初始化所有字段,特别是在使用函数块(FB)或功能块(FC)时显式调用初始化例程。 3. **更新 CoDeSys 编译器版本** 若怀疑为编译器 Bug,建议升级至最新稳定版本(如 CoDeSys V3.5 SP16 或以上),以修复已知的类型处理缺陷。 4. **使用调试工具与日志输出** 启用 CoDeSys 的详细编译日志(Verbose Build Output),查看异常发生前的上下文信息,有助于定位具体出错的类型或变量。 5. **简化类型结构进行测试** 将复杂结构体或嵌套数组拆分为简单类型进行逐步测试,确认是否仍出现异常,有助于隔离问题根源。 ### 示例代码:结构体中数组的正确使用 ```pascal TYPE UDT_MotorData: STRUCT status: ARRAY [1..4] OF BOOL; temperature: REAL; END_STRUCT END_TYPE PROGRAM PLC_PRG VAR motor1: UDT_MotorData; END_VAR // 初始化结构体 motor1.status[1] := TRUE; motor1.temperature := 45.5; ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Codesys_PEPSI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值