恩,把你的这些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.这个如何实现。图片有我之前问的问题,请各位大神不吝赐教。
图片说明:
90c004BFd92a2c08389f5a1f9200bbb7 bFC2998036817a28e66a90e60f4bc2e8
最佳答案
首先,了解下SIEMENSDWORD类型的BYTE排列顺序
Byte0byte1byte3Byte4
WORD0WORD1
DWORD0
也就是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.01.7….1.02.7…..2.03.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………………….89………………..1617………………2425………………3233…………….40
DBX3.0-DBX3.7DBX2.0-DBX2.7DBX1.0-DBX1.7DBX0.0-DBX0.7DB4.0-DBX4.7
也就是当a为0时所有位置0,a=1时,仅DBX3.0为1,a=7时,仅DBX3.7为0.当=33时,仅DBX4.0为1.根据上面的排列的顺序依次类推。
longVaLUe1=0x1,Value2=0x0;
intidenx;
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);
提问者对于答案的评价:
谢谢你这么详细的回答!