首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PLC结构化文本,十进制转换为实(浮点)。没有得到我所期望的价值。(IEEE-754)

PLC结构化文本,十进制转换为实(浮点)。没有得到我所期望的价值。(IEEE-754)
EN

Stack Overflow用户
提问于 2013-04-18 14:38:50
回答 5查看 24.6K关注 0票数 4

我有一个通过Profibus DP与PLC通信的硬件,它发送给我4字节的十六进制数据,即"44 79 FF FF“,在PLC程序中,我已经为这个输入数据声明了一个字节数组。问题是,在PLC中,我在字节数组中接收到的数据是"66 121 255 255“,这是六进制的十进制值,但我的目标是将该值转换为一个实值,当我这样做时,我没有得到我预期的值。

我已经创建了一个DWORD(4bytesData),并将所有字节插入其中。因此,在我将这4个字节插入4bytesData之前,字节是:in1 = 68in2 = 121in3 = 255in4 = 255

代码语言:javascript
运行
复制
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),我将得到相同的值。

我希望你能理解我的问题,非常感谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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。如果不是,也许是指针会让你这么做 (不确定类型限制是否也适用于贝克霍夫的指针?)

票数 4
EN

Stack Overflow用户

发布于 2018-11-19 12:30:12

如果有人感兴趣,我在贝克霍夫PLC上使用这个函数将4个字节的数组转换为一个真实的:

(*声明*)

代码语言:javascript
运行
复制
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

(*执行*)

代码语言:javascript
运行
复制
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中,值在调试中以十进制显示,但在内部,这不应该有任何区别。

票数 2
EN

Stack Overflow用户

发布于 2013-04-19 11:17:05

您的字节顺序可能是错误的,并且您的例程期待相反的痴呆症。尝试FFFF7944而不是4479FFFF,看看您是否得到了预期的9.99993896484375E2。此外,1148846079是00F4884E作为IEEE754 (如果需要更改字节顺序),因此您可能有更多的错误在您的感知。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16085959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档