SCL下填表功能 点击:406 | 回复:0



worker02

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 174回
  • 年度积分:0
  • 历史总积分:8
  • 注册:2014年6月05日
发表于:2017-08-16 13:56:02
楼主

FUNCTION_BLOCK FB1000

Know_How_Protect;

VAR_TEMP

   I,j,ii,NumP,NumPP:INT;

   S                :BOOL;

  END_VAR

VAR_INPUT

    DB_No           :INT;//数据块编号

    DBw_No          :INT;//数据块开始字

    IN_Data         :INT;//要写入数据

    Lenght          :INT;//写入总长度

    Big_On_Off      :BOOL;//是否从大到小排列

    Little_On_Off   :BOOL;//是否从小到大排列

    RegEqual        :BOOL;//是否要踢除相同的数据

END_VAR 

VAR_OUTPUT

    Re_Lenght       :INT;//数据块数据长度

    ScuB            :BOOL;//写入数据是否成功

END_VAR;


     i:=0;

     j:=0;

     ii:=0;

     Nump:=0;

     Numpp:=0;

     //*********************************获取当前数据毕数********************************

      FOR I:=0 TO((Lenght*2)-2) BY 2 DO

            IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN

            NumPP:=NumPP+1;

            ELSE

            EXIT;

            END_IF;

    END_FOR;

    //*********************************将指定数据写入表中********************************  

      IF Lenght>NumPP THEN

           IF  RegEqual THEN // 判定待写入数据是否已填入表中

           FOR I:= 0 TO((Lenght*2)-2) BY 2 DO

           IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+I])=In_Data THEN

           S:=TRUE;

           EXIT;

           ELSE

           S:=FALSE;

          END_IF;

        END_FOR;

    END_IF;

    IF NOT S THEN    

        FOR I:=0 TO((Lenght*2)-2) BY 2 DO

            IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN

                 IF I<((Lenght*2)-2) THEN

                IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I+2])=0 THEN

                     WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I+2]:=INT_TO_WORD(IN_Data);

                     EXIT;

                     END_IF;

                  ELSE

                   WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I]:=INT_TO_WORD(IN_Data);

                

            END_IF;

        ELSE

           WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I]:=INT_TO_WORD(IN_Data);

             IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN

                       EXIT;

                       END_IF;

            END_IF;

        END_FOR;

   END_IF;

     FOR I:=0 TO((Lenght*2)-2) BY 2 DO

            IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN

            NumP:=Nump+1;

        ELSE

            EXIT;

        END_IF;

        END_FOR;

       RE_Lenght:=NumP;

 //**************************************** 表中从小到大排列**************************************************

   IF (NOT Big_On_Off)AND(Little_On_Off)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No])>0)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+2])>0)THEN

       FOR I:= 0 TO (NumP-1) DO 

       FOR J:= 0 to((NumP*2)-2) BY 2 DO

         IF j<((NumP*2)-2) THEN

           IF (WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J])> WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2])) THEN

              II:=WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]);

              WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]:=WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2];

              WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2]:=INT_TO_WORD(II);

            END_IF;

        END_IF;

    

END_FOR;

END_FOR;

END_IF;

 //**************************************** 表中从大到小排列**************************************************


 IF ( Big_On_Off)AND(NOT Little_On_Off)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No])>0)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+2])>0) THEN

    FOR I:= 0 TO (NumP-1) DO 

       FOR J:= 0 to((NumP*2)-2) BY 2 DO

         IF j<((NumP*2)-2) THEN

           IF (WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J])< WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2])) THEN

              II:=WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]);

              WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]:=WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2];

              WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2]:=INT_TO_WORD(II);

           END_IF;

        END_IF;

       END_FOR;

     END_FOR;

 END_IF;

END_IF;

//******************判定当前数据写入是否成功************************ 

 IF Nump> Numpp THEN

    ScuB:=TRUE;

ELSE

    ScuB:=false;

END_IF;


END_FUNCTION_BLOCK




楼主最近还看过


热门招聘
相关主题

官方公众号

智造工程师