目标是希望Simulink模型不自动执行,而是被PLC条件调用,在Simulink模型中打开Model Configuration,将CallBy设置为Module;找到PLC Function Block,设置成Module specific FB with properties for all parameters,这样就会在模块生成的时候自动创建PLC调用此模块的功能块,点击apply;
VAR fb_test : FB_SingleLegTorqueCalcu(OID:=16#01010010); input:BOOL:=TRUE; //条件调用PLC,input为真使能模型 (****** System command ******) EnableJointFlag : ARRAY[1..6] OF BOOL:=[1,1,1,1,1,1]; //输入标志,指示是否使能电机 System_Enable : BOOL; //6个电机作为1个整体的使能标志 enable_succeed: ARRAY[1..6] OF BOOL; //输出标志,指示电机是否成功进入操作使能状态 systemReadyCount : INT; //电机使能成功计数变量
Label : INT:=0; i: INT; j: INT; MOTORReductionRatio : ARRAY[1..6] OF INT:=[101,101,101,101,101,101]; //减速器减速比 //Position_Initial1 : ARRAY[1..6] OF DINT:=[-15684647,-8089690,7254205,-1028930,7387277,-12992303]; Position_Initial : ARRAY[1..6] OF DINT:=[0,0,0,0,0,0];
Key1:DINT;//Y Key2:DINT;//B Key3:DINT;//A Key4:DINT;//X Key5:DINT;//LB Key6:DINT;//RB L1:DINT;//LT L2:DINT;//BACK R1:DINT;//RT R2:DINT;//START S1:DINT;//PRESS RIGHT S2:DINT;//PRESS LEFT Axis_x:LREAL;//LATERAL RIGHT Axis_y:LREAL;//LONGITUTAL RIGHT Axis_z:LREAL;//LATERAL LEFT Axis_r:LREAL;//LONGITUTAL LEFT
VAR_INPUT //// Inputs, get actual value from driver //// Statusword AT %I*: ARRAY[1..6] OF UINT; ActualVelocity AT %I*: ARRAY[1..6] OF DINT; // unit: 0.1 counts ActualPosition AT %I*: ARRAY[1..6] OF DINT; // unit: counts TorqueActualValue AT %I*: ARRAY[1..6] OF INT; // unit: 额定转矩/1000 END_VAR
VAR_OUTPUT //// Outputs, set target value to driver //// Controlword AT %Q*: ARRAY[1..6] OF UINT; TargetVelocity AT %Q*: ARRAY[1..6] OF DINT; // unit: 1000rpm ModeOfOperation AT %Q*: ARRAY[1..6] OF SINT; // 9:速度环,10:电流环 TargetTorque AT %Q*: ARRAY[1..6] OF INT:=[0,0,0,0,0,0]; // unit: 额定转矩/1000 TargetOffset1 AT %Q*: ARRAY[1..6] OF INT:=[0,-400,0,0,0,0]; // unit: 额定转矩/1000 END_VAR
IF input THEN fb_test.Execute(); //input为真,则调用之前定义的功能块实例(Simulink模型) END_IF
//读状态字,根据状态字发控制字,使能电机 FOR i:=1TO6 BY 1DO IF System_Enable=1THEN//检验整个系统是否使能 IF (EnableJointFlag[i]) THEN//检验系统中每个电机是否使能 //状态字和2#1001111按位与操作,校验状态字的位7、位3、位2、位1、位0,根据当前状态和状态转换条件发送控制字 //检验状态字是否为Fault状态(2#0xx1000) IF (Statusword[i] AND (2#1001111))=2#0001000THEN Controlword[i]:=2#10000000; //若为Fault状态,则Reset Fault,控制字2#1xxxxxx END_IF //检验状态字是否为Switch On Disabled状态(2#1xx0000) IF (Statusword[i] AND (2#1001111))=2#1000000THEN Controlword[i]:=2#0110; //若为Switch On Disabled状态,则Shutdown,控制字2#0xxxx110 enable_succeed[i]:=FALSE; //使能标志为FALSE END_IF
//状态字和2#1101111按位与操作,校验状态字的位7、位6、位3、位2、位1、位0,根据当前状态和状态转换条件发送控制字 //检验状态字是否为Ready to Switch On状态(2#01x0001) IF (Statusword[i] AND (2#1101111))=2#0100001THEN Controlword[i]:=2#0111; //若为Ready to Switch On状态,则Switch On,控制字(2#0xxx0111) END_IF //检验状态字是否为Switched On状态(2#01x0011) IF (Statusword[i] AND (2#1101111))=2#0100011THEN Controlword[i]:=2#1111; //若为Switched On状态,则Enable Operation,控制字(2#0xxx1111) END_IF //检验状态字是否为Operation Enable状态(2#01x0111) IF (Statusword[i] AND (2#1101111))=2#0100111THEN enable_succeed[i]:=TRUE; //使能成功,标志为TRUE END_IF ELSE Controlword[i]:=2#0110; END_IF ELSE Controlword[i]:=2#0110; //电机使能标志为0,即EnableJointFlag[i]=0,则Shutdown,控制字2#0xxxx110 END_IF END_FOR // 以下为手柄控制接口,调节单个电机,Key1对应Y键,Key2对应B键,Key3对应A键 IF (L1=1) THEN//对应手柄LT键按下,系统使能 System_Enable:=TRUE; ELSE System_Enable:=FALSE; END_IF IF (R2=1) THEN//对应手柄Start键按下,各电机正向转动 IF (Key1=1) THEN//Y键按下,电机1正转 TargetVelocity[1]:=20000; ELSE TargetVelocity[1]:=0; END_IF IF (Key2=1) THEN//B键按下,电机2正转 TargetVelocity[2]:=20000; ELSE TargetVelocity[2]:=0; END_IF IF (Key3=1) THEN//A键按下,电机3正转 TargetVelocity[3]:=20000; ELSE TargetVelocity[3]:=0; END_IF IF (Key4=1) THEN//X键按下,电机4正转 TargetVelocity[4]:=20000; ELSE TargetVelocity[4]:=0; END_IF IF (Key5=1) THEN//LB键按下,电机5正转 TargetVelocity[5]:=20000; ELSE TargetVelocity[5]:=0; END_IF IF (Key6=1) THEN//RB键按下,电机6正转 TargetVelocity[6]:=20000; ELSE TargetVelocity[6]:=0; END_IF ELSE//对应手柄Start键未按下,各电机反向转动 IF (Key1=1) THEN//Y键按下,电机1反转 TargetVelocity[1]:=-20000; ELSE TargetVelocity[1]:=0; END_IF IF (Key2=1) THEN//B键按下,电机2反转 TargetVelocity[2]:=-20000; ELSE TargetVelocity[2]:=0; END_IF IF (Key3=1) THEN//A键按下,电机3反转 TargetVelocity[3]:=-20000; ELSE TargetVelocity[3]:=0; END_IF IF (Key4=1) THEN//X键按下,电机4反转 TargetVelocity[4]:=-20000; ELSE TargetVelocity[4]:=0; END_IF IF (Key5=1) THEN//LB键按下,电机5反转 TargetVelocity[5]:=-20000; ELSE TargetVelocity[5]:=0; END_IF IF (Key6=1) THEN//RB键按下,电机6反转 TargetVelocity[6]:=-20000; ELSE TargetVelocity[6]:=0; END_IF END_IF
//使能成功计数器 systemReadyCount := 0; FOR i:=1TO6 BY 1DO IF enable_succeed[i]=TRUE THEN systemReadyCount := systemReadyCount+1; END_IF END_FOR