回复:博图里有将ASCII码转换成数字或字母的指令?

已锁定

'Razor

西门子1847工业学习平台

  • 帖子

    3253
  • 精华

    42
  • 被关注

    224

论坛等级:至圣

注册时间:2008-03-31

钻石 钻石 如何晋级?

发布于 2024-08-23 17:28:08

4楼

根据2楼帖子的代码进行逆向操作,代码尚可进一步优化,仅供参考。

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

TYPE "typeControl"

VERSION : 0.1

   STRUCT

      "Char" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String[3] := ' ';

   END_STRUCT;


END_TYPE


TYPE "typePrintable"

VERSION : 0.1

   STRUCT

      "Char" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Char := ' ';

   END_STRUCT;


END_TYPE


TYPE "typeAscii"

VERSION : 0.1

   STRUCT

      ControlChar1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[0..31] of "typeControl" := [('NUL'), ('SOH'), ('STH'), ('ETX'), ('EOT'), ('END'), ('ACK'), ('BEL'), ('BS'), ('HT'), ('LF'), ('VT'), ('FF'), ('CR'), ('SO'), ('SI'), ('DLE'), ('DC1'), ('DC2'), ('DC3'), ('DC4'), ('NAK'), ('SYN'), ('ETB'), ('CAN'), ('EM'), ('SUB'), ('ESC'), ('FS'), ('GS'), ('RS'), ('US')];

      PrintableChar { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[32..126] of "typePrintable" := [(' '), ('!'), ('"'), ('#'), ('$$'), ('%'), ('&'), ('$''), ('('), (')'), ('*'), ('+'), (','), ('-'), ('.'), ('/'), ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), (':'), (';'), ('<'), ('='), ('>'), ('?'), ('@'), ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'), ('['), ('\'), (']'), ('^'), ('_'), ('`'), ('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('g'), ('h'), ('i'), ('j'), ('k'), ('l'), ('m'), ('n'), ('o'), ('p'), ('q'), ('r'), ('s'), ('t'), ('u'), ('v'), ('w'), ('r'), ('s'), ('t'), ('{'), ('|'), ('}'), ('~')];

      ControlChar2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[127..127] of "typeControl" := [('DEL')];

   END_STRUCT;


END_TYPE


FUNCTION "AsciiToInt" : Void

{ S7_Optimized_Access := 'TRUE' }

VERSION : 0.1

   VAR_INPUT

      original : String;

      asciiTable : "typeAscii";

   END_VAR


   VAR_OUTPUT

      Error : Word;

      conversion : Int;

   END_VAR


   VAR_TEMP

      tempIndex : DInt;

      tempAsciiTable : "typeAscii";

      tempError : Word;

      tempConversion : DInt;

   END_VAR


   VAR CONSTANT

      ASCII_STRING_IS_ILLEGAL : Word := 16#8F01;

      NO_ERROR : Word := 16#0000;

      MIN_CONTROL : DInt := 16#00000000;   // 0

      US_CONTROL_CHAR : DInt := 16#0000001F;   // 31

      MAX_CONTROL : DInt := 16#0000007F;   // 127

      MIN_PRINTABLE : DInt := 16#00000020;   // 32

      MAX_PRINTABLE : DInt := 16#0000007E;   // 126

      ZERO_DINT : DInt := 16#00000000;   // 0

      MINUS_ONE_DINT : DInt := 16#FFFFFFFF;   // -1

      MINUS_ONE_WORD : Word := 16#FFFF;   // -1

      MINUS_ONE_INT : Int := 16#FFFF;   // -1

      EMPTY_STRING : String := '';

   END_VAR



BEGIN

    REGION BLOCK INFO HEADER

      //===============================================================================

      // Razor / (c)Copyright (2024)

      //-------------------------------------------------------------------------------

      // Title:            AsciiStringToINT

      // Comment/Function: convert ASCII code string to INT

      // Library/Family:   Razorlib

      // Author:           A&D / Razor / 646644315@qq.com

      // Tested with:      test system with FW version

      // Engineering:      TIA Portal (V17 Upd7)

      // Restrictions:     OB types, etc.

      // Requirements:     hardware, technological package, memory needed, etc.

      //-------------------------------------------------------------------------------

      // Change log table:

      // Version  | Date       | Expert in charge       | Changes applied

      //----------|------------|------------------------|------------------------------

      // 01.00.00 | 2024-08-23 | Razor                  | First released version

      //===============================================================================

    END_REGION BLOCK INFO HEADER

   

    REGION DESCRIPTION

    (/*

    this block convert the ASCII code String to INT

    */)

    END_REGION DESCRIPTION

   

    REGION INITIALISATION

      #tempAsciiTable := #asciiTable;

      #tempIndex := #ZERO_DINT;

      #tempError := #NO_ERROR;

      #tempConversion := #ZERO_DINT;

    END_REGION INITIALISATION

   

    REGION PROGRAM LOGIC

      FOR #tempIndex := #MIN_CONTROL TO #US_CONTROL_CHAR DO//search controlChar1

        IF #tempAsciiTable.ControlChar1[#tempIndex]."Char" = #original THEN

          #tempConversion := #tempIndex;

          #tempError := #NO_ERROR;

          EXIT;

          GOTO OUT;

        ELSE

          #tempError := #ASCII_STRING_IS_ILLEGAL;

          #tempConversion := #MINUS_ONE_DINT;

        END_IF;

      END_FOR;

     

      IF #tempConversion >= #ZERO_DINT THEN

        GOTO OUT;

      ELSE//search printableChar

        FOR #tempIndex := #MIN_PRINTABLE TO #MAX_PRINTABLE DO

          IF #tempAsciiTable.PrintableChar[#tempIndex]."Char" = #original THEN

            #tempConversion := #tempIndex;

            #tempError := #NO_ERROR;

            EXIT;

          ELSE

            #tempError := #ASCII_STRING_IS_ILLEGAL;

            #tempConversion := #MINUS_ONE_DINT;

          END_IF;

        END_FOR;

        IF #tempConversion >= #ZERO_DINT THEN

          GOTO OUT;

        ELSE//search controlChar2

          FOR #tempIndex := #MAX_CONTROL TO #MAX_CONTROL DO

            IF #tempAsciiTable.ControlChar2[#tempIndex]."Char" = #original THEN

              #tempConversion := #tempIndex;

              #tempError := #NO_ERROR;

              EXIT;

              GOTO OUT;

            ELSE

              #tempError := #ASCII_STRING_IS_ILLEGAL;

              #tempConversion := #MINUS_ONE_DINT;

            END_IF;

          END_FOR;

        END_IF;

      END_IF;

    END_REGION

   

    REGION OUTPUTS

    OUT:

      #Error := #tempError;

      #conversion := DINT_TO_INT(#tempConversion);

    END_REGION

   

   

END_FUNCTION




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

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10698条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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