Merge branch 'develop' into feature/single-session-login

# Conflicts:
#	SicRT/Properties/AssemblyInfo.cs
#	SicRT/ReleaseNotes.md
#	SicUI/MainView.xaml
#	SicUI/MainViewModel.cs
#	SicUI/Properties/AssemblyInfo.cs
#	ThirdParty/MECF.Framework/MECF.Framework.Common.dll
#	ThirdParty/MECF.Framework/MECF.Framework.RT.Core.dll
#	ThirdParty/MECF.Framework/MECF.Framework.RT.EquipmentLibrary.dll
#	ThirdParty/MECF.Framework/MECF.Framework.Simulator.Core.dll
#	ThirdParty/MECF.Framework/MECF.Framework.UI.Client.dll
#	ThirdParty/MECF.Framework/MECF.Framework.UI.Core.dll
#	ThirdParty/MECF.Framework/Sicentury.Core.dll
This commit is contained in:
SL 2023-10-01 16:34:16 +08:00
commit 3531413790
93 changed files with 6343 additions and 6609 deletions

View File

@ -10,6 +10,7 @@ using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Schedulers;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.HiWinAligner;
using SicModules.Aligners.Routines;
namespace SicModules.Aligners
{

View File

@ -3,7 +3,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.Aligners
namespace SicModules.Aligners.Routines
{
public class AlignerAlignRoutine :AlignerBaseRoutine
{

View File

@ -6,7 +6,7 @@ using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.HiWinAligner;
namespace SicModules.Aligners
namespace SicModules.Aligners.Routines
{
public class AlignerBaseRoutine : ModuleRoutine, IRoutine
{

View File

@ -1,7 +1,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.Aligners
namespace SicModules.Aligners.Routines
{
public class AlignerHomeRoutine : AlignerBaseRoutine
{

View File

@ -11,6 +11,7 @@ using Aitex.Core.Utilities;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Schedulers;
using SicModules.Buffers.Routines;
namespace SicModules.Buffers
{

View File

@ -5,7 +5,7 @@ using Aitex.Core.RT.Device.Devices;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Equipment;
namespace SicModules.Buffers
namespace SicModules.Buffers.Routines
{
public class BufferCoolingRoutine : ModuleRoutine, IRoutine
{

View File

@ -3,7 +3,7 @@ using Aitex.Core.RT.Device;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Equipment;
namespace SicModules.Buffers
namespace SicModules.Buffers.Routines
{
class BufferHomeRoutine : ModuleRoutine, IRoutine
{

View File

@ -21,17 +21,17 @@
aiOutputVoltage="AI_PSU3OutputVoltage" aiOutputArms="AI_PSU3OutputArms" aiOutputPower="AI_PSU3OutputPower" iSimVoltage="AI_PSU3SimVoltage" aiSimArms="AI_PSU3SimArms" doStatus="DO_PSU3Enable" doReset="DO_PSU3Reset" aoConstant="AO_PSU3Constant" diStatus="DI_OuterHeaterEnableFB" diAlarm="DI_PSU3Alarm" AlarmText="Alarm68 PSU3 Alarm[DI-322]" diCommunicationError="DI_PSU3dpCommunicationError" commAlarmText="" doHeatEnable="DO_HeaterEnable" diHeatEnable="DI_PSUEnableFB" doRelatedEnable="DO_OuterHeaterEnable" />
</IoPSUs>
<IoSCRs classType="Aitex.Core.RT.Device.Devices.IoSCR" assembly="MECF.Framework.RT.EquipmentLibrary">
<IoSCR id="SCR1" display="SCR1" schematicId="SCR1" aioType="float"
<IoSCR id="SCR1" display="SCR1" schematicId="SCR1" aioType="float"
scBasePath="PM.{module}.Heater" scResLimitMax="SCR1ResistanceMax"
aiVoltage="AI_SCR1Voltage" aiArms="AI_SCR1Arms" aiPower="AI_SCR1Power" diStatus="DI_SCR1Status" doReset="DO_SCR1Reset" doStatus="DO_SCR1Enable" diAlarm="DI_SCR1Alarm" AlarmText="" />
<IoSCR id="SCR2" display="SCR2" schematicId="SCR2" aioType="float"
<IoSCR id="SCR2" display="SCR2" schematicId="SCR2" aioType="float"
scBasePath="PM.{module}.Heater" scResLimitMax="SCR2ResistanceMax"
aiVoltage="AI_SCR2Voltage" aiArms="AI_SCR2Arms" aiPower="AI_SCR2Power" diStatus="DI_SCR2Status" doReset="DO_SCR2Reset" doStatus="DO_SCR2Enable" diAlarm="DI_SCR2Alarm" AlarmText="" />
<IoSCR id="SCR3" display="SCR3" schematicId="SCR3" aioType="float"
<IoSCR id="SCR3" display="SCR3" schematicId="SCR3" aioType="float"
scBasePath="PM.{module}.Heater" scResLimitMax="SCR3ResistanceMax"
aiVoltage="AI_SCR3Voltage" aiArms="AI_SCR3Arms" aiPower="AI_SCR3Power" diStatus="DI_SCR3Status" doReset="DO_SCR3Reset" doStatus="DO_SCR3Enable" diAlarm="DI_SCR3Alarm" AlarmText="" />
</IoSCRs>
<IoHeats classType="Aitex.Core.RT.Device.Devices.IoHeat" assembly="MECF.Framework.RT.EquipmentLibrary">
<IoHeat module="" id="PMHeatEnable" display="HeatEnable" schematicId="HeatEnable" diEnable="DI_PSUEnableFB" doEnable="DO_HeaterEnable" />
</IoHeats>
@ -171,7 +171,7 @@
scAlarmLow=""
scAlarmHigh="SHFlowTemp"
scWarningOffset="WarningOffset"
scFilterDuration="FilterDuration" />
scFilterDuration="FilterDuration"/>
<IoSensorWaterFlowTemp id="FlowTemp2" module="" display="TopFlow(U2)" schematicId="ChamTopFlowTemp" unit="℃"
ai="AI_ChamTopFlowTemp"
@ -191,7 +191,7 @@
scBasePath="PM.{module}.CoolingWater"
scAlarmHigh="ChamMiddleFlow1Temp"
scWarningOffset="WarningOffset"
scFilterDuration="FilterDuration" />
scFilterDuration="FilterDuration"/>
<IoSensorWaterFlowTemp id="FlowTemp4" module="" display="MiddleFlow2(U4)" schematicId="ChamMiddleFlow2Temp" unit="℃"
ai="AI_ChamMiddleFlow2Temp"
@ -222,7 +222,7 @@
scAlarmHigh="SpareFlowTemp"
scWarningOffset="WarningOffset"
scFilterDuration="FilterDuration" />
<IoSensorWaterFlowTemp id="FlowTemp7" module="" display="PowerRod1Flow(U7)" schematicId="PowerRod1FlowTemp" unit="℃"
ai="AI_PowerRod1FlowTemp"
diFlowSW="DI_PowerRod1FlowSW"
@ -241,7 +241,7 @@
scBasePath="PM.{module}.CoolingWater"
scAlarmHigh="PowerRod2FlowTemp"
scWarningOffset="WarningOffset"
scFilterDuration="FilterDuration" />
scFilterDuration="FilterDuration"/>
<IoSensorWaterFlowTemp id="FlowTemp9" module="" display="Foreline2Flow(U9)" schematicId="Foreline2FlowTemp" unit="℃"
ai="AI_Foreline2FlowTemp"
@ -318,26 +318,26 @@
<IoPump id="Pump" module="" display="Pump" schematicId="Pump" unit="" aioType="" diDryPumpAlarm="DI_DryPumpAlarm" diPumpExhaustPress="DI_PumpExhaustPressSW" diDryPumpFlow="DI_DryPumpFlowSW" diDryPump1Running="DI_DryPump1Running" diDryPump1Warning="DI_DryPump1Warning" />
</IoPumps>
<IoPTOffsetAndKs classType="Aitex.Core.RT.Device.Devices.IoPTOffsetAndK" assembly="MECF.Framework.RT.EquipmentLibrary">
<IoPTOffsetAndK id="PT1_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT1_Offset" />
<IoPTOffsetAndK id="PT1_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT1_K" />
<IoPTOffsetAndK id="PT2_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT2_Offset" />
<IoPTOffsetAndK id="PT2_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT2_K" />
<IoPTOffsetAndK id="PT3_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT3_Offset" />
<IoPTOffsetAndK id="PT3_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT3_K" />
<IoPTOffsetAndK id="PT4_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT4_Offset" />
<IoPTOffsetAndK id="PT4_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT4_K" />
<IoPTOffsetAndK id="PT9_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT9_Offset" />
<IoPTOffsetAndK id="PT9_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT9_K" />
<IoPTOffsetAndK id="PT10_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT10_Offset" />
<IoPTOffsetAndK id="PT10_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT10_K" />
<IoPTOffsetAndK id="U1_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI3_Offset" />
<IoPTOffsetAndK id="U2_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI4_Offset" />
<IoPTOffsetAndK id="U3_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI5_Offset" />
<IoPTOffsetAndK id="U4_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI2_Offset" />
<IoPTOffsetAndK id="U5_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI6_Offset" />
<IoPTOffsetAndK id="U6_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI7_Offset" />
<IoPTOffsetAndK id="U7_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI8_Offset" />
<IoPTOffsetAndK id="U8_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI9_Offset" />
<IoPTOffsetAndK id="PT1_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT1_Offset" />
<IoPTOffsetAndK id="PT1_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT1_K" />
<IoPTOffsetAndK id="PT2_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT2_Offset" />
<IoPTOffsetAndK id="PT2_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT2_K" />
<IoPTOffsetAndK id="PT3_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT3_Offset" />
<IoPTOffsetAndK id="PT3_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT3_K" />
<IoPTOffsetAndK id="PT4_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT4_Offset" />
<IoPTOffsetAndK id="PT4_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT4_K" />
<IoPTOffsetAndK id="PT9_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT9_Offset" />
<IoPTOffsetAndK id="PT9_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT9_K" />
<IoPTOffsetAndK id="PT10_Offset" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT10_Offset" />
<IoPTOffsetAndK id="PT10_K" module="" display="PT" schematicId="" unit="" aioType="float" aoOffset="AO_PT10_K" />
<IoPTOffsetAndK id="U1_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI3_Offset" />
<IoPTOffsetAndK id="U2_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI4_Offset" />
<IoPTOffsetAndK id="U3_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI5_Offset" />
<IoPTOffsetAndK id="U4_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI2_Offset" />
<IoPTOffsetAndK id="U5_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI6_Offset" />
<IoPTOffsetAndK id="U6_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI7_Offset" />
<IoPTOffsetAndK id="U7_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI8_Offset" />
<IoPTOffsetAndK id="U8_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI9_Offset" />
<IoPTOffsetAndK id="U9_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI10_Offset" />
<IoPTOffsetAndK id="U10_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI11_Offset" />
<IoPTOffsetAndK id="U11_Water" module="" display="WaterTemp" schematicId="" unit="" aioType="float" aoOffset="AO_AI12_Offset" />
@ -437,7 +437,6 @@
<IoSensor id="SensorSCR1Alarm" module="" display="" schematicId="" unit="" aioType="" textOutTrigValue="true" di="DI_SCR1Alarm" infoText="" warningText="" alarmText="Alarm69 SCR1.Alarm [DI-323]" />
<IoSensor id="SensorSCR2Alarm" module="" display="" schematicId="" unit="" aioType="" textOutTrigValue="true" di="DI_SCR2Alarm" infoText="" warningText="" alarmText="Alarm70 SCR2.Alarm [DI-324]" />
<IoSensor id="SensorSCR3Alarm" module="" display="" schematicId="" unit="" aioType="" textOutTrigValue="true" di="DI_SCR3Alarm" infoText="" warningText="" alarmText="Alarm71 SCR3.Alarm [DI-325]" />
<IoSensor id="SensorGatewayCommunicationError" module="" display="" schematicId="" unit="" aioType="" textOutTrigValue="true" di="DI_GatewayCommunicationError" infoText="" warningText="" alarmText="Alarm78 TD-140 Gateway Communication Error [DI-327]" />
<IoSensor id="SensorPSUTCDPCommunicationError" module="" display="" schematicId="" unit="" aioType="" textOutTrigValue="true" di="DI_PSUdpCommunicationError" infoText="" warningText="" alarmText="Alarm72 PSU dp Communication Error [DI-328]" />
<IoSensor id="SensorSCRTCDPCommunicationError" module="" display="" schematicId="" unit="" aioType="" textOutTrigValue="true" di="DI_SCRTCDPCommunicationError" infoText="" warningText="" alarmText="Alarm73 SCR dp Communication Error [DI-329]" />
<IoSensor id="SensorPSU1dpCommunicationError" module="" display="" schematicId="" unit="" aioType="" textOutTrigValue="true" di="DI_PSU1dpCommunicationError" infoText="" warningText="" alarmText="Alarm74 PSU-1 dp Communication Error [DI-330]" />
@ -541,9 +540,9 @@
<IoSignalTowers classType="MECF.Framework.RT.EquipmentLibrary.Devices.IoSignalTower" assembly="MECF.Framework.RT.EquipmentLibrary">
<IoSignalTower id="SignalTower" module="PM1" display="SignalTower" schematicId="PMSignalTower"
eventFile="STEvents.xml"
doGreen="DO_TowerGreen"
doYellow="DO_TowerYellow"
doRed="DO_TowerRed"
doGreen="DO_TowerGreen"
doYellow="DO_TowerYellow"
doRed="DO_TowerRed"
doBuzzer="DO_Buzzer" />
</IoSignalTowers>
<IoChamberMoveBodys classType="Aitex.Core.RT.Device.Devices.IoChamberMoveBody" assembly="MECF.Framework.RT.EquipmentLibrary">
@ -596,52 +595,53 @@
<IoV99s classType="Aitex.Core.RT.Device.PmDevices.IoV99" assembly="MECF.Framework.RT.EquipmentLibrary">
<IoV99 id="Valve99" display="" schematicId="" unit="" valve1="V99" valve2="V99s" />
</IoV99s>
<IoInterLocks classType="Aitex.Core.RT.Device.Devices.IoInterLock" assembly="MECF.Framework.RT.EquipmentLibrary">
<IoInterLock id="PMInterLock" display="" schematicId="" unit="" doLidOpenRoutineSucceed="DO_PurgeRoutineSucceed"
doLidCloseRoutineSucceed="DO_CleanRoutineSucceed" doProcessRunning="DO_ProcessRunning" doPreprocessRunning="DO_PreprocessRunning"
doCyclePurgeRoutineRunning="DO_CyclePurgeRoutineRunning" doExchangeMoRoutineRunning="DO_ExchangeMoRoutineRunning"
doLidCloseRoutineRunning="DO_CleanRoutineRunning" doLidOpenRoutineRunning="DO_PurgeRoutineRunning"
doPumpDownRoutineRunning="DO_PumpRoutineRunning" doVentRoutineRunning="DO_VentRoutineRunning"
doPostProcessRunning="DO_PostProcessRunning" diServoDriverFaultSW="DI_ServoDriverFaultSW" diH2PressureSW="DI_H2PressureSW"
doVACTransferAllowed="DO_VACTransferAllowed" doATMTransferAllowed="DO_ATMTransferAllowed" doProcessIdleRunning="DO_ProcessIdleRunning"
doATMIdleRoutineRunning="DO_ATMIdleRoutineRunning" doVACIdleRoutineRunning="DO_VACIdleRoutineRunning" diPSU1Status="DI_PSU1Status"
diPSU2Status="DI_PSU2Status" diPSU3Status="DI_PSU3Status" diSCR1Status="DI_SCR1Status" diSCR2Status="DI_SCR2Status" diSCR3Status="DI_SCR3Status"
doPSU1Enable="DO_PSU1Enable" doPSU2Enable="DO_PSU2Enable" doPSU3Enable="DO_PSU3Enable" doSCR1Enable="DO_SCR1Enable"
doSCR2Enable="DO_SCR2Enable" doSCR3Enable="DO_SCR3Enable" doTCSSupply="DO_TCSFluidInfusion" aiTempCtrl1="AI_PSUTC"
doReactorATMTransferReady="DO_ReactorATMTransferReady" doReactorVACTransferReady="DO_ReactorVACTransferReady" diPMATMSW="DI_PMATMSW"
aiActualSpeed="AI_ActualSpeed" aiCurPos="AI_ConfinementRingCurPos" aiDownPos="AI_ConfinementRingDownPos" diPSUEnable="DI_PSUEnableFB" diHeaterTempBelow900CSW="DI_HeaterTempLowLimitSW"
doPMASlitDoorClosed="DO_SlitVlvClosed" diChamLidClosed="DI_ChamLidClosed" diConfinementRingDown="DI_ConfinementRingDown"
aiChamPress="AI_ActualPressure" doReactorPressRisingRate="DO_ReactorPressRisingRateFast" doUPSLowBattery="DO_UPSLowBattery"
doChamMiddleFlow2Temp="DO_ChamMiddleFlow2Temp"
doSHFlowTemp="DO_SHFlowTemp"
doChamTopFlowTemp="DO_ChamTopFlowTemp"
doChamMiddleFlow1Temp="DO_ChamMiddleFlow1Temp"
doChamBottomFlowTemp="DO_ChamBottomFlowTemp"
doSpareFlowTemp="DO_SpareFlowTemp"
doPowerRod1FlowTemp="DO_PowerRod1FlowTemp"
doPowerRod2FlowTemp="DO_PowerRod2FlowTemp"
doForelineFlowTemp ="DO_ForelineFlowTemp"
doElectrodeWFlowTemp="DO_ElectrodeWFlowTemp"
doTMPump1FlowTemp="DO_TMPump1FlowTemp"
doTransformerFlowTemp="DO_TransformerFlowTemp"
doTMTopLidTemp="DO_Spare1FlowTemp"
doTMBufferFlowTemp="DO_Spare2FlowTemp"
aiChamMiddleFlow2Temp="AI_ChamMiddleFlow2Temp"
aiSHFlowTemp="AI_SHFlowTemp"
aiChamTopFlowTemp="AI_ChamTopFlowTemp"
aiChamMiddleFlowTemp="AI_ChamMiddleFlow1Temp"
aiChamBottomFlowTemp="AI_ChamBottomFlowTemp"
aiForeline1FlowTemp="AI_Foreline1FlowTemp"
aiPowerRod1FlowTemp="AI_PowerRod1FlowTemp"
aiPowerRod2FlowTemp="AI_PowerRod2FlowTemp"
aiElectrodeWFlowTemp="AI_ElectrodeWFlowTemp"
aiTMPump1FlowTemp="AI_TMPumpFlowTemp"
aiTMPump2FlowTemp="AI_Foreline1FlowTemp"
aiTransformerFlowTemp="AI_TransformerFlowTemp"
aiForelineFlowTemp="AI_Foreline2FlowTemp"
aiTMTopLidTemp="AI_Spare1Temp"
aiTMBufferFlowTemp="AI_Spare2Temp" />
</IoInterLocks>
<IoInterLocks classType="Aitex.Core.RT.Device.Devices.IoInterLock" assembly="MECF.Framework.RT.EquipmentLibrary">
<IoInterLock id="PMInterLock" display="" schematicId="" unit="" doLidOpenRoutineSucceed="DO_PurgeRoutineSucceed"
doLidCloseRoutineSucceed="DO_CleanRoutineSucceed" doProcessRunning="DO_ProcessRunning" doPreprocessRunning="DO_PreprocessRunning"
doCyclePurgeRoutineRunning="DO_CyclePurgeRoutineRunning" doExchangeMoRoutineRunning="DO_ExchangeMoRoutineRunning"
doLidCloseRoutineRunning="DO_CleanRoutineRunning" doLidOpenRoutineRunning="DO_PurgeRoutineRunning"
doPumpDownRoutineRunning="DO_PumpRoutineRunning" doVentRoutineRunning="DO_VentRoutineRunning"
doPostProcessRunning="DO_PostProcessRunning" diServoDriverFaultSW="DI_ServoDriverFaultSW" diH2PressureSW="DI_H2PressureSW"
doVACTransferAllowed="DO_VACTransferAllowed" doATMTransferAllowed="DO_ATMTransferAllowed" doProcessIdleRunning="DO_ProcessIdleRunning"
doATMIdleRoutineRunning="DO_ATMIdleRoutineRunning" doVACIdleRoutineRunning="DO_VACIdleRoutineRunning" diPSU1Status="DI_PSU1Status"
diPSU2Status="DI_PSU2Status" diPSU3Status="DI_PSU3Status" diSCR1Status="DI_SCR1Status" diSCR2Status="DI_SCR2Status" diSCR3Status="DI_SCR3Status"
doPSU1Enable="DO_PSU1Enable" doPSU2Enable="DO_PSU2Enable" doPSU3Enable="DO_PSU3Enable" doSCR1Enable="DO_SCR1Enable"
doSCR2Enable="DO_SCR2Enable" doSCR3Enable="DO_SCR3Enable" doTCSSupply="DO_TCSFluidInfusion" aiTempCtrl1="AI_PSUTC"
doReactorATMTransferReady="DO_ReactorATMTransferReady" doReactorVACTransferReady="DO_ReactorVACTransferReady" diPMATMSW="DI_PMATMSW"
aiActualSpeed="AI_ActualSpeed" aiCurPos="AI_ConfinementRingCurPos" aiDownPos="AI_ConfinementRingDownPos" diPSUEnable="DI_PSUEnableFB" diHeaterTempBelow900CSW="DI_HeaterTempLowLimitSW"
doPMASlitDoorClosed="DO_SlitVlvClosed" diChamLidClosed="DI_ChamLidClosed" diConfinementRingDown="DI_ConfinementRingDown"
aiChamPress="AI_ActualPressure" doReactorPressRisingRate="DO_ReactorPressRisingRateFast" doUPSLowBattery="DO_UPSLowBattery"
doChamMiddleFlow2Temp="DO_ChamMiddleFlow2Temp"
doSHFlowTemp="DO_SHFlowTemp"
doChamTopFlowTemp="DO_ChamTopFlowTemp"
doChamMiddleFlow1Temp="DO_ChamMiddleFlow1Temp"
doChamBottomFlowTemp="DO_ChamBottomFlowTemp"
doSpareFlowTemp="DO_SpareFlowTemp"
doPowerRod1FlowTemp="DO_PowerRod1FlowTemp"
doPowerRod2FlowTemp="DO_PowerRod2FlowTemp"
doForelineFlowTemp ="DO_ForelineFlowTemp"
doElectrodeWFlowTemp="DO_ElectrodeWFlowTemp"
doTMPump1FlowTemp="DO_TMPump1FlowTemp"
doTransformerFlowTemp="DO_TransformerFlowTemp"
doTMTopLidTemp="DO_Spare1FlowTemp"
doTMBufferFlowTemp="DO_Spare2FlowTemp"
aiChamMiddleFlow2Temp="AI_ChamMiddleFlow2Temp"
aiSHFlowTemp="AI_SHFlowTemp"
aiChamTopFlowTemp="AI_ChamTopFlowTemp"
aiChamMiddleFlowTemp="AI_ChamMiddleFlow1Temp"
aiChamBottomFlowTemp="AI_ChamBottomFlowTemp"
aiForeline1FlowTemp="AI_Foreline1FlowTemp"
aiPowerRod1FlowTemp="AI_PowerRod1FlowTemp"
aiPowerRod2FlowTemp="AI_PowerRod2FlowTemp"
aiElectrodeWFlowTemp="AI_ElectrodeWFlowTemp"
aiTMPump1FlowTemp="AI_TMPumpFlowTemp"
aiTMPump2FlowTemp="AI_Foreline1FlowTemp"
aiTransformerFlowTemp="AI_TransformerFlowTemp"
aiForelineFlowTemp="AI_Foreline2FlowTemp"
aiTMTopLidTemp="AI_Spare1Temp"
aiTMBufferFlowTemp="AI_Spare2Temp"/>
</IoInterLocks>
</DeviceModelDefine>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@ using Aitex.Core.Utilities;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Schedulers;
using SicModules.EFEMs.Routines;
namespace SicModules.EFEMs
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class EFEMHomeRoutine : EfemBaseRoutine
{

View File

@ -14,7 +14,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
using SicModules.Devices;
using static MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase.RobotBaseDevice;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class EfemBaseRoutine : ModuleRoutine, IRoutine
{

View File

@ -7,10 +7,12 @@ using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadLocks;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.UnLoad;
using SicModules.LLs;
using SicModules.LLs.Routines;
using SicModules.TMs;
using SicModules.UnLoads;
using SicModules.UnLoads.Routines;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class EfemSlitValveRoutine : EfemBaseRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class TrayRobotHomeRoutine : EfemBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class TrayRobotMapRoutine : EfemBaseRoutine
{

View File

@ -6,8 +6,9 @@ using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using SicModules.LLs;
using SicModules.LLs.Routines;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class TrayRobotPickRoutine : EfemBaseRoutine
{

View File

@ -8,8 +8,9 @@ using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using SicModules.Devices;
using SicModules.LLs;
using SicModules.LLs.Routines;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class TrayRobotPlaceRoutine : EfemBaseRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class WaferRobotHomeRoutine : EfemBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class WaferRobotMapRoutine : EfemBaseRoutine
{

View File

@ -8,9 +8,11 @@ using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using SicModules.LLs;
using SicModules.LLs.Routines;
using SicModules.UnLoads;
using SicModules.UnLoads.Routines;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class WaferRobotPickRoutine : EfemBaseRoutine
{

View File

@ -9,9 +9,11 @@ using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.HiWinAligner;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using SicModules.LLs;
using SicModules.LLs.Routines;
using SicModules.UnLoads;
using SicModules.UnLoads.Routines;
namespace SicModules.EFEMs
namespace SicModules.EFEMs.Routines
{
public class WaferRobotPlaceRoutine : EfemBaseRoutine
{

View File

@ -8,6 +8,7 @@ using Aitex.Core.Utilities;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Fsm;
using SicModules.EFEMs.Routines;
namespace SicModules.EFEMs
{

View File

@ -8,6 +8,7 @@ using Aitex.Core.Utilities;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Fsm;
using SicModules.EFEMs.Routines;
namespace SicModules.EFEMs
{

View File

@ -13,6 +13,7 @@ using Aitex.Core.Utilities;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Schedulers;
using SicModules.LLs.Routines;
namespace SicModules.LLs
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadHomeRoutine : LoadLockBaseRoutine
{

View File

@ -11,7 +11,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
using SicModules.Devices;
using SicModules.TMs;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockBaseRoutine : ModuleRoutine, IRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockClawRoutine : LoadLockBaseRoutine
{

View File

@ -3,7 +3,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockGroupRoutine : LoadLockBaseRoutine
{

View File

@ -8,7 +8,7 @@ using MECF.Framework.Common.DBCore;
using MECF.Framework.Common.Equipment;
using SicModules.Devices;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockLeakCheckRoutine : LoadLockBaseRoutine
{

View File

@ -1,7 +1,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockLiftRoutine : LoadLockBaseRoutine
{

View File

@ -3,7 +3,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockPrepareTransferRoutine : LoadLockBaseRoutine
{

View File

@ -6,7 +6,7 @@ using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using SicModules.Devices;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockPumpRoutine : LoadLockBaseRoutine
{

View File

@ -6,7 +6,7 @@ using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using SicModules.Devices;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockPurgeRoutine : LoadLockBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockServoToRoutine : LoadLockBaseRoutine
{

View File

@ -1,4 +1,4 @@
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockTrayAlignerRoutine:LoadLockBaseRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Device.Unit;
using Aitex.Core.RT.Routine;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockTrayClawRoutine : LoadLockBaseRoutine
{

View File

@ -6,7 +6,7 @@ using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using SicModules.Devices;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadLockVentRoutine : LoadLockBaseRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadRotationHomeOffsetRoutine : LoadLockBaseRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.LLs
namespace SicModules.LLs.Routines
{
public class LoadSeparateRoutine : LoadLockBaseRoutine
{

View File

@ -6,6 +6,7 @@ using Aitex.Core.Common;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Fsm;
using Aitex.Core.RT.IOCore.Interlock;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
@ -171,6 +172,11 @@ namespace SicModules.PMs
get { return IsServiceIdle; }// !IsOnline; }
}
public bool DI206EqualsTrue_OR_DO177EqualsTrue
{
get { return (V73.Status || _pmInterLock.DoExchangeMoRoutineRunning); }
}
public override bool IsInit
{
get { return FsmState == (int)STATE.Init; }
@ -414,9 +420,24 @@ namespace SicModules.PMs
InitalDeviceFunc();
InitScChangeCallback();
return base.Initialize();
}
private void InitScChangeCallback()
{
// Bypass Interlock时自动Offline
SC.RegisterValueChangedCallback($"PM.{Module}.BypassInterlock", isBypassed =>
{
if (isBypassed is true && IsOnline)
{
PutOffline();
EV.PostWarningLog(Module, "Offline automatically due to interlock bypassed");
}
});
}
private void InitRoutine()
{
_purgeRoutine = new PMPurgeRoutine(ModuleHelper.Converter(Module), this);
@ -461,10 +482,13 @@ namespace SicModules.PMs
DATA.Subscribe($"{Module}.Status", () => StringFsmStatus.Replace("0", "").Replace("1", "").Replace("2", ""));
DATA.Subscribe($"{Module}.IsOnline", () => IsOnline);
DATA.Subscribe($"{Module}.IsService", () => IsServiceIdle);
DATA.Subscribe($"{Module}.DI206EqualsTrue_OR_DO177EqualsTrue", () => DI206EqualsTrue_OR_DO177EqualsTrue);
DATA.Subscribe($"{Module}.IsAlarm", () => IsAlarm);
DATA.Subscribe($"{Module}.IsWarning", () => IsWarning);
DATA.Subscribe($"{Module}.IsIdle", () => !IsWarning && (IsIdle || IsInit || IsSafety));
DATA.Subscribe($"{Module}.IsBypassInterlock", () => IsBypassInterlock);
DATA.Subscribe($"{Module}.IsBypassEnableTable", () => IsBypassEnableTable);
DATA.Subscribe($"{Module}.WaferSize", () => WaferManager.Instance.GetWaferSize(_module, 0).ToString());
@ -571,12 +595,12 @@ namespace SicModules.PMs
{
if (IsService)
{
EV.PostWarningLog(Module, $"{Module} is Service State,do not Online");
EV.PostWarningLog(Module, $"{Module} is Service State, can not be Online");
return false;
}
// 检查互锁如果互锁旁路则不能Online
DoIfInterlockEnabled(() =>
DoIfInterlockNotBypassed(() =>
{
IsOnline = true;
NotifyModuleOfflineCancellation.Cancel();
@ -761,7 +785,6 @@ namespace SicModules.PMs
//ProcessIdle
Transition(STATE.ProcessIdle, MSG.SelectRecipe, FsmSelectRecipe, STATE.ProcessIdle);
Transition(STATE.ProcessIdle, MSG.RunRecipe, FsmStartPreProcess, STATE.PreProcess);
//PreProcess
@ -820,6 +843,7 @@ namespace SicModules.PMs
Transition(STATE.StopHeat, MSG.Abort, FsmAbortTask, STATE.ProcessIdle);
}
private bool FsmToInit(object[] param)
{
return true;
@ -944,6 +968,13 @@ namespace SicModules.PMs
private bool FsmToProcessIdle(object[] param)
{
Result ret;
if (IsService)
{
EV.PostWarningLog(Module, $"{Module} is Service State, can not do ProcessIdle");
return false;
}
if (SC.GetValue<bool>("PM.IsProcessIdleRoutine"))
{
string RoutineFileName = SC.GetStringValue($"PM.{Module}.ProcessIdleFileName");
@ -1140,11 +1171,20 @@ namespace SicModules.PMs
if (IsServiceIdle)
{
// 如果退出Service模式需要检查Interlock是否启用如果未启用不能退出Service模式
DoIfInterlockEnabled(() => { IsServiceIdle = false; });
DoIfInterlockNotBypassed(() =>
{
IsServiceIdle = false;
// 如果退出Service模式Interlock信息以Warning等级输出
Singleton<InterlockManager>.Instance.SetEventLevel(Module, false);
});
}
else
{
IsServiceIdle = true;
// 如果退出Service模式Interlock信息以Info等级输出
Singleton<InterlockManager>.Instance.SetEventLevel(Module, true);
}
return true;
}
@ -1214,6 +1254,12 @@ namespace SicModules.PMs
// return false;
//}
if (IsBypassInterlock || IsBypassEnableTable)
{
EV.PostWarningLog(Module, $"Interlock bypassed, unable to start process");
return false;
}
_preprocessRoutine.Init((string)param[0], (bool)param[1], (bool)param[2]);
Result ret = StartRoutine(_preprocessRoutine);
if (ret == Result.FAIL || ret == Result.DONE)
@ -1231,6 +1277,12 @@ namespace SicModules.PMs
private bool FsmEnterProcess(object[] param)
{
if (IsService)
{
EV.PostWarningLog(Module, $"{Module} is Service State, can not enter Process");
return false;
}
WaferManager.Instance.UpdateWaferProcessStatus(ModuleHelper.Converter(Module), 0, WaferProcessStatus.InProcess);
_procDataStatManager.Begin(_recipeRunningInfo.RecipeName);
return true;

View File

@ -90,7 +90,8 @@ namespace SicModules.PMs
#region InterLock
[Tag("PMInterLock")] public IoInterLock _pmInterLock { get; set; }
[Tag("PMInterLock")]
public IoInterLock _pmInterLock { get; set; }
#endregion
@ -391,7 +392,6 @@ namespace SicModules.PMs
#endregion
#region CoolingWater
[Tag("FlowTemp1")]
@ -439,6 +439,7 @@ namespace SicModules.PMs
#endregion
Func<MemberInfo, bool> _hasTagAttribute;
Func<object, bool> _isTagAttribute;
@ -2136,7 +2137,7 @@ namespace SicModules.PMs
#region Enable Table中起保护作用的内容
////4.C (MO Line valve)(DO13 V43 常闭)(DO18 V48 常闭) {V43s,V48s同步增加条件}
//4.C (MO Line valve)(DO13 V43 常闭)(DO18 V48 常闭) {V43s,V48s同步增加条件}
if (V43 != null)
{
V43.FuncCheckInterLock = (setValue) =>
@ -2297,254 +2298,254 @@ namespace SicModules.PMs
//6.GasBox.Vent.Pump (DO45 V72常闭)
if (V72 != null)
{
V72.FuncCheckInterLock = (setValue) =>
{
if (setValue)
{
if (EPV2 != null && _ioThrottleValve != null)
{
//if (V72 != null)
//{
// V72.FuncCheckInterLock = (setValue) =>
// {
// if (setValue)
// {
// if (EPV2 != null && _ioThrottleValve != null)
// {
if (!EPV2.Status)
{
EV.PostWarningLog(Module, "Condition:EPV2 should be open!");
return false;
}
// if (!EPV2.Status)
// {
// EV.PostWarningLog(Module, "Condition:EPV2 should be open!");
// return false;
// }
if (!_ioThrottleValve.TVValveEnable)
{
EV.PostWarningLog(Module, "Condition:TV should be enable!");
return false;
}
}
else
{
return false;
}
}
// if (!_ioThrottleValve.TVValveEnable)
// {
// EV.PostWarningLog(Module, "Condition:TV should be enable!");
// return false;
// }
// }
// else
// {
// return false;
// }
// }
return true;
};
// return true;
// };
//返回True表明条件满足强制关阀
V72.FuncForceOpen = (curStatue) =>
{
if (curStatue)
{
//满足条件,强制执行
if (EPV2 != null && _ioThrottleValve != null)
{
if (!EPV2.Status || !_ioThrottleValve.TVValveEnable)
{
return true;
}
}
else
{
return false;
}
}
// //返回True表明条件满足强制关阀
// V72.FuncForceOpen = (curStatue) =>
// {
// if (curStatue)
// {
// //满足条件,强制执行
// if (EPV2 != null && _ioThrottleValve != null)
// {
// if (!EPV2.Status || !_ioThrottleValve.TVValveEnable)
// {
// return true;
// }
// }
// else
// {
// return false;
// }
// }
return false;
};
}
// return false;
// };
//}
//13.MO Source.VAc (DO16 V46常闭,DO20 V50常闭) [DI206 V73 常闭] {V46s,V50s同步增加条件}
if (V46 != null)
{
V46.FuncCheckInterLock = (setValue) =>
{
if (setValue)
{
if (V73 != null && V43 != null && _pmInterLock != null)
{
if (V43.Status)
{
EV.PostWarningLog(Module, "Condition:V43 should be closed");
return false;
}
//if (V46 != null)
//{
// V46.FuncCheckInterLock = (setValue) =>
// {
// if (setValue)
// {
// if (V73 != null && V43 != null && _pmInterLock != null)
// {
// if (V43.Status)
// {
// EV.PostWarningLog(Module, "Condition:V43 should be closed");
// return false;
// }
if (!IsServiceMode)
{
EV.PostWarningLog(Module, "Condition:PM should in service mode");
return false;
}
// if (!IsServiceMode)
// {
// EV.PostWarningLog(Module, "Condition:PM should in service mode");
// return false;
// }
if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
{
EV.PostWarningLog(Module, "Condition:V73 is open or Not ExchangeMo routine running ");
return false;
}
}
else
{
EV.PostWarningLog(Module, "Condition:V43,V73,V48 is not null!");
return false;
}
}
// if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
// {
// EV.PostWarningLog(Module, "Condition:V73 is open or Not ExchangeMo routine running ");
// return false;
// }
// }
// else
// {
// EV.PostWarningLog(Module, "Condition:V43,V73,V48 is not null!");
// return false;
// }
// }
return true;
};
// return true;
// };
//返回True表明条件满足强制关阀
V46.FuncForceOpen = (curStatue) =>
{
if (curStatue)
{
//满足条件,强制执行
if (V73 != null && V43 != null && _pmInterLock != null)
{
if (V43.Status || !IsServiceMode ||
(!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning)))
{
return true;
}
}
else
{
return false;
}
}
// //返回True表明条件满足强制关阀
// V46.FuncForceOpen = (curStatue) =>
// {
// if (curStatue)
// {
// //满足条件,强制执行
// if (V73 != null && V43 != null && _pmInterLock != null)
// {
// if (V43.Status || !IsServiceMode ||
// (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning)))
// {
// return true;
// }
// }
// else
// {
// return false;
// }
// }
return false;
};
}
// return false;
// };
//}
if (V46s != null)
{
V46s.FuncCheckInterLock = (setValue) =>
{
if (setValue)
{
if (V73 != null && V43 != null && _pmInterLock != null)
{
if (V43.Status)
{
EV.PostWarningLog(Module, "Condition:V43 should be closed");
return false;
}
//if (V46s != null)
//{
// V46s.FuncCheckInterLock = (setValue) =>
// {
// if (setValue)
// {
// if (V73 != null && V43 != null && _pmInterLock != null)
// {
// if (V43.Status)
// {
// EV.PostWarningLog(Module, "Condition:V43 should be closed");
// return false;
// }
if (!IsServiceMode)
{
EV.PostWarningLog(Module, "Condition:PM should in service mode");
return false;
}
// if (!IsServiceMode)
// {
// EV.PostWarningLog(Module, "Condition:PM should in service mode");
// return false;
// }
if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
{
EV.PostWarningLog(Module, "Condition:V73 is open or Not ExchangeMo routine running ");
return false;
}
}
else
{
EV.PostWarningLog(Module, "Condition:V43,V73,V48 is not null!");
return false;
}
}
// if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
// {
// EV.PostWarningLog(Module, "Condition:V73 is open or Not ExchangeMo routine running ");
// return false;
// }
// }
// else
// {
// EV.PostWarningLog(Module, "Condition:V43,V73,V48 is not null!");
// return false;
// }
// }
return true;
};
}
// return true;
// };
//}
if (V50 != null)
{
V50.FuncCheckInterLock = (setValue) =>
{
if (setValue)
{
if (V73 != null && V48 != null && _pmInterLock != null)
{
if (V48.Status)
{
EV.PostWarningLog(Module, "Condition:V48 should be closed");
return false;
}
//if (V50 != null)
//{
// V50.FuncCheckInterLock = (setValue) =>
// {
// if (setValue)
// {
// if (V73 != null && V48 != null && _pmInterLock != null)
// {
// if (V48.Status)
// {
// EV.PostWarningLog(Module, "Condition:V48 should be closed");
// return false;
// }
if (!IsServiceMode)
{
EV.PostWarningLog(Module, "Condition:PM should in service mode");
return false;
}
// if (!IsServiceMode)
// {
// EV.PostWarningLog(Module, "Condition:PM should in service mode");
// return false;
// }
if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
{
EV.PostWarningLog(Module, "Condition:V73 be open or Not ExchangeMo routine running ");
return false;
}
}
else
{
EV.PostWarningLog(Module, "Condition:V73,V43,V48 is not null!");
return false;
}
}
// if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
// {
// EV.PostWarningLog(Module, "Condition:V73 be open or Not ExchangeMo routine running ");
// return false;
// }
// }
// else
// {
// EV.PostWarningLog(Module, "Condition:V73,V43,V48 is not null!");
// return false;
// }
// }
return true;
};
// return true;
// };
//返回True表明条件满足强制关阀
V50.FuncForceOpen = (curStatue) =>
{
if (curStatue)
{
//满足条件,强制执行
if (V73 != null && V48 != null && _pmInterLock != null)
{
if (V48.Status || !IsServiceMode ||
(!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning)))
{
return true;
}
}
else
{
return false;
}
}
// //返回True表明条件满足强制关阀
// V50.FuncForceOpen = (curStatue) =>
// {
// if (curStatue)
// {
// //满足条件,强制执行
// if (V73 != null && V48 != null && _pmInterLock != null)
// {
// if (V48.Status || !IsServiceMode ||
// (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning)))
// {
// return true;
// }
// }
// else
// {
// return false;
// }
// }
return false;
};
// return false;
// };
}
//}
if (V50s != null)
{
V50s.FuncCheckInterLock = (setValue) =>
{
if (setValue)
{
if (V73 != null && V48 != null && _pmInterLock != null)
{
if (V48.Status)
{
EV.PostWarningLog(Module, "Condition:V48 should be closed");
return false;
}
//if (V50s != null)
//{
// V50s.FuncCheckInterLock = (setValue) =>
// {
// if (setValue)
// {
// if (V73 != null && V48 != null && _pmInterLock != null)
// {
// if (V48.Status)
// {
// EV.PostWarningLog(Module, "Condition:V48 should be closed");
// return false;
// }
if (!IsServiceMode)
{
EV.PostWarningLog(Module, "Condition:PM should in service mode");
return false;
}
// if (!IsServiceMode)
// {
// EV.PostWarningLog(Module, "Condition:PM should in service mode");
// return false;
// }
if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
{
EV.PostWarningLog(Module, "Condition:V73 be open or Not ExchangeMo routine running ");
return false;
}
}
else
{
EV.PostWarningLog(Module, "Condition:V73,V43,V48 should not be null!");
return false;
}
}
// if (!(V73.Status || !_pmInterLock.DoExchangeMoRoutineRunning))
// {
// EV.PostWarningLog(Module, "Condition:V73 be open or Not ExchangeMo routine running ");
// return false;
// }
// }
// else
// {
// EV.PostWarningLog(Module, "Condition:V73,V43,V48 should not be null!");
// return false;
// }
// }
return true;
};
}
// return true;
// };
//}
//if (V64 != null)
//{
@ -2638,121 +2639,121 @@ namespace SicModules.PMs
//}
//14.DOR Vac (DO48 V75常闭)[V76常闭]
if (V75 != null)
{
V75.FuncCheckInterLock = (setValue) =>
{
if (setValue)
{
if (V76 != null)
{
if (V76.Status)
{
EV.PostWarningLog(Module, "Condition:V76 should be closed");
return false;
}
}
else
{
EV.PostWarningLog(Module, "Condition:V76 should be not null");
return false;
}
}
//if (V75 != null)
//{
// V75.FuncCheckInterLock = (setValue) =>
// {
// if (setValue)
// {
// if (V76 != null)
// {
// if (V76.Status)
// {
// EV.PostWarningLog(Module, "Condition:V76 should be closed");
// return false;
// }
// }
// else
// {
// EV.PostWarningLog(Module, "Condition:V76 should be not null");
// return false;
// }
// }
return true;
};
// return true;
// };
//返回True表明条件满足强制关阀
V75.FuncForceOpen = (curStatue) =>
{
if (curStatue)
{
//满足条件,强制执行
if (V76 != null)
{
if (V76.Status)
{
return true;
}
}
else
{
return false;
}
}
// //返回True表明条件满足强制关阀
// V75.FuncForceOpen = (curStatue) =>
// {
// if (curStatue)
// {
// //满足条件,强制执行
// if (V76 != null)
// {
// if (V76.Status)
// {
// return true;
// }
// }
// else
// {
// return false;
// }
// }
return false;
};
}
// return false;
// };
//}
//15.DOR Refill (DO49 V76常闭)
if (V76 != null)
{
V76.FuncCheckInterLock = (setValue) =>
{
if (setValue)
{
if (SensorPMATMSW != null && _pmInterLock != null && V75 != null)
{
if (SensorPMATMSW.Value) //DI9=1
{
EV.PostWarningLog(Module, "Condition:DI-4 PM AT ATM ");
return false;
}
////15.DOR Refill (DO49 V76常闭)
//if (V76 != null)
//{
// V76.FuncCheckInterLock = (setValue) =>
// {
// if (setValue)
// {
// if (SensorPMATMSW != null && _pmInterLock != null && V75 != null)
// {
// if (SensorPMATMSW.Value) //DI9=1
// {
// EV.PostWarningLog(Module, "Condition:DI-4 PM AT ATM ");
// return false;
// }
if (!_pmInterLock.DoLidOpenRoutineSucceed)
{
EV.PostWarningLog(Module, "Condition:Purge Routine Succeed should be on ");
return false;
}
// if (!_pmInterLock.DoLidOpenRoutineSucceed)
// {
// EV.PostWarningLog(Module, "Condition:Purge Routine Succeed should be on ");
// return false;
// }
if (V75.Status)
{
EV.PostWarningLog(Module, "Condition:V75 should be Closed!");
return false;
}
}
else
{
EV.PostWarningLog(Module, "Condition:SensorPMATMSW should be not null");
return false;
}
}
// if (V75.Status)
// {
// EV.PostWarningLog(Module, "Condition:V75 should be Closed!");
// return false;
// }
// }
// else
// {
// EV.PostWarningLog(Module, "Condition:SensorPMATMSW should be not null");
// return false;
// }
// }
return true;
};
// return true;
// };
//返回True表明条件满足强制关阀
V76.FuncForceOpen = (curStatue) =>
{
if (curStatue)
{
//满足条件,强制执行
if (SensorPMATMSW != null)
{
if (SensorPMATMSW.Value)
{
return true;
}
}
// //返回True表明条件满足强制关阀
// V76.FuncForceOpen = (curStatue) =>
// {
// if (curStatue)
// {
// //满足条件,强制执行
// if (SensorPMATMSW != null)
// {
// if (SensorPMATMSW.Value)
// {
// return true;
// }
// }
//V76和V75只能开一个
if (V75 != null)
{
if (V75.Status)
{
return true;
}
}
else
{
return false;
}
}
// //V76和V75只能开一个
// if (V75 != null)
// {
// if (V75.Status)
// {
// return true;
// }
// }
// else
// {
// return false;
// }
// }
return false;
};
}
// return false;
// };
//}
//16.17.PM pump bypass valve force open (DO52 V27) Checked
if (V27 != null)
@ -2948,7 +2949,6 @@ namespace SicModules.PMs
#endregion Enable Table中起保护作用的内容
#region InterLock表中复合条件内容
////10.TMA.Vent (DO12 V42常闭)[V41常闭]

View File

@ -58,16 +58,16 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Aligners\AlignerAlignRoutine.cs" />
<Compile Include="Aligners\AlignerBaseRoutine.cs" />
<Compile Include="Aligners\AlignerHomeRoutine.cs" />
<Compile Include="Aligners\Routines\AlignerAlignRoutine.cs" />
<Compile Include="Aligners\Routines\AlignerBaseRoutine.cs" />
<Compile Include="Aligners\Routines\AlignerHomeRoutine.cs" />
<Compile Include="Aligners\AlignerModule.cs" />
<Compile Include="Aligners\AlignerModuleBase.cs" />
<Compile Include="Aligners\SicAligner.cs" />
<Compile Include="Buffers\BufferModule.cs" />
<Compile Include="Buffers\BufferModuleBase.cs" />
<Compile Include="Buffers\BufferCoolingRoutine.cs" />
<Compile Include="Buffers\BufferHomeRoutine.cs" />
<Compile Include="Buffers\Routines\BufferCoolingRoutine.cs" />
<Compile Include="Buffers\Routines\BufferHomeRoutine.cs" />
<Compile Include="Buffers\SicBuffer.cs" />
<Compile Include="Cassettes\CassetteModule.cs" />
<Compile Include="Cassettes\CassetteModuleBase.cs" />
@ -78,40 +78,40 @@
<Compile Include="Devices\SicAds.cs" />
<Compile Include="Devices\SiemensIoProvider.cs" />
<Compile Include="Devices\TcAds.cs" />
<Compile Include="EFEMs\EfemBaseRoutine.cs" />
<Compile Include="EFEMs\TrayRobotHomeRoutine.cs" />
<Compile Include="EFEMs\WaferRobotHomeRoutine.cs" />
<Compile Include="EFEMs\Routines\EfemBaseRoutine.cs" />
<Compile Include="EFEMs\Routines\TrayRobotHomeRoutine.cs" />
<Compile Include="EFEMs\Routines\WaferRobotHomeRoutine.cs" />
<Compile Include="EFEMs\TrayRobotModule.cs" />
<Compile Include="EFEMs\WaferRobotModule.cs" />
<Compile Include="EFEMs\EFEMModule.cs" />
<Compile Include="EFEMs\EFEMModuleBase.cs" />
<Compile Include="EFEMs\EfemSlitValveRoutine.cs" />
<Compile Include="EFEMs\EFEMHomeRoutine.cs" />
<Compile Include="EFEMs\Routines\EfemSlitValveRoutine.cs" />
<Compile Include="EFEMs\Routines\EFEMHomeRoutine.cs" />
<Compile Include="EFEMs\SicEFEM.cs" />
<Compile Include="EFEMs\SicEfemRobot.cs" />
<Compile Include="EFEMs\TrayRobotPickRoutine.cs" />
<Compile Include="EFEMs\TrayRobotPlaceRoutine.cs" />
<Compile Include="EFEMs\TrayRobotMapRoutine.cs" />
<Compile Include="EFEMs\WaferRobotPlaceRoutine.cs" />
<Compile Include="EFEMs\WaferRobotMapRoutine.cs" />
<Compile Include="EFEMs\WaferRobotPickRoutine.cs" />
<Compile Include="LLs\LoadHomeRoutine.cs" />
<Compile Include="LLs\LoadLockBaseRoutine.cs" />
<Compile Include="LLs\LoadLockClawRoutine.cs" />
<Compile Include="LLs\LoadLockGroupRoutine.cs" />
<Compile Include="LLs\LoadLockLeakCheckRoutine.cs" />
<Compile Include="LLs\LoadLockLiftRoutine.cs" />
<Compile Include="EFEMs\Routines\TrayRobotPickRoutine.cs" />
<Compile Include="EFEMs\Routines\TrayRobotPlaceRoutine.cs" />
<Compile Include="EFEMs\Routines\TrayRobotMapRoutine.cs" />
<Compile Include="EFEMs\Routines\WaferRobotPlaceRoutine.cs" />
<Compile Include="EFEMs\Routines\WaferRobotMapRoutine.cs" />
<Compile Include="EFEMs\Routines\WaferRobotPickRoutine.cs" />
<Compile Include="LLs\LoadLockModule.cs" />
<Compile Include="LLs\LoadLockModuleBase.cs" />
<Compile Include="LLs\LoadLockPrepareTransferRoutine.cs" />
<Compile Include="LLs\LoadLockPumpRoutine.cs" />
<Compile Include="LLs\LoadLockPurgeRoutine.cs" />
<Compile Include="LLs\LoadLockServoToRoutine.cs" />
<Compile Include="LLs\LoadLockTrayAlignerRoutine.cs" />
<Compile Include="LLs\LoadLockTrayClawRoutine.cs" />
<Compile Include="LLs\LoadLockVentRoutine.cs" />
<Compile Include="LLs\LoadRotationHomeOffsetRoutine.cs" />
<Compile Include="LLs\LoadSeparateRoutine.cs" />
<Compile Include="LLs\Routines\LoadHomeRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockBaseRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockClawRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockGroupRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockLeakCheckRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockLiftRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockPrepareTransferRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockPumpRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockPurgeRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockServoToRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockTrayAlignerRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockTrayClawRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockVentRoutine.cs" />
<Compile Include="LLs\Routines\LoadRotationHomeOffsetRoutine.cs" />
<Compile Include="LLs\Routines\LoadSeparateRoutine.cs" />
<Compile Include="LLs\SicLoadLock.cs" />
<Compile Include="PMs\PMModule.cs" />
<Compile Include="PMs\PMModuleDevice.cs" />
@ -160,43 +160,43 @@
<Compile Include="PMs\Utilities\UnitAlarmItem.cs" />
<Compile Include="PMs\Utilities\XmlConfig.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TMs\TMHomeRoutine.cs" />
<Compile Include="TMs\TMServoRoutine.cs" />
<Compile Include="TMs\Routines\TMBaseRoutine.cs" />
<Compile Include="TMs\Routines\TMHomeRoutine.cs" />
<Compile Include="TMs\Routines\TMLeakcheckRoutine.cs" />
<Compile Include="TMs\Routines\TMPressureBalancePidRoutine.cs" />
<Compile Include="TMs\Routines\TMPressureBalanceRoutine.cs" />
<Compile Include="TMs\Routines\TMPumpRoutine.cs" />
<Compile Include="TMs\Routines\TMPurgeRoutine.cs" />
<Compile Include="TMs\Routines\TMRobotExtendRoutine.cs" />
<Compile Include="TMs\Routines\TMRobotGoToRoutine.cs" />
<Compile Include="TMs\Routines\TMRobotHomeRoutine.cs" />
<Compile Include="TMs\Routines\TMRobotPickAndPlaceRoutine.cs" />
<Compile Include="TMs\Routines\TMRobotPickRoutine.cs" />
<Compile Include="TMs\Routines\TMRobotPlaceRoutine.cs" />
<Compile Include="TMs\Routines\TMRobotRetractRoutine.cs" />
<Compile Include="TMs\Routines\TMServoRoutine.cs" />
<Compile Include="TMs\Routines\TMSlitValveRoutine.cs" />
<Compile Include="TMs\Routines\TMVentRoutine.cs" />
<Compile Include="TMs\Routines\TMVerifySlitValveRoutine.cs" />
<Compile Include="TMs\SicTM.cs" />
<Compile Include="TMs\SicTMRobot.cs" />
<Compile Include="TMs\TMBaseRoutine.cs" />
<Compile Include="TMs\TMLeakcheckRoutine.cs" />
<Compile Include="TMs\TMModule.cs" />
<Compile Include="TMs\TMModuleBase.cs" />
<Compile Include="TMs\TMPressureBalancePidRoutine.cs" />
<Compile Include="TMs\TMPressureBalanceRoutine.cs" />
<Compile Include="TMs\TMPumpRoutine.cs" />
<Compile Include="TMs\TMPurgeRoutine.cs" />
<Compile Include="TMs\TMRobotExtendRoutine.cs" />
<Compile Include="TMs\TMRobotGoToRoutine.cs" />
<Compile Include="TMs\TMRobotHomeRoutine.cs" />
<Compile Include="TMs\TMRobotPickAndPlaceRoutine.cs" />
<Compile Include="TMs\TMRobotPickRoutine.cs" />
<Compile Include="TMs\TMRobotPlaceRoutine.cs" />
<Compile Include="TMs\TMRobotRetractRoutine.cs" />
<Compile Include="TMs\TMSlitValveRoutine.cs" />
<Compile Include="TMs\TMVentRoutine.cs" />
<Compile Include="TMs\TMVerifySlitValveRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadBaseRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadClawRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadCoolingRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadHomeRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadLeakCheckRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadLiftRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadPrepareTransferRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadPumpRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadPurgeRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadSeparateRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadServoToRoutine.cs" />
<Compile Include="UnLoads\Routines\UnLoadVentRoutine.cs" />
<Compile Include="UnLoads\SicUnLoad.cs" />
<Compile Include="UnLoads\UnLoadBaseRoutine.cs" />
<Compile Include="UnLoads\UnLoadClawRoutine.cs" />
<Compile Include="UnLoads\UnLoadHomeRoutine.cs" />
<Compile Include="UnLoads\UnLoadLeakCheckRoutine.cs" />
<Compile Include="UnLoads\UnLoadCoolingRoutine.cs" />
<Compile Include="UnLoads\UnLoadLiftRoutine.cs" />
<Compile Include="UnLoads\UnLoadModule.cs" />
<Compile Include="UnLoads\UnLoadModuleBase.cs" />
<Compile Include="UnLoads\UnLoadPrepareTransferRoutine.cs" />
<Compile Include="UnLoads\UnLoadPumpRoutine.cs" />
<Compile Include="UnLoads\UnLoadPurgeRoutine.cs" />
<Compile Include="UnLoads\UnLoadSeparateRoutine.cs" />
<Compile Include="UnLoads\UnLoadServoToRoutine.cs" />
<Compile Include="UnLoads\UnLoadVentRoutine.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Config\TM\DeviceModelSystem.xml">

View File

@ -17,7 +17,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
using SicModules.Devices;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMBaseRoutine : ModuleRoutine, IRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMHomeRoutine : TMBaseRoutine
{

View File

@ -12,7 +12,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
using SicModules.Devices;
using SicModules.LLs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMLeakCheckRoutine : ModuleRoutine, IRoutine
{

View File

@ -11,7 +11,7 @@ using Aitex.Core.Util;
using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMPressureBalancePidRoutine : TMBaseRoutine
{

View File

@ -5,7 +5,7 @@ using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMPressureBalanceRoutine : TMBaseRoutine
{

View File

@ -9,7 +9,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadLocks;
using SicModules.Devices;
using SicModules.LLs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMPumpRoutine : TMBaseRoutine
{

View File

@ -10,7 +10,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
using SicModules.Devices;
using SicModules.LLs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMPurgeRoutine : TMBaseRoutine
{

View File

@ -8,7 +8,7 @@ using MECF.Framework.Common.Schedulers;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadLocks;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMRobotExtendRoutine : TMBaseRoutine
{

View File

@ -8,7 +8,7 @@ using MECF.Framework.Common.Equipment;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMRobotGotoRoutine : TMBaseRoutine
{

View File

@ -8,7 +8,7 @@ using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMRobotHomeRoutine : TMBaseRoutine
{

View File

@ -5,7 +5,7 @@ using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMRobotPickAndPlaceRoutine : TMBaseRoutine
{

View File

@ -7,7 +7,7 @@ using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMRobotPickRoutine : TMBaseRoutine
{

View File

@ -6,9 +6,9 @@ using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using SicModules.LLs;
using SicModules.LLs.Routines;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMRobotPlaceRoutine : TMBaseRoutine
{

View File

@ -8,7 +8,7 @@ using MECF.Framework.Common.Schedulers;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadLocks;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMRobotRetractRoutine : TMBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMServoRoutine : TMBaseRoutine
{

View File

@ -12,9 +12,11 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadLocks;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.UnLoad;
using SicModules.LLs;
using SicModules.LLs.Routines;
using SicModules.UnLoads;
using SicModules.UnLoads.Routines;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMSlitValveRoutine : TMBaseRoutine
{

View File

@ -10,7 +10,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temps.P116PIDTC;
using SicModules.Devices;
using SicModules.LLs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMVentRoutine : TMBaseRoutine
{

View File

@ -9,7 +9,7 @@ using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadLocks;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs;
namespace SicModules.TMs
namespace SicModules.TMs.Routines
{
public class TMVerifySlitValveRoutine : ModuleRoutine, IRoutine
{

View File

@ -220,7 +220,7 @@ namespace SicModules.TMs
}
}
//检查InterLock
if (!SC.GetConfigItem("System.BypassInterlock").BoolValue && (module == ModuleName.PM1 || module == ModuleName.PMA) )
if (!SC.GetConfigItem("PM.PM1.BypassInterlock").BoolValue && (module == ModuleName.PM1 || module == ModuleName.PMA) )
{
if (!isOpen)
{
@ -232,7 +232,7 @@ namespace SicModules.TMs
}
}
if (!SC.GetConfigItem("System.BypassInterlock").BoolValue && (module == ModuleName.PM2 || module == ModuleName.PMB))
if (!SC.GetConfigItem("PM.PM2.BypassInterlock").BoolValue && (module == ModuleName.PM2 || module == ModuleName.PMB))
{
if (!isOpen)
{

View File

@ -18,6 +18,7 @@ using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Event;
using MECF.Framework.Common.PLC;
using SicModules.TMs.Routines;
using SicAds = SicModules.Devices.SicAds;
namespace SicModules.TMs
@ -84,6 +85,9 @@ namespace SicModules.TMs
};
public bool IsBypassInterlock => SC.GetValue<bool>($"TM.BypassInterlock");
public bool IsBypassEnableTable => SC.GetValue<bool>($"TM.BypassEnableTable");
public bool IsAlarm
{
@ -242,9 +246,24 @@ namespace SicModules.TMs
InitData();
InitScChangeCallback();
return base.Initialize();
}
private void InitScChangeCallback()
{
// Bypass Interlock时自动Offline
SC.RegisterValueChangedCallback($"TM.BypassInterlock", isBypassed =>
{
if (isBypassed is true && IsOnline)
{
PutOffline();
EV.PostWarningLog(Module, "Offline automatically due to interlock bypassed");
}
});
}
private void InitRoutine()
{
_gotoRoutine = new TMRobotGotoRoutine();
@ -554,6 +573,8 @@ namespace SicModules.TMs
DATA.Subscribe($"{Module}.IsError", () => IsError);
DATA.Subscribe($"{Module}.IsAlarm", () => IsAlarm);
DATA.Subscribe($"{Module}.IsWarning", () => IsWarning);
DATA.Subscribe($"{Module}.IsBypassInterlock", () => IsBypassInterlock);
DATA.Subscribe($"{Module}.IsBypassEnableTable", () => IsBypassEnableTable);
DATA.Subscribe($"{Name}.CurrentRoutineLoop", () => CurrentRoutineLoop);
DATA.Subscribe($"{Name}.CurrentRoutineLoopTotal", () => CurrentRoutineLoopTotal);
@ -1058,8 +1079,13 @@ namespace SicModules.TMs
private bool PutOnline()
{
if (IsBypassInterlock || IsBypassEnableTable)
{
EV.PostWarningLog(Module, $"Interlock is bypassed");
return false;
}
IsOnline = true;
//NotifyModuleOfflineCancellation.Cancel();
return true;
}

View File

@ -10,7 +10,7 @@ using SicModules.Devices;
using SicModules.EFEMs;
using SicModules.TMs;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadBaseRoutine : ModuleRoutine, IRoutine
{

View File

@ -2,7 +2,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadClawRoutine : UnLoadBaseRoutine
{

View File

@ -1,7 +1,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.Util;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadCoolingRoutine : UnLoadBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadHomeRoutine : UnLoadBaseRoutine
{

View File

@ -6,7 +6,7 @@ using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.DBCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadLeakCheckRoutine : UnLoadBaseRoutine
{

View File

@ -1,7 +1,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadLiftRoutine : UnLoadBaseRoutine
{

View File

@ -3,7 +3,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadPrepareTransferRoutine : UnLoadBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadPumpRoutine : UnLoadBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadPurgeRoutine : UnLoadBaseRoutine
{

View File

@ -1,7 +1,7 @@
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadSeparateRoutine : UnLoadBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadServoToRoutine : UnLoadBaseRoutine
{

View File

@ -4,7 +4,7 @@ using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace SicModules.UnLoads
namespace SicModules.UnLoads.Routines
{
public class UnLoadVentRoutine : UnLoadBaseRoutine
{

View File

@ -10,6 +10,7 @@ using Aitex.Core.Utilities;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Schedulers;
using SicModules.UnLoads.Routines;
namespace SicModules.UnLoads
{

View File

@ -42,7 +42,6 @@ Global
{5EAFA05F-C2C0-40B3-9C8F-46D8559148D0}.Release|x86.ActiveCfg = Release|Any CPU
{5EAFA05F-C2C0-40B3-9C8F-46D8559148D0}.Release|x86.Build.0 = Release|Any CPU
{FDF5BB48-689B-4B88-BABC-110F3DC07C67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FDF5BB48-689B-4B88-BABC-110F3DC07C67}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FDF5BB48-689B-4B88-BABC-110F3DC07C67}.Debug|x86.ActiveCfg = Debug|Any CPU
{FDF5BB48-689B-4B88-BABC-110F3DC07C67}.Debug|x86.Build.0 = Debug|Any CPU
{FDF5BB48-689B-4B88-BABC-110F3DC07C67}.Release|Any CPU.ActiveCfg = Release|Any CPU

View File

@ -20,8 +20,6 @@
<config default="false" name="EnableDataBaseClean" description="Enable DataBase Clean" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="180" name="DataKeepDays" description="Data Keep Days" max="10000" min="1" paramter="" tag="" unit="" type="Integer" />
<config default="true" name="IsIgnoreSaveDB" description="IO不存储到数据库" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="false" name="BypassInterlock" description="Bypass Interlock" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="false" name="BypassEnableTable" description="Bypass EnableTable" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="true" name="RecipeCascadeLoading" visible="false" description="启用瀑布流方式加载Recipe" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="false" name="RecipeSaveToDB" description="Recipe文件保存到数据库" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="true" name="IsPMHostSignalTower" description="是否使用PM PLC控制三色灯如果设定为False则使用TM PLC控制三色灯" max="" min="" paramter="" tag="" unit="" type="Bool" visible="false" />
@ -502,6 +500,8 @@
</configs>
</configs>
<configs name="PM1">
<config default="false" name="BypassInterlock" description="Bypass Interlock" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="false" name="BypassEnableTable" description="Bypass EnableTable" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="Sic" visible="false" name="RecipeChamberType" description="Recipe Chamber Type" max="" min="" paramter="" tag="" unit="" type="String" />
<config default="" name="LastRecipeName" description="last recipe name" max="" min="" paramter="" tag="" visible="false" unit="" type="String" />
<config default="127.0.01:102" name="SiemensIP" description="Siemens IP Address,Default IP:192.168.1.105:102" max="" min="" paramter="" tag="" unit="" type="String" />
@ -1034,6 +1034,8 @@
</configs>
<configs name="PM2">
<config default="false" name="BypassInterlock" description="Bypass Interlock" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="false" name="BypassEnableTable" description="Bypass EnableTable" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="Sic" visible="false" name="RecipeChamberType" description="Recipe Chamber Type" max="" min="" paramter="" tag="" unit="" type="String" />
<config default="" name="LastRecipeName" description="last recipe name" max="" min="" paramter="" tag="" visible="false" unit="" type="String" />
<config default="127.0.0.1:102" name="SiemensIP" description="Siemens IP Address,Default IP:192.168.1.205:102" max="" min="" paramter="" tag="" unit="" type="String" />
@ -1566,6 +1568,8 @@
</configs>
</configs>
<configs name="TM">
<config default="false" name="BypassInterlock" description="Bypass Interlock" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="false" name="BypassEnableTable" description="Bypass EnableTable" max="" min="" paramter="" tag="" unit="" type="Bool" />
<config default="200" name="ProcessPressure" description="传盘压力基准" max="1200" min="0" paramter="" tag="" unit="mbar" type="Double" />
<config default="20" name="VacuumPressureBaseOffset" description="传盘压力Offset" max="1200" min="0" paramter="" tag="" unit="mbar" type="Double" />
<config default="127.0.0.1:102" name="SiemensIP" description="Siemens IP Address,Default IP: 192.168.1.102" max="" min="" paramter="" tag="" unit="" type="String" />
@ -1757,7 +1761,7 @@
<config default="100" name="SlowFastVentSwitchPressure" description="充气的时候,快慢阀门切换的压力值" max="600" min="0" paramter="" tag="" unit="mbar" type="Double" />
<config default="980" name="VentBasePressure" description="充气的底压" max="1100" min="0" paramter="" tag="" unit="mbar" type="Double" />
<config default="100" name="SlowVentTimeout" description="慢充气超时时间" max="1000" min="0" paramter="" tag="" unit="s" type="Integer" />
<config default="100" name="FastVentTimeout" description="快充气超时时间" max="1000" min="0" paramter="" tag="" unit="s" type="Integer" />
<config default="100" name="FastVentTimeout" description="快充气超时时间" max="1000" min="0" paramter="" tag="" unit="s" type="Integer" visible="false"/>
<config default="10" name="VentDelayTime" description="充气到大气压后,继续充气多长时间" max="1000" min="0" paramter="" tag="" unit="s" type="Integer" />
<config default="250" name="RoutineTimeOut" description="Routine超时时间" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
</configs>

View File

@ -479,7 +479,6 @@ namespace SicRT.Equipments.Systems
DATA.Subscribe("System.IsAutoRunning", () => IsAutoRunning);
DATA.Subscribe("System.Modules", () => _modules);
DATA.Subscribe("System.SignalTowerData", () => _mainSignalTower?.DeviceData);
DATA.Subscribe("System.IsEngMode", () => _isEngMode);
}
private void InitOp()
@ -1366,22 +1365,9 @@ namespace SicRT.Equipments.Systems
{
MonitorPmTmInfo();
MonitorUPSAlarm();
MonitorEngMode();
return true;
}
private bool _isEngMode;
private void MonitorEngMode()
{
var isBypassInterlock = SC.GetValue<bool>("System.BypassInterlock");
var isBypassEnableTable = SC.GetValue<bool>("System.BypassEnableTable");
_isEngMode = isBypassInterlock || isBypassEnableTable;
}
private void MonitorPmTmInfo()
{
if (_pm1SlitValve != null)

View File

@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using Aitex.Common.Util;
using Aitex.Common.Util;
using Aitex.Core.RT.ConfigCenter;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.DataCollection;
@ -12,7 +10,6 @@ using Aitex.Core.RT.RecipeCenter;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using Aitex.Core.WCF;
using SicRT.Modules;
using MECF.Framework.Common.Account;
using MECF.Framework.Common.Communications;
using MECF.Framework.Common.Equipment;
@ -23,11 +20,7 @@ using MECF.Framework.RT.Core.Applications;
using MECF.Framework.RT.Core.Backend;
using MECF.Framework.RT.Core.IoProviders;
using SorterRT.Modules;
using SicRT.Equipments;
using SicRT.Equipments.Systems;
using System.IO;
using System.Reflection;
using DocumentFormat.OpenXml.ExtendedProperties;
using SicModules.PMs.RecipeExecutions;
using MECF.Framework.UI.Client.TrayThickness.HistoryData;
@ -70,9 +63,11 @@ namespace SicRT.Instances
IoManager.Instance.Initialize(PathManager.GetCfgDir() + "tm\\interlock.xml");
IoManager.Instance.Initialize(PathManager.GetCfgDir() + "pm\\pm1\\interlockPM1.xml");
IoManager.Instance.Initialize(
$"{PathManager.GetCfgDir()}pm\\pm1\\interlockPM1.xml");
IoManager.Instance.Initialize(PathManager.GetCfgDir() + "pm\\pm2\\interlockPM2.xml");
IoManager.Instance.Initialize(
$"{PathManager.GetCfgDir()}pm\\pm2\\interlockPM2.xml");
WaferManager.Instance.Initialize();

View File

@ -4,14 +4,6 @@ Manual-GE 手动通用版适用无EFEM设备
------
## 下次发行备忘
- Bug修复
- 修正Recipe单元格白名单功能不能工作的问题
- 新特性
- 优化Data History左侧列表中的水温名称
- 微调TM视图中的按钮位置
## Version 2023.09.22.01
- Bug修复
- 优化ReadOnly模式下屏蔽键盘输入的方法
@ -24,6 +16,36 @@ Manual-GE 手动通用版适用无EFEM设备
- 新特性
- 无
- 新特性
- interlock_bypass分腔体单独控制
- interlock表更新
- 不同recipe的data曲线数据对比功能
-
## Version 23.9.20.3
**2023-09-20**
- Bug修复
- 新特性
- 合并develop分支和Interlock分支
- 1:删除PM DI0和DI7 (DO2、40、41、54、112-119、111的互锁 (为了开腔维护时间可以吹扫)
-2 优化Data History左侧列表中的水温名称
- 3微调TM视图中的按钮位置
- 4.修改V75V76和V72TVInterlock
## Version 1.1.20.50
**2023-09-25**
- Bug修复
- 修正Recipe单元格白名单功能不能工作的问题
- 新特性
- 优化Data History左侧列表中的水温名称
- 微调TM视图中的按钮位置
## Version 1.1.19.49
**2023-09-04**

View File

@ -14,7 +14,7 @@
;Name and file
Name "Sic ${ver1}.${ver2}.${ver3}.${ver4}"
OutFile "Sic_手动通用无EFEM_Setup_v${ver1}.${ver2}.${ver3}.${ver4}.exe"
OutFile "Sic_手动通用_Setup_v${ver1}.${ver2}.${ver3}.${ver4}.exe"
;Default installation folder
;InstallDir "$LOCALAPPDATA\Modern UI Test"

View File

@ -20,7 +20,7 @@
Height="80"
Margin="-20,-24"
Source="Images/AtmRobotMultiLP/dock.png"
Visibility="{Binding ShowDock, Converter={StaticResource boolVisibilityConverter}}" />
Visibility="{Binding ShowDock, Converter={StaticResource BoolVisibilityConverter}}" />
<Common:AxisCanvas
x:Name="canvas1"

View File

@ -23,7 +23,7 @@
Height="80"
Margin="-20,-24"
Source="Images/AtmRobotMultiLP/dock.png"
Visibility="{Binding ShowDock, Converter={StaticResource boolVisibilityConverter}}" />
Visibility="{Binding ShowDock, Converter={StaticResource BoolVisibilityConverter}}" />
<!--<Image Width="38" Height="38" Source="Images/AtmRobotMultiLP/robotDock.png" />-->
<Common:AxisCanvas
x:Name="canvas1"

View File

@ -4,29 +4,21 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.caliburn.org"
xmlns:client="clr-namespace:SicUI.Client"
xmlns:converter="clr-namespace:MECF.Framework.UI.Client.Ctrlib.Converter;assembly=MECF.Framework.UI.Client"
xmlns:deviceControl="clr-namespace:Aitex.Core.UI.DeviceControl;assembly=MECF.Framework.UI.Core"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:wnd="http://OpenSEMI.Ctrlib.com/presentation"
xmlns:converters="clr-namespace:MECF.Framework.UI.Core.Converters;assembly=MECF.Framework.UI.Core"
xmlns:converter1="clr-namespace:SicUI.Converter"
xmlns:userControls="clr-namespace:Sicentury.Core.UserControls;assembly=Sicentury.Core"
xmlns:controls="clr-namespace:MECF.Framework.UI.Client.Ctrlib.Controls;assembly=MECF.Framework.UI.Client"
xmlns:converter="clr-namespace:SicUI.Converter"
Title="Sic Manual Edition"
WindowStartupLocation="CenterScreen"
WindowState="Maximized"
mc:Ignorable="d"
d:DesignHeight="980" d:DesignWidth="1900"
d:DataContext="{d:DesignInstance Type=client:MainViewModel, IsDesignTimeCreatable=False}">
<Window.Resources>
<client:CollectionLastIndexConverter x:Key="collectionLastIndexConverter" />
<converter:UnitOnlineBorderColorConverter x:Key="UnitOnlineBorderColorConverter" />
<converters:EngModeToBdThicknessConverter x:Key="BdThicknessConverter"/>
<converters:EngModeToBdColorConverter x:Key="BdColorConverter"/>
<converters:EngModeToBgWatermarkVisibilityConverter x:Key="WatermarkVisibilityConverter"/>
<converter1:IsReadOnlyModeToUserInfoNameBgConverter x:Key="IsReadOnlyModeToUserInfoNameBgConverter"/>
<converter:IsReadOnlyModeToUserInfoNameBgConverter x:Key="IsReadOnlyModeToUserInfoNameBgConverter" />
</Window.Resources>
<Grid Background="{DynamicResource MainArea_BG}">
@ -353,8 +345,6 @@
<Border
Margin="3,1"
Padding="1"
BorderBrush="{Binding IsEngMode, Converter={StaticResource BdColorConverter}}"
BorderThickness="{Binding IsEngMode, Converter={StaticResource BdThicknessConverter}}"
CornerRadius="4">
<Grid x:Name="MainPage">
<Grid.Style>
@ -450,588 +440,120 @@
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="102" />
<ColumnDefinition MinWidth="65" />
<ColumnDefinition Width="102" />
<ColumnDefinition MinWidth="65" />
<ColumnDefinition Width="102" />
<ColumnDefinition MinWidth="65" />
<ColumnDefinition Width="102" />
<ColumnDefinition MinWidth="65" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Label
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineSystem, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="System"
Style="{DynamicResource TopLable_LeftTop}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set All Module Online" IsEnabled="{Binding IsOnlineSystem, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="System" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set All Module Offline" IsEnabled="{Binding IsOnlineSystem}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="System" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>
<Label
Grid.Column="4"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineLL, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="Load"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set LoadLock Online" IsEnabled="{Binding IsOnlineLL, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="LoadLock" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set LoadLock Offline" IsEnabled="{Binding IsOnlineLL}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="LoadLock" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>
<Label
Grid.Column="2"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineTM, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="TM"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set TM Online" IsEnabled="{Binding IsOnlineTM, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="TM" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set TM Offline" IsEnabled="{Binding IsOnlineTM}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="TM" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>
<!--<Label
Grid.Column="8"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineAligner, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="Aligner"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set Aligner Online" IsEnabled="{Binding IsOnlineAligner, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="Aligner" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set Aligner Offline" IsEnabled="{Binding IsOnlineAligner}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="Aligner" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>-->
<!--<Label
Grid.Column="10"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineCassBL, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="CassBL"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set CassBL Online" IsEnabled="{Binding IsOnlineCassBL, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="CassBL" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set CassBL Offline" IsEnabled="{Binding IsOnlineCassBL}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="CassBL" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>-->
<!--<Label
Grid.Row="1"
Grid.Column="8"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineCassAL, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="CassAL"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set CassAL Online" IsEnabled="{Binding IsOnlineCassAL, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="CassAL" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set CassAL Offline" IsEnabled="{Binding IsOnlineCassAL}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="CassAL" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>-->
<!--<Label
Grid.Row="1"
Grid.Column="10"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineCassAR, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="CassAR"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set CassAR Online" IsEnabled="{Binding IsOnlineCassAR, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="CassAR" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set CassAR Offline" IsEnabled="{Binding IsOnlineCassAR}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="CassAR" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>-->
<Label
Grid.Row="0"
Grid.Column="6"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineBuffer, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="Buffer"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set Buffer Online" IsEnabled="{Binding IsOnlineBuffer, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="Buffer" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set Buffer Offline" IsEnabled="{Binding IsOnlineBuffer}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="Buffer" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>
<!--<Label
Grid.Column="12"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineWaferRobot, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="WaferRobot"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set WaferRobot Online" IsEnabled="{Binding IsOnlineWaferRobot, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="WaferRobot" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set WaferRobot Offline" IsEnabled="{Binding IsOnlineWaferRobot}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="WaferRobot" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>-->
<!--<Label
Grid.Row="1"
Grid.Column="12"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineTrayRobot, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="TrayRobot"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set TrayRobot Online" IsEnabled="{Binding IsOnlineTrayRobot, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="TrayRobot" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set TrayRobot Offline" IsEnabled="{Binding IsOnlineTrayRobot}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="TrayRobot" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>-->
<!--<Label
Grid.Column="4"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineEFEM, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="EFEM"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set Efem Online" IsEnabled="{Binding IsOnlineEFEM, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="EFEM" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set Buffer Offline" IsEnabled="{Binding IsOnlineEFEM}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="EFEM" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>-->
<Label
Grid.Row="1"
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="0"
Margin="1,1,0,1"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlinePM1, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="PM1"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set PM1 Online" IsEnabled="{Binding IsOnlinePM1, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="PM1" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set PM1 Offline" IsEnabled="{Binding IsOnlinePM1}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="PM1" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>
<Label
Grid.Row="1"
Caption="System"
ModuleName="System"
ModuleDescription="All Module"
IsOnline="{Binding IsOnlineSystem}"
Status="{Binding RtStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="1"
Caption="TM"
ModuleName="TM"
ModuleDescription="TM"
IsOnline="{Binding IsOnlineTM}"
Status="{Binding TMStatus}"
HasWarning="{Binding IsTMWarning}"
WarningTip="{Binding TMWarningMessage}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="2"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlinePM2, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="PM2"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set PM2 Online" IsEnabled="{Binding IsOnlinePM2, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="PM2" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set PM2 Offline" IsEnabled="{Binding IsOnlinePM2}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="PM2" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>
<Label
Grid.Row="1"
Grid.Column="4"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="{Binding IsOnlineUnLoad, Converter={StaticResource UnitOnlineBorderColorConverter}}"
Content="UnLoad"
Style="{DynamicResource TopLable}">
<Label.ContextMenu>
<ContextMenu>
<MenuItem Header="Set UnLoad Online" IsEnabled="{Binding IsOnlineUnLoad, Converter={StaticResource BoolReverseConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOnline">
<cal:Parameter Value="UnLoad" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
<MenuItem Header="Set UnLoad Offline" IsEnabled="{Binding IsOnlineUnLoad}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="SetModuleOffline">
<cal:Parameter Value="UnLoad" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</Label.ContextMenu>
</Label>
<Label
Grid.Row="2"
Caption="LL"
ModuleName="LoadLock"
ModuleDescription="LoadLock"
IsOnline="{Binding IsOnlineLL}"
Status="{Binding LLStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="0"
Grid.Column="3"
Caption="Buffer"
ModuleName="Buffer"
ModuleDescription="Buffer"
IsOnline="{Binding IsOnlineBuffer}"
Status="{Binding BufferStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="0"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="Gray"
Content="Log"
Style="{DynamicResource TopLable_LeftBottom}" />
Caption="PM1"
ModuleName="PM1"
ModuleDescription="PM1"
IsOnline="{Binding IsOnlinePM1}"
Status="{Binding PM1Status}"
HasWarning="{Binding IsPM1Warning}"
WarningTip="{Binding PM1WarningMessage}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="1"
Caption="PM2"
ModuleName="PM2"
ModuleDescription="PM2"
IsOnline="{Binding IsOnlinePM2}"
Status="{Binding PM2Status}"
HasWarning="{Binding IsPM2Warning}"
WarningTip="{Binding PM2WarningMessage}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<controls:ModuleStatusIndicator
Grid.Row="1"
Grid.Column="2"
Caption="UnLoad"
ModuleName="UnLoad"
ModuleDescription="UnLoad"
IsOnline="{Binding IsOnlineUnLoad}"
Status="{Binding UnLoadStatus}"
cal:Message.Attach="[SetOnline] = [Action SetModuleOnline($source, $eventArgs)];[SetOffline] = [Action SetModuleOffline($source, $eventArgs)]" />
<TextBox
Grid.Column="1"
VerticalContentAlignment="Center"
Background="{Binding RtStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding RtStatus}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="5"
VerticalContentAlignment="Center"
Background="{Binding LLStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding LLStatus}"
TextWrapping="Wrap" />
<TextBox
Grid.Column="3"
VerticalContentAlignment="Center"
Background="{Binding TMStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding TMStatus}"
TextWrapping="Wrap" />
<!--<TextBox
Grid.Column="5"
VerticalContentAlignment="Center"
Background="{Binding EFEMStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding EFEMStatus}"
TextWrapping="Wrap" />-->
<!--<TextBox
Grid.Column="9"
VerticalContentAlignment="Center"
Background="{Binding AlignerStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding AlignerStatus}"
TextWrapping="Wrap" />-->
<!--<TextBox
Grid.Column="11"
VerticalContentAlignment="Center"
Background="{Binding CassBLStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding CassBLStatus}"
TextWrapping="Wrap" />-->
<!--<TextBox
Grid.Column="13"
VerticalContentAlignment="Center"
Background="{Binding WaferRobotStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding WaferRobotStatus}"
TextWrapping="Wrap" />-->
<!--<TextBox
Grid.Row="1"
Grid.Column="9"
VerticalContentAlignment="Center"
Background="{Binding CassALStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding CassALStatus}"
TextWrapping="Wrap" />-->
<!--<TextBox
Grid.Row="1"
Grid.Column="11"
VerticalContentAlignment="Center"
Background="{Binding CassARStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding CassARStatus}"
TextWrapping="Wrap" />-->
<!--<TextBox
Grid.Row="1"
Grid.Column="13"
VerticalContentAlignment="Center"
Background="{Binding TrayRobotStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding TrayRobotStatus}"
TextWrapping="Wrap" />-->
<TextBox
Grid.Row="0"
Grid.Column="7"
VerticalContentAlignment="Center"
Background="{Binding BufferStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding BufferStatus}"
TextWrapping="Wrap" />
<TextBox
Grid.Row="1"
Grid.Column="1"
VerticalContentAlignment="Center"
Background="{Binding PM1StatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding PM1Status}"
TextWrapping="Wrap" />
<TextBox
Grid.Row="1"
Grid.Column="3"
VerticalContentAlignment="Center"
Background="{Binding PM2StatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding PM2Status}"
TextWrapping="Wrap" />
<TextBox
Grid.Row="1"
Grid.Column="5"
VerticalContentAlignment="Center"
Background="{Binding UnLoadStatusBackground}"
Style="{StaticResource TextBox_Top}"
Text="{Binding UnLoadStatus}"
TextWrapping="Wrap" />
<Grid
Grid.Row="2"
Grid.Column="1"
Grid.ColumnSpan="13">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="90" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<ComboBox
Height="Auto"
VerticalContentAlignment="Center"
FontSize="15"
ItemsSource="{Binding EventLogsView}"
SelectedIndex="{Binding EventLogsView.Count, Mode=OneWay, Converter={StaticResource collectionLastIndexConverter}}"
Style="{DynamicResource Top_ComboBox}"
Visibility="{Binding AllEventsVisibility}"/>
<DockPanel Grid.Row="2" Grid.ColumnSpan="4" Grid.Column="0" LastChildFill="True">
<Label
Grid.Column="1"
DockPanel.Dock="Left"
Width="100"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
BorderBrush="Gray"
Content="Log"
Style="{DynamicResource TopLable_LeftBottom}" />
<Button
DockPanel.Dock="Right"
Width="90"
Height="30"
Content="Buzzer Off"
Style="{DynamicResource TopButton}" Margin="2,0,0,0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="BuzzerOff" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button
DockPanel.Dock="Right"
Width="90"
Height="30"
Content="Reset"
Style="{DynamicResource TopButton}" Margin="2,0,0,0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="Reset" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Label
DockPanel.Dock="Right"
Width="90"
Height="30"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Style="{DynamicResource TopLable_RightBottom}">
@ -1044,36 +566,16 @@
Foreground="{DynamicResource FG_Black}"
IsChecked="{Binding IsShowAlarmEventOnly, Delay=10}" />
</Label>
<ComboBox
Height="Auto"
VerticalContentAlignment="Center"
FontSize="15"
ItemsSource="{Binding EventLogsView}"
SelectedIndex="{Binding EventLogsView.Count, Mode=OneWay, Converter={StaticResource collectionLastIndexConverter}}"
Style="{DynamicResource Top_ComboBox}"
Visibility="{Binding AllEventsVisibility}"/>
<Button
Grid.Column="2"
Width="90"
Height="30"
Margin="0"
Content="Reset"
Style="{DynamicResource TopButton}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="Reset" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button
Grid.Column="3"
Width="90"
Height="30"
Margin="0"
Content="Buzzer Off"
Style="{DynamicResource TopButton}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="BuzzerOff" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Grid>
</DockPanel>
</Grid>
<Label
Grid.Column="3"
@ -1083,26 +585,26 @@
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Style="{DynamicResource TopLable_SignalTower}">
<Viewbox Width="45" Height="80">
<deviceControl:AITSignalTower
<Viewbox Width="45" Height="80">
<deviceControl:AITSignalTower
Width="45"
Height="110"
DeviceData="{Binding SignalTowerData}" />
</Viewbox>
</Label>
</Viewbox>
</Label>
<Grid Grid.Column="4" Margin="5,10">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Border
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Border
Margin="2,4"
Background="{Binding IsReadOnlyMode, Converter={StaticResource IsReadOnlyModeToUserInfoNameBgConverter}}"
BorderBrush="{DynamicResource TopFrame_UserInfoBD}"
BorderThickness="1"
CornerRadius="5"
SnapsToDevicePixels="True">
<TextBlock
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontFamily="Arial"
@ -1110,19 +612,19 @@
Foreground="{DynamicResource TopFrame_TextColor}"
Text="{Binding User.LoginName}"
TextWrapping="NoWrap" />
</Border>
<Button
</Border>
<Button
Grid.Row="1"
Margin="2,4"
Content="Logout"
Style="{DynamicResource Logout_Button}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="ShowLogoutDialog" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Grid>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="ShowLogoutDialog" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Grid>
</Grid>
</Border>
</Grid>
@ -1131,13 +633,13 @@
Background="{DynamicResource MainArea_BG}"
IsHitTestVisible="{Binding IsReadOnlyMode, Converter={StaticResource BoolReverseConverter}}"
PreviewKeyDown="GdContentContainer_OnPreviewKeyDown">
<Border Visibility="{Binding IsEngMode, Converter={StaticResource WatermarkVisibilityConverter}}">
<Border.Background>
<Border>
<!--<Border.Background>
<ImageBrush ImageSource="/Resources/Images/interlock_bypass_watermark.png"
TileMode="Tile" Opacity="0.15" ViewportUnits="Absolute"
Viewport="0,-20,250,200" Viewbox="0,0,1.5,1.5" Stretch="Fill"
ViewboxUnits="RelativeToBoundingBox" />
</Border.Background>
</Border.Background>-->
</Border>
<ContentControl
x:Name="ActiveItem"

View File

@ -242,11 +242,32 @@ namespace SicUI.Client
[Subscription("Rt.Status")]
public string RtStatus { get; set; }
public string RtStatusBackground => ModuleStatusBackground.GetStatusBackground(RtStatus);
[Subscription("PM1.Status")]
public string _PM1Status { get; set; }
[Subscription("PM1.IsBypassInterlock")]
public bool IsPM1InterlockBypassed { get; set; }
[Subscription("PM1.IsBypassEnableTable")]
public bool IsPM1EnableTableBypassed { get; set; }
public bool IsPM1Warning => IsPM1InterlockBypassed || IsPM1EnableTableBypassed;
public string PM1WarningMessage
{
get
{
if (IsPM1InterlockBypassed && IsPM1EnableTableBypassed)
return "PM1 Interlock and Enable Table are bypassed";
if (IsPM1InterlockBypassed)
return "PM1 Interlock is bypassed";
return "PM1 Enable Table is bypassed";
}
}
public string PM1Status
{
get
@ -258,7 +279,6 @@ namespace SicUI.Client
}
set => _PM1Status = value;
}
public string PM1StatusBackground => ModuleStatusBackground.GetStatusBackground(PM1Status);
[Subscription("PM2.Status")]
public string _PM2Status { get; set; }
@ -274,25 +294,29 @@ namespace SicUI.Client
}
set => _PM2Status = value;
}
public string PM2StatusBackground => ModuleStatusBackground.GetStatusBackground(PM2Status);
[Subscription("Aligner.Status")]
public string AlignerStatus { get; set; }
public string AlignerStatusBackground => ModuleStatusBackground.GetStatusBackground(AlignerStatus);
[Subscription("PM2.IsBypassInterlock")]
public bool IsPM2InterlockBypassed { get; set; }
[Subscription("CassAL.Status")]
public string CassALStatus { get; set; }
public string CassALStatusBackground => ModuleStatusBackground.GetStatusBackground(CassALStatus);
[Subscription("PM2.IsBypassEnableTable")]
public bool IsPM2EnableTableBypassed { get; set; }
[Subscription("CassAR.Status")]
public string CassARStatus { get; set; }
public string CassARStatusBackground => ModuleStatusBackground.GetStatusBackground(CassARStatus);
public bool IsPM2Warning => IsPM2InterlockBypassed || IsPM2EnableTableBypassed;
[Subscription("CassBL.Status")]
public string CassBLStatus { get; set; }
public string CassBLStatusBackground => ModuleStatusBackground.GetStatusBackground(CassBLStatus);
public string PM2WarningMessage
{
get
{
if(IsPM2InterlockBypassed && IsPM2EnableTableBypassed)
return "PM2 Interlock and Enable Table are bypassed";
if(IsPM2InterlockBypassed)
return "PM2 Interlock is bypassed";
return "PM2 Enable Table is bypassed";
}
}
//[Subscription("UnLoad.Status")]
public string UnLoadStatus
{
get => "NotInstall";
@ -301,32 +325,37 @@ namespace SicUI.Client
}
}
public string UnLoadStatusBackground => ModuleStatusBackground.GetStatusBackground(UnLoadStatus);
[Subscription("EFEM.Status")]
public string EFEMStatus { get; set; }
public string EFEMStatusBackground => ModuleStatusBackground.GetStatusBackground(EFEMStatus);
[Subscription("Buffer.Status")]
public string BufferStatus { get; set; }
public string BufferStatusBackground => ModuleStatusBackground.GetStatusBackground(BufferStatus);
[Subscription("LoadLock.Status")]
public string LLStatus { get; set; }
public string LLStatusBackground => ModuleStatusBackground.GetStatusBackground(LLStatus);
[Subscription("TM.Status")]
public string TMStatus { get; set; }
public string TMStatusBackground => ModuleStatusBackground.GetStatusBackground(TMStatus);
[Subscription("WaferRobot.Status")]
public string WaferRobotStatus { get; set; }
public string WaferRobotStatusBackground => ModuleStatusBackground.GetStatusBackground(WaferRobotStatus);
[Subscription("TM.IsBypassInterlock")]
public bool IsTMInterlockBypassed { get; set; }
[Subscription("TrayRobot.Status")]
public string TrayRobotStatus { get; set; }
public string TrayRobotStatusBackground => ModuleStatusBackground.GetStatusBackground(TrayRobotStatus);
[Subscription("TM.IsBypassEnableTable")]
public bool IsTMEanbleTableBypassed { get; set; }
public bool IsTMWarning => IsTMInterlockBypassed || IsTMEanbleTableBypassed;
public string TMWarningMessage
{
get
{
if (IsTMInterlockBypassed && IsTMEanbleTableBypassed)
return "TM Interlock and Enable Table are bypassed";
if (IsTMInterlockBypassed)
return "TM Interlock is bypassed";
return "TM Enable Table is bypassed";
}
}
[Subscription("System.IsOnline")]
public bool IsOnlineSystem { get; set; }
@ -336,16 +365,6 @@ namespace SicUI.Client
[Subscription("PM2.IsOnline")]
public bool IsOnlinePM2 { get; set; }
[Subscription("EFEM.IsOnline")]
public bool IsOnlineEFEM { get; set; }
[Subscription("Aligner.IsOnline")]
public bool IsOnlineAligner { get; set; }
[Subscription("CassAL.IsOnline")]
public bool IsOnlineCassAL { get; set; }
[Subscription("CassBL.IsOnline")]
public bool IsOnlineCassBL { get; set; }
[Subscription("CassAR.IsOnline")]
public bool IsOnlineCassAR { get; set; }
[Subscription("UnLoad.IsOnline")]
public bool IsOnlineUnLoad { get; set; }
@ -358,14 +377,6 @@ namespace SicUI.Client
[Subscription("Buffer.IsOnline")]
public bool IsOnlineBuffer { get; set; }
[Subscription("WaferRobot.IsOnline")]
public bool IsOnlineWaferRobot { get; set; }
[Subscription("TrayRobot.IsOnline")]
public bool IsOnlineTrayRobot { get; set; }
[Subscription("System.SignalTowerData")]
public AITSignalTowerData SignalTowerData { get; set; }
@ -375,10 +386,6 @@ namespace SicUI.Client
set;
}
[Subscription("System.IsEngMode")]
public bool IsEngMode { get; set; }
public string RunTime => DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

View File

@ -1821,6 +1821,12 @@ namespace SicUI.Models.PMs
//有些特殊处理
if (strPMOP.Contains("ToProcessIdle"))
{
if (IsService)
{
DialogBox.ShowError("Unable to enter ProcessIdle in Service Mode.");
return;
}
//如果加热Enable未打开则返回
if (!AllHeatEnable)
{