一个函数块给了我一些真实的数据类型。雷亚尔必须转换为DWORD。在使用的平台上,数据类型有以下大小:
因此,我想的是,如果在这两种数据类型之间传输位表示,则值不会更改或松散精度。我想做的是:
myReal : REAL;
myDWord : DWORD;
myResultReal : REAL;
myReal := 0.819;
myDWord := REAL_TO_DWORD(myReal);
myResultReal := DWORD_TO_REAL(myDWord);
// myResultReal has value: 1
// Also when I check the bit string of the myDWord it differs from the actual
// bit string of myReal. Immediately after the first conversion.整个问题只是编程语言的规则。由于这两种数据类型具有相同的内存大小,因此完全没有必要进行转换。转换的实际原因仅仅是因为我需要稍后将我的号码传递给代码,它只接受DWORD数据类型。然后,它使用DWORD来获得一个真实值,但在这一点上,该值受到了不可取的影响。
发布于 2018-10-12 11:36:57
有两种选择。最喜欢的是pboedker建议的那种: UNION数据类型。
示例:
TYPE U_TestUnion :
UNION
Value_DWORD : DWORD;
Value_REAL : REAL;
END_UNION
END_TYPE
VAR
TestUnion : U_TestUnion;
END_VAR
TestUnion.Value_REAL := 0.819;
//TestUnion.Value_DWORD is now 1062316540 (=16#3F51A9FC)
TestUnion.Value_DWORD := 10;
//TestUnion.Value_REAL is now 1.401298E-44
TestUnion.Value_DWORD := 1062316540;
//TestUnion.Value_REAL is now 0.819 另一个是使用MEMCPY函数,它将值从内存复制到其他位置。在不同的系统中,该函数的名称可能略有不同。通过这样做,您可以将内容从实际值的位置复制到DWORD和向后的地址。
在真实的->DWORD的方向上,不应该有任何担心.但是,当从DWORD复制到REAL时,如果数据在任何地方都有被修改的可能性,可能会出现一些问题。该值可能是NaN或Infinity,这可能会导致PLC崩溃。这意味着真值没有正确地格式化为十进制数。
VAR
Value_DWORD : DWORD;
Value_REAL : REAL;
END_VAR
Value_REAL := 0.819;
MEMCPY(destAddr:=ADR(Value_DWORD), srcAddr:=ADR(Value_REAL), n:=SIZEOF(Value_REAL));
//Value_DWORD is now 1062316540 (=16#3F51A9FC)
Value_DWORD := 10;
MEMCPY(destAddr:=ADR(Value_REAL), srcAddr:=ADR(Value_DWORD), n:=SIZEOF(Value_DWORD));
//Value_REAL is now 1.401298E-44
Value_DWORD := 1062316540;
MEMCPY(destAddr:=ADR(Value_REAL), srcAddr:=ADR(Value_DWORD), n:=SIZEOF(Value_DWORD));
//Value_REAL is now 0.819 发布于 2018-10-12 10:14:06
问题是您正在使用转换,所以您的REAL=0.819将被转换为DWORD=1并返回到REAL=1。在每次转换时,位表示都会相应地改变。
解决问题的一个方法是使用UNION (IEC 61131-3).通过这种方式,您可以将DWORD部分写入真实的部分,将DWORD部分传递给其他代码,然后在代码中再次使用真实的部分。
发布于 2018-10-13 04:54:56
一个简单的解决方案是在转换之前将实际值乘以10倍,这取决于您想要的精度如下:
myReal := 0.819;
myDWord := REAL_TO_DWORD(myReal * 1000);
myResultReal := DWORD_TO_REAL(myDWord)/1000;

https://stackoverflow.com/questions/52775785
复制相似问题