恩,把 你的这些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.这个如何实现。图片有我之前问的问题,请各位大神不吝赐教。
图片说明:
最佳答案
首先,了解下 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