上次我发了一个帖子,Y大侠回复我,谢谢哈。这个FB也是和上一个帖子中是一起用的,用来做电机空载转矩补偿的,他分了20段来写的,第一段1%,第二段5%,以后每段加5%,ABB20000数字量,西门子16384,然后是看速度反馈和转矩反馈,读出的转矩一直在变,作者写了一个滤波加权,然后根据速度所在范围,实际应用时取相应速度段(转速数字量)的对应的补偿。
FUNCTION_BLOCK "Friction_Test"
TITLE =
VERSION : 0.0
VAR_INPUT
Enable : BOOL ;
Speed_In : INT ; //Dimension Value
Torque_In : INT ; //Dimension Value
Clock : BOOL ; //System Clock
END_VAR
VAR_OUTPUT
Run_CMD : BOOL ;
Error : BOOL ;
Speed_Ref : INT ;
Torque_Ref : INT ;
Group1 : ARRAY [0 .. 20 ] OF REAL ;
Group2 : ARRAY [0 .. 20 ] OF REAL ;
Group3 : ARRAY [0 .. 20 ] OF REAL ;
Group4 : ARRAY [0 .. 20 ] OF REAL ;
Group5 : ARRAY [0 .. 20 ] OF REAL ;
END_VAR
VAR
Index1 : INT ;
Index2 : INT ;
Index3 : INT ;
Index4 : INT ;
Index : INT ;
Value1 : ARRAY [1 .. 100 ] OF REAL ;
Value2 : REAL ;
Speed_Dimension : REAL ; //this value depend on driver
Torque_Dimension : REAL ; //this value depend on driver
speed : REAL ;
torque : REAL ;
X01 : BOOL ;
Speed_R : REAL ;
END_VAR
BEGIN
NETWORK
TITLE =SCL network
//compiled by SCL compiler version: SCLCOMP K05.03.07.00_01.02.00.01 release
SET ;
SAVE ;
= L 0.1;
L 2.000000e+004;
T #Speed_Dimension;
L 1.000000e+004;
T #Torque_Dimension;
L #Speed_In;
ITD ;
DTR ;
L #Speed_Dimension;
/R ;
L 1.000000e+002;
*R ;
T #speed;
L #Torque_In;
ITD ;
DTR ;
L #Torque_Dimension;
/R ;
L 1.000000e+002;
*R ;
T #torque;
A #Enable;
JCN A7d0;
SET ;
= #Run_CMD;
L #Torque_Dimension;
RND ;
T #Torque_Ref;
A #X01;
NOT ;
A #Clock;
JCN A7d1;
L #Index2;
L 1;
+I ;
T #Index2;
A7d1: L #Index2;
L 1;
==I ;
= L 0.2;
A #Clock;
NOT ;
A L 0.2;
A #X01;
JCN A7d2;
L 0;
T #Index1;
A7d3: L #Index1;
L 20;
<=I ;
JCN A7d2;
L #Index1;
ITD ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Index1;
ITD ;
TAK ;
T LD 2;
TAK ;
L L#32;
*D ;
TAR2 ;
+D ;
LAR1 ;
L DID [AR1,P#266.0];
LAR1 LD 2;
T DID [AR1,P#350.0];
L #Index1;
ITD ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Index1;
ITD ;
TAK ;
T LD 2;
TAK ;
L L#32;
*D ;
TAR2 ;
+D ;
LAR1 ;
L DID [AR1,P#182.0];
LAR1 LD 2;
T DID [AR1,P#266.0];
L #Index1;
ITD ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Index1;
ITD ;
TAK ;
T LD 2;
TAK ;
L L#32;
*D ;
TAR2 ;
+D ;
LAR1 ;
L DID [AR1,P#98.0];
LAR1 LD 2;
T DID [AR1,P#182.0];
L #Index1;
ITD ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Index1;
ITD ;
TAK ;
T LD 2;
TAK ;
L L#32;
*D ;
TAR2 ;
+D ;
LAR1 ;
L DID [AR1,P#14.0];
LAR1 LD 2;
T DID [AR1,P#98.0];
L #Index1;
L 1;
+I ;
T #Index1;
JU A7d3;
A7d2: L #Index2;
T #Index2;
L 1;
==I ;
JCN A7d5;
L #Index2;
ITD ;
DTR ;
T #Speed_R;
L 1.000000e+002;
/R ;
L #Speed_Dimension;
*R ;
RND ;
T #Speed_Ref;
A7d5: L #Index2;
L 2;
>I ;
L #Index2;
L 5;
= L 0.2;
A L 0.2;
JCN A7d6;
L #speed;
L #Speed_R;
-R ;
ABS ;
L 1.000000e+000;
>R ;
JCN A7d7;
SET ;
= #Error;
JU A7d6;
A7d7: L #torque;
T #Value1[1];
L 1;
T #Index3;
A7d9: L #Index3;
L 99;
<=I ;
JCN A7da;
L #Index3;
L 1;
+I ;
ITD ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Index3;
ITD ;
TAK ;
T LD 2;
TAK ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
LAR1 ;
L DID [AR1,P#444.0];
LAR1 LD 2;
T DID [AR1,P#444.0];
L #Index3;
L 1;
+I ;
T #Index3;
JU A7d9;
A7da: L 0.000000e+000;
T #Value2;
L 1;
T #Index4;
A7db: L #Index4;
L 100;
<=I ;
JCN A7dc;
L #Index4;
ITD ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Value2;
TAK ;
LAR1 ;
TAK ;
L DID [AR1,P#444.0];
+R ;
T #Value2;
L #Index4;
L 1;
+I ;
T #Index4;
JU A7db;
A7dc: L #Value2;
L 1.000000e+002;
/R ;
T #Group1[0];
A7d6: L 0;
T #Index;
A7dd: L #Index;
L 95;
<=I ;
JCN A7de;
L #Index2;
L #Index;
==I ;
JCN A7df;
L #Index2;
ITD ;
DTR ;
T #Speed_R;
L 1.000000e+002;
/R ;
L #Speed_Dimension;
*R ;
RND ;
T #Speed_Ref;
A7df: L #Index;
L 1;
+I ;
L #Index2;
TAK ;
>I ;
L #Index;
L 4;
+I ;
L #Index2;
TAK ;
= L 0.2;
A L 0.2;
JCN A7e0;
L #speed;
L #Speed_R;
-R ;
ABS ;
L 1.000000e+000;
>R ;
JCN A7e1;
SET ;
= #Error;
JU A7e0;
A7e1: L #torque;
T #Value1[1];
L 1;
T #Index3;
A7e3: L #Index3;
L 99;
<=I ;
JCN A7e4;
L #Index3;
L 1;
+I ;
ITD ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Index3;
ITD ;
TAK ;
T LD 2;
TAK ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
LAR1 ;
L DID [AR1,P#444.0];
LAR1 LD 2;
T DID [AR1,P#444.0];
L #Index3;
L 1;
+I ;
T #Index3;
JU A7e3;
A7e4: L 0.000000e+000;
T #Value2;
L 1;
T #Index4;
A7e5: L #Index4;
L 100;
<=I ;
JCN A7e6;
L #Index4;
ITD ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Value2;
TAK ;
LAR1 ;
TAK ;
L DID [AR1,P#444.0];
+R ;
T #Value2;
L #Index4;
L 1;
+I ;
T #Index4;
JU A7e5;
A7e6: L #Index;
L 5;
/I ;
ITD ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Value2;
TAK ;
T LD 2;
TAK ;
L 1.000000e+002;
/R ;
LAR1 LD 2;
T DID [AR1,P#14.0];
A7e0: L #Index;
L 5;
+I ;
T #Index;
JU A7dd;
A7de: L #Index2;
L 100;
==I ;
JCN A7e7;
L #Index2;
ITD ;
DTR ;
T #Speed_R;
L 1.000000e+002;
/R ;
L #Speed_Dimension;
*R ;
RND ;
T #Speed_Ref;
A7e7: L #Index2;
L 102;
>I ;
L #Index2;
L 105;
= L 0.2;
A L 0.2;
JCN A7e8;
L #speed;
L #Speed_R;
-R ;
ABS ;
L 1.000000e+000;
>R ;
JCN A7e9;
SET ;
= #Error;
JU A7e8;
A7e9: L #torque;
T #Value1[1];
L 1;
T #Index3;
A7eb: L #Index3;
L 99;
<=I ;
JCN A7ec;
L #Index3;
L 1;
+I ;
ITD ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Index3;
ITD ;
TAK ;
T LD 2;
TAK ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
LAR1 ;
L DID [AR1,P#444.0];
LAR1 LD 2;
T DID [AR1,P#444.0];
L #Index3;
L 1;
+I ;
T #Index3;
JU A7eb;
A7ec: L 0.000000e+000;
T #Value2;
L 1;
T #Index4;
A7ed: L #Index4;
L 100;
<=I ;
JCN A7ee;
L #Index4;
ITD ;
L L#1;
-D ;
L L#32;
*D ;
TAR2 ;
+D ;
L #Value2;
TAK ;
LAR1 ;
TAK ;
L DID [AR1,P#444.0];
+R ;
T #Value2;
L #Index4;
L 1;
+I ;
T #Index4;
JU A7ed;
A7ee: L #Value2;
L 1.000000e+002;
/R ;
T #Group1[20];
A7e8: L #Index2;
L 105;
>=I ;
JCN A7d0;
CLR ;
= #Run_CMD;
L 0;
T #Speed_Ref;
T #Torque_Ref;
A7d0: CLR ;
A #Enable;
NOT ;
JCN A7f0;
L 0;
T #Index;
T #Index1;
T #Index2;
T #Index3;
T #Index4;
CLR ;
= #Run_CMD;
T #Speed_Ref;
T #Torque_Ref;
A7f0: CLR ;
A #Clock;
= #X01;
A L 0.1;
SAVE ;
BE ;
END_FUNCTION_BLOCK