发布于 2010-07-15 10:39:42
10楼
楼主,我在5楼所使用的转换公式有误,现予以更正。希望所有对此转换产生误解的朋友,和将要使用SCL进行编程的朋友,对此引起重视,给大家造成的误导,感到很抱歉!
上述转换公式错误原因:“DWORD_TO_REAL仅仅是从源数据拷贝位串至目的变量”,而“DINT_TO_REAL函数将把源数据转换并按照IEEE REAL的格式存储到目的变量。所以从WORD到REAL的转换,为了获得正确的“REAL”数,必须总是通过中间步骤“DWORD_TO_DINT”和“DINT_TO_REAL”来实现。
上述转换公式更正为:
DB2.DBD10:=DWORD_TO_WORD(DINT_TO_DWORD(REAL_TO_DINT(DINT_TO_REAL(DWORD_TO_DINT(DB2.DBD10))+INT_TO_REAL(1))))); //补充:对于DWORD类型数据正确
所以这样一来转换就变得非常复杂了,所以不要采用REAL数据类型相加了,因为1是INT类型的,所以将两个数转换为DINT来运算比较方便,当然这样一来数据精度可能存在问题。
DB2.DBD10:=DWORD_TO_WORD(DINT_TO_DWORD(DWORD_TO_DINT(REAL_TO_DWORD(DB2.DBD10))+INT_TO_DINT(1))); //补充:错误。
在数据类型转换时,分为两类数据类型转换,A类隐式数据类型转换,B类显式数据类型转换,在使用的时候需要非常小心。上述使用到的转换函数中,WORD_TO_DWORD、INT_TO_DINT、INT_TO_REAL、DINT_TO_REAL等属于A类转换函数,其它属于B类转换函数。
物竞天择,适者生存!