More string functions

This test case it part of the test suite proposed for new devices.

Test case ID: R0162
Language: ST

Code:
tests2/t0162.st

PROGRAM R0162  
    VAR
        sx1,sx2,sx3,sx4,sx5,sx6,sx7,sx7b: STRING;
        i1,i9 : INT;
    END_VAR
    VAR_EXTERNAL 
        _T_PARAMS : TEST_PARAMS;
    END_VAR
    VAR_TEMP
       sx8: STRING;
    END_VAR
    sx1 := R0162myconcat('HI, ', 'BYE',0,0);
    sx2 := R0162myconcat(s1 := 'HI',s2:='',i1:=0,i2:=0);
    sx3 := R0162myconcat(i1:=1, i2:=-3, s1:='HE', s2 := 'HO');
    sx4 := R0162myconcat(s2 := 'HI', i2:= -9, s1:='' , i1:=0);
    sx7 := R0162myconcat(sx7,'AB',0,0);
    sx7 := R0162myconcat(sx7,'CD',10,10);
    sx7b := CONCAT(sx7b,'AB');
    sx8 := R0162myconcat(sx8,'AB',0,0);
    sx6 := sx8;

IF _T_PARAMS.cycle = _T_PARAMS.timestorun THEN  // last iteration
_GEB_ASSERT_(sx1 = 'HI, BYE');
_GEB_ASSERT_(sx2 = 'HI');
_GEB_ASSERT_(sx3 = 'HOHE');
_GEB_ASSERT_(sx4 = 'HI');
_GEB_ASSERT_(sx6 = 'AB');
_GEB_ASSERT_(sx7 = 'ABCDABCDABCD');
_GEB_ASSERT_(sx7b = 'ABABAB');
END_IF;

END_PROGRAM

// s:= myconcat(s1,s2,i1,i2)
// CONCATENATES TWO STRINGS , the first has a default value.
// if the sum of the two arguments is negative, inverts the order
FUNCTION R0162myconcat : STRING
    VAR_INPUT
        s1 : STRING ;
        s2 : STRING[30] ;
        i1 : INT; 
        i2 :INT; 
    END_VAR
    VAR    // vars not used, just for testing initialization
       s3 :STRING;
       s4 :STRING := 'XX';
       i3 : INT :=3; // not used 
       i4 :INT; 
    END_VAR
    IF(i1+i2<0) THEN
    R0162myconcat := CONCAT(s2,s1);
    ELSE
    R0162myconcat := CONCAT(s1,s2);
    END_IF;
    i3 := R0162F1(40);
END_FUNCTION

FUNCTION R0162F1 : INT
   VAR_INPUT X: INT; END_VAR
   R0162F1 := X+1;
    
END_FUNCTION