首页 > 行业资讯 > C 脚本如何处理不兼容的数据

C 脚本如何处理不兼容的数据

时间:2023-10-09 来源: 浏览:

C 脚本如何处理不兼容的数据

自控技术FAQ
自控技术FAQ

scadafaq

个人公众号『ScadaFAQ』,作者:RobinLiu,分享自控scada技术相关内容(在公众号底部菜单查看更多精彩内容)。

收录于合集

以下文章来源于WINCC脚本专栏 ,作者robinliu

WINCC脚本专栏 .

本公众号分享WINCC ANSI-C VBScript JavaScript VBA 脚本相关内容

主要内容:
1、指针
2、交换浮点数高低字
有人遇到了一个问题: wincc使用modbus tcp访问的设备,其32位浮点数数据不符合标准与wincc不兼容,需要交换其高低字,问如何实现。
本文 介绍一种借助变量的指针来解决的方法。 下面先来复习一下C语言的指针。

1

  指针

如下,定义了一个指向整型变量的指针变量 point1

int *point1;

左端的 int 是在定义指针变量时必须指定的“基类型”。此基类型用来指定指针变量可以指向的变量类型。就是说上面定义的指针 point1,可以用来指向整型的变量,但不能指向其他类型如浮点类型变量。

int *point1; float  a; point1 = &a;   //将float型变量的地址放到指向整型变量的指针变量中,错误。

众所周知,C语言中不同类型的数据在内存中所占用的字节是不相同的。 “基类型”会影响指针的移动和指针的运算(加、减)。

例如: point1+1(“使指针移动一个位置”或“使指针值加1”),其所代表的实际地址是point1+1*4,4是一个int类型所占的字节数。

下面是两个与指针变量相关的运算符:

〔1〕 & :取地址运算符。

〔2〕 * :指针运算符(或称“间接访问运算符”),取其指向的内容。

例如,&a为变量a的地址,*p为指针变量p所指向的存储单元的内容(即p所指向的变量的值)。

2

  交换浮点数高低字

借助共用体把16进制值0x70A43F9D写入浮点数a的存储区。

float a,b; unsigned int hexValue = 0x70A43F9D ; // 使用联合将uint32_t转换为float union { unsigned int i; float f; } converter; converter.i = hexValue; a = converter.f;
0x70A43F9D是浮点数1.23高低字调换后的值,以表示来自设备的不兼容的值。

如下: 借助指针交换a高低字后的结果存入b

*(( unsigned   short *)&b) = *(( unsigned   short *)&a+ 1 ); *(( unsigned   short *)&b+ 1 ) = *(( unsigned   short *)&a);

说明: 先使 用 &a 获得变量的地址(如为0x00A00001,起的4个字节,因为x86为小端存取,所以a的低字值0x3F9D存储在变量起始地址的低地址0x00A00001~0x00A00002,高字值0x70A4存储在0x00A00003~0x00A00004)。

因为a为浮点数,所以存储单元指针变量基类型必为浮点型(长度4个字节),要想获得a的高字值的地址,需要先把&a使用 unsigned short* 强制转换为基类型为短整型 (长 2个字节 的指针,然后使用 ( unsigned   short *)&a+ 1 移动指针到下一个位置(指针移动2个字节,到0x00A00003)。然后使用 * 获得短整型的指针中的值,赋值给b的低字变量。然后再把a的低字值赋值给b的高字变量中,完成a的高低字的交换。
〔正文结束〕

关注公众号回复“加群”按规则加入『 WINCC脚本 』技术交流群。关注后在公众号菜单项可查看更多内容。
如果你有与本文相关问题可以后台发消息,欢迎 点赞、分享、关注

版权:如无特殊注明,文章转载自网络,侵权请联系cnmhg168#163.com删除!文件均为网友上传,仅供研究和学习使用,务必24小时内删除。
相关推荐