问题:PLC程序中实数的比较方法
回答:

实数的比较有时会出现问题,例如

 

(*automode qiankui*)

         i_i16pb_In_Pitch_Angle_Setpoint                                                           : INT;

         qiankui_old_in_pitch_angle_setpoint                                                    : INT;

         qiankui_10_in_pitch_angle_setpoint                                                     : INT;

         qiankui_old_10_in_pitch_angle_setpoint                                             : INT;

         qiankui_cycles                                                                                              : UDINT;

 

 

qiankui_10_in_pitch_angle_setpoint := REAL_TO_INT(INT_TO_REAL(i_i16pb_In_Pitch_Angle_Setpoint) / 10.0);

qiankui_old_10_in_pitch_angle_setpoint := REAL_TO_INT(INT_TO_REAL(qiankui_old_in_pitch_angle_setpoint) / 10.0);

 

qiankui_diff := ABS((INT_TO_REAL(i_i16pb_In_Pitch_Angle_Setpoint) / 10.0) - INT_TO_REAL(qiankui_10_in_pitch_angle_setpoint));

 

IF (qiankui_10_in_pitch_angle_setpoint = qiankui_old_10_in_pitch_angle_setpoint) AND (ABS((INT_TO_REAL(i_i16pb_In_Pitch_Angle_Setpoint) / 10.0) - INT_TO_REAL(qiankui_10_in_pitch_angle_setpoint)) <= 0.1) THEN

                                               qiankui_cycles := qiankui_cycles + 1;

                                     ELSE

                                               qiankui_cycles := 0;

                                     END_IF

qiankui_old_in_pitch_angle_setpoint := i_i16pb_In_Pitch_Angle_Setpoint;

 

 

上述代码if语句中<=0.1有时候会失效,例如将i_i16pb_In_Pitch_Angle_Setpoint强制为12或者-5等值。

 

在此类情况下,建议将实数放到需要的精度倍数上,然后使用整型数进行比较

例如,两个实时rArB,需要保留2位小数,则做如下处理

REAL_TO_INT(rA * 100)  <>  REAL_TO_INT(rB * 100)

 

因为在计算机中0.1可能是0.0999999也可能是0.10000001





数据维护:周耀纲
编辑时间:8 5月 2019

如果此回答有不清楚或错误的地方,请扫描页面底部二维码添加微信公众号与我们联系,我们努力给您满意的答复。