恭喜,你发布的帖子
发布于 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
请填写推广理由:
分享
只看
楼主