专业的编程技术博客社区

网站首页 > 博客文章 正文

wincc怎么转换浮点数(互换)类型的数据

baijin 2025-03-18 10:03:39 博客文章 11 ℃ 0 评论

wincc怎么转换浮点数(互换)类型的数据

现场设备用485线接入MOXA MB3480网关,然后用网线接入交换机,在wincc中建立modbus TCP/IP连接,用这样的方式来读取现场设备数据。有一台设备通过MODSCAN32仿真软件可以读取到数据,但是要选择浮点数(互换)的方式,wincc中不能直接读取浮点数(互换),只能读32-浮点数,请问怎么才能把读到的浮点数转化为浮点数(互换)呢?用脚本或者别的方法都可以,请给出准确指导,谢谢。

图片说明:



最佳答案

如果WINCC中32-位浮点数 IEEE 754读取的数据不正确,说明设备的数据存储格式与WINCC不兼容
从截图看,高低字、高低字节都需要交换,及收到的内存数据为ABCD需要调整为DCBA
这个需要用脚本来处理
如添加WINCC MODBUS TCP变量tag1“无符号的 32 位值”读取设备数据,内部变量tag2“32-位浮点数 IEEE 754”用来保存处理后的值
示例C脚本:

DWORD A=0;
float B=0;

A=GetTagDWord("Tag1");

((BYTE*)&B)[0]= ((BYTE*)&A)[3];
((BYTE*)&B)[1]= ((BYTE*)&A)[2];
((BYTE*)&B)[2]= ((BYTE*)&A)[1];
((BYTE*)&B)[3]= ((BYTE*)&A)[0];

SetTagFloat("Tag2",B);

提问者对于答案的评价:
谢谢大佬,成功解决。参考MODSCAN以及16进制转浮点数在线
转换工具,确定需要把ABCD改为CDAB,对应修改为0-2,1-3,2-0,3-1。多谢指点。

楼主亲自测试了一个无符号16位字的高低字节转换

更改一下C脚本 如下:

WORD A=0;
WORD B=0;

A=GetTagWord("Tag1");
//【tag1是你链接你实际的变量】

((BYTE*)&B)[0]= ((BYTE*)&A)[1];
((BYTE*)&B)[1]= ((BYTE*)&A)[0];

SetTagWord("Tag2",B);
//【tag2是你链接你实际的变量】

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表