1、最普通办法每一位点出来,然后再拼出一个数据。
比如:
bool1:=word1.0;bool2:=word1.1;
如果是twincat3软件可以使用共用体进行拆分:
步骤1使用bit类型建议第一个8个bool量的结构体,
TYPE DUT_1 :
STRUCT
b1:BIT; b2:BIT; b3:BIT; b4:BIT; b5:BIT; b6:BIT;b7:BIT; b8:BIT;
END_STRUCT
END_TYPE
步骤2使用共同体创建与byte共用的数据类型
TYPE DUT :
UNION
boolarry:dut_1;
byte1:BYTE;
END_UNION
END_TYPE
使用方法声明dut类型的变量,对变量下的boolarry的每一个位可以单独操作,结果会反映到DUT.byte1上
2、计算方式:
PROGRAM MAIN
VAR
iDATA: WORD;
bLobyte: BYTE;
bHibyte: BYTE;
END_VAR
bHibyte:=WORD_TO_BYTE(iDATA/255);
bLobyte:=WORD_TO_BYTE(iDATA);
或者
(*PROGRAM MAIN
VAR
iDATA: WORD;
R_iDATA:WORD;
bLobyte: BYTE;
bHibyte: BYTE;
END_VAR
R_iDATA :=SHR(iDATA ,8) ;
bHibyte:=WORD_TO_BYTE(R_iDATA);
bLobyte:=WORD_TO_BYTE(iDATA );
*)
合并的方法:iDATA:=bLobyte*256+bHibyte;
3、地址方式。可以用共用体或者memcpy指令,比如将DWORD与一个WORD数组共用一块内存区域。然后两个WORD就能把DWORD拆分了。
比如:
①(*声明一个共用体,然后实例化一下即可*)
TYPE DUT :
UNION
word1:WORD;
bytearr:ARRAY [0..1] OF BYTE; //bytearr[0]就是word1的低8位,[1]是高八位
END_UNION
END_TYPE
或者
②(*用memcpy函数*)
VAR
word1:WORD;
bytearr:ARRAY [0..1] OF BYTE;
END_VAR
MEMCPY(adr(bytearr),adr(word1),sizeof(word1));
4、4022版本以上的twincat3可以使用CAA memory库中的unpack类的function,可以直接将其拆分。也可以调用CAA memory库:PackbytesToWord(合并)、simple type(拆分)
例如:
bHibyte2:=MEM.HighByte(wValue:=iDATA );
bLobyte2:=MEM.lowByte(wValue:=iDATA );