Twincat 编程模式

状态机

模式

UNDEFINED (未定义)
AUTOMATIC (自动模式)
MAINTENANCE (维修模式)
MANUAL (手动模式)
SEMIAUTOMATIC (半自动模式)
DRYRUN (空运行)
USERMODE1 (用户模式1)
USERMODE2 (用户模式2)
IDLE (空闲模式)
ESTOP (急停模式)

状态

UNDEFINED (未定义)
CLEARING (清理中)
STOPPED (已经停止)
STARTING (启动中))
IDLE (空闲)
SUSPENDED (已经暂停)
EXECUTE (执行)
STOPPING (正在停止))
ABORTING (中断中)
ABORTED (已经中断)
HOLDING (保持中)
HELD (已经保持)
UNHOLDING (释放保持)
SUSPENDING (暂停中)
UNSUSPENDING (释放暂停)
RESETTING (复位中)
COMPLETING (正在完成)
COMPLETE (已经完成)

功能块

image

断言语句

条件满足则进一步判断直到需要执行的动作
否则提前返回

conditionERR[1]:=FALSE;
conditionERR[2]:=FALSE;
conditionERR[3]:=FALSE;
bingo:=FALSE;

IF NOT condition[1] THEN
	conditionERR[1]:=TRUE;
RETURN;	
END_IF
IF NOT condition[2] THEN
	conditionERR[2]:=TRUE;
RETURN;
END_IF	
IF NOT condition[3] THEN
	conditionERR[3]:=TRUE;
RETURN;
end_if	
bingo:=TRUE;

跳步控制

申明变量

VAR
	Step:UINT;
	NextStep:UINT;
	ton:ARRAY[0..4]OF ton;
	event:ARRAY[0..4]OF BOOL;
	mode:emode;
	btnNextStep: BOOL;
	trbtnNextStep:input;
END_VAR

程序

CASE  Step	OF
	0:
	event[0]:=TRUE;
	IF ton[0].Q THEN
		NextStep:=20;
		event[0]:=FALSE;
	END_IF
	20:
	event[1]:=TRUE;
	IF ton[1].Q THEN
		NextStep:=30;
		event[1]:=FALSE;
	END_IF
	30:
	event[2]:=TRUE;
	IF ton[2].Q THEN
		NextStep:=40;
		event[2]:=FALSE;
	END_IF
	40:
	event[3]:=TRUE;
	IF ton[3].Q THEN
		NextStep:=0;
		event[3]:=FALSE;
	END_IF
END_CASE
(*自动下自动跳转下一步/单步加单步按钮跳转下一步*)
IF mode=Emode.auto OR (mode=Emode.sigle AND trbtnNextStep.Q_RT)THEN
	step:=NextStep;
END_IF

trbtnNextStep(
	INPUT:=btnNextStep , 
	Q_DIRECT=> );
ton[0](IN:=event[0] , PT:=T#1S , Q=> , ET=> );
ton[1](IN:=event[1] , PT:=T#1S , Q=> , ET=> );
ton[2](IN:=event[2] , PT:=T#1S , Q=> , ET=> );
ton[3](IN:=event[3] , PT:=T#1S , Q=> , ET=> );

PID使用

申明变量

fbCTRL_PID	:	ARRAY[0..2]OF	FB_CTRL_PID;
tPID_PARAMS 	:	ARRAY[0..2]OF	ST_CTRL_PID_PARAMS;

实例化

fbCTRL_PID[0](
 fSetpointValue:=0 ,
 fActualValue:=Axis[DP_4_FangJuanZL].NcToPlc.ActPos ,
 fManSyncValue:= , 
 bSync:= ,
 eMode:= ,
 bHold:= ,
 stParams:=stPID_PARAMS[0],
 fOut=> ,
 bARWactive=> ,
 eState=> , 
 eErrorId=> ,
 bError=> );

 stPID_PARAMS[0].fOutMaxLimit:=100;
 stPID_PARAMS[0].fOutMinLimit:=-100;
 stPID_PARAMS[0].fKp:=rKp;
 stPID_PARAMS[0].tTn:=REAL_TO_TIME(rTn*1000);
 stPID_PARAMS[0].tTaskCycleTime:=t#2ms;
 stPID_PARAMS[0].tCtrlCycleTime:=t#4ms;

使用

fbMC_GearInMultiMaster.GearRatio2:=-fbCTRL_PID[0].fOut/100;
fbMC_GearInMultiMaster(
	Enable:= ,
	GearRatio1:=,
	GearRatio2:= ,
	GearRatio3:=0.0 ,
	GearRatio4:=0.0 ,
	Acceleration:= ,
	Deceleration:= ,
	Jerk:= ,
	BufferMode:= ,
	Options:= ,
	Master1:=Axis[DP_3_XZFangJuan],
	Master2:=Axis[DP_3_FangJuanPID],
	Master3:=Axis[DP_3_XZFangJuan] ,
	Master4:=Axis[DP_3_XZFangJuan] ,
	Slave:=Axis[HMI_CanShu.DP_iDanQianLiaoJuan[3]] ,
	InGear=> ,
	Busy=> ,
	Active=> ,
	CommandAborted=> ,
	Error=> ,
	ErrorID=> );

凸轮使用

申明变量

~~~
fbCamV2				:	ARRAY[1..11]OF	MC_CamIn_V2;
fbCamOut						:	ARRAY[1..11]OF	MC_CamOut;
fbCamTableSelect				:	ARRAY[1..11]OF	MC_CamTableSelect;
LabelCamTable					:	ARRAY[1..11]OF	MC_CAM_REF;
fbMC_WriteMotionFunction		: 	ARRAY[1..11]OF 	MC_WriteMotionFunction;
fbSetCamOnlineChangeMode		: 	ARRAY[1..11]OF 	MC_SetCamOnlineChangeMode;
LabelMF1						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF2						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF3						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF4						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF5						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF6						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF7						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF8						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF9						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF10						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
LabelMF11						:	ARRAY[1..10]OF	MC_MotionFunctionPoint;
~~~

生成凸轮曲线

(*第一条送料器曲线*)
LabelCamTable[1].TableType:=MC_TABLETYPE_MOTIONFUNCTION;
LabelCamTable[1].ArraySize:=SIZEOF(LabelMF1);
LabelCamTable[1].pArray:=ADR(LabelMF1);
LabelCamTable[1].NoOfRows:=3;
LabelCamTable[1].NoOfColumns:=1;

(*凸轮点1的位置*)
LabelMF1[1].PointIndex:=1;
LabelMF1[1].FunctionType:=iMode;
LabelMF1[1].PointType:=8;
LabelMF1[1].RelIndexNextPoint:=1;
LabelMF1[1].MasterPos:=0;
LabelMF1[1].SlavePos:=0;
LabelMF1[1].SlaveVelo:=0;
LabelMF1[1].SlaveAcc:=0;
LabelMF1[1].SlaveJerk:=0;

(*凸轮点2的位置*)
LabelMF1[2].PointIndex:=2;
LabelMF1[2].FunctionType:=iMode;
LabelMF1[2].PointType:=8;
LabelMF1[2].RelIndexNextPoint:=1;
IF NOT HMI_Fun.CP_B_bMoJuBianS THEN
	LabelMF1[2].MasterPos:=240;
ELSE
	LabelMF1[2].MasterPos:=220;
END_IF
IF(HMI_Ctrl.bCP_B_JieShuZhong AND HMI_Fun.CP_B_bLianJiYunXing)OR
(NOT HMI_Fun.CP_B_bLianJiYunXing AND bCP_B_JinZhiQiePian)OR
((CP_B_FenPian1ShangCJiYi.1OR
	(CP_B_FenPian1ShangCJiYi.0 AND NOT CP_B_FenPianShouJiYi.7 AND NOT HMI_Fun.FP_B_bXiangJiJianCe)
	OR bFP_B_JinZhiSFengPian OR
	(HMI_Fun.DP_1_bLianJiYunXing AND HMI_Fun.DP_3_bLianJiYunXing))AND
	Axis[CP_B_FenLiao1ShangSS].NcToPlc.ModuloSetPos>90 AND
	Axis[CP_B_FenLiao1ShangSS].NcToPlc.ModuloSetPos<270AND
	NOT HMI_Fun.CP_B_bLianJiYunXing)
OR
	(((CP_B_FenPian2MoDuanJiYi.1 AND CP_B_FenPianHouJiYi.15) OR
	(CP_B_FenPian2MoDuanJiYi.0 AND NOT CP_B_FenPianShouJiYi.8 AND NOT HMI_Fun.FP_B_bXiangJiJianCe AND CP_B_FenPianHouJiYi.15)
	OR CP_B_FenPianHouJiYi.0 OR bFP_B_JinZhiXFengPian OR
	(HMI_Fun.DP_2_bLianJiYunXing AND HMI_Fun.DP_4_bLianJiYunXing))AND
	(Axis[CP_B_FenLiao1ShangSS].NcToPlc.ModuloSetPos<90 OR
	Axis[CP_B_FenLiao1ShangSS].NcToPlc.ModuloSetPos>270)AND
	NOT HMI_Fun.CP_B_bLianJiYunXing)OR
(NOT CP_B_bJiErPaiZhaoXH.0 AND
	NOT HMI_Fun.CP_B_XJbJierDingWei AND HMI_Fun.CP_B_bJiGuangMoShi)
OR CP_B_ZhunBeiStpe>=110 THEN
LabelMF1[2].SlavePos:=0;
ELSE
LabelMF1[2].SlavePos:=HMI_CanShu.rAxisSlavePos2[CP_B_SongLiaoQi1];
END_IF
LabelMF1[2].SlaveVelo:=0;
LabelMF1[2].SlaveAcc:=0;
LabelMF1[2].SlaveJerk:=0;

(*凸轮点3的位置*)
LabelMF1[3].PointIndex:=3;
LabelMF1[3].FunctionType:=iMode;
LabelMF1[3].PointType:=8;
LabelMF1[3].RelIndexNextPoint:=0;
LabelMF1[3].MasterPos:=360;
LabelMF1[3].SlavePos:=LabelMF1[2].SlavePos;
LabelMF1[3].SlaveVelo:=0;
LabelMF1[3].SlaveAcc:=0;
LabelMF1[3].SlaveJerk:=0;

IF HMI_Fun.CP_B_XJbJierDingWei OR NOT HMI_Fun.CP_B_bJiGuangMoShi THEN
HMI_CanShu.rAxisSlavePos2[CP_B_SongLiaoQi1]:=HMI_CanShu.CP_B_rSongLiaoCD;
ELSE
HMI_CanShu.rAxisSlavePos2[CP_B_SongLiaoQi1]:=CP_B_rJiPianPaiZhaoBC;
END_IF

实例化 加载曲线&凸轮耦合

fbCamTableSelect[1](
	Execute:= ,
	Periodic:=TRUE ,
	MasterAbsolute:=TRUE ,
	SlaveAbsolute:=FALSE ,
	CamTableID:=4 ,
	Master:=Axis[CP_B_XZChongQie] ,
	Slave:=Axis[CP_B_SongLiaoQi2],
	CamTable:=LabelCamTable[1] ,
	Done=> ,
	Busy=> ,
	Error=> , 
	ErrorID=> );

fbCamV2[1].Scaling.MasterRelative:=TRUE;
fbCamV2[1].Scaling.SlaveRelative:=TRUE;
fbCamV2[1](
	Execute:= ,
	ActivationMode:= ,
	ActivationPosition:= ,
	CamTableID:=fbCamTableSelect[1].CamTableID ,
	Scaling:= ,
	Options:= ,
	Master:=Axis[CP_B_XZChongQie] ,
	Slave:=Axis[CP_B_SongLiaoQi2] ,
	InSync=> , 
	Busy=> ,
	Active=> ,
	CommandAborted=> ,
	Error=> , 
	ErrorID=> );
   


(*CamV2解除*)
fbCamOut[2](
	Slave:=Axis[CP_B_ChongMo]);

使用

解除耦合

(*同步解除*)
	fbTon[105].IN:=TRUE;
	FOR t:=3 TO 17 DO
		IF  t<>5 AND t<>6 AND t<>7 AND t<>10 AND t<>11 AND t<>16 THEN
			AxisCtrl[t].bHalt:=TRUE;
		END_IF
	END_FOR
	AxisCtrl[CP_B_XZShiFang].bHalt:=TRUE;
	IF fbAxisMotionCtrl[3].fbMC_Halt.Done AND
		fbAxisMotionCtrl[4].fbMC_Halt.Done AND
		(*fbAxisMotionCtrl[7].fbMC_Halt.Done AND*)
		fbAxisMotionCtrl[8].fbMC_Halt.Done AND
		fbAxisMotionCtrl[9].fbMC_Halt.Done AND
		fbAxisMotionCtrl[12].fbMC_Halt.Done AND
		fbAxisMotionCtrl[13].fbMC_Halt.Done AND
		fbAxisMotionCtrl[14].fbMC_Halt.Done AND
		fbAxisMotionCtrl[15].fbMC_Halt.Done AND
		fbAxisMotionCtrl[17].fbMC_Halt.Done AND
		fbAxisMotionCtrl[CP_B_XZShiFang].fbMC_Halt.Done AND
		 CP_B_FanJuanStpe<=100 THEN
		FOR t:=3 TO 17 DO
			IF i<>7 THEN
			AxisCtrl[t].bHalt:=FALSE;
			END_IF
		END_FOR
		fbTon[105].IN:=FALSE;
		bYiChangJiShu[1]:=0;
		AxisCtrl[CP_B_XZShiFang].bHalt:=FALSE;
		CP_B_ZhunBeiStpe:=20;
	END_IF
	IF fbAxisMotionCtrl[3].fbMC_Halt.Error OR
		fbAxisMotionCtrl[4].fbMC_Halt.Error OR
		(*fbAxisMotionCtrl[7].fbMC_Halt.Error OR*)
		fbAxisMotionCtrl[8].fbMC_Halt.Error OR
		fbAxisMotionCtrl[9].fbMC_Halt.Error OR
		fbAxisMotionCtrl[12].fbMC_Halt.Error OR
		fbAxisMotionCtrl[13].fbMC_Halt.Error OR
		fbAxisMotionCtrl[14].fbMC_Halt.Error OR
		fbAxisMotionCtrl[15].fbMC_Halt.Error OR
		fbAxisMotionCtrl[17].fbMC_Halt.Error OR
		fbAxisMotionCtrl[CP_B_XZShiFang].fbMC_Halt.Error THEN
		CP_B_ZhunBeiStpe:=999;
	END_IF
	IF fbTon[105].Q THEN(*解耦超时处理*)
		IF bYiChangJiShu[1]<3 THEN
			bYiChangJiShu[1]:=bYiChangJiShu[1]+1;
			CP_B_ZhunBeiStpe:=0;
		ELSE
			bYiChangJiShu[1]:=0;
			CP_B_ZhunBeiStpe:=999;
		END_IF
	END_IF

生成凸轮表

(*生成凸轮表*)
	FOR i:=1 TO 10 DO
		fbCamTableSelect[i].Execute:=TRUE;
		IF NOT HMI_Fun.CP_B_bLianJiYunXing THEN
		FPBfbCamTableSelect[i].Execute:=TRUE;
		END_IF
	END_FOR
	IF  fbCamTableSelect[1].Done AND  fbCamTableSelect[2].Done AND
		fbCamTableSelect[3].Done AND fbCamTableSelect[4].Done AND
		fbCamTableSelect[5].Done AND fbCamTableSelect[6].Done AND
		fbCamTableSelect[7].Done AND fbCamTableSelect[8].Done AND
		fbCamTableSelect[9].Done AND fbCamTableSelect[10].Done AND
		((FPBfbCamTableSelect[3].Done AND
		FPBfbCamTableSelect[4].Done AND
		FPBfbCamTableSelect[5].Done  AND
		FPBfbCamTableSelect[6].Done AND
		FPBfbCamTableSelect[7].Done)OR HMI_Fun.CP_B_bLianJiYunXing) THEN
		FOR i:=1 TO 10 DO
			fbCamTableSelect[i].Execute:=FALSE;
			IF NOT HMI_Fun.CP_B_bLianJiYunXing THEN
				FPBfbCamTableSelect[i].Execute:=FALSE;
			END_IF
		END_FOR
		CP_B_ZhunBeiStpe:=70;
	END_IF
	IF fbCamTableSelect[1].Error OR fbCamTableSelect[2].Error OR
		fbCamTableSelect[3].Error OR fbCamTableSelect[4].Error OR
		fbCamTableSelect[5].Error OR fbCamTableSelect[6].Error OR
		fbCamTableSelect[7].Error OR fbCamTableSelect[8].Error OR
		fbCamTableSelect[9].Error OR fbCamTableSelect[10].Error OR
		((FPBfbCamTableSelect[1].Error OR
		FPBfbCamTableSelect[2].Error OR
		FPBfbCamTableSelect[3].Error OR
		FPBfbCamTableSelect[4].Error OR
		FPBfbCamTableSelect[5].Error OR
		FPBfbCamTableSelect[6].Error OR
		FPBfbCamTableSelect[7].Error)AND HMI_Fun.CP_B_bLianJiYunXing )  THEN
		CP_B_ZhunBeiStpe:=999;
	END_IF

耦合凸轮

(*电机耦合*)
	FOR i:=1 TO 10 DO
		(*fbGearInDy[1].Enable:=TRUE;*)
		IF NOT HMI_Fun.CP_B_bJiGuangMoShi THEN
			fbCamV2[i].Execute:=TRUE;
		ELSE
			IF i<>2 THEN
				fbCamV2[i].Execute:=TRUE;
			END_IF
		END_IF
		IF NOT HMI_Fun.CP_B_bLianJiYunXing THEN
			IF i=1OR (i=2 AND NOT HMI_Fun.CP_B_bDangJiaShangLiao)THEN
				FPBfbGearInDy[i].Enable:=TRUE;
			END_IF
			IF  i<>1AND  i<>2  THEN
				FPBfbCamV2[i].Execute:=TRUE;
			END_IF
		END_IF
	END_FOR
	IF  fbCamV2[1].InSync AND(fbCamV2[2].InSync OR
		HMI_Fun.CP_B_bJiGuangMoShi)AND
		fbCamV2[3].InSync AND fbCamV2[4].InSync AND
		fbCamV2[5].InSync AND fbCamV2[6].InSync AND
		fbCamV2[7].InSync AND fbCamV2[8].InSync AND
		fbCamV2[9].InSync AND fbCamV2[10].InSync (*AND
	 	fbGearInDy[1].InGear *)AND
		((FPBfbCamV2[3].InSync AND  FPBfbCamV2[4].InSync AND
		FPBfbCamV2[5].InSync AND FPBfbCamV2[6].InSync AND
		FPBfbCamV2[7].InSync AND FPBfbGearInDy[1].InGear AND
		(FPBfbGearInDy[2].InGear OR HMI_Fun.CP_B_bDangJiaShangLiao))OR HMI_Fun.CP_B_bLianJiYunXing)THEN
		FOR i:=1 TO 10 DO
			fbCamV2[i].Execute:=FALSE;
			IF i<>1 THEN
			fbGearInDy[i].Enable:=FALSE;
			END_IF
			IF NOT HMI_Fun.CP_B_bLianJiYunXing THEN
				FPBfbCamV2[i].Execute:=FALSE;
				FPBfbGearInDy[i].Enable:=FALSE;
			END_IF
		END_FOR
		CP_B_ZhunBeiStpe:=80;
	END_IF
	IF fbCamV2[1].Error OR fbCamV2[2].Error OR
		fbCamV2[3].Error OR fbCamV2[4].Error OR
		fbCamV2[5].Error OR fbCamV2[6].Error OR
		fbCamV2[7].Error OR fbCamV2[8].Error OR
		fbCamV2[9].Error OR fbCamV2[10].Error OR
		(*fbGearInDy[1].Error OR*) fbGearInDy[2].Error OR
		fbGearInDy[3].Error OR fbGearInDy[4].Error OR
		((FPBfbCamV2[1].Error OR FPBfbCamV2[2].Error OR FPBfbCamV2[3].Error OR
		FPBfbCamV2[4].Error OR FPBfbCamV2[5].Error OR FPBfbCamV2[6].Error OR
		FPBfbCamV2[7].Error OR FPBfbGearInDy[1].Error OR FPBfbGearInDy[2].Error OR
		FPBfbGearInDy[3].Error)AND NOT HMI_Fun.CP_B_bLianJiYunXing)  THEN
		CP_B_ZhunBeiStpe:=999;
	END_IF

启动主轴

(*冲片B运行启动*)
	AxisCtrl[CP_B_XZChongQie].rVelo:=360*HMI_CanShu.CP_B_rSongLiaoPPM/60;
	AxisCtrl[CP_B_XZChongQie].bMoveVelo:=TRUE;
	IF Axis[CP_B_XZChongQie].Status.Moving THEN
		CP_B_ZhunBeiStpe:=100;
	END_IF
	IF fbAxisMotionCtrl[CP_B_XZChongQie].fbMC_MoveVelocity.Error OR CP_X1100Err[2] OR
		fbAxisMotionCtrl[CP_B_XZChongQie].fbMC_MoveVelocity.CommandAborted THEN
		CP_B_ZhunBeiStpe:=999;
	END_IF

扭矩控制

FB功能块

FB变量

FUNCTION_BLOCK Fb_Torque
VAR_INPUT
	bStart:BOOL;(*		走扭矩触发			*)
	bStop:BOOL;(*		停轴信号		*)
	TargetTorueSet:INT;(*		目标扭矩			*)
	iModeCnst					:SINT;(*		选择走扭矩模式  =9 =10			*)
	iCurTorque:INT;(*当前反馈扭矩			*)
	iCurMode:SINT;(* 当前反馈轴模式=8 正常  =9 or10 走扭矩		*)
	iKeepTime:DWORD;(*	扭矩保持时间				*)
	iTimeOut_ms:DWORD;(*	走扭矩超时时间			*)
END_VAR
VAR_IN_OUT
	Axis 		: AXIS_REF;
	iModeChange:SINT;(*		 切换扭矩模式 	*)
END_VAR

VAR_OUTPUT
	done:BOOL;(*完成*)
	error:BOOL;(*	报警	*)
	eRRorId:WORD;(*		1轴错误 2走扭矩超时		3 : 轴停止					*)
	busy:BOOL;
END_VAR
VAR
	fbMC_Reset: MC_Reset;
	iStep:INT ;
	tTimeOut:TON;
	tKeep:TON;
	rtStart:R_TRIG;
	bStopFlag: BOOL;
END_VAR

FB程序

fbMC_Reset(
	Execute:=  ,
	Axis:=Axis ,
	Done=> ,
	Busy=> , 
	Error=> ,
	ErrorID=> );



rtStart(CLK:= bStart, Q=> );
tTimeOut(IN:= , PT:=DWORD_TO_TIME(iTimeOut_ms) , Q=> , ET=> );
tKeep(IN:= , PT:=DWORD_TO_TIME(iKeepTime) , Q=> , ET=> );

IF iStep=10 AND NOT bStop THEN
iModeChange	:=  iModeCnst;
ELSE
iModeChange	:=  8;
END_IF


IF bStop THEN
	fbMC_Reset.Execute := FALSE;
	tTimeOut.IN := FALSE;
	tKeep.IN := FALSE;
	busy := FALSE ;
	bStopFlag:= FALSE ;
	done := FALSE;
	error := TRUE;
	iStep:=0;
END_IF




CASE iStep OF

0:(*   上升沿	触发		*)

	fbMC_Reset.Execute := FALSE;
	tTimeOut.IN := FALSE;
	tKeep.IN := FALSE;
	busy := FALSE ;
	bStopFlag:= FALSE ;
	error := FALSE;
	done := FALSE;


IF rtStart.Q THEN
	iStep:=10;
	busy := TRUE ;
	error := FALSE;
	done := FALSE;
	eRRorId := 0;
END_IF


10:(*   走扭矩		*)
	tTimeOut.IN := TRUE ;
IF  iCurMode =iModeCnst
(*	AND AXIS.Status.NotMoving *)
	AND  iCurTorque
			>=TargetTorueSet THEN
				tKeep.IN  :=TRUE;
				IF tKeep.Q THEN
					fbMC_Reset.Execute  := TRUE;
				END_IF
END_IF

IF fbMC_Reset.Done THEN
			fbMC_Reset.Execute  := FALSE;
			iStep:=20;
END_IF

IF bStop THEN
  bStopFlag:= TRUE;
	eRRorId :=  3  ;
END_IF

IF bStopFlag
		 OR tTimeOut.Q   THEN

	IF tTimeOut.Q  THEN
	eRRorId :=  2  ;
	END_IF

	fbMC_Reset.Execute  := TRUE;
	IF fbMC_Reset.Done THEN
				fbMC_Reset.Execute  := FALSE;
				iStep:=999;
	END_IF

END_IF
20:
		IF  iCurMode=8 THEN
				iStep:=30;
		END_IF

30:
	  done := TRUE;
		busy := FALSE ;
		error := FALSE;
		iStep:=0;


999:
	fbMC_Reset.Execute  :=	FALSE		;
	error := TRUE;
	iStep:=0;

END_CASE

申明变量

fbZpTorque:Fb_Torque;

实例化

fbZpTorque(
 bStart:= ,(* 走扭矩开始 *)
 bStop:= MovStop OR di_Emergy , (* 异常停扭矩停马达   *)
 TargetTorueSet:=Hmi_TorqueSet[M20HanHou_CeShi1] ,(* 当前扭矩设定   *)
 iModeCnst:=10 ,(* 扭矩模式值 OMRON 9  埃斯顿10   *)
 iCurTorque:=Hmi_CurTorque[M20HanHou_CeShi1] ,(*  反馈回当前扭矩  *)
 iCurMode:=Hmi_ModeDisplay[M20HanHou_CeShi1] ,(*  反馈当前操作模式 *)
 iKeepTime:=200 ,(* 保压时间 *)
 iTimeOut_ms:=5000 ,(* 走扭矩超时时间 *)
 Axis:=Axis[M20HanHou_CeShi1] ,(* 轴名称 *)
 iModeChange:=Hmi_TorqueModeSet[M20HanHou_CeShi1] ,(* 设定扭矩模式 *)
 done=> ,(* 扭矩完成  *)
 error=> ,(* 扭矩报错  *)
 eRRorId=> ,(* 扭矩报错代码  *)
 busy=> );(* 功能块运行中  *)
(*测试程序  *)
fbZpTorque.eRRorId;

使用

fbZpTorque.bStart :=  TRUE ;

IF fbZpTorque.done
  	OR  fbZpTorque.error OR
		  di_Emergy  OR
		MovStop THEN
  iTest := 0;
  fbZpTorque.bStart :=  FALSE ;
  Res(bTst);

END_IF
posted @ 2025-07-21 15:50  阿拉斯加王  阅读(29)  评论(0)    收藏  举报