看到dcount107兄在其他人的回帖,用用指针或union实现:
BYTE bytes[4];
float ff;
bytes[0]=0x00;
bytes[1]=0x00;
bytes[2]=0xC8;
bytes[3]=0x42;
ff=*(float*)&bytes[0];
printf("\r\n%f",ff);
--------------------
union aa
{
BYTE bytes[4];
float ff;
}aa;
aa.bytes[0]=0x00;
aa.bytes[1]=0x00;
aa.bytes[2]=0xC8;
aa.bytes[3]=0x42;
printf("\r\n%f",aa.ff);
这两种我直接做到按钮中试过可行,但我如果引用外部的数组变量就不行了,具体是这样的:我用kep的modbus直接读取3个连续的浮点数据400005【3】,直接用kep监测是有数据的,然后添加到wincc中为一个名叫AI的原始数据类型,用GetTagRaw获取处理如下:
union uu
{
BYTE b[12];
float ff[3];
}uu;
int j;
BYTE c[12];//原始变量存放数组
GetTagRaw("AI",c,12);//获取原始浮点数组
for (j=0;j<=2;j++) //前后调换字节
{
uu.b[j*4]=c[j*4+3];
uu.b[j*4+1]=c[j*4+2];
uu.b[j*4+2]=c[j*4+1];
uu.b[j*4+3]=c[j*4];
printf("\r\n%f",uu.ff[0]);
printf("\r\n%f",uu.ff[1]);
printf("\r\n%f",uu.ff[2]);
程序没反应,请各位帮忙看看,哪有问题??
问题补充:
也能出现数字,但完全对不上号;
比如我的400005[3]=[1.11,2,0]那出来的结果为:
771345028601111420000000000000000000.000000
0.000000
0.000000
400005[3]=[0.1,0.2,0]那出来的结果为:
-429492128.000000
-428443584.000000
0.000000
400005[3]的数值比较大的话则全为0,请大家帮忙看看
最佳答案
这倒挺奇怪。
你可以试试这样:
1、Kep单独读取一个浮点数,WinCC直接连接,看看是什么效果,然后用GetTagRaw试试。
2、还有你把c的每个字节打印出来看看到底是怎么回事?
补充------------------
另外KepServer似乎不支持Float寄存器吧?40000x是保持型寄存器。
提问者对于答案的评价:
现在问题解决了,原来在kep中采集到的原始数据付给新的字节后并不需要改变前后顺序,直接用就行了!
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc273170.html