我有一个通过Profibus DP与PLC通信的硬件,它发送给我4字节的十六进制数据,即"44 79 FF FF“,在PLC程序中,我已经为这个输入数据声明了一个字节数组。问题是,在PLC中,我在字节数组中接收到的数据是"66 121 255 255“,这是六进制的十进制值,但我的目标是将该值转换为一个实值,当我这样做时,我没有得到我预期的值。
我已经创建了一个DWORD(4bytesData
),并将所有字节插入其中。因此,在我将这4个字节插入4bytesData
之前,字节是:in1 = 68
、in2 = 121
、in3 = 255
和in4 = 255
4bytesData := (SHL(SHL(SHL(BYTE_TO_DWORD(in1), 8) OR BYTE_TO_DWORD(in2), 8) OR BYTE_TO_DWORD(in3), 8) OR in4);
realValue := DWORD_TO_REAL(4bytesData);
其中in1、in2、in3和in4是字节0-3.
我得到的值是:4bytesData
= 1148846079 & realValue
= 1.148846e+009
我期望从realValue
获得的值是= 9.9999993896484375E2
如果我使用这个网站( IEEE754分析仪/转换器 )并转换十六进制值(4479FFFF),我将得到我想要的值,如果我插入十进制值(1148846079),我将得到相同的值。
我希望你能理解我的问题,非常感谢。
发布于 2013-04-19 13:54:15
你已经搞清楚了,好像你还没意识到。转换DWORD_TO_REAL
采用存储在4bytesData
中的整数(十六进制)值,并将其转换为IEEE754真实格式。
这不是你想做的。4479FFFF
已经是IEEE754 REAL格式的了--您正在使用该值,将真实值解释为DWORD,然后将DWORD值转换为真实值。简单的回答是,您不需要转换-- 4bytesData
已经采用了正确的格式。
编辑
对意见采取后续行动:
这里,FunctionBlock2 delclares rIn(真实),rOut(REAL),并设置rOut:=rIn;
。这就绕过了ST的强制排版。这里存储在D2000
中的数据没有什么变化--它是相同的二进制数据。顶部函数块将其存储到内存中,底部函数块从内存中读取它。唯一的区别是,上层是将其解释为DWORD (为了显示目的),而底层是将其解释为真实的。
编辑
我一直在看贝克霍夫手册。看来你还有别的选择。也许可以试试在同一个内存位置声明DWORD和REAL。如果不是,也许是指针会让你这么做 (不确定类型限制是否也适用于贝克霍夫的指针?)
发布于 2018-11-19 12:30:12
如果有人感兴趣,我在贝克霍夫PLC上使用这个函数将4个字节的数组转换为一个真实的:
(*声明*)
FUNCTION BYTE_TO_REAL : REAL
VAR_INPUT
abValueIn : ARRAY[0..3] OF BYTE;
END_VAR
VAR
pByteIn1, pByteIn2, pByteIn3, pByteIn4: POINTER TO BYTE;
rValueOut : REAL;
END_VAR
(*执行*)
pByteIn1 := ADR(rValueOut);
pByteIn2 := ADR(rValueOut) + SIZEOF(BYTE);
pByteIn3 := ADR(rValueOut) + 2 * SIZEOF(BYTE);
pByteIn4 := ADR(rValueOut) + 3 * SIZEOF(BYTE);
(*watch out, small endians needed here*)
pByteIn1^ := abValueIn[3];
pByteIn2^ := abValueIn[2];
pByteIn3^ := abValueIn[1];
pByteIn4^ := abValueIn[0];
BYTE_TO_REAL := rValueOut;
正如我所发现的,REAL存储在4个字节上,末尾是强字节。我的意思是,与IEEE-754变换器相比,字节是按相反的方向排列的,所以我必须在代码中反转它。
我不明白十进制十六进制的原始问题。在twincat中,值在调试中以十进制显示,但在内部,这不应该有任何区别。
发布于 2013-04-19 11:17:05
您的字节顺序可能是错误的,并且您的例程期待相反的痴呆症。尝试FFFF7944而不是4479FFFF,看看您是否得到了预期的9.99993896484375E2。此外,1148846079是00F4884E作为IEEE754 (如果需要更改字节顺序),因此您可能有更多的错误在您的感知。
https://stackoverflow.com/questions/16085959
复制相似问题