问题:拆分字节 合并字节 ,BYTE WORD DWORD等数据的位,高低字节转换
回答:

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 );





数据维护:国城 冯
编辑时间:22 Jan 2024

如果此回答有不清楚或错误的地方,请扫描页面底部二维码添加微信公众号与我们联系,我们努力给您满意的答复。