首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PLC编程:转换为相同大小的数据类型,并向后更改实际值

PLC编程:转换为相同大小的数据类型,并向后更改实际值
EN

Stack Overflow用户
提问于 2018-10-12 08:52:41
回答 3查看 690关注 0票数 0

一个函数块给了我一些真实的数据类型。雷亚尔必须转换为DWORD。在使用的平台上,数据类型有以下大小:

  • 实: 32位(4字节)
  • DWORD: 32位(4字节)

因此,我想的是,如果在这两种数据类型之间传输位表示,则值不会更改或松散精度。我想做的是:

代码语言:javascript
运行
复制
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来获得一个真实值,但在这一点上,该值受到了不可取的影响。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-12 11:36:57

有两种选择。最喜欢的是pboedker建议的那种: UNION数据类型。

示例:

代码语言:javascript
运行
复制
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时,如果数据在任何地方都有被修改的可能性,可能会出现一些问题。该值可能是NaNInfinity,这可能会导致PLC崩溃。这意味着真值没有正确地格式化为十进制数。

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

Stack Overflow用户

发布于 2018-10-12 10:14:06

问题是您正在使用转换,所以您的REAL=0.819将被转换为DWORD=1并返回到REAL=1。在每次转换时,位表示都会相应地改变。

解决问题的一个方法是使用UNION (IEC 61131-3).通过这种方式,您可以将DWORD部分写入真实的部分,将DWORD部分传递给其他代码,然后在代码中再次使用真实的部分。

票数 0
EN

Stack Overflow用户

发布于 2018-10-13 04:54:56

一个简单的解决方案是在转换之前将实际值乘以10倍,这取决于您想要的精度如下:

代码语言:javascript
运行
复制
myReal := 0.819;

myDWord := REAL_TO_DWORD(myReal * 1000);
myResultReal := DWORD_TO_REAL(myDWord)/1000;

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

https://stackoverflow.com/questions/52775785

复制
相关文章

相似问题

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