<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.13">
  <POU Name="FB_Machine" Id="{d156e342-779b-4a0b-9748-84d6da0a86bb}" SpecialFunc="None">
    <Declaration><![CDATA[FUNCTION_BLOCK FB_Machine
VAR
	// ==============================错误变量=====================================================
	bError				AT%Q*				: BOOL;								// 如果为TRUE，则设备存在错误			（通过输出传递给模拟程序）
	
	// =============================轴相关变量============================================
	fAxisVelo							: LREAL;								// 轴速度，见cAxisVeloAutomatic和cAxisVeloNotAutomatic
		
	// ============================状态机相关变量==================================
	bStarted			AT%Q*				: BOOL;								// 如果为True，则设备进入运行中状态		（通过输出传递给模拟程序）
	bStopped			AT%Q*				: BOOL;								// 如果为True，则设备进入停止状态		（通过输出传递给模拟程序）
	bReset				AT%Q*				: BOOL;								// 如果为True，则设备进入复位中状态		（通过输出传递给模拟程序）
	bAborted			AT%Q*				: BOOL;								// 如果为True，则设备进入中止状态		（通过输出传递给模拟程序）
	bIdle				AT%Q*				: BOOL;								// 如果为True，则设备进入空闲状态		（通过输出传递给模拟程序）
	bAuto				AT%Q*				: BOOL;								// 如果为True，则设备处于自动模式		（通过输出传递给模拟程序）
	bSemi				AT%Q*				: BOOL;								// 如果为True，则设备处于半自动模式		（通过输出传递给模拟程序）
	bManual				AT%Q*				: BOOL;								// 如果为True，则设备处于手动模式		（通过输出传递给模拟程序）
	bMaintenance		AT%Q*				: BOOL;								// 如果为True，则设备处于维护模式		（通过输出传递给模拟程序）
	bStartButtonOff		AT%Q*				: BOOL;								// 如果为True，复位Start按钮			（通过输出传递给模拟程序）

	// =================================对象=======================================
	fbSeparateModule					: FB_SeparatingModule;					// 输送系统
	fbMetalSorting						: FB_SortingModule;						// 金属分拣系统
	fbPlasticSorting					: FB_SortingModule;						// 塑料分拣系统
	fbButtonStart						: FB_SignalHandling;					// 处理启动按钮的信号处理功能块
	fbButtonStop						: FB_SignalHandling;					// 处理停止按钮的信号处理功能块
	fbButtonReset						: FB_SignalHandling;					// 处理复位按钮的信号处理功能块
	fbButtonAbort						: FB_SignalHandling;					// 处理中止按钮的信号处理功能块
	fbButtonAuto						: FB_SignalHandling;					// 处理自动模式按钮的信号处理功能块
	fbButtonSemi						: FB_SignalHandling;					// 处理半自动模式按钮的信号处理功能块
	fbButtonManual						: FB_SignalHandling;					// 处理手动模式按钮的信号处理功能块
	fbButtonMaintenance					: FB_SignalHandling;					// 处理维护模式按钮的信号处理功能块
	fbButtonPower						: FB_SignalHandling;					// 处理使能按钮的信号处理功能块
	fbButtonComprAir					: FB_SignalHandling;					// 处理压缩气缸空气按钮的信号处理功能块
	fbComprAir							: FB_SignalHandling;					// 处理压缩气缸空气的信号处理功能块		（In为fbButtonComprAir的Out）
	fbPowerSupply						: FB_SignalHandling;					// 处理使能的信号处理功能块				（In为fbButtonPower的Out）
	// =================================状态机==========================================
	fbStateMachineAuto					: PS_PackML_StateMachine_Auto;			// 自动模式下的状态机功能块
	fbStateMachineSemiAuto				: PS_PackML_StateMachine_SemiAuto;		// 半自动模式下的状态机功能块
	fbStateMachineManual				: PS_PackML_StateMachine_Manual;		// 手动模式下的状态机功能块
	fbStateMachineMaintenance			: PS_PackML_StateMachine_Maintenance;	// 维护模式下的状态机功能块
	
	ePMLUnitMode						: E_PMLUnitMode := E_PMLUnitMode.IDLE;	// 当前的设备模式
	ePMLUnitModeRequested				: E_PMLUnitMode;						// 请求的设备模式
	fbUnitModeManager					: PS_UnitModeManager;					// 模式切换功能块
	ePMLState							: E_PMLState := E_PMLState.IDLE;		// 当前的设备状态机
	ePMLStateRequested					: E_PMLState;							// 请求的设备状态机
	
	// ===================================其他=====================================
	bInit								: BOOL;									// 如果为TRUE，则设备运行所必须的参数已经初始化完成
	bAxisEnable							: BOOL;									// 如果为TRUE，则轴已经使能
	bManualAxisEnable					: BOOL;									// 如果为TRUE，则轴允许被手动的按钮控制
	fbTriggerStart						: R_TRIG;								// 检测启动按钮的上升沿
	fbTriggerSeparated					: R_TRIG;								// 检测分割完物料的上升沿
	fbTriggerSelectedM					: R_TRIG;								// 检测金属物料被分拣完的上升沿
	fbTriggerSelectedP					: R_TRIG;								// 检测塑料物料被分拣完的上升沿
	nBoxesOnTheWay						: INT;									// 输送带上正在移动的物料
	aClampTemps							: ARRAY[1..100] OF LREAL;				// 正位气缸的温度数据
	aBarrierTemps						: ARRAY[1..100] OF LREAL;				// 栏杆气缸的温度数据
	aMetalTemps							: ARRAY[1..100] OF LREAL;				// 金属气缸的温度数据
	aPlasticTemps						: ARRAY[1..100] OF LREAL;				// 塑料气缸的温度数据
	bStartingIsSetToTrue				: BOOL;									// 如果为TRUE，则启动方法被以TRUE的形式调用
	bResetIsSetToTrue					: BOOL;									// 如果为TRUE，则复位方法被以TRUE的形式调用
	bHaltIsSetToTrue					: BOOL;									// 如果为TRUE，则停止方法被以TRUE的形式调用

	bResetAxis           AT%I*          : BOOL;									// 单独复位轴的报错

END_VAR
VAR CONSTANT
	// ================================轴速度=========================================
	cAxisVeloAutomatic					: LREAL	:= 200.0;						// 自动/半自动模式下轴的运行速度
	cAxisVeloNotAutomatic				: LREAL	:= 100.0;						// 手动/维护模式下轴的运行速度
	
	// ============================= 气缸超时时间参数 =====================================
	cSeparatingTimeOutClamp				: TIME 	:= T#2.5S;						// 正位气缸在位置之间切换判定为超时的时间
	cSeparatingTimeOutBarrier			: TIME 	:= T#3S;						// 栏杆气缸在位置之间切换判定为超时的时间
	cSortingTimeOutCylinder				: TIME 	:= T#3S;						// 分拣气缸在位置之间切换判定为超时的时间
	cSeparatingBarrierAtWork			: TIME 	:= T#3S;						// 栏杆气缸打开的时间
	cSortingMoveAxis					: TIME 	:= T#1S;						// 分拣系统出料皮带运转的时间
	cSortingSensorDelay					: TIME 	:= T#1.4S;						// 对应物料种类传感器检测到之后，到分拣系统气缸推出的延迟时间
END_VAR]]></Declaration>
    <Implementation>
      <ST><![CDATA[// =========================================================
// 关联报错
	
	bError := fbSeparateModule.bAxisError OR fbSeparateModule.bClampError OR fbSeparateModule.bBarrierError
			OR fbMetalSorting.bAxisError OR fbMetalSorting.bCylError 
			OR fbPlasticSorting.bAxisError OR fbPlasticSorting.bCylError;
	
// =========================================================
// 根据不同的模式选择对应轴的速度

	IF (ePMLUnitMode = E_PMLUnitMode.AUTOMATIC) OR (ePMLUnitMode = E_PMLUnitMode.SEMIAUTOMATIC) THEN
		fAxisVelo := cAxisVeloAutomatic;
	ELSE
		fAxisVelo := cAxisVeloNotAutomatic;
	END_IF

// =========================================================
// 检测子系统当中的标志位信号
	
	fbTriggerSeparated(CLK := fbSeparateModule.bSeparated);			// 分割物料完成
	fbTriggerSelectedM(CLK := fbMetalSorting.bSelected);			// 金属物料分拣完成
	fbTriggerSelectedP(CLK := fbPlasticSorting.bSelected);			// 塑料物料分拣完成
						
// =========================================================
// 关联温度
	
	aBarrierTemps 	:= fbSeparateModule.aBarrierTemps;				
	aClampTemps 	:= fbSeparateModule.aClampTemps;
	aMetalTemps 	:= fbMetalSorting.aTemps;
	aPlasticTemps 	:= fbPlasticSorting.aTemps;

// =========================================================
// 方法调用

	// 初始化
	General_Init();

	// 设备请求
	General_Requests();
	
	// 使能、气缸压缩、信号处理功能块的启用
	General_Enable();
	
	// 关联输入
	General_ModuleInputs();
	
	// 关联输出
	General_SetOutput();
	
	// 状态机处理
	General_StateMachine();
	
	// 内部检查
	CylicCheckInternal();
	
	// 复位轴报错（MC_Reset）
	fbSeparateModule.R_Axis.Reset(bResetAxis);
    fbMetalSorting  .R_Axis.Reset(bResetAxis);
	fbPlasticSorting.R_Axis.Reset(bResetAxis);


]]></ST>
    </Implementation>
    <Method Name="CylicCheckInternal" Id="{b9384924-2130-4bb6-b4a4-0473eccacf78}">
      <Declaration><![CDATA[METHOD PRIVATE CylicCheckInternal
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[

fbSeparateModule.CylicCheck();		// 输送系统内部检查


fbMetalSorting.CylicCheck();		// 金属分拣系统内部检查


fbPlasticSorting.CylicCheck();		// 塑料分拣系统内部检查]]></ST>
      </Implementation>
    </Method>
    <Method Name="General_Enable" Id="{e12d46e1-1424-4f16-b2ad-e628644ca0d9}">
      <Declaration><![CDATA[METHOD PRIVATE General_Enable
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================
// 使能处理

	fbButtonPower.Enable(bEnable := TRUE);			// 启用使能按钮
	fbPowerSupply.Enable(bEnable := TRUE);			// 启用使能按钮输出的信号
	
	fbPowerSupply.bInput := fbButtonPower.bOut;		// 将使能按钮信号的输出传递给使能信号功能块的输入

// =========================================================
// 轴控使能、手动的标志位处理
	
	// 如果设备进入中止状态，则轴使能自动解除							
	IF (ePMLState = E_PMLState.ABORTED) THEN
		bAxisEnable := FALSE;
		
	// 如果使能信号功能块的输出为TRUE，则bAxisEnable为TRUE
	ELSIF fbPowerSupply.bOut THEN
		bAxisEnable := TRUE;
	END_IF
	
	// 允许轴的手动控制：条件：使能上且设备处于运行状态和手动/自动模式
	bManualAxisEnable := fbPowerSupply.bOut AND (ePMLState = E_PMLState.EXECUTE)
						AND ((ePMLUnitMode = E_PMLUnitMode.MANUAL) OR (ePMLUnitMode = E_PMLUnitMode.MAINTENANCE));
						
// =========================================================
// 气缸压缩处理
	
	// 如果不是维护模式，那使能信号的输出传递给气缸加压信号功能块的输入（随着使能信号的输出自动加压）
	IF (ePMLUnitMode <> E_PMLUnitMode.MAINTENANCE) THEN
		fbComprAir.bInput := fbPowerSupply.bOut;
		
	//	气缸加压按钮信号功能块的输出传递给气缸加压信号功能块的输入
	ELSE
		fbComprAir.bInput := fbButtonComprAir.bOut;
	END_IF
	
	// 保持气缸加压信号功能块启用
	fbComprAir.Enable(bEnable := TRUE);
	
	// 维护模式下启用气缸加压按钮信号功能块
	fbButtonComprAir.Enable(bEnable := (ePMLUnitMode = E_PMLUnitMode.MAINTENANCE));

// =========================================================
// 输送系统使能方法的调用

	fbSeparateModule.Enable(bComprAirEnabled	:= fbComprAir.bOut,
							bAxisEnable			:= bAxisEnable,
							bSensorEnable		:= TRUE,
							bManualAxisEnable	:= bManualAxisEnable);

// =========================================================
// 金属分拣系统使能方法的调用

	fbMetalSorting.Enable(	bComprAirEnabled	:= fbComprAir.bOut,
							bAxisEnable			:= bAxisEnable,
							bSensorEnable		:= TRUE,
							bManualAxisEnable	:= bManualAxisEnable);

// =========================================================
// 塑料分拣系统使能方法的调用

	fbPlasticSorting.Enable(bComprAirEnabled	:= fbComprAir.bOut,
							bAxisEnable			:= bAxisEnable,
							bSensorEnable		:= TRUE,
							bManualAxisEnable	:= bManualAxisEnable);

// =========================================================
// 其他信号处理功能块的启用
		
	// 启动按钮：（设备非空闲状态且设备无错误）
	fbButtonStart.Enable(bEnable		:= NOT ((ePMLState = E_PMLState.IDLE) AND bError));
	
	// 停止按钮：（设备运行以及空闲状态下都可以进行停止）
	fbButtonStop.Enable(bEnable 		:= (ePMLState = E_PMLState.EXECUTE) OR (ePMLState = E_PMLState.IDLE));
	
	// 复位按钮：（设备在停止状态下才会被启用）
	fbButtonReset.Enable(bEnable		:= (ePMLState = E_PMLState.STOPPED));
	
	// 使能信号功能块的输出取反传递给中止信号功能块的输入（中止即代表设备掉使能）
	fbButtonAbort.bInput 				:= NOT fbPowerSupply.bOut;
	
	// 中止按钮：（设备在执行、停止中或者复位中才会被启用）
	fbButtonAbort.Enable(bEnable 		:= (ePMLState = E_PMLState.EXECUTE) OR (ePMLState = E_PMLState.STOPPING) OR (ePMLState = E_PMLState.RESETTING));
								
	// 自动模式按钮：（设备在空闲状态下且当前模式非自动模式）
	fbButtonAuto.Enable(bEnable 		:= (ePMLState = E_PMLState.IDLE) AND (ePMLUnitMode <> E_PMLUnitMode.AUTOMATIC));
	
	// 半自动模式按钮：（设备在空闲状态下且当前模式非半自动模式）
	fbButtonSemi.Enable(bEnable 		:= (ePMLState = E_PMLState.IDLE) AND (ePMLUnitMode <> E_PMLUnitMode.SEMIAUTOMATIC));
	
	// 手动模式按钮：（设备在空闲状态下且当前模式非手动模式）
	fbButtonManual.Enable(bEnable 		:= (ePMLState = E_PMLState.IDLE) AND (ePMLUnitMode <> E_PMLUnitMode.MANUAL));
	
	// 维护模式按钮：（设备在空闲状态下且当前模式非维护模式）
	fbButtonMaintenance.Enable(bEnable	:= (ePMLState = E_PMLState.IDLE) AND (ePMLUnitMode <> E_PMLUnitMode.MAINTENANCE));

// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="General_Init" Id="{f7a9950d-039f-427d-b3a2-00629d460290}">
      <Declaration><![CDATA[METHOD PRIVATE General_Init
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================

IF NOT bInit THEN
	
	// 各个子系统的执行必要参数，这些参数都是固定参数，所以只需要传递一次即可
		
		// 传递输送系统正位气缸的超时时间
		fbSeparateModule.tTimeOutOfClamp 			:= cSeparatingTimeOutClamp;
		
		// 传递输送系统栏杆气缸的超时时间
		fbSeparateModule.tTimeOutOfBarrier 			:= cSeparatingTimeOutBarrier;
		
		// 传递输送系统栏杆气缸维持在目标位（打开）的时间
		fbSeparateModule.tBarrierAtWorkPos			:= cSeparatingBarrierAtWork;

		// 传递金属分拣系统正位气缸的超时时间
		fbMetalSorting.tTimeOutOfCylinder 			:= cSortingTimeOutCylinder;		
		
		// 传递金属分拣系统出料皮带运转的时间
		fbMetalSorting.tAxisMovement 				:= cSortingMoveAxis;
		
		// 传递金属物料传感器检测到之后，到金属分拣系统气缸推出的延迟时间
		fbMetalSorting.tDelayOfSensor 				:= cSortingSensorDelay;
		
		// 传递塑料分拣系统正位气缸的超时时间
		fbPlasticSorting.tTimeOutOfCylinder 		:= cSortingTimeOutCylinder;
		
		// 传递塑料分拣系统出料皮带运转的时间
		fbPlasticSorting.tAxisMovement 				:= cSortingMoveAxis;
		
		// 传递塑料物料传感器检测到之后，到塑料分拣系统气缸推出的延迟时间
		fbPlasticSorting.tDelayOfSensor 			:= cSortingSensorDelay;

	// 初始化只执行一次
		bInit := TRUE;
END_IF

// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="General_ModuleInputs" Id="{56e24133-eabd-4c13-9cff-ceeea72d27e2}">
      <Declaration><![CDATA[METHOD PRIVATE General_ModuleInputs
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================
// 输送系统

	// 如果设备状态为运行状态，则输送系统的bExecute被置为TRUE
	fbSeparateModule.bExecute 			:= (ePMLState = E_PMLState.EXECUTE);
	
	// 每按下一次bStart按钮，输送系统的bSemiStart被置为TRUE，从而保证在半自动模式下，每按下一次bStart启动一次分拣周期
	fbSeparateModule.bSemiStart 		:= fbTriggerStart.Q;
	
	// 传递设定速度到输送系统（运输皮带）当中
	fbSeparateModule.fAxisVelocity 	:= fAxisVelo;

	// 传递皮带上物料的数量到输送系统当中
	fbSeparateModule.nBoxesOnTheWay 	:= nBoxesOnTheWay;
	
	// 通过两个分拣系统物料检测传感器延迟的输出从而判断物料已经到达对应的推出气缸正下方（用于暂停输送皮带的运转）
	fbSeparateModule.P_BoxUndertheCylinderPosition	:= fbPlasticSorting.fbSensorDelay.bOut 		 OR fbMetalSorting .fbSensorDelay.bOut;
	
	// 通过两个分拣系统推出气缸的到达目标位置标志位从而判断对应物料的推出气缸已经工作完成（用于重新启用输送皮带）
	fbSeparateModule.P_CylinderWorkDone				:= fbPlasticSorting.bState_CylinderAtWorkPos OR fbMetalSorting.bState_CylinderAtWorkPos;

// =========================================================
// 金属分拣系统
	
	// 传递设定速度到金属分拣系统（金属出料皮带）当中
	fbMetalSorting.fAxisVelocity 	:= fAxisVelo;

// =========================================================
// 塑料分拣系统

	// 传递设定速度到塑料分拣系统（塑料出料皮带）当中
	fbPlasticSorting.fAxisVelocity 	:= fAxisVelo;
	
// =========================================================
]]></ST>
      </Implementation>
    </Method>
    <Method Name="General_Requests" Id="{ec0d7499-7dd7-40ca-9ef4-9d582ddc9888}">
      <Declaration><![CDATA[METHOD PRIVATE General_Requests
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// ============================模式=============================

	// 检测启动按钮上升沿
	fbTriggerStart( CLK := fbButtonStart.bOut);
	
	// 如果关闭启动按钮为TRUE，且外部没用按下启动按钮，那么关闭启动按钮自动回归FALSE
	IF bStartButtonOff AND NOT fbButtonStart.bInput THEN
		bStartButtonOff := FALSE;
	END_IF
	
	// 如果检测到启动按钮的上升沿，那么将关闭启动按钮置为TRUE，也只有启动置回，才能将对应的状态传递给ePMLStateRequested
	IF fbTriggerStart.Q THEN
		bStartButtonOff := TRUE;
		
		// 如果设备被中止了，那么状态的请求则为需要清除中
		IF ePMLState = E_PMLState.ABORTED THEN
			ePMLStateRequested := E_PMLState.CLEARING;
		
		// 如果设备停止了，那么状态的请求则为需要复位中	
		ELSIF ePMLState = E_PMLState.STOPPED THEN
			ePMLStateRequested := E_PMLState.RESETTING;
		
		// 如果设备的状态为空闲，且设备已经使能上，那么状态的请求则为需要启动中	
		ELSIF ePMLState = E_PMLState.IDLE AND fbPowerSupply.bOut THEN
			ePMLStateRequested := E_PMLState.STARTING;
		END_IF
		
	// 即使设备没有接收到启动的指令，如果停止按钮按下，那么状态的请求则为需要停止中	
	ELSIF fbButtonStop.bOut THEN
		ePMLStateRequested := E_PMLState.STOPPING;
	
	// 	即使设备没有接收到启动的指令，如果复位按钮按下，那么状态的请求则为需要复位中	
	ELSIF fbButtonReset.bOut THEN
		ePMLStateRequested := E_PMLState.RESETTING;
	END_IF

// ============================状态=============================

	// 如果手动模式按钮按下，那么模式的请求则为手动模式	
	IF fbButtonManual.bOut THEN
		ePMLUnitModeRequested := E_PMLUnitMode.MANUAL;
	
	// 如果自动模式按钮按下，那么模式的请求则为自动模式		
	ELSIF fbButtonAuto.bOut THEN
		ePMLUnitModeRequested := E_PMLUnitMode.AUTOMATIC;
	
	// 如果半自动模式按钮按下，那么模式的请求则为半自动模式		
	ELSIF fbButtonSemi.bOut THEN
		ePMLUnitModeRequested := E_PMLUnitMode.SEMIAUTOMATIC;
	
	// 如果维护模式按钮按下，那么模式的请求则为维护模式		
	ELSIF fbButtonMaintenance.bOut THEN
		ePMLUnitModeRequested := E_PMLUnitMode.MAINTENANCE;
	END_IF
	
	// 如果有任何一个模式按钮的输出模拟，那么会调用模式切换功能块进行模式的切换
	IF fbButtonManual.bOut OR fbButtonAuto.bOut OR fbButtonSemi.bOut OR fbButtonMaintenance.bOut THEN
		fbUnitModeManager(	Execute 		:= TRUE,
							eModeCommand 	:= ePMLUnitModeRequested,
							ePMLState 		:= ePMLState);
	END_IF
	
	// 完成模式切换之后，从模式切换功能块当中传递输出到本地，并将模式切换功能块的Execute置回FALSE
	IF fbUnitModeManager.Done THEN
		ePMLUnitMode := fbUnitModeManager.eModeStatus;
		
		fbUnitModeManager(Execute := FALSE);
	END_IF
	
// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="General_SetOutput" Id="{72772210-8c98-415f-80b3-11606c64b47a}">
      <Declaration><![CDATA[METHOD PRIVATE General_SetOutput
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================
// 根据PackML状态的枚举体值输出对应的状态标志位

	bStopped 		:= (ePMLState = E_PMLState.STOPPED);
	bStarted 		:= (ePMLState = E_PMLState.EXECUTE);
	bReset 			:= (ePMLState = E_PMLState.RESETTING);
	bAborted 		:= (ePMLState = E_PMLState.ABORTED);
	bIdle 			:= (ePMLState = E_PMLState.IDLE AND fbPowerSupply.bOut);

// =========================================================
// 根据PackML模式的枚举体值输出对应的模式标志位

	bAuto 			:= (ePMLUnitMode = E_PMLUnitMode.AUTOMATIC);
	bSemi 			:= (ePMLUnitMode = E_PMLUnitMode.SEMIAUTOMATIC);
	bManual 		:= (ePMLUnitMode = E_PMLUnitMode.MANUAL);
	bMaintenance 	:= (ePMLUnitMode = E_PMLUnitMode.MAINTENANCE);

// =========================================================
// 输出使能以及压缩气缸信号处理功能块
		
	fbPowerSupply.SetOutput();
	fbComprAir.SetOutput();		

// =========================================================
// 调用各个子系统的输入输出关联方法

	fbSeparateModule.InputOutput();
	fbMetalSorting.InputOutput();
	fbPlasticSorting.InputOutput();

// =========================================================
// 输出各个按钮信号功能块

	fbButtonPower.SetOutput();
	fbButtonComprAir.SetOutput();	
	fbButtonStart.SetOutput();
	fbButtonStop.SetOutput();
	fbButtonReset.SetOutput();
	fbButtonAbort.SetOutput();
	fbButtonAuto.SetOutput();
	fbButtonSemi.SetOutput();
	fbButtonManual.SetOutput();
	fbButtonMaintenance.SetOutput();	
	
// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="General_StateMachine" Id="{83ced920-e247-461f-88ef-9152628959cc}">
      <Declaration><![CDATA[METHOD PRIVATE General_StateMachine
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================
	// 模式处理
	
CASE ePMLUnitMode OF
	
	// =========================================================	
	E_PMLUnitMode.AUTOMATIC:		
										  // ePMLStateRequested为 STARTING（在按下启动按钮的时）
				fbStateMachineAuto(	      Start 	:= ePMLStateRequested = E_PMLState.STARTING,	
					
										  // 按下停止按钮时						
									      Stop 	    := fbButtonStop.bOut,	
									
										  // 按下复位按钮时，或者ePMLStateRequested为 RESETTING（停止状态下再次按下启动也可触发）			
									      Reset 	:= fbButtonReset.bOut OR ePMLStateRequested = E_PMLState.RESETTING,		
										  
										  // ePMLStateRequested为 CLEARING（中止状态下按下启动按钮时）
									      Clear 	:= ePMLStateRequested = E_PMLState.CLEARING,				

										  // 按下中止按钮时，或设备在运行的时候出现错误			
									      Abort   	:= fbButtonAbort.bOut OR (bError AND ePMLState = E_PMLState.EXECUTE),	
										  
                                          ePMLState => ePMLState );

				
				Operating_Automatic();

	// =========================================================	
	E_PMLUnitMode.MANUAL:	
	
				// 同上
				fbStateMachineManual(     Start 	:= ePMLStateRequested = E_PMLState.STARTING,
										  Stop 	    := fbButtonStop.bOut,
										  Reset 	:= fbButtonReset.bOut OR ePMLStateRequested = E_PMLState.RESETTING,
										  Clear 	:= ePMLStateRequested = E_PMLState.CLEARING,
										  Abort 	:= fbButtonAbort.bOut OR (bError AND ePMLState = E_PMLState.EXECUTE),
                                          ePMLState => ePMLState);

				
				Operating_Manual();
	
	// =========================================================						
	E_PMLUnitMode.SEMIAUTOMATIC:	

				// 同上
				fbStateMachineSemiAuto(	  Start 	:= ePMLStateRequested = E_PMLState.STARTING,
									 	  Stop 	    := fbButtonStop.bOut,
										  Reset 	:= fbButtonReset.bOut OR ePMLStateRequested = E_PMLState.RESETTING,
										  Clear 	:= ePMLStateRequested = E_PMLState.CLEARING,
										  Abort 	:= fbButtonAbort.bOut OR (bError AND ePMLState = E_PMLState.EXECUTE),
                                          ePMLState => ePMLState);

				
				Operating_Semiautomatic();
	
	// =========================================================						
	E_PMLUnitMode.MAINTENANCE:	

				// 同上
				fbStateMachineMaintenance(Start 	:= ePMLStateRequested = E_PMLState.STARTING,
										  Stop      := fbButtonStop.bOut,
										  Reset 	:= fbButtonReset.bOut OR ePMLStateRequested = E_PMLState.RESETTING,
										  Clear 	:= ePMLStateRequested = E_PMLState.CLEARING,
										  Abort 	:= fbButtonAbort.bOut OR (bError AND ePMLState = E_PMLState.EXECUTE),
                                          ePMLState => ePMLState);

				
				Operating_Maintenance();
END_CASE

// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="Operating_Automatic" Id="{bccd8be0-ce53-430c-ad64-477063850b51}">
      <Declaration><![CDATA[METHOD PRIVATE Operating_Automatic
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================

CASE ePMLState OF
	
	// ========================空闲状态=================================
	E_PMLState.IDLE:
	
				// 如果上一个周期中，是用复位来进入空闲状态时，那么先让各个子系统的复位方法以FALSE的形式调用。顺便将StateComplete置回FALSE
				IF bResetIsSetToTrue THEN
					bResetIsSetToTrue := FALSE;
					
					fbSeparateModule.Reset(bReset := FALSE);							
					fbMetalSorting.Reset(bReset := FALSE);
					fbPlasticSorting.Reset(bReset := FALSE);
					
					fbStateMachineAuto.StateComplete := FALSE;	
				END_IF
	
	// ========================启动中状态================================
	E_PMLState.STARTING:
	
				// 以TRUE的形式调用各个子系统的Starting方法
				IF NOT bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := TRUE;
					
					fbSeparateModule.Starting(bStarting := TRUE);
					fbMetalSorting.Starting(bStarting := TRUE);
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF
				
				// 如果各个子系统未完成启动的流程，则继续以TRUE的形式调用各个子系统的Starting方法
				IF NOT fbSeparateModule.bState_StartingDone THEN		
					fbSeparateModule.Starting(bStarting := TRUE);
				END_IF	
				IF NOT fbMetalSorting.bState_StartingDone THEN
					fbMetalSorting.Starting(bStarting := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_StartingDone THEN
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF

				// 如果所有子系统都完成了启动，那StateComplete则为TRUE。代表启动完成。状态会经过状态机功能块自动进入EXECUTE
				IF fbSeparateModule.bState_StartingDone AND fbMetalSorting.bState_StartingDone AND fbPlasticSorting.bState_StartingDone THEN
					fbStateMachineAuto.StateComplete := TRUE;
				END_IF

	// ==========================执行中状态===============================
	E_PMLState.EXECUTE:	
				
				// 进入运行状态之后，先将bStartingIsSetToTrue置为FALSE，再将各个子系统的启动方法以FALSE调用，同时StateComplete置为FALSE
				IF bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := FALSE;
					
					fbSeparateModule.Starting(bStarting := FALSE);
					fbMetalSorting.Starting(bStarting := FALSE);	
					fbPlasticSorting.Starting(bStarting := FALSE);
					
					fbStateMachineAuto.StateComplete := FALSE;
				END_IF
				
				// 调用各个子系统的自动方法
				fbSeparateModule.Automatic();
				fbMetalSorting.Automatic();
				fbPlasticSorting.Automatic();
				
				// 如果检测到被分割物料的上升沿，那么nBoxesOnTheWay会加1，代表输送带上有一个物料正在运输
				IF fbTriggerSeparated.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay + 1;
				END_IF
				
				// 如果检测到金属物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedM.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
				
				// 如果检测到塑料物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedP.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
						
	// =========================中止中状态================================
	E_PMLState.ABORTING:

				// 进入中止中状态之后，先将bHaltIsSetToTrue置为TRUE，再将各个子系统的Halt方法以TRUE调用
				IF NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;
					
					fbSeparateModule.Halt(bHalt := TRUE);
					fbMetalSorting.Halt(bHalt := TRUE);
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果各个子系统未完成停止的流程，则继续以TRUE的形式继续调用各个子系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone THEN
					fbSeparateModule.Halt(bHalt := TRUE);
				END_IF		
				IF NOT fbMetalSorting.bState_HaltDone THEN
					fbMetalSorting.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_HaltDone THEN
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果所有子系统都停止了，那StateComplete则为TRUE。代表中止完成。状态会经过状态机功能块自动进入ABORTED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone AND fbPlasticSorting.bState_HaltDone THEN
					fbStateMachineAuto.StateComplete := TRUE;
				END_IF
	
	// ========================中止状态=================================
	E_PMLState.ABORTED:
				
				// 进入中止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);
					fbMetalSorting.Halt(bHalt := FALSE);
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF
				
				// 将StateComplete置回FALSE
				IF fbStateMachineAuto.StateComplete THEN
					fbStateMachineAuto.StateComplete := FALSE;
				END_IF
	
	// =======================清除中状态================================
	E_PMLState.CLEARING:
				
				// 将StateComplete置为TRUE，这里清除中的过程是用Reseting代替
				fbStateMachineAuto.StateComplete := TRUE;
	
	// =========================正常的停止中状态================================
	E_PMLState.STOPPING:	
				
				// 如果检测到被分割物料的上升沿，那么nBoxesOnTheWay会加1，代表输送带上有一个物料正在运输
				IF fbTriggerSeparated.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay + 1;
				END_IF		
		
				// 如果检测到金属物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedM.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
				
				// 如果检测到塑料物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedP.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
				
					// 只有当nBoxesOnTheWay为0且bHaltIsSetToTrue为FALSE（没用以TRUE调用过Halt方法）的时候，将bHaltIsSetToTrue置为TRUE
				IF (nBoxesOnTheWay = 0) AND NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;
				END_IF
				
				// 如果输送系统没用完成停止，或者输送带上仍然有物料，那么继续调用输送系统的自动方法等待该流程执行完毕。当nBoxesOnTheWay为0，以TRUE调用输送系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone OR (nBoxesOnTheWay <> 0) THEN
					fbSeparateModule.Automatic();
					
					IF (nBoxesOnTheWay = 0) THEN
						fbSeparateModule.Halt(bHalt := TRUE);
					END_IF
				END_IF
				
				// 如果输送系统没用完成停止，或者输送带上仍然有物料，那么继续调用输送系统的自动方法等待该流程执行完毕。当nBoxesOnTheWay为0，以TRUE调用金属分拣系统的Halt方法
				IF NOT fbMetalSorting.bState_HaltDone OR (nBoxesOnTheWay <> 0) THEN
					fbMetalSorting.Automatic();
					
					IF (nBoxesOnTheWay = 0) THEN
						fbMetalSorting.Halt(bHalt := TRUE);
					END_IF
				END_IF
				
				// 如果输送系统没用完成停止，或者输送带上仍然有物料，那么继续调用输送系统的自动方法等待该流程执行完毕。当nBoxesOnTheWay为0，以TRUE调用塑料分拣系统的Halt方法
				IF NOT fbPlasticSorting.bState_HaltDone OR (nBoxesOnTheWay <> 0) THEN
					fbPlasticSorting.Automatic();
					
					IF (nBoxesOnTheWay = 0) THEN
						fbPlasticSorting.Halt(bHalt := TRUE);
					END_IF
				END_IF
				
				// 如果各个子系统都完成停止了，且输送带上没有物料了，StateComplete才会被置为TRUE，代表停止完成。状态会经过状态机功能块自动进入STOPPED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone
				AND fbPlasticSorting.bState_HaltDone AND (nBoxesOnTheWay = 0) THEN
					fbStateMachineAuto.StateComplete := TRUE;
				END_IF
					
	// ===========================停止状态==============================
	E_PMLState.STOPPED:	

				// 进入停止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);	
					fbMetalSorting.Halt(bHalt := FALSE);			
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF

				// 将StateComplete置回FALSE
				IF fbStateMachineAuto.StateComplete THEN
					fbStateMachineAuto.StateComplete := FALSE;	
				END_IF

	// =========================复位中状态================================
	E_PMLState.RESETTING:	

				// 进入复位中状态之后，先将bResetIsSetToTrue置为TRUE，再将各个子系统的Reset方法以TRUE调用
				IF NOT bResetIsSetToTrue THEN
					bResetIsSetToTrue := TRUE;
					
					fbSeparateModule.Reset(bReset := TRUE);							
					fbMetalSorting.Reset(bReset := TRUE);
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF
				
				// 如果各个子系统未完成复位的流程，则继续以TRUE的形式继续调用各个子系统的Reset方法
				IF NOT fbSeparateModule.bState_ResetDone THEN
					fbSeparateModule.Reset(bReset := TRUE);
				END_IF			
				IF NOT fbMetalSorting.bState_ResetDone THEN
					fbMetalSorting.Reset(bReset := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_ResetDone THEN
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF
				
				// 如果各个子系统都完成复位了，且所有气缸都回到基始位了，那么nBoxesOnTheWay也一并清零。同时，将StateComplete置为TRUE
				IF fbSeparateModule.bState_ResetDone AND fbMetalSorting.bState_ResetDone AND fbPlasticSorting.bState_ResetDone 
				AND fbSeparateModule.bState_ClampAtBasePos AND fbSeparateModule.bState_BarrierAtBasePos
				AND fbMetalSorting.bState_CylinderAtBasePos AND fbPlasticSorting.bState_CylinderAtBasePos THEN
					nBoxesOnTheWay 						:= 0;
					fbStateMachineAuto.StateComplete 	:= TRUE;
				END_IF
END_CASE

// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="Operating_Maintenance" Id="{1b396f96-07d9-45ba-8b79-154e1a060d95}">
      <Declaration><![CDATA[METHOD PRIVATE Operating_Maintenance
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================

CASE ePMLState OF
	
	// ========================空闲状态=================================
	E_PMLState.IDLE:		

				// 如果上一个周期中，是用复位来进入空闲状态时，那么先让各个子系统的复位方法以FALSE的形式调用。顺便将StateComplete置回FALSE
				IF bResetIsSetToTrue THEN
					bResetIsSetToTrue := FALSE;
					
					fbSeparateModule.Reset(bReset := FALSE);
					fbMetalSorting.Reset(bReset := FALSE);
					fbPlasticSorting.Reset(bReset := FALSE);
					
					fbStateMachineMaintenance.StateComplete := FALSE;
				END_IF
	
	// ========================启动中状态================================
	E_PMLState.STARTING:	

				// 以TRUE的形式调用各个子系统的Starting方法
				IF NOT bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := TRUE;
					
					fbSeparateModule.Starting(bStarting := TRUE);
					fbMetalSorting.Starting(bStarting := TRUE);
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF
				
				// 如果各个子系统未完成启动的流程，则继续以TRUE的形式调用各个子系统的Starting方法
				IF NOT fbSeparateModule.bState_StartingDone THEN
					fbSeparateModule.Starting(bStarting := TRUE);
				END_IF			
				IF NOT fbMetalSorting.bState_StartingDone THEN
					fbMetalSorting.Starting(bStarting := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_StartingDone THEN
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF

				// 如果所有子系统都完成了启动，那StateComplete则为TRUE。代表启动完成。状态会经过状态机功能块自动进入EXECUTE
				IF fbSeparateModule.bState_StartingDone AND fbMetalSorting.bState_StartingDone AND fbPlasticSorting.bState_StartingDone THEN
					fbStateMachineMaintenance.StateComplete := TRUE;
				END_IF

	// ==========================执行中状态===============================
	E_PMLState.EXECUTE:	

				// 进入运行状态之后，先将bStartingIsSetToTrue置为FALSE，再将各个子系统的启动方法以FALSE调用，同时StateComplete置为FALSE
				IF bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := FALSE;
					
					fbSeparateModule.Starting(bStarting := FALSE);
					fbMetalSorting.Starting(bStarting := FALSE);	
					fbPlasticSorting.Starting(bStarting := FALSE);
					
					fbStateMachineMaintenance.StateComplete := FALSE;
				END_IF
				
				// 调用各个子系统的维护方法
				fbSeparateModule.Maintenance();
				fbMetalSorting.Maintenance();
				fbPlasticSorting.Maintenance();
						
	// =========================中止中状态================================
	E_PMLState.ABORTING:	

				// 进入中止中状态之后，先将bHaltIsSetToTrue置为TRUE，再将各个子系统的Halt方法以TRUE调用
				IF NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;
					
					fbSeparateModule.Halt(bHalt := TRUE);
					fbMetalSorting.Halt(bHalt := TRUE);
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果各个子系统未完成停止的流程，则继续以TRUE的形式继续调用各个子系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone THEN
					fbSeparateModule.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_HaltDone THEN
					fbMetalSorting.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_HaltDone THEN
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果所有子系统都停止了，那StateComplete则为TRUE。代表中止完成。状态会经过状态机功能块自动进入ABORTED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone AND fbPlasticSorting.bState_HaltDone THEN
					fbStateMachineMaintenance.StateComplete := TRUE;
				END_IF
	
	// ========================中止状态=================================
	E_PMLState.ABORTED:	

				// 进入中止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);
					fbMetalSorting.Halt(bHalt := FALSE);
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF

				// 将StateComplete置回FALSE
				IF fbStateMachineMaintenance.StateComplete THEN
					fbStateMachineMaintenance.StateComplete := FALSE;
				END_IF
	
	// =======================清除中状态================================
	E_PMLState.CLEARING:
				
				// 将StateComplete置为TRUE，这里清除中的过程是用Reseting代替
				fbStateMachineAuto.StateComplete := TRUE;
	
	// =========================正常的停止中状态================================
	E_PMLState.STOPPING:	

				// 只有当bHaltIsSetToTrue为FALSE（没用以TRUE调用过Halt方法）的时候，才会以TRUE调用各个子系统的Halt方法
				IF NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;

					fbSeparateModule.Halt(bHalt := TRUE);				
					fbMetalSorting.Halt(bHalt := TRUE);				
					fbPlasticSorting.Halt(bHalt := TRUE);				
				END_IF

				// 如果各个子系统没用完成停止了。那么继续以TRUE调用输送系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone THEN
					fbSeparateModule.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_HaltDone THEN
					fbMetalSorting.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_HaltDone THEN
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果各个子系统都完成停止了，StateComplete才会被置为TRUE，代表停止完成。状态会经过状态机功能块自动进入STOPPED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone AND fbPlasticSorting.bState_HaltDone THEN
						fbStateMachineMaintenance.StateComplete := TRUE;
				END_IF
					
	// ===========================停止状态==============================
	E_PMLState.STOPPED:	

				// 进入停止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);	
					fbMetalSorting.Halt(bHalt := FALSE);			
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF

				// 将StateComplete置回FALSE
				IF fbStateMachineMaintenance.StateComplete THEN
					fbStateMachineMaintenance.StateComplete := FALSE;
				END_IF

	// =========================复位中状态================================
	E_PMLState.RESETTING:	

				// 进入复位中状态之后，先将bResetIsSetToTrue置为TRUE，再将各个子系统的Reset方法以TRUE调用
				IF NOT bResetIsSetToTrue THEN
					bResetIsSetToTrue := TRUE;
					
					fbSeparateModule.Reset(bReset := TRUE);							
					fbMetalSorting.Reset(bReset := TRUE);
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF
				
				// 如果各个子系统未完成复位的流程，则继续以TRUE的形式继续调用各个子系统的Reset方法
				IF NOT fbSeparateModule.bState_ResetDone THEN
					fbSeparateModule.Reset(bReset := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_ResetDone THEN
					fbMetalSorting.Reset(bReset := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_ResetDone THEN
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF
				
				// 如果各个子系统都完成复位了，且所有气缸都回到基始位了，那么将StateComplete置为TRUE
				IF fbSeparateModule.bState_ResetDone AND fbMetalSorting.bState_ResetDone AND fbPlasticSorting.bState_ResetDone 
				AND fbSeparateModule.bState_ClampAtBasePos AND fbSeparateModule.bState_BarrierAtBasePos
				AND fbMetalSorting.bState_CylinderAtBasePos AND fbPlasticSorting.bState_CylinderAtBasePos THEN
					fbStateMachineMaintenance.StateComplete := TRUE;
				END_IF
END_CASE

// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="Operating_Manual" Id="{1e9691a9-2d6e-4921-85dd-c1826082db83}">
      <Declaration><![CDATA[METHOD PRIVATE Operating_Manual
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================

CASE ePMLState OF
	
	// ========================空闲状态=================================
	E_PMLState.IDLE:		

				// 如果上一个周期中，是用复位来进入空闲状态时，那么先让各个子系统的复位方法以FALSE的形式调用。顺便将StateComplete置回FALSE
				IF bResetIsSetToTrue THEN
					bResetIsSetToTrue := FALSE;
					
					fbSeparateModule.Reset(bReset := FALSE);
					fbMetalSorting.Reset(bReset := FALSE);
					fbPlasticSorting.Reset(bReset := FALSE);
					
					fbStateMachineManual.StateComplete := FALSE;
				END_IF
	
	// ========================启动中状态================================
	E_PMLState.STARTING:	

				// 以TRUE的形式调用各个子系统的Starting方法
				IF NOT bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := TRUE;
					
					fbSeparateModule.Starting(bStarting := TRUE);
					fbMetalSorting.Starting(bStarting := TRUE);
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF

				// 如果各个子系统未完成启动的流程，则继续以TRUE的形式调用各个子系统的Starting方法
				IF NOT fbSeparateModule.bState_StartingDone THEN
					fbSeparateModule.Starting(bStarting := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_StartingDone THEN
					fbMetalSorting.Starting(bStarting := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_StartingDone THEN
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF

				// 如果所有子系统都完成了启动，那StateComplete则为TRUE。代表启动完成。状态会经过状态机功能块自动进入EXECUTE
				IF fbSeparateModule.bState_StartingDone AND fbMetalSorting.bState_StartingDone AND fbPlasticSorting.bState_StartingDone THEN
					fbStateMachineManual.StateComplete := TRUE;
				END_IF

	// ==========================执行中状态===============================
	E_PMLState.EXECUTE:	

				// 进入运行状态之后，先将bStartingIsSetToTrue置为FALSE，再将各个子系统的启动方法以FALSE调用，同时StateComplete置为FALSE
				IF bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := FALSE;
					
					fbSeparateModule.Starting(bStarting := FALSE);
					fbMetalSorting.Starting(bStarting := FALSE);
					fbPlasticSorting.Starting(bStarting := FALSE);
					
					fbStateMachineManual.StateComplete := FALSE;
				END_IF
				
				// 调用各个子系统的手动方法
				fbSeparateModule.Manual();
				fbMetalSorting.Manual();
				fbPlasticSorting.Manual();
						
	// =========================中止中状态================================
	E_PMLState.ABORTING:	

				// 进入中止中状态之后，先将bHaltIsSetToTrue置为TRUE，再将各个子系统的Halt方法以TRUE调用
				IF NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;
					
					fbSeparateModule.Halt(bHalt := TRUE);
					fbMetalSorting.Halt(bHalt := TRUE);
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果各个子系统未完成停止的流程，则继续以TRUE的形式继续调用各个子系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone THEN
					fbSeparateModule.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_HaltDone THEN
					fbMetalSorting.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_HaltDone THEN
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果所有子系统都停止了，那StateComplete则为TRUE。代表中止完成。状态会经过状态机功能块自动进入ABORTED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone AND fbPlasticSorting.bState_HaltDone THEN
					fbStateMachineManual.StateComplete := TRUE;
				END_IF
	
	// ========================中止状态=================================
	E_PMLState.ABORTED:	

				// 进入中止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);
					fbMetalSorting.Halt(bHalt := FALSE);
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF

				// 将StateComplete置回FALSE
				IF fbStateMachineManual.StateComplete THEN
					fbStateMachineManual.StateComplete := FALSE;
				END_IF
	
	// =======================清除中状态================================
	E_PMLState.CLEARING:
				
				// 将StateComplete置为TRUE，这里清除中的过程是用Reseting代替
				fbStateMachineAuto.StateComplete := TRUE;
	
	// =========================正常的停止中状态================================
	E_PMLState.STOPPING:	

				// 只有当bHaltIsSetToTrue为FALSE（没用以TRUE调用过Halt方法）的时候，才会以TRUE调用各个子系统的Halt方法
				IF NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;
					
					fbSeparateModule.Halt(bHalt := TRUE);				
					fbMetalSorting.Halt(bHalt := TRUE);				
					fbPlasticSorting.Halt(bHalt := TRUE);	
				END_IF

				// 如果各个子系统没用完成停止了。那么继续以TRUE调用输送系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone THEN
					fbSeparateModule.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_HaltDone THEN
					fbMetalSorting.Halt(bHalt := TRUE);
				END_IF			
				IF NOT fbPlasticSorting.bState_HaltDone THEN
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果各个子系统都完成停止了，StateComplete才会被置为TRUE，代表停止完成。状态会经过状态机功能块自动进入STOPPED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone AND fbPlasticSorting.bState_HaltDone THEN
					fbStateMachineManual.StateComplete := TRUE;
				END_IF
					
	// ===========================停止状态==============================
	E_PMLState.STOPPED:	
	
				// 进入停止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);
					fbMetalSorting.Halt(bHalt := FALSE);
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF

				// 将StateComplete置回FALSE
				IF fbStateMachineManual.StateComplete THEN
					fbStateMachineManual.StateComplete := FALSE;
				END_IF
				
	// =========================复位中状态================================
	E_PMLState.RESETTING:	

				// 进入复位中状态之后，先将bResetIsSetToTrue置为TRUE，再将各个子系统的Reset方法以TRUE调用
				IF NOT bResetIsSetToTrue THEN
					bResetIsSetToTrue := TRUE;
					
					fbSeparateModule.Reset(bReset := TRUE);							
					fbMetalSorting.Reset(bReset := TRUE);
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF
				
				// 如果各个子系统未完成复位的流程，则继续以TRUE的形式继续调用各个子系统的Reset方法
				IF NOT fbSeparateModule.bState_ResetDone THEN
					fbSeparateModule.Reset(bReset := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_ResetDone THEN
					fbMetalSorting.Reset(bReset := TRUE);
				END_IF				
				IF NOT fbPlasticSorting.bState_ResetDone THEN
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF

				// 如果各个子系统都完成复位了，且所有气缸都回到基始位了，那么将StateComplete置为TRUE				
				IF fbSeparateModule.bState_ResetDone AND fbMetalSorting.bState_ResetDone AND fbPlasticSorting.bState_ResetDone 
				AND fbSeparateModule.bState_ClampAtBasePos AND fbSeparateModule.bState_BarrierAtBasePos
				AND fbMetalSorting.bState_CylinderAtBasePos AND fbPlasticSorting.bState_CylinderAtBasePos THEN
					fbStateMachineManual.StateComplete := TRUE;
				END_IF
END_CASE

// =========================================================]]></ST>
      </Implementation>
    </Method>
    <Method Name="Operating_Semiautomatic" Id="{31fec0de-7486-4da4-aae1-2a1d5c6dc0eb}">
      <Declaration><![CDATA[METHOD PRIVATE Operating_Semiautomatic
VAR_INPUT
END_VAR
]]></Declaration>
      <Implementation>
        <ST><![CDATA[// =========================================================

CASE ePMLState OF
	
	// ========================空闲状态=================================
	E_PMLState.IDLE:		

				// 如果上一个周期中，是用复位来进入空闲状态时，那么先让各个子系统的复位方法以FALSE的形式调用。顺便将StateComplete置回FALSE
				IF bResetIsSetToTrue THEN
					bResetIsSetToTrue := FALSE;
					
					fbSeparateModule.Reset(bReset := FALSE);
					fbMetalSorting.Reset(bReset := FALSE);
					fbPlasticSorting.Reset(bReset := FALSE);
					
					fbStateMachineSemiAuto.StateComplete := FALSE;
				END_IF
	
	// ========================启动中状态================================
	E_PMLState.STARTING:	

				// 以TRUE的形式调用各个子系统的Starting方法
				IF NOT bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := TRUE;
					
					fbSeparateModule.Starting(bStarting := TRUE);
					fbMetalSorting.Starting(bStarting := TRUE);
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF

				// 如果各个子系统未完成启动的流程，则继续以TRUE的形式调用各个子系统的Starting方法
				IF NOT fbSeparateModule.bState_StartingDone THEN
					fbSeparateModule.Starting(bStarting := TRUE);
				END_IF			
				IF NOT fbMetalSorting.bState_StartingDone THEN
					fbMetalSorting.Starting(bStarting := TRUE);
				END_IF			
				IF NOT fbPlasticSorting.bState_StartingDone THEN
					fbPlasticSorting.Starting(bStarting := TRUE);
				END_IF

				// 如果所有子系统都完成了启动，那StateComplete则为TRUE。代表启动完成。状态会经过状态机功能块自动进入EXECUTE
				IF fbSeparateModule.bState_StartingDone AND fbMetalSorting.bState_StartingDone AND fbPlasticSorting.bState_StartingDone THEN
					fbStateMachineSemiAuto.StateComplete := TRUE;
				END_IF

	// ==========================执行中状态===============================
	E_PMLState.EXECUTE:	

				// 进入运行状态之后，先将bStartingIsSetToTrue置为FALSE，再将各个子系统的启动方法以FALSE调用，同时StateComplete置为FALSE
				IF bStartingIsSetToTrue THEN
					bStartingIsSetToTrue := FALSE;
					
					fbSeparateModule.Starting(bStarting := FALSE);
					fbMetalSorting.Starting(bStarting := FALSE);
					fbPlasticSorting.Starting(bStarting := FALSE);
					
					fbStateMachineSemiAuto.StateComplete := FALSE;
				END_IF
				
				// 调用各个子系统的半自动方法
				fbSeparateModule.Semiautomatic();
				fbMetalSorting.Semiautomatic();
				fbPlasticSorting.Semiautomatic();
				
				// 如果检测到被分割物料的上升沿，那么nBoxesOnTheWay会加1，代表输送带上有一个物料正在运输
				IF fbTriggerSeparated.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay + 1;
				END_IF
				
				// 如果检测到金属物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedM.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
				
				// 如果检测到塑料物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedP.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
						
	// =========================中止中状态================================
	E_PMLState.ABORTING:	

				// 进入中止中状态之后，先将bHaltIsSetToTrue置为TRUE，再将各个子系统的Halt方法以TRUE调用
				IF NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;
	
					fbSeparateModule.Halt(bHalt := TRUE);
					fbMetalSorting.Halt(bHalt := TRUE);
					fbPlasticSorting.Halt(bHalt := TRUE);		
				END_IF

				// 如果各个子系统未完成停止的流程，则继续以TRUE的形式继续调用各个子系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone THEN
					fbSeparateModule.Halt(bHalt := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_HaltDone THEN
					fbMetalSorting.Halt(bHalt := TRUE);
				END_IF			
				IF NOT fbPlasticSorting.bState_HaltDone THEN
					fbPlasticSorting.Halt(bHalt := TRUE);
				END_IF

				// 如果所有子系统都停止了，那StateComplete则为TRUE。代表中止完成。状态会经过状态机功能块自动进入ABORTED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone AND fbPlasticSorting.bState_HaltDone THEN
					fbStateMachineSemiAuto.StateComplete := TRUE;
				END_IF
	
	// ========================中止状态=================================
	E_PMLState.ABORTED:	

				// 进入中止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);
					fbMetalSorting.Halt(bHalt := FALSE);
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF
	
				// 将StateComplete置回FALSE			
				IF fbStateMachineSemiAuto.StateComplete THEN
					fbStateMachineSemiAuto.StateComplete := FALSE;
				END_IF
	
	// =======================清除中状态================================
	E_PMLState.CLEARING:
				
				// 将StateComplete置为TRUE，这里清除中的过程是用Reseting代替
				fbStateMachineAuto.StateComplete := TRUE;
	
	// =========================正常的停止中状态================================
	E_PMLState.STOPPING:	

				// 如果检测到被分割物料的上升沿，那么nBoxesOnTheWay会加1，代表输送带上有一个物料正在运输
				IF fbTriggerSeparated.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay + 1;
				END_IF
				
				// 如果检测到金属物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedM.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
				
				// 如果检测到塑料物料被分拣完成的上升沿，那么nBoxesOnTheWay会减1，代表输送带上少了一个正在运输的物料
				IF fbTriggerSelectedP.Q THEN
					nBoxesOnTheWay := nBoxesOnTheWay - 1;
				END_IF
				
				// 只有当nBoxesOnTheWay为0且bHaltIsSetToTrue为FALSE（没用以TRUE调用过Halt方法）的时候，将bHaltIsSetToTrue置为TRUE
				IF (nBoxesOnTheWay = 0) AND NOT bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := TRUE;				
				END_IF
				
				// 如果输送系统没用完成停止，或者输送带上仍然有物料，那么继续调用输送系统的自动方法等待该流程执行完毕。当nBoxesOnTheWay为0，以TRUE调用输送系统的Halt方法
				IF NOT fbSeparateModule.bState_HaltDone OR (nBoxesOnTheWay <> 0) THEN
					fbSeparateModule.Semiautomatic();
					
					IF (nBoxesOnTheWay = 0) THEN
						fbSeparateModule.Halt(bHalt := TRUE);
					END_IF
				END_IF

				// 如果输送系统没用完成停止，或者输送带上仍然有物料，那么继续调用输送系统的自动方法等待该流程执行完毕。当nBoxesOnTheWay为0，以TRUE调用金属分拣系统的Halt方法				
				IF NOT fbMetalSorting.bState_HaltDone OR (nBoxesOnTheWay <> 0) THEN
					fbMetalSorting.Semiautomatic();
					
					IF (nBoxesOnTheWay = 0) THEN
						fbMetalSorting.Halt(bHalt := TRUE);
					END_IF
				END_IF

				// 如果输送系统没用完成停止，或者输送带上仍然有物料，那么继续调用输送系统的自动方法等待该流程执行完毕。当nBoxesOnTheWay为0，以TRUE调用塑料分拣系统的Halt方法				
				IF NOT fbPlasticSorting.bState_HaltDone OR (nBoxesOnTheWay <> 0) THEN
					fbPlasticSorting.Semiautomatic();
					
					IF (nBoxesOnTheWay = 0) THEN
						fbPlasticSorting.Halt(bHalt := TRUE);
					END_IF
				END_IF

				// 如果各个子系统都完成停止了，且输送带上没有物料了，StateComplete才会被置为TRUE，代表停止完成。状态会经过状态机功能块自动进入STOPPED
				IF fbSeparateModule.bState_HaltDone AND fbMetalSorting.bState_HaltDone
				AND fbPlasticSorting.bState_HaltDone AND (nBoxesOnTheWay = 0) THEN
					fbStateMachineSemiAuto.StateComplete := TRUE;
				END_IF
					
	// ===========================停止状态==============================
	E_PMLState.STOPPED:	
				
				// 进入停止状态之后，先将bHaltIsSetToTrue置回FALSE，再将各个子系统的Halt方法以FALSE调用
				IF bHaltIsSetToTrue THEN
					bHaltIsSetToTrue := FALSE;
					
					fbSeparateModule.Halt(bHalt := FALSE);
					fbMetalSorting.Halt(bHalt := FALSE);
					fbPlasticSorting.Halt(bHalt := FALSE);
				END_IF
				
				// 将StateComplete置回FALSE
				IF fbStateMachineSemiAuto.StateComplete THEN
					fbStateMachineSemiAuto.StateComplete := FALSE;
				END_IF

	// =========================复位中状态================================
	E_PMLState.RESETTING:	

				// 进入复位中状态之后，先将bResetIsSetToTrue置为TRUE，再将各个子系统的Reset方法以TRUE调用
				IF NOT bResetIsSetToTrue THEN
					bResetIsSetToTrue := TRUE;
					
					fbSeparateModule.Reset(bReset := TRUE);							
					fbMetalSorting.Reset(bReset := TRUE);
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF
	
				// 如果各个子系统未完成复位的流程，则继续以TRUE的形式继续调用各个子系统的Reset方法			
				IF NOT fbSeparateModule.bState_ResetDone THEN
					fbSeparateModule.Reset(bReset := TRUE);
				END_IF				
				IF NOT fbMetalSorting.bState_ResetDone THEN
					fbMetalSorting.Reset(bReset := TRUE);
				END_IF			
				IF NOT fbPlasticSorting.bState_ResetDone THEN
					fbPlasticSorting.Reset(bReset := TRUE);
				END_IF
				
				// 如果各个子系统都完成复位了，且所有气缸都回到基始位了，那么nBoxesOnTheWay也一并清零。同时，将StateComplete置为TRUE
				IF fbSeparateModule.bState_ResetDone AND fbMetalSorting.bState_ResetDone AND fbPlasticSorting.bState_ResetDone 
				AND fbSeparateModule.bState_ClampAtBasePos AND fbSeparateModule.bState_BarrierAtBasePos
				AND fbMetalSorting.bState_CylinderAtBasePos AND fbPlasticSorting.bState_CylinderAtBasePos THEN
					nBoxesOnTheWay 							:= 0;
					fbStateMachineSemiAuto.StateComplete 	:= TRUE;
				END_IF
END_CASE

// =========================================================]]></ST>
      </Implementation>
    </Method>
    <LineIds Name="FB_Machine">
      <LineId Id="555" Count="29" />
      <LineId Id="603" Count="21" />
      <LineId Id="627" Count="7" />
      <LineId Id="640" Count="0" />
      <LineId Id="312" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.CylicCheckInternal">
      <LineId Id="17" Count="1" />
      <LineId Id="5" Count="0" />
      <LineId Id="10" Count="0" />
      <LineId Id="7" Count="0" />
      <LineId Id="6" Count="0" />
      <LineId Id="11" Count="0" />
      <LineId Id="9" Count="0" />
      <LineId Id="8" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.General_Enable">
      <LineId Id="3" Count="10" />
      <LineId Id="91" Count="0" />
      <LineId Id="14" Count="1" />
      <LineId Id="102" Count="0" />
      <LineId Id="92" Count="0" />
      <LineId Id="16" Count="3" />
      <LineId Id="93" Count="0" />
      <LineId Id="20" Count="5" />
      <LineId Id="94" Count="0" />
      <LineId Id="26" Count="1" />
      <LineId Id="95" Count="1" />
      <LineId Id="28" Count="3" />
      <LineId Id="97" Count="0" />
      <LineId Id="32" Count="0" />
      <LineId Id="98" Count="1" />
      <LineId Id="33" Count="39" />
      <LineId Id="100" Count="1" />
      <LineId Id="74" Count="13" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.General_Init">
      <LineId Id="3" Count="5" />
      <LineId Id="38" Count="0" />
      <LineId Id="9" Count="0" />
      <LineId Id="11" Count="2" />
      <LineId Id="15" Count="5" />
      <LineId Id="42" Count="0" />
      <LineId Id="39" Count="0" />
      <LineId Id="22" Count="0" />
      <LineId Id="41" Count="0" />
      <LineId Id="40" Count="0" />
      <LineId Id="23" Count="3" />
      <LineId Id="43" Count="1" />
      <LineId Id="28" Count="0" />
      <LineId Id="45" Count="1" />
      <LineId Id="29" Count="5" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.General_ModuleInputs">
      <LineId Id="3" Count="4" />
      <LineId Id="47" Count="1" />
      <LineId Id="8" Count="2" />
      <LineId Id="12" Count="0" />
      <LineId Id="14" Count="2" />
      <LineId Id="49" Count="0" />
      <LineId Id="51" Count="3" />
      <LineId Id="50" Count="0" />
      <LineId Id="17" Count="4" />
      <LineId Id="23" Count="0" />
      <LineId Id="25" Count="4" />
      <LineId Id="31" Count="0" />
      <LineId Id="33" Count="1" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.General_Requests">
      <LineId Id="3" Count="4" />
      <LineId Id="63" Count="0" />
      <LineId Id="8" Count="3" />
      <LineId Id="64" Count="0" />
      <LineId Id="12" Count="2" />
      <LineId Id="65" Count="0" />
      <LineId Id="15" Count="2" />
      <LineId Id="66" Count="0" />
      <LineId Id="18" Count="2" />
      <LineId Id="67" Count="0" />
      <LineId Id="21" Count="2" />
      <LineId Id="68" Count="0" />
      <LineId Id="24" Count="3" />
      <LineId Id="69" Count="0" />
      <LineId Id="28" Count="4" />
      <LineId Id="70" Count="0" />
      <LineId Id="34" Count="3" />
      <LineId Id="71" Count="0" />
      <LineId Id="38" Count="2" />
      <LineId Id="72" Count="0" />
      <LineId Id="41" Count="2" />
      <LineId Id="73" Count="0" />
      <LineId Id="44" Count="3" />
      <LineId Id="74" Count="0" />
      <LineId Id="48" Count="5" />
      <LineId Id="75" Count="0" />
      <LineId Id="54" Count="5" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.General_SetOutput">
      <LineId Id="3" Count="31" />
      <LineId Id="36" Count="2" />
      <LineId Id="41" Count="3" />
      <LineId Id="47" Count="4" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.General_StateMachine">
      <LineId Id="3" Count="8" />
      <LineId Id="73" Count="0" />
      <LineId Id="71" Count="0" />
      <LineId Id="12" Count="0" />
      <LineId Id="74" Count="0" />
      <LineId Id="72" Count="0" />
      <LineId Id="13" Count="0" />
      <LineId Id="75" Count="1" />
      <LineId Id="14" Count="0" />
      <LineId Id="78" Count="0" />
      <LineId Id="77" Count="0" />
      <LineId Id="15" Count="0" />
      <LineId Id="79" Count="0" />
      <LineId Id="64" Count="0" />
      <LineId Id="17" Count="5" />
      <LineId Id="80" Count="0" />
      <LineId Id="23" Count="5" />
      <LineId Id="65" Count="0" />
      <LineId Id="30" Count="5" />
      <LineId Id="81" Count="0" />
      <LineId Id="36" Count="5" />
      <LineId Id="66" Count="0" />
      <LineId Id="43" Count="5" />
      <LineId Id="82" Count="0" />
      <LineId Id="49" Count="5" />
      <LineId Id="67" Count="0" />
      <LineId Id="56" Count="4" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.Operating_Automatic">
      <LineId Id="3" Count="4" />
      <LineId Id="9" Count="1" />
      <LineId Id="235" Count="0" />
      <LineId Id="11" Count="10" />
      <LineId Id="23" Count="1" />
      <LineId Id="236" Count="0" />
      <LineId Id="25" Count="7" />
      <LineId Id="237" Count="0" />
      <LineId Id="33" Count="2" />
      <LineId Id="37" Count="1" />
      <LineId Id="238" Count="0" />
      <LineId Id="41" Count="2" />
      <LineId Id="239" Count="0" />
      <LineId Id="44" Count="5" />
      <LineId Id="51" Count="1" />
      <LineId Id="240" Count="0" />
      <LineId Id="53" Count="9" />
      <LineId Id="241" Count="0" />
      <LineId Id="63" Count="3" />
      <LineId Id="242" Count="0" />
      <LineId Id="67" Count="3" />
      <LineId Id="243" Count="0" />
      <LineId Id="71" Count="3" />
      <LineId Id="244" Count="0" />
      <LineId Id="75" Count="4" />
      <LineId Id="81" Count="0" />
      <LineId Id="245" Count="0" />
      <LineId Id="82" Count="7" />
      <LineId Id="246" Count="0" />
      <LineId Id="90" Count="3" />
      <LineId Id="95" Count="2" />
      <LineId Id="99" Count="2" />
      <LineId Id="247" Count="0" />
      <LineId Id="102" Count="5" />
      <LineId Id="109" Count="1" />
      <LineId Id="248" Count="0" />
      <LineId Id="111" Count="7" />
      <LineId Id="249" Count="0" />
      <LineId Id="119" Count="6" />
      <LineId Id="250" Count="0" />
      <LineId Id="126" Count="2" />
      <LineId Id="130" Count="1" />
      <LineId Id="252" Count="0" />
      <LineId Id="132" Count="2" />
      <LineId Id="251" Count="0" />
      <LineId Id="253" Count="0" />
      <LineId Id="136" Count="3" />
      <LineId Id="254" Count="0" />
      <LineId Id="140" Count="2" />
      <LineId Id="255" Count="0" />
      <LineId Id="143" Count="2" />
      <LineId Id="150" Count="1" />
      <LineId Id="256" Count="0" />
      <LineId Id="152" Count="7" />
      <LineId Id="257" Count="0" />
      <LineId Id="160" Count="7" />
      <LineId Id="258" Count="0" />
      <LineId Id="168" Count="7" />
      <LineId Id="259" Count="0" />
      <LineId Id="176" Count="5" />
      <LineId Id="183" Count="0" />
      <LineId Id="260" Count="0" />
      <LineId Id="184" Count="7" />
      <LineId Id="261" Count="0" />
      <LineId Id="192" Count="5" />
      <LineId Id="199" Count="0" />
      <LineId Id="262" Count="0" />
      <LineId Id="200" Count="8" />
      <LineId Id="263" Count="0" />
      <LineId Id="209" Count="2" />
      <LineId Id="213" Count="2" />
      <LineId Id="217" Count="3" />
      <LineId Id="264" Count="0" />
      <LineId Id="221" Count="7" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.Operating_Maintenance">
      <LineId Id="3" Count="4" />
      <LineId Id="9" Count="0" />
      <LineId Id="194" Count="0" />
      <LineId Id="10" Count="11" />
      <LineId Id="23" Count="0" />
      <LineId Id="195" Count="0" />
      <LineId Id="24" Count="7" />
      <LineId Id="196" Count="0" />
      <LineId Id="32" Count="3" />
      <LineId Id="37" Count="2" />
      <LineId Id="41" Count="2" />
      <LineId Id="197" Count="0" />
      <LineId Id="44" Count="4" />
      <LineId Id="50" Count="1" />
      <LineId Id="198" Count="0" />
      <LineId Id="52" Count="10" />
      <LineId Id="199" Count="0" />
      <LineId Id="63" Count="4" />
      <LineId Id="69" Count="0" />
      <LineId Id="200" Count="0" />
      <LineId Id="70" Count="7" />
      <LineId Id="201" Count="0" />
      <LineId Id="78" Count="3" />
      <LineId Id="83" Count="2" />
      <LineId Id="87" Count="2" />
      <LineId Id="202" Count="0" />
      <LineId Id="90" Count="5" />
      <LineId Id="97" Count="0" />
      <LineId Id="203" Count="0" />
      <LineId Id="98" Count="7" />
      <LineId Id="204" Count="0" />
      <LineId Id="106" Count="4" />
      <LineId Id="205" Count="3" />
      <LineId Id="114" Count="2" />
      <LineId Id="118" Count="0" />
      <LineId Id="209" Count="0" />
      <LineId Id="119" Count="7" />
      <LineId Id="210" Count="0" />
      <LineId Id="127" Count="3" />
      <LineId Id="132" Count="2" />
      <LineId Id="136" Count="2" />
      <LineId Id="211" Count="0" />
      <LineId Id="139" Count="4" />
      <LineId Id="145" Count="1" />
      <LineId Id="212" Count="0" />
      <LineId Id="147" Count="7" />
      <LineId Id="213" Count="0" />
      <LineId Id="155" Count="4" />
      <LineId Id="161" Count="1" />
      <LineId Id="214" Count="0" />
      <LineId Id="163" Count="8" />
      <LineId Id="215" Count="0" />
      <LineId Id="172" Count="2" />
      <LineId Id="176" Count="2" />
      <LineId Id="180" Count="3" />
      <LineId Id="216" Count="0" />
      <LineId Id="184" Count="6" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.Operating_Manual">
      <LineId Id="3" Count="3" />
      <LineId Id="8" Count="1" />
      <LineId Id="194" Count="0" />
      <LineId Id="10" Count="11" />
      <LineId Id="23" Count="0" />
      <LineId Id="195" Count="0" />
      <LineId Id="24" Count="7" />
      <LineId Id="196" Count="0" />
      <LineId Id="32" Count="3" />
      <LineId Id="37" Count="2" />
      <LineId Id="41" Count="2" />
      <LineId Id="197" Count="0" />
      <LineId Id="44" Count="4" />
      <LineId Id="50" Count="1" />
      <LineId Id="198" Count="0" />
      <LineId Id="52" Count="10" />
      <LineId Id="199" Count="0" />
      <LineId Id="63" Count="3" />
      <LineId Id="68" Count="1" />
      <LineId Id="200" Count="0" />
      <LineId Id="70" Count="7" />
      <LineId Id="201" Count="0" />
      <LineId Id="78" Count="3" />
      <LineId Id="83" Count="2" />
      <LineId Id="87" Count="2" />
      <LineId Id="202" Count="0" />
      <LineId Id="90" Count="4" />
      <LineId Id="96" Count="1" />
      <LineId Id="203" Count="0" />
      <LineId Id="98" Count="7" />
      <LineId Id="204" Count="0" />
      <LineId Id="106" Count="4" />
      <LineId Id="205" Count="3" />
      <LineId Id="114" Count="1" />
      <LineId Id="117" Count="1" />
      <LineId Id="209" Count="0" />
      <LineId Id="119" Count="7" />
      <LineId Id="210" Count="0" />
      <LineId Id="127" Count="3" />
      <LineId Id="132" Count="2" />
      <LineId Id="136" Count="2" />
      <LineId Id="211" Count="0" />
      <LineId Id="139" Count="4" />
      <LineId Id="145" Count="1" />
      <LineId Id="213" Count="0" />
      <LineId Id="147" Count="7" />
      <LineId Id="212" Count="0" />
      <LineId Id="155" Count="4" />
      <LineId Id="161" Count="1" />
      <LineId Id="214" Count="0" />
      <LineId Id="163" Count="8" />
      <LineId Id="215" Count="0" />
      <LineId Id="172" Count="2" />
      <LineId Id="176" Count="2" />
      <LineId Id="180" Count="2" />
      <LineId Id="216" Count="0" />
      <LineId Id="183" Count="7" />
      <LineId Id="2" Count="0" />
    </LineIds>
    <LineIds Name="FB_Machine.Operating_Semiautomatic">
      <LineId Id="3" Count="3" />
      <LineId Id="8" Count="1" />
      <LineId Id="232" Count="0" />
      <LineId Id="10" Count="10" />
      <LineId Id="22" Count="1" />
      <LineId Id="233" Count="0" />
      <LineId Id="24" Count="7" />
      <LineId Id="234" Count="0" />
      <LineId Id="32" Count="3" />
      <LineId Id="37" Count="2" />
      <LineId Id="41" Count="2" />
      <LineId Id="235" Count="0" />
      <LineId Id="44" Count="4" />
      <LineId Id="50" Count="1" />
      <LineId Id="236" Count="0" />
      <LineId Id="52" Count="10" />
      <LineId Id="237" Count="0" />
      <LineId Id="63" Count="3" />
      <LineId Id="238" Count="12" />
      <LineId Id="77" Count="1" />
      <LineId Id="80" Count="1" />
      <LineId Id="251" Count="0" />
      <LineId Id="82" Count="7" />
      <LineId Id="252" Count="0" />
      <LineId Id="90" Count="3" />
      <LineId Id="95" Count="2" />
      <LineId Id="99" Count="2" />
      <LineId Id="253" Count="0" />
      <LineId Id="102" Count="4" />
      <LineId Id="108" Count="1" />
      <LineId Id="254" Count="0" />
      <LineId Id="110" Count="8" />
      <LineId Id="255" Count="0" />
      <LineId Id="119" Count="3" />
      <LineId Id="256" Count="5" />
      <LineId Id="129" Count="1" />
      <LineId Id="262" Count="0" />
      <LineId Id="131" Count="4" />
      <LineId Id="263" Count="0" />
      <LineId Id="136" Count="3" />
      <LineId Id="264" Count="0" />
      <LineId Id="140" Count="3" />
      <LineId Id="265" Count="0" />
      <LineId Id="144" Count="1" />
      <LineId Id="150" Count="1" />
      <LineId Id="266" Count="0" />
      <LineId Id="152" Count="6" />
      <LineId Id="267" Count="0" />
      <LineId Id="159" Count="7" />
      <LineId Id="268" Count="0" />
      <LineId Id="167" Count="7" />
      <LineId Id="269" Count="0" />
      <LineId Id="175" Count="5" />
      <LineId Id="182" Count="2" />
      <LineId Id="270" Count="0" />
      <LineId Id="185" Count="7" />
      <LineId Id="271" Count="0" />
      <LineId Id="193" Count="3" />
      <LineId Id="198" Count="1" />
      <LineId Id="272" Count="0" />
      <LineId Id="200" Count="8" />
      <LineId Id="273" Count="0" />
      <LineId Id="209" Count="2" />
      <LineId Id="213" Count="2" />
      <LineId Id="217" Count="3" />
      <LineId Id="274" Count="0" />
      <LineId Id="221" Count="7" />
      <LineId Id="2" Count="0" />
    </LineIds>
  </POU>
</TcPlcObject>