回复:获取绝对地址对应符号名的二法

已锁定

'Razor

西门子1847工业学习平台

  • 帖子

    3209
  • 精华

    41
  • 被关注

    222

论坛等级:至圣

注册时间:2008-03-31

钻石 钻石 如何晋级?

发布于 2024-05-13 22:47:33

1楼

------------------------------------------------------------

TYPE "typeBoolConfig"

VERSION : 0.1

   STRUCT

      memory : Char;

      "byte" : DInt;

      bit : Int;

      symbolName : String;

   END_STRUCT;


END_TYPE


FUNCTION_BLOCK "FB_GetSymbolByAddress"

{ S7_Optimized_Access := 'TRUE' }

VERSION : 0.1

   VAR_OUTPUT

      O_str_symbol { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String[32];   // symbol name of address

      O_b_status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;   // status bit

      O_b_error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;   // error bit

      O_w_status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word;   // status word

   END_VAR


   VAR_IN_OUT

      IO_arr_boolCfg : Array[*, *] of "typeBoolConfig";   // configuration of I/O

      IO_dint_byte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt;   // set from HMI/SCADA

      IO_int_bit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;   // set from HMI/SCADA

   END_VAR


   VAR

      statLower { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt;

      statUpper { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt;

   END_VAR


   VAR_TEMP

      tempBoolConfig : "typeBoolConfig";

      tempByteSet : DInt;

      tempBitSet : Int;

      tempSymbolName : String;

      tempBitStatus : Bool;

      tempConfigOkBit : Bool;

      tempStatusWord : Word;

      tempErrorBit : Bool;

   END_VAR


   VAR CONSTANT

      MAX_BYTE : DInt := 10#1024;   // max byte value

      MIN_BYTE : DInt := 10#0;

      MAX_BIT : DInt := 10#7;   // max bit value

      MIN_BIT : DInt := 10#0;

      BYTE_WIDTH : DInt := 10#8;

      NOT_DB : DInt := 10#0;

      INPUT : Byte := 16#81;   // input memory

      OUTPUT : Byte := 16#82;   // output memory

      ZERO_DINT : DInt := 16#0000;

      ZERO_INT : Int := 16#0000;

      ERROR_NO_ERROR : Word := 16#0000;

      ERROR_BYTE_DOWN_OVERFLOW : Word := 16#2522;

      ERROR_BYTE_UP_OVERFLOW : Word := 16#2523;

      ERROR_BIT_DOWN_OVERFLOW : Word := 16#2522;

      ERROR_BIT_UP_OVERFLOW : Word := 16#2523;

      ONE_DIMENSION : UDInt := 16#1;   // read array by one dimension

      INPUT_TYPE : Char := 'I';

      OUT_TYPE : Char := 'Q';

   END_VAR



BEGIN

    REGION Descripation

       

    END_REGION

    REGION Initialization

        #tempByteSet := #IO_dint_byte;

        #tempBitSet := #IO_int_bit;

    END_REGION

    REGION CheckError

         //GetArrayLowerAndUpper

        #statLower := LOWER_BOUND(ARR := #IO_arr_boolCfg, DIM := #ONE_DIMENSION);

        #statUpper := UPPER_BOUND(ARR := #IO_arr_boolCfg, DIM := #ONE_DIMENSION);

        //CheckByte

            IF #tempByteSet < #ZERO_DINT THEN

                #tempStatusWord := #ERROR_BYTE_DOWN_OVERFLOW;

            END_IF;

            IF #tempByteSet > #MAX_BYTE OR #tempByteSet > #statUpper THEN

                #tempStatusWord := #ERROR_BYTE_UP_OVERFLOW;

            END_IF;

        //CheckBit

            IF #tempBitSet < #ZERO_INT THEN

                #tempStatusWord := #ERROR_BIT_DOWN_OVERFLOW;

            END_IF;

            IF #tempBitSet > #MAX_BIT THEN

                #tempStatusWord := #ERROR_BIT_UP_OVERFLOW;

            END_IF;

        // CheckConfig

            #tempConfigOkBit := #tempByteSet >= #statLower

            AND #tempByteSet <= #statUpper

            AND #tempByteSet <= #MAX_BYTE

            AND #tempBitSet >= #ZERO_INT

            AND  #tempBitSet <= #MAX_BIT;

    END_REGION

    REGION Main    

        IF #tempConfigOkBit = TRUE THEN

            #tempStatusWord := #ERROR_NO_ERROR;

            #tempBoolConfig := #IO_arr_boolCfg[#IO_dint_byte, #IO_int_bit];

            #tempSymbolName := #tempBoolConfig.symbolName;

            IF #tempBoolConfig.memory = #INPUT_TYPE THEN

                #tempBitStatus := PEEK_BOOL(area := #INPUT,

                                            dbNumber := #NOT_DB,

                                            byteOffset := #tempBoolConfig."byte",

                                            bitOffset := #tempBoolConfig.bit);

            END_IF;

            IF #tempBoolConfig.memory = #OUT_TYPE THEN

                #tempBitStatus := PEEK_BOOL(area := #OUTPUT,

                                            dbNumber := #NOT_DB,

                                            byteOffset := #tempBoolConfig."byte",

                                            bitOffset := #tempBoolConfig.bit);

            END_IF;

        END_IF;

    END_REGION

    REGION Output

        #O_str_symbol := #tempSymbolName;

        #O_b_status := #tempBitStatus;

        #O_b_error := #tempErrorBit := NOT #tempConfigOkBit;

        #O_w_status := #tempStatusWord;

    END_REGION

   

   

END_FUNCTION_BLOCK


少即是多
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15117条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。