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

相关推荐

  • wincc7.3的全局动作里,如何添加.h头文件

    我全局动作c脚本在程序里加入头文件,头文件放在Library文件夹里了,程序编译没有问题,但是我点保存后,再次打开那个全局动作脚本,之前放上去的头文件自动就没了 最佳答案 可以将这…

    SIMATIC WinCC 2021年7月5日
  • smart line 700 ie v3配方视图

    用smart line 700  ie v3设了一个简单配方就下载不了,不做配方就可 以,不知什么原因 问题补充:你好!…

    2021年7月5日
  • 许可证重复,变量超出

    检测到多个具有相同名称的许可证,存在1951个变量,限制是128个。 钻石用户推荐最佳答案 WinCC授权点数如何计算http://www.ad.siemens.com.cn/pr…

    SIMATIC WinCC 2021年7月5日
  • tp170a触摸屏显示####

    主站是315-2dp,下面有2个im153,5个abb变频器,还有一个tp170a,都走dp网络,现在问题是一切正常,但屏开机一会(大概10秒左右)会全部显示数值为####,我也怀…

    SIMATIC WinCC 2017年12月2日
  • wincc如何做出试用期提示及输入密码界面?

    我想在WINCC项目中做一个软件试用期弹出窗口提示,用户输入正确的密码后才可以正常继续使用,但我又不会用VBS脚本,哪位高手可以帮帮我吗?谢谢了。 问题补充:谢谢CHEN11120…

    SIMATIC WinCC 2019年6月11日
  • 400H PLC与PC之间冗余必须用CP1623吗?

    PLC一套400H,PC:一台 服务器(一台服务器,服务器不冗余);有帖子说采用高版本net就可以不使用CP1623了,直接用普通网卡就可以实现,是这样的吗? 最佳答案 …

    SIMATIC WinCC 2017年6月24日
  • wincc怎么转换浮点数(互换)类型的数据

    现场设备用485线接入MOXA MB3480网关,然后用网线接入交换机,在wincc中建立modbus TCP/IP连接,用这样的方式来读取现场设备数据。有一台…

    2021年7月5日
  • 在线趋势控件

    在线趋势控件上显示的实时曲线,我想鼠标放到某个点上能自动显示归档的数值,不知道这个控件有没有这个功能,如果有,怎么设置啊 最佳答案 WINCC 中很重要的一个功能就是历史…

    2018年3月6日
  • 模拟量报警的上下限值

    希望在WinCC中组态实现操作员自定义模拟量报警的上下限值,不知道该如何设计?请大家指教! 最佳答案 在模拟量报警组态时,上下限处用内部变量,而不要用数值。 然后在画面中…

    SIMATIC WinCC 2019年6月11日
  • K-TP178触摸屏编程电缆

    我有一根S7200使的6ES7901-3DB30-OXAO能下载K-TP178触摸屏吗 最佳答案 USB接口的PC/PPI电缆可以用于K-TP178的下载,但要E-Stand05及…

    SIMATIC WinCC 2019年6月11日