1. TwinCAT 3程序编译及激活报错诊断

1.13. TwinCAT 3软件Online监视数值显示NaN

一、NaN是什么

NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。IEEE 754-1985中,用指数部分全为1、小数部分非零表示NaN。以32IEEE单精度浮点数的NaN为例,按位表示即:S111 1111 1AXX XXXX XXXX XXXX XXXX XXXXS为符号位,符号位S的取值无关紧要;A是小数部分的最高位,其取值表示了NaN的类型:X不能全为0,并被称为NaN的有效负载。

二、返回NaN的运算

返回NaN的运算有如下三种:

  1. 至少有一个参数是NaN的运算
  2.  不定式
    • 下列除法运算:0/0∞/∞∞/∞、/∞/∞;
    • 下列乘法运算:0×∞∞;
    • 下列加法运算:∞ + ()() + ∞;
    • 下列减法运算:∞ - ∞() - ()。
  3. 产生复数结果的实数运算。例如:
    • 对负数进行开偶次方的运算;
    •  对负数进行对数运算;
    • 对正弦或余弦到达域以外的数进行反正弦或反余弦运算。

当数据为无穷大时,采样值显示为NaN,同时它会导致归类于pagefault的报错。必须检查运算逻辑避免这个运算结果。

2

三、倍福系统NaN的处理情况

倍福系统在默认情况下,当浮点数是NaN类型时,如果这个浮点数参与运算会导致TwinCAT死机,从而整个PLC程序停止执行。如果不想PLC死机也不管有NaN非数运算的结果,可以在相应的任务的属性栏à浮点数例外前的勾去掉,如下图所示。


NaN参与的浮点数运算,结果也会是NaN非数,这种非数会导致我们的浮点数数学运算异常,正常情况下我们是需要判断浮点数是否是非数。

PLC内部的浮点数一般不会是非数,非数的产生一般都PLC与外部系统通信,可能是系统间时序错位或者是两者系统有区别的原因,导致浮点数的指数部分全部是1,小数部分又不是1,从而成为了非数NaN

倍福系统可以通过函数RealIsNaN来判断32位浮点数是否是非数,如果是64浮点数用LrealIsNaN来判断。通过程序一般的处理办法是当检查到变量值是非数时就丢弃,或者用替代值。

四、倍福系统查找TwinCAT死机的办法

倍福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 杨靖华 更新