NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。IEEE 754-1985中,用指数部分全为1、小数部分非零表示NaN。以32位IEEE单精度浮点数的NaN为例,按位表示即:S111 1111 1AXX XXXX XXXX XXXX XXXX XXXX,S为符号位,符号位S的取值无关紧要;A是小数部分的最高位,其取值表示了NaN的类型:X不能全为0,并被称为NaN的有效负载。
返回NaN的运算有如下三种:
当数据为无穷大时,采样值显示为NaN,同时它会导致归类于pagefault的报错。必须检查运算逻辑避免这个运算结果。
倍福系统在默认情况下,当浮点数是NaN类型时,如果这个浮点数参与运算会导致TwinCAT死机,从而整个PLC程序停止执行。如果不想PLC死机也不管有NaN非数运算的结果,可以在相应的任务的属性栏à浮点数例外前的勾去掉,如下图所示。
有NaN参与的浮点数运算,结果也会是NaN非数,这种非数会导致我们的浮点数数学运算异常,正常情况下我们是需要判断浮点数是否是非数。
PLC内部的浮点数一般不会是非数,非数的产生一般都PLC与外部系统通信,可能是系统间时序错位或者是两者系统有区别的原因,导致浮点数的指数部分全部是1,小数部分又不是1,从而成为了非数NaN。
倍福系统可以通过函数RealIsNaN来判断32位浮点数是否是非数,如果是64浮点数用LrealIsNaN来判断。通过程序一般的处理办法是当检查到变量值是非数时就丢弃,或者用替代值。
倍福PLC在运行过程中出现Exception报错,通常会导致TwinCAT死机(控制器桌面右下角的TwinCAT图标变黄),可通过使用Core Dump分析*.core文件,从而找出报错程序代码行。导致Exception报错的可能有:定义的数组访问越界、浮点数除数是0、浮点数NaN非数等。
在使用*.core文件前,需要在TwinCAT中勾选Core Dump,如下图所示,然后激活下载配置,这样当有Exception报错时就会生成*.core文件。
*.core文件的生成路径在控制器的C:\TwinCAT\3.1\Boot\Plc文件夹下,根据日期可能会有多个*.core文件。
当有Exception报错后想要定位错误的代码,可以如下操作:
在TwinCAT中打开对应的项目文件,需要注意打开的项目和生成*.core文件的项目必须一致,选择菜单栏的PLC选项àCore DumpàLoad Core Dump,如下图所示:
如果之前程序是在在线的模式,需要先Logout再操作。接下来出现以下弹窗:
如果是在线上载的 Core Dump文件,选择 “是”;
如果是离线上载的 Core Dump文件,选择 “否”,在弹出的窗口中从相关路径选择对应的.core文件(这种针对于没有在线连着控制器的情况)。
加载完 Core Dump文件后,TwinCAT会将出错代码直接标黄,如下图所示:上图中,错误代码行,发生错误时的变量值等都有显示,分析错误原因后面好对程序Debug。
找出出错代码后,按下图方式关闭Core Dump文件。
剩下的就是对程序进行Debug。如数组可以对访问元素的指针变量指定边界,数组定义最好从0开始;浮点数在用除法时先检查除数是否非零;外部浮点数检查是否是NaN非数等。
2019.9.9 罗晓晨 编辑
2024.12.19 杨靖华 更新