SetTagDWord("W",0x1000);指令用法

恩,把 你的这些BOOL为分成 2个DWORD 类型的双字
比如
W=DB1.DBD0
A=DB1.DBX0.0
B=DB1.DBX0.1
C=DB1.DBX0.2
然后通过SetTagDWord("W",0x1000);
就是把A=DB1.DBX0.0置1了,
SetTagDWord("W",0x2000);
就是把B=DB1.DBX0.0置1了,
SetTagDWord("W",0xF000);
就是把 DB1.DBX0.0-DB1.DBX0.7 全部置1. 

请问SetTagDWord("W",0x2000);这个指令是只把DB1.DBX0.1置1了还是把DB1.DBX0.0,DB1.DBX0.1这2个都置1了。我目前有40个BOOL型变量,我希望其中一个置1,其余的都为0.这个如何实现。图片有我之前问的问题,请各位大神不吝赐教。

图片说明:

SetTagDWord("W",0x1000);指令用法    SetTagDWord("W",0x1000);指令用法    SetTagDWord("W",0x1000);指令用法   

最佳答案

首先,了解下 SIEMENS DWORD 类型的 BYTE 排列顺序

Byte0                  byte 1                             byte3                     Byte4
        
              WORD 0                                                     WORD1

                                            DWORD 0 

也就是DB1.DBD0 的 WORD 排列书序是 高字 是WORD0,低字是WORD1,
同样 按照字节来分 是BYTE0,BYTE1,BYTE2,BYTE3.BIT 位的排列是从BIT0-BIT7 是从低到高

请问SetTagDWord("W",0x2000);这个指令是只把DB1.DBX0.1置1了还是把DB1.DBX0.0,DB1.DBX0.1这2个都置1了。
不好意思上边,那个问题 我答错了,我原来意思应该是TagDWord("W",0x2000000);
0x2000000 在C语言中就是相当于PLC 中 DW#16#2000000,
                                    dbx0.7...0.0  1.7....1.0  2.7.....2.0   3.7.........3.0
对应 2进制数就是 2#0000,0010,0000,0000,0000,0000,0000,0000 (DB1.DBD0)就是把 DB1.DBX0.1 给置位了。
如果是 SetTagDWord("W",0x2000);
请看楼上答案。

我目前有40个BOOL型变量,我希望其中一个置1,其余的都为0.这个如何实现。
40 个BOOL 类型可以把他排列在2个DWORD 类型数据中DB1.DBD0,和DB1.DBD4中
U也就是使用DB1.DBX0.0-DB1.DBX3.7(32个BOOL位)+DB1.DBX4.0-DB1.DBX4.7(共8个BOOL位)。
对于你问题,需要根据某个变量来 执行置位1个位,和复位所有位,则还需要进一步的运算。
做一个IDENX,值从你的 选项组里得到a,
b对应你PLC 的DB1.DBD0
c 对应你的PLC 里的DB1.DBD4
40个BOOL位分别 为
1......................8   9....................16  17..................24  25..................32   33................40
DBX3.0-DBX3.7  DBX2.0-DBX2.7  DBX1.0-DBX1.7  DBX0.0-DBX0.7  DB4.0-DBX4.7

也就是当a 为0 时 所有位置0,a=1时,仅DBX3.0为1,a=7 时,仅DBX3.7为0.当=33时,仅DBX4.0为1.根据上面的排列的顺序依次类推。


long Value1=0x1,Value2=0x0;
int idenx;
idenx=GetTagWord("a");
if(idenx==0)
{
Value1=0x0;
Value2=0x0;
}
if (idenx<=32&idenx>0) 
{
idenx=idenx-1;
Value1=Value1<<idenx;

Value2=0x0;
}
if (idenx>32)
{
idenx=idenx-33; 
Value2=0x1;
Value2=Value2<<idenx;
Value1=0x0; 
}
SetTagDWord("b",Value1);
SetTagDWord("c",Value2);

提问者对于答案的评价:
谢谢你这么详细的回答!

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

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年11月1日 上午12:45
下一篇 2017年11月1日 上午12:46

相关推荐

  • 画图时wincc 总提示信息

    我在做上位画面时wincc总出现“StgOpenStorage  hr=80030002 There are insufficie…

    SIMATIC WinCC 2019年6月11日
  • WINCC正版软件使用授权

    买了一个正版的WinCC,里面两张光盘(SIMATIC WinCCV7.4 SP1和SIMATIC NET Networking …

    SIMATIC WinCC 2021年7月5日
  • 博途V12组态HMI画面

    在组态画面时,想做一个图形的渐变色处理,请问该怎么操作? 最佳答案 WINCC7。0 以后西门子支持渐变色,也就是你的颜色可以用变量来调节色值,博途V12能不能用我不知道…

    SIMATIC WinCC 2017年6月12日
  • WinCC安装时出现 unknow MSI Error Code:148

    WinCC安装时出现 unknow MSI Error Code:148怎么回事?请大侠指教 最佳答案 目录里面有没有中文和特殊字符?有的话…

    SIMATIC WinCC 2017年6月1日
  • 按开按停按钮

    请问在wincc中按开按停按钮怎样实现,不用C脚本行吗。谢谢 最佳答案 方法很多  1,可以直接使用 全局库—>Operation—&g…

    SIMATIC WinCC 2019年6月11日
  • PLC和WINCC字符串类型对应

    各位前辈:我在PLC里建立了一个STRING[17],占19个字节,都是ASCII码,想把它显示在WINCC上,在WINCC上建立的变量类型是什么呢?文本类型8bit还是文本类型1…

    SIMATIC WinCC 2019年6月11日
  • WINCC项目如何和项目绑定,即WINCC项目只能在一个电脑上运行?

    WINCC项目如何和项目绑定,即WINCC项目只能在一个电脑上运行?拷贝到别的电脑上直接无法启动。 最佳答案 用脚本读本机计算机名,取到名称就好办了,在“我的电脑”属性中可看到本机…

    SIMATIC WinCC 2020年11月1日
  • 触摸屏与plc通讯自动断开

    TP1200触摸屏与CPU1510通过PN/IE连接,通讯一段时间后自动断开,是怎么回事? 钻石用户推荐最佳答案 1.请检查通讯设置和通讯连接。2.检查网线3.IP地址是否有冲突4…

    SIMATIC WinCC 2020年11月1日
  • wincc如何做登陆界面

    wincc怎么做登陆界面,输入用户名和密码后,点击登陆然后转换到主画面。 问题补充:用WINCC自带登录对话框怎么做? 最佳答案 此回答已完善 如果不使用WINCC自带登录对话框方…

    SIMATIC WinCC 2020年11月1日
  • wincc项目的打开

    原先正常,就这几天没有用,打开原先的项目或新建项目都是这个提示。有遇到这种情况的没有? 问题补充:忘记上传图片了 图片说明:    最佳答案 那就是软件出问题了…

    2021年7月5日