实现工作:将WinCC中32位无符号数通过C脚本转换为32位浮点数
步骤如下:
1.建立变量“z32”,数据类型为无符号32位值,地址为modbus寄存器地址:3x400001。485通讯设备直接用wincc读取其数据,中间需要加大连德嘉ModbusTCP/ModbusRTU转换器,该转换器是将ModbusRTU协议转换为ModbusTCP协议,从而通过以太网方式和上位机WinCC通讯。
2.建立内部变量“b_float”,数据类型为32位浮点数IEEE 754。
3.然后建立测试画面,添加一个IO域,然后启用C动作,编写如下例程。
如图片看不清,可以直接看下面语句:
#include "apdefap.h"
double _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
float b_float;
BYTE *c_str;
BYTE buf[4];
DWORD z;
z=GetTagDWord("z32"); //Return-Type: DWORD
buf[3]=(z>>24)&0x000000FF;/*0x43;*/
buf[2]=(z>>16)&0x000000FF;/*0x71;*/
buf[1]=(z>>8)&0x000000FF;/*0x08;*/
buf[0]=(z>>0)&0x000000FF;/*0x40;*/
c_str=(BYTE*)&b_float;
*c_str=buf[2];c_str++;
*c_str=buf[3];c_str++;
*c_str=buf[0];c_str++;
*c_str=buf[1];
return b_float;
}
4.最后运行wincc监控画面如下:
这里通过Modbus Poll调试软件测试,将数据类型显示为Float CD AB格式。
注:可能有的设备定义32位数时,数据类型为AB CD,这样得话就将重新组合一下,如下。因为这个具体要看设备厂家是怎么定义的数据处理方式,有的是高字节在前,有的是低字节在前。
#include "apdefap.h"
double _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
float b_float;
BYTE *c_str;
BYTE buf[4];
DWORD z;
z=GetTagDWord("z32"); //Return-Type: DWORD
buf[3]=(z>>24)&0x000000FF;/*0x43;*/
buf[2]=(z>>16)&0x000000FF;/*0x71;*/
buf[1]=(z>>8)&0x000000FF;/*0x08;*/
buf[0]=(z>>0)&0x000000FF;/*0x40;*/
c_str=(BYTE*)&b_float;
*c_str=buf[3];c_str++;
*c_str=buf[2];c_str++;
*c_str=buf[1];c_str++;
*c_str=buf[0];
return b_float;
}