发布于 2012-01-31 14:13:17
104楼
任意位数的循环右移N位
FUNCTION_BLOCK FB120
VAR_INPUT
Plus: BOOL;移位脉冲
length: INT;所需要移动位数
M_Num: INT;循环移位的长度
END_VAR
VAR_IN_OUT
S_Pointer: ANY;移位的起始地址
END_VAR
VAR_OUTPUT
END_VAR
VAR_TEMP
Buffer1: anypoint;
S_Temp AT Buffer1: ANY;
BitNr1: INT;
ByteNr1: INT;
Offset: INT;
T_Byte: INT;
T_Bit: INT;
i: INT;
j: INT;
Temp: BOOL;
END_VAR
VAR
T_Plus: BOOL;
L_Plus: BOOL;
END_VAR
LABEL
lab3;
END_LABEL
S_Temp := S_Pointer;
BitNr1:=WORD_TO_INT(DWORD_TO_WORD(Buffer1.BytePointer AND DW#16#7));
ByteNr1:=WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SHL(IN:=Buffer1.BytePointer, N:=8), N:=11)));
T_Plus := Plus AND NOT L_Plus;
L_Plus := Plus;
IF T_Plus = true THEN
FOR j:=0 TO M_Num-1 BY 1 DO
Offset := WORD_TO_INT(DWORD_TO_WORD(Buffer1.BytePointer AND DW#16#00FF_FFFF));
T_Byte := (length - 1 + Offset)/8;
T_Bit := length - 1 + Offset - (T_Byte * 8);
Temp := WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit];
FOR i:=0 TO length - 1 BY 1 DO
IF T_Bit < 1 THEN
T_Bit:=7;
T_Byte:=T_Byte - 1;
WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte+1,0] := WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit];
GOTO lab3;
END_IF;
WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit] := WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit-1];
T_Bit := T_Bit - 1;
lab3:;
END_FOR;
WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[ByteNr1,BitNr1] := Temp;
END_FOR;
END_IF;
END_FUNCTION_BLOCK