hij*_*ack 5 floating-point plc decimal ieee-754 codesys
我有一个通过 Profibus DP 与 PLC 通信的硬件,它向我发送 4 个字节的十六进制数据,即“44 79 FF FF”,并且在 PLC 程序中,我已为该输入数据声明了一个 BYTE 数组。问题是在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);
Run Code Online (Sandbox Code Playgroud)
其中 in1、in2、in3 和 in4 是字节 0-3。
我得到的价值是;4bytesData= 1148846079 & realValue= 1.148846e+009
我期望获得的值realValue是 = 9.9999993896484375E2
如果我使用此网站( IEEE754 分析器/转换器)并转换十六进制值(4479FFFF),我将得到我想要的值,如果我插入十进制值(1148846079),我将得到与我在PLC。
我希望您理解我的问题,非常感谢。
你已经明白了,看来你只是没有意识到。转换DWORD_TO_REAL将存储的整数(十六进制)值4bytesData转换为 IEEE754 REAL 格式。
这不是你想做的。 已经4479FFFF是IEEE754 REAL 格式 - 您将获取该值,将 REAL 解释为 DWORD,然后将 DWORD 值转换为 REAL。简短的答案是您不需要转换 -已经采用正确的格式。4bytesData
编辑
跟进评论:

这里 FunctionBlock2 声明了 rIn(REAL)、rOut(REAL) 和 set rOut:=rIn;。这绕过了 ST 的强制类型转换。这里存储的数据没有任何变化D2000- 它是相同的二进制数据。顶部功能块将其存储到内存中,底部功能块从内存中读取它。唯一的区别是顶部梯级将其解释为 DWORD(用于显示目的),底部梯级将其解释为 REAL。
编辑
我一直在阅读 Beckhoff 手册。看来你可能还有其他选择。尝试在同一内存位置声明 DWORD 和 REAL。如果没有,也许指针可以让您做到这一点(不确定类型限制是否也适用于 Beckhoff 的指针?)