Âåðñèÿ äëÿ ïå÷àòè

PCS7: Matrix operations (part 4) final

Äàòà: 2020-04-17

Äîáàâëåíî: komatic

Òåìà: SCL



flow



Source of block from PCS 7 AP Library V90sp2,

used in Kalman filter:
MxInv FC 468 Returns an inverse of a matrix (used internally)





One interesting point: size of this function much more then others in family. Reason of this - is one string in source:

StcMxAI:=StcMxA;

This construction copy values two dimensional [1..15,1..15] array of REAL from one array to another.
But, for copy EACH element array, in this case, SCL compiler generate huge code:

L P##StcMxA;
LAR1 ;
L W [AR1,P#0.0];
T LW 8;
OPN DB [LW 8];
L D [AR1,P#2.0];
LAR1 ;
L D [AR1,P#4.0];
L P##StcMxAI;
LAR1 ;
TAK ;
L W [AR1,P#0.0];
T LW 8;
TAK ;
OPN DB [LW 8];
L D [AR1,P#2.0];
LAR1 ;
TAK ;
T D [AR1,P#4.0];

Size generated code aproximately 14 Kb !!!! and this is only for array with total size 15x15x4=900 byte.

So, best way for optimization in case moving values from one array to another, use FOR construction like:

   FOR pk:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
        FOR spalteA:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
                StcMxAI_aux.elemente[pk,spalteA]:=StcMxA_aux.elemente[pk,spalteA];
        END_FOR;
    END_FOR;
   

Size generated code, with using FOR - 340 bytes, not depends array size .


There is only one reason to use a non-optimized design - payment by the customer depending of the code size )





Name: FC468
Symbolic Name: MxInv
Symbol Comment: MxInv
Family: System
Version: 5.0
Author: AdvLib90
Last modified: 10/10/2016
Use: UDT44,UDT47
Size in work memory: 16484 bytes
Signature: generiert vom SCL Übersetzer Version: SCLCOMP K05.03.08.03_04.01.00.01 release





{
Scl_ResetOptions ;
Scl_OverwriteBlocks:=           'y' ;
Scl_GenerateReferenceData :=    'y' ;
Scl_S7ServerActive:=            'n' ;
Scl_CreateObjectCode:=          'y' ;
Scl_OptimizeObjectCode:=        'y' ;
Scl_MonitorArrayLimits:=        'n' ;
Scl_CreateDebugInfo :=          'n' ;
Scl_SetOKFlag:=                 'n' ;
Scl_SetMaximumStringLength:=    '254'
}
 
//==========================================================================
 
TYPE "Matrix15"
// Description:
//      UDT for matrix operations
//      max. dimension of all Matrix-Functions Mx... is defined here, default 15x15
//
 
 
  STRUCT    
   zeilenzahl : INT ;   
   spaltenzahl : INT ;   
   elemente : ARRAY  [1 .. 15, 1 .. 15 ] OF REAL ;   
  END_STRUCT ;   
END_TYPE
 
//==========================================================================
 
TYPE "StcMatrix15"
// Description:
//      UDT for matrix operations
//      max. dimension of all Matrix-Functions Mx... is defined here, default 15x15
//
 
 
  STRUCT    
   zeilenzahl : INT ;   
   spaltenzahl : INT ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem11 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem12 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem13 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem14 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem15 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem16 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem17 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem18 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem19 : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem1A : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem1B : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem1C : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem1D : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem1E : REAL ;    //elemente: ARRAY[1..15,1..15] OF REAL;
   elem1F : REAL ;   
   elem21 : REAL ;   
   elem22 : REAL ;   
   elem23 : REAL ;   
   elem24 : REAL ;   
   elem25 : REAL ;   
   elem26 : REAL ;   
   elem27 : REAL ;   
   elem28 : REAL ;   
   elem29 : REAL ;   
   elem2A : REAL ;   
   elem2B : REAL ;   
   elem2C : REAL ;   
   elem2D : REAL ;   
   elem2E : REAL ;   
   elem2F : REAL ;   
   elem31 : REAL ;   
   elem32 : REAL ;   
   elem33 : REAL ;   
   elem34 : REAL ;   
   elem35 : REAL ;   
   elem36 : REAL ;   
   elem37 : REAL ;   
   elem38 : REAL ;   
   elem39 : REAL ;   
   elem3A : REAL ;   
   elem3B : REAL ;   
   elem3C : REAL ;   
   elem3D : REAL ;   
   elem3E : REAL ;   
   elem3F : REAL ;   
   elem41 : REAL ;   
   elem42 : REAL ;   
   elem43 : REAL ;   
   elem44 : REAL ;   
   elem45 : REAL ;   
   elem46 : REAL ;   
   elem47 : REAL ;   
   elem48 : REAL ;   
   elem49 : REAL ;   
   elem4A : REAL ;   
   elem4B : REAL ;   
   elem4C : REAL ;   
   elem4D : REAL ;   
   elem4E : REAL ;   
   elem4F : REAL ;   
   elem51 : REAL ;   
   elem52 : REAL ;   
   elem53 : REAL ;   
   elem54 : REAL ;   
   elem55 : REAL ;   
   elem56 : REAL ;   
   elem57 : REAL ;   
   elem58 : REAL ;   
   elem59 : REAL ;   
   elem5A : REAL ;   
   elem5B : REAL ;   
   elem5C : REAL ;   
   elem5D : REAL ;   
   elem5E : REAL ;   
   elem5F : REAL ;   
   elem61 : REAL ;   
   elem62 : REAL ;   
   elem63 : REAL ;   
   elem64 : REAL ;   
   elem65 : REAL ;   
   elem66 : REAL ;   
   elem67 : REAL ;   
   elem68 : REAL ;   
   elem69 : REAL ;   
   elem6A : REAL ;   
   elem6B : REAL ;   
   elem6C : REAL ;   
   elem6D : REAL ;   
   elem6E : REAL ;   
   elem6F : REAL ;   
   elem71 : REAL ;   
   elem72 : REAL ;   
   elem73 : REAL ;   
   elem74 : REAL ;   
   elem75 : REAL ;   
   elem76 : REAL ;   
   elem77 : REAL ;   
   elem78 : REAL ;   
   elem79 : REAL ;   
   elem7A : REAL ;   
   elem7B : REAL ;   
   elem7C : REAL ;   
   elem7D : REAL ;   
   elem7E : REAL ;   
   elem7F : REAL ;   
   elem81 : REAL ;   
   elem82 : REAL ;   
   elem83 : REAL ;   
   elem84 : REAL ;   
   elem85 : REAL ;   
   elem86 : REAL ;   
   elem87 : REAL ;   
   elem88 : REAL ;   
   elem89 : REAL ;   
   elem8A : REAL ;   
   elem8B : REAL ;   
   elem8C : REAL ;   
   elem8D : REAL ;   
   elem8E : REAL ;   
   elem8F : REAL ;   
   elem91 : REAL ;   
   elem92 : REAL ;   
   elem93 : REAL ;   
   elem94 : REAL ;   
   elem95 : REAL ;   
   elem96 : REAL ;   
   elem97 : REAL ;   
   elem98 : REAL ;   
   elem99 : REAL ;   
   elem9A : REAL ;   
   elem9B : REAL ;   
   elem9C : REAL ;   
   elem9D : REAL ;   
   elem9E : REAL ;   
   elem9F : REAL ;   
   elemA1 : REAL ;   
   elemA2 : REAL ;   
   elemA3 : REAL ;   
   elemA4 : REAL ;   
   elemA5 : REAL ;   
   elemA6 : REAL ;   
   elemA7 : REAL ;   
   elemA8 : REAL ;   
   elemA9 : REAL ;   
   elemAA : REAL ;   
   elemAB : REAL ;   
   elemAC : REAL ;   
   elemAD : REAL ;   
   elemAE : REAL ;   
   elemAF : REAL ;   
   elemB1 : REAL ;   
   elemB2 : REAL ;   
   elemB3 : REAL ;   
   elemB4 : REAL ;   
   elemB5 : REAL ;   
   elemB6 : REAL ;   
   elemB7 : REAL ;   
   elemB8 : REAL ;   
   elemB9 : REAL ;   
   elemBA : REAL ;   
   elemBB : REAL ;   
   elemBC : REAL ;   
   elemBD : REAL ;   
   elemBE : REAL ;   
   elemBF : REAL ;   
   elemC1 : REAL ;   
   elemC2 : REAL ;   
   elemC3 : REAL ;   
   elemC4 : REAL ;   
   elemC5 : REAL ;   
   elemC6 : REAL ;   
   elemC7 : REAL ;   
   elemC8 : REAL ;   
   elemC9 : REAL ;   
   elemCA : REAL ;   
   elemCB : REAL ;   
   elemCC : REAL ;   
   elemCD : REAL ;   
   elemCE : REAL ;   
   elemCF : REAL ;   
   elemD1 : REAL ;   
   elemD2 : REAL ;   
   elemD3 : REAL ;   
   elemD4 : REAL ;   
   elemD5 : REAL ;   
   elemD6 : REAL ;   
   elemD7 : REAL ;   
   elemD8 : REAL ;   
   elemD9 : REAL ;   
   elemDA : REAL ;   
   elemDB : REAL ;   
   elemDC : REAL ;   
   elemDD : REAL ;   
   elemDE : REAL ;   
   elemDF : REAL ;   
   elemE1 : REAL ;   
   elemE2 : REAL ;   
   elemE3 : REAL ;   
   elemE4 : REAL ;   
   elemE5 : REAL ;   
   elemE6 : REAL ;   
   elemE7 : REAL ;   
   elemE8 : REAL ;   
   elemE9 : REAL ;   
   elemEA : REAL ;   
   elemEB : REAL ;   
   elemEC : REAL ;   
   elemED : REAL ;   
   elemEE : REAL ;   
   elemEF : REAL ;   
   elemF1 : REAL ;   
   elemF2 : REAL ;   
   elemF3 : REAL ;   
   elemF4 : REAL ;   
   elemF5 : REAL ;   
   elemF6 : REAL ;   
   elemF7 : REAL ;   
   elemF8 : REAL ;   
   elemF9 : REAL ;   
   elemFA : REAL ;   
   elemFB : REAL ;   
   elemFC : REAL ;   
   elemFD : REAL ;   
   elemFE : REAL ;   
   elemFF : REAL ;   
  END_STRUCT ;   
END_TYPE
 
//==========================================================================

FUNCTION FC1468 : VOID //"MxInv" : VOID
TITLE =''
AUTHOR : AdvLib90
FAMILY : System
NAME : MxInv
VERSION : '5.0'
 
 
VAR_INPUT
  StcMxA : "StcMatrix15";    
  StcMxA_aux AT StcMxA : "Matrix15";
END_VAR
VAR_OUTPUT
  StcMxAI : "StcMatrix15";    
  StcMxAI_aux AT StcMxAI : "Matrix15";
END_VAR
VAR_TEMP
  pk : INT ;    //Laufindizes
  zeileA : INT ;    //Laufindizes
  spalteA : INT ;    //Laufindizes
  Error : BOOL ;   
END_VAR
BEGIN
 
Error:=FALSE;
 
IF (StcMxA.zeilenzahl = StcMxA.spaltenzahl) THEN
 
    StcMxAI:=StcMxA;
 
    FOR pk:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
        IF StcMxAI_aux.elemente[pk,pk]=0.0 THEN
            StcMxAI_aux.elemente[pk,pk]:=0.0;
            Error:=TRUE;
        ELSE
            StcMxAI_aux.elemente[pk,pk]:=-1.0/StcMxAI_aux.elemente[pk,pk];
        END_IF;
       
        FOR zeileA:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
            IF zeileA<>pk THEN
                StcMxAI_aux.elemente[zeileA,pk]:=StcMxAI_aux.elemente[zeileA,pk]*StcMxAI_aux.elemente[pk,pk];
            END_IF;   
        END_FOR;
       
        FOR zeileA:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
            IF zeileA<>pk THEN
                FOR spalteA:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
                    IF spalteA<>pk THEN
                        StcMxAI_aux.elemente[zeileA,spalteA]:=
                            StcMxAI_aux.elemente[zeileA,spalteA]+
                            (StcMxAI_aux.elemente[zeileA,pk]*StcMxAI_aux.elemente[pk,spalteA]);
                    END_IF;
                END_FOR;   
            END_IF;   
        END_FOR;
       
        FOR spalteA:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
            IF spalteA<>pk THEN
                StcMxAI_aux.elemente[pk,spalteA]:=StcMxAI_aux.elemente[pk,spalteA]*StcMxAI_aux.elemente[pk,pk];
            END_IF;   
        END_FOR;
    END_FOR;
   
    FOR zeileA:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
        FOR spalteA:=1 TO StcMxAI_aux.zeilenzahl BY 1 DO
            IF StcMxAI_aux.elemente[zeileA,spalteA]=0.0 THEN
                StcMxAI_aux.elemente[zeileA,spalteA]:=0.0;
            ELSE
                StcMxAI_aux.elemente[zeileA,spalteA]:=-StcMxAI_aux.elemente[zeileA,spalteA];
            END_IF;
        END_FOR;
    END_FOR;
   
END_IF;
 
IF (StcMxA.zeilenzahl <> StcMxA.spaltenzahl) OR Error THEN
    StcMxAI.zeilenzahl:=0;
    StcMxAI.spaltenzahl:=0;
END_IF;
 
END_FUNCTION
 
//==========================================================================





flow

Block checksum equals.







Original library PCS7 APL (V9.0sp2) (zip, 4.6Mb)

Documentation (pdf, 22Mb)







Ïðîñìîòðîâ: 780

Êîììåíòàðèè ê ìàòåðèàëó

Âàø áóäåò ïåðâûì.

Äîáàâèòü êîììåíòàðèé

Âàøå èìÿ:

Òåêñò êîììåíòàðèÿ (4000 max):

Ââåäèòå ñóììó ñ êàðòèíêè: