无符号32位数如何确定每个位的状态

现在我需要对32位的无符号数据进行每个位的状态监视,自己做了个全局脚本,如下:

 DWORD exter;    //定义无符号32位数
 exter=GetTagDWord("UDWORD"); 
 SetTagBit("Bool",(exter&0x100));//7st bit
 SetTagBit("Bool_8",(exter&0x1));//0st bit
 以上执行都可以,Bool,Bool_8分别得到32位数据的第7和第0位数据状态;但我使用:
 SetTagBit("Bool_16",(exter&0x1000000));//24st bit
 SetTagBit("Bool_24",(exter&0x10000));//16st bit
 获得32位数据的第24位和第16位的数据时却没任何反应,请高手解释下,或是可以有什么更好的办法??

 

最佳答案

每个人理解的第几位意思都不一样,你试试下面的程序:
 int i;
 DWORD dwValue;
 BOOL bRet;
 dwValue = GetTagDWord("dwTag");
 //printf("\r\n%d",dwValue );
 for (i=0;i<32;i++)
 {
  bRet = (dwValue & (long)pow(2.0,i))== (long)pow(2.0,i);
  printf("\r\n第%d位为:%d",i ,bRet);
 }

提问者对于答案的评价:
问题已解决,不过用了另一种方法:
 DWORD a[32],b,c;  //定义32位数据
 a[0]=0x00000001;a[1]=0x00000002;a[2]=0x00000004;a[3]=0x00000008; 
 a[4]=0x00000010;a[5]=0x00000020;a[6]=0x00000040;a[7]=0x00000080; 
 a[8]=0x00000100;a[9]=0x00000200;a[10]=0x00000400;a[11]=0x00000800; 
 a[12]=0x00001000;a[13]=0x00002000;a[14]=0x00004000;a[15]=0x00008000; 
 a[16]=0x00010000;a[17]=0x00020000;a[18]=0x00040000;a[19]=0x00080000; 
 a[20]=0x00100000;a[21]=0x00200000;a[22]=0x00400000;a[23]=0x00800000; 
 a[24]=0x01000000;a[25]=0x02000000;a[26]=0x04000000;a[27]=0x08000000; 
 a[28]=0x10000000;a[29]=0x20000000;a[30]=0x40000000;a[31]=0x80000000; 

 b=GetTagDWord("Y[0B-3B]_D[2_3]"); 
 c=b&a[0];if(c==a[0]) SetTagBit("Bool",1); else SetTagBit("Bool",0); //0bit
 c=b&a[1];if(c==a[1]) SetTagBit("Bool_1",1); else SetTagBit("Bool_1",0); //1bit
 c=b&a[2];if(c==a[2]) SetTagBit("Bool_2",1); else SetTagBit("Bool_2",0); //2bit
 c=b&a[3];if(c==a[3]) SetTagBit("Bool_3",1); else SetTagBit("Bool_3",0); //3bit
        //。
        //。
        //。
 c=b&a[31];if(c==a[31]) SetTagBit("Bool_31",1); else SetTagBit("Bool_31",0); //31bit

 大家可以看看,虽然多以点,但比较直观!

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc273257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2019年6月11日 上午9:48
下一篇 2019年6月11日 上午9:48

相关推荐

  • 如何得到另一个画面中的控件

    大家好,        我想实现在一个画面中得到另一个画面中的属性,请问该如何实现。 &n…

    2018年3月6日
  • 为何打不开WINCC项目

    打开WICC项目时,为何出现0x8004160a:(null)错误,无法装载文件XXX。该项目原先用该版本是可以打开的  问题补充:没集成也没激活,在其他电脑可打开它,就…

    SIMATIC WinCC 2019年6月11日
  • 历史数据记录存储地址选择

    我现在用的TP900触摸屏,历史数据记录里面保存路径有两种选择,1是SD卡,2是USB,我想在触摸屏外部做一个选择框,0选择不记录,1用SD卡记录,2选择USB,往有大神做过的说一…

    SIMATIC WinCC 2021年7月5日
  • Wincc客户机提示"服务器不可用"

    这是什么问题 问题补充:重新创建了服务器数据包,重新激活了服务器运行系统,客户机能登陆进去,但是客户机退出再登陆就回像图1那样,提示:服务器不可用 图片说明:  &nbs…

    2021年7月5日
  • XPE系统下能否安装wincc6.2?

    我试了一下,首先消息队列不能添加,SQL2005安装过程中会出现2个错误,但是wincc6.2在安装过程中不会有问题,授权以后开始使用,就会出现wincc无法创建项目的问题,提示服…

    SIMATIC WinCC 2017年6月11日
  • 数据记录问题

    大家好,现场一台工控机使用的是WINCC6。2,现场出现故障,WINCC无法运行,现在使用备份画面,如何将原来变量的历史记录在新项目中显示呢? 问题补充:我试了,将数据拷贝过去后,…

    SIMATIC WinCC 2019年6月11日
  • wincc的VB脚本中,数学运算不执行

    在一个按钮的下面写了VB脚本,其中有一条是数学运算,结果点按钮,如下代码不执行:v2=1 + d * (ps) / ((…

    SIMATIC WinCC 2019年6月11日
  • WINCC6,0系统是否可以和BA监控系统在一台电脑上共用?

    以前是2台电脑,一台DDC系统的监控电脑,一台是和PLC配套装有WINCC6.0的电脑,BA监控电脑通过OPC协议访问通信;现在想合并在一台电脑上,可否实现?会不会有数据库冲突?还…

    SIMATIC WinCC 2017年12月1日
  • wincc v13数据记录曲线问题

    wincc v13采集得到实时数据曲线,却不能采集数据记录曲线 问题补充:就是因为是同一个记录变量,所以能显示实时数据曲线,而不能显示采集的数据记录曲线感到郁闷,不知是什…

    2017年6月1日
  • 新装的wincc问题

    我使用windows xp sp1安装的winccv6.0在开始进入系统后创建项目时每次运行到一会就弹出错误提示“0x80004005,未指定的错误”确定后告诉…

    SIMATIC WinCC 2019年6月11日