From 0a93a54a6f5710fbf198b0e5a0c24903116a87bd Mon Sep 17 00:00:00 2001 From: chi Date: Tue, 7 Jan 2025 16:08:02 +0900 Subject: [PATCH] initial commit --- Cs_HMI/AGVCSharp.sln | 274 ++ Cs_HMI/DLL/ArLog.Net4.dll | Bin 0 -> 11776 bytes Cs_HMI/DLL/ArSetting.Net4.dll | Bin 0 -> 22528 bytes Cs_HMI/DLL/Winsock Orcas.dll | Bin 0 -> 122880 bytes Cs_HMI/DLL/arControl.Net4.dll | Bin 0 -> 256512 bytes Cs_HMI/Project/AGV4.csproj | 538 +++ Cs_HMI/Project/CSetting.cs | 580 +++ Cs_HMI/Project/Class/CParser.cs | 926 +++++ Cs_HMI/Project/Class/CResult.cs | 236 ++ Cs_HMI/Project/Class/EEMStatus.cs | 379 ++ Cs_HMI/Project/Class/EnumData.cs | 108 + Cs_HMI/Project/Class/Lang.cs | 75 + Cs_HMI/Project/CtlAuto.Designer.cs | 36 + Cs_HMI/Project/CtlAuto.cs | 1096 +++++ Cs_HMI/Project/CtlPos.Designer.cs | 36 + Cs_HMI/Project/CtlPos.cs | 586 +++ Cs_HMI/Project/DataSet1.Designer.cs | 1390 +++++++ Cs_HMI/Project/DataSet1.cs | 11 + Cs_HMI/Project/DataSet1.xsc | 9 + Cs_HMI/Project/DataSet1.xsd | 52 + Cs_HMI/Project/DataSet1.xss | 13 + Cs_HMI/Project/Device/CFlag.cs | 37 + Cs_HMI/Project/Device/Socket.cs | 427 ++ Cs_HMI/Project/Device/Xbee.cs | 400 ++ Cs_HMI/Project/Dialog/DriveDetector.cs | 815 ++++ Cs_HMI/Project/Dialog/fCounter.Designer.cs | 687 ++++ Cs_HMI/Project/Dialog/fCounter.cs | 39 + Cs_HMI/Project/Dialog/fCounter.resx | 120 + .../Dialog/fErrorException.Designer.cs | 127 + Cs_HMI/Project/Dialog/fErrorException.cs | 39 + Cs_HMI/Project/Dialog/fErrorException.resx | 163 + Cs_HMI/Project/Dialog/fJobSelect.Designer.cs | 558 +++ Cs_HMI/Project/Dialog/fJobSelect.cs | 169 + Cs_HMI/Project/Dialog/fJobSelect.resx | 123 + Cs_HMI/Project/Dialog/fLog.Designer.cs | 211 + Cs_HMI/Project/Dialog/fLog.cs | 83 + Cs_HMI/Project/Dialog/fLog.resx | 120 + Cs_HMI/Project/Dialog/fPassword.Designer.cs | 93 + Cs_HMI/Project/Dialog/fPassword.cs | 74 + Cs_HMI/Project/Dialog/fPassword.resx | 160 + Cs_HMI/Project/Dialog/fSystem.Designer.cs | 557 +++ Cs_HMI/Project/Dialog/fSystem.cs | 144 + Cs_HMI/Project/Dialog/fSystem.resx | 120 + Cs_HMI/Project/Dialog/fTouchKey.Designer.cs | 60 + Cs_HMI/Project/Dialog/fTouchKey.cs | 19 + Cs_HMI/Project/Dialog/fTouchKey.resx | 120 + .../Project/Dialog/fTouchKeyFull.Designer.cs | 147 + Cs_HMI/Project/Dialog/fTouchKeyFull.cs | 99 + Cs_HMI/Project/Dialog/fTouchKeyFull.resx | 120 + .../Project/Dialog/fTouchNumDot.Designer.cs | 835 ++++ Cs_HMI/Project/Dialog/fTouchNumDot.cs | 85 + Cs_HMI/Project/Dialog/fTouchNumDot.resx | 120 + Cs_HMI/Project/Dialog/fUpdateForm.Designer.cs | 500 +++ Cs_HMI/Project/Dialog/fUpdateForm.cs | 256 ++ Cs_HMI/Project/Dialog/fUpdateForm.resx | 123 + Cs_HMI/Project/Dialog/fVolume.Designer.cs | 168 + Cs_HMI/Project/Dialog/fVolume.cs | 124 + Cs_HMI/Project/Dialog/fVolume.resx | 120 + Cs_HMI/Project/Manager/DataBaseManager.cs | 417 ++ Cs_HMI/Project/MessageWindow/CMessageData.cs | 37 + Cs_HMI/Project/MessageWindow/MessageWindow.cs | 155 + .../MessageWindow/fMessageWindow.Designer.cs | 676 +++ .../Project/MessageWindow/fMessageWindow.cs | 199 + .../Project/MessageWindow/fMessageWindow.resx | 123 + .../MessageWindow/fMsgWindow.Designer.cs | 472 +++ Cs_HMI/Project/MessageWindow/fMsgWindow.cs | 156 + Cs_HMI/Project/MessageWindow/fMsgWindow.resx | 123 + Cs_HMI/Project/MethodExtentions.cs | 224 + Cs_HMI/Project/PUB.cs | 439 ++ Cs_HMI/Project/Program.cs | 64 + Cs_HMI/Project/Properties/AssemblyInfo.cs | 36 + .../Project/Properties/Resources.Designer.cs | 173 + Cs_HMI/Project/Properties/Resources.resx | 154 + .../Project/Properties/Settings.Designer.cs | 38 + Cs_HMI/Project/Properties/Settings.settings | 11 + Cs_HMI/Project/ReadMe.txt | 20 + Cs_HMI/Project/Resources/ChargeH.png | Bin 0 -> 788 bytes .../icons8-automatic-gearbox-warning-80.png | Bin 0 -> 5724 bytes .../icons8-charge-empty-battery-96.png | Bin 0 -> 781 bytes .../Resources/icons8-charged-battery-80.png | Bin 0 -> 309 bytes .../icons8-checked-radio-button-48.png | Bin 0 -> 1542 bytes .../Project/Resources/icons8-exercise-40.png | Bin 0 -> 1185 bytes Cs_HMI/Project/Resources/icons8-new-40.png | Bin 0 -> 1520 bytes .../Resources/icons8-no-running-40.png | Bin 0 -> 1512 bytes .../Project/Resources/icons8-running-40.png | Bin 0 -> 1427 bytes Cs_HMI/Project/Resources/icons8-save-40.png | Bin 0 -> 441 bytes .../Resources/icons8-unavailable-40.png | Bin 0 -> 986 bytes .../StateMachine/Display/GetErrorMessage.cs | 47 + .../StateMachine/DisplayTextHandler.cs | 29 + Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs | 550 +++ .../StateMachine/Step/_SM_RUN_CHGOFF.cs | 60 + .../StateMachine/Step/_SM_RUN_GOCHARGE.cs | 264 ++ .../Step/_SM_RUN_GOCHARGECHECK.cs | 58 + .../StateMachine/Step/_SM_RUN_GODOWN.cs | 226 + .../StateMachine/Step/_SM_RUN_GOHOME.cs | 94 + .../Project/StateMachine/Step/_SM_RUN_GOUP.cs | 272 ++ .../Project/StateMachine/Step/_SM_RUN_INIT.cs | 121 + .../StateMachine/Step/_SM_RUN_POSCHK.cs | 54 + .../StateMachine/Step/_SM_RUN_READY.cs | 144 + .../StateMachine/Step/_SM_RUN_RESET.cs | 163 + .../Project/StateMachine/Step/_SM_RUN_SYNC.cs | 148 + .../Project/StateMachine/Step/_STEP_CLOSE.cs | 63 + Cs_HMI/Project/StateMachine/_AGV.cs | 258 ++ Cs_HMI/Project/StateMachine/_BMS.cs | 181 + Cs_HMI/Project/StateMachine/_DIO.cs | 297 ++ Cs_HMI/Project/StateMachine/_Flag.cs | 107 + Cs_HMI/Project/StateMachine/_Loop.cs | 405 ++ Cs_HMI/Project/StateMachine/_SPS.cs | 105 + Cs_HMI/Project/StateMachine/_TMDisplay.cs | 798 ++++ Cs_HMI/Project/Util.cs | 510 +++ Cs_HMI/Project/Util_FG.cs | 273 ++ Cs_HMI/Project/ViewForm/fAgv.Designer.cs | 273 ++ Cs_HMI/Project/ViewForm/fAgv.cs | 109 + Cs_HMI/Project/ViewForm/fAgv.resx | 123 + Cs_HMI/Project/ViewForm/fAuto.Designer.cs | 86 + Cs_HMI/Project/ViewForm/fAuto.cs | 106 + Cs_HMI/Project/ViewForm/fAuto.resx | 123 + Cs_HMI/Project/ViewForm/fBms.Designer.cs | 541 +++ Cs_HMI/Project/ViewForm/fBms.cs | 115 + Cs_HMI/Project/ViewForm/fBms.resx | 123 + Cs_HMI/Project/ViewForm/fFlag.Designer.cs | 189 + Cs_HMI/Project/ViewForm/fFlag.cs | 145 + Cs_HMI/Project/ViewForm/fFlag.resx | 123 + Cs_HMI/Project/ViewForm/fIO.Designer.cs | 302 ++ Cs_HMI/Project/ViewForm/fIO.cs | 204 + Cs_HMI/Project/ViewForm/fIO.resx | 214 + Cs_HMI/Project/ViewForm/fManual.Designer.cs | 900 ++++ Cs_HMI/Project/ViewForm/fManual.cs | 372 ++ Cs_HMI/Project/ViewForm/fManual.resx | 123 + Cs_HMI/Project/app.config | 17 + Cs_HMI/Project/fMain.Designer.cs | 2284 +++++++++++ Cs_HMI/Project/fMain.cs | 1029 +++++ Cs_HMI/Project/fMain.resx | 581 +++ Cs_HMI/Project/fSetup.Designer.cs | 3649 +++++++++++++++++ Cs_HMI/Project/fSetup.cs | 665 +++ Cs_HMI/Project/fSetup.resx | 163 + Cs_HMI/Project/icons8-layers-30.ico | Bin 0 -> 106368 bytes Cs_HMI/Project/icons8-split-64.ico | Bin 0 -> 16958 bytes Cs_HMI/Project/packages.config | 4 + Cs_HMI/StateMachine/DisplayTextHandler.cs | 37 + Cs_HMI/StateMachine/EnumStruct.cs | 92 + Cs_HMI/StateMachine/EventArgs.cs | 55 + .../StateMachine/Properties/AssemblyInfo.cs | 36 + Cs_HMI/StateMachine/StateMachine.cs | 334 ++ Cs_HMI/StateMachine/StateMachine.csproj | 52 + Cs_HMI/StateMachine/_Close.cs | 36 + Cs_HMI/StateMachine/_Flag.cs | 106 + Cs_HMI/StateMachine/_Loop.cs | 323 ++ Cs_HMI/StateMachine/_TMDisplay.cs | 353 ++ Cs_HMI/SubProject/AGV/Command.cs | 246 ++ Cs_HMI/SubProject/AGV/DataEventArgs.cs | 19 + Cs_HMI/SubProject/AGV/EnumData.cs | 213 + Cs_HMI/SubProject/AGV/NARUMI.csproj | 64 + Cs_HMI/SubProject/AGV/Narumi.cs | 586 +++ .../SubProject/AGV/Properties/AssemblyInfo.cs | 36 + Cs_HMI/SubProject/AGV/Structure/AgvData.cs | 50 + Cs_HMI/SubProject/AGV/Structure/ErrorFlag.cs | 99 + Cs_HMI/SubProject/AGV/Structure/Signals.cs | 72 + .../SubProject/AGV/Structure/SystemFlag0.cs | 77 + .../SubProject/AGV/Structure/SystemFlag1.cs | 97 + .../AGVControl/BatteryLevelGauge.Designer.cs | 37 + .../AGVControl/BatteryLevelGauge.cs | 93 + .../AGVControl/GuideSensor.Designer.cs | 37 + Cs_HMI/SubProject/AGVControl/GuideSensor.cs | 106 + .../AGVControl/MyRadioButton.Designer.cs | 37 + Cs_HMI/SubProject/AGVControl/MyRadioButton.cs | 88 + .../AGVControl/Properties/AssemblyInfo.cs | 36 + .../AGVControl/RoundButton.Designer.cs | 37 + Cs_HMI/SubProject/AGVControl/RoundButton.cs | 63 + .../AGVControl/ValueSelect.Designer.cs | 36 + Cs_HMI/SubProject/AGVControl/ValueSelect.cs | 262 ++ .../SubProject/AGVControl/agvControl.csproj | 81 + Cs_HMI/SubProject/CommData/CommData.csproj | 53 + Cs_HMI/SubProject/CommData/Enum.cs | 196 + Cs_HMI/SubProject/CommData/Flag.cs | 108 + .../CommData/Properties/AssemblyInfo.cs | 36 + Cs_HMI/SubProject/CommData/RS232.cs | 487 +++ Cs_HMI/SubProject/CommData/Var.cs | 340 ++ Cs_HMI/SubProject/GitUpdate.bat | 5 + .../MSSQLCommand/MSSQLCommand.csproj | 47 + Cs_HMI/SubProject/MSSQLCommand/Monitor.cs | 23 + .../MSSQLCommand/Properties/AssemblyInfo.cs | 36 + Cs_HMI/SubProject/Patch/App.config | 6 + Cs_HMI/SubProject/Patch/Form1.Designer.cs | 63 + Cs_HMI/SubProject/Patch/Form1.cs | 122 + Cs_HMI/SubProject/Patch/Form1.resx | 120 + Cs_HMI/SubProject/Patch/Program.cs | 22 + .../Patch/Properties/AssemblyInfo.cs | 36 + .../Patch/Properties/Resources.Designer.cs | 63 + .../Patch/Properties/Resources.resx | 117 + .../Patch/Properties/Settings.Designer.cs | 26 + .../Patch/Properties/Settings.settings | 7 + Cs_HMI/SubProject/Patch/SWPatch.csproj | 84 + .../SubProject/ProPLC/Arduino/EnumStruct.cs | 24 + Cs_HMI/SubProject/ProPLC/Arduino/EventsIO.cs | 82 + .../SubProject/ProPLC/Arduino/MemoryAccess.cs | 556 +++ Cs_HMI/SubProject/ProPLC/FakePLC.cs | 387 ++ Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj | 59 + .../ProPLC/Properties/AssemblyInfo.cs | 36 + .../arFrameControl/GridView/ColorListItem.cs | 23 + .../arFrameControl/GridView/GridItem.cs | 50 + .../GridView/GridView.Designer.cs | 36 + .../arFrameControl/GridView/GridView.cs | 624 +++ .../MenuBar/MenuControl.Designer.cs | 36 + .../arFrameControl/MenuBar/MenuControl.cs | 676 +++ .../arFrameControl/MenuBar/MenuItem.cs | 69 + .../MotCommandButton.Designer.cs | 36 + .../arFrameControl/MotCommandButton.cs | 33 + .../arFrameControl/MotLinkLabel.Designer.cs | 36 + .../SubProject/arFrameControl/MotLinkLabel.cs | 21 + .../MotValueNumericUpDown.Designer.cs | 36 + .../arFrameControl/MotValueNumericUpDown.cs | 21 + .../arFrameControl/MotionView/MotITem.cs | 56 + .../MotionView/MotionDisplay.Designer.cs | 36 + .../MotionView/MotionDisplay.cs | 306 ++ .../arFrameControl/Properties/AssemblyInfo.cs | 36 + .../arFrameControl/arFrameControl.csproj | 103 + Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs | 166 + Cs_HMI/TestProject/Test_BMS/Form1.cs | 92 + Cs_HMI/TestProject/Test_BMS/Form1.resx | 120 + Cs_HMI/TestProject/Test_BMS/Program.cs | 21 + .../Test_BMS/Properties/AssemblyInfo.cs | 36 + .../Test_BMS/Properties/Resources.Designer.cs | 63 + .../Test_BMS/Properties/Resources.resx | 117 + .../Test_BMS/Properties/Settings.Designer.cs | 26 + .../Test_BMS/Properties/Settings.settings | 7 + Cs_HMI/TestProject/Test_BMS/Sample.txt | 8 + Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj | 103 + Cs_HMI/TestProject/Test_BMS/app.config | 3 + .../Test_NLRF100/Form1.Designer.cs | 222 + Cs_HMI/TestProject/Test_NLRF100/Form1.cs | 124 + Cs_HMI/TestProject/Test_NLRF100/Form1.resx | 123 + Cs_HMI/TestProject/Test_NLRF100/Program.cs | 21 + .../Test_NLRF100/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 71 + .../Test_NLRF100/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 30 + .../Test_NLRF100/Properties/Settings.settings | 7 + .../Test_NLRF100/Test_NLRF100.csproj | 83 + Cs_HMI/TestProject/Test_NLRF100/Util.cs | 407 ++ .../TestProject/Test_Narumi/Form1.Designer.cs | 536 +++ Cs_HMI/TestProject/Test_Narumi/Form1.cs | 218 + Cs_HMI/TestProject/Test_Narumi/Form1.resx | 120 + Cs_HMI/TestProject/Test_Narumi/Program.cs | 21 + .../Test_Narumi/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../Test_Narumi/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../Test_Narumi/Properties/Settings.settings | 7 + Cs_HMI/TestProject/Test_Narumi/Sample.txt | 14 + .../Test_Narumi/Test_Narumi.csproj | 102 + Cs_HMI/TestProject/Test_Narumi/app.config | 3 + .../TestProject/Test_ProPLC/Form1.Designer.cs | 577 +++ Cs_HMI/TestProject/Test_ProPLC/Form1.cs | 659 +++ Cs_HMI/TestProject/Test_ProPLC/Form1.resx | 126 + .../Test_ProPLC/MethodExtentions.cs | 216 + Cs_HMI/TestProject/Test_ProPLC/Program.cs | 21 + .../Test_ProPLC/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../Test_ProPLC/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../Test_ProPLC/Properties/Settings.settings | 7 + .../TestProject/Test_ProPLC/Test_PLC.csproj | 104 + Cs_HMI/TestProject/Test_ProPLC/Util.cs | 461 +++ Cs_HMI/TestProject/Test_ProPLC/app.config | 3 + ...ineA_CallButton_P(45A5),C(17),B(9600).xpro | Bin 0 -> 286999 bytes ...A_innotech_AGV_P(45A6),C(17),B(57600).xpro | Bin 0 -> 286988 bytes ...notech_Charger_P(45A6),C(17),B(57600).xpro | Bin 0 -> 286987 bytes 268 files changed, 50767 insertions(+) create mode 100644 Cs_HMI/AGVCSharp.sln create mode 100644 Cs_HMI/DLL/ArLog.Net4.dll create mode 100644 Cs_HMI/DLL/ArSetting.Net4.dll create mode 100644 Cs_HMI/DLL/Winsock Orcas.dll create mode 100644 Cs_HMI/DLL/arControl.Net4.dll create mode 100644 Cs_HMI/Project/AGV4.csproj create mode 100644 Cs_HMI/Project/CSetting.cs create mode 100644 Cs_HMI/Project/Class/CParser.cs create mode 100644 Cs_HMI/Project/Class/CResult.cs create mode 100644 Cs_HMI/Project/Class/EEMStatus.cs create mode 100644 Cs_HMI/Project/Class/EnumData.cs create mode 100644 Cs_HMI/Project/Class/Lang.cs create mode 100644 Cs_HMI/Project/CtlAuto.Designer.cs create mode 100644 Cs_HMI/Project/CtlAuto.cs create mode 100644 Cs_HMI/Project/CtlPos.Designer.cs create mode 100644 Cs_HMI/Project/CtlPos.cs create mode 100644 Cs_HMI/Project/DataSet1.Designer.cs create mode 100644 Cs_HMI/Project/DataSet1.cs create mode 100644 Cs_HMI/Project/DataSet1.xsc create mode 100644 Cs_HMI/Project/DataSet1.xsd create mode 100644 Cs_HMI/Project/DataSet1.xss create mode 100644 Cs_HMI/Project/Device/CFlag.cs create mode 100644 Cs_HMI/Project/Device/Socket.cs create mode 100644 Cs_HMI/Project/Device/Xbee.cs create mode 100644 Cs_HMI/Project/Dialog/DriveDetector.cs create mode 100644 Cs_HMI/Project/Dialog/fCounter.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fCounter.cs create mode 100644 Cs_HMI/Project/Dialog/fCounter.resx create mode 100644 Cs_HMI/Project/Dialog/fErrorException.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fErrorException.cs create mode 100644 Cs_HMI/Project/Dialog/fErrorException.resx create mode 100644 Cs_HMI/Project/Dialog/fJobSelect.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fJobSelect.cs create mode 100644 Cs_HMI/Project/Dialog/fJobSelect.resx create mode 100644 Cs_HMI/Project/Dialog/fLog.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fLog.cs create mode 100644 Cs_HMI/Project/Dialog/fLog.resx create mode 100644 Cs_HMI/Project/Dialog/fPassword.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fPassword.cs create mode 100644 Cs_HMI/Project/Dialog/fPassword.resx create mode 100644 Cs_HMI/Project/Dialog/fSystem.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fSystem.cs create mode 100644 Cs_HMI/Project/Dialog/fSystem.resx create mode 100644 Cs_HMI/Project/Dialog/fTouchKey.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fTouchKey.cs create mode 100644 Cs_HMI/Project/Dialog/fTouchKey.resx create mode 100644 Cs_HMI/Project/Dialog/fTouchKeyFull.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fTouchKeyFull.cs create mode 100644 Cs_HMI/Project/Dialog/fTouchKeyFull.resx create mode 100644 Cs_HMI/Project/Dialog/fTouchNumDot.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fTouchNumDot.cs create mode 100644 Cs_HMI/Project/Dialog/fTouchNumDot.resx create mode 100644 Cs_HMI/Project/Dialog/fUpdateForm.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fUpdateForm.cs create mode 100644 Cs_HMI/Project/Dialog/fUpdateForm.resx create mode 100644 Cs_HMI/Project/Dialog/fVolume.Designer.cs create mode 100644 Cs_HMI/Project/Dialog/fVolume.cs create mode 100644 Cs_HMI/Project/Dialog/fVolume.resx create mode 100644 Cs_HMI/Project/Manager/DataBaseManager.cs create mode 100644 Cs_HMI/Project/MessageWindow/CMessageData.cs create mode 100644 Cs_HMI/Project/MessageWindow/MessageWindow.cs create mode 100644 Cs_HMI/Project/MessageWindow/fMessageWindow.Designer.cs create mode 100644 Cs_HMI/Project/MessageWindow/fMessageWindow.cs create mode 100644 Cs_HMI/Project/MessageWindow/fMessageWindow.resx create mode 100644 Cs_HMI/Project/MessageWindow/fMsgWindow.Designer.cs create mode 100644 Cs_HMI/Project/MessageWindow/fMsgWindow.cs create mode 100644 Cs_HMI/Project/MessageWindow/fMsgWindow.resx create mode 100644 Cs_HMI/Project/MethodExtentions.cs create mode 100644 Cs_HMI/Project/PUB.cs create mode 100644 Cs_HMI/Project/Program.cs create mode 100644 Cs_HMI/Project/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/Project/Properties/Resources.Designer.cs create mode 100644 Cs_HMI/Project/Properties/Resources.resx create mode 100644 Cs_HMI/Project/Properties/Settings.Designer.cs create mode 100644 Cs_HMI/Project/Properties/Settings.settings create mode 100644 Cs_HMI/Project/ReadMe.txt create mode 100644 Cs_HMI/Project/Resources/ChargeH.png create mode 100644 Cs_HMI/Project/Resources/icons8-automatic-gearbox-warning-80.png create mode 100644 Cs_HMI/Project/Resources/icons8-charge-empty-battery-96.png create mode 100644 Cs_HMI/Project/Resources/icons8-charged-battery-80.png create mode 100644 Cs_HMI/Project/Resources/icons8-checked-radio-button-48.png create mode 100644 Cs_HMI/Project/Resources/icons8-exercise-40.png create mode 100644 Cs_HMI/Project/Resources/icons8-new-40.png create mode 100644 Cs_HMI/Project/Resources/icons8-no-running-40.png create mode 100644 Cs_HMI/Project/Resources/icons8-running-40.png create mode 100644 Cs_HMI/Project/Resources/icons8-save-40.png create mode 100644 Cs_HMI/Project/Resources/icons8-unavailable-40.png create mode 100644 Cs_HMI/Project/StateMachine/Display/GetErrorMessage.cs create mode 100644 Cs_HMI/Project/StateMachine/DisplayTextHandler.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHGOFF.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGE.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGECHECK.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_GODOWN.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOHOME.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOUP.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_INIT.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_READY.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_RESET.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs create mode 100644 Cs_HMI/Project/StateMachine/Step/_STEP_CLOSE.cs create mode 100644 Cs_HMI/Project/StateMachine/_AGV.cs create mode 100644 Cs_HMI/Project/StateMachine/_BMS.cs create mode 100644 Cs_HMI/Project/StateMachine/_DIO.cs create mode 100644 Cs_HMI/Project/StateMachine/_Flag.cs create mode 100644 Cs_HMI/Project/StateMachine/_Loop.cs create mode 100644 Cs_HMI/Project/StateMachine/_SPS.cs create mode 100644 Cs_HMI/Project/StateMachine/_TMDisplay.cs create mode 100644 Cs_HMI/Project/Util.cs create mode 100644 Cs_HMI/Project/Util_FG.cs create mode 100644 Cs_HMI/Project/ViewForm/fAgv.Designer.cs create mode 100644 Cs_HMI/Project/ViewForm/fAgv.cs create mode 100644 Cs_HMI/Project/ViewForm/fAgv.resx create mode 100644 Cs_HMI/Project/ViewForm/fAuto.Designer.cs create mode 100644 Cs_HMI/Project/ViewForm/fAuto.cs create mode 100644 Cs_HMI/Project/ViewForm/fAuto.resx create mode 100644 Cs_HMI/Project/ViewForm/fBms.Designer.cs create mode 100644 Cs_HMI/Project/ViewForm/fBms.cs create mode 100644 Cs_HMI/Project/ViewForm/fBms.resx create mode 100644 Cs_HMI/Project/ViewForm/fFlag.Designer.cs create mode 100644 Cs_HMI/Project/ViewForm/fFlag.cs create mode 100644 Cs_HMI/Project/ViewForm/fFlag.resx create mode 100644 Cs_HMI/Project/ViewForm/fIO.Designer.cs create mode 100644 Cs_HMI/Project/ViewForm/fIO.cs create mode 100644 Cs_HMI/Project/ViewForm/fIO.resx create mode 100644 Cs_HMI/Project/ViewForm/fManual.Designer.cs create mode 100644 Cs_HMI/Project/ViewForm/fManual.cs create mode 100644 Cs_HMI/Project/ViewForm/fManual.resx create mode 100644 Cs_HMI/Project/app.config create mode 100644 Cs_HMI/Project/fMain.Designer.cs create mode 100644 Cs_HMI/Project/fMain.cs create mode 100644 Cs_HMI/Project/fMain.resx create mode 100644 Cs_HMI/Project/fSetup.Designer.cs create mode 100644 Cs_HMI/Project/fSetup.cs create mode 100644 Cs_HMI/Project/fSetup.resx create mode 100644 Cs_HMI/Project/icons8-layers-30.ico create mode 100644 Cs_HMI/Project/icons8-split-64.ico create mode 100644 Cs_HMI/Project/packages.config create mode 100644 Cs_HMI/StateMachine/DisplayTextHandler.cs create mode 100644 Cs_HMI/StateMachine/EnumStruct.cs create mode 100644 Cs_HMI/StateMachine/EventArgs.cs create mode 100644 Cs_HMI/StateMachine/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/StateMachine/StateMachine.cs create mode 100644 Cs_HMI/StateMachine/StateMachine.csproj create mode 100644 Cs_HMI/StateMachine/_Close.cs create mode 100644 Cs_HMI/StateMachine/_Flag.cs create mode 100644 Cs_HMI/StateMachine/_Loop.cs create mode 100644 Cs_HMI/StateMachine/_TMDisplay.cs create mode 100644 Cs_HMI/SubProject/AGV/Command.cs create mode 100644 Cs_HMI/SubProject/AGV/DataEventArgs.cs create mode 100644 Cs_HMI/SubProject/AGV/EnumData.cs create mode 100644 Cs_HMI/SubProject/AGV/NARUMI.csproj create mode 100644 Cs_HMI/SubProject/AGV/Narumi.cs create mode 100644 Cs_HMI/SubProject/AGV/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/SubProject/AGV/Structure/AgvData.cs create mode 100644 Cs_HMI/SubProject/AGV/Structure/ErrorFlag.cs create mode 100644 Cs_HMI/SubProject/AGV/Structure/Signals.cs create mode 100644 Cs_HMI/SubProject/AGV/Structure/SystemFlag0.cs create mode 100644 Cs_HMI/SubProject/AGV/Structure/SystemFlag1.cs create mode 100644 Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.Designer.cs create mode 100644 Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.cs create mode 100644 Cs_HMI/SubProject/AGVControl/GuideSensor.Designer.cs create mode 100644 Cs_HMI/SubProject/AGVControl/GuideSensor.cs create mode 100644 Cs_HMI/SubProject/AGVControl/MyRadioButton.Designer.cs create mode 100644 Cs_HMI/SubProject/AGVControl/MyRadioButton.cs create mode 100644 Cs_HMI/SubProject/AGVControl/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/SubProject/AGVControl/RoundButton.Designer.cs create mode 100644 Cs_HMI/SubProject/AGVControl/RoundButton.cs create mode 100644 Cs_HMI/SubProject/AGVControl/ValueSelect.Designer.cs create mode 100644 Cs_HMI/SubProject/AGVControl/ValueSelect.cs create mode 100644 Cs_HMI/SubProject/AGVControl/agvControl.csproj create mode 100644 Cs_HMI/SubProject/CommData/CommData.csproj create mode 100644 Cs_HMI/SubProject/CommData/Enum.cs create mode 100644 Cs_HMI/SubProject/CommData/Flag.cs create mode 100644 Cs_HMI/SubProject/CommData/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/SubProject/CommData/RS232.cs create mode 100644 Cs_HMI/SubProject/CommData/Var.cs create mode 100644 Cs_HMI/SubProject/GitUpdate.bat create mode 100644 Cs_HMI/SubProject/MSSQLCommand/MSSQLCommand.csproj create mode 100644 Cs_HMI/SubProject/MSSQLCommand/Monitor.cs create mode 100644 Cs_HMI/SubProject/MSSQLCommand/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/SubProject/Patch/App.config create mode 100644 Cs_HMI/SubProject/Patch/Form1.Designer.cs create mode 100644 Cs_HMI/SubProject/Patch/Form1.cs create mode 100644 Cs_HMI/SubProject/Patch/Form1.resx create mode 100644 Cs_HMI/SubProject/Patch/Program.cs create mode 100644 Cs_HMI/SubProject/Patch/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/SubProject/Patch/Properties/Resources.Designer.cs create mode 100644 Cs_HMI/SubProject/Patch/Properties/Resources.resx create mode 100644 Cs_HMI/SubProject/Patch/Properties/Settings.Designer.cs create mode 100644 Cs_HMI/SubProject/Patch/Properties/Settings.settings create mode 100644 Cs_HMI/SubProject/Patch/SWPatch.csproj create mode 100644 Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs create mode 100644 Cs_HMI/SubProject/ProPLC/Arduino/EventsIO.cs create mode 100644 Cs_HMI/SubProject/ProPLC/Arduino/MemoryAccess.cs create mode 100644 Cs_HMI/SubProject/ProPLC/FakePLC.cs create mode 100644 Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj create mode 100644 Cs_HMI/SubProject/ProPLC/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/GridView/ColorListItem.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/GridView/GridItem.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/GridView/GridView.Designer.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/GridView/GridView.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.Designer.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MenuBar/MenuItem.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotCommandButton.Designer.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotCommandButton.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotLinkLabel.Designer.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotLinkLabel.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.Designer.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotionView/MotITem.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.Designer.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/SubProject/arFrameControl/arFrameControl.csproj create mode 100644 Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_BMS/Form1.cs create mode 100644 Cs_HMI/TestProject/Test_BMS/Form1.resx create mode 100644 Cs_HMI/TestProject/Test_BMS/Program.cs create mode 100644 Cs_HMI/TestProject/Test_BMS/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/TestProject/Test_BMS/Properties/Resources.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_BMS/Properties/Resources.resx create mode 100644 Cs_HMI/TestProject/Test_BMS/Properties/Settings.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_BMS/Properties/Settings.settings create mode 100644 Cs_HMI/TestProject/Test_BMS/Sample.txt create mode 100644 Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj create mode 100644 Cs_HMI/TestProject/Test_BMS/app.config create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Form1.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Form1.cs create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Form1.resx create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Program.cs create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.resx create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.settings create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj create mode 100644 Cs_HMI/TestProject/Test_NLRF100/Util.cs create mode 100644 Cs_HMI/TestProject/Test_Narumi/Form1.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_Narumi/Form1.cs create mode 100644 Cs_HMI/TestProject/Test_Narumi/Form1.resx create mode 100644 Cs_HMI/TestProject/Test_Narumi/Program.cs create mode 100644 Cs_HMI/TestProject/Test_Narumi/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/TestProject/Test_Narumi/Properties/Resources.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_Narumi/Properties/Resources.resx create mode 100644 Cs_HMI/TestProject/Test_Narumi/Properties/Settings.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_Narumi/Properties/Settings.settings create mode 100644 Cs_HMI/TestProject/Test_Narumi/Sample.txt create mode 100644 Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj create mode 100644 Cs_HMI/TestProject/Test_Narumi/app.config create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Form1.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Form1.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Form1.resx create mode 100644 Cs_HMI/TestProject/Test_ProPLC/MethodExtentions.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Program.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/AssemblyInfo.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.resx create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.Designer.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.settings create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj create mode 100644 Cs_HMI/TestProject/Test_ProPLC/Util.cs create mode 100644 Cs_HMI/TestProject/Test_ProPLC/app.config create mode 100644 xbee_LineA_CallButton_P(45A5),C(17),B(9600).xpro create mode 100644 xbee_LineA_innotech_AGV_P(45A6),C(17),B(57600).xpro create mode 100644 xbee_LineA_innotech_Charger_P(45A6),C(17),B(57600).xpro diff --git a/Cs_HMI/AGVCSharp.sln b/Cs_HMI/AGVCSharp.sln new file mode 100644 index 0000000..11bc2c9 --- /dev/null +++ b/Cs_HMI/AGVCSharp.sln @@ -0,0 +1,274 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34714.143 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGV4", "Project\AGV4.csproj", "{65F3E762-800C-499E-862F-A535642EC59F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arControl", "SubProject\arCtl\arControl.csproj", "{F31C242C-1B15-4518-9733-48558499FE4B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sub", "Sub", "{C423C39A-44E7-4F09-B2F7-7943975FF948}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arFrameControl", "SubProject\arFrameControl\arFrameControl.csproj", "{A16C9667-5241-4313-888E-548375F85D29}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StateMachine", "StateMachine\StateMachine.csproj", "{BBC9BCCF-6262-4355-9CC2-37FF678AC499}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "agvControl", "SubProject\AGVControl\agvControl.csproj", "{8CB883C0-99C3-4DD4-B017-F9B92010A806}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_NLRF100", "TestProject\Test_NLRF100\Test_NLRF100.csproj", "{2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_PLC", "TestProject\Test_ProPLC\Test_PLC.csproj", "{9C027BF1-289F-4CC8-83F0-CB2B975C39C2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_BMS", "TestProject\Test_BMS\Test_BMS.csproj", "{CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BMS", "SubProject\BMS\BMS.csproj", "{7A94C30C-6772-4F71-BF9C-0DF071A1BC70}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SWPatch", "SubProject\Patch\SWPatch.csproj", "{37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emulator", "Emulator\Emulator.csproj", "{00BBEF50-3899-4BF1-82E0-DF065CB2A88C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PLC.Net45", "SubProject\ProPLC\PLC.Net45.csproj", "{476C8E64-7B6B-4554-ACA2-04302715750F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NARUMI", "SubProject\AGV\NARUMI.csproj", "{8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommData", "SubProject\CommData\CommData.csproj", "{14E8C9A5-013E-49BA-B435-EFEFC77DD623}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Narumi", "TestProject\Test_Narumi\Test_Narumi.csproj", "{EB77976F-4DE4-46A5-8B25-D07226204C32}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSSQLCommand", "SubProject\MSSQLCommand\MSSQLCommand.csproj", "{AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arCommUtil", "SubProject\CommUtil\arCommUtil.csproj", "{14E8C9A5-013E-49BA-B435-FFFFFF7DD623}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {65F3E762-800C-499E-862F-A535642EC59F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65F3E762-800C-499E-862F-A535642EC59F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65F3E762-800C-499E-862F-A535642EC59F}.Debug|x64.ActiveCfg = Debug|Any CPU + {65F3E762-800C-499E-862F-A535642EC59F}.Debug|x64.Build.0 = Debug|Any CPU + {65F3E762-800C-499E-862F-A535642EC59F}.Debug|x86.ActiveCfg = Debug|x86 + {65F3E762-800C-499E-862F-A535642EC59F}.Debug|x86.Build.0 = Debug|x86 + {65F3E762-800C-499E-862F-A535642EC59F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65F3E762-800C-499E-862F-A535642EC59F}.Release|Any CPU.Build.0 = Release|Any CPU + {65F3E762-800C-499E-862F-A535642EC59F}.Release|x64.ActiveCfg = Release|Any CPU + {65F3E762-800C-499E-862F-A535642EC59F}.Release|x86.ActiveCfg = Release|x86 + {65F3E762-800C-499E-862F-A535642EC59F}.Release|x86.Build.0 = Release|x86 + {F31C242C-1B15-4518-9733-48558499FE4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Debug|x64.ActiveCfg = Debug|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Debug|x64.Build.0 = Debug|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Debug|x86.ActiveCfg = Debug|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Release|Any CPU.Build.0 = Release|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Release|x64.ActiveCfg = Release|Any CPU + {F31C242C-1B15-4518-9733-48558499FE4B}.Release|x86.ActiveCfg = Release|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Debug|x64.ActiveCfg = Debug|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Debug|x64.Build.0 = Debug|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Debug|x86.ActiveCfg = Debug|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Release|Any CPU.Build.0 = Release|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Release|x64.ActiveCfg = Release|Any CPU + {A16C9667-5241-4313-888E-548375F85D29}.Release|x86.ActiveCfg = Release|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Debug|x64.ActiveCfg = Debug|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Debug|x64.Build.0 = Debug|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Debug|x86.ActiveCfg = Debug|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Debug|x86.Build.0 = Debug|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Release|Any CPU.Build.0 = Release|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Release|x64.ActiveCfg = Release|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Release|x64.Build.0 = Release|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Release|x86.ActiveCfg = Release|Any CPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499}.Release|x86.Build.0 = Release|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Debug|x64.ActiveCfg = Debug|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Debug|x64.Build.0 = Debug|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Debug|x86.ActiveCfg = Debug|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Debug|x86.Build.0 = Debug|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|Any CPU.Build.0 = Release|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|x64.ActiveCfg = Release|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|x64.Build.0 = Release|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|x86.ActiveCfg = Release|Any CPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806}.Release|x86.Build.0 = Release|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Debug|x64.ActiveCfg = Debug|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Debug|x64.Build.0 = Debug|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Debug|x86.ActiveCfg = Debug|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Debug|x86.Build.0 = Debug|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Release|Any CPU.Build.0 = Release|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Release|x64.ActiveCfg = Release|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Release|x64.Build.0 = Release|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Release|x86.ActiveCfg = Release|Any CPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8}.Release|x86.Build.0 = Release|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Debug|x64.Build.0 = Debug|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Debug|x86.Build.0 = Debug|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Release|Any CPU.Build.0 = Release|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Release|x64.ActiveCfg = Release|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Release|x64.Build.0 = Release|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Release|x86.ActiveCfg = Release|Any CPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2}.Release|x86.Build.0 = Release|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x64.ActiveCfg = Debug|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x64.Build.0 = Debug|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x86.ActiveCfg = Debug|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x86.Build.0 = Debug|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|Any CPU.Build.0 = Release|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x64.ActiveCfg = Release|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x64.Build.0 = Release|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x86.ActiveCfg = Release|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x86.Build.0 = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x64.ActiveCfg = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x64.Build.0 = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x86.Build.0 = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|Any CPU.Build.0 = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x64.ActiveCfg = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x64.Build.0 = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x86.ActiveCfg = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|x86.Build.0 = Release|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|x64.ActiveCfg = Debug|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|x64.Build.0 = Debug|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|x86.ActiveCfg = Debug|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Debug|x86.Build.0 = Debug|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Release|Any CPU.Build.0 = Release|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Release|x64.ActiveCfg = Release|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Release|x64.Build.0 = Release|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Release|x86.ActiveCfg = Release|Any CPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1}.Release|x86.Build.0 = Release|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Debug|x64.ActiveCfg = Debug|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Debug|x64.Build.0 = Debug|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Debug|x86.ActiveCfg = Debug|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Debug|x86.Build.0 = Debug|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Release|Any CPU.Build.0 = Release|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Release|x64.ActiveCfg = Release|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Release|x64.Build.0 = Release|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Release|x86.ActiveCfg = Release|Any CPU + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C}.Release|x86.Build.0 = Release|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Debug|x64.ActiveCfg = Debug|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Debug|x64.Build.0 = Debug|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Debug|x86.ActiveCfg = Debug|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Debug|x86.Build.0 = Debug|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Release|Any CPU.Build.0 = Release|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Release|x64.ActiveCfg = Release|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Release|x64.Build.0 = Release|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Release|x86.ActiveCfg = Release|Any CPU + {476C8E64-7B6B-4554-ACA2-04302715750F}.Release|x86.Build.0 = Release|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Debug|x64.ActiveCfg = Debug|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Debug|x64.Build.0 = Debug|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Debug|x86.ActiveCfg = Debug|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Debug|x86.Build.0 = Debug|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Release|Any CPU.Build.0 = Release|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Release|x64.ActiveCfg = Release|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Release|x64.Build.0 = Release|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Release|x86.ActiveCfg = Release|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Release|x86.Build.0 = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x64.ActiveCfg = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x64.Build.0 = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x86.ActiveCfg = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|x86.Build.0 = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.Build.0 = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x64.ActiveCfg = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x64.Build.0 = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.ActiveCfg = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.Build.0 = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x64.ActiveCfg = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x64.Build.0 = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x86.ActiveCfg = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x86.Build.0 = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|Any CPU.Build.0 = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x64.ActiveCfg = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x64.Build.0 = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x86.ActiveCfg = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x86.Build.0 = Release|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Debug|x64.ActiveCfg = Debug|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Debug|x64.Build.0 = Debug|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Debug|x86.ActiveCfg = Debug|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Debug|x86.Build.0 = Debug|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Release|Any CPU.Build.0 = Release|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Release|x64.ActiveCfg = Release|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Release|x64.Build.0 = Release|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Release|x86.ActiveCfg = Release|Any CPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC}.Release|x86.Build.0 = Release|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Debug|x64.ActiveCfg = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Debug|x64.Build.0 = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Debug|x86.ActiveCfg = Debug|x86 + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Debug|x86.Build.0 = Debug|x86 + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Release|Any CPU.Build.0 = Release|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Release|x64.ActiveCfg = Release|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Release|x64.Build.0 = Release|Any CPU + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Release|x86.ActiveCfg = Release|x86 + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {F31C242C-1B15-4518-9733-48558499FE4B} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {A16C9667-5241-4313-888E-548375F85D29} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {8CB883C0-99C3-4DD4-B017-F9B92010A806} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {00BBEF50-3899-4BF1-82E0-DF065CB2A88C} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} + {476C8E64-7B6B-4554-ACA2-04302715750F} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {14E8C9A5-013E-49BA-B435-EFEFC77DD623} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {EB77976F-4DE4-46A5-8B25-D07226204C32} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {14E8C9A5-013E-49BA-B435-FFFFFF7DD623} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B5B1FD72-356F-4840-83E8-B070AC21C8D9} + EndGlobalSection +EndGlobal diff --git a/Cs_HMI/DLL/ArLog.Net4.dll b/Cs_HMI/DLL/ArLog.Net4.dll new file mode 100644 index 0000000000000000000000000000000000000000..d0414d6c06cfbdbe80ce8baa12833268c357aa15 GIT binary patch literal 11776 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 Hp9TIO^SxTv literal 0 HcmV?d00001 diff --git a/Cs_HMI/DLL/Winsock Orcas.dll b/Cs_HMI/DLL/Winsock Orcas.dll new file mode 100644 index 0000000000000000000000000000000000000000..3ac112656234e94548f2ebb552e53685f56d7221 GIT binary patch literal 122880 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

%AxsP2Jq~UDa zbv*SzqumCV5#Sje0w((oyw6&S4rBZ|xp+Sw3Uf}9(n;nmd3mN3lNwhp?QqVe&9Y5! zGi(qkgVjzHO)}GQe(*3vX`)U{bRNx$9mmxm#q`A7ljnCY=amQJ!fv>&8C3;=1I|zP*0>jTkY6h@G~+1Mjce zIJjOt1QEqy?o=YWVlcWS9na_2zaLFH@B9)6vA#s>>$BY#tmo5`rS!)BWH$+N^z(Pp zfCq1<7kDGJ7z*Nwebb>3u2Z7tBoDSf7MUbMAEn;CiDAhA!{GK1LVy$YF1 z$W#EA+G{^Nr(WinjSU<1HxFATvynj)eg{GFsWdu%N@Wb9M(U&^<^Sh4Qz*U#zosA^ z$y=~ZLfe2O2b~gDo1?^6dLAt5Iu8chr@6P2$Jxjuhg^zj=V8-iw)3SjBj6`3sgo(R zXPZIIK(jTnU%6?Y)rpVLVc$6`st7*LTr z$+=4BNi9Qi+HFG^ojCk+x+%(g2J2a!gh*n0iq1Q^+v&)47WkbB(r;ufpcS!8ryB85}^1pcV zO$yf&a}KfX{i?tLJ&gADo3b z;)gOnVk9C|JeKB0{Tz+|-=Uu)TfkehkH2qvlJV_--f0K6=N)u?r+NJ)>Fsh$=W}|V zLUR-Qb9A0!YvSnjs0RK|YG5?ibeP91b>f&7xQBd91pelDi9jQ#DTm`DDm1d8--&mo zwA^5siGHTADz?03jeP@%gHJ-N&)wdGOIiQ&b$DJU_)YrCZ)a~$;^eF^*3#Uu z^`_rEar(!;(NyhQ-SmM^kL|kozPkNWA}ng~pWZvAu3@#m9cJ_170o5FaZ0hxzY&-1EUp-`IKl z-Wz`Mr_=uU^$PI~@6rEvSp#2sR(|=lfeVe~eInZWmj9po+7lPHeq8i?&>Iz zKfH;xzQ5^rq|X0Q%Ex-=oA2h=uIG{J|8AB|c^@rb+4)iZm-;>1E{@vY(fmc~smZ6wy@*p7oh4Vt$!QgpPLlgI qXOz#82Q+7tPm$|=;&)ovqv`+gG_Y5SN=Vf|{~u4ZqY}OQ8uduWW~ydjhRamXutWE-OwX|Ih=ScSqJSU_GkUQK zL}?lZ7c?s1Zk)Iv#JCd^jhZOY#3Uld#6+Vp>ICAx;=VJy&+|R!o~7#+koWVx@9&>? z(7xw9=X}3sd(OVpxjSAJYj3+K`1-;4$y8v5MYj}Dyk zxwTKZdRMn~Z6~>^bJ??7&%Eq8&q=OpU4CV&bNzE#yPnfJ<@_hNo}FBA<>rx*^1)j5 z1*ZnVIRm-iJFn_KJq_)_U|p*+aCi{>4`NnS=!FA_VGHIKV;U?MbEx7?Ku{Vkg$X$S z<$~Fl&@2CEzuHQO|DgALexdh4X2jBev-w~c*!_>@f>lf19?RYefVaTD&>*<$7r7v=Xv-7$)D91W!{86{Q4lWRlbm7lg)sJt6_|sEss=lG3rLS7d--K7$1qh6Z6*fDA;3UD+G>_zsKTlW3HC3=HugF z4C871O=j??q|IAkUKJmYzX2o4JbNEvqRSM~%}gfcIVd&~v|>zku)hF$ z?q|6TNV_)>-0=LMP=mF0cs}?%e1PT=qP7+Sl~TFb9NAn$HEC|%d^kVnZ+`yt`{7Gf zUPNa_&_NDf8(+Wx@{Qz4643M?!B0N95EjIsu8T2@p9~;*ig;;nf)ZA(sY)1M1gL%> z1hH%RC_fdcWZir*y{iIiZ^*=3(n>qiF|Bjd%rW z73jpW_Ub-EwRN912NXtXhc$xUs2p^kfxi`` zjYLi^#h;P(SwqQXFkH8WIhqejQ9ijG_U6!BtxzpUl>#&ir~`&v3-dE!Hg541uq9XG z&xT+qc^1B#?%ls)=z27X1GQpQoEnUZ30PYWzE(`G#ov0wHb%;TBV_&JcSM1zfe!_nZlvW}=6D_O!0 z#t8!{N9C!S>o}BL3mkEbifEIN{-|)ruC32|^wCGzAE+`#1IzZ2wbPab;)(@zy{1k#eK{STMkFd3IAdmW54?3t>*LILc*Vdb}@pBQ~4ejUUI$g4m zi2`Y6gKh_=k)h7@KodBXgQ4*R9X!5`1R%c2^YCdL7)Z+|Y#%<9+yHF(K+v2j=aT2c z+&Mr6FMvs^L9RK3KC+l^#Ari`(!LafcOcHlvMA`@2t&EMfWH-q&+ynt_a@5b>$O6m zR*Fhf6G5jq5L}zf3^lZv+{rMKS5a>I# zcq2@eQu44PBXe%ZX z(2E~8pt2iKT?JH3-cH@Gqww7@jSMCC;FJ6*|GWc#*r+v$So53|deb$e_}k2H(kh z`G*AUFl)N+gJ~E%em}m0$-Vfy0j(*TK(w;DyZLi~jrjv1+Y8jbP47n=DILa^8__)O zuSZ4IX|PQljLK=JkxM=R!Ju<5f{|8hqS=ya#|C8;bg>Q%p-=b=2^0iX{Msovh_ZbrR#$FM+kgzR|&?=Gwd0j~irV=f{Ffs9ql<)XvYSg}wgW@kgz$ zK4G9+v^{mL&|V)EoW8mk3~D*#<1Ca(^DvBRtGeNTN0t^;ma^d-L;gduzk7ir$^x|{q%Ou-)IZtk25`p zF8cjqumv6=ilO9vfEO|R$%oA=_+R|D1O^Gzwd5y=VBiELVvNN2NupKp*Zn)1SJ2#S zEh6EZ5jOZ4TSVszxxa@8QtVWA#o>4({uF_*6|{oDS}-)T7DOSnG?%9)Oe0T*itax^ zJpM<~0cb0se*Y z>39Hc$!A4nz20ba|CxRz;hh)^S%>W1*64nYzWzmgrEp8boYf)+T5o{Q=8@fhg{S!Q z;xqm?npcanlnST%@ERun4u^6zh`)fZwSCdE{ReF^aGM@!=@+Ei-HiCr9kR`%wF_`hB<{-=8a!}ZyIkpeV~-%O3CF6TL_%f z)G!qz9S`fckPJ31iW*KGQsZk-h+&ff*01ovs5SY5Q0bS|!}^uV((4z&!EgK(riAM- zry<(0WW24&X?#^2;{Wpeeib$-NF&Vo{2JtyDx3Iga7EvUObXj0Vc7jT?D2kzfSzn0 zUIxExAO4TiPp4q=@KW&W0^-Iv<&ytKRL7GC8R69OkhM%C|3ga{qdFF)DmhKtc=sD{ z98qGR2>m4Ar2qYup{df4?zqAj*;Pc9+JKMD2eHDlNbDT=RING?e;bC*1*~Y_fr%4+jJ9WfH^35$kA*~SusRrj z7jC-|-ypznp8f2(I`xQ}@2UGec&*n}Rj&IZ;L zP#h&4s}kpiBz|;AZctkD52@LS*pFP597tWTU@A60Z)&Pc09*WLb=Vf`CzF$qmeuWZo>sV9_Z?>w-xL8=MEsuW&kF}`RXLF4INl)1QIs8QQ~FG8nCpf!T0-bg=UjR3g}SFoYl)!`N^v8jEUo>^kxj zLAzvvmaMG|y1Ckj8Z+;gTpiEO)xj|N4b-aIEz7;d>bT0(m0|K*IMpUpu48M@NV z(3Ovsp;|*Uq4H7*R+WgCmuXX8n~WxB(A@=r3@zeMB0BN!@JAHXR_TI@Rw)9i#wpl8 z60Jh(v`V*5PNUZSJ=3!~6v4c~7n%@-E|D4?v&BqkR&n;;4p2AJvRc5Z+VnrnwW4|HANRa7m@=A@75DBw;C-pTe60Edax`njpgpqV*Dta=jnfTCs3wj_gopKqiBLV)*~Eu zMt=8PC7Avk8dE4-eqaF8y2GhZM4y1t(u8$M&2z|bC;;Wk`SlwQy3b? zC$P@5&yo%X_00g%R#$>{GFq5`0Q;p4y>ZPDIBB%Nl~?vUM^WH0BiSooEJ>ZK4P#kq z80+QO3qYz@JW)2D-b=!KpDDh*12ke z>Z2KwU$qP*b+-0I-G=^{k%X#Oc|;_!rXM#RR=Y{dnI1pMvortqk;>4E{?g$u$=91$ z#owOX%FuR?p)r^D5AI2*6-h~aoh9)xkDs7k`J*kTrNU-#TGt&GyAHLOHb!$Lm{g19 zb2|($y<(;2{Nrn=%;`JL=1>SItNnmUBGa`nOo78Mq2z9 zg3sa0e^}cP*RjR5;wcU>*F}P#ina%ze?vm!)5Yve9pW>U>wR=RyT|ohh3shJKehHy zrPh%46d6~gwPMX)4 zggW^_TPph+tkCS>#PJO%z5wfOm@Ht~E#4{CI4@NX0UVPCAO--KFscy60N}V35Ceee z6cB@r)2K=hR+yYP(U!)^NxSxo`LN@cw*G#nJioMM_(kPqp3bCxxxN90253rv=N9Pz zelH*wuyU4*3&@A~X66Y=y#=mPRAK;dd7KJj9 z47M!_D;q-KFdn2=@E8&K3^k%{_LnXt59_xtL$nvAe$;O-BC8fR)8lxfF|L*|rJB`m zN0Eh!MUCzdRUbibV~ZH{=0n7m|IV9LIovJN!-;h1TtgOCXg^8pdyRdoQm~C5vl9F^ zA?OoW3AT&B-M@v5ipK(D(|H4eNIocv7PbROh7o+{$wiAn^%c=BoDJRPRT1gEi| zACox8w}~6ui(>E+q#vC(>SP#S3Y^Q>KR_1jw$>jj>k0^0uoT8&jCK4GZ1dJi(Rs+G zp1}gg^TWPpDxTlnt*6OR{Y)`H5pXS(?L_<<#ueW?U1ML;UE;&CA5>Hy-t z5~lHMcE%Ik3u zOMhAKehZ>^hsv@~+KuEzd>{*4l8R+Sup2?URw38}r7#M)G?{dS6zEjeSU7>+js;33P^+ zJgRb%*VtE2oa8n3^(3#cFHJ~FsE`X$#XEM{MzucDj=}|Y(nH;c;CA;=V{QZ+6h!XW zbs*3A+NS+s+{3;gUWa_s?eEdEJ1gCTU?0X|mFd4=S*f6+!oFIuUMo$bs^Szac5AT? zfT>r4kvBiI%}0gC-0mIBf^9qJc0B<lS?Pjn3!+b0yorKjrL6fy!%{cGo7i5(>k&0=+yJAhCtOJy#!Aw#UP;ntz`hcmSkH|x zmso#p43QhU{u}~Pz3ydp5~NKFStW}rW#8mHz6&Y%e0g<1S8=oPGGg_u3|ZY*8p)G8@FA|;MT_R72G;E}!cZZ1}R0x2EM z>*dlz0yv@7E${B50s`Euf`GG1x+GSQ7Y*n*OLVxaq#OH(?8X)YGX&n^DP_(1<9l+Y zfB3E@jG;smvK*T90_u{Kpe(TX+>;fqn!TbXT|linsVJnYKJ90W=DA?Xr72|ak}#au zT8T}gdDdwzv99ZpNMmKZ7oqbDQm`eMz9=TOtb|SXsKRqlrQlxV96Az=yQHyWjM-$2 zVtOV+<2HDL(K1KeYUosvS-c3TY{2gZF|WROfdM~}>T$P62{;+DJ* zW-Lt6A5VxCN3{6^FxT?h@-AAmw&X8i;ejSe8~S0kFeS0n3PUAlD+R4egneTULG3Qe z5IUH2>)7lnG52OZhT_4g%c7&9qWZU}AR~A7ZS0*6AlGU*{Y%BQ<=8jlNO*U3#I0zx zQO6yL6L+V6)s|6JJOvfeC?b!IyNG*)_^J+v&QT>Ajh3Yykl#77v#cO372R2KacLk% za~OOwsC^;bYl#MKzH>nO&M*iE-tsnOWU!mJrh`#S(5TdL$U7al@icI0`ppNflYH))-8H*&H^>dbDW?MkW=Rx9xG<9I zoU5{g`cyU?@xRE1LMZvo{H#@{vB-s7iK^iOM}b4}TNuY0Lj4&H*#DinJZN44JF1wj zhnOOiv6mdJPz61-FG0UlOpZhxP`y_;Ssc}NI~fUEauhwWqO3qgS&>$hT(yc2e#H=u zW=eRzy{Ia6xmr=JBfhFqm)%N@B8h6%vhJc{2the|H~u?# z)?HOuI+c^_Eb9<2?R#t%QC}OaojRI}BxyX2<72A|aBarZwR0D4{CL<&)W0rTH&qHI zYsH`)<1F+fpo61>r*c4|VmiGWo87q!Q?rAjgC=*tr?2KGTUGsCAFZDO#{!(z-7vkM z$#r5KZP+96RW&jG6Xx3?(S`=jE48Ec)QM=quLlN}@7*c~WTHcK<(ff;0KRK>z89KP zRnBHk8cZ#&Zs^>Kh9urXh8>!V4h?x;Ti3gd#vaC9psL;+Qr#%EPggZR{Ml`~qYR=A zQE{%e0YT|}P?c&bn%Yw4EVj)?>=g)GJJ&Wx)^K%Ek+0KVKC*2@@rCyo9jUII3h3S8QL%lNnZfSC*At>z|w%s8IbcN}c z!d1=gOZ!H;C$MZV=0YoxPfmno!_dNRnoptw?oO4a(LUi)f}l|edvQTq4!q66gIWrS zx6v>6?>7V?j>6HUHe4Ofs&UhIL7DcWI1_KDcXrjqVETn{O;xx&9U^!#JnmL#N%bSR zV(?wkm|gjFPW2(W0Uk`g4VUqqyXPbLO3li&TYr*Mpb_IgG}mQyaOYG4w&5zEDx$mI z@(5aLokyp^#|8{-PREy3haD`=#Y^`!nEZiE{vP`;oPPUIDjLQp&YF?r%;7Ew!9;Ra$y2~PtG#dFFz_S4^U@o4Q z!$?sc!#$_AszyNum0|pJW(wEAajV3Lo&`}XG04Dr5X)5gA(Su&mg_$E&#&CN0~QP* zv?b;;ajx|tQpX9|j@mK2KL=ixYEM05?w%J~;M~f&)GC8+SeSBUv7MZILqe5M5iH;W z*`F?90g6eN)5n6lFHz;hx&4VDW=bq4xn@}|c1DJJ7su3{vSO!6w{*??Kz#*N%5@rP zsZviT(vutp$0~e3PnU?MOOe^wKsZpxPGN?ou0(}pd7yq;rjI-6LpLluoB%zl*;J9i zHP`lRQ0%-P-qMBfj~S6Dzt1)wMjFd!>D5qNbHWvEaK$dFf}ES~Ep|RlC8~?%wb*aK zs;LSmTNb81T=S+z-T2ggd>O6=#C7LTr8S9A!>MU6(8whu8Q%oec zIA_}gE*&a$KKV~*78Zl&*!*zkxE1VgrnhTlyhIAfk>nL}FB2263(>vbfav(nyQQ(p z?gce^0b-|(oNOdGtx#6yhcN5H&`g5jq7d#e;z-@OJ>k&p354UU4|BYc4lB|SxHQF^ zl3XY44MP^L9zQLdzv{F|KQFTdn+h(EF$^}Byy1 z?&gNEBv&3Q3~ph)7UdylPE`Lf5>%UZj(s|o#lS1hv7ZHhQw{Y^FzqR-bGzR`()9r~-eLFg1?bqFE|n0F6(@`_B+%qDkmTZ(T2j;FBzjYm zFK_8GLrXAyCu)SFi%Vx*4muK`tjg;QT9U6H6-^;?D#P?__`kJ^5EyK8{x)BpK|BDXF^+cpGDG5e&2eaOZFN-J+CN7wV(P=j19`|B0)?Kjjwhy7 z{412Ifszu|V(H*$$vWP)RVWk`%vSvW_ZU#(GMZ{^VCPw!7vtMj?G4xRde-#tD9qAL z{;b76gi4QhLIuhuLld^;=;2k$!>tSoca5*c7mEn!k`Tv@FUL`=%g`sghhT0ncBDY= zyM+M?IGAFb>*Y4qtPY1maUVCTidejxD;Mp!rBd4T-+GiShZ1;SE+5>7O0kLZ&JHS; zNRWo%pmRF{>|TgMxiJ?moCMYJlVL&hOE?upJ77j7ehOejoG|Sw(89hl%8Y9eYQn{y z5X%zITmZ-BlLz6>b#s}}od!J{B3ar~lRs?lrGt8 zPy-(HU1%w1z624jF37mdPWFEC3FS*|IqOv$CyMpjNPDfGe?}wwICE2J;+VVCooR_2JGQ+81JO4yv zU^S9SOft{>2%_Z(1M{}1f`L8eT$}#I%`TATVq`|%o)U@Q#Hg`+3&F)m^=6i@TY_@D zthWSNU33Y$1&8vkt7zet!)V?)gM!YP`+UbEjKdg4Pf_p;4od<>K^|a`SIq6%fo(hv z()R3><(-jsFvPfq!P(FQ0%z#q=uq^e@!}zx6s)BBN;`@>VP-3`XKuIE%Q^yjQ7>y_ zVV|s>??I%rHN-OKo=T}WuOi1`Gl$#tMfV7mQ${&bASe<>Q$51Kg?tr(&?F8bTlu)PD zI=@E^PM#)!KEHN}SnBc9`Q7*|RtdH|sPlZBhAq~|(HL{wC1rvplWh#LB4nqNFkzJwpbkdc_2AXQPER!8Dk5z zwD8F0Mf~z~tr!5HmMB0B0G^rxVgP_)z49Rj0P`sz1_0oa@*xHQJ5xXm0G^ftVgPVS z3Wxy!RvwfNF#vc*3W(t(oSbAD!uWEgXydcA0fn|4fUImRUP=*^-2e&=d%`MD2qw>j zAIY$jKo26hP0AI-Dt}FWKqC=LhXJ+VXsQkjpLw0`AAxqbDGjvszE(|EMbGtEQ ze!A$8rR#Q2S0O;uA>m1|dR?8S z76y$gQmVSo26_^8d_;$ZJw%Klk+XQOjP*m!rw4*uUOj)w`dtAo`PI1xF;36v4Dh`& z#ruZERsfr3-hLho598gaR`DME5g+Tq_}MTA8!@L-%V*CKD`Yqxn8i08b6kTwixUbK zr}Fhm`%oo-f#0tm9*nY%Akb1K{<{G%dhp?jg8<;)*e7N1ut?uw z_qh;X+)ZPeJAD7|qwqI_G<5$2^|f5gEn={n*D)?0D83nJw*$!-8PJXg@uz}El)8*c zdlDm#>tMpbj(V}KI15{HJ^pNf)AR7%^tJuVxNwQ;pKdbh+~8gW_Bdqir>SDjjk=7e zw5jH0pky8J?+2N+Lto%8YoOpyI_c%+w`?o1tq{hAy4=MUG=w z-!gScMaUw`J(k@nYMPsY@EA|D7&2 zUYWY2Rm;%zUK_8cV-$W9 z`K>26i69#C2WRnTcAK2xjTZ%N#5c=#iGmpCzo8)Bi;q&1+$u=tD+oDOA&Xf(>VykF zYL1EY&jsx!riS?oyq{{*LUVzA^hf}ahJGWa;&G+Do!IAG4 z{|dR)dK3!fHmzON#G%M&nbxWm;6vS7P4Yr!3J!EF!`AsSy>(uYZTDy34e3nLaN$iz z#co+wt%lYM_hYmh7ZMnX>$US!Wc-Ny#hP>bk{g}87rzL> zV?Bqv%i+@@YAuI@fJ3Ud z)X4$Z7!!P?7*e9vK-8KhYA${Sd>}A=r0Ovh$j)j`)sp*AUsT|~hsjcy>Cx2H8LDWa z$HHgM*07FNgeRWM6>br`9P(IgUH`MCma*wjWS%6I&(8Ocm&k z+OX_P)<)u2B1t%4Epgd%(8Acgr$2P#i?<@eJWo zm{DIDt)$Q2`aYXM=Mf+#mG^JoVUN7l@FF_WT0c4c6KrQjZCCde??P;Gbam7r$wV%i z2ydc;5JekVXxd1^XrquuP9ULmn*eDhG-)#GFc!pBZEaG1fdQmdHmBIS91ao@L~wRi zZy}qA0K_hk6CDp&8mZf%E6{rHcuc*H#y$xYT{!a{bMA0)aL8hMPW{pFkPYfg8_t3k zj@y~O2~-Sz5z3wt$6+r)LRH^Zn0^qje!0BVsf?h^Zh8?j`Z!b&xtq!5XMN73)R}fg7u}&BjVLGtuj?*N<4k5M;Y;VGPbY48icAsV)P<@x_EncnkdC( zdwxAlA6^Vap0UwhdZ;I-9%EM=lQUVv)f_1D_oVyZZ$~SMuA9x+CuiA|21vKENPC%U zeGMg3uh-*O!$I~B)ALyIYk**~FP&UYbzV8uYU0-(;HEn{H+;Dv0rd|s@CUZ5%||bW z@oQBCyeqe0i)8$|91a*9wL#l36f91y)RxV#$a$UDK_0YX+r)DS3#se|cxZ6}5{)O1 z1FX!&uZLGhJb44`0k)1+U|OI>0q*`o;EkCAja>Z4Sq|7QSRjjW(~KY77cK=O6;xq0 z4|xwTwy69jZ-N3WgYaZD_x=jg-@#~E`u#F~Cqa6Bd~ag}dGmA_%P_$h`f2G8w1t+XJ zt%hEnAL&nn+7L<%T|pVUeAAPVfe>Sk$M;9#KcN`5`)=k#gpWG9zn2+DgP|*J!#EjuT-DOn_ zP-}!yW0wwkPQniG?x!1YNSoS426Rr*YM7l*T2gEgq)EZOXFPOYtnm>42|?6UkN&(3&N@sR$+fv?ZPYaJ zTZ@i#t?o#J_GysS5=^8vGNC+HXn&G8!Y0O zzK$mj-cPN>T{#}*iw;(iktJ%}tZ0ws;=3FiXC7dy9;_P0gH@w=uxbS7S;G2^?g;i@J0x%*o*<$`(TiEuEE3dGnf^jN~-4I zkm!)9=jrAE_cxkl^=k$7hJ=GNljGVjzET@jPH4l#q&7^h(uP&5wPE!dZCKMB(x&E6 zv#gAZ-sO2*bk#I_PSV+zt0s7Pn8v zfLBpS@bNHh*_lH>HWueMS9GeBGC3T_b0Y@#1qH=~z1^Iwmvu=u5^@pSh@Q5)`yU63`s+kTQ{X z6^@OL-SYY0;x?47PRB*ZO`RE3rz3UAb576C=5SEI#M^6oaT5hygEp!`2!6T9pRq;L zsvaUl^QZv_KcLl2G_&QQ-#q$gT~As#F541qnHt4ueAAlF;n#hNEbrr^<1r_ao=p8v z3>-+OJ9Z6Yx1Xle-k9H~x;J(}iyUw&ebj$Kbi&kHM?D_=byUXhfW!#eeFqyE!p}+7 zPK-{R3VG>K;&M`S($q$@`RrC*zjf(fRp9K|7CFRiKS_n>&B^o#Vr#S&zgQFA^r!GA zGi)W%0up#V>H(+VD+6`h6EuA3AZo$AK*T*l(GCGk8vIvYjkMDw&P zQHkv7I+JGe z4r2gM$#M~yi*&FTd%-?AdP;Orba9&I3z6mvqYF7GdusGl`N58m>?zjftMhW;92a(L zbI}|g%5e2)o{=Hi$mFV=cHB@U$XmzDyqX}$`585bd|_C9U3xF-kle`8=^Qf2jog&p zktzkpp{dyh;^0B!|3u3yy<{baH-`TmHvRfH&u69AlEWBh!Lh07z5N~ZzWqHsIP>4C zL&3dC+*ZdGi0?w0r)fIbiVH@({b}kFMm$!KOkhD{3dXe0O^z8ShHsHYqb2p z2}6#KAHgdCzOxP_eT&;s`a?*&+J59};{@nQo;Gn-D+rQZaw$?p*j3&y2}?u!u^SqX zYWr~)=YAPv-uO02ec08;Ihr4LaaP*&OU5=I9N;nI&QtQ~`T6Cm)ARF#!Agvpw+p9K ztI44*hS|~spmouGf@)vEtzBwvHaw{3X87I)i9mjv2z;5-4w}6~B{JL`p!O{lX7CQQUtDfBK~uH!Nv(czxjoC~x*mbv!v#EjcY;R8&on)IZf+ z$p~D-b_8BRXDkzgqM8^K6FcS}%tibe8M$+XIRVb!;x_PAWZBnna8?Ih8^UkKOn(g( zk@xHN)hc*wBKa1^CAgC!)4rjoQcS)r1C@$x7sH$GW|#B_mNQy<&ixA0Z>N?@QoxW* zW_lRcSJdpKqGDH3ajiI!tmbg%TKO_DtsBOgsGB1SA1xhllf1upWg&vn|%@GwFpk$FZ%W_fC| zu>vDHp(2)9MGtRJaE*6Ou5*}`iMinrSqwPFJedx z)QP;GgB5sngZ&5+#)Iu6GJi4_<`gg{R2FH|s6tDLna(+L%hAdqqe|6C>b32-LyWWA zB|hXRI8GU(GsL1#G=yLFTlt7w+tlx%Ul1H|t7Y{}lklE^+^G`YUOzlEUrZlSgg25E-cmUU?+M7ACgI)chle(t;Soi6qgmlCm6PzE zfZXX4-V6Qk3MxFJ2yaA_c?%;4f1^3;;fu z0%DMO6y!JBVB}lnFM@j-a(z+iU-xMAHH){=K^;_;Ty37f|I|amLYoHusROB!JB>xj z(8i+hq_HT~t-dHF-(0zP2i4(hpD?<4(4uCl6mEAJ1C%<~#qVwx7o|##ElRGeSbRN2 zyYE83u*gNUaK$1U0z?{}EOd@7^1K9+!o_ZUcpfBN$KG zyvrKjF2?uJ@7)%?#~T0C8s9-^wZ~(&$;;h5ajPxx3IkyY%WY=tr7dn8|2wZ zu8uN|7&_yi&JYq#TYI%a(|ggQSi2$Km>1_@dQw!Z$MB4E0{;HCRw8rAEH#`B_Ne(H zn2>MAP{ZllHb)I7U`EY4rCuF4zzP93#Eh;v9VHMSx($&>V*lEzboFrFN0 z73Pu;F^EkTNw^J*=wo?P#pehoM4U@61b>C`)%i$w_o?DDTs$Jg%}c!3k53R57x<0; ziV;&P6ruu>v}oYN@PZ{MR1#8)fl1iNF4;5PkRjf-@oXd#F=XPBm|9J&Ni&zBUZv_c zLcGTJxeiBp=^*jqv&Cd-mlY0gm9edp*$XH}{*O8k9*5H6M&%J1Dv2qTsH>?;&h(&? zRVYY`EZ5P(^Yj|Cm@k6M1E-xCAAGb^nV~M2sOX{%rP@iY8A_81iUvxZ} z)A2_U^Z2hBeXbUaX~~9SeK7qTNU0T&Y$4Y5RA@34!lEYhutUUpyE>R8>piQLB~uf( zoVdrFDw{}^{ZQz_Zk5W|Wy(J3CMc8sQ{}0j7AoVmbgFD+stgiHj`W&YagZ zCPJRA5`feDopSyRS1ea79)+Z+B6mI@6$JN3W9MLGI%4sk_0!x{~$Av$^056bx9yIRbfu_U;5ca(o}+icCZt#?TpY zOoJDW&N*>jqK`Y~4mKxP+PQ4p$iCulA&&J(z6En~AqXyD8+ip{$NM)YAl+EtzEeWr z9drE1#V26VhhK^d^pLPgOb%gMRS`B+TkW{E)R7mgZGR2Ta9R{BIjroA49&1E0G0*C zn~#M~hfz;Yb87uwx(IoaPa;VCPIVQhMgERPG=B92zw?f*QT?OT-@>w?|J$2ftwhdW znd%cwQhaQ=nfGY#W{`i#fxKElLt}Ic@{?{Hh#XD_7G}M>1zLEtkMoPH%%DRfK0+~nifY{qV3eugnNWQw@4EN2V!E`h|)Rqt+P8Bc`bf+i#RCqxlh8ZB2N z&|vyk(zHvrD2K&RD*S;)y|1Hr_$+2NTS|wAsQe5HPg%}jfCV0|61vsa)N9RY9RCHP z4=czaA$3ZJuSXW9_ez-WL8(T~XpQXGsnz0^&g@SksNK~TNl`v-VhPAxmM0FGp?EHG zW|V;`=4`?}#Wt8kCmv8)4_psxNg^C+*$3%#;2JemF6gpM(><#N2;CRz4z zaGCo%s}QB&T|x8H>3P&z*gR6L$MUY@JUl-Msemt47pMKYcqx;s>LOiiT`aek6{RLt zO1d5vRW&zO z#)hYm+f#gxZM=y0^K$rq{Ll3HIs8fAS>sMEMy#8@E;wnCsiyd(~6ZwmZ}#m9R^3 z6D&1+sn??E%h?O548g=_8hiAt?erd1_tk1nPL%Ld&)OBj}PC?%EMm=epy_V!WKKIxaeo$Nz?O z2hn)cSY%Fz@oGeneH>20PF)8Fg{bD|n;1S?h_I$Xn*79r zxTT!@j8ITY6UoA^qOdV~OA~<>8iSE7A7XzMMQ}qJ&1eY&kS(vE3!0M`gJtPCg(Sf5 z`izhaTzf(dRBK48>q2&6DpGORO{GiAb$`z&{X28V%w)J01I@uxq(2aUz4CZ>;CwDT zoq(#2;|+6ia$$r$5n8l-u7r;03($JE?Sw+k;Mou1$t;dahMcg~Bdh4o*BR+s;jXvr%wW;fgv2# zC$9|-Ju7`9Amn>sz4d&c#f7$h4u~{ES`{}ai>!TvmcfJb>p zpUjbEt)T8`6?0L+9KMxn70We{+b6eSYQ-X+S}rDEVLoxnr5}PdL8I)^S#G*(OvfO7 zlrb*eJmZhPE@S4PGMCryrAxemll=BED&px+qiiVNyu}y0+=|g9u2U>rxD}~od%$@i zvVvA#k!2=yPk~7Cb;ekoKTh^b>`Mt|3wY$Zy$U}L@*s_%0k>9g_TV8{lmDSNxXBFc ztC)d#zjBrGZ1=#SuT$p%ZsdDPvMH1IW|V4C*1nrH$MVJdP&@&V=TG^lo1-vRU}PVb zA4jV?3=2C9v5XW;gG18Qp!AUO9DDK(@rn3ioGbd+Bj-gO`{TT5YT^nw74j zVbi+sR+=KuH<)5mlgP(I!ywq9_-M))YzHY<2Aypf`E~9Maqg+PoX^6SH%$KlG|Q<| zAPE2r7B33A9SI6U#hnmHy09Sy_2fEbNS=o;dBXh-{Ng}9xdFiPfuM~bKHVF{n-E0M zoGRy%=fhv;Vd{JVOtK$RXbzRz+qKg+ysDv`xFu46O#2Y+^jjmvv7JcaalhR1^l?9V z_PL@)cW6gdmFA@wP!z{SD*NPzH`GdnUSb`@^S$3h25u;UGdxa|e2X?5EXM`=nC*?CwZiPF>E|}kh)UKL)Mc1BHRM| z#!aZ%ug4eb3TVgF;@Cy#`H^XC3ch>tBqkxRzlh@E!=D?FA#ZsY88i zh0}}HFx*D&>)$im1|B$9tHTA3-at$_F~yAq9Zp$PtGt_X?-1$Uo;PRJhOFu^mJGy5 z_`@IT__-c#aol?#lr7zMDV>GrD3ln5db(-BwGbQ$S8K|8VMIECI%~%annM!KESs>_ zv1(kZ34ZhOeq;MgHn!}**6*c@vy8%8vnCppBX3$^@6tCH^uh+N+8yhJiJ$kAUBzNR z7u<9)vEehoY`>KY1=WH1;-z|1B>py{l6;2+g)O`IyT+E5#}G3kU_12C5_*Hn7j54H?G%D96T`c_K$) zLvafA?;L*&-eCR-^e%p!<}M~5<;DBN_){AHj>fUYzvn0Z8N){eUL=*Q5kFVH>QVWt zlzAuWX}n9!>IU_0Wxi_}?*2bp%yM}@zCp~*asDTVH%#faTlj@;jKxzX;s@ zIb*}@Q~A<7QsrVsF8zYB3>)#45`t6Yd{pt1&>)2@29C=QLjGLBJVce{i&^*)wfI_m zux^jV5+=6`8)t0%>KPl_tkY8`{$N(2eHcbz1sn_Ju3PeA_)LC@ct~9yLA?Tq=B!x3 z>Cg1uOoR(nM}EdEXUx1BfdvyB^@r>0orD=V2o>Ewf*fDlzkvvbohdTjxrNBfEwZxn zM?|m^tNql5_=`uYJI+hU)B8$JfYP?B@Elwg$r~@ehUnHDkK|zfUJbM+V6lM#08@l z{U~z!&=mST+}|+^A9(jX$}en11BlNo+rb4!kf*ru>~AT?mxA=42dbaiE?oU2Z#__{3tMVbsI6gKTu>y-Djg29+wH)`g#t9 zlYiwg=vMEJ(ehv<(S9=aj|O18CggK;#pg&eu#FS~(@r=t(Rm7gFC48+InId#4khGa zhznxN$3^+ZC4S_QdFJmbkn&O$=Vw7TE?4{n8e{^ae%}E!z8Vgdl5${|R_w4|Vk}#f zAAcAw4Ho38JBHUiWuyje(`e$5?Mn-)R>BTXRKnB6J!KWf*C133eAvf~rbRX=amUXe z!VLsar&oe-Xf!Rd_OU^=a$vYNGNe?hxJlvi zAse2SPYYhZNq1xLx=}R`U^}=L3A&8=78LN4F70X&zv2UO5AuDaqW(z|RLJl01d04O z7LK%tlWs>bZqo93%GX6+d0eXFn;S3GIy$dLzUMqWhZ;RO>Y1>5#Pd>J4 zzb5bTvO&fORA?%>O`vc8Nk_JRpW>HYoEQN7LkfuDw)A1bu=6%HBrjpkgzCxWm(uLK z<(kv3c^*htZG(FE?{egExbTlq?3}mWj=1A|Fj1V>Mfccy-g>DV*i^o*pB!Je`X?w0 z`4c;S;ooi4}J;RD=3@q zypx&0Nt4=izCc9mfqE!AD0e|l!FBzW8r+yqDu|bQVk&4~m+$;Vs)|bzNd9F3{13xV z{fH_|Y%DY&4=AA3!w(=|kWV!nk@`mc;!=fj9FerQ$8r~}m#F2{GZ$Y%j4@BRpq`A< z14Nlr8*iD`K}b7DjFV;bs<>7Ne)s=;9=xD851z%SEl0TZBN}d8G}<>KM8wO8=+noYeRkYka^O z(dVWf{@EHoXN?#Tr5^s(8b5E1|7MN2QJPC$RS zz-+G9lSx?8h$shUdLzq$MKGS_zycX>WT;~CG_o96SoJIi7F~TjLlq0Mk>$W*9nW%L zA&;-jP{kr|WI2!k^(+U{VP#gzNsg6S=^#~BX2pucS(z0EX|!@8Bf2D2JV~AR!*#(kb~dJDqHNG`_S^HFAmbzWU|`2CTn0GUxzoKZPiX)lVS`t>d+fsG2P)fKz}3BQ37N2=TiZL6;K@Wm6tY`Wv5K|fqv5|b&dQGQrcj>E`dJ3oFifUF)P^DNcC9Vku z>uHcUFJ!~7Czx+q7mSQk%aXEplB^4!h&=k6V91n8HD~#snrmVpp2A~XB1|ovha9$u zmV=maU_$Cc=3Asm3e?%!rIs}5`UjsAOvO?sxw4R8a+(5Q-Tm7Wv`P+usS+B=6sW5* z!B9IzAOkN*WeUi{kL>4DK)QL(jZ>h7-H{-{6h8%2#$b&h1=2`AI6JPU+~2ou&7+$K zc`tLSGQ)f@Ex^vtnPmqfn{3ACtw&)i(x!1{TMH5@W(Xq1PtS8F-^R3(TrCvn(?$Wul5-)zCFeh@fa^+y^JSp z7*9)QgvIwX)q;r@m+=C)j3;0iFY?)p7eSZt1U$xTz%rhI&v@%aGoFCQcmf{d3A9|s ziwM|d7%w7y7*Dqz#uGG*7wM+McnfI8iw?thC9D}wi(x!1S&ZiZ+he={F5?OKj2AC1 z;{|XTPrzq95zBZHa2Zd)FrF5}cv|`~Ueq9EhVcXp0=zqTR>A@bQsDjVNH2j4CQIbqCBUL z9_0maDNn$sym)abFMvyV0zT!5SjvllOL+o@^0XMr)6$RfqQ<2>0YiDEMpIt7Xv!-W zO?g_R6kN)ScaQQ!Jj#n)FXagv%G1)BaVRfZT*?dJQl5aJyvS!$UIbmr6Ywan0ZVxT zKIN?!O?d(y!FCs4GMWheq>DEJef`;-UeYQh+3uwxV4nuh*tSL{6p*$^F zl;@&|M|lBU%FD8eDt$eY7cVa51#l@(z^6PBOL-A+DNn#qo)$xSTKZ95)VP!RdKgd8FkYlDa~N*{&3Msa7_Wpi z<7qLBrzMN=T9CC*Uz&1D5dwe8yWZn(+iY#uM-uPoU*8UPN5Ri%1{F)2)Z`1P$Xw`UZ#b7SN0r z9ft8rSTmj$!+2V<7|&&FkMRPyj3?j^Ys8DocmZ6-6Yv>N#4=t4T*ebHjHksgo|b-$ z7d0;92^hvJHJb6tMKfNxXvWimQt&A+-aX0_@hC5Hy~7&9hVry@797fp7MJn@xRfVg zC@=Ealovsl@&r7}Yrs;TfKPerMN^)DM|lDsADC(UhkJlUJYe;@zV>5s&gB*GqZAhVry@UhPm`w78TP zz@P z$`dw}r={~whw`GurMv(xC4YlAbZ)b|2sRbgaBBepzZMX&wLk>iT0p?m0$NNhprv0e5H)Ts zAYf{NQlo2ua?!Owx#(Iz3rfMS1>)VS1w_1BAacF6fUv0rv~)h@)B@4s)&c?CT0p?m z0+G+I1tRFy0s>ww(15K41pHcHz35s%z@t0?kMaasF6BkUrM!srp*-Ds8h(O?@*;f! zcH>gYTR>A@bQsDjVNH2j4CQIbqC8KK$Zv+F4Zi?FUw!&O&X}mu*Go9!#ihKJ(Wegx z_>?DNDK7#pRGoBX1cv`X;&!bW5#D^a0SU@wL zfZxcA7nkt@xQ#pkpYcR2<3+$_JORUaS`6c9>Bo3c<1(IrVZ2hK8LwP44|uxCy+sU!iMy;bbjuTUbMKR7r-Sw0YiF`&nCSHx}+!IkzNCq^aOm; zTQ8dQ1U%9c@JLUf<&s`RT+)k3AJWsUdCZbCHv|poMY>eAq_==>=0%4gy%N@>r^S$- zmMqfq*q=vw3uw|4@JTOTT+$2RlAeH1dLoweBH)sqfFV6ChV-=bBfY3`Nl(C#Ua8Tf zS1y|L%0-i&79stT)q0WeSWm=bJ%J3?6E>`;rBh)M>Qe}!#bvz!F6#*x){A^L>qXFI zJpqsP8nCP<;IrO((X1!nv7Ug(dIBw%^&;Z3UPSt^o^Cy?CumqN(oKi;7SOC09ftKv zShJoM!+Kh>SPwNm>n)&JPrzrrcyU=TfXjLUKI@5C){B74dIE;^v>4XY(vS6`#$`PL z!+NDgvtGGq)+-mydRi3g{k0sC@K{g8V?BWk))O|Yr=@d{!+O!;vR(j}^#ly-MLwJL zBIvT7fX8|bSk@EpS#P~)))VkpPrze6ftJg95ph{BB7Im-w;t9LG^`it;~dso046TI z5U}SfX*1_5X)&y)C5!buu z$9hrYvYvopy;7rDuUs_im5XLQEsFL2L{=m`))VnqPauQ!gbnLy=^XE{UbMKZ7rqYu} zhxHZ!jmdh^VcL2ntlN584C`shVm)so#Idu2X#vf80zT`-i_3ZeT-FotSx>~WUIbj$ z6ELi&#ju{1eykTYF6#*x)+;rd^~y!FUb$%2(;}>Iy^?4)H~cOMC%b;uA2$7x`@Bi=az<0v_=-V2Mw_C%*NfiBG^IJ^_#T1X?cfMZ_h( zi1Z;o-9Y?9yhTfbhWH|Vl|y_BXyS_wLwqHyiBF3mJ}p_q=WQEr1xElOu_nIU$5ExP zS8&9OOMEM%S8xdU#3y2jF9I&{2^iwjVu(*mKjMoTm-qw>@s%1)eC48vuUs_o#if_@ z0(+z<;*p*}2I&bK($mt}?T}uyxTF`rB|QN{dXdj2y$HIbC*YA@1D5mze9~Jln)C!b z(i8AVPoU+JUPN5di%1{R(+!I_KIsV>(u?#h4(SDW1p!TZ(P2ohgf;1DF{Gy@i}bun z=B?BVAZ4IQPrz^O#fwXN0o>M}fKPfNmh>XvlAeGeJuQaxwDcprsBuY8z>r?4(WF-{ zn)J#=lb)95(Y>q}36J$eJl2b7?_xb+!+KgecRH*WEiUT?a9K~luwLY|SucVv>j`+Q z*MMa`0iX5Oi)K9mkM#sR))Q#CtQQfN^&--T^>piDJwd~Ik-o=ay#+MuMTcR%64tDz z#ju{14A$4ycZvR-S$>NQl=fft+BG+#dBh1eL>IMpNx@B7-n_ejrhfCiDJp+ z#29~l0tnndh{H8U2%NoCJjo-1x?^)ybt?>ue_(N;_ zkv0C<8XvaCpIGBht?_5p_;YLgg*E=t8h>StzqZETSmST4@psnvdu#lIH9lgE2dwc? zYs9lXX|4}gV`z;zYs_0?!5WL!Sh7a6{;6I(Yn2+y)`&;WQgqlFN33zw8kboknzvLe zvc{@4e%Ge0X3;TgTw#rMYiwBKIE@RW3t_M1al{AMq(Cd+|+!s;vs_7JPG9N1q>W;w9;n8ve9LH1n}$ALYPeZItTVE<$vJaHV@TTNtDD)wFWJrGBNJ=tWI1pBpB zSq|*wR%bb|&s&q_z#gzUl;y$>v5BAD&~Lgp@nZkj95!!-I4>0NRx-)J9-i%uVcE(M>pK)6+dd5w_n{gBH zX50i??u=VR+!?os^qFzftvQX%#yS0RqGzWBJtBH;egDex&SWK3HVeOFD}&uaH&qfr#cZ!brEo>PQXx|mi|;1S(oYr4Ap5d zR97yV>dHk^otD-|dZ{iF9@U9>R40%@b;5?~w0Mt{h!&UX0=QHsV5lzg*;E%nm+AyO zs%yYfoq$hu>qS$YfJb!#9@Po7T&jzROLY=D0Yi0>&!)Nvx>P6N zQC$O;>I8hMTQ8dG1U#w}@Tg9pdCHPjouHw*NV~6-SU^)f4Ap7LqB^I{9@PbKsZPMBx_EJ^E`UpQ0zTD=SgMPFOLYQ<>a_Hyy2!dzCt#>f zi=n!5(NtG1n(DNu0nEkT07fJ{suS_3P9THogbmec@h+^37MJP*xKt-#s4nu^R2M;) z>I6KhYrs;SfKPSnMN^%CM|A=o)d{p*s*8wAbrI=9b-MMm>I4ndMcTcvZUIeo(P5~r zgf-P^F;u4|i|YRa+@rbxF4YP6R2MHU)dg^=PQa%+5leLuaH&qfP@R_kR2Ny7>I4kc zX)#n+E}H7fMN^#?HGuJ{E)pKqiFi~ekU@3AhU&CqS$YfJb!#9@Po7T&jzROLYI8hM6R}hm0hj6o4Ap7rPj!)XsZPL9 zofboN<)W#sTr|~bQ3DvC>LTG$orp(u0vS{%Y^Y9)_tunXaj7nVOLYQ<>LQ;_brE!_ zPGFr&bq!dm6Y!~Sy=bZv@Tg9}qdI|>OLY-(sV*XYs7|+@0SrMyb&+=8nzDeVy67-e zSHha=v>2+>l0|i{(tA`Fz@<6?pX%bprMdtv)d~1iCt|5C0xs1F7^>6KpXws(Qk{UI zIxU9k%0*LMxoE1>A_JJ#t-+ELZX)EdoruSF0vT*4Y}ihV_XLS(aoH|_%XR{W?INGe zb`f;hPQYWk1}xhN_-wacG}{SyY$xEcoj}WFyNI}K7m+?}r&~|MPSCJjq}?Y-ETGvg zIt<&Dux2|ghV8UuvHe@XJ+=$rvYmj>cJbn}T>zKu1bns=v1}Ism+b@$+iB^~c9C`2 zPQb987Q=SsqS>xoG}~#BF-$MpMaW}25s&QzGT2Vou$>m~^%2qHvRwd|?F01gPwiEE!PQYV3ftJg55pmfrB7N9Sw;r|=G;9}X_w^AAXts+E z!*(UC*-ndLJ1tpk=WeRUb^%R z7`D@5*sfeO+m(xEJ1sJd>1DeJd2A=*v7JB$+X)-C)8aimB3fLw3*fSyfML7HXR}=d zUA7bO*scM~b^<=ztryL90v_85cx)%oa@j5-F55+<58LV1Gm;@_*e=rU!y^{ZY!@Ad z?Mhg)ofgA(TC&*A69Vx@=h(ggc%Z>NJVL-{yLfTgE`ZB+0zTV`ShkCR%XR{W?X;w9 zpWW82;-p&o-n|G)LFsZLAl@DNLm{)k;9Jf0KrcupXL=Y$Q< zY4Khg5iKsy1#o#z!0=q;vw1FpF3$;gJlBBbIRT&N){EvjHy6VN!Yk9)MriS0v`D_ zV98IwC%^Tg$xpyzIsuRA1X?cBMdUMNjeh@LMEWqDZq4(TthW<1G#6?2$pr!ULs==! zMTeoe64o@Q#n7CVESi5GxHqH`z#Y;M@M$hyT$&5uHu3~~niH`!7Xg>%1Psk-Non4D zU_fLaU>56ko`7LGEr#jJMKfKwXr|NB!jEADy+axi^4LzqV>^Kiwi7mNr={~L=ajx^ zaoH|_%XR{W?INGeb`f;hPQYWk1}xhN_-wacG}{SyY$xEcoj}WFyNGt`%skXX8qs0cu7ow)X)$c4C5!Dmrs%O<0GI6qe71`hm+b<$Y$xEe zorq<-2)Jw~VAxJef3}P40}k5>7`D@5*sfeO+m(xEJ1wnGX0ly`Jhl_@*iImW?Su{6 zY3Y2`VY_H?*)D*~b^?a&BA?B65p>y3z+<}xEZYhAY`0!C+X;AVC*ZN2K+9#jh`4MQ zkv?pvTMyd_8n%nH%XR@CcGxaD4BM5kW;-p0?X+aEoo8=7whQ30oq*4F@#3;w0GI6q ze6|y@Y!?BS?F0h9`g`c};mFD;dJip?kW z(k@e?9VO9@&_g@2(@rrz!k((%pQBMC?GhsG2u{2F{j|#%X-7!3SE134kZEsSD(wh~ zc7#Mb!e*phmPorS1GLk&Ks%z-E_b9|!ZgsXF`V{duC!A)?G$~q^C^i$yM#zPLZ)3^ zBJC0)?FgB6lt#M@k#+>9onn}Fc_ZxzPCJFuURo;crKQqNv1w0v_nf!OlxRmuv?KJ; zj_kBk%&!ZyYm`X4gh)Gr(=LBM?J`E%5fbfHXtX0_+FO@OJ3^uzA<>So8EKa#(k{yY z?X)e>j_9<@9ch>Fs6e~MaN3Kx(oW&DQ}of!M}HFS5+dygnRa!Fv`dJzBV^i98tpPf z+7X;~iecL2jkF^;?G#RXX{ofAmP$LtradXwL%U3gc9cXrLJ#f8PCLc?_CUKviL^_I zv?Dm}^7qp&W27A+(O!i{J3^+tb*Z!?B-#-Y?FgHZc3C3rvJB8p+XC%~PP^QZb_u#j zQ{Sa(45z)AEA13cJ4GMue4Z`QE+Nv6kZD(!NV|kcJ3^)%rO_@!q#eO&rx>PP-bg!w z(@x>EmzGLdrzn^v)Bkc%@ z_9`^m5i;$qOQjtl(Te;gh)F=rX8ixE<>ap!D*)$rd{4hJA%_r;k1{QN_%Okv{Ou9 zuz2}Vj)Xc&LS5FyF9|_*)G6lA38-t7h`NM`I)bAve?RInM${1!>Q!i{BV^QDmx?+< zLLDKYj<6X~mnEVu%K+-MEufC*sLLHumvAAVt}z_-Vy>uDIO-IAsPnPogt~-?IzmQW zT_WldBI*bkb(Ds>3=wq%N1b9Ab$KJ|2#z|1qh4An>ZPTkPBA^Rh`JmJb(DmIPT{Ci^r6lN=@aS_BI^36ecAiTj?i=dg6yPI%)cR!u2CZC z5+dmcPP+X4q{|pdM@Xbsp^=V|NpD>$=?IB*ghV>RW+YvfNV+Toq|>%QI--*$UcSj`B)g_WHA(D=eNk?g<%MeLNaMCG;NtZX0 zj^LzIIO(OOl3rRW>1x^al#H~5IZDDDp$Bth$DAU4m!(FDm`jM5BRJ;r_hT+g`E zUWJA^LdLvxshA@q%n=gi2%8aeSt91L3}8;%0_KR0x!e(R39k;AYYfM{m@DQKjyXji z=6ugd!dybc93h{(s7u6LLc|;)V~)}=mmy+~;FwbkV=iyR9KkWCaLh|f#k{ms%qeWs z=cmEcJ#mhbIG1nn#0A+or$|4?piv^{5+dga&bj>koXZ$FM@XDkp>d9oId5Gm=Lm^& zgv2?*X5?I!$hj;7oYS_zIihnecjR2c2l?fxdhtbLIOoM&Ij3;WDf&47bJG*&5+dga znR9iCoJ)wDBV^7|8s{=Z&Jmn*ieb*>jhrJm=M>I)X{nr-mdZKB^aZ;(SNFs@O5$9; zMb43(bBgo>3>qbJE+KM`;GE0f&$*0|bA-fs6&mLVne*1Aa*mKVM@XC_Y(~yyiJZ$a zz&ULToFh8ta!1Z3e1ABeYYgYSm@DTL&N)RN=X?uQ;#@-H93gYAE|GHyk#mI1IZESP zhR8XBb51eLxxA5c1m~Q>IWH}h^U_i|r_e>lU8u{EP)A9qBlMiQAUo<5=~ovtN<>{k zL><9Vm%kr%86)Zl3H2&8)Dbf3txH86A)$_tP)FE|sLK*jmt_ET+7?hpbkyaJs7rWl zKwV=v>cw19r*PCM`cUV4)e`CwBI*bkb#;lTONgi=WYkd_>M}&s5gc`jVbtY~s3SP) z6pngnsi>EhiaLev9_>P1j)Xc&LLH$8b!11KBK_2YMv16Ph^Qkt>hkxaE@MO;A)#J{ zhB`t+RmBP7%j66y$>5p`K2>aq-=PTKp745p@Ya98lL7j(Ray)F~Wwiayl& zroe={gorvqMqOPZ>JlRA2pM&hhPn(9bp%J9Vi<9Vrx-?E-iSJaqfX(dmzIipX{o4F=n0rzsLPR1M@gt7^q`LH zs8gh$RM039bqNu51V>%|e$-`*s3RoQtI$wK$f&n26?KG!IzmDnVKbsGOGI6k0n}+* zKpoLhmph^^;Vl7mjp3*lb48uPQK#rboo{nZs7r{bBV^RoC891NqK=SJM`@_b5K%{P z)G3Bhmp7u0;HXnL>ZPTkURo;Z6neCA7wU2()KL=Z2tBAHJL(kacN8>AL|sBe9l=qT zzaMoOBkBkV^(r*f5i;tnOGOB7EniY)a8z-OL%KQU1K=v z#avORaMUUKQ0M!J6Y3Ho>IfNib&04;h^QlE)KMDhGDOr79CeCe)a8w+BRJ|5j(TaS zsF#+CI)y%=u?uxM66z=kb%Y+&ksWo4`8&c1j7Ev5ONgi=IO_8Eqb_4a9U-A!g@!sp zM!j{Zs3RoQ5fbVMn-O(cBI>dXpibKY>WGfI+!6I61k^Q#qh8DvbqYtFq7U`IH9es& zA)=0uQCF9Ux`c>2LPi~>p)Ny29l=qj7)D**h&qC!PT{DRmWq05si;%vqj$Sdmm{H$ zl2AwJK^@sqrJlRA2#&h^{iw?rQAbFqSD~SfkWp`4D(VOcb%caE!e&HW zmWaA61E|xsfI6b1E_Xy-!jVhcMRkqgs26iZox)M4=tKRY=?QfS5p{%&y1GQvB}CK_ zGU_M|br~Y+2#z|%FzWI~)DawY3P-)PRMbmLMV+Fcp1+n_j)Xc&LLH$8b!11KVtxs` zslF}MC=qoD5p@JdUH*R5WsImJB-E?WP)Eq9w=NZRgoHXmLLFfqAuaOfV#$T)Qh>IPT{Ci^r8NDrYF=TMAQ*7>gp0vmk?1$$f%<<)MbdMBRJ|5 z!>G#}QAcppDIE3EQc*806?KYo0+UgfBcYCxP)F!N9obQ*m_In6u2CZD5+dpdj=KE) zsLL2pM@Xnwp`nhDQEy!;>IeySgoHZ6W<*_(ccj?z$Ij<=by*_nvJ9Y3+XCu{j=J0tbqP-isA~*Iy_hTN6plJYAL{&WO+sBl zL>(cct}YRE2@!RKj56`jJmuLbp%J9!ci|R74_0mQKu+ZU^41*B-Bw7 z>IglkBRlF8^QQ&WHA+NXLPQa9yf9U-BPkWfcRsLK*j zmt_ET+7?hpbkyaJs7ts%psq0-^$GObK-f5p{%&y1GQvB}CK_GU_M| zbr~Y+2#z|%FzWI~)DawY3P-)PRMbmLMV+EtSI?-+kx)lTs3Y{Cj_jyY%(nyT8YQAG zA)=1psLS7vx{MKZgoJt(8tMoc_12}Lj*w7CNT?$u)MbgN%QApEZ40O)I_h#q)Fpgb zKwV=v>cw19r*PCM`cUV$#S-cgBI*bkb#;lTONgi=WYkd_>M}&s5gc`jVbtY~s3SP) z6pngnsi>EhiaJGkFd(BYM?xJXp^nglIaq-=PTKp745p@aQ98lL7j(Ray)F~Wwiayl$ zo1RdY5K%|SsH;mvT|z`1A)}7cP?sU1j^L<9Vr*PCuOGUl3RMaWT<6aqc zITGq933Y@X)R7%^iuua}>KY}YE+L|h;Hb;rkGhNzb%ca^6&mUY8THnsqK=SIM@Xn6 zB-CYzsLL{dI&BN6BRcAGN7N;Je?VPhIO@e*QKxX!Df&?7_a77L5+dpd8Fh7us7r{b zBV^Q38tO7c)DawYiec2{ji@6y>J*N8X{o4}mWn!sJ;9qfSNFs@O5$9;#V2@?opXx$ zYXj#RC2}qya*p7f%iqtrjFEGM#Ca7O=Lnhe)}?ZekT^$3oFgR8Wr>{2GQc@)3!Ec5 z=W<8RCFmsuhTe<_HOMgoHUl!d#Y!xhw;i)3$&)qGK+1 z#9YFM0_GaSF)!wdIfY|R(TBOgxqo&#eBHW)Erj}o(+K%+t}YRC3HHy*cKyO>gp4^# z!(4`lIf7$OF^svq5px8`oWe0LEfw?9QZZLc{=R8RiE@-gIYJNR$WA%M{I3J$8YNOL zAySUul*`{wxr~u=ghY828s!L?^46tNj*uuvNR%Ta%4La^%Q8SYZ3~nmI^}Xl$|YQK zS$h&dV>so-Tq&n;$|?FN=ZDi1FXoCl zg=0?9hxv->33CY%bA*h!xSv9JLVMg(*bjh5;2$XQjQAsH`oyzbBb>5H|sBl{JH(6xV=@7 zF=CF8Ft0+x93f-gx>U>&66OdAbA*JsED>{A1~8{>0dqvhT<(auggXP~8pAO!=88Fm zV@}bB`4Q6-<`N?22pMyAiI_`>m?LD&Q5xnlM9dK!bBb<9FaCOfyb*H*$DG13FD(`G z(o!*}&;|5Nx(tbQltem0&v^^7lTI=Js6e_#iKI(-X&@cJNteI>fG%Ss9U+lkg+@9; zCcSm3q$4EK5fbSLiF8>a>9P!vPTK}=@d>nMIY%$O;4mt zh@>NA($yuBE+LYRkV!{rq{|RVM{v?9hDnz&636XRJCtd!2(q)XKBP7zR&`3wfq_-}Wbc94YLLwa@kuFOl zU6ujTXe-gh)C?flP-58UBXue z(lv&YUd)wr3MZYSkM!fFC(Jmwp5J^YKq@y&_Wr(CBIO!C_q{|ygM{v?9 zob=LCNiQvxbP7Gxl}VQ&k&co`N9Z9P*-59Ee{~>TqeRjrMA8wQbou*9mobu#kVvmW zBOM`=-nvxM5fbSLiFAZSx-5}&Sq4a_ZGm(|CtdDHx`dYp(lv&YUd)wr3MZYSkMv7S zPoztTq$6a~)g_WHA(D=eNk?g<%MeLNaMCG;NtZX0j^LzIIO(OOl3rRW=@fcWHj?hCovXf3Re?=f&qeRjrMA8wQbou*9mobu#kVvmWBOM`=-nvxM5fbSLiFAZS zx-5}&Sq4a_ZGm(|CtdDHx`aoC-#pS7PI@s{(kYyDiaye9qh-=1MA8v5>FN?mmk>!u z$fTn*(q)LGBRJ_4!=%d_Nk?$fDV+4uQb{i@m2?Vy{34SsLn0j|k&e(qIy=MjS@+h5J^XH z(&g_bT}IoPPC7y&y$X$VgiLztQb|Whq$4EK5fbULMABs$Af2`a(h;3>xg+TketWsy zGtwANdNEhhDV%hQKGIiBPd~*gLDbeeqX?OFb%~@mPrWmWkV!{rq{|RVM{v?9I?{Lj z5VedEa|Fkn!Z9x`?=MHb(o!*}C_hAs=_Txq9p+9~>IU$YdX^A`z`c7#m3xSo8EKa#(k{yY?X)e>j_9<@J>_j^ zrM(H2c8%e*7jvbZ!fB`Iqy19T6YUZr?FgB6b&0e~h_oYQ+EE(qGDO-DoOX&~+U1S3 zBRK68PJ3yow3n7jJH_T7_tGv?q8%mCj?hCpveQm6Ut4d-c8wBgmk?=3aN6bXr(MQK zJ3^wp3XOJzOnd86X-7!3BP7}p678}?+GQD_own&m+k>OO%&&&OsXS|r=(NjyFwowF zO1s8z+Kai;PT{mu^wEBq>6@?Nr`-IX*^jX}uP=*3dpV=8CpHKfesziPONj6zWcX1U z{J+f$&jo2K+c%Y0F%1#}f#89l7!HKI!r_f=Ej$pkdLSs)w`(9uOAUlt7Eg2}pZ^Iq zkzvB~>nJG<2t8py_ApS)9~{DKEdVk^*by9diecF0jYoe3hn>P+RuBP7@n z66^>Gc3C3qvJAjZ+roJcqLVK76T^|e36*q>;iMOHC7r@ar|2Vn!}LVDgh)C(vh8X ziurwkbd3^8mk>!uaMI=PCtb!!Izl473XODxOnU25Nk>SeBP7xh66vx;(q$PSowfzi z5uJ3obz`X>)0NA(oq`eGDOl5 zoOFs|(&de$BRJ_4PI_snq?eXTI)%>YGwCuU(oquW2tA}DJLwej?LfLliKI)2q$4=# z^7oT2Vpj!ZE!Gm2{2a zq!)7~ox(|{=po&<(L2xCKX#ehe%N$nwqy4&M&pgyi}iQ*68kg0z{&RZmq?j^neD$> z`7pxfZAUr^m!+((bkYTUwU!r$ic0RQY>%(7U%0v;GZvAa_@nW{j}8RGw|-8 zzw(4_if!w$vb^<}(bAJ-5gxPmm}-MvxAdecuh+lZmb8_Pd$*6+pK<~^I{m`^^Y873 zI(lepzpef=8Sbd{S-)k~ruNxX6)x^Oy>I>4;jLrVV}CcoEnV-6J- zy~{(`evWNh>$NnqJ5y}IwVRhm|82{R{5L*-nW;Nhg6jF%c(lB8RhzuJOg#wOLE$&;zU zPb}EI>-iNQY5t>jQ0hK+hH&Nf)nON0W78+?mE&9QIzP2ZK9}SB`~Ty%%^$KXZQ6Uz z@c2>FZ-rJd2q5YOlk ze8W==pV7(t29DVEk`#iU(NXvrU1_Ojbfu-9(WxcxTS@6`4kewDnx!pUue~pQdO+J)6@Qel}Ok^=yv9&*muXZ0?(l)AK(I zA~%#|azsp&ONf*sC0bM;P`qa@5_Tl{DuvSUs$|4_hOqeRRlM9dK!bNTx*moZ|FkT9=8!yF-F-nvxG z5fbJI33G&mxhxTLSq3ntZTi?xrBU>&66OdAbA*Js zED>{A1~8{>dgm_85gl{6rvdXORLnJoV_wV^a|*|tq7QS~I7dmG%eTlmvU5%` zzbO$j&*%{A}P{qeRXnM9vYMbNTx@ zmoajVkT|bG;~XJ#-nvxI5fbMJiF1U+xh#=$Sq3<#ZQ-;9(K(mI4MIYx}OGunch@2y2&ebJyE+KM`kU2+boXZe7M{v$5hB=ova*p7fQ#j|PrE*?c zD(7n1bvT!nFh@z4BlNrpMRv?7=1&ZmYm|t&gortUV=jL`<}yai5fbKAXqY2p%v+a= zIYPo5Az_Y?Fqb7_F3SMsv@N^|MRd&NerCYD2^DjV;g}b5#hk)1r|83+D`T@8xh7Pf z2$JwCyiKi71R-S1)g@vsA!3e@F-K{bbG2uDLA|;Mf;2`XAHm6|=*Zvol)sD-dj!Xx z!m%$c75masv8R~cvH6W$maC3iJ|ta#L3H%x*0;1?U*4EX z;NDC3ERe=<^ozNoPvPiO^r6qS-}Gq~3BtIdudBml?_Vre8Pz4C-#qoxEC?BWl!m?x zk#hv+oMM1;86)Qi&N+p1URo;WrKNJNmPO1ZC(Kb2<_JAUcx1<%V*ZwZxkibYONf{w zIOg*AV=iOF93f#|g@!po#=Lc@m?I?25fbJI33FK@=CTZ6PMaO!GvA%FE)jDH@d%HQF-K{b%MdX~aLg$>%ojh* zB5x!e!AYlZ(o0Jvy|h%)DQwe!TsoYqd*U1=aW3ED;T+jHr-Hup>I>a(`_&lW9UdlhGK? zc`;YcDV%ePKF+x@mpGRYIY-Ext4riuLgXAFbB@wDmmzYF;G9zob1rY>9KkuKaL!9h z<-D|1&ME8yOy*qO6Xz(2bNLoIM|RFB=3gH;*C>&536XOI=Uo1N&Si|8BP7nN&^SlP zoVPBObA-e>LgE}DaV|^bT$TaOXU>&66OdAbA*Js zED>{A1~8{>;f*PxV=njS2h5vLG1nN5c`;YaDI9Z(KFn`4Jz*{(Vvdjx=jswMmk=>W z$e5!v%w>2tZvfv@9z{TK%qfO3mp5XL;Fwc5=B1@#URo;V6t?N->9j@N6Xz(2bNLnz z=g7`EMf&uuMv0tDh@2xh=koV+E@R{zA#q-X#yLXfymhIZBP7ld66Xksb6FzivJ7xe z+rnuJqH`{H{Pb-TD(4!*IWOkQIfZjh(Z~7B^u)P@$T>phTwNmP5)OrDT@W(oD2;O& z-W@ncaLy@)IhQwbj^LbAIOnCMa$Z_0=W5x7xwM2iO2QnW=Wvefm{ZI@5Dw=WC1Nfi zVvgXL%ioW=j1hB$gn1Pj<_H<{)}>;OkT6F`m?I?2Wr>)}GJrX43x{*WjqZUfxg+Kh z^f}y$xyEqJsn&VkljnOV9CM03%z30OVJ;zJj*u}|mx#H9LjiMyj5$ifT!x4_f@4lG zjJdoKa|Fkn!Z9x`74yf)axNiq zj^Lcj-_N;>k#mH^c@-Mx2$}QNrE-ptI7djFBP7mciJZ$az&ULTXXl8{x!jR+34hEs ztek5M=bXwpr*O_GjPw8G4|P4XT&1k~?uWf>+kN;)_qi(GJ-Yub;nDs4#ANsAKD`$o z-M43!_l=I)Wo&zvd1B$b#d@ur9xb1`(VlDGp*qEL`lZivOP_~zeeR|Y)p+(JJPK`H zz3=hT*PLZM^`+|RyIT4_H1(zG={qTXZ%Tcsdist_->uY_D)l`u`c&)4f8+I?Q?#z{ zoaWEQj`|9)9nIp!2Q4`}TC(my@Xm85&;O#WeBBPPx1-hE*tu16`f-%oGYa0% zB+ol{F}c2TxBjf#1Hr$*{6C8F(w&c1zn?V4Ho@$7b>;fx#_XpM#+#$f(Wn*nOng^N zPjpiT_B#Rlr_C|@8QDyFhf5C=>n6Ru!+&;jC;hfdw{+5Py7Y4zD{P@zx$87t<^QtH z%BJNgU$*B=liHFxMD9F_)e9#9J7=`M;ZUuEOxZEr#$R8*qHH5=|M{!=WK)U!{BxH^ zFR(qZS$~V*m$Z!Qvmdafw$1hLZP!e1jUSp>pM4iiAx9?)mu!AzP1(@S7|anX(fVqY z2K%ypt#4V|g?t+FQPQxm9Q8QCUTl5KJ{{;g`%T;8>ial8dr^q+jnOSb9hbDVaZC0V#;x0e z*tNb2p%1(JxJGnaUj=!vFD$mch0LL4Am6R8(!MyZeXxmr#{r=A)!|^UFGq;hSI3LN zz8peY-*P}%Sl+sQImWcUR2>Y)(yo2ML8$fBA!%_LYBq>n>#Gnh_N}i492#3+9Vi$3 zme-gWABR%kQ?R2%pL*h{Z2ex@jI=!V*7U~#gfpy{oU=i0GtU+G-alKnNKTf=vtO`5 z$FpCue>cv5i)m{I%koVQPL{Vn&VWMhtJ|HDjchsN6v zw;>hz*&}Rf?eOIA*193b>*CtVWM%8nc=mnjI+`4s@e()tKlabo+UlX%yKQ35Ns~S) zXCIkbJ2E+P_Qhk3|0*+Wt&e9v$loL7?*~C`K9jN#z}AUB_m&}8@L=6z z!6(PY+Z<&J4`pYZf0qesYn7z6$+7MKZ2}~%8A)rEq{;E>seX22ab8-Tmrjnm^HOtO zTAii2xX=H!4L!MJa$@_DMxTAo@!V*<{i`gHhMgFFZQ#r5z?YRSKKNxe_+<|G>050G z*6I8Q?4PyuYFgiAS~t_Wo5tIZviaKw|JF7p8(TNmMU*(6eUGi$+R4?Ev-h!Jt^6Y^ zx6iQL?e_yQ)WgznYm(e#o52wrzpIso6&o1v2kx%TM2++A6ET+`(yF{x?QtkoqSeTO|IH{WLfz* zC-tdwinFRC{{bV11^dG|VM)uP$2knG%p$Fo6C+U9*p(^1f~D!IKB`!t~!+%^SzFAG5#I_VTvEtIKRM+q%21eHheE zSbXho(AwLAyyVV%R&UTYD8>0dw?Vc)WdGF2mDMPVHMy~DyW+0C;NaYU-#Oc(qwg85 zzHW4k)g6!iV!XPtRHtuUTK(v5`m2}L|8qC}x~28sDAQ{E^|K_EGcC8(p$ruVVKfUoQKD{^#sv@waSskF750xOM+M ztycK%T`?Pb3){$c|Gm3y3QVwx_IrhKtMkyauf2a|hW;HOfIp1nWA9J2F zC+9hLE-ZQ*Y0rhUq5ido+O#Df*=Wm?<*hRxb~)PUzAhhAhp`Xr+b{?1Z0Tb@@`dUd z*Me$mx@o(gaSu%n^{i~!;0s%;XS7#nG&_IN3EK4wE7~mDX-Dk)2#z1P!n$(`_lOU_ zLW}-~A3t!?{B}mS^^gUBUGN3hvLVHB4= zjdD?Fpx^0kyd}OTfJ-Uqdjb&3=>+dL_Hj5p^+@|}fU!;K!po^^#ux0AeE+Fy?OK{9 z+WV%@F7NX`-kSBEW$oqzqdz@78r?5_X@`a-+xxbacI=Bi?7wo&;vUn-(`QdVXY=cA z>EajoO&?>QOF_Z_M5=$Ly<_#~W>_?9AoI>*+C$-&gn#oBw*>{2$Bw zuerGI*x|EZVq3d!3Bu*7zU|OmkDJ-O3$1P0E+^}D*_eH}?NXO(bmsdGvMmldLTxAQvvHW@64k$Zg`WgIRkStHlPM^;IQYsi56^swR0er>( z=d#W6a+@Uw{Acf)<>GqV+3w1&nROKU)_#m- z<{n!w?q-_#xVc0T-3?&JeG%H6{PaQ@9J-xn<` zz;t8!sOhH^tm|SNonAjZC*>b&8Gg+!(Jb-m&1I6W(y?aucKA__)C);_;0v%ZD@WRJ zwbw3L?REISlZBcdx1~BZId;~*ufUFgyOwJ6Jtl72^`Vib;#S)H71UqmAEv_Q+Wbkx z*YOWirA4n(y)8X2TkGArv@6x)=~MZ?EP-A>#^u^SFJ<;Zqyz2f%>855=@MI~tt6bMw|XmTBrBZ!FVcl$Nre`dWJS)8Buce#+*$r1u*qCMV9a;0x?cpS$_rSvGs;mR4wb z)#jI>vj@Z4OwVk7Ewa7Ytg=>RQSM!j@;cqOJ}EHpIgo$|EUetu8~vqjC;KF{n*r( zs;6(co_@jJCxvmTdiqYvxKBuZse1aBb-Td%XIoyKjr!@iZ-=_PpPu?sb>rH(^|P(i zxwR(Rxpke-XCyCG=QRSlZCLL~JTvvB>gij@We;lkpJgx66P>Bs`MvgQT#xbSQkzd1 zzw374Ih|Mc1*v-GQ`h~eUEeex)M3vj_j*u!Jav6Ov-9xY=$tKc(Ys|{+M&bvg1Y^E z?-%lBV{x06w;vsfxcquK ziky`DQFUK%SXlI+_Uykp9}Z)S9v$2k=Tki#;}$(S@-2GmvOT@mgW9ufC(Hi0uk(m^ zs^PxRNPVe>`+iF5OV!i2uIs0!zEs0~KP~m8>gijL8N3x=+=hCCzPJtRaq`|?4{A3b zZK&r4p&hI0ahXQVmum*UXgi1h?0x+|!L+{fIR0#uclqV{79Ebu^DR1xFFfB;UNe5) z60@V1gf0ymJD*SnD?#O6U`>N2l_0$v(2Jej5}`wRRSi$R)Ynr%TpkPCDOWKzceLW` zJ7VZsR%1tq*rYxAA_9t9cCem&Df{oG_AYOy>>e&k?C6!j-iy?yUvvO3Yy7OT20Hw& zmqS^75pLae9M;okJKFM>?mQ3I>?dt~c-gf(Rrcon0X#ReIXcvys7Vje*iF~n57F4I z-75J*G;&Cm1BY?OVqW?^@O)r(P&q8MCH$8cWQl{X7=a0!qc6*_dZVZe!6fhz0$sS_W2N@|Hk%!QQLxd za5jY0w%}tsscpeKJE?8KbDh+-;9W>>w>t@UGx4@l`z+k!(Z12Mp3SZ#drPBh?C)5| zv)OxW`RsJgURcJbkL`N2z+b=0@gYB3@YJIt*5`pgTd;l5_Ojg+-F3H~i$8YR^a3f@ zMHsubXn`de)xUw7ZIH-9#xmw%*9*^Pg1e=O;Gu)z|({n55O>-xImHJ(HGHMZpX+Lh~TSCu~7|AYm;diCnrLrC{E zHgSrHX|Zx4*6vf=9in=-y9@Z*H9=q%)~2H~SK8>s#|6FzO&+xM_}#wAHTU|aId|Xl z)~?(&%w(F|uNs~C84g`q5w4hBJGu7k_nWeN;BM4Ex%26DWuAZE+I71|&z)FN>va9( zy24oCP$&EapVqb!7U*4XcPubV=e2U#`@19S2kU5mE z_X4F(#_ahN?zVT&r`WK$Q-0o}+c^GwN_X&Hcs|8PA*Md7hfE&QJ=qcGq&{^{-P0ps zRSu-DMN^4h~H?HaS|_CD)S9=c{t@^;o%fZG|!XR!-4OzZd3hE+vsrXy7utN!?%tcp4_JI(m!_k z_~H2{*<*}WKb<*@Cbw?fvv%v`*2yhj_q0CiKHiBGbe+3QJ`YMz`e+qf84izPn9a^{z`__q%&zMjzO7XS9L z_>ZYi=-e^Bz&p>i$4(y06FGm!D&4WTN_S4~Y^$X4;wn8RuF_-nUL~0)ca&8s#?@kp zt7JQ;o~*B(o18oQo2;PTa?D<5dwlj+_K!wbyQ@C+Gr6k-rkt_x@Z(+fs(M#_RSoZt zbT+hhcW1lXpT*+|Dv1TSX#fSdj{#F_OCv5f9?OWBPU;V zq)xx#$cr9#RMR}0^n~$=!d` zWU!OMp92c;gs70&kJ$CS&Pe|*%#NhjW)nNEdB0bzE#8Upb)o>Z#3?=INTmyJzSmw zv%|0pdcmx=$ie5`I(Pqa^sI|r^Al%<&!Oktx?u+v zs%P9kP5gd@&%1TA^DX`g$C!r@c;2n+QdYFp9mF5zdAH79S7_1yz@B&OhN*M?NS}Ap z)!5mRVfw(IcU$nh+fJr>o{`gWfA@8%rP1k=-Nj(d*Ph+7)7&4iK$Op^jYki+O>InY zpOKeHuKU!NO8cyaE^VE(3&^^hyf6ayh)$c|UJ~qD7SF|TsWd$ohfrRcdY+4;k>&30 zzkQ6BR^`+|Rd%TQ$f9gv$-1qsZFV%40&rN-)hWl=( zzEnMZ>$=TTU#j80=Tl#*p1yTEd`{|1)zh~w!#_`bse1a>`#YbX`ce(|{esk&YPjzg zroL1?ed~Rg7pA^cJ$>u_m(NRmse1aB`z$j%?FpYn{21O=x6a&q`3nmX|5;cHvAQc# zAk$rm!qDq1dOKy4>kdYt<)xPC9l`LT7uaH4yzEgHN*hT$ukUErZ|rEV)|)0;v+21V zE%o}2cFeWRe@ENhChew)HfvF})h^xnBCX^NBr(&$XwTw2|A5i}C^R?O)>PIrbYyvu7|$^Ab zG`n8&IXa#`(9a#(GjZ`U{}p4Nl3PBq+H*B$W%=xPTd-{t*^}0~)^DGC(lMXEey!g= z#b}SX&<&X@{apMnSNfOgW$Z)sf^{f)R}xB23;jwz-ERW`d%am%-EW^t&|8{v-JHfA zvvpz&yZ(BaXm*LJXrTwaJyV@?^JCx_Gj4_<#PSu`u_27yIOzP-UA-4?*S*al(JMiJFys7 zs&Qqq->=2nXFMk>)mfU0yIki#V4ozdpUvZ0P+xggbK{mvgTg9qTpV-7f@dc`y7nGg zhof~-?79+z`r;h5#W~u&nO(RyaICuOXGGm~%v{Gh*LY@^J!2%UEy`jfxJF@@xOJI@ zM*!`bDAYgMq_q>PCuZqFr#(-%^@-i5f;5ZWJ-e%SyEfBqfZNs1|H6w#7)58dI$+y{ zRr^Hj*6rOMVU2coth2K_cD`G*6YlLk%;xK%)81}eyJxa>-@v%)sBy!f+Shj7v(2U` zK^T~?&Xc?OuGt4jht@|Ohc=&I{Pgun7e6nZTspWu@d{{L{IaxR@%LOG_K>~cFLUFj z-fXgMac{>6`z(~KN%?el5b0wSxQESbwcWDbZH>KH`0i%Y6K!^Ov&mkqbhGK>V|m}& zhTZgH9qylOJiVJNH=9mQPIk97>?zu9!91@Fo(c%{AEY+Co5ON)19U-w0*&iy!%(D`Lk~KSuaIa5wdsjE(qy+*RC#` z8>7A7X`goUenK!B%e&FFYer}6e97jk1>r+)+`78i1h;CQ19QN?()?VEvYS*}=XS41 z7;eucX1pJ=!$w)2?(=W<>B_C!Kl~zvnY6XD6D1$5To$-~a{boFe&h?-JNof3x@`tq z{Tn7XEUrEroV#yf8}<(Q!#ZfPJGjur?X1(itM2E9Wzf2f;|*M|S?^6IxOAG57z z=dQco^Yfk}z2`?LhlKW?|8eXg%N-vFv!}M&cSzZLu~B`N?Mv}-w9tvOeOt!`l%?{0 zJl%DI(ErO8`lIaXZ;#rHj+giUFSgcpPEOTxPG0-&q`p+ceP5LNQVsXLkor;$_kBs~ zOEuj0i&I~!)OY{r)7W|TpM4M1m#EbaO7>P`Jo^G;%>I0x?UbFe?0P1wEZWCer=7B; z>?LPqr)-E5^wsi&J0UyFlcz8no@#YWPW34`_>wbrrV*8r9=&!#!{SGm0(@&aiq+bI;JlTCgB}*Nz31~F}l=TyN zW$n)Ygl)R*i*}W>5>`GnxoZ1A3ART&p{_~!z-AeIvi^RLaq@*H&hY&aGp|VEEb)_qKa&m~>uHZGHf)_j$Je2nBr7}eD5F9*;ZvA(G zC*vDn;f?lBT?+?~RtJw_y#ucl6+DXR=}aEl0(pq(%S+{4{PI%d`QHWdWaR2-N1g<( zk@5rO-PU*VXiel*p^=A>$!lFIc?jt{ND&fw2#Gvdl&nggEHitO#Fl0^d9*E%hv?*~ zhm%L;KY6BG>A;7UNJEHWtj9Ry^gGZp zM$#li(h!_9ibPr!8fofYUT5ktu63!TA%w3!=#F&Ai8qAA8$vqL$uhtjZT8Z6EFI|( zoj19UZTRh>!q8NC3(*03dA!;H3#bME?$bxio+P_g&B0; zu{^b9nw7Jl4Q@$uUh8)$wTav=5y`+&-lVuT8|Zb%ywz^ zT$}$3pI~ndj*ef1dg$QHzIx{L%JRY6-eGTR^uDIg_t|^-KGojMeU%M1o^|i$UQA%i zc;&lxo~?UHpJ%sd$F?b$v%QzG#{gDKv8*@T+h4JSZSlQ5gQxdC2tDt8mPdD7;6%>; ztM7gOC5u(wP6^ZSou2~ZqJKl1d}W*bwl?{n+T?e&$yc|@ zSGCFSXp{e;O@2?C{N^_Koo(_zw#k3jChhS!d&kLs+VzeTX=D2n%DXp;>9OvOrh1n* zn!onQUq5&LB$lB$74J7Z1z6Nr5WnTlSysEE(j9%T>Kw_`yYaqYV!+kBpd3~d2MF{ss zUjtD;+1EhuFYjyMFmOd*0|$jG`x-bzT-DdW0psev1`Z$B^fhoWnI7(I;n*@=>1*Lo zGd8z*6{cv{2Xw#$RNo%6cem`-Us6?_$$ zdv#9Sqa^MnMD7usdy4c^bLt+smtcFyxkqsB<*x|s;$FtcJwoEX3XOY&d|j}0soW!^ z>w*Z0dxXTjERlOz2Dqnf`p8|}BRcnT$KNJuLgij#`1|H!uG~{N_Y{5HbFMhZy&8wO zr!gP!Q4;qOBKN^lxkqW-%MiIoaPBFFxtBL`kKo*wqH<5++?SThJ;n3|8GQ9l;G-n) zB}DKM9DIs&=~3My_!1)c2oApd{ou z;M2Bnz(;iO#LIgi}D)=Z3 zd>JD62o65QF!=ID@DUvRQdICM9Q@K!!Kc{#b~`V~?8}hYM@j5Uuz&ny2f^8=m>&y2 zyr}MxeF>3$1ZQ9Ve)eUI>?0)htI*g-$n3W+m3@T7K0;z2A+aw@WM7s6_Gw#SAJN&D zdm7kpLS<3R}AEmJ`Lu4Pp*{2w0 zU*5<*g0o+W%07j&Us@{r6r1l{U|)vBK1yO=f^B7IAHmtDm_ISFukMk336XsSXJ7t) z_GOIhBP8~#(AY=F?6)qJeT2k5LSi2wu`f$xUzP#(X#nSuQ#RQ5H7vtP`W zeF|rvqK|#9XbrNj#v%4;%`RF3BRKmM^Rt0{b&u>zi0mUc`||g*FJojMA+cYD#y&!3 zzjdkXBP8|_68i{=eOV&=vJ9|K+XDND&c56q8`y6`WnW`B`^8+@r*QTu`q<~9?I8PV z9Aclw%sxtDUqWO*cq;oSjeQv+`v}fH#W4HwM)nb${Zdr+DV+V%QrV~2e9{8@G9>m< z68jP&`v}fH#r(R!zPd;DB}DcSoPGKG*_Sc0kC51}LSr8xv){T@_7M{M2#I}!#J((% zeOU(Br)`0KL}y>_M+EkpP}$cQ&VDgh_9>iwiaz%LHOnw`WmAnq?9-UpM@j5Ui0lVX zWgn%nFGFM>!P%!6W?$aOK7zAfipoBPvtL>&`xKjBwZOg%iG7sBzJ$m=g0oLC|IEO? zx<~dUMD`J!efj&@m+=HATYpwAZXzW1tI*g-$n3W+m3@T7K0;z2A+aw@WM7s6_Gw#S zAJN&D`||_)O{nZ^3}?TXEBh4AK1Cn<+<3R}AEmJ`Lu4Pp z*{2w0U*5<*g0o+W%07j&Us@{r6q~PGU|)vBK1yO=LS!Go*{7Ia2<)qSWM4vLAHms| zzn^^>PXzW668lwX>?36MTbIf{LSi2wv5%10mnE_<%K-bdEwGR1?92VNf&C^__BDpH zU(A(#3TL09kA2-;9y;!;afp2yGy5oseF>5M;Hm7RH1=hP>?1h)6vOPx8`(#2_DfOO zr*QU5OJ$#8)1IZ;b-ph{Vjm^3FCnsz;OtY(zdo?9?vZ^7k$nVbU;cjfWsK}2B=)P& z*hk3hw=R`^gv35VVjm%~FH2-!mI3x@TVNm2*_Znjf&C^__BDpHU(A(#3TL09kA0q> z*!)4eu(A0z{;}T=%r|t^{*5%*rv^rw_G$LoUhnDZ`HMnDy|sms5+ETaAb4s5P+9_H zhzUUO1W*hoKqEbV^Q%}`Zc&%J)Af0F8a)lAsA-_^G?bQ_1{Kq3x-+ldDGDel3KC)z z5IhPL^QWw~PgAISjDmz11q6?R{QXgoF-8F)MWG5U3J5t0txJspLW%-HiULB4f-Er# zvJ6ClwuSp#h#m#G{MzdqLe}79_+hAb1w!@6UpaF$)MO3sq=YK*(8WU1}B(QWg+W77$VvWQkdj zWgrW*ExarsdKTo4S&;BPUMK3yg2wPH6m!i2g=c}HFAF>*w^tU_zDE{l&sji8S&$I3 z5Ii*tC@l*z#4I3q7AS_Zppk~MK%-}&6g3MJo`upnnSwKixs6xvELe4_#QnP@NvVf4XfRM5vOU!~S16iPL zAq$9}1-WAuBwPru3mU_-P|P(86rKf&zAW%u=w4Y+`yN@KJ!b(WWkEvBLh#fqptLN= z5VL^bS)drsf<_w30*#)9Qq(L^cos@a%>spP4DX7A94QVcDGm~191uJX6!RnDG)diK z93;dzAb1?)?~j9wF%AeR4pnGzK*(`uU1}TLD{3Xel+sd1ptz2aSQkR!zbCB;EPj01wlfnxsJOWT=}y2m(3h;cyh zILO~02N`1=5KjG9B5mJ1ER-4?idFNe|fZ> zDQOIkLowGlPEC`F9}g~y?^)HqP+_VKPb$dTfJlHwpC#sR_OKrz2AygI0RjDv(22Lz9U{QYr| zF~$KQ#i0r<4hT68txJsqLW%=IiUUH5gDf!)vJAw5wuLw#dK~1AaggxZ@amv3JPyTN z<3QnYpy-POpM2RX4r<>c4z%YuprklRh;ay>8V8gX2N_}<5IhbP!*S3^Lvf(d<4}qk z2MUivX{m9b&>iJnagZa$0VTyjLW~1~$AMygdx(R&$2drcaX|1m$lo6a8Dks}QXHz# z;((Cj(7Mz(Afz}Tq&Og?ILH#?Aj?1;Xj_N_qQ^n*7zYVI9O9rcJPyTN<3QnYpy-PO zpZD4;4r<>c4z%YuprklRh;ay>8V8gX2N_}<5IhbP!*S3^Lvf(d<4}qk2MUivX{m9b z&`suDagZa$0VTyjLW~1~$AMyge~5#+$2drcaX|1m$lo6a8Dks}QXHz#;((Cj(7Mz( zAfz}Tq&Og?ILH#?Aj?1;Xj_N_qQ^n*7zYV&331RE9*1JCaiH)xQ1r#&+fCmq4r<>c z4z%YuprklRIK*wx`U$e&sc}GQagZU#0m0)yF&qbtG!zFKJr1R)aiH)xl$II?3f*_! z6$d#|98gjmB*Zu%cpNC^cZT;4>K@}DA;tm0;~;;39Au1fKuB?@LW=`JjzjBG4u~EHxnmq8JcVsoud-?kk3%unI8b;TDEi{SXM6XGgWC6q z1MN8uC@BsS4uv=bPmKdgi-Qa?4hS9xis3kDq@g&_=y51TjRS?pp|sREQ0P|lt~kh% z;((IkAR)#9!Q((N|5xGFLEU2jG9B5mJ1ER-4?idFNZw_(L7#@dWu5qC7I8gM(fp2lxD-LSkBM!9ZIH06B zNQiL=o*D;~76%z(91uJX6vJ`QNJDX;(c@5x8V3rGLusjTpxAuwVjSd1aX?9NkPzd5 z;Blaszazv!-D4ai#5f>$9OUnhgN!i_2q_L#XmLQuacEs?91v0*5KJPs7|BOwmz z9^)V(#sR_OAb)=xWQ=h@NO7n_ivvQAL+euGfRN&Vkm7)l;vh?mgDeAapv}H>Ie!}k zqQ^n*7zYW{5C@InaVX{*2MUh^MPD5FzMj3}p!PlDpzr%BRMZFeP*NNu#5e>`jRQ)H zgA6ea2p$KD;W%idp*Ya!aVSNN1BJ(-wA47LnBI{d+*9uq1(Xy82{8%?9tDc|bs-As z9-|;3MghU2Ab)=pWQjRJ*7fub)8d_&b zB*ZKrcoyXE&w`9G3kWF-RcKj2$XRGzY8DVu77$Vv5K_%_q`%7WVW$O7#-3n(cI5@HsDr)B}AWkH5_a}DY} z_K$rV7J_GiVmJ%5PKUBUqi3NMH47A;h0;>9Kw%H=qSvG$Y4BjuZ!!6bA`04hS9xiunh^M}5>i#z8`i z1A@mv{{A?~7~_DD;!uSa2ZS7l)}_V)A;ke9#Q`D3L6#T?Sq9=j+d>==Jq~imI7s+l zcv4AYcpQqk#(~1)K+zY6?=pR_IH-M(IMANsfRf@MA;uwiY8+5n9At=bK=3$F497tu z4aI>*k3%VH94I^vrKQG!qCB{l;~+LGBm_3Ev-H z9W;i=p_pqNC_D}neQ|iT>3hXN?R&(5_8bS46bA`04#897fYRb1LyQB0$AMxv4jO4F z4m5fkN>SrL;c+M}H4YTzvF;oPIZ_-@QXC|FO^5@6$AM!0t`G-xk8zL??ToKuB>wNO3?&agZg(L6(6y(6$fc4z%YuprklRh;ay>8V8gX2N_}<5IhbP!*S3^Lvf(d<4}qk z2MUivX{m9bC=c%CILMLWfRf@MA;tm0<3KV0$`A*2k8zL??ToKuB>wNO3?&agZg(L6(6y(6$f*k3%VH94I^vrKQG! zqCB{l;~+Sb?9Mrx? z9B9vRKuK|s5aSR$H4Z2(4l=|zAb1=ohU1`-hT=e@$DtH84ip}T(o*9$9OUnhgN!i_2q_L#XmLQuacEs?91v0*5KEC`F9}g~y?^)HqO-2lsLu;nhK7cpQqk#(~1)K+zY6?=*d{IH-M(IMANsfRf@MA;uwiY8+5n9At=b zK=3$F497tu4aI>*k3%VH94I^vrKQG!qCB{l;~+S7@K z@1!+P{ghkqRNzq>@G?Z;5gd4m4tV?B+*N?6KawV6{7OlL_3ghY->*xtv0Vu-E$@#l zm2g^g{*%8#UWW5O!L~2}crpYf0WKi|j^Kb(%-<63Gpl<9TtWmK!2y@QA8;8X;0Ouu zDm1_mGT^OC1sov(j*tLHNPx={0heU}aN6wjCqJ2r=zzAOH0L`LgzUddl}A0>`@Z-5+e2pjy=Wvl>vKo zkJw9y*dsXh^7mseW5gaIVPA!YJwnF5b*b1RB2J=B%4M|AAv z*7v?t>?M3}z+PiG_QhPWr*P~kda$=`^v-kkj~zbyes=sNc1W$if&3*lIU3JzYCj_$ ze{-|@@o;$F{o~=+j4!;#LWqIq`(fr9a@SCn-miO~|^h68w`6t;w zM-IM(ex>)()1yPD%)fT?zR?l;`vQ&gBi6ohdbE7%+R^wW6gHow(Sxl0pV2=1SGE-M zue9-BOyl;GZPb&$=S*?(orkH#CbZ_}<&9B1FI>G|g_jb32vj_%qx|BLLc@02|KjM;Z-Vtw{K z`g^(kciz4ScxCo|s%IQwWI>w+@!-sHrT)#r(*^`|BRuZf9UyT`JaECZ7=)pPwssB zeNSIIFxfwzeZMX2c=iMK@5Xuis@s*dm8A(jR>l6X)RP1E+Z40i{!;sA^!8(um90aQ zmF?%)oJMb3nmxrfakf~+j62(tvDvPCwarGy@!5OKx^`r8Wb1LG^IvYQYey$X4{X2B z+PD7&ohSCI(_g{FQgI#FewVc!*#15H_xuOUeBc6Gd~$UAt2DMjwC{w?V)T-I*S%uj zF;=q6_$o}zUv+%+0%hE|e`CkJCQSH+PSAu2zt{_VZnzS-H{fyFi{o+1D{D8VI>oA}wA78Z% zsqT-qeQ4cpD&04%JE6YDMn63JWJX^x&X2F!K2i6lY4ot)#P3~=-|_6HY$R5eqx9v4yJLA_nK@%qYdM9YYgx}}{O_=bOPSAu2zu5_z zu&vCo|BJLoiK!p^f5jHr>Jz~JW=${b(_fc-h5c6!^>0yKz8+rR5zjyRTJ@RzRJe_{ z`Bx^ie@fF^X|fFSI`D~hQ2#tQ7_IJ0$JO7kPDkx<-E&y&ntG0^T~l{Z?dqOmYS+{q zQoA}FQSFfbo3C+aR-{chK*-$vbk5#mcvov*R*KAYX3&imi;hMkCERoI`SHw z{_NuJl^u7|588hE=j?~e#iH$-rIC>^`h2wU{x{iiZC^Rpy2q07Ldu=rGO*6yOHgdF zo^F3_Q(avC9Two)1yP%pKg7RoxaTu3eU8uwf$y)mQ76dZ$F#bUgr*Me+E;${vR1FPY!H< zrj@pSX8A0ey6LCie#z?6#r5lrz`Fa!7g(3&?dQ;OdHcEc$4)hM1UYbE?a=9!qS@4F za_Cff?RnYg+?z+2*s!BV+rmL-2t5&l=D$}oH`cE`{`Rx7r`{M7g%i^R$D|Lzt` z6DIthPSC_D>-*RA9i95p@$7?|8n4ejq!HI=f2qGqJMYG1X8QzDIrY|r3GeL$O=z7z z!`HbEH`BT4-)g9G&iZ#{dSHd}%9oX!|F|J;=g8;Mc4Co!uUi65nDG0Zpa~P+*9n?1 z;SV}N6DIs&CuqWiKk5WcurJ4>yLYeG{EfCuv;9l#&*>M;#+q24t<=BE_3t75RSIWE znYQCHv~{znO0+IHqqbxvo-zgS-4xL_J7a98CDy3 zSjZ1_bJTgPy3R*;RFkuF+q`V7960joB659IqJHb<~87 zcV#DN!UVfmQnrF7Ot`ueG-1LuouCO5rk$V(6E-_R6DB;U6EtChT|Fyv(F7bk)3^1r zc+nf#cDhYVzdpOJ{=G$iU;KU6KD(i653YY76539O>6^;5y`@{3J&b9?PWk)``}+mF z=A5^)X?tOre^B^cYkiKa?z^~ti!FlQ0P5Y__GenB8<*!tPQvK**2zv8F0LEA`xZN0 zr%tD=)7Q{pJiC!eo7ukELv1;_v7WrU+g9gD-M&!W9%^mJcrm%Gca|?xCwnPf{+hRI zmbZ43aV#zB+J1X&(P7LENM$Ez!uHDbouG-&8qa>)*4nni((F+-oV_~F&hi&@Z|J&e z!h{<;K@-vYnCg9O=e0NBWxkp)@2nFv5xsX+??-jshjd*vVct`npa~OBcY-EN*y;pL zd}mmz$JNoFpuY!Z|5SgE@1K2KH@llUuO@7;hjxM{On6u)Xu-M?-m$`F+tEy=C|1+~Uo4vV%Z0-ms3J4;^MZ93#R8YK?rKT3Bvq;M#;`R z0M7o8I&}Yc>hPu69sZO+-zF(0V&m(xT3@uEe?&Cz8ft$O<#Fx#e|=jnvQNb4d0xEZ z1()|JP{g0=5c%LWJu@{eH6tw}oj>#=51Po~i;3FafjI&HuNwe;`P7@n-#8ZQPont4 zM0H^ZyW(;>e1Qlb2~gYKSCkat|1=ZY=hd&*;l*8x8ElzjPfHurD;Zfo9!rj8pCCx2yOR?=YvCLKy z{!`qM1TV_%JFCEpo-bs+oLBl|W1bG0*Lg@E2W`(ifY^5F9D6*R^I4HNt00JydoFbaQO^vGUhe41>>s|= z<)HgA7Nv&JmgEUtLTGFhGqWSJYft9dz7x85(Y{_>;+v?agIt8fMMYgWd{|rVKOR!g6DeG)7m&t_euR#opJVM^92A5ji#2`DhhT74dAc7pWO1Fh z=5WfVgfoQ4Kzvp#WjUibb|gyiqw{?@{T3We2es+XHCcHH$0lbmyNI6Ekz*qgIkpq} zuopdxG2);nI&zzjl|DZd^r9e1-#vt5_b2cuh>PU@xg(oXe&)eBJS}^14*Tv!IT#&Y zR3mw=lhIL}@kmAxUFM_F+9Q1yr3R7C;PEm#hIwmWrmHKbc`BWCP3%%v2)!($rb8Z& zluy!`Va3d--pnh7Z+B%~lF9t`66VlwW^e|xNgdx7b?|8{4<0&%*Pv9n=8Lp969DFmKj1NE1OJJvh%Z zI7aBV=)G^!HJ1?i(V_y*=LQ*fQAynL-DPImlFLWOuLt+EyJL8(m*pt5mR@mVYYrJK zbvq;BhY;>Z%X)D?=>hGa)%_Qzd(kc#DS_yppQwW@Eo zPHn(E9U*ba?W0r6pnHjnE8(~{G?ZNUNMMx<+o?iYDehAnyJA`;Ze|L*KD3$?P6)$0 zMW^;u{pcylrFUv{YCjrm+{=jTM`g4{;_i=RS59xDegPEPH9B>gnn0gQ-06Idn?Rq7 zODSMCkq(Jl9U7flrDl;G#RbqX>`?>VL7w8a_lr(Fu3n@u;_|xjc3Ww#xLdrUQ_rgg zx>wwT9oc1m;`XUM;(o$hyi!|zNxUEM^Tc_(GHd|Z(4aM7# zew3+)OWgYs*IkbhS0yf2kA)*jk>l4xkGFXvmyK8|<*Oe028j!kxO_O?+pfkFs2*amtEZ=49c0 zLRY(!2)QBc40vAzZ#Brz?twIg=b^8R=a8*Z)*C*&?IvPTQNIDO{=55#ut;RWtP-5m5oelYY~ z+2PBcBCBH&cfIMoZI((IG?k9IiGtIIG^D- z;to0%&3pQhtFPp61-LJb>(jrKnI<_5N@9Io+Ew6*EYU@r+l(}3No&q?Ytl6w8#M}C zn{bJbqUq9?W(z-W$93Qqc2JHUi!{@cCxRW4r-R>ir~v(Z?ga-WFXj;GMRyl*&eO7( zZ^S%~aI5!T+M?fn--}}(Y|k7Jwi0Qc&tq-x#U%y_-%4VAS2&0N7_|mzT+z>fFBLoo zHc44C`fY+<){j$uCSzxt)cJWQZ?)2s=~c-4-b(ln=Z_d=k9aa47Cle&9WgxmR`%ua zJsp{e{khlGmU7QoFTLnq=~1^z@4Bj>4(-3Xa2L2WG{NN?d1;eMea z4j-wQVK(L|$zgzOwM@8Q=$7;Yg^vp#O!h%~t8V|hbx4t#Op#i-rG{5YiED&0!j)31 z!@^<0pQPqiJ^yMiyd}4mdofl@X(J`}65b^tNs{taDQkxCoRpFw`X$kR!W)Ek;b`GA z!f%C1l75WvIbn?Ce4CWgT}lj-l(z`$g<4YP3hxwd7e1IA_%CYnmM!*rCinIcU76M> zo}Ixnn>DwLE#~?BS{d(Ig(0ZV(o`Pfd`45WLc*;%;eoCk((=4!&2=r$ZZ+9l$|;%O zu9x{O7jrn~MmekQk~}k{J`c$ZY4x|iUqkC0{Ze#fu!9cSxGb*i#pmCDMVs(;%UCZ`-yhVGqY!lA;_oHLA>KC#m`8#cEm9nXj zkIs~0W@$EatsJiaY4c(2<=Dx3qvhOUjr1F3w&^G%?!n~Pe^Hd>dC$~d8{6mhiwOR}E=QGzwejHxm&olf#<=n9g45V(Il7a)NBqkL-Grt69 ze6va!*Ym1YS60OL;xl`NKhOC;1!N!x>%3#-?embDw+3^XGD(?it;!@%EB}_U)Cy;L)2f%Z z?u%no+?koupZS<4bFGs(O2TcKeS?2bpV9Mu9ED8@%$*>I4@AltnU{lawPijeOz6ux zQNo90vtCfhY$y6y2J6p+XM`Ihe2JvFM08J2PV=tBJ}q3CdU)vF9?GZ)6Qc z3v~1C3tke)E4tFak!8ELVvT2WFa&QPuuuTJBSIqgg3h)FmU!eKm z;|&YVdLDL-EgNY7uJ~Tz-7m?;s}40biDVY!FGyoW4T_vYS0d! z8h5r!O|X*&%Eg(LRFSwQ*o#gWcR2IeU?1ASUn8`nPat>8$CPqk{cFY(3T z7)mkjlf+lxvWz>QdX{1-*Ep|Et8B5<%Q(;WXDN>Q8yDVwl`W2j7+2MEA3lS-#<)j& zD!6gtDxDdTJE<*AHm)G@z2LU^WS{F&=^Wi>C&g2xaZ~!d7aUIu#LaW6_y%f6tBmuG zcf)P6oE+))^eaAP;$w7eL2)-SkX58?|0JsWq+nwKcJBx3eUNBB!yJXs9Qa*+} zQ|Op+YY~@17mWKl{-muV1Db09RpBHncx!OQWU6?QMS+Zk^@mTnBvLLI=cEQgyo{!Ra(HgWGHy?dkoIM+U8u z@BAw1O8Ym#nRE_cwemQcl<`e)SK8mha!+L1+) z<~buforUXZTr&DnA@w&d(|(qU=t|>y+E>|%=o;fXqo4JpvBnjnpY^24#+|U8#pk{= zjQiEL%GQhK8pr*mH!U}g`%7uK$6F?}I!o*cgt`pP&yekJt1abr=> zKJ>G3(^1bpWX~u3S^M6Xx{0&)y_8DD&2#dxEu}HW@v$wX8OB}6_jdQA2aIzR1j6xW zf82L}$=pZ%=~d(GS@<-9b{Kb6yDIwtYBX+QyE)DQbjCP7?gKA6?gPoEfb*<$4nqGN zM8U>g(`}V)5XFj{=j`1n%zYW<7&oX>G+fE=F0!rravEgZ@W@2C5ynjqZNR7HQ;nM! z>V~_^a_AEdTpjeZiMys(mHi5O&bS+T&2e5quNZe5;;y8v#@&m!D`~fJ0R<;%2<+=kD(oXITvd@ zTuaOQTX{~(xYT_e?P+$GyRWB|K~~%|VL9%}6u=i^V7$k~=D4TOI^(+e zZXSJ%o;8y)jjMMBz)dyom)>LDw^Hr|E9Lx@N$%TeaI>54o=uy?Rnoi8Iqo?`*IOl= ziC*Boi-sCUt|jifX{mAVB|q-ImyU_E#`}E~%NInLx$b_t#kgDPNbvo%*tmu2Nbm#n zs&ND9AMOWfkGOd_ejD8n(Ya>#x_c?PZjf3duEG5%#aqs~s{Mq371Z6hb?x`KSI`9G z@-P=XPB$6X4|BoebenMp(aWEpImR7BFMom-7-vIVH7z#I4{_DB!nhOt_fZY4Htu|X z1@}+m90T^zlk}o-tp+H#EynTrXeGUA9G{O?(jMbJ?Aw5E-wqh}WnVX3lX0yQPTE$} zapT$~oQ3<&xCw}RiheTgR>VC;wi~6DoWVFZ{)4=Yi^I9`9~5jHpEuV~lyQ9CTtn?F zCnKkpvMzE1P0Ev9&r&VjVBGnxt8BGYVcfFF+nrC-3gi9}In(hptv4<%smi{V-Zm~d zX^wL(H5&I^rw`rh=$vt3-Us2*aM=yd^969v&^Y6`*8ijmaY$%>FFxHjdBe z&&o}7oD27Y^%OSQ%9DG+dMY)Jd%*@8V;uK_4Ybra?gh`$dgHhkJV%F(<6iJQT`-P& z!Sj?h#VUc1^hPQ+j*s+4nq?dx=@)3RaeSm-pdFTzmVc2lZ{l3G(H-p^^dgms+fKfT zN8n}{7wL1z{UR+eE-LRU_e=DQI376;dYN9d9NmrYvR|eh#+9X>bH7Z%az&Dr@>LpW zIr=zyhkljfaia^jS(x{4?$>C9aRqR%(_+g>30o*7GdV|Ip$Ng+8RT#(p zY%6UvE-uLtvW<2dmz?AUXI(lz&zaD=ff^`GE+n7l%xvw3D>d%hPDf}vjWO=WP62RB zjVmZRg737~8#lNp0Pe7HyR)k7JLrOOpJvT*?x3_8);>_0f5=WMHqI-}4L8fUER2V@ zXt8mH7!PmJ4&!)??V?8Gc#Q3$;F(sQo71Z7yD7!E?P+tIyQ$2$%+f0R+cd+t{L(qj zw`r~Ad9D!z@&tE9H6Q6YP1Q>En&;cU2% zHqEtMhmJY!{d8fW<@oIMJ`H@(a)q69+#k@ohuO_@mM15Kd`O3lyAkdHMLlB0wMxzi z`G^J^*B0($T43Bq9WD*|gti%X6z)^HVB8PheM1gX=29ycPoKUapV36)vXh5|d`_#3 z>jT$FpBk5()j&;j#<<)pH=J{smCM=Eee?yz8u!nT(IH<@j&UD_j)xm)+*hHK;KmrY zC31SmA(~~}{>WKy4;Z&CYEH;uT4UUSs4BQuje8OA29MBwH9Kfu0TcR{a6vuJv@o)fo3v zQ3HKNwZ{4Mbi-{lZb@DPeNDTKTb1XAJ80a;*zN=!G487(H{2=X#$tqjL(a#neV88Z zhKn+e-|>A*na1%uzHh16xRRgZJc zwo&i?Zl7~BtJ-pNz2bd-qLs!y+b-YZXWD4o_n9d^7s#W=O8H29zQ-?AVBE)D@;!c~ z5yrieHPPocT4&rd@e_SWO@7MS?!%OcK1yvfZhMD`K3eTD?zzl~J~q{T9jC0MyKoJt zU2QZjxc|BkyGne-Ev+o-ro+{`0-`$Q7r`pl%_Jz1q@y6fdJ`3?u z6~=v8`c;UxIwh`>ZZA>fqt?G@rQA_+GQ?NyF>XcCk0Jgl_9ZKBMUe^(RO5|%1J`x6 zQWeJSDT#pFv6)j^>v^}zdDU|K9z8@&5@*edp{hdMJZDsw1`1Wx#$|MI!+mVrhlNKd zOnqV8mxTdvUmF*Xb4R%P{`c*0?g&>Gj9Xpo2#HYk*QD0Y7mK~%e2t6k;0ldYI055t zp7W9pzHqU|4NBQZQ7YHCYf}_lKjZp#Z=h&(g>hxw-Edc1PTp^}Rtrqrp^~7`)@qe; zr%S@%)>}^cV2s-Gx>b4;Mrw?D)41<2Qe)H}%hB${n9x{7bymtH#rvqOiWOH$t2-PC zZmV`1_iI=}XggI=FDbEIr_cno>5boA*U)5jq}k1&RCTV|6^5p%q^-ZF44_L?UbA~8 zI77`4XPwnD)wANPnE`O`7}qxUEM=5u^N!>`pYO;M^vl$`6IOX~g_A=sQ`?M7E}Rax=XY0p zk}g-rjLRwBXuDipFfIx`a%AwdgNf0XdJKPu26Z#@k;IrHQ2aRynnb-O*F1M z-alNaDvaZE;}EsfI6gNHQR^%xEiqJu;jS-kvx7Lx3{`2yox@pXs46mU8frF7jWF&W z)NGiVY#e`XdX>7zIR4!9Dz)4=zsv?2t~MGMndyc*XB@9QMyLSXV#cNO%439zH;zAd z8>zY*$Dg~6R0G9XpSNDE#u>+-*Ilhp+Dl+czY&YCc;|^j?J4Q`5 z?i;LW$Edl+4aJ)FTD9D`aahw{tJWKr7++<-PVF$RYy2GNb?Q^&4(hWsR-G~KlwM`S zl@;Gx^?U(sHcrJFw*zf9PGuU$tBdif)Hq&Uj8|pG@w?9nYKC$A?sI~&K3%S)FK`aO zUM-L~>yzh+YL#((exInGwYHN_mv2zNe=fzJF5jT)B(BoQ>z7H&`c%5o$?KO%>VU*q z=c>tS@CDun>$B!5D(yGR&51t}e2W@m-1aU7bKj=wjN?zGZ&$~}Sz~jy zijjLmtg%_4I*Oa;mGw#0V+e0hWP~(UFI=c*mX@tB^gJ~fWV^j+$VaXhARRgAY)9*^mHD%Ln2 z)ALlOaXhB)R;9-An7&(;8FvHLeD|ms#?8T+?;cfUTu;=qN-Z+(O4PGTEjNz8C%IQ` zG>*R~xmWElE*+o7%vX)Z^~9$!^VJ#Scul)N`S@71<~8jCm1rE#DEFyi<9J57PmM5+ zXO#QZRO5I?xnDhC9M32V)f(e?Mp>w~8OJlq1L{-bct&|ZCHh*W^Ng}c9M3jSs^9>to;=$;snU$&*=D6GHjZbTm8x8v zHQTIGQ^i@c&1w_3-O01fYPG=HPR?9Usd25i1nU!}r_?EN^JFG^>Y|zGDHRoL)rDuG zHD)H7Co|C+l__!7OjN5*#d1pPJFur!QCrLLcVO#PYTYO!(q@ZJ1&wZ=H^^KYs;t@~asPZ#u4J*7v!dr_}@SNWt^`@r+(UKMW~&!2l$ zjyUVw_})e5#`n}fiL-j-zUK8O_qzSfj(gn)&5nEBfo8|O?qhW(n@hKP-KQ$KGdru- z9aMSZ@Ljp{2pv=-jhpQZfSYXGmyRR!nYz!o(+=DXqNacNyxJGr(xT~;TlM2YO+GQ-_npC`TJrMVW>TX;q;=WJ=jdLTL=1T^Cyox5T(n z?R%?}YK3tV+IOdu>M7%vVa;$#{nNNwtQk(JmyFwtxYKHjak~(ATJ5l$?E7~rVk_^_ z9OL4}J>*CSuI8Uekz{=A(s{Iji>CcRt&^`c;^Ca5tk<<5JsFx{yuC$r2 zK5A0-Njnzmt4|s?H0@=VuRdoSf0l=3z&6fko|8Yz^V2TlxG(wZK;yVC`RfSdhT^l| z0Nuv8aizE$OeY(6Fl`?N>I~z)NmFp$jpNVqf^?B_Jl6&3e#Y@xw3WWXI9|`U(pMX| z5a*R(eVuWStrVdvjN?{{&{f89D@E!>#&Ih}>PIanrAO&K;;ho6boU*9lpdom z7iX0oqlX*ErN`(o#&PMfdZKY$daRyi9G4!aZ#RxhkJIyv)A%&4jlSQwR`@injef+q zhgyFd+Ezbd+>@=(z^$>I)H+^Y5NFjIZs#AhPSCC1vib|RS%QuLvxx@kvdl{zRNL z!n5^Z%Q<u*qtaR4D821FmN@wkO$7(?y(>dDDI3CkEI@CCB!7e(+ zIBvl%I?*_8`K~(6IBxl_x{Gn#O5Jq6aokGXbRXlmmAdQ8jN?}7u7?}v7dAd5SC2L> zF>DgtMB|nWXrLZ?s&P*YaKlwtPFnX;ZF|?+qfhaU_EPO_+;P04y;KJqw+V51I?A|h zh|AOMEGN0->$GO~Mo7LMWKuqZJu1+{jBCIi73fjM-Gx0W)Dw(bfjuhJQ!OWX7U{z# zE)L%V73mYkCF6UbB7N34J~#H%zZl2o#-7@-=Z`(=rTvWKJ?f=HjpIG)tz(SiJ?bqF zb>rFeo{|PC)@degNr@Y-i*Y}<_75x3`Nnz2xZz4IC$;XQmy5GzsXqGki{j3h?I!fy zM}71K<8JD!;5_zPwSKDOKI*G|jr(Uu1s7u64D`rS-P*Vc^vF`3U>qO6e!7!!ytn;y zj^$9ZsIdNenTg{*F-X@K$9-aue%d&$*=71Ud+!*rH$+cI*)hUp&0&511vyGr*m?!nkTa084hEqRBA>mkMsFB$C`uFH&T6Y>s? z(Bq8j6f)X1LQgU7YS&I0sb?B@z3aW;k@`;KX0>mitM$Fc-QC^|_mFW%ao6=V`Z429 zrMlr(Sx$OLnGW8^En)SLG99+xY8Reu%5I)EIL>8^9$_5kGDcr(9QTlG^$o^x54l!Px18j1oqoW?aW3QZQsX$6ak|F1rTD&h zyskBFWyp}Q@%lN-A(xXO6ZCEq$GJ?@`;FsVChCL6g>}3->;`?rxVVmE;J!7k3VrZK z{ey82qYvJwe>3hy^ubBm6A!)Qk-8OqaFPzN97?}FY_jfV;<)swy3jZ-eX1@sj!U1W z2OGzwPtzlfIj<wmYUTk)}-Am1mw|n`b?Oth)a3{R% zOIQr=k<||Gp)zzS)c76HCw#L!CSo8JcR=ADY_2XD>y^BMvV{tde6n=|AMpjFGRJM9s@+n9D zHmU^e)QB2-P_|QQ)f|f_Vx)3DxG4!KFG!F2-#T9ZyZOYR#S}5Mw26)G&Et@G?41>& zaM$JUE%u-F@c((;tfTNpKhZKaZS+|(*Wr)wi}nA!-2V$Xe2#Ia&3t|Y{pa^t-5Q&J zpFg0jG(C;pi21F6^WnJ;&ot@r2d$8sF#F+&64JNt12ydk;Sin=HAVMosRIJ=JeNqG z`LB=>YSrg|GJ}0CW8~^guIIZl=d_$r+o84^&n4kH{M(fFzX(^vxoMMIOKs(E@y~VU zex>PNjMj^Lc+2`+;=^fH^yf4!^`CQVxz&Fh+cKY)`ajO$|3Y8=a~)dN*^2$+obsQY zZCh^pcl4iI_0RSB*M$s_b40A2dqNFHkS0t2D@ttH8voT+wR-h`yv}Kv|KHL7e_Fm} zO7^dTTxZzrmIxW>ze+qF`;4t?Ylfm9?T^ z{%7;Rzapiz&Sd^)rT_hue_c-(HRj?wO3;C49W>^8;eP$b+yLCw&g>%07nTSI35N;G zK{t&TJw-TEI9@g8Mo=XfK#M>;8x@SDaLwswf(cX$rcynaMa$&=wI=B9G}FdgRSGwQ zHxlO-fJewT=FXsS(1CBGy5MORmGVrBMbs{|3Ywp2QHjzW)CFmlLLcb;IOQ9i-D@>M zj&@m1B_`y$#C0@Cbd@@g`8;BMBO0iN?(MM?cP;i#e+PH^?R4$~e*!D%aeRMLOKWkb zO)X0K5GgP1@i};9zkM{!&Uf75=@^m6soc)rhLzj-`>XNxuloE>1LGGU%>g`-V=s;ByGZRtDG#e!`<}wb)JJkOKcb!eH>kb# z+X@?Kr~NzJFWe;U{E_{=+?UjGTGhL^YO?bu#ixnCW#VmLRZSGsdK+T<_i3Q>azDXd z`{3v!blkqS*IVkeeRH2Z;OxTV;4^)`MTx_D{h*Y`t1-Vo=MT{OH1W4oE)P{2hG(ks zk&W|sv`YZ!?uVzuczoF3O-UY`6Wi-JkFLnM*1obUv#3Lg4wUpRYbzm#pjUew@8rO9 z&KHIq!CnNl9;~}~o`?YI9?C(xD72+;xQz3k{$+5*WuXqHpHex1|MCSA%(S1%^Ns%LuSqn_!?H}4Hy>G48W^lA_O zZmrVewf@XK-aB-p07(^l_MQ|M>giI8C1AoW2{+$-tvL_vgY zFZLzY_L0YPNw|;AgO6Q}-Hm>gk2=qwLFjJ@w&U2UqwOO*w?MiY86QBWJ#HzU6)^wp!K8 z>n?C{Z`MB{WHWNZ6G}k`cy-kMwr~fJ-zrs+`LHd{=)2pkz;(5J6=|(Yo&*hj&UV+{jUyqdAqB*4po|sZgLuLGiW%DTJzFMXDDvVl{Kj3|& z;iryNDZWahO7S=GRf@lXuTp%S@?KLzkK_xsj}(u6m+mm2(C*S3Li>PYLI>HKkY*_K z`w?U9wW=TTtW^=xGy9=GZ&tsg>?4J`O-7m@BWBn)E3S`A=d@;h3-o5ib=$0-PUUfQ z+koThIP#o>+??sNZRer+TA`iJD*I{mlaOOw`0{aMLd@VB1JlxKY*|{vf>zZ?} zCC<~Oe@obGKd$&5>*H!|&nj%i_c9GaJM%H}4xeosCP!^A-Pq%M`!L7Dcq&D$ec=GR zN3B}sH5=C|@EqPAFL&E*_X~@l1s(btqydo>kwNJJ6#$@ts$DX?pr~9)om`g2`ZG?o^Mxw8U#B zVwZSTg4`#0b~-{c9Xn#HJb14cdTc;VUa<|*Gka|G7>2FzG;V!apG_!hDE2O0hh_6V z^0QcGI+l4=d6a8D?&X?ia+iK1dzEdbV_t_Uq`w8}Ywg{NCOXnJw{1GoSRpq%l;(Sf z`AAhbDjhsSZczX1Ki{!I)!~{*-n&JPy|fv}E?qyJT4m=m!ozA2QXauGS-4iq9A3Dm zxK#F{#<8{VL&soB?|&X!P3!b4I2RmDD&FDg(ls&Oo<-Q}5YJjiHsAf2{puXq4D%0F3S%bgIX=68b@Tz zkDfJ-PfG%w6Qz{yv^o9~XFgi;YG;-Dt%OHqTg*sR%9edCLh}2#DctsAQFr`g2+zHX zG>`OUvX4sh{m4r5eaK4lz1K?Wpfumbzrm5;`Vr@5$Dy#5(3|5QaW2!(N4(

4?hP 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 ZMpeY}pSYAmn=xDPGS44>{{NG}{{aya=aB#a literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/AGV4.csproj b/Cs_HMI/Project/AGV4.csproj new file mode 100644 index 0000000..9abdb03 --- /dev/null +++ b/Cs_HMI/Project/AGV4.csproj @@ -0,0 +1,538 @@ + + + + + Debug + AnyCPU + {65F3E762-800C-499E-862F-A535642EC59F} + WinExe + Project + Amkor + v4.8 + 512 + 게시\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + False + False + False + OnBuildSuccess + False + False + False + obj\$(Configuration)\ + + + + x86 + true + Full + False + ..\..\..\..\..\Amkor\AGV4\ + DEBUG;TRACE + prompt + 4 + false + IDE1006 + + + AnyCPU + pdbonly + true + ..\..\..\ManualMapEditor\ + TRACE + prompt + 4 + false + + + icons8-split-64.ico + + + LocalIntranet + + + false + + + + true + ..\..\..\..\Amkor\OTP2DReading\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + false + + + bin\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + Project + False + obj\ + + + 4194304 + False + Auto + + + + False + ..\DLL\ArLog.Net4.dll + + + False + ..\DLL\ArSetting.Net4.dll + + + ..\packages\Ionic.Zip.1.9.1.8\lib\Ionic.Zip.dll + + + False + C:\Program Files (x86)\Microsoft SDKs\Speech\v11.0\Assembly\Microsoft.Speech.dll + + + + + + + + + + + + + + + + + ..\DLL\Winsock Orcas.dll + + + + + + + Component + + + CtlAuto.cs + + + Component + + + CtlPos.cs + + + + + + DataSet1.xsd + + + True + True + DataSet1.xsd + + + + + + Form + + + fCounter.cs + + + Form + + + fUpdateForm.cs + + + Form + + + fLog.cs + + + Form + + + fJobSelect.cs + + + Form + + + fSystem.cs + + + Form + + + Form + + + fVolume.cs + + + Form + + + fMessageWindow.cs + + + Form + + + fTouchKey.cs + + + Form + + + fTouchKeyFull.cs + + + Form + + + fTouchNumDot.cs + + + Form + + + fPassword.cs + + + Form + + + fErrorException.cs + + + Form + + + fMain.cs + + + + + + + + + + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + Form + + + + + Form + + + fBms.cs + + + Form + + + fAuto.cs + + + Form + + + fAgv.cs + + + Form + + + fFlag.cs + + + Form + + + fIO.cs + + + Form + + + fSetup.cs + + + Form + + + fManual.cs + + + fCounter.cs + + + fUpdateForm.cs + + + fLog.cs + + + fJobSelect.cs + + + fSystem.cs + + + fVolume.cs + + + fMessageWindow.cs + + + fTouchKey.cs + + + fTouchKeyFull.cs + + + fTouchNumDot.cs + + + fPassword.cs + + + fErrorException.cs + + + fMain.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + fBms.cs + + + fAuto.cs + + + fAgv.cs + + + fFlag.cs + + + fIO.cs + + + fSetup.cs + + + fManual.cs + + + + DataSet1.xsd + + + Designer + MSDataSetGenerator + DataSet1.Designer.cs + + + DataSet1.xsd + Designer + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4%28x86 및 x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + {8cb883c0-99c3-4dd4-b017-f9b92010a806} + agvControl + + + {8bae0eac-3d25-402f-9a65-2ba1ecfe28b7} + NARUMI + + + {7a94c30c-6772-4f71-bf9c-0df071a1bc70} + BMS + + + {bbc9bccf-6262-4355-9cc2-37ff678ac499} + StateMachine + + + {f31c242c-1b15-4518-9733-48558499fe4b} + arControl + + + {a16c9667-5241-4313-888e-548375f85d29} + arFrameControl + + + {14e8c9a5-013e-49ba-b435-efefc77dd623} + CommData + + + {14e8c9a5-013e-49ba-b435-ffffff7dd623} + arCommUtil + + + {476c8e64-7b6b-4554-aca2-04302715750f} + PLC.Net45 + + + + + + rem xcopy "$(TargetDir)*.exe" "\\192.168.1.80\Amkor\AGV2" /Y +rem xcopy "$(TargetDir)*.dll" "\\192.168.1.80\Amkor\AGV2" /Y + + \ No newline at end of file diff --git a/Cs_HMI/Project/CSetting.cs b/Cs_HMI/Project/CSetting.cs new file mode 100644 index 0000000..9889d3b --- /dev/null +++ b/Cs_HMI/Project/CSetting.cs @@ -0,0 +1,580 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel; +using System.Drawing.Design; +using System.Management; +using System.Runtime.CompilerServices; +using System.Security.RightsManagement; + +namespace Project +{ + public class MyUITypeEditor : UITypeEditor + { + public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) + { + using (var f = new System.Windows.Forms.Form + { + WindowState = System.Windows.Forms.FormWindowState.Normal, + StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen, + Size = new System.Drawing.Size(800, 400), + MaximizeBox = false, + MinimizeBox = false, + Text = "Select Port", + FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog + }) + { + var lst = new System.Windows.Forms.ListBox + { + Font = new System.Drawing.Font("Consolas", 15, System.Drawing.FontStyle.Bold), + Dock = System.Windows.Forms.DockStyle.Fill, + }; + lst.DoubleClick += (s1, e1) => + { + if (lst.SelectedItem != null) f.DialogResult = System.Windows.Forms.DialogResult.OK; + }; + using (var searcher = new ManagementObjectSearcher("SELECT * FROM WIN32_SerialPort")) + { + var portnames = System.IO.Ports.SerialPort.GetPortNames().OrderBy(t => t); + var ports = searcher.Get().Cast().ToList(); + foreach (var port in portnames) + { + var desc = ""; + var portInfo = ports.Where(t => t["DeviceId"].ToString() == port).FirstOrDefault(); + if (portInfo != null) desc = portInfo["Caption"].ToString(); + lst.Items.Add(string.Format("{0} - {1}", port, desc)); + } + } + f.Controls.Add(lst); + if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + var name = lst.SelectedItem.ToString().Split('-'); + return name[0].Trim(); + } + else + { + return base.EditValue(context, provider, value); + } + } + + } + public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) + { + return UITypeEditorEditStyle.Modal; + } + } + + public class CSetting : arUtil.Setting + { + #region "log" + + [Category("System Log"), DisplayName("Digital Input/Output"), + Description("입/출력 장치의 상태 변화를 기록 합니다.")] + public Boolean Log_IO { get; set; } + [Category("System Log"), DisplayName("Network Alive Check(Ping)"), + Description("서버와의 통신검사 로그를 기록 합니다")] + public Boolean Log_Ping { get; set; } + [Category("System Log"), DisplayName("S/M Step Change"), + Description("상태머신의 변화 상태를 기록 합니다.")] + public Boolean Log_StepChange { get; set; } + [Category("System Log"), DisplayName("Socket Recv Message"), + Description("서버 수신 메세지를 기록 합니다.")] + public Boolean LOg_SocketRecv { get; set; } + + #endregion + + #region "Communication" + + [Category("Commnunication Setting"), DisplayName("XBee PortName"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))] + public string Port_XBE { get; set; } + + [Category("Commnunication Setting"), DisplayName("RFID PortName"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))] + public string Port_AGV { get; set; } + + [Category("Commnunication Setting"), DisplayName("PLC #1 PortName"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))] + public string Port_PLC { get; set; } + + + [Category("Commnunication Setting"), DisplayName("BMS PortName"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))] + public string Port_BAT { get; set; } + + public int ChargerID { get; set; } + + public int Baud_AGV { get; set; } + public int Baud_BAT { get; set; } + public int Baud_PLC { get; set; } + public int Baud_XBE { get; set; } + + //public int QueryInterval_BAT { get; set; } + + + #endregion + + #region "Debug" + [Category("Developer Setting"), DisplayName("Listening Port"), + Description("서버와의 통신을 위한 대기 포트(TCP) - 기본값 : 7979")] + public int listenPort { get; set; } + + [Category("Developer Setting")] + public Boolean UseDebugMode { get; set; } + + #endregion + + #region "Count Reset Setting" + + [Category("Count Reset Setting"), DisplayName("A/M Clear Enable"), + Description("오전 초기화 여부\n작업수량을 초기화 하려면 True 로 설정하세요")] + public Boolean datetime_Check_1 { get; set; } + [Category("Count Reset Setting"), DisplayName("P/M Clear Enable"), + Description("오후 초기화 여부\n작업수량을 초기화 하려면 True 로 설정하세요")] + public Boolean datetime_Check_2 { get; set; } + [Category("Count Reset Setting"), DisplayName("A/M Clear Time(HH:mm)"), + Description("오전 초기화 시간(시:분)\n예) 09:00")] + public string datetime_Reset_1 { get; set; } + [Category("Count Reset Setting"), DisplayName("P/M Clear Time(HH:mm)"), + Description("오후 초기화 시간(시:분)\n예) 19:00")] + public string datetime_Reset_2 { get; set; } + + #endregion + + #region "general" + + + + + [Category("General Setting"), DisplayName("Enable Popup Message"), + Description("오류 발생시 별도의 메세지 창으로 표시합니다. 사용하지 않을 경우에는 우측 상단의 결과창의 메세지를 확인합니다.")] + public Boolean ShowPopUpMessage { get; set; } + [Category("General Setting"), DisplayName("Asset Number"), + Description("자산번호(서버에 값 전송 시 사용됩니다)")] + public string Asset { get; set; } + + [Category("General Setting"), + Description("데이터 자동 소거 기간(일) 비활성=0")] + public int AutoDeleteDay { get; set; } + [Category("General Setting"), + Description("데이터 자동 소거 조건(남은용량 %)")] + public int AutoDeleteThreshold { get; set; } + + [Category("General Setting"), PasswordPropertyText(true)] + public string Password_Setup { get; set; } + + [Category("General Setting"), Browsable(false)] + public string Language { get; set; } + + [Category("General Setting"), DisplayName("Full Screen Window State"), + Description("화면을 전체화면으로 사용 합니다.")] + public Boolean FullScreen { get; set; } + public bool DetectManualCharge { get; set; } + public Boolean StartLog { get; set; } + + #endregion + + #region "TAGS" + public int TAGPOT { get; set; } + public int TAGNOT { get; set; } + public int TAG_F2_F3 { get; set; } + public int TAG_QC_F1 { get; set; } + public int TAG_F1_F2 { get; set; } + public int TAG_F3_F4 { get; set; } + public int TAG_F4_F5 { get; set; } + + public int TAG_QA_QC { get; set; } + public int TAGQAB { get; set; } + public int TAGQAA { get; set; } + + + public int TAGQCB { get; set; } + public int TAGQCA { get; set; } + public int TAGF1A { get; set; } + public int TAGF2A { get; set; } + public int TAGF3A { get; set; } + public int TAGF4A { get; set; } + public int TAGF5A { get; set; } + + public int TAGF1B { get; set; } + public int TAGF2B { get; set; } + public int TAGF3B { get; set; } + public int TAGF4B { get; set; } + public int TAGF5B { get; set; } + #endregion + + #region "Charge" + public int chargerpos { get; set; } + public int ChargetWaitSec { get; set; } + public int ChargeEmergencyLevel { get; set; } + public int ChargeMaxLevel { get; set; } + public int ChargeStartLevel { get; set; } + public Boolean Enable_AutoCharge { get; set; } + + public int ChargeRetryTerm { get; set; } + //public int ChargeIdleInterval { get; set; } + public int ChargeMaxTime { get; set; } + public int ChargeSearchTime { get; set; } + + #endregion + + #region "AGV" + + public bool AutoModeOffAndClearPosition { get; set; } + public string musicfile { get; set; } + + ///

+ /// FVI로 가능 방향이 Backward 인가? + /// Forward 방향이라면 false 를 한다 + /// + public Boolean AGV_Direction_FVI_Backward { get; set; } + + public Boolean Enable_Speak { get; set; } + + //public Boolean Disable_BMS { get; set; } + //public Boolean Log_BMS_Tx { get; set; } + //public Boolean Log_BMS_Rx { get; set; } + //public double ChargeLimitLow { get; set; } + //public double ChargeLimitHigh { get; set; } + + public string AGV_PANID { get; set; } + public string AGV_CHANNEL { get; set; } + public string AGV_ADDRESS { get; set; } + + public int SCK { get; set; } + public int SSK { get; set; } + public int STT { get; set; } + public int SAD { get; set; } + + public byte ZSpeed { get; set; } + public int SPD_L { get; set; } + public int SPD_M { get; set; } + public int SPD_H { get; set; } + public int SPD_DRIVE { get; set; } + + public int SPD_S { get; set; } + public int SPD_R { get; set; } + + + public int PID_PH { get; set; } + public int PID_PM { get; set; } + public int PID_PL { get; set; } + public int PID_IH { get; set; } + public int PID_IM { get; set; } + public int PID_IL { get; set; } + public int PID_DH { get; set; } + public int PID_DM { get; set; } + public int PID_DL { get; set; } + + public int PID_PS { get; set; } + public int PID_IS { get; set; } + public int PID_DS { get; set; } + + public double WheelSpeedCharge { get; set; } + + //public byte MotorUpTime { get; set; } + //public double AlignSensorThreshold { get; set; } + // public byte BalanceThreshold { get; set; } + // public byte BalanceThresholdUp { get; set; } + // public byte MarkSensorThreshold { get; set; } + //public Boolean Opt_LidarStop { get; set; } + //public Boolean Opt_SlowUp { get; set; } + //public Boolean Opt_Magnet { get; set; } + public byte HomePositionValue { get; set; } + public byte HomeKitNo { get; set; } + + + //public Single interval_bms { get; set; } + public Single interval_xbe { get; set; } + public int interval_bms { get; set; } + public byte interval_iostate { get; set; } + //public Boolean Enable_AutoZDnUp { get; set; } + public int doorSoundTerm { get; set; } + public int musicvol { get; set; } + + public bool Enable_Music { get; set; } + #endregion + + [Category("Report"), + Description("상태기록시 장비 식별코드(4자리)"), + DisplayName("M/C ID")] + public string MCID { get; set; } + + [Category("Report"), + Description("작업 기록을 장비기술(EE) Database 에 기록 합니다. 원격으로 장비 현황을 모니터링 할 수 있습니다"), + DisplayName("SAVE EE-DB")] + public Boolean Save_EEDatabase { get; set; } + [Category("Report"), Description("상태값을 전송하는 간격(초)")] + public int StatusInterval { get; set; } + + + [Category("AutoReboot"), + DisplayName("자동재부팅시간"), + Description("기본값 14:00:00~14:05:00 , 재부팅은 장비가 대기(IDLE)일 때에만 동작하며 지정 시간 범위를 벗어나면 동작하지 않습니다")] + public String AutoRebootTimeStart { get; set; } + [Category("AutoReboot")] + public string AUtoRebootLastTime { get; set; } + + + public bool SetAutoModeOn { get; set; } + public override void AfterLoad() + { + if (StatusInterval < 10) StatusInterval = 300; //5분간격 + + if (SAD == 0) SAD = 999; + if (TAGF1A == 0) + { + TAGNOT = 9000; + + TAGQAB = 9200; + TAGQCB = 9300; + TAGF1B = 9400; + TAGF2B = 9500; + TAGF3B = 9600; + TAGF4B = 9700; + TAGF5B = 9800; + + TAGQAA = 9201; + TAGQCA = 9301; + TAGF1A = 9401; + TAGF2A = 9501; + TAGF3A = 9601; + TAGF4A = 9701; + TAGF5A = 9801; + + TAGPOT = 9900; + + TAG_QA_QC = 9250; + TAG_QC_F1 = 9350; + TAG_F1_F2 = 9450; + TAG_F2_F3 = 9550; + TAG_F3_F4 = 9650; + TAG_F4_F5 = 9750; + } + + if(TAG_F4_F5 == 0) + { + TAG_F4_F5 = 9750; + TAGF5B = 9800; + TAGF5A = 9801; + } + + if (SCK == 0) SCK = 10; + if (SSK == 0) SSK = 10; + if (STT == 0) STT = 30; + if (ChargerID == 0) ChargerID = 203; + if (ChargerID < 200) ChargerID += 200; + + //자동충전요건 + if (ChargetWaitSec == 0) ChargetWaitSec = 3; + if (ChargeStartLevel == 0) ChargeStartLevel = 85; + if (ChargeMaxLevel == 0) ChargeMaxLevel = 85; + if (ChargeEmergencyLevel == 0) ChargeEmergencyLevel = 30; + + if (interval_bms == 0) interval_bms = 1000; + //충전은 대기상태 5분이 경과하면 진행한다 + + + //충전은 10분간격으로 재시도 한다 + if (ChargeRetryTerm == 0) ChargeRetryTerm = 600; + if (doorSoundTerm == 0) doorSoundTerm = 15; //기본 15초 + if (ChargeSearchTime == 0) ChargeSearchTime = 25; + //최대 충전진행 시간(기본 1시간) + if (ChargeMaxTime == 0) ChargeMaxTime = 3600; + if (interval_iostate == 0 || interval_iostate == 255) interval_iostate = 100; + if (ZSpeed == 0) ZSpeed = 20; + if (interval_xbe == 0) interval_xbe = 5.0f; + if (HomePositionValue == 0) HomePositionValue = 4; + if (HomeKitNo == 0) HomeKitNo = 2; + if (datetime_Reset_1 == "") datetime_Reset_1 = "00:00"; + if (datetime_Reset_2 == "") datetime_Reset_2 = "00:00"; + + if (SPD_H == 0) + { + SPD_DRIVE = 200; + SPD_H = 110; + SPD_M = 70; + SPD_L = 30; + SPD_S = 61; + SPD_R = 70; + } + + if (PID_PH == 0) + { + PID_PH = 180; PID_PM = 240; PID_PL = 260; + PID_IH = 610; PID_IM = 640; PID_IL = 660; + PID_DH = 110; PID_DM = 140; PID_DL = 160; + PID_PS = 200; PID_IS = 620; PID_DS = 120; + } + + if (WheelSpeedCharge == 0) WheelSpeedCharge = 10; + + if (AutoDeleteThreshold == 0) AutoDeleteThreshold = 20; + if (Asset == "") Asset = "DEV_SPLIT"; + if (listenPort == 0) listenPort = 7979; + if (Port_XBE == "") Port_XBE = "COM8"; + + if (Language.isEmpty()) Language = "Kor"; + if (Password_Setup.isEmpty()) Password_Setup = "0000"; + if (musicfile.isEmpty()) musicfile = Util.CurrentPath + "music.mp3"; + if (musicvol == 0) musicvol = 50; + + + if (string.IsNullOrEmpty(Port_AGV)) Port_AGV = "COM1"; + if (string.IsNullOrEmpty(Port_PLC)) Port_PLC = "COM2"; + if (string.IsNullOrEmpty(Port_XBE)) Port_XBE = "COM4"; + if (string.IsNullOrEmpty(Port_BAT)) Port_BAT = "COM7"; + + if (Baud_AGV == 0) Baud_AGV = 57600; + if (Baud_PLC == 0) Baud_PLC = 19200; + if (Baud_XBE == 0) Baud_XBE = 9600; + if (Baud_BAT == 0) Baud_BAT = 9600; + + + } + public override void AfterSave() + { + //throw new NotImplementedException(); + } + + public void CopyTo(CSetting dest) + { + //이곳의 모든 쓰기가능한 속성값을 대상에 써준다. + Type thClass = this.GetType(); + foreach (var method in thClass.GetMethods()) + { + //var parameters = method.GetParameters(); + if (!method.Name.StartsWith("get_")) continue; + + string keyname = method.Name.Substring(4); + string methodName = method.Name; + + object odata = GetType().GetMethod(methodName).Invoke(this, null); + var wMethod = dest.GetType().GetMethod(Convert.ToString("set_") + keyname); + if (wMethod != null) wMethod.Invoke(dest, new object[] { odata }); + } + } + } + + + public class CounterSetting : arUtil.Setting, INotifyPropertyChanged + { + public DateTime CountReset { get; set; } + + public event PropertyChangedEventHandler PropertyChanged; + private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + private int countUp1 = 0; + private int countUp2 = 0; + private int countUp3 = 0; + private int countUp4 = 0; + // private int countUp5 = 0; + private int countchgaerr = 0; + private int countchga = 0; + private int countchgm = 0; + //private int countdn = 0; + private int countqa = 0; + private int countqc = 0; + + //메인카운터 + public int CountUp1 + { + get { return countUp1; } + set { if (value != countUp1) { countUp1 = value; NotifyPropertyChanged(); } } + } + public int CountUp2 + { + get { return countUp2; } + set { if (value != countUp2) { countUp2 = value; NotifyPropertyChanged(); } } + } + public int CountUp3 + { + get { return countUp3; } + set { if (value != countUp3) { countUp3 = value; NotifyPropertyChanged(); } } + } + public int CountUp4 + { + get { return countUp4; } + set { if (value != countUp4) { countUp4 = value; NotifyPropertyChanged(); } } + } + //public int CountUp5 + //{ + // get { return countUp5; } + // set { if (value != countUp5) { countUp5 = value; NotifyPropertyChanged(); } } + //} + + /// + /// 상차수량(FVI 1+2+3+4) + /// + public int CountUp + { + get + { + return CountUp1 + CountUp2 + CountUp3 + CountUp4;// + CountUp5; + } + } + + public int CountChargeE + { + get { return this.countchgaerr; } + set { if (value != countchgaerr) { countchgaerr = value; NotifyPropertyChanged(); } } + } + public int CountChargeA + { + get { return this.countchga; } + set { if (value != countchga) { countchga = value; NotifyPropertyChanged(); } } + } + public int CountChargeM + { + get { return this.countchgm; } + set { if (value != countchgm) { countchgm = value; NotifyPropertyChanged(); } } + } + + /// + /// 하차수량(QC+QA) + /// + public int CountDn + { + get { return this.countqa + this.countqc; } + //set { if (value != countdn) { countdn = value; NotifyPropertyChanged(); } } + } + public int CountQA + { + get { return this.countqa; } + set { if (value != countqa) { countqa = value; NotifyPropertyChanged(); } } + } + public int CountQC + { + get { return this.countqc; } + set { if (value != countqc) { countqc = value; NotifyPropertyChanged(); } } + } + public void CountClear() + { + CountUp1 = 0; + CountUp2 = 0; + CountUp3 = 0; + CountUp4 = 0; + // CountUp5 = 0; + CountQC = 0; + CountQA = 0; + //CountQa2 = 0; + CountReset = DateTime.Now; + PUB.log.Add("Count Clear"); + this.Save(); + } + + public CounterSetting() + { + this.filename = Util.CurrentPath + "counter.xml"; + } + public override void AfterLoad() + { + if (CountReset == null) CountReset = DateTime.Parse("1982-11-23"); + } + public override void AfterSave() + { + //throw new NotImplementedException(); + } + } + +} diff --git a/Cs_HMI/Project/Class/CParser.cs b/Cs_HMI/Project/Class/CParser.cs new file mode 100644 index 0000000..0b64ada --- /dev/null +++ b/Cs_HMI/Project/Class/CParser.cs @@ -0,0 +1,926 @@ +//using System; +//using System.Collections.Generic; +//using System.Diagnostics; +//using System.Globalization; +//using System.IO; +//using System.Linq; +//using System.Reflection; +//using System.Runtime.CompilerServices; +//using System.Security; +//using System.Text; +//using System.Threading.Tasks; +//using System.Collections; + +//namespace Project +//{ +// public class CParser +// { +// private string SrcText; +// private ArrayList CommandList; // //여기엔 Scommand 가 들어있다. +// private System.Text.StringBuilder ErrMsg; +// // Public Log As System.Text.StringBuilder + +// public event MessageEventHandler Message; +// public void raiseMessage(string m, Boolean err) +// { +// if (Message != null) Message(m, err); +// } +// public delegate void MessageEventHandler(string M, bool Err); + +// public CParser() +// { + +// } + +// public new string toString +// { +// get +// { +// if (this.isError == false) +// { +// object Value = ParseCommand(SrcText, true); +// return Value.ToString(); +// } +// return ""; +// } +// } +// public new object GetData +// { +// get +// { +// if (this.isError == false) +// { +// object Value = ParseCommand(SrcText, true); +// return Value; +// } +// return null; +// } +// } +// public bool isError +// { +// get +// { +// if (this.ErrMsg.ToString() != "") +// return true; +// else +// return false; +// } +// } +// private void Check_error(string vSrcText) +// { +// // Return '//임시로 해제 + +// int Lcnt = 0; +// int Rcnt = 0; + +// ErrMsg = new System.Text.StringBuilder(); + +// return; // +// foreach (string EXP_ in vSrcText.Split(';')) // //각명령을 ;로 구분되어잇기떄문에 구분됫것들이 각자의 명령이다. +// { +// var EXP = EXP_.Trim(); +// Lcnt = EXP.ToCharArray().Where(t => t == '(').Count();// MyString.GetInCountChar(EXP, "("); // //파라미터 시작갯수 +// Rcnt = EXP.ToCharArray().Where(t => t == ')').Count();// MyString.GetInCountChar(EXP, ")"); // //파라미터 종료갯수 +// if (Lcnt != Rcnt) +// ErrMsg.AppendLine(EXP + "파라미터 시작기호 ( 와 종료기호 ) 가 일치하지 않습니다"); +// Lcnt = EXP.ToCharArray().Where(t => t == '"').Count();// MyString.GetInCountChar(EXP, Strings.Chr(34)); // //파라미터 시작갯수 +// Rcnt = EXP.ToCharArray().Where(t => t == '"').Count();// MyString.GetInCountChar(EXP, Strings.Chr(34)); // //파라미터 종료갯수 +// if (Lcnt != Rcnt) +// ErrMsg.AppendLine(EXP + "문자열묶음기호(\")가 일치하지 않습니다"); +// } +// } + +// public virtual void CommandText(string s) +// { +// SrcText = s; +// Check_error(SrcText); +// if (this.isError) +// Util.MsgE(ErrMsg.ToString());// Interaction.MsgBox(ErrMsg.ToString(), MsgBoxStyle.Critical, "오류"); +// } + +// protected string Buffer1 = ""; +// protected string Buffer2 = ""; +// protected string Buffer3 = ""; +// protected string Buffer4 = ""; + +// private object ParseCommand(string vSrcText, bool isfirst, object NEwValue = null) +// { +// // //각명령어를 쪼갠다. +// // //중첩명령어의 경우에도 쪼갠다. + +// // Dim Cmd As String '//명령어 +// // Dim Param As String '//명렁파라미터 +// // Dim target As String '//타겏값 +// // Dim Str As String +// // Dim Line As String + +// if (isfirst) +// this.CommandList = new ArrayList();// //처음에만 이것을 초기화한다. + +// vSrcText = vSrcText.Replace("\r\n","\n");//Constants.vbCrLf, Constants.vbLf); +// vSrcText = vSrcText.Replace("\r","\n");//Constants.vbCr, Constants.vbLf); +// vSrcText = vSrcText.Replace("\n\n","\n");//Constants.vbLf + Constants.vbLf, Constants.vbLf); +// vSrcText = vSrcText.Replace(";","\n");// Constants.vbLf); + +// raiseMessage("Command Expression : " + vSrcText, false); +// foreach (string EXP_ in vSrcText.Split('\n')) // //각명령을 ;로 구분되어잇기떄문에 구분됫것들이 각자의 명령이다. +// { +// if (EXP_.Trim() == "") +// continue; +// if (EXP_.Length < 3) +// continue; +// if (EXP_.Substring(0, 2) == "//") +// continue; + +// // Me.Log.AppendLine("New Line Value is : " & NEwValue.ToString) + +// var EXP = EXP_.Trim(); +// bool CmdFind = false; // //명령어를다 찾앗는가? +// bool ParamFind = false; +// System.Text.StringBuilder NewParam = new System.Text.StringBuilder(); +// bool Isfunction = false; +// bool IsFunctionEnd = false; +// short InnerFuncCnt = 0; +// System.Text.StringBuilder NewCmd = new System.Text.StringBuilder(); +// ArrayList ParamList = new ArrayList(); +// bool IsTextInner = false; + +// if (EXP != "") +// { + +// // My.Computer.FileSystem.WriteAllText("c:\command.txT", "expressiong=" & EXP, True) + +// if (EXP.Substring(0, 1) == "\"")//Strings.Chr(34)) +// NEwValue = EXP; // //해당문자자체가 값이된다. +// else +// // //파라미터란 ()사이의 명령어이며, 콤마(,)로 분리된다 +// // //단 "" 사이의 콤마는 인정하지않는다. + +// foreach (char C in EXP.ToCharArray()) +// { +// if (CmdFind == false) +// { +// if (C == '(') +// CmdFind = true; +// else +// NewCmd.Append(C); +// } +// else +// switch (C) +// { +// case ',': +// { +// if (IsTextInner) +// NewParam.Append(C); +// else if (Isfunction == false) +// { +// if (IsFunctionEnd) +// ParamList.Add(NewParam.ToString()); // //파라미터를 찾았으므로 파람리스트에 추가한다. +// else +// ParamList.Add(NewParam.ToString());// //파라미터를 찾았으므로 파람리스트에 추가한다. +// NewParam = new System.Text.StringBuilder(); // //파라미터부분 초기화 +// IsFunctionEnd = false; +// } +// else +// NewParam.Append(C); +// break; +// } + +// case '(': +// { +// if (IsTextInner) +// NewParam.Append(C); +// else if (Isfunction) +// { +// InnerFuncCnt += 1; +// NewParam.Append(C); +// } +// else +// { +// Isfunction = true; // //이파라미터가 또 함수를 가지고있다 ㅠ_ㅠ; +// NewParam.Append(C); +// } + +// break; +// } + +// case ')': +// { +// if (IsTextInner) +// NewParam.Append(C); +// else if (Isfunction) +// { +// if (InnerFuncCnt > 0) +// { +// InnerFuncCnt -= 1; +// NewParam.Append(C); +// } +// else +// { +// Isfunction = false; // //이파라미터가 또 함수를 가지고있다 ㅠ_ㅠ; +// IsFunctionEnd = true; +// NewParam.Append(C); +// } +// } +// else +// { +// if (NewParam.ToString() != "") +// ParamList.Add(NewParam.ToString()); // //파라미터를 찾았으므로 파람리스트에 추가한다. +// NewParam = new System.Text.StringBuilder(); // //파라미터부분 초기화 +// IsFunctionEnd = false; + +// // MsgBox("명령어실행 : " & NewCmd.ToString) +// // //각 파라미터들의 값을 가져온다 +// raiseMessage("New COmmand : " + NewCmd.ToString() + " paramCount=" + ParamList.Count, false); +// switch (NewCmd.ToString().ToUpper()) +// { +// case "MUL": +// { +// if (ParamList.Count != 2) +// raiseMessage("MUL 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// // Me.Log.AppendLine("MUL " & Param1 & vbTab & Param2) + +// if (Param1.ToString().IsNumeric()==false || Param2.ToString().IsNumeric()==false) +// // Me.Log.AppendLine("MUL param error support only number") +// return 0; +// else +// NEwValue = System.Convert.ToDecimal(Param1) * System.Convert.ToDecimal(Param2); +// } + +// break; +// } + +// case "PLUS": +// { +// if (ParamList.Count != 2) +// raiseMessage("PLUS 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); + +// if (Param1.ToString().IsNumeric()==false || Param2.ToString().IsNumeric()==false) +// return 0; +// else +// NEwValue = System.Convert.ToDecimal(Param1) + System.Convert.ToDecimal(Param2); +// } + +// break; +// } + +// case "MINUS": +// { +// if (ParamList.Count != 2) +// raiseMessage("MINUS 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// // Me.Log.AppendLine("PLUS " & Param1 & vbTab & Param2) +// if (Param1.ToString().IsNumeric()==false || Param2.ToString().IsNumeric()==false ) +// // Me.Log.AppendLine("MINUS param error support only number") +// return 0; +// else +// NEwValue = System.Convert.ToDecimal(Param1) - System.Convert.ToDecimal(Param2); +// } + +// break; +// } + +// case "ISEQULE": +// case "EQ" // //둘이 같은지 반환해준다. +// : +// { +// if (ParamList.Count != 2) +// raiseMessage("ISEQULE 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// // MsgBox(ParamList[1].ToString & "/" & NewValue) +// // Me.Log.AppendLine("ISEQULE " & Param1 & vbTab & Param2) +// if (Param1 != Param2) +// { +// raiseMessage("ISEQULE RETURN FALSE", true); +// return false; +// } +// else +// { +// raiseMessage("ISEQULE RETURN TRUE", true); +// return true; +// } +// } + +// break; +// } + +// case "NEQ": +// case "DIFF" // //둘이 다르면 true 반환해준다. +// : +// { +// if (ParamList.Count != 2) +// raiseMessage("DIFF(NEQ) 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// // MsgBox(ParamList[1].ToString & "/" & NewValue) +// // Me.Log.AppendLine("ISEQULE " & Param1 & vbTab & Param2) +// if (Param1 != Param2) +// { +// raiseMessage("DIFF RETURN True", true); +// return true; +// } +// else +// { +// raiseMessage("DIFF RETURN False", true); +// return false; +// } +// } + +// break; +// } + +// case "IF": +// { +// if (ParamList.Count != 2) +// raiseMessage("IF 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// if (Param1.ToString().ToLower() != Param2.ToString().ToLower()) +// { +// raiseMessage("IF문 조건이 서로 다르므로 실행을 종료합니다.", false); +// return ""; // //해당구문전체를 모두 FALSE한다. +// } +// else +// // RaiseEvent RaiseMessage("IF문 조건이 동일 True Case IN(" & Param1 & " " & Param2 & ")") +// Console.WriteLine("sdf"); +// } + +// break; +// } + +// case "IFNOT": +// { +// if (ParamList.Count != 2) +// raiseMessage("IFNOT 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// if (Param1 == Param2) +// { +// raiseMessage("IF문 조건이 서로 같으므로 실행을 종료합니다.", true); +// return ""; // //해당구문전체를 모두 FALSE한다. +// } +// else +// { +// } +// } + +// break; +// } + +// case "MSGBOX": +// case "MSG": +// { +// if (ParamList.Count != 1) +// raiseMessage("MSGBOX 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// Util.MsgE(Param1, MsgBoxStyle.Information, "확인"); +// } + +// break; +// } + +// case "ISNUM": +// { +// if (ParamList.Count != 1) +// raiseMessage("ISNUM 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = Information.IsNumeric(Param1); +// } + +// break; +// } + +// case "NVL": +// { +// if (ParamList.Count != 2) +// raiseMessage("ISEMPTY 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// if (Param1.Trim() == "") +// NEwValue = Param2; +// else +// NEwValue = Param1; +// } + +// break; +// } + +// case "INDEXOF": +// { +// if (ParamList.Count != 2) +// raiseMessage("INDEXOF 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// NEwValue = Param1.IndexOf(Param2) + 1; +// } + +// break; +// } + +// case "LINDEXOF": +// { +// if (ParamList.Count != 2) +// raiseMessage("LINDEXOF 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// NEwValue = Param1.LastIndexOf(Param2) + 1; +// } + +// break; +// } + +// case "REPLACE": +// { +// if (ParamList.Count != 3) +// raiseMessage("REPLACE 함수에 3개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// object Param3 = RunParam(ParamList[2].ToString(), NEwValue.ToString()); +// NEwValue = Param1.ToString().Replace(Param2, Param3); +// } + +// break; +// } + +// case "REMOVECHAR": +// { +// if (ParamList.Count != 2) +// raiseMessage("REMOVESPACE 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// NEwValue = Param1.Trim(Param2.ToCharArray()).ToString().Trim(); +// } + +// break; +// } + +// case "REMOVESCHAR" // //특수기호삭제한다. +// : +// { +// if (ParamList.Count != 1) +// raiseMessage("REMOVESCHAR 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// System.Text.StringBuilder NewString = new System.Text.StringBuilder(); +// foreach (char Cc in Param1.ToCharArray()) +// { +// switch (Strings.Asc(Cc)) +// { +// case object _ when 65 <= Strings.Asc(Cc) && Strings.Asc(Cc) <= 90: +// case object _ when 48 <= Strings.Asc(Cc) && Strings.Asc(Cc) <= 57: +// case object _ when 97 <= Strings.Asc(Cc) && Strings.Asc(Cc) <= 122: +// case object _ when Strings.Asc(Cc) < 0: +// case 32: +// { +// NewString.Append(Cc); +// break; +// } +// } +// } +// NEwValue = NewString.ToString(); +// } + +// break; +// } + +// case "REMOVESPACE": +// { +// if (ParamList.Count != 1) +// raiseMessage("REMOVESPACE 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = Param1.Replace(Strings.Space(1), Constants.vbNullString); +// } + +// break; +// } + +// case "TOUPPER": +// { +// if (ParamList.Count != 1) +// raiseMessage("TOUPPER 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = Param1.ToUpper(); +// } + +// break; +// } + +// case "TRIM": +// { +// if (ParamList.Count != 1) +// raiseMessage("TRIM 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = Param1.Trim(); +// } + +// break; +// } + +// case "TOLOWER": +// { +// if (ParamList.Count != 1) +// raiseMessage("TOLOWER 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = Param1.ToLower(); +// } + +// break; +// } + +// case "LENB": +// { +// if (ParamList.Count != 1) +// raiseMessage("LENB 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = System.Text.Encoding.Default.GetByteCount(Param1.ToString()); +// } + +// break; +// } + +// case "LEN": +// { +// if (ParamList.Count != 1) +// raiseMessage("LEN 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = Param1.Length; +// } + +// break; +// } + +// case "RIGHTADD": +// case "ADDRIGHT": +// { +// if (ParamList.Count != 2) +// raiseMessage("RIGHTADD 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// NEwValue = Param1 + Param2; +// } + +// break; +// } + +// case "ADDNUM": +// { +// if (ParamList.Count != 2) +// raiseMessage("ADDNUM 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// NEwValue = Param1 + Param2; +// } + +// break; +// } + +// case "LEFTADD": +// case "ADDLEFT": +// { +// if (ParamList.Count != 2) +// raiseMessage("LEFTADD 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// NEwValue = Param2 + Param1; +// } + +// break; +// } + +// case "TODATE": +// { +// if (ParamList.Count != 1) +// raiseMessage("TODATE 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = ((DateTime)Param1); +// } + +// break; +// } + +// case "TOSTRING": +// { +// if (ParamList.Count != 1) +// raiseMessage("TOSTRING 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = (System.Convert.ToString(Param1)); +// } + +// break; +// } + +// case "TOINT": +// { +// if (ParamList.Count != 1) +// raiseMessage("TOINT 함수에 1개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// NEwValue = Param1; +// } + +// break; +// } + +// case "NOW": +// { +// NEwValue = DateTime.Now; +// break; +// } + +// case "SUBSTRING": +// case "SUBSTR" // //2개의 파라미터를 사용한다. +// : +// { +// if (ParamList.Count < 2) +// raiseMessage("SUBSTRING 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// object param3 = ""; +// if (ParamList.Count == 3) +// param3 = RunParam(ParamList[2].ToString(), NEwValue.ToString()); +// if (Param1.Trim() == "" || Information.IsNumeric(Param2) == false || System.Convert.ToInt32(Param2) < 0) +// NEwValue = ""; +// else if (param3 != "") +// { +// // //길이를 참고한다. 너무 긴건 처리하지 못하므로 +// if (System.Convert.ToInt32(Param2) + System.Convert.ToInt32(param3) > Param1.Length) +// NEwValue = Param1.Substring(Param2, (Param1.Length - System.Convert.ToInt32(Param2))); +// else +// NEwValue = Param1.Substring(Param2, param3); +// } +// else +// NEwValue = Param1.Substring(Param2); +// } + +// break; +// } + +// case "SAVE1": +// { +// if (ParamList.Count < 1) +// Util.MsgE("SAVE1 함수에 1개의 파라미터가 없습니다"); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// Buffer1 = Param1; +// } + +// break; +// } + +// case "SAVE2": +// { +// if (ParamList.Count < 1) +// Util.MsgE("SAVE1 함수에 1개의 파라미터가 없습니다"); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// Buffer2 = Param1; +// } + +// break; +// } + +// case "SAVE3": +// { +// if (ParamList.Count < 1) +// Util.MsgE("SAVE1 함수에 1개의 파라미터가 없습니다"); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// Buffer3 = Param1; +// } + +// break; +// } + +// case "SAVE4": +// { +// if (ParamList.Count < 1) +// Util.MsgE("SAVE1 함수에 1개의 파라미터가 없습니다"); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// Buffer4 = Param1; +// } + +// break; +// } + +// case "LEFT" // //2개의 파라미터를 사용한다. +// : +// { +// if (ParamList.Count != 2) +// raiseMessage("LEFT 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// NEwValue = Strings.Left(Param1, Param2); +// } + +// break; +// } + +// case "RIGHT" // //2개의 파라미터를 사용한다. +// : +// { +// if (ParamList.Count != 2) +// raiseMessage("RIGHT 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// var Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()).ToString(); +// var Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()).ToString(); +// NEwValue = Param1.Substring(Param1.Length-int.Parse(Param2));// Strings.Right(Param1, Param2); +// } + +// break; +// } + +// case "MID": // //2개의 파라미터를 사용한다. +// { +// if (ParamList.Count != 3) +// raiseMessage("MID 함수에 3개의 파라미터가 없습니다", true); +// else +// { +// var Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// var Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); +// var Param3 = RunParam(ParamList[2].ToString(), NEwValue.ToString()); +// if (Param2 == "-1" || int.Parse(Param3.ToString()) < 1) +// { +// raiseMessage("MID 함수의 시작위치값은 0이상이여야합니다\nMID 함수의 추출길이는 1이상이여야합니다", true); +// NEwValue = ""; +// } +// else +// NEwValue = Param1.ToString().Substring(int.Parse(Param2.ToString()), int.Parse(Param3.ToString())); +// } + +// break; +// } + +// case "FORMAT": +// { +// if (ParamList.Count != 2) +// raiseMessage("FORMAT 함수에 2개의 파라미터가 없습니다", true); +// else +// { +// object Param1 = RunParam(ParamList[0].ToString(), NEwValue.ToString()); +// object Param2 = RunParam(ParamList[1].ToString(), NEwValue.ToString()); + +// // MsgBox(Param1 & "/" & Param2) +// if(Param1.GetType()== typeof(int)) +// NEwValue = ((int)Param1).ToString(Param2.ToString()); +// else +// NEwValue = Param1.ToString(); +// } + +// break; +// } + +// default: +// { +// //raiseMessage("미지원 함수 입니다") +// raiseMessage("미지원 : " + NewCmd.ToString(),true); +// break; +// } +// } +// } + +// break; +// } + +// default: +// { +// if (C == '"') +// { +// IsTextInner = !IsTextInner; +// NewParam.Append(C); +// } +// else if (IsFunctionEnd) +// raiseMessage("내부한수 종결문다음에 , 가 와야하는데 " + C + "가 왔습니다", true); +// else +// NewParam.Append(C); +// break; +// } +// } +// } +// } +// } +// // Me.Log.AppendLine("ParseCOmmand Return : " & NEwValue.ToString) +// return NEwValue; +// } + +// public object RunParam(string vParam, string SrcValue) +// { +// // My.Computer.FileSystem.WriteAllText("c:\log.txT", "runparam param=" & vParam, True) +// vParam = vParam.Trim(); +// if (vParam == "") +// return ""; +// if (vParam.Substring(0, 1) == "\"") +// return vParam.Replace("\"", ""); +// if (vParam.ToUpper() == "TRUE") +// return true; +// if (vParam.ToUpper() == "FALSE") +// return false; + +// // //시작값이 숫자라면 이건 숫자값이다. +// if (vParam.Substring(0, 1).IsNumeric() == true) +// return vParam; + +// // //시작값이 # 라면 원본 데이터이다. +// if (vParam == "#") +// return SrcValue; +// if (vParam == "#1") +// return Buffer1; +// if (vParam == "#2") +// return Buffer2; +// if (vParam == "#3") +// return Buffer3; +// if (vParam == "#4") +// return Buffer4; + +// // //시작값이 숫자도 일반 문자도 공백도 아니라면 영문단어이다. +// // // ( 가 있다면 함수이므로 함수를 실행한다. +// switch (vParam.ToUpper()) +// { +// case "NOW" // //date 타입을 반환한다. +// : +// { +// return DateTime.Now; +// } + +// default: +// { +// if (vParam.IndexOf("(") != -1) +// return this.ParseCommand(vParam, false, SrcValue); +// else +// return "";// return RunUnknown(vParam, SrcValue);// //비지원 목록으로 반환한다. +// break; +// } +// } +// return ""; +// } + +// } +//} + diff --git a/Cs_HMI/Project/Class/CResult.cs b/Cs_HMI/Project/Class/CResult.cs new file mode 100644 index 0000000..76da243 --- /dev/null +++ b/Cs_HMI/Project/Class/CResult.cs @@ -0,0 +1,236 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; + +namespace Project +{ + public class CResult + { + + public bool SMSG_ProgressEnable = false; + //public string SMSG_Text = string.Empty; + public float SMSG_ProgressMax = 0; + public int SMSG_ProgressMin = 0; + public Color SMSG_ProgressForeColor = Color.Red; + public Color SMSG_ForeColor = Color.Black; + public Color SMSG_BackColor = Color.White; + public Color SMSG_BackColor2 = Color.White; + public Color SMSG_ShadowColor = Color.Transparent; + public float SMSG_ProgressValue = 0; + public string SMSG_Tag = string.Empty; + //public event EventHandler SMSG_Update; + //public void UpdateStatusMessage() + //{ + // SMSG_Update?.Invoke(null, null); + //} + /// + /// 작업시작시간 + /// + public DateTime JobStartTime; + + /// + /// 작업종료시간 + /// + public DateTime JobEndTime; + + //public DateTime IdleStartTime = DateTime.Parse("1982-11-23"); + + /// + /// 작업진행시간 + /// + public TimeSpan JobRunTime + { + get + { + if (JobStartTime.Year == 1982) return new TimeSpan(0); + if (JobEndTime.Year == 1982) return DateTime.Now - JobStartTime; + else return JobEndTime - JobStartTime; + } + } + + //public DateTime ChargeStartTime = DateTime.Parse("1982-11-23"); + + + #region "AGV Status Value" + public string PLC1_RawData { get; set; } + public string PLC2_RawData { get; set; } + + + #endregion + + /// + /// 이동대상위치(상차,하차,충전) + /// + private ePosition _targetPos = ePosition.NONE; + + public event EventHandler TargetPosSet; + + public string result_message = ""; + public double result_progressmax = 0; + public double result_progressvalue = 0; + + + public DateTime StopMessageTimePLC = DateTime.Parse("1982-11-23"); + public DateTime StopMessageTimeSWR = DateTime.Parse("1982-11-23"); + public string StopMessagePLC = string.Empty; + public string StopMessageSWR = string.Empty; + //public DateTime LastChar + //geTime = DateTime.Parse("1982-11-23"); + + public ePosition NextPos = ePosition.NONE; + public ePosition TargetPos + { + get + { + return _targetPos; + } + set + { + _targetPos = value; + TargetPosSet?.Invoke(this, null); + + PUB.log.Add(string.Format("대상위치설정:{0}", value)); + } + } + + private char _comandKit { get; set; } + public char CommandKit + { + get + { + return _comandKit; + } + set + { + _comandKit = value; + + PUB.log.Add(string.Format("명령을 내린 KIT 설정 No={0}", value)); + } + } + + + //private ePosition _currentPos = ePosition.NONE; + //public ePosition CurrentPos + //{ + // get + // { + // return _currentPos; + // } + // set + // { + // if (_currentPos != value) //값이바뀔떄만 메세지 220628 + // PUB.log.Add(string.Format("현재위치 설정:{0}->{1}", _currentPos, value)); + + // _currentPos = value; + // } + //} + + private ePosition _currentpos = ePosition.NONE; + private string _currentposcw = string.Empty; + + // public ePosition LastPos = ePosition.NONE; + public string LastTAG { get; set; } = string.Empty; + public ePosition CurrentPos + { + get + { + return _currentpos; } + set + { + + if (_currentpos != value) //값이 바뀔때만 메세지 220628 + PUB.log.Add(string.Format("TAG위치 설정:{0}->{1}", _currentpos, value)); + _currentpos = value; + } + } + + + public string CurrentPosCW + { + get + { + + return _currentposcw; + } + set + { + + if (_currentposcw != value) //값이바뀔때만 메세지 220628 + PUB.log.Add(string.Format("TAG방향 설정:{0}->{1}", _currentposcw, value)); + _currentposcw = value; + } + } + public string Memo; + + public eResult ResultCode { get; set; } + public eECode ResultErrorCode; + public string ResultMessage { get; set; } + + #region "SetResultMessage" + + public void SetResultMessage(eResult code, eECode err, eNextStep systempause, params object[] args) + { + + var rltMsg = UTIL.GetResultCodeMessage(code); + var codeMSg = $"[E{(int)err}] ";// + Util.GetResultCodeMessage(code); + if (err == eECode.MESSAGE_ERROR) + { + codeMSg = $"[{rltMsg} ERROR MESSAGE]\n"; + } + else if (err == eECode.MESSAGE_INFO) + { + codeMSg = $"[{rltMsg} INFORMATION]\n"; + } + + + + var erMsg = UTIL.GetErrorMessage(err, args); + var msg = codeMSg + erMsg; + + this.ResultCode = code; + this.ResultErrorCode = err; + this.ResultMessage = msg; + + if (systempause == eNextStep.PAUSENOMESAGE) this.ResultMessage = string.Empty; //210129 + + PUB.log.AddE(msg); + if (systempause == eNextStep.PAUSE) PUB.sm.SetNewStep(eSMStep.PAUSE); + else if (systempause == eNextStep.PAUSENOMESAGE) PUB.sm.SetNewStep(eSMStep.PAUSE); + else if (systempause == eNextStep.ERROR) PUB.sm.SetNewStep(eSMStep.ERROR); + } + + + #endregion + + + + public Boolean isError { get; set; } + + public int retry = 0; + public DateTime retryTime; + public Device.Socket.Message RecvMessage; + + public CResult() + { + this.Clear(); + } + + + public void Clear() + { + JobStartTime = DateTime.Parse("1982-11-23"); + JobEndTime = DateTime.Parse("1982-11-23"); + + Memo = string.Empty; + isError = false; + ResultCode = eResult.NoError; + ResultMessage = string.Empty; + } + + + } + +} diff --git a/Cs_HMI/Project/Class/EEMStatus.cs b/Cs_HMI/Project/Class/EEMStatus.cs new file mode 100644 index 0000000..edc1653 --- /dev/null +++ b/Cs_HMI/Project/Class/EEMStatus.cs @@ -0,0 +1,379 @@ +using Project; +using Project.Device; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management; +using System.Net; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading.Tasks; +using static Project.StateMachine; + +/// +/// ============================================================================ +/// 장비기술 상태 모니터링 관련 클래스 +/// 이 클래스는 SQLfiletoDB 프로그램과 같이 사용하는 것을 권장합니다. +/// 현재 실행 중인 프로그램의 하위 폴더 Status 에 입력된 상태값을 SQL 파일로 기록합니다. +/// SQLfiletoDB는 SQL파일을 실제 DB에 기록하는 프로그램입니다. +/// ============================================================================ +/// 작성자 : chi +/// 작성일 : 202-06-15 +/// GIT : (none) +/// +public static partial class EEMStatus +{ + static System.Threading.ManualResetEvent mre = new System.Threading.ManualResetEvent(true); + static string ip = string.Empty; + static string mac = string.Empty; + static DateTime StatusChecktime = DateTime.Now; + static DateTime MonitorChecktime = DateTime.Now.AddYears(-1); + static DateTime FileCheckTime = DateTime.Now; + static string monitorfile = string.Empty; + /// + /// UpdateStatusSQL 명령이 동작하는 간격이며 기본 180초(=3분)로 되어 있습니다. + /// + public static int UpdateStatusInterval { get; set; } = 180; + public static int UpdateFileInterval { get; set; } = 3; + static bool queryok = false; + static bool UpdateRun = false; + + public static string IP + { + get + { + if (queryok == false) GetNetworkInfo(); + return ip; + } + set { ip = value; } + } + public static string MAC + { + get + { + if (queryok == false) GetNetworkInfo(); + return mac; + } + set + { + mac = value; + } + } + + /// + /// 현재 시스템의 IP/MAC정보를 취득합니다. + /// + static void GetNetworkInfo() + { + + ip = ""; + mac = ""; + // string prgmName = Application.ProductName; + + var nif = NetworkInterface.GetAllNetworkInterfaces(); + var host = Dns.GetHostEntry(Dns.GetHostName()); + string fullname = System.Net.Dns.GetHostEntry("").HostName; + foreach (IPAddress r in host.AddressList) + { + string str = r.ToString(); + + if (str != "" && str.Substring(0, 3) == "10.") + { + ip = str; + break; + } + } + + string rtn = string.Empty; + ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled='TRUE'"); + ManagementObjectSearcher query1 = new ManagementObjectSearcher(oq); + foreach (ManagementObject mo in query1.Get()) + { + string[] address = (string[])mo["IPAddress"]; + if (address[0] == ip && mo["MACAddress"] != null) + { + mac = mo["MACAddress"].ToString(); + break; + } + } + queryok = true; + } + + public static void UpdateStatusSQL(eSMStep status, bool _extrun = false, string remark = "") + { + var tsrun = DateTime.Now - StatusChecktime; + if (tsrun.TotalSeconds >= UpdateStatusInterval) + { + AddStatusSQL(status, "UPDATE", extrun: _extrun); + StatusChecktime = DateTime.Now; + } + + //내부실행모드일때에만 파일을 처리한다 + if (_extrun == false) + { + var tsfile = DateTime.Now - FileCheckTime; + if (tsfile.TotalSeconds >= UpdateFileInterval) + { + if (UpdateRun == false) + { + UpdateRun = true; + Task.Run(() => + { + UpdateFileToDB(); + UpdateRun = false; + }); + } + FileCheckTime = DateTime.Now; + } + } + } + + /// + /// 상태모니터링 프로그램의 실행파일 명 + /// + static string StatusMonitorFile + { + get + { + if (string.IsNullOrEmpty(monitorfile)) + monitorfile = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Status", "SQLFileToDB.exe"); + return monitorfile; + } + } + + static System.Diagnostics.Process CheckMonitor() + { + if (System.IO.File.Exists(StatusMonitorFile) == false) return null; + + var prcs = System.Diagnostics.Process.GetProcesses(); + return prcs.Where(t => t.ProcessName.ToLower().StartsWith("sqlfiletodb")).FirstOrDefault(); + } + + public static bool RunStatusMonitor() + { + //파일이 없으면 실행 불가 + if (System.IO.File.Exists(StatusMonitorFile) == false) return false; + + //실행프로세스 검사 + var prc = CheckMonitor(); + if (prc == null) + { + try + { + prc = new System.Diagnostics.Process(); + prc.StartInfo = new System.Diagnostics.ProcessStartInfo + { + Arguments = string.Empty, + FileName = StatusMonitorFile, + }; + prc.Start(); + } + catch + { + return false; + } + } + + return true; + } + + /// + /// 작업수량을 입력합니다 + /// + /// + /// + public static string AddStatusCount(int cnt, string remark = "") + { + if (remark.isEmpty()) remark = $"Count Set : {cnt}"; + return AddStatusSQL(PUB.sm.Step, remark, count: cnt); + } + /// + /// 상태메세지를 status 폴더에 기록합니다. + /// + /// 상태머신의 상태값 + /// 비고 + /// 기록일시 + /// 오류발생시 오류메세지가 반환 됩니다 + public static string AddStatusSQL(eSMStep status, string remark = "", DateTime? wdate = null, bool extrun = false, int? count = null) + { + if (queryok == false || MAC.isEmpty()) GetNetworkInfo(); + if (status == eSMStep.CLOSEWAIT || status == eSMStep.CLOSED) return string.Empty; + + if (extrun) + { + //상태모니터링 프로그램을 실행합니다. + var tsMon = DateTime.Now - MonitorChecktime; + if (tsMon.TotalMinutes > 5) RunStatusMonitor(); + } + + try + { + var state = 0; + string cntstr = "null"; + if (count != null) cntstr = count.ToString(); + var alarmid = string.Empty; + var alarmmsg = string.Empty; + if (string.IsNullOrEmpty(remark)) remark = $"STS:{status}"; + + if (status == eSMStep.RUN) state = 1; + else if (status == eSMStep.ERROR || status == eSMStep.EMERGENCY) + { + state = 2; + alarmid = PUB.Result.ResultErrorCode.ToString(); + alarmmsg = PUB.Result.ResultMessage; + } + else if (status == eSMStep.PAUSE) //일시중지도 오류코드가 포함된다, + { + if (PUB.Result.ResultErrorCode == eECode.USER_STEP || PUB.Result.ResultErrorCode == eECode.USER_STOP || PUB.Result.ResultErrorCode.ToString().StartsWith("MESSAGE")) + { + //사용자에의해 멈추는 것은 오류코드를 넣지 않는다. + } + else + { + alarmid = PUB.Result.ResultErrorCode.ToString(); + alarmmsg = PUB.Result.ResultMessage; + } + } + else if (status == eSMStep.INIT) state = 3; //시작 + else if (status == eSMStep.CLOSING) state = 4; //종료 + + //length check + if (alarmid.Length > 10) alarmid = alarmid.Substring(0, 10); + if (remark.Length > 99) remark = remark.Substring(0, 99); + if (alarmmsg.Length > 250) alarmmsg = alarmmsg.Substring(0, 50); + + var mcid = Project.PUB.setting.MCID;//.Data.MCID; + var path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Status"); + var file = System.IO.Path.Combine(path, $"{DateTime.Now.ToString("HHmmssfff")}_{status}.sql"); + var sql = "insert into MCMonitor_Rawdata(Model,status,remark,ip,mac,time,alarmid,alarmmsg,count,version) " + + " values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}',{8},'{9}')"; + + var timestr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + if (wdate != null) timestr = ((DateTime)wdate).ToString("yyyy-MM-dd HH:mm:ss"); + var VersionNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); + sql = string.Format(sql, mcid, state, remark.Replace("'", "''"), IP, MAC, timestr, alarmid, alarmmsg, cntstr, VersionNumber); + System.IO.File.WriteAllText(file, sql, System.Text.Encoding.Default); + + ////만들어진지 3분이 지난 파일은 삭제한다. + //var di = new System.IO.DirectoryInfo(path); + //var fi = di.GetFiles("*.sql", System.IO.SearchOption.TopDirectoryOnly).Where(t => t.LastWriteTime < DateTime.Now.AddMinutes(-3)).FirstOrDefault(); + //if (fi != null) fi.Delete(); + if (state == 4 && extrun == false) UpdateFileToDB(); + return string.Empty; + } + catch (Exception ex) + { + return ex.Message; + } + } + + + + static void UpdateFileToDB() + { + if (mre.WaitOne(1000) == false) return; + mre.Reset(); + var cs = "Data Source=10.131.15.18;Initial Catalog=EE;Persist Security Info=True;User ID=eeuser;Password=Amkor123!"; + var path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Status"); + var di = new System.IO.DirectoryInfo(path); + if (di.Exists == false) return; + var file = di.GetFiles("*.sql", System.IO.SearchOption.TopDirectoryOnly) + .Where(t => t.LastWriteTime < DateTime.Now.AddSeconds(-3)) + .OrderByDescending(t => t.LastWriteTime).FirstOrDefault(); + + if (file == null) + { + mre.Set(); + return; + } + + //파일을 찾아야한다 + // PUB.log.Add($">> {file.FullName}"); + + + + try + { + var sql = System.IO.File.ReadAllText(file.FullName, System.Text.Encoding.Default); + if (string.IsNullOrEmpty(sql)) + { + //비어잇다면 + var errpath = System.IO.Path.Combine(di.FullName, "Error"); + var errfile = System.IO.Path.Combine(errpath, file.Name); + if (System.IO.Directory.Exists(errpath) == false) System.IO.Directory.CreateDirectory(errpath); + System.IO.File.Move(file.FullName, errfile);// file.MoveTo(errfile); + // ecnt += 1; + } + else + { + // var csstr = PUB.setting.ConnectionString; + // if (string.IsNullOrEmpty(csstr)) csstr = "Data Source=10.131.15.18;Initial Catalog=EE;Persist Security Info=True;User ID=eeuser;Password=Amkor123!"; + var cn = new System.Data.SqlClient.SqlConnection(cs); + var cmd = new System.Data.SqlClient.SqlCommand(sql, cn); + cn.Open(); + var cnt = cmd.ExecuteNonQuery(); + //if (cnt == 0) PUB.log.Add($"Result Empty : {sql}"); + cn.Close(); + cnt += 1; + + var errpath = System.IO.Path.Combine(di.FullName, "Complete"); + var errfile = System.IO.Path.Combine(errpath, file.Name); + if (System.IO.Directory.Exists(errpath) == false) System.IO.Directory.CreateDirectory(errpath); + //file.MoveTo(errfile); + System.IO.File.Move(file.FullName, errfile); + } + + } + catch (Exception ex) + { + var errpath = System.IO.Path.Combine(di.FullName, "Error"); + var errfile = System.IO.Path.Combine(errpath, file.Name); + if (System.IO.Directory.Exists(errpath) == false) System.IO.Directory.CreateDirectory(errpath); + try + { + //file.MoveTo(errfile); + System.IO.File.Move(file.FullName, errfile); + } + catch (Exception ex2) + { + Console.WriteLine($"move error : {ex2.Message} : {errfile}"); + } + + //ecnt += 1; + } + + try + { + //생성된지 10일이 넘은 자료는 삭제한다. + //시간소비를 피해서 1개의 파일만 작업한다 + var sqlfiles = di.GetFiles("*.sql", System.IO.SearchOption.AllDirectories); + //총3번의 데이터를 처리한다 + var files = sqlfiles.Where(t => t.LastWriteTime < DateTime.Now.AddDays(-10)).Select(t => t.FullName); + int i = 0; + var dellist = files.TakeWhile(t => i++ < 3); + foreach (var delfile in dellist) + System.IO.File.Delete(delfile); + } + catch + { + + } + mre.Set(); + } +} + + +/* +================================================= +변경내역 +================================================= +230619 chi UpdateFileToDB 에서 폴더가 없다면 return 하도록 함 +230615 chi UpdateFiletoDB의 ManualResetEvent적용 + Version 항목 추가 +230612 chi 프로그램 시작/종료 alarmid항목 추가 + 완료된 파일 10일간 보존하도록 함 +230522 chi extrun 모드 추가(agv용 - SQL파일을 외부 프로그램에서 처리하도록 함) +230617 chi 파일쓰기함수를 Task 로 처리 + 3분지난데이터 삭제기능 제거 +230516 chi initial commit +*/ diff --git a/Cs_HMI/Project/Class/EnumData.cs b/Cs_HMI/Project/Class/EnumData.cs new file mode 100644 index 0000000..4552f8f --- /dev/null +++ b/Cs_HMI/Project/Class/EnumData.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project +{ + public enum StepResult + { + Wait = 0, + Complete, + Error, + Cancel, + } + public enum eNextStep : byte + { + NOTHING = 0, + PAUSE, + PAUSENOMESAGE, + ERROR + } + + public enum EFlag : byte + { + MINSPACE = 0, + + MOTZ_LIMD, + MOTZ_LIMU, + WAIT_COVER_DOWN, + WAIT_COVER_UP, + POSITION_OUT, + FLAG_CHARGEALIGN, + //FLAG_AUTORUN, + FLAG_MOVING, + FLAG_NEXTSTOP_MARK, + FLAG_DIR_BW, + FLAG_SETUP, + FLAG_GATEOUT, + FLAG_STOP, + FLAG_LIMITHIGH, + FLAG_LIMITHIGHL, + FLAG_LIMITHIGHR, + FLAG_LIMITLOW, + FLAG_LIMITLOWL, + FLAG_LIMITLOWR, + } + + public enum eECode : byte + { + NOERROR, + EMERGENCY, + NOMODELV, + USER_STOP , + USER_STEP, + + AGVCONN, + PLCCONN, + + MESSAGE_INFO, + MESSAGE_ERROR, + + DOOFF, + DOON, + DIOFF, + DION, + + NOTALLOWUP, + } + + + public enum eResult : byte + { + TimeOut, + Dio, + NoError, + Setting, + NoModel, + Emergency, + Sensor, + Hardware, + Motion, + HomeTimeout, + PCBDetect, + Vision, + LOT, + } + + public enum ePosition : byte + { + NONE = 0, + NOT, + QA, + QA_QC, + QC, + CHARGE, + QC_F1, + F1, + F1_F2, + F2, + F2_F3, + F3, + F3_F4, + F4, + F4_F5, + F5, + POT, + } +} diff --git a/Cs_HMI/Project/Class/Lang.cs b/Cs_HMI/Project/Class/Lang.cs new file mode 100644 index 0000000..2e2a579 --- /dev/null +++ b/Cs_HMI/Project/Class/Lang.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Policy; +using System.Text; +using System.Threading.Tasks; + +namespace Project +{ + public static class Lang + { + public static string 상차 = "상차"; + public static string 하차 = "하차"; + public static string 연결실패 = "연결 실패"; + public static string 비상정지 = "비상 정지"; + public static string 홈검색완료 = "홈 검색 완료"; + public static string 현재위치를검색합니다 = "현재 위치를 검색 합니다"; + public static string 충전완료로해제합니다 = "충전 완료로 해제 합니다"; + public static string 오버로드감지 = "오버로드 감지"; + public static string 상차작업을시작합니다 { get { return string.Format("{0} 작업을 시작 합니다",상차); } } + public static string 하차작업을시작합니다 { get { return string.Format("{0} 작업을 시작 합니다", 하차); } } + public static string 안전커버를내려주세요 = "안전 커버를 내려 주세요"; + public static string 안전커버를올려주세요 = "안전 커버를 올려 주세요"; + public static string 안전커버를올리면하차가완료됩니다 = "안전 커버를 올리면 하차가 완료 됩니다"; + public static string 안전커버를올리면상차가완료됩니다 = "안전 커버를 올리면 상차가 완료 됩니다"; + public static string 안전커버를내립니다 = "안전 커버를 내립니다"; + public static string 장비상태초기화 = "장비 상태 초기화"; + public static string 충전을시작합니다 = "충전을 시작 합니다"; + public static string 충전을해제합니다 = "충전을 해제 합니다"; + public static string 충전을위해홈위치로이동합니다 = "충전을 위해 홈 위치로 이동 합니다"; + public static string 충전기검색실패 = "충전기 검색 실패"; + public static string 충전기를검색합니다 = "충전기를 검색 합니다"; + public static string 수동충전을시작합니다 = "수동충전을 시작 합니다"; + public static string 수동충전을해제합니다 = "수동충전을 해제 합니다"; + public static string 하드웨어오류발생 = "하드웨어 오류 발생"; + public static string 하드웨어오류로인해진행할수없습니다 = "하드웨어 오류로 인해 진행할 수 없습니다"; + public static string 초기화완료 = "초기화 완료"; + public static string 자동재부팅을실행합니다 = "자동 재부팅을 실행 합니다"; + public static string 충전기작동확인이오버되어홈으로이동조치합니다 = "충전기 작동 확인이 30초 이내로 확인이 안되어 홈으로 이동 합니다"; + public static string 충전시작명령을전송합니다 = "충전 시작명령을 전송 합니다"; + public static string 충전기위치오류로작업을취소합니다 = "충전기 위치 오류로 인해 작업을 취소 합니다"; + public static string 프로그램이초기화되었습니다 = "프로그램이 초기화 되었습니다"; + public static string 홈으로이동합니다 = "홈 으로 이동 합니다"; + public static string 전방에물체가감지되었습니다 = "전방에 물체가 감지 되었습니다"; + public static string 비상정지신호가감지되었습니다 = "비상정지 신호가 감지 되었습니다"; + public static string 비상정지로인해작업을중단합니다 = "비상정지로 인해 작업을 중단 합니다"; + public static string 선로를이탈했습니다 = "선로를 이탈 했습니다"; + public static string 충전이필요합니다자동모드로전환하세요 = "충전이 필요 합니다. 자동모드로 전환 하세요"; + public static string 충전이필요합니다 = "충전이 필요 합니다"; + public static string 배터리통신에문제가있습니다 = "배터리 통신에 문제가 있습니다"; + public static string 자동운전상태가아닙니다 = "자동운전 상태가 아닙니다"; + public static string 위치로이동합니다 = "위치로 이동 합니다"; + public static string 대기상태로전환합니다 = "대기 상태로 전환 합니다"; + public static string 홈이동완료대기상태로전환합니다 = "홈 이동이 완료 되었습니다. 대기 상태로 전환 합니다"; + public static string 커버를내립니다 = "커버를 내립니다"; + public static string 커버를올립니다 = "커버를 올립니다"; + public static string 홈검색을시작합니다 = "홈 검색을 시작 합니다"; + public static string 홈위치로이동합니다 = "홈 위치로 이동 합니다"; + public static string 하차작업이완료되었습니다 = "하차 작업이 완료 되었습니다"; + public static string 상차작업이완료되었습니다 = "상차 작업이 완료 되었습니다"; + public static string 작업종료 = "작업 종료"; + public static string 자동전환 = "자동 전환"; + public static string 충전기위치오류 = "충전기 위치 오류"; + public static string 다음마크위치에서정지합니다 = "다음 마크위치에서 정지 합니다"; + public static string 충전이감지되어수동충전으로전환합니다 = "충전이 감지되어 수동충전으로 전환 합니다"; + public static string 커버업대기상태가아닙니다 = "커버 업 대기 상태가 아닙니다"; + public static string QC이동버튼은상하차에서만사용가능합니다 = "QC이동 버튼은 상,하차 에서만 사용 가능합니다"; + public static string QA이동버튼은상하차에서만사용가능합니다 = "QA이동 버튼은 상,하차 에서만 사용 가능합니다"; + public static string 하차상태에서만사용가능합니다 = "하차 상태에서만 사용가능 합니다"; + + public static string PLC연결실패 { get { return string.Format("PLC {0}", 연결실패); } } + public static string PLC통신실패 = "PLC 통신실패"; + public static string AGV연결실패 { get { return string.Format("AGV {0}",연결실패); } } + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/CtlAuto.Designer.cs b/Cs_HMI/Project/CtlAuto.Designer.cs new file mode 100644 index 0000000..2c3e4c5 --- /dev/null +++ b/Cs_HMI/Project/CtlAuto.Designer.cs @@ -0,0 +1,36 @@ +namespace Project +{ + partial class CtlAuto + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/Project/CtlAuto.cs b/Cs_HMI/Project/CtlAuto.cs new file mode 100644 index 0000000..19a215d --- /dev/null +++ b/Cs_HMI/Project/CtlAuto.cs @@ -0,0 +1,1096 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using COMM; +using System.Diagnostics; + +namespace Project +{ + /// + /// 2017-04-13 13:26:00 : 라벨이므로 커서 IN 시 Hand 에서 Default로 변경함 + /// + public partial class CtlAuto : Control + { + #region "Enum & Structure" + public enum eColorTheme : byte + { + DaeHyun = 0, + eGrayBlue, + eDarkBlue, + TopMenu, + GrayButton, + GrayTitleBar, + IOStatus, + IOStatusDepp, + BlackButton, + RedButton, + GrayOmokButton, + Stepbar, + RobotStatus, + NewGray_Group, + NewGray_BG, + NewGray_Button, + NewBlue_Button, + Custom, + } + #endregion + + public arDev.BMS dev_bms { private get; set; } = null; + public arDev.FakePLC dev_plc { private get; set; } = null; + public arDev.Narumi dev_agv { private get; set; } = null; + public Device.Xbee dev_xbe { private get; set; } = null; + + public event EventHandler ItemClick; + + private Font _font_bms_vlt = new Font("Consolas", 50, FontStyle.Bold); + private Font _font_bms_lev = new Font("Consolas", 150, FontStyle.Bold); + private Font _font_main_batlev = new Font("Consolas", 50, FontStyle.Bold); + public Font Font_MAIN_BMSLevel { get { return _font_main_batlev; } set { _font_main_batlev = value; Invalidate(); } } + public Font Font_BMS_Volt { get { return _font_bms_vlt; } set { _font_bms_vlt = value; Invalidate(); } } + public Font Font_BMS_Level { get { return _font_bms_lev; } set { _font_bms_lev = value; Invalidate(); } } + + public enum eScean + { + Normal = 0, + Progress, + } + public eScean Scean { get; set; } = eScean.Normal; + + //public new event EventHandler Click; + public string StatusMessage { get; set; } = string.Empty; + public CtlAuto() + { + + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + this.MouseDown += arButton_MouseDown; + this.MouseUp += arButton_MouseUp; + this.MouseEnter += arButton_MouseEnter; + this.MouseLeave += arButton_MouseLeave; + this.Resize += arLabel_Resize; + + base.BackColor = Color.FromArgb(32, 32, 32); + ForeColor = Color.White; + } + + ~CtlAuto() + { + this.MouseDown -= arButton_MouseDown; + this.MouseUp -= arButton_MouseUp; + this.MouseEnter -= arButton_MouseEnter; + this.MouseLeave -= arButton_MouseLeave; + this.Resize -= arLabel_Resize; + } + + public void PerformClick() + { + if (Enabled == false) return; //171126 + this.InvokeOnClick(this, new EventArgs()); + } + + void arLabel_Resize(object sender, EventArgs e) + { + if (this.MinimumSize.Width == 0 || this.MinimumSize.Height == 0) + this.MinimumSize = new Size(100, 30); + + //bRemakeRect = true; + Invalidate(); + } + + public new Padding Padding + { + get + { + return base.Padding; + } + set + { + base.Padding = value; + this.Invalidate(); + } + } + + public Color BorderColor { get; set; } + private int _itemgap = 0; + public int ItemGap { get { return _itemgap; } set { _itemgap = value; Invalidate(); } } + //Boolean bRemakeRect = true; + public item[] Items { get; set; } + + public StateMachine.ERunStep runStep = StateMachine.ERunStep.READY; + public Boolean OnUpdateMode = false; + + public Boolean Status_AutoRun + { + get + { + if (COMM.VAR.BOOL == null) return true; + else return COMM.VAR.BOOL[eVarBool.FLAG_AUTORUN]; + } + } + + + + public DateTime StopTime { get; set; } + private string stopmessage = ""; + public string StopMessage { get { return stopmessage; } set { this.stopmessage = value; this.Invalidate(); } } + + System.Diagnostics.Stopwatch wframe = new System.Diagnostics.Stopwatch(); + + Point centerpt; + protected override void OnPaint(PaintEventArgs e) + { + //Set Optimized Double Buffer to reduce flickering + e.Graphics.CompositingQuality = CompositingQuality.HighQuality; + e.Graphics.InterpolationMode = InterpolationMode.High; + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + + if (wframe.IsRunning == false) wframe.Restart(); + + if (this.Scean == eScean.Normal) + { + var chargeM = VAR.BOOL?.Get(eVarBool.FLAG_CHARGEONM) ?? false; + var chargeA = dev_agv?.system1.Battery_charging ?? false; + var charge = chargeM || chargeA; + + //if (DesignMode) charge = true; + if (charge) + { + Scean_Normal_Charge(e.Graphics, (chargeM ? "수동" : "자동")); + } + else + { + Scean_Normal(e.Graphics); + } + } + else if (this.Scean == eScean.Progress) + Scean_Progress(e.Graphics); + + //버젼표시 + var version = VAR.STR?.Get(eVarString.SWVersion) ?? string.Empty; + if (DesignMode) version = "1.1.1.1"; + using (var f = new Font("Consolas", 8)) + e.Graphics.DrawString(version, f, Brushes.Gray, DisplayRectangle, sfBottomRight); + + } + StringFormat sfEnd = new StringFormat + { + Alignment = StringAlignment.Far, + LineAlignment = StringAlignment.Center + }; + StringFormat sfStart = new StringFormat + { + Alignment = StringAlignment.Near, + LineAlignment = StringAlignment.Center + }; + StringFormat sfCenter = new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }; + StringFormat sfBottom = new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Far + }; + StringFormat sfBottomRight = new StringFormat + { + Alignment = StringAlignment.Far, + LineAlignment = StringAlignment.Far + }; + StringFormat sfBottomLeft = new StringFormat + { + Alignment = StringAlignment.Near, + LineAlignment = StringAlignment.Far + }; + public float ProgressMax { get; set; } = 100; + public float ProgressVal { get; set; } = 0; + Matrix TranslationTransform = new Matrix(); + Matrix RotateTransform = new Matrix(); + void Scean_Progress(Graphics g) + { + var progheight = DisplayRectangle.Height * 0.1f; + var r = new RectangleF(DisplayRectangle.Left + 50, + DisplayRectangle.Bottom - progheight - (DisplayRectangle.Height * 0.2f), + DisplayRectangle.Width - 100, progheight); + + var rt = new RectangleF( + r.Left, + DisplayRectangle.Top, + r.Width, + r.Top - DisplayRectangle.Height * 0.05f); + + //g.DrawRectangle(Pens.Blue, rt.Left, rt.Top, rt.Width, rt.Height); + g.DrawString(this.StatusMessage, this.Font, Brushes.White, + rt, sfBottom); + + var progw = r.Width * (this.ProgressVal / this.ProgressMax); + var progr = new RectangleF(r.Left, r.Top, progw, r.Height); + + g.FillRectangle(new LinearGradientBrush(r, Color.LightSkyBlue, Color.DeepSkyBlue, LinearGradientMode.Vertical), progr); + g.DrawRectangle(Pens.DimGray, r.Left, r.Top, r.Width, r.Height); + + } + int textdir = -1; + void Scean_Normal_Charge(Graphics g, string mode) + { + var bmsready = dev_bms?.IsValid ?? false;// != null; + + if (DesignMode) bmsready = true; + if (bmsready == false) + { + var pts = new List(); + pts.Add(new Point(0, 0)); + pts.Add(new Point(80, 0)); + pts.Add(new Point(0, 80)); + + using (var f = new Font("Consolas", 110, FontStyle.Bold)) + g.DrawString("BMS NOT CONNECTED", f, Brushes.Gold, this.DisplayRectangle, this.sfCenter); + + g.FillPolygon(Brushes.Gold, pts.ToArray()); + + pts.Clear(); + pts.Add(new Point(0, 0)); + pts.Add(new Point(30, 0)); + pts.Add(new Point(0, 30)); + g.FillPolygon(Brushes.Orange, pts.ToArray()); + + } + else + { + //단순 수치값을 크게 표시히낟. + var Volt = dev_bms?.Current_Volt ?? 25.35f; + var Lev = dev_bms?.Current_Level ?? 80.1f; + + var textColor = Color.Lime; + if (Lev < 30) textColor = Color.Red; + else if (Lev < 40) textColor = Color.Tomato; + else if (Lev < 60) textColor = Color.Orange; + else if (Lev < 80) textColor = Color.Gold; + + + using (var textbrush = new SolidBrush(textColor)) + g.DrawString($"{Lev:N1}%", this.Font_BMS_Level, textbrush, DisplayRectangle, sfCenter); + + g.DrawString($"{Volt:N1}v", this.Font_BMS_Volt, Brushes.Gold, DisplayRectangle, sfBottomRight); + + var r = new RectangleF(DisplayRectangle.Left, DisplayRectangle.Top, + DisplayRectangle.Width, 25); + + //msg = wframe.ElapsedMilliseconds.ToString() + msg; + var msgc = mode.Equals("수동") ? Color.Gray : Color.Gray; + using (var f = new Font("맑은 고딕", 11, FontStyle.Regular)) + using (var sb = new SolidBrush(msgc)) + { + var msg = mode.Equals("수동") ? "수동 충전 중입니다 / 해제 하려면 케이블을 제거하고 [충전취소] 버튼을 누르세요" : + "자동 충전 중 입니다 / 최대 충전량에 도달 하거나 (CALL)이 발생하면 자동 해제 됩니다"; + + var textsize = g.MeasureString(msg, f); + //msg = textsize.Width.ToString() + "_" + TranslationTransform.OffsetX.ToString() + ":" + msg; + //var minx = DisplayRectangle.Width - textsize.Width + + //화면이 넘어갔다면 다시 오른쪽으로 간다 + if (textdir < 0 && TranslationTransform.OffsetX < (textsize.Width - DisplayRectangle.Width)) + textdir *= -1; + else if (textdir > 0 && TranslationTransform.OffsetX >= 0) + textdir *= -1; + + //g.FillRectangle(Brushes.BlanchedAlmond, r.Left, r.Top, r.Width, r.Height); + TranslationTransform.Translate(textdir * (wframe.ElapsedMilliseconds / 10f), 0); + wframe.Restart(); + + g.Transform = TranslationTransform; + + g.DrawString(msg, f, sb, r, sfEnd); + } + + + //TranslationTransform.Reset(); + + + + + } + } + void Scean_Normal(Graphics g) + { + + // if (Status_AutoRun) + // g.FillRectangle(new SolidBrush(Color.FromArgb(40, 40, 40)), this.DisplayRectangle); + //else + g.FillRectangle(new SolidBrush(Color.FromArgb(32, 32, 32)), this.DisplayRectangle); + + var wheelSize = new Size((int)(DisplayRectangle.Width * 0.35), + (int)(DisplayRectangle.Width * 0.35)); + + bool agv_run = true; + if (dev_agv != null) agv_run = dev_agv.system1.agv_run; + + Color wheelbackL = agv_run ? Color.DeepSkyBlue : Color.DimGray; + Color wheelBorder = Color.Gold; + if (dev_agv != null) + { + if (dev_agv.data.Speed == 'H') wheelBorder = Color.Red; + else if (dev_agv.data.Speed == 'M') wheelBorder = Color.Gold; + else if (dev_agv.data.Speed == 'L') wheelBorder = Color.Black; + else if (dev_agv.data.Speed == 'S') wheelBorder = Color.Magenta; + } + + var wheelspace = 0; + var wheelborder = 8; + + //충전중 아이콘 추가 + //var charge = VAR.BOOL?.Get(eVarBool.FLAG_CHARGEONA) ?? false; + ////charge = true; + //if (charge) + //{ + // var x = DisplayRectangle.Right - Properties.Resources.ChargeH.Width - 20; + // var y = -30; + // g.DrawImage(Properties.Resources.ChargeH, x, y); + //} + + //왼쪽오른쪽 분리해서 좌측에는 주행정보를 우측에는 배터리 정보를 표시한다 + + //left wheeel + centerpt = new Point( + (int)(DisplayRectangle.Width / 2.0), + (int)(DisplayRectangle.Height / 2.0)); + + var rectL = new Rectangle(DisplayRectangle.Left, DisplayRectangle.Top, + (int)(DisplayRectangle.Width / 2f), DisplayRectangle.Height); + var rectR = new Rectangle(rectL.Right, DisplayRectangle.Top, + (int)(DisplayRectangle.Width / 2f), DisplayRectangle.Height); + + wheelSize = new Size((int)(rectL.Width * 0.7f), (int)(rectL.Width * 0.7f)); + var rect_lwheel = new Rectangle( + (int)(rectL.Left + (rectL.Width - wheelSize.Width) / 2f), + (int)(rectL.Top + (rectL.Height - wheelSize.Height) / 2f), + wheelSize.Width, + wheelSize.Height); + + g.FillEllipse(new SolidBrush(Color.FromArgb(200, wheelbackL)), rect_lwheel); + g.DrawEllipse(new Pen(Color.Black, wheelborder), rect_lwheel.AddOffset(1, 1)); + g.DrawEllipse(new Pen(wheelBorder, wheelborder), rect_lwheel); + + + //g.DrawRectangle(Pens.Red, rectL); + //g.DrawRectangle(Pens.Blue, rectR); + + //wheel speed text + string speedchar = "마크\n멈춤"; + if (dev_bms != null) + { + //speedchar = dev_bms.Current_Level.ToString("N0"); + if (dev_agv.data.Speed == 'H') + speedchar = "고속"; + else if (dev_agv.data.Speed == 'L') + speedchar = "저속"; + else if (dev_agv.data.Speed == 'M') + speedchar = "중속"; + else if (dev_agv.data.Speed == 'S') + speedchar = "마크\n멈춤"; + else + speedchar = dev_agv.data.Speed.ToString(); + } + + //g.FillRectangle(Brushes.BlanchedAlmond, r.Left, r.Top, r.Width, r.Height); + var degree = 10;// wframe.ElapsedMilliseconds / 10f; + //var angle = (float)(degree * Math.PI / 180f); + + if (RotateTransform.OffsetX == 0) + { + RotateTransform.Translate(DisplayRectangle.Width / 2f, DisplayRectangle.Height / 2f); + } + g.Transform = RotateTransform; + //g.FillEllipse(Brushes.Magenta, new Rectangle(-5, -5, 10, 10)); + + RotateTransform.Reset(); + g.Transform = RotateTransform; + + //speedchar = "100"; + using (Font f = new Font("맑은 고딕", 70, FontStyle.Bold)) + g.DrawString(speedchar, f, Brushes.Black, rect_lwheel, sfCenter); + + + //배터리모양표시 + List batpts = new List(); + var batw = (int)(rectR.Width * 0.6f); + var bath = (int)(rectR.Height * 0.7f); + var ptLT = new PointF(rectR.Left + (rectR.Width - batw) / 2f, rectR.Top + ((rectR.Height - bath) / 2f) + (rectR.Height * 0.05f)); + batpts.Add(ptLT); + batpts.Add(new PointF(ptLT.X + batw, ptLT.Y)); + batpts.Add(new PointF(ptLT.X + batw, ptLT.Y + bath)); + batpts.Add(new PointF(ptLT.X, ptLT.Y + bath)); + //g.DrawPolygon(Pens.Gold, batpts.ToArray()); + + + var bmslevel = 28f; + if (dev_bms != null) bmslevel = dev_bms.Current_Level; + var CornerRadius = 10; + var XPosition = rectR.Left + (rectR.Width - batw) / 2f; + var YPosition = rectR.Top + (rectR.Height - bath) / 2f + (rectR.Height * 0.05f); + var batrect = new RectangleF(XPosition, YPosition, batw, bath); + var bathatsizeH = 30; + Color bmsback = Color.Lime; + if (bmslevel < 30) bmsback = Color.Red; + else if (bmslevel < 40) bmsback = Color.Tomato; + else if (bmslevel < 70) bmsback = Color.Gold; + + using (GraphicsPath Path = new GraphicsPath()) + { + Path.AddLine(XPosition + CornerRadius, YPosition, XPosition + batw / 2f - (batw * 0.1f), YPosition); + Path.AddLine(XPosition + batw / 2f - (batw * 0.1f), YPosition, XPosition + batw / 2f - (batw * 0.1f), YPosition - bathatsizeH + CornerRadius); + Path.AddLine(XPosition + batw / 2f - (batw * 0.1f) + CornerRadius, YPosition - bathatsizeH, XPosition + batw / 2f + (batw * 0.1f) - CornerRadius , YPosition - bathatsizeH); + Path.AddLine(XPosition + batw / 2f + (batw * 0.1f), YPosition - bathatsizeH + CornerRadius, XPosition + batw / 2f + (batw * 0.1f), YPosition ); + Path.AddLine(XPosition + batw / 2f - (batw * 0.1f), YPosition, XPosition + batw - (CornerRadius * 2), YPosition); + Path.AddArc(XPosition + batw - (CornerRadius * 2), YPosition, CornerRadius * 2, CornerRadius * 2, 270, 90); + Path.AddLine(XPosition + batw, YPosition + CornerRadius, XPosition + batw, YPosition + bath - (CornerRadius * 2)); + Path.AddArc(XPosition + batw - (CornerRadius * 2), YPosition + bath - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 0, 90); + Path.AddLine(XPosition + batw - (CornerRadius * 2), YPosition + bath, XPosition + CornerRadius, YPosition + bath); + Path.AddArc(XPosition, YPosition + bath - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 90, 90); + Path.AddLine(XPosition, YPosition + bath - (CornerRadius * 2), XPosition, YPosition + CornerRadius); + Path.AddArc(XPosition, YPosition, CornerRadius * 2, CornerRadius * 2, 180, 90); + Path.CloseFigure(); + var tRegion = new System.Drawing.Region(Path); + var bmsh = (int)(bath * (bmslevel / 100f)); + var gRegion = new Region(new RectangleF(XPosition, YPosition + bath - bmsh, batw, bmsh)); + gRegion.Intersect(tRegion); + g.DrawPath(new Pen(bmsback, 20), Path); + g.FillRegion(Brushes.WhiteSmoke, tRegion); + g.FillRegion(new SolidBrush(bmsback), gRegion); + g.DrawString($"{bmslevel:N0}", Font_MAIN_BMSLevel, Brushes.Black, batrect, sfCenter); + } + + this.DrawDirection(g, rect_lwheel, wheelborder); + + //경고메세지표시 + DrawWarning(g); + + //전체테두리 + g.DrawRectangle(new Pen(BorderColor), DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1); + + var nextstop = VAR.BOOL?.Get(eVarBool.NEXTSTOP_MARK) ?? false; + //if (VAR.BOOL != null) nextstop = VAR.BOOL[eVarBool.NEXTSTOP_MARK]; + //상태메세지표시 + string stmsg = string.Empty; + + if (COMM.VAR.STR != null && COMM.VAR.STR[eVarString.StatusMessage].isEmpty() == false) stmsg = VAR.STR[eVarString.StatusMessage]; + else stmsg = "STATUS MESSAGE DEMO"; + if (nextstop) stmsg += "|MARK-STOP"; + + var MsgColor = Color.Lime; + if (PUB.Result != null) MsgColor = PUB.Result.SMSG_ForeColor; + using (SolidBrush sb = new SolidBrush(MsgColor)) + using (Font f = new Font("맑은 고딕", 10, FontStyle.Bold)) + g.DrawString(stmsg, f, sb, DisplayRectangle, new StringFormat + { + Alignment = StringAlignment.Near, + LineAlignment = StringAlignment.Far, + }); + + } + + readonly Font StopFont = new Font("맑은 고딕", 30, FontStyle.Bold); + + public class UIButton + { + public RectangleF rect { get; set; } + public string title { get; set; } + public string cmd { get; set; } + public bool Visible { get; set; } + } + public List Buttons = new List(); + public delegate void ButtonClickHandler(UIButton idx); + public event ButtonClickHandler ButtonClick; + + void DrawWarning(Graphics g) + { + + string warnmsg = string.Empty; + string butcmd = string.Empty; + if (dev_agv != null) + { + if (dev_agv.error.Emergency) + warnmsg = "비상 정지"; + else if (dev_agv.error.line_out_error) + warnmsg = "LINE OUT"; + else if (dev_agv.error.Overcurrent) + warnmsg = "OVER CURRENT"; + else if (dev_agv.system1.agv_run && dev_agv.system1.stop_by_front_detect) + warnmsg = "전방 장애물"; + } + //if (DesignMode) + //{ + // warnmsg = "비.상.정.지"; + // butcmd = "EMG"; + //} + + if (warnmsg.isEmpty() && stopmessage.isEmpty() == false) + warnmsg = stopmessage; + + if (warnmsg != "") + { + var but = this.Buttons.Where(t => t.title.Equals(warnmsg)).FirstOrDefault(); + if (but == null) + { + but = new UIButton(); + but.title = warnmsg; + this.Buttons.Add(but); + } + but.cmd = butcmd; + var w = this.Width * 0.9f; + var h = this.Height * 0.4f; + but.rect = new RectangleF( + (float)((this.Width - w) / 2.0f), + (float)((this.Height - h) / 2.0f), + w, h); + var rectt = new RectangleF(but.rect.Left, but.rect.Top, but.rect.Width, 10); + var rectb = new RectangleF(but.rect.Left, but.rect.Bottom - 10, but.rect.Width, 10); + g.FillRectangle(new SolidBrush(Color.FromArgb(200, Color.White)), but.rect); + g.FillRectangle(new SolidBrush(Color.FromArgb(220, Color.Red)), rectt); + g.FillRectangle(new SolidBrush(Color.FromArgb(220, Color.Red)), rectb); + + //var sf = new StringFormat + //{ + // LineAlignment = StringAlignment.Center, + // Alignment = StringAlignment.Center + //}; + var sfsize = g.MeasureString(warnmsg, StopFont); + var scx = (float)((but.rect.Width - sfsize.Width) / 2.0); + var scy = (float)((but.rect.Height - sfsize.Height) / 2.0); + g.DrawString(warnmsg, StopFont, Brushes.Black, but.rect.Left + scx + 1, but.rect.Top + scy + 1); + g.DrawString(warnmsg, StopFont, Brushes.Red, but.rect.Left + scx, but.rect.Top + scy); + g.DrawRectangle(new Pen(Color.FromArgb(250, Color.Black), 2), but.rect.Left, but.rect.Top, but.rect.Width, but.rect.Height); + } + else + { + //버튼을 모두 숨긴다. + foreach (var but in Buttons) + but.Visible = false; + } + } + + + public int frame_direction = 1000 / 10; //초당 4프레임으로 표시한다 + public long frame_direction_ms = 0; + public int frame_direction_idx = 0; + + void DrawDirection(Graphics g, Rectangle rect, int wheelborder) + { + + //위쪽에 방향지시등을 그린다. + var dirterm = 15; + var ditHeight = 50; + var dirWidth = (int)(rect.Width / 5.5f); + var rect_dirup = new Rectangle( + (int)((rect.Left + rect.Width / 2.0) - (dirWidth / 2.0)), + rect.Top - ditHeight - dirterm, + dirWidth, + (ditHeight - wheelborder)); + + var ptsUp = new Point[] { + new Point( rect_dirup.Left, rect_dirup.Bottom), + new Point( rect_dirup.Right, rect_dirup.Bottom), + new Point( (int)(rect_dirup.Left+ rect_dirup.Width/2.0), rect_dirup.Top) + }; + + bool dirup = true; + if (dev_agv != null) dirup = dev_agv.data.Direction == 'B'; + + if (dirup == true) + { + g.FillPolygon(Brushes.Lime, ptsUp); + } + else g.FillPolygon(new SolidBrush(Color.FromArgb(28, 28, 28)), ptsUp); + g.DrawPolygon(Pens.Black, ptsUp); + + + + //아래쪾에 방향지시등을 그린다 + var rect_dirdn = new Rectangle( + (int)((rect.Left + rect.Width / 2.0) - (dirWidth / 2.0)), + rect.Bottom + wheelborder + 1 + dirterm, + dirWidth, + (ditHeight - wheelborder)); + + var ptDn = new Point[] { + new Point( rect_dirdn.Left, rect_dirdn.Top), + new Point( rect_dirdn.Right, rect_dirdn.Top), + new Point( (int)(rect_dirdn.Left+ rect_dirdn.Width/2.0), rect_dirdn.Bottom) + }; + + if (dirup == false) + { + g.FillPolygon(Brushes.Lime, ptDn); + } + else g.FillPolygon(new SolidBrush(Color.FromArgb(28, 28, 28)), ptDn); + g.DrawPolygon(Pens.Black, ptDn); + + + + ////오른쪾에 방향지시등을 그린다 + //var dirR = false; + //var rect_dirr = new Rectangle( + // (int)(rect.Right + dirterm), + // (int)(rect.Top + (rect.Height / 2f)), + // dirWidth, + // (ditHeight - wheelborder)); + + //var ptR = new Point[] { + // new Point( rect_dirr.Left, rect_dirr.Top), + // new Point( rect_dirr.Right, rect_dirr.Top), + // new Point( (int)(rect_dirr.Left+ rect_dirr.Width/2.0), rect_dirr.Bottom) + //}; + + //if (dirR == false) + //{ + // g.FillPolygon(Brushes.Lime, ptR); + //} + //else g.FillPolygon(new SolidBrush(Color.FromArgb(28, 28, 28)), ptR); + //g.DrawPolygon(Pens.Black, ptR); + + } + + public bool LimitLU + { + get + { + if (dev_plc == null) return true; + return dev_plc.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU); + } + + } + public bool LimitLD + { + get + { + if (dev_plc == null) return false; + return dev_plc.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LD); + } + } + public bool LimitRU + { + get + { + if (dev_plc == null) return false; + return dev_plc.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU); + } + } + public bool LimitRD + { + get + { + if (dev_plc == null) return true; + return dev_plc.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RD); + } + } + + void DrawMC(Graphics g) + { + var boxw = DisplayRectangle.Width * 0.5f; + var r = new RectangleF( + boxw - 80, + DisplayRectangle.Top + 50, + boxw, + DisplayRectangle.Height - 20); + //g.DrawRectangle(Pens.Red, r.Left, r.Top, r.Width, r.Height); + + var w = r.Width * 0.7f;// this.DisplayRectangle.Width * 0.45; + var h = r.Height * 0.5f;// this.DisplayRectangle.Height * 0.75; + var pt = new PointF(r.Left + r.Width / 2.0f, r.Top + r.Height / 2.0f); + var rect = new RectangleF((float)(pt.X - w / 2.0f), (float)((pt.Y - h / 2.0f) + 20), (float)w, (float)h); + + //3d모형으로 엣지를 넣는다 + // pt = new PointF(DisplayRectangle.Width / 2.1f, DisplayRectangle.Height / 1.5f); + var sizeX = 150; + // var sizeY = 100; + var sizeZ = 150; + + var PtsFront = new PointF[] { + new PointF(pt.X-sizeX,pt.Y-sizeZ / 2.0f), + new PointF(pt.X+sizeX,pt.Y-sizeZ / 2.0f), + new PointF(pt.X+sizeX,pt.Y+sizeZ / 2.0f), + new PointF(pt.X-sizeX,pt.Y+sizeZ / 2.0f) + }; + var PtsTop = new PointF[] { + new PointF(pt.X-sizeX,pt.Y-(sizeZ / 2.0f)), + new PointF(pt.X+sizeX,pt.Y-(sizeZ / 2.0f)), + new PointF(pt.X +sizeX + 75,pt.Y- sizeZ), + new PointF(pt.X - (sizeX / 2.0f) ,pt.Y-sizeZ) + }; + + + var PtsBottom = new PointF[] { + new PointF(pt.X-sizeX,sizeZ+pt.Y-(sizeZ / 2.0f)), + new PointF(pt.X+sizeX,sizeZ+pt.Y-(sizeZ / 2.0f)), + new PointF(pt.X +sizeX +75,sizeZ+pt.Y- sizeZ), + new PointF(pt.X - (sizeX / 2.0f) ,sizeZ+pt.Y-sizeZ) + }; + + var PtsBack = new PointF[] { + new PointF( (sizeX / 2.0f)+pt.X-sizeX,pt.Y-sizeZ ), + new PointF( (sizeX / 2.0f)+pt.X+sizeX,pt.Y-sizeZ ), + new PointF( (sizeX / 2.0f)+pt.X+sizeX,pt.Y), + new PointF( (sizeX / 2.0f)+pt.X-sizeX,pt.Y) + }; + + var PtsRight = new PointF[] { + new PointF( PtsFront[1].X, PtsFront[1].Y ), + new PointF( PtsBack[1].X, PtsBack[1].Y ), + new PointF( PtsBack[2].X, PtsBack[2].Y ), + new PointF( PtsFront[2].X, PtsFront[2].Y ) + }; + + + var PtsLeft = new PointF[] { + new PointF( PtsFront[0].X, PtsFront[0].Y ), + new PointF( PtsBack[0].X, PtsBack[0].Y ), + new PointF( PtsBack[3].X, PtsBack[3].Y ), + new PointF( PtsFront[3].X, PtsFront[3].Y ) + }; + + //foreach (var p in PtsBottom) + //{ + // var xx = p.X - 5; + // var yy = p.Y - 5; + // var ww = 10; + // var hh = 10; + // g.DrawEllipse(Pens.Red, xx, yy, ww, hh); + //} + + //바닥면 출력 + g.FillPolygon(new SolidBrush(Color.FromArgb(150, Color.White)), PtsBottom); + g.DrawPolygon(Pens.Black, PtsBottom); + + //윗면 출력 + g.FillPolygon(new SolidBrush(Color.FromArgb(50, Color.White)), PtsTop); + + ////뒷면먼저출력 + g.FillPolygon(new SolidBrush(Color.FromArgb(50, Color.White)), PtsBack); + + ////우측출력 + g.FillPolygon(new SolidBrush(Color.FromArgb(10, Color.White)), PtsRight); + + ////좌측출력 + g.FillPolygon(new SolidBrush(Color.FromArgb(10, Color.White)), PtsLeft); + + //안전커버 뒷 + var coverPadding = 10; + var coverYOffset = -30; + var coverLYOffset = 0; + var coverRYOffset = 0; + + if (LimitRD == true) coverRYOffset = 20; + else if (LimitRU == true) coverRYOffset = coverYOffset; + + if (LimitLD == true) coverLYOffset = 20; + else if (LimitLU == true) coverLYOffset = coverYOffset; + + var PtsCoverBack = new PointF[] { + new PointF( PtsBack[0].X+coverPadding, PtsBack[0].Y+coverLYOffset ), + new PointF( PtsBack[1].X-coverPadding, PtsBack[1].Y+coverLYOffset ), + new PointF( PtsBack[2].X-coverPadding, PtsBack[2].Y+coverLYOffset ), + new PointF( PtsBack[3].X+coverPadding, PtsBack[3].Y+coverLYOffset ) + }; + + var PtsCoverFront = new PointF[] { + new PointF( PtsFront[0].X+coverPadding, PtsFront[0].Y+coverRYOffset ), + new PointF( PtsFront[1].X-coverPadding, PtsFront[1].Y+coverRYOffset ), + new PointF( PtsFront[2].X-coverPadding, PtsFront[2].Y+coverRYOffset ), + new PointF( PtsFront[3].X+coverPadding, PtsFront[3].Y+coverRYOffset ) + }; + + if (LimitLU == true) + { + g.FillPolygon(new SolidBrush(Color.FromArgb(100, Color.Red)), PtsCoverBack); + g.DrawPolygon(new Pen(Color.DarkRed, 2), PtsCoverBack); + } + else if (LimitLD == true) + { + g.FillPolygon(new SolidBrush(Color.FromArgb(100, Color.Blue)), PtsCoverBack); + g.DrawPolygon(new Pen(Color.DarkBlue, 2), PtsCoverBack); + } + else + { + g.FillPolygon(new SolidBrush(Color.FromArgb(100, Color.Gray)), PtsCoverBack); + g.DrawPolygon(Pens.DimGray, PtsCoverBack); + } + + //g.DrawPolygon(Pens.Orange, PtsCoverBack); + + g.FillPolygon(new SolidBrush(Color.FromArgb(50, Color.White)), PtsFront); + // g.DrawPolygon(Pens.Black, PtsFront); + + if (LimitRU == true) + { + g.FillPolygon(new SolidBrush(Color.FromArgb(150, Color.Red)), PtsCoverFront); + g.DrawPolygon(new Pen(Color.DarkRed, 2), PtsCoverFront); + } + else if (LimitRD == true) + { + g.FillPolygon(new SolidBrush(Color.FromArgb(150, Color.Blue)), PtsCoverFront); + g.DrawPolygon(new Pen(Color.DarkBlue, 2), PtsCoverFront); + } + else + { + g.FillPolygon(new SolidBrush(Color.FromArgb(150, Color.Gray)), PtsCoverFront); + g.DrawPolygon(Pens.DimGray, PtsCoverFront); + } + + //중앙포인트 + g.FillEllipse(Brushes.White, pt.X - 2, pt.Y - 2, 4f, 4f); + + ////button - start + //var buttonSize = 15; + //var offset = 10; + //g.FillEllipse(Brushes.Red, offset * 2.7f + PtsTop[0].X - buttonSize / 2.0f, -offset + PtsTop[0].Y - buttonSize / 2.0f, buttonSize, buttonSize); + //g.DrawEllipse(Pens.Black, offset * 2.7f + PtsTop[0].X - buttonSize / 2.0f, -offset + PtsTop[0].Y - buttonSize / 2.0f, buttonSize, buttonSize); + + //g.FillEllipse(Brushes.Blue, offset * 4.2f + PtsTop[0].X - buttonSize / 2.0f, -offset*2.5f + PtsTop[0].Y - buttonSize / 2.0f, buttonSize, buttonSize); + //g.DrawEllipse(Pens.Black, offset * 4.2f + PtsTop[0].X - buttonSize / 2.0f, -offset * 2.5f + PtsTop[0].Y - buttonSize / 2.0f, buttonSize, buttonSize); + + //g.FillEllipse(Brushes.Green, offset * 5.5f + PtsTop[0].X - buttonSize / 2.0f, -offset * 4.0f + PtsTop[0].Y - buttonSize / 2.0f, buttonSize, buttonSize); + //g.DrawEllipse(Pens.Black, offset * 5.5f + PtsTop[0].X - buttonSize / 2.0f, -offset * 4.0f + PtsTop[0].Y - buttonSize / 2.0f, buttonSize, buttonSize); + + } + + //void DrawBattery(Graphics g) + //{ + // //우측 끝에 세로로 표시한다 + // int r = 10; + // int w = 25; + // int y = 10; + // Rectangle rect = new Rectangle(DisplayRectangle.Right - w - r, y, w, DisplayRectangle.Height - (y * 2)); + // var ph = (this.ChargeLevel / 100.0) * rect.Height; + // Rectangle rectp = new Rectangle(rect.Left, (int)(rect.Top + rect.Height - ph), rect.Width, (int)ph); + + // Color pColor = Color.Gold; + // if (ChargeLevel <= 40) pColor = Color.Tomato; + // else if (ChargeLevel >= 80) pColor = Color.Lime; + + + // if (rectp.Height > 1) + // { + // using (LinearGradientBrush b = new LinearGradientBrush(rectp, pColor, Color.FromArgb(150, 150, 150), LinearGradientMode.Vertical)) + // g.FillRectangle(b, rectp); + + // } + + + // //for (int i = 1; i < 10; i++) + // //{ + // // var ly = (int)( rect.Height * ((i*1.0) / 10.0) ); + // // g.DrawLine(Pens.Gray, rect.Left, rect.Top + ly, rect.Right, rect.Top + ly); + // // g.DrawString((10-i).ToString(), this.Font, Brushes.Gray, rect.Left+5, ly+5); + // //} + + + // //전체테두리 + // using (Pen p = new Pen(Color.FromArgb(100, Color.Black))) + // g.DrawRectangle(p, rect); + + + //} + + public class item + { + + public bool Enable_Direction { get; set; } + public Color BackColor1 { get; set; } + public Color BackColor2 { get; set; } + public Color ForeColor { get; set; } + public Color ShadowColor { get; set; } + public Color BorderColor { get; set; } + + public Color RightColor { get; set; } + public Color LeftColor { get; set; } + + [Browsable(false)] + public Rectangle fullrect { get; set; } + [Browsable(false)] + public Rectangle leftrect { get; set; } + [Browsable(false)] + public Rectangle rightrect { get; set; } + + public item() + { + BorderColor = Color.FromArgb(100, 100, 100); + fullrect = Rectangle.Empty; + leftrect = Rectangle.Empty; + rightrect = Rectangle.Empty; + BackColor1 = Color.White; + BackColor2 = Color.Transparent; + ForeColor = Color.DimGray; + ShadowColor = Color.Black; + Enable_Direction = true; + } + + + + public string Title { get; set; } + + public void Draw(Graphics g, Font font, StringFormat sf) + { + Pen pen_border = null; + LinearGradientBrush br_back = null; + SolidBrush br_text = null; + + //펜 + if (pen_border == null) pen_border = new Pen(this.BorderColor); + else pen_border.Color = this.BorderColor; + + //배경브러쉬 + if (br_back == null) br_back = new LinearGradientBrush(this.fullrect, this.BackColor1, this.BackColor2, LinearGradientMode.Vertical); + else + { + br_back.LinearColors[0] = this.BackColor1; + br_back.LinearColors[1] = this.BackColor2; + } + + //제목브러쉬 + if (br_text == null) br_text = new SolidBrush(this.ForeColor); + else br_text.Color = this.ForeColor; + + //배경표시 + g.FillRectangle(br_back, this.fullrect); + + //제목표시 + if (this.Title.isEmpty() == false) + { + if (this.ShadowColor != Color.Transparent && this.ShadowColor != this.ForeColor) + { + using (var brShadow = new SolidBrush(this.ShadowColor)) + g.DrawString( + this.Title, + font, brShadow, + new Rectangle( + this.fullrect.Left + 1, + this.fullrect.Top + 1, + this.fullrect.Width, + this.fullrect.Height), + sf); + } + + g.DrawString(this.Title, font, br_text, this.fullrect, sf); + g.DrawString(this.Title, font, br_text, this.fullrect, sf); + } + + //테두리표시 + g.DrawRectangle(pen_border, this.fullrect); + + if (Enable_Direction) + { + //좌측테두리 + if (this.leftrect.IsEmpty == false) + { + if (this.LeftColor != Color.Transparent) + { + using (SolidBrush sb = new SolidBrush(this.LeftColor)) + g.FillRectangle(sb, this.leftrect); + } + g.DrawRectangle(pen_border, this.leftrect); + } + //우측테두리 + if (this.rightrect.IsEmpty == false) + { + if (this.RightColor != Color.Transparent) + { + using (SolidBrush sb = new SolidBrush(this.RightColor)) + g.FillRectangle(sb, this.rightrect); + } + g.DrawRectangle(pen_border, this.rightrect); + } + + } + + if (pen_border != null) pen_border.Dispose(); + if (br_back != null) br_back.Dispose(); + if (br_text != null) br_text.Dispose(); + } + } + + public class ItemClickEventArgs : EventArgs + { + public item Item { get; set; } + public ItemClickEventArgs(item item) + { + this.Item = item; + } + } + + + + + + void arButton_MouseLeave(object sender, EventArgs e) + { + //isMouseOver = false; + this.Cursor = Cursors.Default; + Invalidate(); + } + + void arButton_MouseEnter(object sender, EventArgs e) + { + //isMouseOver = true; + //this.Cursor = Cursors.Hand; + Invalidate(); + } + + void arButton_MouseUp(object sender, MouseEventArgs e) + { + if (!Enabled) + { + return; + } + // isMouseDown = false; + Invalidate(); + } + + + void arButton_MouseDown(object sender, MouseEventArgs e) + { + if (Enabled == false || Enabled == false) return; + // isMouseDown = true; + + //item fullrect 에서 클릭위치를 찾아야함 + if (Items != null && Items.Length > 0) + { + //마우스위치가 아이템에 포함되어있다면 + var focusItem = Items.Where(t => t.fullrect.Contains(e.Location)).FirstOrDefault(); + if (focusItem != null) + { + ItemClick?.Invoke(this, new ItemClickEventArgs(focusItem)); + } + } + + if (Buttons.Any()) + { + //마우스위치가 아이템에 포함되어있다면 + var focusItem = Buttons.Where(t => t.rect.Contains(e.Location)).FirstOrDefault(); + if (focusItem != null) + { + //ItemClick?.Invoke(this, new ItemClickEventArgs(focusItem)); + ButtonClick?.Invoke(focusItem); + } + } + Invalidate(); + } + + + + } +} diff --git a/Cs_HMI/Project/CtlPos.Designer.cs b/Cs_HMI/Project/CtlPos.Designer.cs new file mode 100644 index 0000000..18e8332 --- /dev/null +++ b/Cs_HMI/Project/CtlPos.Designer.cs @@ -0,0 +1,36 @@ +namespace Project +{ + partial class CtlPos + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/Project/CtlPos.cs b/Cs_HMI/Project/CtlPos.cs new file mode 100644 index 0000000..a92cf2f --- /dev/null +++ b/Cs_HMI/Project/CtlPos.cs @@ -0,0 +1,586 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Project +{ + /// + /// 2017-04-13 13:26:00 : 라벨이므로 커서 IN 시 Hand 에서 Default로 변경함 + /// + public partial class CtlPos : Control + { + #region "Enum & Structure" + public enum eColorTheme : byte + { + DaeHyun = 0, + eGrayBlue, + eDarkBlue, + TopMenu, + GrayButton, + GrayTitleBar, + IOStatus, + IOStatusDepp, + BlackButton, + RedButton, + GrayOmokButton, + Stepbar, + RobotStatus, + NewGray_Group, + NewGray_BG, + NewGray_Button, + NewBlue_Button, + Custom, + } + #endregion + + public string[] msg { get; set; } + public event EventHandler ItemClick; + + + + + //public new event EventHandler Click; + public CtlPos() + { + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + this.MouseDown += arButton_MouseDown; + this.MouseUp += arButton_MouseUp; + this.MouseEnter += arButton_MouseEnter; + this.MouseLeave += arButton_MouseLeave; + this.Resize += arLabel_Resize; + + base.BackColor = Color.FromArgb(32, 32, 32); + ForeColor = Color.White; + } + + ~CtlPos() + { + this.MouseDown -= arButton_MouseDown; + this.MouseUp -= arButton_MouseUp; + this.MouseEnter -= arButton_MouseEnter; + this.MouseLeave -= arButton_MouseLeave; + this.Resize -= arLabel_Resize; + } + + public void ClearData() + { + foreach (var item in Items) + { + item.Direction = '0'; + item.Active = false; + item.Focus = false; + } + } + + public void PerformClick() + { + if (Enabled == false) return; //171126 + this.InvokeOnClick(this, new EventArgs()); + } + + void arLabel_Resize(object sender, EventArgs e) + { + if (this.MinimumSize.Width == 0 || this.MinimumSize.Height == 0) + this.MinimumSize = new Size(100, 30); + + bRemakeRect = true; + Invalidate(); + } + + public new Padding Padding + { + get + { + return base.Padding; + } + set + { + base.Padding = value; + this.Invalidate(); + } + } + + public Color BorderColor { get; set; } + private int _itemgap = 0; + public int ItemGap { get { return _itemgap; } set { _itemgap = value; Invalidate(); } } + Boolean bRemakeRect = true; + public item[] Items { get; set; } + protected override void OnPaint(PaintEventArgs e) + { + //Set Optimized Double Buffer to reduce flickering + e.Graphics.CompositingQuality = CompositingQuality.HighQuality; + e.Graphics.InterpolationMode = InterpolationMode.High; + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + + if (Items == null) e.Graphics.DrawString("No Item", this.Font, Brushes.Red, 10, 10); + else + { + //영역변경시새로한다 + if (bRemakeRect == true) makeRect(); + + //아이템그리기 + var sf = new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }; + foreach (var item in Items) + { + item.Draw(e.Graphics, this.Font, sf); + } + } + + + //전체테두리 + e.Graphics.DrawRectangle(new Pen(BorderColor), DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1); + } + void makeRect() + { + var indiheight = (int)(DisplayRectangle.Height * 0.15); + var fullrect = new Rectangle( + DisplayRectangle.Left + Padding.Left, + DisplayRectangle.Top + Padding.Top, + DisplayRectangle.Width - Padding.Left - Padding.Right, + DisplayRectangle.Height - Padding.Top - Padding.Bottom - 1 - indiheight); + + var itemCountS = this.Items.Where(t => t.ItemType != itemtype.Hidden && t.ItemType != itemtype.Item).Count(); + var itemCountI = this.Items.Where(t => t.ItemType == itemtype.Item).Count(); + + var GapWidth = ItemGap * ((itemCountI + itemCountS) - 1); + var itemWidthS = (ItemGap * 2); //spacer width + var itemWidthI = (fullrect.Width - GapWidth - (itemWidthS * itemCountS)) / itemCountI; + var itemHeight = fullrect.Height; + + var i = 0; + var x = fullrect.Left; + foreach (var item in Items) + { + if (item.ItemType == itemtype.Hidden) continue; + if (item.ItemType == itemtype.Spacer) + { + var y = fullrect.Top; + var w = (int)itemWidthS; + var h = DisplayRectangle.Height - Padding.Top - Padding.Bottom + 3; + var rectf = new Rectangle(x, y, w, h); + item.fullrect = rectf; + item.leftrect = Rectangle.Empty; + item.rightrect = Rectangle.Empty; + x += w + ItemGap; + } + else if (item.ItemType == itemtype.NLimit || item.ItemType == itemtype.PLimit) + { + var y = fullrect.Top; + var w = (int)itemWidthS; + var h = DisplayRectangle.Height - Padding.Top - Padding.Bottom + 3; + var rectf = new Rectangle(x, y, w, h); + item.fullrect = rectf; + item.leftrect = Rectangle.Empty; + item.rightrect = Rectangle.Empty; + x += w + ItemGap; + } + else if (item.Enable_Direction) + { + //var x = (int)(fullrect.Left + i * itemWidth) + (i * ItemGap); + var y = fullrect.Top; + var w = (int)itemWidthI; + var h = itemHeight; + var rectf = new Rectangle(x, y, w, h); + item.fullrect = rectf; + var indiWidth = (int)((rectf.Width - 4) / 2.0); + item.leftrect = new Rectangle(rectf.Left, rectf.Bottom + 4, indiWidth, indiheight); + item.rightrect = new Rectangle(rectf.Left + indiWidth + 4, rectf.Bottom + 4, indiWidth, indiheight); + x += itemWidthI + ItemGap; + } + else + { + //var x = (int)(fullrect.Left + i * itemWidth) + (i * ItemGap); + var y = fullrect.Top; + var w = (int)itemWidthI; + var h = DisplayRectangle.Height - Padding.Top - Padding.Bottom + 3; + var rectf = new Rectangle(x, y, w, h); + item.fullrect = rectf; + item.leftrect = Rectangle.Empty; + item.rightrect = Rectangle.Empty; + x += itemWidthI + ItemGap; + } + i += 1; + } + bRemakeRect = false; + } + + // private int LastPosition = -1; + //private string LastDir = ""; + //public void SetPositionOut(Boolean value) + //{ + // if (LastPosition < 0 || LastPosition >= Items.Length) return; + + // if (value == true) + // { + // this.Items[LastPosition].BackColor1 = Color.SkyBlue; + // this.Items[LastPosition].BackColor2 = Color.DeepSkyBlue; + // } + + // this.Invalidate(); + //} + + /// + /// 지정한 개체를 선택합니다. + /// + /// + public void SetPosition(ePosition idx) + { + + foreach (var item in Items) + item.Focus = false; + if (idx == ePosition.NONE) return; + var pos = Items.Where(t => t.Position == idx).First(); + pos.Focus = true; + } + public bool GetPositionActive(ePosition idx) + { + if (idx == ePosition.NONE) return false; + var pos = Items.Where(t => t.Position == idx).First(); + return pos.Active; + } + public void SetPositionActive(ePosition idx) + { + + foreach (var item in Items) + item.Active = false; + if (idx == ePosition.NONE) return; + var pos = Items.Where(t => t.Position == idx).First(); + pos.Active = true; + } + + /// + /// 활성화된 위치를 모두 초기화 한다 + /// + public void SetPositionDeActive() + { + foreach (var item in Items) + item.Active = false; + } + public void SetTargetPosition(ePosition idx) + { + + foreach (var item in Items) + item.Target = false; + if (idx == ePosition.NONE) return; + var pos = Items.Where(t => t.Position == idx).First(); + pos.Target = true; + } + /// + /// 지정한 개체의 left,right 값을 바꿉니다 .rfid값이 변경되었을때 처리합니다. dir=0이면 왼쪽이 켜집니다) + /// + /// + /// + public void SetDirection(string dir) + { + //모든 위치값이 초기화 된다. + foreach (var item in Items) + item.Direction = '0'; + + var selectitem = this.Items.Where(t => t.Focus).FirstOrDefault(); + if (selectitem != null) + { + if (dir.isEmpty()) selectitem.Direction = '0'; + else selectitem.Direction = (dir == "0" ? '1' : '2'); + } + } + + public enum itemtype + { + Hidden, + NLimit, + PLimit, + Spacer, + Item, + } + + public class item + { + public ePosition Position { get; set; } + public itemtype ItemType { get; set; } + // public bool Hidden { get; set; } + public bool Enable_Direction { get; set; } + + #region Colorlist + public Color BackColor2 + { + get + { + if (Active) + { + if (ItemType == itemtype.NLimit || ItemType == itemtype.PLimit) + return Color.Tomato; + else + return Color.Lime; + } + else if (Focus) + { + if (ItemType == itemtype.NLimit || ItemType == itemtype.PLimit) + return Color.Tomato; + else + return Color.Yellow; + } + else return Color.FromArgb(82, 82, 82); + } + } + public Color BackColor1 + { + get + { + if (Active) + { + if (ItemType == itemtype.NLimit || ItemType == itemtype.PLimit) + return Color.Red; + else + return Color.Green; + } + else if (Focus) + { + if (ItemType == itemtype.NLimit || ItemType == itemtype.PLimit) + return Color.Red; + else + return Color.Gold; + } + else return Color.FromArgb(64, 64, 64); + } + } + public Color ForeColor + { + get + { + if (this.Target) return Color.DarkMagenta; + else return Color.Black; + } + } + public Color ShadowColor { get { return Color.DimGray; } } + public Color BorderColor { get { return Color.Black; } } + public Color RightColor + { + get + { + if (Direction == '2') + { + if (Active) return Color.Lime; + else return Color.Gold; + } + else return Color.Transparent; + } + } + public Color LeftColor + { + get + { + if (Direction == '1') + { + if (Active) return Color.Lime; + else return Color.Gold; + } + else return Color.Transparent; + } + } + #endregion + + [Browsable(false)] + public Rectangle fullrect { get; set; } + [Browsable(false)] + public Rectangle leftrect { get; set; } + [Browsable(false)] + public Rectangle rightrect { get; set; } + + public bool Active { get; set; } + public bool Focus { get; set; } + public char Direction { get; set; } + public bool Target { get; set; } + + public string Title { get; set; } + + // public bool Spacer { get; set; } + + public item() + { + Position = ePosition.NONE; + ItemType = itemtype.Item; + // Spacer = false; + fullrect = Rectangle.Empty; + leftrect = Rectangle.Empty; + rightrect = Rectangle.Empty; + Enable_Direction = true; + Active = false; + Focus = false; + Target = false; + Direction = '0'; + // Hidden = false; + } + + public override string ToString() + { + if (this.ItemType == itemtype.Hidden) + return $"{Title}(숨김)"; + else if (this.ItemType == itemtype.Spacer) + return $"(SPACER)"; + else if (this.ItemType == itemtype.NLimit) + return $"N-LIMIT"; + else if (this.ItemType == itemtype.PLimit) + return $"P-LIMIT"; + else + return $"{Title}"; + } + + public void Draw(Graphics g, Font font, StringFormat sf) + { + Pen pen_border = null; + LinearGradientBrush br_back = null; + SolidBrush br_text = null; + + //배경색 + + //펜 + if (pen_border == null) pen_border = new Pen(this.BorderColor); + else pen_border.Color = this.BorderColor; + + //배경브러쉬 + if (br_back == null) br_back = new LinearGradientBrush(this.fullrect, this.BackColor1, this.BackColor2, LinearGradientMode.Vertical); + else + { + br_back.LinearColors[0] = this.BackColor1; + br_back.LinearColors[1] = this.BackColor2; + } + + //제목브러쉬 + if (br_text == null) br_text = new SolidBrush(this.ForeColor); + else br_text.Color = this.ForeColor; + + //배경표시 + g.FillRectangle(br_back, this.fullrect); + + //제목표시 + if (this.Title.isEmpty() == false && this.ItemType == itemtype.Item) + { + if (this.ShadowColor != Color.Transparent && this.ShadowColor != this.ForeColor) + { + using (var brShadow = new SolidBrush(this.ShadowColor)) + g.DrawString( + this.Title, + font, brShadow, + new Rectangle( + this.fullrect.Left + 1, + this.fullrect.Top + 1, + this.fullrect.Width, + this.fullrect.Height), + sf); + } + + g.DrawString(this.Title, font, br_text, this.fullrect, sf); + g.DrawString(this.Title, font, br_text, this.fullrect, sf); + } + + //테두리표시 + g.DrawRectangle(pen_border, this.fullrect); + + if (Enable_Direction) + { + + //좌측테두리 + if (this.leftrect.IsEmpty == false) + { + if (this.LeftColor != Color.Transparent) + { + using (SolidBrush sb = new SolidBrush(this.LeftColor)) + g.FillRectangle(sb, this.leftrect); + } + g.DrawRectangle(pen_border, this.leftrect); + } + //우측테두리 + if (this.rightrect.IsEmpty == false) + { + if (this.RightColor != Color.Transparent) + { + using (SolidBrush sb = new SolidBrush(this.RightColor)) + g.FillRectangle(sb, this.rightrect); + } + g.DrawRectangle(pen_border, this.rightrect); + } + + } + + if (pen_border != null) pen_border.Dispose(); + if (br_back != null) br_back.Dispose(); + if (br_text != null) br_text.Dispose(); + } + } + + public class ItemClickEventArgs : EventArgs + { + public item Item { get; set; } + public ItemClickEventArgs(item item) + { + this.Item = item; + } + } + + void arButton_MouseLeave(object sender, EventArgs e) + { + //isMouseOver = false; + this.Cursor = Cursors.Default; + Invalidate(); + } + + void arButton_MouseEnter(object sender, EventArgs e) + { + //isMouseOver = true; + this.Cursor = Cursors.Hand; + Invalidate(); + } + + void arButton_MouseUp(object sender, MouseEventArgs e) + { + if (!Enabled) + { + return; + } + //isMouseDown = false; + Invalidate(); + } + + + void arButton_MouseDown(object sender, MouseEventArgs e) + { + if (Enabled == false || Enabled == false) return; + // isMouseDown = true; + + //item fullrect 에서 클릭위치를 찾아야함 + if (Items != null && Items.Length > 0) + { + //마우스위치가 아이템에 포함되어있다면 + var focusItem = Items.Where(t => t.fullrect.Contains(e.Location)).FirstOrDefault(); + if (focusItem != null) + { + ItemClick?.Invoke(this, new ItemClickEventArgs(focusItem)); + } + } + Invalidate(); + } + + + + } +} diff --git a/Cs_HMI/Project/DataSet1.Designer.cs b/Cs_HMI/Project/DataSet1.Designer.cs new file mode 100644 index 0000000..2ea1bc8 --- /dev/null +++ b/Cs_HMI/Project/DataSet1.Designer.cs @@ -0,0 +1,1390 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +#pragma warning disable 1591 + +namespace Project { + + + /// + ///Represents a strongly typed in-memory cache of data. + /// + [global::System.Serializable()] + [global::System.ComponentModel.DesignerCategoryAttribute("code")] + [global::System.ComponentModel.ToolboxItem(true)] + [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")] + [global::System.Xml.Serialization.XmlRootAttribute("DataSet1")] + [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")] + public partial class DataSet1 : global::System.Data.DataSet { + + private ResultDataDataTable tableResultData; + + private languageDataTable tablelanguage; + + private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public DataSet1() { + this.BeginInit(); + this.InitClass(); + global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged); + base.Tables.CollectionChanged += schemaChangedHandler; + base.Relations.CollectionChanged += schemaChangedHandler; + this.EndInit(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected DataSet1(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : + base(info, context, false) { + if ((this.IsBinarySerialized(info, context) == true)) { + this.InitVars(false); + global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged); + this.Tables.CollectionChanged += schemaChangedHandler1; + this.Relations.CollectionChanged += schemaChangedHandler1; + return; + } + string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string)))); + if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) { + global::System.Data.DataSet ds = new global::System.Data.DataSet(); + ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema))); + if ((ds.Tables["ResultData"] != null)) { + base.Tables.Add(new ResultDataDataTable(ds.Tables["ResultData"])); + } + if ((ds.Tables["language"] != null)) { + base.Tables.Add(new languageDataTable(ds.Tables["language"])); + } + this.DataSetName = ds.DataSetName; + this.Prefix = ds.Prefix; + this.Namespace = ds.Namespace; + this.Locale = ds.Locale; + this.CaseSensitive = ds.CaseSensitive; + this.EnforceConstraints = ds.EnforceConstraints; + this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add); + this.InitVars(); + } + else { + this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema))); + } + this.GetSerializationData(info, context); + global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged); + base.Tables.CollectionChanged += schemaChangedHandler; + this.Relations.CollectionChanged += schemaChangedHandler; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + [global::System.ComponentModel.Browsable(false)] + [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] + public ResultDataDataTable ResultData { + get { + return this.tableResultData; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + [global::System.ComponentModel.Browsable(false)] + [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] + public languageDataTable language { + get { + return this.tablelanguage; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + [global::System.ComponentModel.BrowsableAttribute(true)] + [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)] + public override global::System.Data.SchemaSerializationMode SchemaSerializationMode { + get { + return this._schemaSerializationMode; + } + set { + this._schemaSerializationMode = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)] + public new global::System.Data.DataTableCollection Tables { + get { + return base.Tables; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)] + public new global::System.Data.DataRelationCollection Relations { + get { + return base.Relations; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void InitializeDerivedDataSet() { + this.BeginInit(); + this.InitClass(); + this.EndInit(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public override global::System.Data.DataSet Clone() { + DataSet1 cln = ((DataSet1)(base.Clone())); + cln.InitVars(); + cln.SchemaSerializationMode = this.SchemaSerializationMode; + return cln; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override bool ShouldSerializeTables() { + return false; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override bool ShouldSerializeRelations() { + return false; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) { + if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) { + this.Reset(); + global::System.Data.DataSet ds = new global::System.Data.DataSet(); + ds.ReadXml(reader); + if ((ds.Tables["ResultData"] != null)) { + base.Tables.Add(new ResultDataDataTable(ds.Tables["ResultData"])); + } + if ((ds.Tables["language"] != null)) { + base.Tables.Add(new languageDataTable(ds.Tables["language"])); + } + this.DataSetName = ds.DataSetName; + this.Prefix = ds.Prefix; + this.Namespace = ds.Namespace; + this.Locale = ds.Locale; + this.CaseSensitive = ds.CaseSensitive; + this.EnforceConstraints = ds.EnforceConstraints; + this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add); + this.InitVars(); + } + else { + this.ReadXml(reader); + this.InitVars(); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() { + global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream(); + this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null)); + stream.Position = 0; + return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal void InitVars() { + this.InitVars(true); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal void InitVars(bool initTable) { + this.tableResultData = ((ResultDataDataTable)(base.Tables["ResultData"])); + if ((initTable == true)) { + if ((this.tableResultData != null)) { + this.tableResultData.InitVars(); + } + } + this.tablelanguage = ((languageDataTable)(base.Tables["language"])); + if ((initTable == true)) { + if ((this.tablelanguage != null)) { + this.tablelanguage.InitVars(); + } + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + private void InitClass() { + this.DataSetName = "DataSet1"; + this.Prefix = ""; + this.Namespace = "http://tempuri.org/DataSet1.xsd"; + this.EnforceConstraints = true; + this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema; + this.tableResultData = new ResultDataDataTable(); + base.Tables.Add(this.tableResultData); + this.tablelanguage = new languageDataTable(); + base.Tables.Add(this.tablelanguage); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + private bool ShouldSerializeResultData() { + return false; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + private bool ShouldSerializelanguage() { + return false; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) { + if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) { + this.InitVars(); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) { + DataSet1 ds = new DataSet1(); + global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType(); + global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence(); + global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny(); + any.Namespace = ds.Namespace; + sequence.Items.Add(any); + type.Particle = sequence; + global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable(); + if (xs.Contains(dsSchema.TargetNamespace)) { + global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream(); + global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream(); + try { + global::System.Xml.Schema.XmlSchema schema = null; + dsSchema.Write(s1); + for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) { + schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current)); + s2.SetLength(0); + schema.Write(s2); + if ((s1.Length == s2.Length)) { + s1.Position = 0; + s2.Position = 0; + for (; ((s1.Position != s1.Length) + && (s1.ReadByte() == s2.ReadByte())); ) { + ; + } + if ((s1.Position == s1.Length)) { + return type; + } + } + } + } + finally { + if ((s1 != null)) { + s1.Close(); + } + if ((s2 != null)) { + s2.Close(); + } + } + } + xs.Add(dsSchema); + return type; + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public delegate void ResultDataRowChangeEventHandler(object sender, ResultDataRowChangeEvent e); + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public delegate void languageRowChangeEventHandler(object sender, languageRowChangeEvent e); + + /// + ///Represents the strongly named DataTable class. + /// + [global::System.Serializable()] + [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")] + public partial class ResultDataDataTable : global::System.Data.TypedTableBase { + + private global::System.Data.DataColumn columnidx; + + private global::System.Data.DataColumn columninfo_job; + + private global::System.Data.DataColumn columninfo_start; + + private global::System.Data.DataColumn columninfo_end; + + private global::System.Data.DataColumn columninfo_result; + + private global::System.Data.DataColumn columninfo_iserror; + + private global::System.Data.DataColumn columninfo_resultcode; + + private global::System.Data.DataColumn columninfo_filename; + + private global::System.Data.DataColumn columntime_start; + + private global::System.Data.DataColumn columntime_end; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public ResultDataDataTable() { + this.TableName = "ResultData"; + this.BeginInit(); + this.InitClass(); + this.EndInit(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal ResultDataDataTable(global::System.Data.DataTable table) { + this.TableName = table.TableName; + if ((table.CaseSensitive != table.DataSet.CaseSensitive)) { + this.CaseSensitive = table.CaseSensitive; + } + if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) { + this.Locale = table.Locale; + } + if ((table.Namespace != table.DataSet.Namespace)) { + this.Namespace = table.Namespace; + } + this.Prefix = table.Prefix; + this.MinimumCapacity = table.MinimumCapacity; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected ResultDataDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : + base(info, context) { + this.InitVars(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn idxColumn { + get { + return this.columnidx; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn info_jobColumn { + get { + return this.columninfo_job; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn info_startColumn { + get { + return this.columninfo_start; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn info_endColumn { + get { + return this.columninfo_end; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn info_resultColumn { + get { + return this.columninfo_result; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn info_iserrorColumn { + get { + return this.columninfo_iserror; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn info_resultcodeColumn { + get { + return this.columninfo_resultcode; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn info_filenameColumn { + get { + return this.columninfo_filename; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn time_startColumn { + get { + return this.columntime_start; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn time_endColumn { + get { + return this.columntime_end; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + [global::System.ComponentModel.Browsable(false)] + public int Count { + get { + return this.Rows.Count; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public ResultDataRow this[int index] { + get { + return ((ResultDataRow)(this.Rows[index])); + } + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event ResultDataRowChangeEventHandler ResultDataRowChanging; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event ResultDataRowChangeEventHandler ResultDataRowChanged; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event ResultDataRowChangeEventHandler ResultDataRowDeleting; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event ResultDataRowChangeEventHandler ResultDataRowDeleted; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void AddResultDataRow(ResultDataRow row) { + this.Rows.Add(row); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public ResultDataRow AddResultDataRow(string info_job, string info_start, string info_end, string info_result, string info_iserror, string info_resultcode, string info_filename, System.DateTime time_start, System.DateTime time_end) { + ResultDataRow rowResultDataRow = ((ResultDataRow)(this.NewRow())); + object[] columnValuesArray = new object[] { + null, + info_job, + info_start, + info_end, + info_result, + info_iserror, + info_resultcode, + info_filename, + time_start, + time_end}; + rowResultDataRow.ItemArray = columnValuesArray; + this.Rows.Add(rowResultDataRow); + return rowResultDataRow; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public override global::System.Data.DataTable Clone() { + ResultDataDataTable cln = ((ResultDataDataTable)(base.Clone())); + cln.InitVars(); + return cln; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override global::System.Data.DataTable CreateInstance() { + return new ResultDataDataTable(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal void InitVars() { + this.columnidx = base.Columns["idx"]; + this.columninfo_job = base.Columns["info_job"]; + this.columninfo_start = base.Columns["info_start"]; + this.columninfo_end = base.Columns["info_end"]; + this.columninfo_result = base.Columns["info_result"]; + this.columninfo_iserror = base.Columns["info_iserror"]; + this.columninfo_resultcode = base.Columns["info_resultcode"]; + this.columninfo_filename = base.Columns["info_filename"]; + this.columntime_start = base.Columns["time_start"]; + this.columntime_end = base.Columns["time_end"]; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + private void InitClass() { + this.columnidx = new global::System.Data.DataColumn("idx", typeof(int), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnidx); + this.columninfo_job = new global::System.Data.DataColumn("info_job", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columninfo_job); + this.columninfo_start = new global::System.Data.DataColumn("info_start", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columninfo_start); + this.columninfo_end = new global::System.Data.DataColumn("info_end", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columninfo_end); + this.columninfo_result = new global::System.Data.DataColumn("info_result", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columninfo_result); + this.columninfo_iserror = new global::System.Data.DataColumn("info_iserror", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columninfo_iserror); + this.columninfo_resultcode = new global::System.Data.DataColumn("info_resultcode", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columninfo_resultcode); + this.columninfo_filename = new global::System.Data.DataColumn("info_filename", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columninfo_filename); + this.columntime_start = new global::System.Data.DataColumn("time_start", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columntime_start); + this.columntime_end = new global::System.Data.DataColumn("time_end", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columntime_end); + this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint11", new global::System.Data.DataColumn[] { + this.columnidx}, false)); + this.columnidx.AutoIncrement = true; + this.columnidx.AutoIncrementSeed = 1; + this.columnidx.AllowDBNull = false; + this.columnidx.Unique = true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public ResultDataRow NewResultDataRow() { + return ((ResultDataRow)(this.NewRow())); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) { + return new ResultDataRow(builder); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override global::System.Type GetRowType() { + return typeof(ResultDataRow); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowChanged(e); + if ((this.ResultDataRowChanged != null)) { + this.ResultDataRowChanged(this, new ResultDataRowChangeEvent(((ResultDataRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowChanging(e); + if ((this.ResultDataRowChanging != null)) { + this.ResultDataRowChanging(this, new ResultDataRowChangeEvent(((ResultDataRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowDeleted(e); + if ((this.ResultDataRowDeleted != null)) { + this.ResultDataRowDeleted(this, new ResultDataRowChangeEvent(((ResultDataRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowDeleting(e); + if ((this.ResultDataRowDeleting != null)) { + this.ResultDataRowDeleting(this, new ResultDataRowChangeEvent(((ResultDataRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void RemoveResultDataRow(ResultDataRow row) { + this.Rows.Remove(row); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) { + global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType(); + global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence(); + DataSet1 ds = new DataSet1(); + global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny(); + any1.Namespace = "http://www.w3.org/2001/XMLSchema"; + any1.MinOccurs = new decimal(0); + any1.MaxOccurs = decimal.MaxValue; + any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax; + sequence.Items.Add(any1); + global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny(); + any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1"; + any2.MinOccurs = new decimal(1); + any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax; + sequence.Items.Add(any2); + global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute(); + attribute1.Name = "namespace"; + attribute1.FixedValue = ds.Namespace; + type.Attributes.Add(attribute1); + global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute(); + attribute2.Name = "tableTypeName"; + attribute2.FixedValue = "ResultDataDataTable"; + type.Attributes.Add(attribute2); + type.Particle = sequence; + global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable(); + if (xs.Contains(dsSchema.TargetNamespace)) { + global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream(); + global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream(); + try { + global::System.Xml.Schema.XmlSchema schema = null; + dsSchema.Write(s1); + for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) { + schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current)); + s2.SetLength(0); + schema.Write(s2); + if ((s1.Length == s2.Length)) { + s1.Position = 0; + s2.Position = 0; + for (; ((s1.Position != s1.Length) + && (s1.ReadByte() == s2.ReadByte())); ) { + ; + } + if ((s1.Position == s1.Length)) { + return type; + } + } + } + } + finally { + if ((s1 != null)) { + s1.Close(); + } + if ((s2 != null)) { + s2.Close(); + } + } + } + xs.Add(dsSchema); + return type; + } + } + + /// + ///Represents the strongly named DataTable class. + /// + [global::System.Serializable()] + [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")] + public partial class languageDataTable : global::System.Data.TypedTableBase { + + private global::System.Data.DataColumn columnSection; + + private global::System.Data.DataColumn columnKey; + + private global::System.Data.DataColumn columnValue; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public languageDataTable() { + this.TableName = "language"; + this.BeginInit(); + this.InitClass(); + this.EndInit(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal languageDataTable(global::System.Data.DataTable table) { + this.TableName = table.TableName; + if ((table.CaseSensitive != table.DataSet.CaseSensitive)) { + this.CaseSensitive = table.CaseSensitive; + } + if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) { + this.Locale = table.Locale; + } + if ((table.Namespace != table.DataSet.Namespace)) { + this.Namespace = table.Namespace; + } + this.Prefix = table.Prefix; + this.MinimumCapacity = table.MinimumCapacity; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected languageDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : + base(info, context) { + this.InitVars(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn SectionColumn { + get { + return this.columnSection; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn KeyColumn { + get { + return this.columnKey; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataColumn ValueColumn { + get { + return this.columnValue; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + [global::System.ComponentModel.Browsable(false)] + public int Count { + get { + return this.Rows.Count; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public languageRow this[int index] { + get { + return ((languageRow)(this.Rows[index])); + } + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event languageRowChangeEventHandler languageRowChanging; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event languageRowChangeEventHandler languageRowChanged; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event languageRowChangeEventHandler languageRowDeleting; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public event languageRowChangeEventHandler languageRowDeleted; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void AddlanguageRow(languageRow row) { + this.Rows.Add(row); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public languageRow AddlanguageRow(string Section, string Key, string Value) { + languageRow rowlanguageRow = ((languageRow)(this.NewRow())); + object[] columnValuesArray = new object[] { + Section, + Key, + Value}; + rowlanguageRow.ItemArray = columnValuesArray; + this.Rows.Add(rowlanguageRow); + return rowlanguageRow; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public languageRow FindByKeySection(string Key, string Section) { + return ((languageRow)(this.Rows.Find(new object[] { + Key, + Section}))); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public override global::System.Data.DataTable Clone() { + languageDataTable cln = ((languageDataTable)(base.Clone())); + cln.InitVars(); + return cln; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override global::System.Data.DataTable CreateInstance() { + return new languageDataTable(); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal void InitVars() { + this.columnSection = base.Columns["Section"]; + this.columnKey = base.Columns["Key"]; + this.columnValue = base.Columns["Value"]; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + private void InitClass() { + this.columnSection = new global::System.Data.DataColumn("Section", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnSection); + this.columnKey = new global::System.Data.DataColumn("Key", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnKey); + this.columnValue = new global::System.Data.DataColumn("Value", typeof(string), null, global::System.Data.MappingType.Element); + base.Columns.Add(this.columnValue); + this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] { + this.columnKey, + this.columnSection}, true)); + this.columnSection.AllowDBNull = false; + this.columnKey.AllowDBNull = false; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public languageRow NewlanguageRow() { + return ((languageRow)(this.NewRow())); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) { + return new languageRow(builder); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override global::System.Type GetRowType() { + return typeof(languageRow); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowChanged(e); + if ((this.languageRowChanged != null)) { + this.languageRowChanged(this, new languageRowChangeEvent(((languageRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowChanging(e); + if ((this.languageRowChanging != null)) { + this.languageRowChanging(this, new languageRowChangeEvent(((languageRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowDeleted(e); + if ((this.languageRowDeleted != null)) { + this.languageRowDeleted(this, new languageRowChangeEvent(((languageRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) { + base.OnRowDeleting(e); + if ((this.languageRowDeleting != null)) { + this.languageRowDeleting(this, new languageRowChangeEvent(((languageRow)(e.Row)), e.Action)); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void RemovelanguageRow(languageRow row) { + this.Rows.Remove(row); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) { + global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType(); + global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence(); + DataSet1 ds = new DataSet1(); + global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny(); + any1.Namespace = "http://www.w3.org/2001/XMLSchema"; + any1.MinOccurs = new decimal(0); + any1.MaxOccurs = decimal.MaxValue; + any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax; + sequence.Items.Add(any1); + global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny(); + any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1"; + any2.MinOccurs = new decimal(1); + any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax; + sequence.Items.Add(any2); + global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute(); + attribute1.Name = "namespace"; + attribute1.FixedValue = ds.Namespace; + type.Attributes.Add(attribute1); + global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute(); + attribute2.Name = "tableTypeName"; + attribute2.FixedValue = "languageDataTable"; + type.Attributes.Add(attribute2); + type.Particle = sequence; + global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable(); + if (xs.Contains(dsSchema.TargetNamespace)) { + global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream(); + global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream(); + try { + global::System.Xml.Schema.XmlSchema schema = null; + dsSchema.Write(s1); + for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) { + schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current)); + s2.SetLength(0); + schema.Write(s2); + if ((s1.Length == s2.Length)) { + s1.Position = 0; + s2.Position = 0; + for (; ((s1.Position != s1.Length) + && (s1.ReadByte() == s2.ReadByte())); ) { + ; + } + if ((s1.Position == s1.Length)) { + return type; + } + } + } + } + finally { + if ((s1 != null)) { + s1.Close(); + } + if ((s2 != null)) { + s2.Close(); + } + } + } + xs.Add(dsSchema); + return type; + } + } + + /// + ///Represents strongly named DataRow class. + /// + public partial class ResultDataRow : global::System.Data.DataRow { + + private ResultDataDataTable tableResultData; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal ResultDataRow(global::System.Data.DataRowBuilder rb) : + base(rb) { + this.tableResultData = ((ResultDataDataTable)(this.Table)); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public int idx { + get { + return ((int)(this[this.tableResultData.idxColumn])); + } + set { + this[this.tableResultData.idxColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string info_job { + get { + if (this.Isinfo_jobNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tableResultData.info_jobColumn])); + } + } + set { + this[this.tableResultData.info_jobColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string info_start { + get { + if (this.Isinfo_startNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tableResultData.info_startColumn])); + } + } + set { + this[this.tableResultData.info_startColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string info_end { + get { + if (this.Isinfo_endNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tableResultData.info_endColumn])); + } + } + set { + this[this.tableResultData.info_endColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string info_result { + get { + if (this.Isinfo_resultNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tableResultData.info_resultColumn])); + } + } + set { + this[this.tableResultData.info_resultColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string info_iserror { + get { + if (this.Isinfo_iserrorNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tableResultData.info_iserrorColumn])); + } + } + set { + this[this.tableResultData.info_iserrorColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string info_resultcode { + get { + if (this.Isinfo_resultcodeNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tableResultData.info_resultcodeColumn])); + } + } + set { + this[this.tableResultData.info_resultcodeColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string info_filename { + get { + if (this.Isinfo_filenameNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tableResultData.info_filenameColumn])); + } + } + set { + this[this.tableResultData.info_filenameColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public System.DateTime time_start { + get { + try { + return ((global::System.DateTime)(this[this.tableResultData.time_startColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("\'ResultData\' 테이블의 \'time_start\' 열의 값이 DBNull입니다.", e); + } + } + set { + this[this.tableResultData.time_startColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public System.DateTime time_end { + get { + try { + return ((global::System.DateTime)(this[this.tableResultData.time_endColumn])); + } + catch (global::System.InvalidCastException e) { + throw new global::System.Data.StrongTypingException("\'ResultData\' 테이블의 \'time_end\' 열의 값이 DBNull입니다.", e); + } + } + set { + this[this.tableResultData.time_endColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Isinfo_jobNull() { + return this.IsNull(this.tableResultData.info_jobColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Setinfo_jobNull() { + this[this.tableResultData.info_jobColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Isinfo_startNull() { + return this.IsNull(this.tableResultData.info_startColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Setinfo_startNull() { + this[this.tableResultData.info_startColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Isinfo_endNull() { + return this.IsNull(this.tableResultData.info_endColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Setinfo_endNull() { + this[this.tableResultData.info_endColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Isinfo_resultNull() { + return this.IsNull(this.tableResultData.info_resultColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Setinfo_resultNull() { + this[this.tableResultData.info_resultColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Isinfo_iserrorNull() { + return this.IsNull(this.tableResultData.info_iserrorColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Setinfo_iserrorNull() { + this[this.tableResultData.info_iserrorColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Isinfo_resultcodeNull() { + return this.IsNull(this.tableResultData.info_resultcodeColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Setinfo_resultcodeNull() { + this[this.tableResultData.info_resultcodeColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Isinfo_filenameNull() { + return this.IsNull(this.tableResultData.info_filenameColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Setinfo_filenameNull() { + this[this.tableResultData.info_filenameColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Istime_startNull() { + return this.IsNull(this.tableResultData.time_startColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Settime_startNull() { + this[this.tableResultData.time_startColumn] = global::System.Convert.DBNull; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool Istime_endNull() { + return this.IsNull(this.tableResultData.time_endColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void Settime_endNull() { + this[this.tableResultData.time_endColumn] = global::System.Convert.DBNull; + } + } + + /// + ///Represents strongly named DataRow class. + /// + public partial class languageRow : global::System.Data.DataRow { + + private languageDataTable tablelanguage; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + internal languageRow(global::System.Data.DataRowBuilder rb) : + base(rb) { + this.tablelanguage = ((languageDataTable)(this.Table)); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string Section { + get { + return ((string)(this[this.tablelanguage.SectionColumn])); + } + set { + this[this.tablelanguage.SectionColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string Key { + get { + return ((string)(this[this.tablelanguage.KeyColumn])); + } + set { + this[this.tablelanguage.KeyColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public string Value { + get { + if (this.IsValueNull()) { + return string.Empty; + } + else { + return ((string)(this[this.tablelanguage.ValueColumn])); + } + } + set { + this[this.tablelanguage.ValueColumn] = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public bool IsValueNull() { + return this.IsNull(this.tablelanguage.ValueColumn); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public void SetValueNull() { + this[this.tablelanguage.ValueColumn] = global::System.Convert.DBNull; + } + } + + /// + ///Row event argument class + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public class ResultDataRowChangeEvent : global::System.EventArgs { + + private ResultDataRow eventRow; + + private global::System.Data.DataRowAction eventAction; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public ResultDataRowChangeEvent(ResultDataRow row, global::System.Data.DataRowAction action) { + this.eventRow = row; + this.eventAction = action; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public ResultDataRow Row { + get { + return this.eventRow; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataRowAction Action { + get { + return this.eventAction; + } + } + } + + /// + ///Row event argument class + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public class languageRowChangeEvent : global::System.EventArgs { + + private languageRow eventRow; + + private global::System.Data.DataRowAction eventAction; + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public languageRowChangeEvent(languageRow row, global::System.Data.DataRowAction action) { + this.eventRow = row; + this.eventAction = action; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public languageRow Row { + get { + return this.eventRow; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "17.0.0.0")] + public global::System.Data.DataRowAction Action { + get { + return this.eventAction; + } + } + } + } +} + +#pragma warning restore 1591 \ No newline at end of file diff --git a/Cs_HMI/Project/DataSet1.cs b/Cs_HMI/Project/DataSet1.cs new file mode 100644 index 0000000..bdc2b60 --- /dev/null +++ b/Cs_HMI/Project/DataSet1.cs @@ -0,0 +1,11 @@ +namespace Project +{ + + + public partial class DataSet1 + { + partial class ModelDataTable + { + } + } +} diff --git a/Cs_HMI/Project/DataSet1.xsc b/Cs_HMI/Project/DataSet1.xsc new file mode 100644 index 0000000..551fc56 --- /dev/null +++ b/Cs_HMI/Project/DataSet1.xsc @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/Cs_HMI/Project/DataSet1.xsd b/Cs_HMI/Project/DataSet1.xsd new file mode 100644 index 0000000..f91e15f --- /dev/null +++ b/Cs_HMI/Project/DataSet1.xsd @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Cs_HMI/Project/DataSet1.xss b/Cs_HMI/Project/DataSet1.xss new file mode 100644 index 0000000..1827237 --- /dev/null +++ b/Cs_HMI/Project/DataSet1.xss @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/Cs_HMI/Project/Device/CFlag.cs b/Cs_HMI/Project/Device/CFlag.cs new file mode 100644 index 0000000..e9236c8 --- /dev/null +++ b/Cs_HMI/Project/Device/CFlag.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project.Device +{ + public class CFlag : COMM.Flag + { + public CFlag() : base(64) + { + + } + public bool get(EFlag flag) + { + return Get((int)flag); + } + public void set(EFlag flag, bool value) + { + var idx = (int)flag; + Set(idx, value); + } + public void Toggle(EFlag flag) + { + int idx = (int)flag; + var curValue = Get(idx); + Set(idx, !curValue); + } + + public void Toggle(int idx) + { + var curValue = Get(idx); + Set(idx, !curValue); + } + + } +} diff --git a/Cs_HMI/Project/Device/Socket.cs b/Cs_HMI/Project/Device/Socket.cs new file mode 100644 index 0000000..abd5d04 --- /dev/null +++ b/Cs_HMI/Project/Device/Socket.cs @@ -0,0 +1,427 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project.Device +{ + public class Socket + { + public enum eType + { + REQUEST, + REPLY, + } + public enum eSType + { + STATUS, + GEN, + SPL + } + + public struct Message + { + public Boolean isError; + public string ErrorMessage; + public string Asset; + public eType Type; + public eSType SType; + public string Body; + public string timeStamp; + } + + private Winsock_Orcas.Winsock wsListen; + private Winsock_Orcas.Winsock wsData; + private char sepMsg = (char)0x07; + private char sepBody = (char)0x09; + + public int ListenPort { get; set; } + public string errorMessage { get; set; } + public event EventHandler RecvMessage; + public event EventHandler SendMessage; + public event EventHandler GetMessage; + + private void RaiseMessage(string msg, Boolean isErr = false) + { + if (GetMessage != null) GetMessage(this, new MesasgeEventArgs(msg, isErr)); + } + private void RaiseSendMessage(Message msg, string raw) + { + if (SendMessage != null) + { + try + { + SendMessage(this, new SocketMessageEventArgs(msg, raw)); + } + catch (Exception ex) + { + this.errorMessage = ex.Message; + } + } + } + private void RaiseRecvMessage(Message msg, string raw) + { + if (RecvMessage != null) + { + try + { + RecvMessage(this, new SocketMessageEventArgs(msg, raw)); + } + catch (Exception ex) + { + this.errorMessage = ex.Message; + } + } + } + public Socket() + { + wsListen = new Winsock_Orcas.Winsock(); + wsData = new Winsock_Orcas.Winsock(); + wsListen.LegacySupport = true; + wsData.LegacySupport = true; + wsData.Connected += wsData_Connected; + wsData.Disconnected += wsData_Disconnected; + wsData.DataArrival += wsData_DataArrival; + wsData.ErrorReceived += wsData_ErrorReceived; + wsListen.ConnectionRequest += wsListen_ConnectionRequest; + wsListen.ErrorReceived += wsListen_ErrorReceived; + } + + void wsListen_ErrorReceived(object sender, Winsock_Orcas.WinsockErrorReceivedEventArgs e) + { + RaiseMessage("LTERR:" + e.Details, true); + } + + void wsData_ErrorReceived(object sender, Winsock_Orcas.WinsockErrorReceivedEventArgs e) + { + RaiseMessage("RXERR:"+e.Details, true); + } + + void wsData_Disconnected(object sender, EventArgs e) + { + RaiseMessage("Disconnected"); + } + + void wsData_Connected(object sender, Winsock_Orcas.WinsockConnectedEventArgs e) + { + RaiseMessage("Conncted"); + } + + void wsListen_ConnectionRequest(object sender, Winsock_Orcas.WinsockConnectionRequestEventArgs e) + { + if (wsData.State != Winsock_Orcas.WinsockStates.Closed) + { + wsData.Close(); + System.Threading.Thread.Sleep(500); + } + RaiseMessage("Connection Request " + e.ClientIP); + try + { + wsData.Accept(e.Client); + }catch (Exception ex) + { + RaiseMessage("Connection Request\n"+ex.Message, true); + } + + + } + + ~Socket() + { + if (wsData != null) + { + wsData.DataArrival -= wsData_DataArrival; + wsData.Connected += wsData_Connected; + wsData.Disconnected += wsData_Disconnected; + } + if (wsListen != null) + { + wsListen.ConnectionRequest += wsListen_ConnectionRequest; + } + + + + if (wsListen != null && wsListen.State != Winsock_Orcas.WinsockStates.Closed) + wsListen.Close(); + if (wsData != null && wsData.State != Winsock_Orcas.WinsockStates.Closed) + wsData.Close(); + wsData.Dispose(); + wsListen.Dispose(); + } + + public Boolean Listen(int port) + { + try + { + ListenPort = port; + wsListen.Listen(this.ListenPort); + this.errorMessage = string.Empty; + return true; + } + catch (Exception ex) + { + this.errorMessage = ex.Message; + return false; + } + } + public Boolean isListen + { + get + { + return wsListen.State == Winsock_Orcas.WinsockStates.Listening; + } + } + public Boolean isConn + { + get + { + return wsData.State == Winsock_Orcas.WinsockStates.Connected; + } + } + + public Message LastSendMessage = new Message(); + private Message makeMessage(string Asset, eType type, eSType subtype, string body) + { + Message retval = new Message(); + retval.Asset = Asset; + retval.Type = type; + retval.SType = subtype; + retval.Body = body; + retval.isError = true; + retval.ErrorMessage = string.Empty; + retval.timeStamp = DateTime.Now.ToString("yyyyMMddHHmmss"); + return retval; + } + + /// + /// Body문자열을 구분자를 기준으로 한 배열로 반환 함 + /// + /// + /// + public string[] getBodyArray(string bodyMessage) + { + return bodyMessage.Split(sepBody); + } + + /// + /// 패킷의 내용을 메세지로 분리한다. + /// + /// + /// + private Message ParseMessage(string PacketMessage) + { + Message retval = new Message(); + retval.isError = false; + retval.ErrorMessage = string.Empty; + + var buffer = PacketMessage.Split(sepMsg); + if (buffer.Length != 5) + { + retval.isError = true; + retval.ErrorMessage = "Packet Size Error : Expect 5 Array"; + return retval; + } + else + { + retval.Asset = buffer[0]; + if (!getType(buffer[1], out retval.Type)) + { + retval.isError = true; + retval.ErrorMessage = "지정된 Type 이 아닙니다(" + buffer[1] + ")"; + return retval; + } + if (!getSType(buffer[2], out retval.SType)) + { + retval.isError = true; + retval.ErrorMessage = "지정된 SubType 이 아닙니다(" + buffer[2] + ")"; + return retval; + } + retval.timeStamp = buffer[3]; + //DateTime timeStamp; + //if (!DateTime.TryParse(retval.timeStamp, out timeStamp)) + //{ + // retval.isError = true; + // retval.ErrorMessage = "timeStamp 해석 오류(" + retval.timeStamp + ")"; + // return retval; + //} + retval.Body = buffer[4]; + } + return retval; + } + + private Boolean getType(string strType, out eType type) + { + type = eType.REPLY; + var list = Enum.GetNames(typeof(eType)); + int value = -1; + for (int i = 0; i < list.Length; i++) + { + if (list[i].ToUpper() == strType.ToUpper()) + { + value = i; + break; + } + } + if (value == -1) return false; + type = (eType)value; + return true; + } + private Boolean getSType(string strSType, out eSType stype) + { + stype = eSType.GEN; + var list = Enum.GetNames(typeof(eSType)); + int value = -1; + for (int i = 0; i < list.Length; i++) + { + if (list[i].ToUpper() == strSType.ToUpper()) + { + value = i; + break; + } + } + if (value == -1) return false; + stype = (eSType)value; + return true; + } + + public string makePacket(Message msg) + { + //프레임구조 asset chr(7) + type + chr(7) + stype + char(7) + timeStamp + char(7) + body" + //timestamp = yyyymmddhhmmss + //sepChar = (char)0x07; + + System.Text.StringBuilder buffer = new StringBuilder(); + buffer.Append(msg.Asset); + buffer.Append(sepMsg); + buffer.Append(msg.Type.ToString()); + buffer.Append(sepMsg); + buffer.Append(msg.SType.ToString()); + buffer.Append(sepMsg); + buffer.Append(msg.timeStamp); + buffer.Append(sepMsg); + buffer.Append(msg.Body); + return buffer.ToString(); + } + + public string makeLotSplitPacket( string fcst, string tcst, string slot, string wafer) + { + System.Text.StringBuilder buffer = new StringBuilder(); + buffer.Append(fcst); + buffer.Append(sepBody); + buffer.Append(tcst); + buffer.Append(sepBody); + buffer.Append(slot); + buffer.Append(sepBody); + buffer.Append(wafer); + return buffer.ToString(); + } + public string makeLotGenPacket(string Lot, string cst, string slot, string wafer) + { + System.Text.StringBuilder buffer = new StringBuilder(); + buffer.Append(Lot); + buffer.Append(sepBody); + buffer.Append(cst); + buffer.Append(sepBody); + buffer.Append(slot); + buffer.Append(sepBody); + buffer.Append(wafer); + return buffer.ToString(); + } + public enum eStatus + { + RUN =0, + IDLE , + ALARM, + } + public string makeReplyStatus(eStatus Status) + { + System.Text.StringBuilder buffer = new StringBuilder(); + buffer.Append(((int)Status).ToString()); + return buffer.ToString(); + } + public Boolean Send(string Asset, eType type, eSType subtype, string body) + { + var msg = makeMessage(Asset, type, subtype, body); + var isStatus = subtype == eSType.STATUS; + return Send(msg, isStatus); + } + + public Boolean isReplyRecv = false; + public Boolean Send(Message msg,Boolean isStatus) + { + + var packet = makePacket(msg); + if (wsData.State != Winsock_Orcas.WinsockStates.Connected) + { + errorMessage = "Not Connected"; + return false; + } + try + { + if(isStatus==false) isReplyRecv = false; //190129 + wsData.Send(packet + "\r\n"); + errorMessage = string.Empty; + LastSendMessage = msg; + RaiseSendMessage(msg, packet); + return true; + } + catch (Exception ex) + { + errorMessage = ex.Message; + return false; + } + } + + public Message LastReplyMessage = new Message(); + public Message LastRecvMessage = new Message(); + void wsData_DataArrival(object sender, Winsock_Orcas.WinsockDataArrivalEventArgs e) + { + var sock = sender as Winsock_Orcas.Winsock; + var data = sock.Get(); + if(PUB.setting.LOg_SocketRecv) + { + if (data.IndexOf("REQUEST") != -1 && data.IndexOf("STATUS") != -1) + { + //핑 명령 + } + else PUB.log.AddE("Socket Recv : " + data); //190129 + } + + LastRecvMessage = ParseMessage(data); + if (LastRecvMessage.isError) PUB.log.AddE("Socket Message error" + LastRecvMessage.ErrorMessage); + else + { + //190129 - reply만 별도 처리함 + if (LastRecvMessage.Type == eType.REPLY) + { + LastReplyMessage = ParseMessage(data); + isReplyRecv = true; + } + } + RaiseRecvMessage(LastRecvMessage, data); + } + + + public class SocketMessageEventArgs : EventArgs + { + public string rawData { get; set; } + public Device.Socket.Message Message { get; set; } + public SocketMessageEventArgs(Device.Socket.Message msg, string raw) + { + this.Message = msg; + this.rawData = raw; + } + } + public class MesasgeEventArgs : EventArgs + { + public string Message { get; set; } + public Boolean isError { get; set; } + public MesasgeEventArgs(string msg, Boolean iserr) + { + this.Message = msg; + this.isError = iserr; + } + } + } + +} diff --git a/Cs_HMI/Project/Device/Xbee.cs b/Cs_HMI/Project/Device/Xbee.cs new file mode 100644 index 0000000..eaab4c6 --- /dev/null +++ b/Cs_HMI/Project/Device/Xbee.cs @@ -0,0 +1,400 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel; +using System.Threading; +using COMM; +using System.Runtime.Remoting.Messaging; + +namespace Project.Device +{ + public class Xbee : arDev.arRS232 + { + public Xbee() + { + + } + + public string buffer = string.Empty; + public System.Text.StringBuilder newbuffer = new StringBuilder(); + protected override bool CustomParser(byte[] buf, out byte[] remainBuffer) + { + //일반 kit 명령은 0x02 kit번호, kit값 0x03 + //상태 명령은 0x04 메세지데이터 0x05 + + Console.WriteLine("custom parse len=" + buf.Length.ToString()); + + List sparebuffer = new List(); + Boolean bComplete = false; + for (int i = 0; i < buf.Length; i++) + { + var incomByte = buf[i]; + if (bComplete == true) sparebuffer.Add(incomByte); + else + { + if (findSTX == false) + { + if (incomByte != 0x02) + { + //버리는데이터 + } + else + { + findSTX = true; + tempBuffer.Clear(); + tempBuffer.Add(incomByte); + } + } + else + { + tempBuffer.Add(incomByte); + + if (incomByte == 0x03) + { + //데이터가 맞게 수신됨 + LastReceiveBuffer = tempBuffer.ToArray(); + bComplete = true; + findSTX = false; + } + else if (tempBuffer.Count > 30) + { + tempBuffer.Clear(); + findSTX = false; + } + } + } + } + remainBuffer = sparebuffer.ToArray(); + return bComplete; + } + + + public override bool ProcessRecvData(byte[] data) + { + var kitno = (char)(data[1]); + var kitval = (char)(data[2]); + NewMsgEvent(kitno, kitval); + return true; + } + + public void NewMsgEvent(char kitNo, char kitVal) + { + //대상위치 확인 + ePosition kitPos = ePosition.NONE; + if (kitNo == '9') kitPos = ePosition.QC; + else if (kitNo == '1') kitPos = ePosition.F1; + else if (kitNo == '2') kitPos = ePosition.F2; + else if (kitNo == '3') kitPos = ePosition.F3; + else if (kitNo == '4') kitPos = ePosition.F4; + else + { + if (kitNo == '0') return; + PUB.log.Add($"비허가 키트번호 무시 번호={kitNo},값={kitVal}"); + return; + } + + //if (kitNo= 'F') + //{ + // PUB.Speak("알 수 없는 키트번호 입니다"); + // PUB.logsys.Add($"키트번호별위치확인실패 값={kitNo}"); + // return; + //} + + //(ePosition)int.Parse(kitNo.ToString()); + PUB.logcal.Add(string.Format("Xbee:newMsgEvent:{0},{1}=>{2}", kitNo, kitVal, kitPos)); + if (PUB.CheckManualChargeMode() == false) + { + PUB.log.Add($"수동 충전 중이라 콜 기능을 취소 합니다"); + return; + } + + bool FixButton = kitPos == ePosition.NONE; + if (kitPos == ePosition.NONE) + { + if (kitVal == '1') kitPos = ePosition.QC; + else if (kitVal == '2') kitPos = ePosition.CHARGE; + else if (kitVal == '4') kitPos = ePosition.QC; + //else if (kitVal == '3') kitPos = ePosition.QA; + else + { + PUB.log.Add($"AGV버튼 이벤트 실행 값:{kitVal} 취소"); + return; + } + kitVal = '1'; //버튼은 무조건 ON상태로 한다 + } + + //자동상태가 아니라면 오류처리 + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false || PUB.sm.Step != StateMachine.eSMStep.RUN) + { + PUB.log.AddE("'자동실행' 상태가 아니므로 콜/취소 작업을 할 수 없습니다 콜:" + kitPos.ToString() + ",값=" + kitVal.ToString()); + PUB.Speak(Lang.자동운전상태가아닙니다); + return; + } + + //충전기를 제외하고 '1'의 값은 호출을 원하는값이다.('0'=취소) + if (kitVal == '1') + { + //qA혹은 Pack 에서 해당 버튼을 눌렀을때의 처리방법 + //if (PUB.Result.CurrentPos == ePosition.QA && kitPos == ePosition.QA) + //{ + // PUB.logsys.AddE("QA위치에서 QA버튼을 눌렀음 명령 취소함"); + // PUB.Speak("현재 위치는 QA 입니다."); + // return; + //} + + //상/하차 작업중이 아니라면 콜을 받는다 + if (PUB.sm.RunStep != StateMachine.ERunStep.GOUP && PUB.sm.RunStep != StateMachine.ERunStep.GODOWN) + { + //call을 받으려면 대상위 (2=QC,3,4,5,6,7) + //콜을 요청하는 곳 (2=QC,3=FVI-1,4,5,6,7==FVI-5) + //1번은 충전기 + + //콜버튼으로 대상위치를 다시 결정한다. + //대상번호는 콜번호에서 +2을 하면 된다. + //대상번호 PK=1,QA2=2,QA1=3,QC=4 + //QC의경우 콜Kit번호는 2이므로, 이동대상은 +2인 4가 되어야 함 + //콜번호와 RFID대상번호는 2의 오차가 발생함, 현재 설치된 RFID를 모두 변경할 수 없어서 이렇게 운용함 + + + RaiseMessage(MessageType.Normal, string.Format("CALL확정 Kit={0},대상위치={1}", kitNo, kitPos)); + + PUB.AGV.data.CallNo = int.Parse(kitNo.ToString()); + PUB.AGV.data.CallString = kitNo.ToString(); + + PUB.Result.CommandKit = kitNo; + PUB.Result.TargetPos = kitPos; + SendToKit(kitNo, '1', (PUB.IsCanCALL() ? '1' : '0')); //콜확정을 클라이언트에 알림 + + PUB.Speak(kitPos.ToString() + Lang.위치로이동합니다); + + //상태머신을 변경한다 (충전 OFF상태로 간다, 충전상태가 아니면 바로 이동하게됨) + //Pub.sm.ResetRunStep(); + //Pub.sm.setNewStep(StateMachine.eSMStep.RUN); + + //qa, pack 은 하차 전용이다 + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(StateMachine.ERunStep.GOUP); + PUB.sm.SetNewStep(StateMachine.eSMStep.RUN); + } + else if (PUB.sm.RunStep == StateMachine.ERunStep.GODOWN && VAR.BOOL[eVarBool.WAIT_COVER_DOWN] == false && VAR.BOOL[eVarBool.WAIT_COVER_UP] == false) + { + //하차중에 받을 수 있게하자 (단 FVi1 이하일때에는 무시하자) 230710 - 김수곤 + if (PUB.Result.TargetPos == ePosition.QC && PUB.Result.CurrentPos < ePosition.F1) + { + PUB.log.Add($"하차중이지만 FVI #1 아래에 있으니 콜을 취소 합니다"); + SendToKit(kitNo, '0', '0'); + RaiseMessage(MessageType.Normal, $"QC 추가 콜이지만 위치가 #1번 이하이므로 취소 됩니다. Kit={kitNo},현재={PUB.Result.CurrentPos},대상={PUB.Result.TargetPos}"); + } + else + { + RaiseMessage(MessageType.Normal, string.Format("CALL확정(추가) Kit={0},대상위치={1}", kitNo, kitPos)); + + PUB.AGV.data.CallNo = int.Parse(kitNo.ToString()); + PUB.AGV.data.CallString = kitNo.ToString(); + + PUB.Result.CommandKit = kitNo; + PUB.Result.TargetPos = kitPos; + + SendToKit(kitNo, '1', (PUB.IsCanCALL() ? '1' : '0')); //콜확정을 클라이언트에 알림 + + PUB.Speak(kitPos.ToString() + Lang.위치로이동합니다); + + //상태머신을 변경한다 (충전 OFF상태로 간다, 충전상태가 아니면 바로 이동하게됨) + //Pub.sm.ResetRunStep(); + //Pub.sm.setNewStep(StateMachine.eSMStep.RUN); + + //qa, pack 은 하차 전용이다 + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(StateMachine.ERunStep.GOUP); + PUB.sm.SetNewStep(StateMachine.eSMStep.RUN); + } + + } + //else if (PUB.sm.RunStep == StateMachine.ERunStep.GODOWN && PUB.Result.CurrentPos == ePosition.QA) + //{ + // RaiseMessage(MessageType.Normal, string.Format("CALL확정 Kit={0},대상위치={1}", kitNo, kitPos)); + + // PUB.Result.CommandKit = kitNo; + // PUB.Result.TargetPos = kitPos; + // SendToKit(kitNo, '1'); //콜확정을 클라이언트에 알림 + + // PUB.Speak(kitPos.ToString() + "위치로 이동 합니다"); + + // //상태머신을 변경한다 (충전 OFF상태로 간다, 충전상태가 아니면 바로 이동하게됨) + // // Pub.sm.ResetRunStep(); + // // Pub.sm.setNewStep(StateMachine.eSMStep.RUN); + + // //qa => pack 은 하차 전용이다 + // //QA에서 PACK이동시에는 바로 N극 멈춤 기능을 사용해도도된다.(자재가 있으며, 커버가 내려가 있으므로 느리게 동작해야함) + // PUB.sm.ClearRunStep(); + // PUB.sm.SetNewRunStep(StateMachine.ERunStep.GODOWN); + // PUB.sm.SetNewStep(StateMachine.ESMStep.RUN); + + // PUB.AGV.AGVMoveStop("xbee_newmsgevent", arDev.Narumi.eStopOpt.MarkStop);// (arDev.Narumi.eAgvCmd.MoveStop,.SetNextStop_Mark(true, "xbee godn,qa,pack"); + // PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Up); + //} + else if (PUB.Result.TargetPos == kitPos) ////현재 지정된 클라이언트가 또 눌렀다 + { + PUB.Result.TargetPos = kitPos; + PUB.AGV.data.CallNo = int.Parse(kitNo.ToString()); + PUB.AGV.data.CallString = kitNo.ToString(); + + //상차 대기 중이라면 커버를 자동 올려준다 + //이것은 QC만 가능하다 + //QC가 QA혹은 PACK으로 보낼때 사용함 + if (kitPos == ePosition.QC && + VAR.BOOL[eVarBool.FLAG_LIMITLOW] == true) + { + RaiseMessage(MessageType.Normal, "QC위치에서 자동으로 커버를 올립니다"); + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Up); + } + else + { + //커버대기상태라면 커버를 자동으로 처리해준다. + if (PUB.sm.Step == StateMachine.eSMStep.RUN && (PUB.sm.RunStep == StateMachine.ERunStep.GOUP || PUB.sm.RunStep == StateMachine.ERunStep.GODOWN)) + { + + if (VAR.BOOL[eVarBool.WAIT_COVER_DOWN] == true) + { + var ld = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LD); + var rd = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RD); + if (ld == false || rd == false) + { + PUB.log.Add("사용자 콜버튼 추가 동작 - Z내림"); + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down); + PUB.Speak(Lang.커버를내립니다); + } + } + else if (VAR.BOOL[eVarBool.WAIT_COVER_UP] == true) + { + var lu = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU); + var ru = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU); + + if (lu == false || ru == false) + { + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Up); + PUB.log.Add("사용자 콜버튼 추가 동작 - Z올림"); + PUB.Speak(Lang.커버를올립니다); + } + } + else RaiseMessage(MessageType.Normal, string.Format("이미 CALL이 확정되었습니다 No={0},Pos={1}", kitNo, kitPos)); + } + else RaiseMessage(MessageType.Normal, string.Format("이미 CALL이 확정되었습니다 No={0},Pos={1}", kitNo, kitPos)); + } + SendToKit(kitNo, '1', (PUB.IsCanCALL() ? '1' : '0')); //콜확정을 클라이언트에 알림 + } + else + { + //다른대상이 이미 선택된 상태이므로 CANCEL 한다. + SendToKit(kitNo, '0', (PUB.IsCanCALL() ? '1' : '0')); + RaiseMessage(MessageType.Normal, string.Format("다른 CALL이 확정된 상태입니다. 요청KIT={2},확정KIT={0},위치={1}", PUB.Result.TargetPos - 2, PUB.Result.TargetPos, kitNo)); + } + } + else if (kitVal == '0') //캔슬버튼을 눌렀다 + { + //목표번호가 캔슬버튼을 눌렀다 + if (PUB.Result.TargetPos == kitPos) + { + //상차가 완료되면 TargetPos 가 변경되어 ,더이상 해당 버튼으로는 취소하지 못한다 + PUB.AGV.data.CallNo = 0; + PUB.AGV.data.CallString = "--"; + + SendToKit(kitNo, '0', (PUB.IsCanCALL() ? '1' : '0')); + RaiseMessage(MessageType.Normal, string.Format("콜 취소 Kit={0}", kitNo)); + if (PUB.sm.RunStep != StateMachine.ERunStep.GOHOME) + { + PUB.Result.CommandKit = kitNo; + PUB.Result.TargetPos = ePosition.QC; + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(StateMachine.ERunStep.GOHOME); + PUB.sm.SetNewStep(StateMachine.eSMStep.RUN); + RaiseMessage(MessageType.Normal, string.Format("콜 취소로 인해 홈으로 이동합니다 Kit={0}", kitNo)); + } + + } + else + { + //다른놈이 취소 버튼을 눌렀다. ㅋㅋ + //아무~ 의미 없다. + SendToKit(kitNo, '0', (PUB.IsCanCALL() ? '1' : '0')); + RaiseMessage(MessageType.Normal, string.Format("해당 콜취소는 유효하지 않습니다 요청KIT={0},확정KIT={1}", kitNo, PUB.Result.TargetPos - 2)); + } + } + else if (kitVal == '2') //BACKWORK시에만 이 값이 전송되게 한다 + { + //QA 이동 명령 + //발동조건 1. QC 위치에서 GOUP(대기 혹은 상차완료)상태일때 (일반적인경우) + //발동조건 2. QC 위치에서 IDLE 상태일때 (GOUP상태로 하지 않고 바로 싫어버린경우) + //발동조건 3. 충전중일때 + + //if (kitPos != ePosition.QC) + //{ + // RaiseMessage(MessageType.Error, $"back 버튼은 QC버튼만 사용 가능 합니다"); + // return; + //} + + //if (kitPos == ePosition.QC && PUB.Result.CurrentPos != ePosition.QC) + //{ + // RaiseMessage(MessageType.Error, string.Format("QC의 QA버튼은 홈위치에 있어야 사용이 가능 합니다")); + // return; + //} + + ////명령송신은 QC로 고정한다 + //PUB.Result.CommandKit = '2'; + //PUB.Result.TargetPos = ePosition.QA; + //PUB.sm.ClearRunStep(); + //PUB.sm.SetNewRunStep(StateMachine.ERunStep.GODOWN); + //PUB.sm.SetNewStep(StateMachine.ESMStep.RUN); + //RaiseMessage(MessageType.Normal, string.Format("후진하차 모드 대상위치={0}", ePosition.QA)); + //PUB.logsys.AddI("QC의 QA리모콘 버튼 작업 입니다"); + } + } + + + public void SendToKit(char kitNo, char Value, char enbcall) + { + List buffer = new List + { + 0x02, + (byte)kitNo, + (byte)Value, + (byte)enbcall, + 0x03 + }; + WriteData(buffer.ToArray()); + //RaiseMessage(MessageType.Normal, $"지그비전송 {kitNo}:{Value}:{enbcall}"); + } + + public string GetStatusString() + { + return DateTime.Now.ToString(); + } + + public void SendStatus(String StatusString) + { + + ////IO + + char kitno = '0'; + char kitval = '1'; + if (PUB.Result.TargetPos == ePosition.F1) kitno = '1'; + else if (PUB.Result.TargetPos == ePosition.F2) kitno = '2'; + else if (PUB.Result.TargetPos == ePosition.F3) kitno = '3'; + else if (PUB.Result.TargetPos == ePosition.F4) kitno = '4'; + else if (PUB.Result.TargetPos == ePosition.QC) kitno = '9'; + else + { + //충전기 충전하는 것으로한다 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == false && VAR.BOOL[eVarBool.FLAG_CHARGEONM] == false) + kitval = '0'; + } + + //콜가능여부도 전송한다 + var enbcall = PUB.IsCanCALL() ? '1' : '0'; + SendToKit(kitno, kitval, enbcall); + + + } + } +} diff --git a/Cs_HMI/Project/Dialog/DriveDetector.cs b/Cs_HMI/Project/Dialog/DriveDetector.cs new file mode 100644 index 0000000..91ab200 --- /dev/null +++ b/Cs_HMI/Project/Dialog/DriveDetector.cs @@ -0,0 +1,815 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; // required for Message +using System.Runtime.InteropServices; // required for Marshal +using System.IO; +using Microsoft.Win32.SafeHandles; +// DriveDetector - rev. 1, Oct. 31 2007 + +namespace usbdetect +{ + /// + /// Hidden Form which we use to receive Windows messages about flash drives + /// + internal class DetectorForm : Form + { + private Label label1; + private DriveDetector mDetector = null; + + /// + /// Set up the hidden form. + /// + /// DriveDetector object which will receive notification about USB drives, see WndProc + public DetectorForm(DriveDetector detector) + { + mDetector = detector; + this.MinimizeBox = false; + this.MaximizeBox = false; + this.ShowInTaskbar = false; + this.ShowIcon = false; + this.FormBorderStyle = FormBorderStyle.None; + this.Load += new System.EventHandler(this.Load_Form); + this.Activated += new EventHandler(this.Form_Activated); + } + + private void Load_Form(object sender, EventArgs e) + { + // We don't really need this, just to display the label in designer ... + InitializeComponent(); + + // Create really small form, invisible anyway. + this.Size = new System.Drawing.Size(5, 5); + } + + private void Form_Activated(object sender, EventArgs e) + { + this.Visible = false; + } + + /// + /// This function receives all the windows messages for this window (form). + /// We call the DriveDetector from here so that is can pick up the messages about + /// drives arrived and removed. + /// + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + + if (mDetector != null) + { + mDetector.WndProc(ref m); + } + } + + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 30); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(377, 12); + this.label1.TabIndex = 0; + this.label1.Text = "This is invisible form. To see DriveDetector code click View Code"; + // + // DetectorForm + // + this.ClientSize = new System.Drawing.Size(435, 80); + this.Controls.Add(this.label1); + this.Name = "DetectorForm"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + } // class DetectorForm + + + // Delegate for event handler to handle the device events + public delegate void DriveDetectorEventHandler(Object sender, DriveDetectorEventArgs e); + + /// + /// Our class for passing in custom arguments to our event handlers + /// + /// + public class DriveDetectorEventArgs : EventArgs + { + + + public DriveDetectorEventArgs() + { + Cancel = false; + Drive = ""; + HookQueryRemove = false; + } + + /// + /// Get/Set the value indicating that the event should be cancelled + /// Only in QueryRemove handler. + /// + public bool Cancel; + + /// + /// Drive letter for the device which caused this event + /// + public string Drive; + + /// + /// Set to true in your DeviceArrived event handler if you wish to receive the + /// QueryRemove event for this drive. + /// + public bool HookQueryRemove; + + } + + + /// + /// Detects insertion or removal of removable drives. + /// Use it in 1 or 2 steps: + /// 1) Create instance of this class in your project and add handlers for the + /// DeviceArrived, DeviceRemoved and QueryRemove events. + /// AND (if you do not want drive detector to creaate a hidden form)) + /// 2) Override WndProc in your form and call DriveDetector's WndProc from there. + /// If you do not want to do step 2, just use the DriveDetector constructor without arguments and + /// it will create its own invisible form to receive messages from Windows. + /// + class DriveDetector : IDisposable + { + /// + /// Events signalized to the client app. + /// Add handlers for these events in your form to be notified of removable device events + /// + public event DriveDetectorEventHandler DeviceArrived; + public event DriveDetectorEventHandler DeviceRemoved; + public event DriveDetectorEventHandler QueryRemove; + + /// + /// The easiest way to use DriveDetector. + /// It will create hidden form for processing Windows messages about USB drives + /// You do not need to override WndProc in your form. + /// + public DriveDetector() + { + DetectorForm frm = new DetectorForm(this); + frm.Show(); // will be hidden immediatelly + Init(frm, null); + } + + /// + /// Alternate constructor. + /// Pass in your Form and DriveDetector will not create hidden form. + /// + /// object which will receive Windows messages. + /// Pass "this" as this argument from your form class. + public DriveDetector(Control control) + { + Init(control, null); + } + + /// + /// Consructs DriveDetector object setting also path to file which should be opened + /// when registering for query remove. + /// + ///object which will receive Windows messages. + /// Pass "this" as this argument from your form class. + /// Optional. Name of a file on the removable drive which should be opened. + /// If null, root directory of the drive will be opened. Opening a file is needed for us + /// to be able to register for the query remove message. TIP: For files use relative path without drive letter. + /// e.g. "SomeFolder\file_on_flash.txt" + public DriveDetector(Control control, string FileToOpen) + { + Init(control, FileToOpen); + } + + /// + /// init the DriveDetector object + /// + /// + private void Init(Control control, string fileToOpen) + { + mFileToOpen = fileToOpen; + mFileOnFlash = null; + mDeviceNotifyHandle = IntPtr.Zero; + mRecipientHandle = control.Handle; + mDirHandle = IntPtr.Zero; // handle to the root directory of the flash drive which we open + mCurrentDrive = ""; + } + + /// + /// Gets the value indicating whether the query remove event will be fired. + /// + public bool IsQueryHooked + { + get + { + if (mDeviceNotifyHandle == IntPtr.Zero) + return false; + else + return true; + } + } + + /// + /// Gets letter of drive which is currently hooked. Empty string if none. + /// See also IsQueryHooked. + /// + public string HookedDrive + { + get + { + return mCurrentDrive; + } + } + + /// + /// Gets the file stream for file which this class opened on a drive to be notified + /// about it's removal. + /// This will be null unless you specified a file to open (DriveDetector opens root directory of the flash drive) + /// + public FileStream OpenedFile + { + get + { + return mFileOnFlash; + } + } + + /// + /// Hooks specified drive to receive a message when it is being removed. + /// This can be achieved also by setting e.HookQueryRemove to true in your + /// DeviceArrived event handler. + /// By default DriveDetector will open the root directory of the flash drive to obtain notification handle + /// from Windows (to learn when the drive is about to be removed). + /// + /// Drive letter or relative path to a file on the drive which should be + /// used to get a handle - required for registering to receive query remove messages. + /// If only drive letter is specified (e.g. "D:\\", root directory of the drive will be opened. + /// true if hooked ok, false otherwise + public bool EnableQueryRemove(string fileOnDrive) + { + if (fileOnDrive == null || fileOnDrive.Length == 0) + throw new ArgumentException("Drive path must be supplied to register for Query remove."); + + if ( fileOnDrive.Length == 2 && fileOnDrive[1] == ':' ) + fileOnDrive += '\\'; // append "\\" if only drive letter with ":" was passed in. + + if (mDeviceNotifyHandle != IntPtr.Zero) + { + // Unregister first... + RegisterForDeviceChange(false, null); + } + + if (Path.GetFileName(fileOnDrive).Length == 0 ||!File.Exists(fileOnDrive)) + mFileToOpen = null; // use root directory... + else + mFileToOpen = fileOnDrive; + + RegisterQuery(Path.GetPathRoot(fileOnDrive)); + if (mDeviceNotifyHandle == IntPtr.Zero) + return false; // failed to register + + return true; + } + + /// + /// Unhooks any currently hooked drive so that the query remove + /// message is not generated for it. + /// + public void DisableQueryRemove() + { + if (mDeviceNotifyHandle != IntPtr.Zero) + { + RegisterForDeviceChange(false, null); + } + } + + + /// + /// Unregister and close the file we may have opened on the removable drive. + /// Garbage collector will call this method. + /// + public void Dispose() + { + RegisterForDeviceChange(false, null); + } + + + #region WindowProc + /// + /// Message handler which must be called from client form. + /// Processes Windows messages and calls event handlers. + /// + /// + public void WndProc(ref Message m) + { + int devType; + char c; + + if (m.Msg == WM_DEVICECHANGE) + { + // WM_DEVICECHANGE can have several meanings depending on the WParam value... + switch (m.WParam.ToInt32()) + { + + // + // New device has just arrived + // + case DBT_DEVICEARRIVAL: + + devType = Marshal.ReadInt32(m.LParam, 4); + if (devType == DBT_DEVTYP_VOLUME) + { + DEV_BROADCAST_VOLUME vol; + vol = (DEV_BROADCAST_VOLUME) + Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME)); + + // Get the drive letter + c = DriveMaskToLetter(vol.dbcv_unitmask); + + + // + // Call the client event handler + // + // We should create copy of the event before testing it and + // calling the delegate - if any + DriveDetectorEventHandler tempDeviceArrived = DeviceArrived; + if ( tempDeviceArrived != null ) + { + DriveDetectorEventArgs e = new DriveDetectorEventArgs(); + e.Drive = c + ":\\"; + tempDeviceArrived(this, e); + + // Register for query remove if requested + if (e.HookQueryRemove) + { + // If something is already hooked, unhook it now + if (mDeviceNotifyHandle != IntPtr.Zero) + { + RegisterForDeviceChange(false, null); + } + + RegisterQuery(c + ":\\"); + } + } // if has event handler + + + } + break; + + + + // + // Device is about to be removed + // Any application can cancel the removal + // + case DBT_DEVICEQUERYREMOVE: + + devType = Marshal.ReadInt32(m.LParam, 4); + if (devType == DBT_DEVTYP_HANDLE) + { + // TODO: we could get the handle for which this message is sent + // from vol.dbch_handle and compare it against a list of handles for + // which we have registered the query remove message (?) + //DEV_BROADCAST_HANDLE vol; + //vol = (DEV_BROADCAST_HANDLE) + // Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HANDLE)); + // if ( vol.dbch_handle .... + + + // + // Call the event handler in client + // + DriveDetectorEventHandler tempQuery = QueryRemove; + if (tempQuery != null) + { + DriveDetectorEventArgs e = new DriveDetectorEventArgs(); + e.Drive = mCurrentDrive; // drive which is hooked + tempQuery(this, e); + + // If the client wants to cancel, let Windows know + if (e.Cancel) + { + m.Result = (IntPtr)BROADCAST_QUERY_DENY; + } + else + { + // Change 28.10.2007: Unregister the notification, this will + // close the handle to file or root directory also. + // We have to close it anyway to allow the removal so + // even if some other app cancels the removal we would not know about it... + RegisterForDeviceChange(false, null); // will also close the mFileOnFlash + } + + } + } + break; + + + // + // Device has been removed + // + case DBT_DEVICEREMOVECOMPLETE: + + devType = Marshal.ReadInt32(m.LParam, 4); + if (devType == DBT_DEVTYP_VOLUME) + { + devType = Marshal.ReadInt32(m.LParam, 4); + if (devType == DBT_DEVTYP_VOLUME) + { + DEV_BROADCAST_VOLUME vol; + vol = (DEV_BROADCAST_VOLUME) + Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME)); + c = DriveMaskToLetter(vol.dbcv_unitmask); + + // + // Call the client event handler + // + DriveDetectorEventHandler tempDeviceRemoved = DeviceRemoved; + if (tempDeviceRemoved != null) + { + DriveDetectorEventArgs e = new DriveDetectorEventArgs(); + e.Drive = c + ":\\"; + tempDeviceRemoved(this, e); + } + + // TODO: we could unregister the notify handle here if we knew it is the + // right drive which has been just removed + //RegisterForDeviceChange(false, null); + } + } + break; + } + + } + + } + #endregion + + + + #region Private Area + + /// + /// New: 28.10.2007 - handle to root directory of flash drive which is opened + /// for device notification + /// + private IntPtr mDirHandle = IntPtr.Zero; + + /// + /// Class which contains also handle to the file opened on the flash drive + /// + private FileStream mFileOnFlash = null; + + /// + /// Name of the file to try to open on the removable drive for query remove registration + /// + private string mFileToOpen; + + /// + /// Handle to file which we keep opened on the drive if query remove message is required by the client + /// + private IntPtr mDeviceNotifyHandle; + + /// + /// Handle of the window which receives messages from Windows. This will be a form. + /// + private IntPtr mRecipientHandle; + + /// + /// Drive which is currently hooked for query remove + /// + private string mCurrentDrive; + + + // Win32 constants + private const int DBT_DEVTYP_DEVICEINTERFACE = 5; + private const int DBT_DEVTYP_HANDLE = 6; + private const int BROADCAST_QUERY_DENY = 0x424D5144; + private const int WM_DEVICECHANGE = 0x0219; + private const int DBT_DEVICEARRIVAL = 0x8000; // system detected a new device + private const int DBT_DEVICEQUERYREMOVE = 0x8001; // Preparing to remove (any program can disable the removal) + private const int DBT_DEVICEREMOVECOMPLETE = 0x8004; // removed + private const int DBT_DEVTYP_VOLUME = 0x00000002; // drive type is logical volume + + /// + /// Registers for receiving the query remove message for a given drive. + /// We need to open a handle on that drive and register with this handle. + /// Client can specify this file in mFileToOpen or we will open root directory of the drive + /// + /// drive for which to register. + private void RegisterQuery(string drive) + { + bool register = true; + + if (mFileToOpen == null) + { + // Change 28.10.2007 - Open the root directory if no file specified - leave mFileToOpen null + // If client gave us no file, let's pick one on the drive... + //mFileToOpen = GetAnyFile(drive); + //if (mFileToOpen.Length == 0) + // return; // no file found on the flash drive + } + else + { + // Make sure the path in mFileToOpen contains valid drive + // If there is a drive letter in the path, it may be different from the actual + // letter assigned to the drive now. We will cut it off and merge the actual drive + // with the rest of the path. + if (mFileToOpen.Contains(":")) + { + string tmp = mFileToOpen.Substring(3); + string root = Path.GetPathRoot(drive); + mFileToOpen = Path.Combine(root, tmp); + } + else + mFileToOpen = Path.Combine(drive, mFileToOpen); + } + + + try + { + //mFileOnFlash = new FileStream(mFileToOpen, FileMode.Open); + // Change 28.10.2007 - Open the root directory + if (mFileToOpen == null) // open root directory + mFileOnFlash = null; + else + mFileOnFlash = new FileStream(mFileToOpen, FileMode.Open); + } + catch (Exception) + { + // just do not register if the file could not be opened + register = false; + } + + + if (register) + { + //RegisterForDeviceChange(true, mFileOnFlash.SafeFileHandle); + //mCurrentDrive = drive; + // Change 28.10.2007 - Open the root directory + if (mFileOnFlash == null) + RegisterForDeviceChange(drive); + else + // old version + RegisterForDeviceChange(true, mFileOnFlash.SafeFileHandle); + + mCurrentDrive = drive; + } + + + } + + + /// + /// New version which gets the handle automatically for specified directory + /// Only for registering! Unregister with the old version of this function... + /// + /// + /// e.g. C:\\dir + private void RegisterForDeviceChange(string dirPath) + { + IntPtr handle = Native.OpenDirectory(dirPath); + if (handle == IntPtr.Zero) + { + mDeviceNotifyHandle = IntPtr.Zero; + return; + } + else + mDirHandle = handle; // save handle for closing it when unregistering + + // Register for handle + DEV_BROADCAST_HANDLE data = new DEV_BROADCAST_HANDLE(); + data.dbch_devicetype = DBT_DEVTYP_HANDLE; + data.dbch_reserved = 0; + data.dbch_nameoffset = 0; + //data.dbch_data = null; + //data.dbch_eventguid = 0; + data.dbch_handle = handle; + data.dbch_hdevnotify = (IntPtr)0; + int size = Marshal.SizeOf(data); + data.dbch_size = size; + IntPtr buffer = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(data, buffer, true); + + mDeviceNotifyHandle = Native.RegisterDeviceNotification(mRecipientHandle, buffer, 0); + + } + + /// + /// Registers to be notified when the volume is about to be removed + /// This is requierd if you want to get the QUERY REMOVE messages + /// + /// true to register, false to unregister + /// handle of a file opened on the removable drive + private void RegisterForDeviceChange(bool register, SafeFileHandle fileHandle) + { + if (register) + { + // Register for handle + DEV_BROADCAST_HANDLE data = new DEV_BROADCAST_HANDLE(); + data.dbch_devicetype = DBT_DEVTYP_HANDLE; + data.dbch_reserved = 0; + data.dbch_nameoffset = 0; + //data.dbch_data = null; + //data.dbch_eventguid = 0; + data.dbch_handle = fileHandle.DangerousGetHandle(); //Marshal. fileHandle; + data.dbch_hdevnotify = (IntPtr)0; + int size = Marshal.SizeOf(data); + data.dbch_size = size; + IntPtr buffer = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(data, buffer, true); + + mDeviceNotifyHandle = Native.RegisterDeviceNotification(mRecipientHandle, buffer, 0); + } + else + { + // close the directory handle + if (mDirHandle != IntPtr.Zero) + { + Native.CloseDirectoryHandle(mDirHandle); + // string er = Marshal.GetLastWin32Error().ToString(); + } + + // unregister + if (mDeviceNotifyHandle != IntPtr.Zero) + { + Native.UnregisterDeviceNotification(mDeviceNotifyHandle); + } + + + mDeviceNotifyHandle = IntPtr.Zero; + mDirHandle = IntPtr.Zero; + + mCurrentDrive = ""; + if (mFileOnFlash != null) + { + mFileOnFlash.Close(); + mFileOnFlash = null; + } + } + + } + + /// + /// Gets drive letter from a bit mask where bit 0 = A, bit 1 = B etc. + /// There can actually be more than one drive in the mask but we + /// just use the last one in this case. + /// + /// + /// + private static char DriveMaskToLetter(int mask) + { + char letter; + string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + // 1 = A + // 2 = B + // 4 = C... + int cnt = 0; + int pom = mask / 2; + while (pom != 0) + { + // while there is any bit set in the mask + // shift it to the righ... + pom = pom / 2; + cnt++; + } + + if (cnt < drives.Length) + letter = drives[cnt]; + else + letter = '?'; + + return letter; + } + + /* 28.10.2007 - no longer needed + /// + /// Searches for any file in a given path and returns its full path + /// + /// drive to search + /// path of the file or empty string + private string GetAnyFile(string drive) + { + string file = ""; + // First try files in the root + string[] files = Directory.GetFiles(drive); + if (files.Length == 0) + { + // if no file in the root, search whole drive + files = Directory.GetFiles(drive, "*.*", SearchOption.AllDirectories); + } + + if (files.Length > 0) + file = files[0]; // get the first file + + // return empty string if no file found + return file; + }*/ + #endregion + + + #region Native Win32 API + /// + /// WinAPI functions + /// + private class Native + { + // HDEVNOTIFY RegisterDeviceNotification(HANDLE hRecipient,LPVOID NotificationFilter,DWORD Flags); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, uint Flags); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern uint UnregisterDeviceNotification(IntPtr hHandle); + + // + // CreateFile - MSDN + const uint GENERIC_READ = 0x80000000; + const uint OPEN_EXISTING = 3; + const uint FILE_SHARE_READ = 0x00000001; + const uint FILE_SHARE_WRITE = 0x00000002; + const uint FILE_ATTRIBUTE_NORMAL = 128; + const uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000; + static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); + + + // should be "static extern unsafe" + [DllImport("kernel32", SetLastError = true)] + static extern IntPtr CreateFile( + string FileName, // file name + uint DesiredAccess, // access mode + uint ShareMode, // share mode + uint SecurityAttributes, // Security Attributes + uint CreationDisposition, // how to create + uint FlagsAndAttributes, // file attributes + int hTemplateFile // handle to template file + ); + + + [DllImport("kernel32", SetLastError = true)] + static extern bool CloseHandle( + IntPtr hObject // handle to object + ); + + /// + /// Opens a directory, returns it's handle or zero. + /// + /// path to the directory, e.g. "C:\\dir" + /// handle to the directory. Close it with CloseHandle(). + static public IntPtr OpenDirectory(string dirPath) + { + // open the existing file for reading + IntPtr handle = CreateFile( + dirPath, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_NORMAL, + 0); + + if ( handle == INVALID_HANDLE_VALUE) + return IntPtr.Zero; + else + return handle; + } + + + public static bool CloseDirectoryHandle(IntPtr handle) + { + return CloseHandle(handle); + } + } + + + // Structure with information for RegisterDeviceNotification. + [StructLayout(LayoutKind.Sequential)] + public struct DEV_BROADCAST_HANDLE + { + public int dbch_size; + public int dbch_devicetype; + public int dbch_reserved; + public IntPtr dbch_handle; + public IntPtr dbch_hdevnotify; + public Guid dbch_eventguid; + public long dbch_nameoffset; + //public byte[] dbch_data[1]; // = new byte[1]; + public byte dbch_data; + public byte dbch_data1; + } + + // Struct for parameters of the WM_DEVICECHANGE message + [StructLayout(LayoutKind.Sequential)] + public struct DEV_BROADCAST_VOLUME + { + public int dbcv_size; + public int dbcv_devicetype; + public int dbcv_reserved; + public int dbcv_unitmask; + } + #endregion + + } +} diff --git a/Cs_HMI/Project/Dialog/fCounter.Designer.cs b/Cs_HMI/Project/Dialog/fCounter.Designer.cs new file mode 100644 index 0000000..d90b0ba --- /dev/null +++ b/Cs_HMI/Project/Dialog/fCounter.Designer.cs @@ -0,0 +1,687 @@ +namespace Project.Dialog +{ + partial class fCounter + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.lbcnt1 = new arCtl.arLabel(); + this.lbcnt2 = new arCtl.arLabel(); + this.lbcnt3 = new arCtl.arLabel(); + this.lbcnt4 = new arCtl.arLabel(); + this.lbcnt5 = new arCtl.arLabel(); + this.lbcnta = new arCtl.arLabel(); + this.lbcntm = new arCtl.arLabel(); + this.lbcnte = new arCtl.arLabel(); + this.lbcntqa = new arCtl.arLabel(); + this.lbcntqc = new arCtl.arLabel(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single; + this.tableLayoutPanel1.ColumnCount = 5; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.label2, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.label3, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.label4, 3, 0); + this.tableLayoutPanel1.Controls.Add(this.label5, 4, 0); + this.tableLayoutPanel1.Controls.Add(this.label6, 4, 2); + this.tableLayoutPanel1.Controls.Add(this.label7, 3, 2); + this.tableLayoutPanel1.Controls.Add(this.label8, 2, 2); + this.tableLayoutPanel1.Controls.Add(this.label9, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.label10, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.lbcnt1, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.lbcnt2, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.lbcnt3, 2, 1); + this.tableLayoutPanel1.Controls.Add(this.lbcnt4, 3, 1); + this.tableLayoutPanel1.Controls.Add(this.lbcnt5, 4, 1); + this.tableLayoutPanel1.Controls.Add(this.lbcnta, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.lbcntm, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.lbcnte, 2, 3); + this.tableLayoutPanel1.Controls.Add(this.lbcntqa, 3, 3); + this.tableLayoutPanel1.Controls.Add(this.lbcntqc, 4, 3); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(392, 135); + this.tableLayoutPanel1.TabIndex = 0; + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Fill; + this.label1.Location = new System.Drawing.Point(4, 1); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(71, 20); + this.label1.TabIndex = 0; + this.label1.Text = "FVI-1"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label2 + // + this.label2.Dock = System.Windows.Forms.DockStyle.Fill; + this.label2.Location = new System.Drawing.Point(82, 1); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(71, 20); + this.label2.TabIndex = 0; + this.label2.Text = "FVI-2"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label3 + // + this.label3.Dock = System.Windows.Forms.DockStyle.Fill; + this.label3.Location = new System.Drawing.Point(160, 1); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(71, 20); + this.label3.TabIndex = 0; + this.label3.Text = "FVI-3"; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label4 + // + this.label4.Dock = System.Windows.Forms.DockStyle.Fill; + this.label4.Location = new System.Drawing.Point(238, 1); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(71, 20); + this.label4.TabIndex = 0; + this.label4.Text = "FVI-4"; + this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label5 + // + this.label5.Dock = System.Windows.Forms.DockStyle.Fill; + this.label5.Location = new System.Drawing.Point(316, 1); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(72, 20); + this.label5.TabIndex = 0; + this.label5.Text = "--"; + this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label6 + // + this.label6.Dock = System.Windows.Forms.DockStyle.Fill; + this.label6.Location = new System.Drawing.Point(316, 68); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(72, 20); + this.label6.TabIndex = 0; + this.label6.Text = "QC"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label7 + // + this.label7.Dock = System.Windows.Forms.DockStyle.Fill; + this.label7.Location = new System.Drawing.Point(238, 68); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(71, 20); + this.label7.TabIndex = 0; + this.label7.Text = "QA"; + this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label8 + // + this.label8.Dock = System.Windows.Forms.DockStyle.Fill; + this.label8.Location = new System.Drawing.Point(160, 68); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(71, 20); + this.label8.TabIndex = 0; + this.label8.Text = "충전실패"; + this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label9 + // + this.label9.Dock = System.Windows.Forms.DockStyle.Fill; + this.label9.Location = new System.Drawing.Point(82, 68); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(71, 20); + this.label9.TabIndex = 0; + this.label9.Text = "충전(수동)"; + this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label10 + // + this.label10.Dock = System.Windows.Forms.DockStyle.Fill; + this.label10.Location = new System.Drawing.Point(4, 68); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(71, 20); + this.label10.TabIndex = 0; + this.label10.Text = "충전(자동)"; + this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lbcnt1 + // + this.lbcnt1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcnt1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcnt1.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcnt1.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcnt1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcnt1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcnt1.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcnt1.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcnt1.ForeColor = System.Drawing.Color.White; + this.lbcnt1.GradientEnable = true; + this.lbcnt1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcnt1.GradientRepeatBG = false; + this.lbcnt1.isButton = false; + this.lbcnt1.Location = new System.Drawing.Point(1, 22); + this.lbcnt1.Margin = new System.Windows.Forms.Padding(0); + this.lbcnt1.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcnt1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcnt1.msg = null; + this.lbcnt1.Name = "lbcnt1"; + this.lbcnt1.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcnt1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcnt1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcnt1.ProgressEnable = false; + this.lbcnt1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcnt1.ProgressForeColor = System.Drawing.Color.Black; + this.lbcnt1.ProgressMax = 100F; + this.lbcnt1.ProgressMin = 0F; + this.lbcnt1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcnt1.ProgressValue = 0F; + this.lbcnt1.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcnt1.Sign = ""; + this.lbcnt1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcnt1.SignColor = System.Drawing.Color.Yellow; + this.lbcnt1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcnt1.Size = new System.Drawing.Size(77, 45); + this.lbcnt1.TabIndex = 5; + this.lbcnt1.Text = "99"; + this.lbcnt1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcnt1.TextShadow = true; + this.lbcnt1.TextVisible = true; + // + // lbcnt2 + // + this.lbcnt2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt2.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcnt2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcnt2.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcnt2.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcnt2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcnt2.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcnt2.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcnt2.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcnt2.ForeColor = System.Drawing.Color.White; + this.lbcnt2.GradientEnable = true; + this.lbcnt2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcnt2.GradientRepeatBG = false; + this.lbcnt2.isButton = false; + this.lbcnt2.Location = new System.Drawing.Point(79, 22); + this.lbcnt2.Margin = new System.Windows.Forms.Padding(0); + this.lbcnt2.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcnt2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcnt2.msg = null; + this.lbcnt2.Name = "lbcnt2"; + this.lbcnt2.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcnt2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcnt2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcnt2.ProgressEnable = false; + this.lbcnt2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcnt2.ProgressForeColor = System.Drawing.Color.Black; + this.lbcnt2.ProgressMax = 100F; + this.lbcnt2.ProgressMin = 0F; + this.lbcnt2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcnt2.ProgressValue = 0F; + this.lbcnt2.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcnt2.Sign = ""; + this.lbcnt2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcnt2.SignColor = System.Drawing.Color.Yellow; + this.lbcnt2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcnt2.Size = new System.Drawing.Size(77, 45); + this.lbcnt2.TabIndex = 5; + this.lbcnt2.Text = "99"; + this.lbcnt2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcnt2.TextShadow = true; + this.lbcnt2.TextVisible = true; + // + // lbcnt3 + // + this.lbcnt3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt3.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcnt3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcnt3.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcnt3.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcnt3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcnt3.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcnt3.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcnt3.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcnt3.ForeColor = System.Drawing.Color.White; + this.lbcnt3.GradientEnable = true; + this.lbcnt3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcnt3.GradientRepeatBG = false; + this.lbcnt3.isButton = false; + this.lbcnt3.Location = new System.Drawing.Point(157, 22); + this.lbcnt3.Margin = new System.Windows.Forms.Padding(0); + this.lbcnt3.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcnt3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcnt3.msg = null; + this.lbcnt3.Name = "lbcnt3"; + this.lbcnt3.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcnt3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcnt3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcnt3.ProgressEnable = false; + this.lbcnt3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcnt3.ProgressForeColor = System.Drawing.Color.Black; + this.lbcnt3.ProgressMax = 100F; + this.lbcnt3.ProgressMin = 0F; + this.lbcnt3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcnt3.ProgressValue = 0F; + this.lbcnt3.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcnt3.Sign = ""; + this.lbcnt3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcnt3.SignColor = System.Drawing.Color.Yellow; + this.lbcnt3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcnt3.Size = new System.Drawing.Size(77, 45); + this.lbcnt3.TabIndex = 5; + this.lbcnt3.Text = "99"; + this.lbcnt3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcnt3.TextShadow = true; + this.lbcnt3.TextVisible = true; + // + // lbcnt4 + // + this.lbcnt4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt4.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcnt4.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcnt4.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcnt4.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcnt4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcnt4.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcnt4.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcnt4.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcnt4.ForeColor = System.Drawing.Color.White; + this.lbcnt4.GradientEnable = true; + this.lbcnt4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcnt4.GradientRepeatBG = false; + this.lbcnt4.isButton = false; + this.lbcnt4.Location = new System.Drawing.Point(235, 22); + this.lbcnt4.Margin = new System.Windows.Forms.Padding(0); + this.lbcnt4.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcnt4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcnt4.msg = null; + this.lbcnt4.Name = "lbcnt4"; + this.lbcnt4.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcnt4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcnt4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcnt4.ProgressEnable = false; + this.lbcnt4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcnt4.ProgressForeColor = System.Drawing.Color.Black; + this.lbcnt4.ProgressMax = 100F; + this.lbcnt4.ProgressMin = 0F; + this.lbcnt4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcnt4.ProgressValue = 0F; + this.lbcnt4.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcnt4.Sign = ""; + this.lbcnt4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcnt4.SignColor = System.Drawing.Color.Yellow; + this.lbcnt4.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcnt4.Size = new System.Drawing.Size(77, 45); + this.lbcnt4.TabIndex = 5; + this.lbcnt4.Text = "99"; + this.lbcnt4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcnt4.TextShadow = true; + this.lbcnt4.TextVisible = true; + // + // lbcnt5 + // + this.lbcnt5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt5.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnt5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcnt5.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcnt5.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcnt5.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcnt5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcnt5.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcnt5.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcnt5.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcnt5.ForeColor = System.Drawing.Color.White; + this.lbcnt5.GradientEnable = true; + this.lbcnt5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcnt5.GradientRepeatBG = false; + this.lbcnt5.isButton = false; + this.lbcnt5.Location = new System.Drawing.Point(313, 22); + this.lbcnt5.Margin = new System.Windows.Forms.Padding(0); + this.lbcnt5.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcnt5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcnt5.msg = null; + this.lbcnt5.Name = "lbcnt5"; + this.lbcnt5.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcnt5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcnt5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcnt5.ProgressEnable = false; + this.lbcnt5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcnt5.ProgressForeColor = System.Drawing.Color.Black; + this.lbcnt5.ProgressMax = 100F; + this.lbcnt5.ProgressMin = 0F; + this.lbcnt5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcnt5.ProgressValue = 0F; + this.lbcnt5.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcnt5.Sign = ""; + this.lbcnt5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcnt5.SignColor = System.Drawing.Color.Yellow; + this.lbcnt5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcnt5.Size = new System.Drawing.Size(78, 45); + this.lbcnt5.TabIndex = 5; + this.lbcnt5.Text = "--"; + this.lbcnt5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcnt5.TextShadow = true; + this.lbcnt5.TextVisible = true; + // + // lbcnta + // + this.lbcnta.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnta.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnta.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcnta.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcnta.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcnta.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcnta.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcnta.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcnta.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcnta.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcnta.ForeColor = System.Drawing.Color.White; + this.lbcnta.GradientEnable = true; + this.lbcnta.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcnta.GradientRepeatBG = false; + this.lbcnta.isButton = false; + this.lbcnta.Location = new System.Drawing.Point(1, 89); + this.lbcnta.Margin = new System.Windows.Forms.Padding(0); + this.lbcnta.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcnta.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcnta.msg = null; + this.lbcnta.Name = "lbcnta"; + this.lbcnta.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcnta.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcnta.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcnta.ProgressEnable = false; + this.lbcnta.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcnta.ProgressForeColor = System.Drawing.Color.Black; + this.lbcnta.ProgressMax = 100F; + this.lbcnta.ProgressMin = 0F; + this.lbcnta.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcnta.ProgressValue = 0F; + this.lbcnta.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcnta.Sign = ""; + this.lbcnta.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcnta.SignColor = System.Drawing.Color.Yellow; + this.lbcnta.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcnta.Size = new System.Drawing.Size(77, 45); + this.lbcnta.TabIndex = 5; + this.lbcnta.Text = "99"; + this.lbcnta.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcnta.TextShadow = true; + this.lbcnta.TextVisible = true; + // + // lbcntm + // + this.lbcntm.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcntm.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcntm.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcntm.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcntm.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcntm.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcntm.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcntm.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcntm.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcntm.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcntm.ForeColor = System.Drawing.Color.White; + this.lbcntm.GradientEnable = true; + this.lbcntm.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcntm.GradientRepeatBG = false; + this.lbcntm.isButton = false; + this.lbcntm.Location = new System.Drawing.Point(79, 89); + this.lbcntm.Margin = new System.Windows.Forms.Padding(0); + this.lbcntm.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcntm.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcntm.msg = null; + this.lbcntm.Name = "lbcntm"; + this.lbcntm.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcntm.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcntm.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcntm.ProgressEnable = false; + this.lbcntm.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcntm.ProgressForeColor = System.Drawing.Color.Black; + this.lbcntm.ProgressMax = 100F; + this.lbcntm.ProgressMin = 0F; + this.lbcntm.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcntm.ProgressValue = 0F; + this.lbcntm.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcntm.Sign = ""; + this.lbcntm.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcntm.SignColor = System.Drawing.Color.Yellow; + this.lbcntm.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcntm.Size = new System.Drawing.Size(77, 45); + this.lbcntm.TabIndex = 5; + this.lbcntm.Text = "99"; + this.lbcntm.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcntm.TextShadow = true; + this.lbcntm.TextVisible = true; + // + // lbcnte + // + this.lbcnte.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnte.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcnte.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcnte.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcnte.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcnte.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcnte.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcnte.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcnte.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcnte.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcnte.ForeColor = System.Drawing.Color.White; + this.lbcnte.GradientEnable = true; + this.lbcnte.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcnte.GradientRepeatBG = false; + this.lbcnte.isButton = false; + this.lbcnte.Location = new System.Drawing.Point(157, 89); + this.lbcnte.Margin = new System.Windows.Forms.Padding(0); + this.lbcnte.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcnte.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcnte.msg = null; + this.lbcnte.Name = "lbcnte"; + this.lbcnte.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcnte.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcnte.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcnte.ProgressEnable = false; + this.lbcnte.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcnte.ProgressForeColor = System.Drawing.Color.Black; + this.lbcnte.ProgressMax = 100F; + this.lbcnte.ProgressMin = 0F; + this.lbcnte.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcnte.ProgressValue = 0F; + this.lbcnte.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcnte.Sign = ""; + this.lbcnte.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcnte.SignColor = System.Drawing.Color.Yellow; + this.lbcnte.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcnte.Size = new System.Drawing.Size(77, 45); + this.lbcnte.TabIndex = 5; + this.lbcnte.Text = "99"; + this.lbcnte.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcnte.TextShadow = true; + this.lbcnte.TextVisible = true; + // + // lbcntqa + // + this.lbcntqa.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcntqa.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcntqa.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcntqa.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcntqa.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcntqa.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcntqa.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcntqa.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcntqa.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcntqa.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcntqa.ForeColor = System.Drawing.Color.White; + this.lbcntqa.GradientEnable = true; + this.lbcntqa.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcntqa.GradientRepeatBG = false; + this.lbcntqa.isButton = false; + this.lbcntqa.Location = new System.Drawing.Point(235, 89); + this.lbcntqa.Margin = new System.Windows.Forms.Padding(0); + this.lbcntqa.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcntqa.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcntqa.msg = null; + this.lbcntqa.Name = "lbcntqa"; + this.lbcntqa.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcntqa.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcntqa.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcntqa.ProgressEnable = false; + this.lbcntqa.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcntqa.ProgressForeColor = System.Drawing.Color.Black; + this.lbcntqa.ProgressMax = 100F; + this.lbcntqa.ProgressMin = 0F; + this.lbcntqa.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcntqa.ProgressValue = 0F; + this.lbcntqa.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcntqa.Sign = ""; + this.lbcntqa.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcntqa.SignColor = System.Drawing.Color.Yellow; + this.lbcntqa.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcntqa.Size = new System.Drawing.Size(77, 45); + this.lbcntqa.TabIndex = 5; + this.lbcntqa.Text = "99"; + this.lbcntqa.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcntqa.TextShadow = true; + this.lbcntqa.TextVisible = true; + // + // lbcntqc + // + this.lbcntqc.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcntqc.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbcntqc.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbcntqc.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbcntqc.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbcntqc.BorderSize = new System.Windows.Forms.Padding(0); + this.lbcntqc.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbcntqc.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbcntqc.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbcntqc.Font = new System.Drawing.Font("Consolas", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbcntqc.ForeColor = System.Drawing.Color.White; + this.lbcntqc.GradientEnable = true; + this.lbcntqc.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbcntqc.GradientRepeatBG = false; + this.lbcntqc.isButton = false; + this.lbcntqc.Location = new System.Drawing.Point(313, 89); + this.lbcntqc.Margin = new System.Windows.Forms.Padding(0); + this.lbcntqc.MouseDownColor = System.Drawing.Color.Yellow; + this.lbcntqc.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbcntqc.msg = null; + this.lbcntqc.Name = "lbcntqc"; + this.lbcntqc.ProgressBorderColor = System.Drawing.Color.Black; + this.lbcntqc.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbcntqc.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbcntqc.ProgressEnable = false; + this.lbcntqc.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbcntqc.ProgressForeColor = System.Drawing.Color.Black; + this.lbcntqc.ProgressMax = 100F; + this.lbcntqc.ProgressMin = 0F; + this.lbcntqc.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbcntqc.ProgressValue = 0F; + this.lbcntqc.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbcntqc.Sign = ""; + this.lbcntqc.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbcntqc.SignColor = System.Drawing.Color.Yellow; + this.lbcntqc.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbcntqc.Size = new System.Drawing.Size(78, 45); + this.lbcntqc.TabIndex = 5; + this.lbcntqc.Text = "99"; + this.lbcntqc.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbcntqc.TextShadow = true; + this.lbcntqc.TextVisible = true; + this.lbcntqc.Click += new System.EventHandler(this.lbcntpk_Click); + // + // fCounter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(392, 135); + this.Controls.Add(this.tableLayoutPanel1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "fCounter"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "fCounter"; + this.Load += new System.EventHandler(this.fCounter_Load); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label10; + private arCtl.arLabel lbcnt1; + private arCtl.arLabel lbcnt2; + private arCtl.arLabel lbcnt3; + private arCtl.arLabel lbcnt4; + private arCtl.arLabel lbcnt5; + private arCtl.arLabel lbcnta; + private arCtl.arLabel lbcntm; + private arCtl.arLabel lbcnte; + private arCtl.arLabel lbcntqa; + private System.Windows.Forms.Label label6; + private arCtl.arLabel lbcntqc; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fCounter.cs b/Cs_HMI/Project/Dialog/fCounter.cs new file mode 100644 index 0000000..3c8e552 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fCounter.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fCounter : Form + { + public fCounter() + { + InitializeComponent(); + } + + private void fCounter_Load(object sender, EventArgs e) + { + lbcnt1.Text = PUB.counter.CountUp1.ToString(); + lbcnt2.Text = PUB.counter.CountUp2.ToString(); + lbcnt3.Text = PUB.counter.CountUp3.ToString(); + lbcnt4.Text = PUB.counter.CountUp4.ToString(); + //lbcnt5.Text = PUB.counter.CountUp5.ToString(); + lbcnta.Text = PUB.counter.CountChargeA.ToString(); + lbcntm.Text = PUB.counter.CountChargeM.ToString(); + lbcnte.Text = PUB.counter.CountChargeE.ToString(); + lbcntqa.Text = PUB.counter.CountQA.ToString(); + lbcntqc.Text = PUB.counter.CountQC.ToString(); + } + + private void lbcntpk_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/Cs_HMI/Project/Dialog/fCounter.resx b/Cs_HMI/Project/Dialog/fCounter.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/Project/Dialog/fCounter.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fErrorException.Designer.cs b/Cs_HMI/Project/Dialog/fErrorException.Designer.cs new file mode 100644 index 0000000..b29cbe4 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fErrorException.Designer.cs @@ -0,0 +1,127 @@ +namespace Project +{ + partial class fErrorException + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fErrorException)); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.button2 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(160, 23); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(80, 80); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // button2 + // + this.button2.Image = ((System.Drawing.Image)(resources.GetObject("button2.Image"))); + this.button2.Location = new System.Drawing.Point(30, 491); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(355, 54); + this.button2.TabIndex = 2; + this.button2.Text = "종료"; + this.button2.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Brown; + this.label1.Font = new System.Drawing.Font("맑은 고딕", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(30, 117); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(10); + this.label1.Size = new System.Drawing.Size(355, 50); + this.label1.TabIndex = 3; + this.label1.Text = "미처리 오류로 인한 프로그램 중단"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label2.ForeColor = System.Drawing.Color.Blue; + this.label2.Location = new System.Drawing.Point(30, 182); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(311, 45); + this.label2.TabIndex = 4; + this.label2.Text = "오류보고를 위한 정보가 수집되었습니다.\r\n수집된 정보는 아래와 같고 오류가 발생하기 전의 상황을\r\n적어서 메일을 전송하면 버그 수정에 도움이 됩니" + + "다."; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(30, 240); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox1.Size = new System.Drawing.Size(355, 241); + this.textBox1.TabIndex = 5; + // + // fErrorException + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(418, 560); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.button2); + this.Controls.Add(this.pictureBox1); + this.Font = new System.Drawing.Font("맑은 고딕", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "fErrorException"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Error Report"; + this.Load += new System.EventHandler(this.fErrorException_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fErrorException.cs b/Cs_HMI/Project/Dialog/fErrorException.cs new file mode 100644 index 0000000..19764f9 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fErrorException.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Project +{ + public partial class fErrorException : Form + { + public fErrorException(string err) + { + InitializeComponent(); + System.Text.StringBuilder sb = new StringBuilder(); + sb.AppendLine("To : ChiKyun.kim@amkor.co.kr"); + sb.AppendLine("Description : ?"); + sb.AppendLine(); + sb.AppendLine("========================="); + sb.AppendLine(" ERROR MESSAGE"); + sb.AppendLine("========================="); + sb.AppendLine(); + sb.AppendLine(err); + this.textBox1.Text = sb.ToString(); + } + + private void fErrorException_Load(object sender, EventArgs e) + { + + } + + private void button2_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/Cs_HMI/Project/Dialog/fErrorException.resx b/Cs_HMI/Project/Dialog/fErrorException.resx new file mode 100644 index 0000000..a1823b3 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fErrorException.resx @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fJobSelect.Designer.cs b/Cs_HMI/Project/Dialog/fJobSelect.Designer.cs new file mode 100644 index 0000000..942048f --- /dev/null +++ b/Cs_HMI/Project/Dialog/fJobSelect.Designer.cs @@ -0,0 +1,558 @@ +namespace Project.Dialog +{ + partial class fJobSelect + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmBlink = new System.Windows.Forms.Timer(this.components); + this.arPanel1 = new arCtl.arPanel(); + this.panButton = new System.Windows.Forms.Panel(); + this.btYes = new arCtl.arLabel(); + this.btNo = new arCtl.arLabel(); + this.panel7 = new System.Windows.Forms.Panel(); + this.lb5 = new arCtl.arLabel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lb4 = new arCtl.arLabel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.lb3 = new arCtl.arLabel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lb2 = new arCtl.arLabel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.lb1 = new arCtl.arLabel(); + this.panel8 = new System.Windows.Forms.Panel(); + this.lbTitle = new arCtl.arLabel(); + this.arPanel1.SuspendLayout(); + this.panButton.SuspendLayout(); + this.SuspendLayout(); + // + // tmBlink + // + this.tmBlink.Enabled = true; + this.tmBlink.Interval = 300; + this.tmBlink.Tick += new System.EventHandler(this.tmBlink_Tick); + // + // arPanel1 + // + this.arPanel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arPanel1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arPanel1.BorderColor = System.Drawing.Color.DimGray; + this.arPanel1.BorderSize = new System.Windows.Forms.Padding(1); + this.arPanel1.Controls.Add(this.panButton); + this.arPanel1.Controls.Add(this.panel7); + this.arPanel1.Controls.Add(this.lb5); + this.arPanel1.Controls.Add(this.panel3); + this.arPanel1.Controls.Add(this.lb4); + this.arPanel1.Controls.Add(this.panel2); + this.arPanel1.Controls.Add(this.lb3); + this.arPanel1.Controls.Add(this.panel1); + this.arPanel1.Controls.Add(this.lb2); + this.arPanel1.Controls.Add(this.panel4); + this.arPanel1.Controls.Add(this.lb1); + this.arPanel1.Controls.Add(this.panel8); + this.arPanel1.Controls.Add(this.lbTitle); + this.arPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.arPanel1.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Italic); + this.arPanel1.ForeColor = System.Drawing.Color.Khaki; + this.arPanel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arPanel1.GradientRepeatBG = false; + this.arPanel1.Location = new System.Drawing.Point(5, 5); + this.arPanel1.Name = "arPanel1"; + this.arPanel1.Padding = new System.Windows.Forms.Padding(6); + this.arPanel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arPanel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arPanel1.ProgressMax = 100F; + this.arPanel1.ProgressMin = 0F; + this.arPanel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arPanel1.ProgressValue = 0F; + this.arPanel1.ShadowColor = System.Drawing.Color.Black; + this.arPanel1.ShowBorder = true; + this.arPanel1.Size = new System.Drawing.Size(508, 405); + this.arPanel1.TabIndex = 0; + this.arPanel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.arPanel1.TextShadow = false; + this.arPanel1.UseProgressBar = false; + // + // panButton + // + this.panButton.Controls.Add(this.btYes); + this.panButton.Controls.Add(this.btNo); + this.panButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.panButton.Location = new System.Drawing.Point(6, 353); + this.panButton.Name = "panButton"; + this.panButton.Size = new System.Drawing.Size(496, 46); + this.panButton.TabIndex = 10; + // + // btYes + // + this.btYes.BackColor = System.Drawing.Color.SeaGreen; + this.btYes.BackColor2 = System.Drawing.Color.SeaGreen; + this.btYes.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btYes.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btYes.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btYes.BorderSize = new System.Windows.Forms.Padding(1); + this.btYes.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btYes.Cursor = System.Windows.Forms.Cursors.Hand; + this.btYes.Dock = System.Windows.Forms.DockStyle.Fill; + this.btYes.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btYes.ForeColor = System.Drawing.Color.Black; + this.btYes.GradientEnable = true; + this.btYes.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btYes.GradientRepeatBG = false; + this.btYes.isButton = true; + this.btYes.Location = new System.Drawing.Point(0, 0); + this.btYes.MouseDownColor = System.Drawing.Color.Yellow; + this.btYes.MouseOverColor = System.Drawing.Color.Yellow; + this.btYes.msg = null; + this.btYes.Name = "btYes"; + this.btYes.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btYes.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btYes.ProgressEnable = false; + this.btYes.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btYes.ProgressForeColor = System.Drawing.Color.Black; + this.btYes.ProgressMax = 100F; + this.btYes.ProgressMin = 0F; + this.btYes.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btYes.ProgressValue = 0F; + this.btYes.ShadowColor = System.Drawing.Color.Gray; + this.btYes.Sign = ""; + this.btYes.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btYes.SignColor = System.Drawing.Color.Yellow; + this.btYes.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btYes.Size = new System.Drawing.Size(267, 46); + this.btYes.TabIndex = 0; + this.btYes.Text = "예(F5)"; + this.btYes.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btYes.TextShadow = true; + this.btYes.TextVisible = true; + this.btYes.Click += new System.EventHandler(this.btYes_Click); + // + // btNo + // + this.btNo.BackColor = System.Drawing.Color.Goldenrod; + this.btNo.BackColor2 = System.Drawing.Color.Goldenrod; + this.btNo.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btNo.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btNo.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btNo.BorderSize = new System.Windows.Forms.Padding(1); + this.btNo.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btNo.Cursor = System.Windows.Forms.Cursors.Hand; + this.btNo.Dock = System.Windows.Forms.DockStyle.Right; + this.btNo.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btNo.ForeColor = System.Drawing.Color.Black; + this.btNo.GradientEnable = true; + this.btNo.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btNo.GradientRepeatBG = false; + this.btNo.isButton = true; + this.btNo.Location = new System.Drawing.Point(267, 0); + this.btNo.MouseDownColor = System.Drawing.Color.Yellow; + this.btNo.MouseOverColor = System.Drawing.Color.Yellow; + this.btNo.msg = null; + this.btNo.Name = "btNo"; + this.btNo.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btNo.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btNo.ProgressEnable = false; + this.btNo.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btNo.ProgressForeColor = System.Drawing.Color.Black; + this.btNo.ProgressMax = 100F; + this.btNo.ProgressMin = 0F; + this.btNo.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btNo.ProgressValue = 0F; + this.btNo.ShadowColor = System.Drawing.Color.Gray; + this.btNo.Sign = ""; + this.btNo.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btNo.SignColor = System.Drawing.Color.Yellow; + this.btNo.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btNo.Size = new System.Drawing.Size(229, 46); + this.btNo.TabIndex = 1; + this.btNo.Text = "아니오(ESC)"; + this.btNo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btNo.TextShadow = true; + this.btNo.TextVisible = true; + this.btNo.Click += new System.EventHandler(this.btNo_Click); + // + // panel7 + // + this.panel7.Dock = System.Windows.Forms.DockStyle.Top; + this.panel7.Location = new System.Drawing.Point(6, 348); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(496, 5); + this.panel7.TabIndex = 0; + // + // lb5 + // + this.lb5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb5.BackColor2 = System.Drawing.Color.Gray; + this.lb5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb5.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb5.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb5.BorderSize = new System.Windows.Forms.Padding(1); + this.lb5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb5.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb5.Dock = System.Windows.Forms.DockStyle.Top; + this.lb5.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb5.ForeColor = System.Drawing.Color.White; + this.lb5.GradientEnable = true; + this.lb5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb5.GradientRepeatBG = false; + this.lb5.isButton = false; + this.lb5.Location = new System.Drawing.Point(6, 298); + this.lb5.MouseDownColor = System.Drawing.Color.Yellow; + this.lb5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb5.msg = null; + this.lb5.Name = "lb5"; + this.lb5.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb5.ProgressEnable = false; + this.lb5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb5.ProgressForeColor = System.Drawing.Color.Black; + this.lb5.ProgressMax = 100F; + this.lb5.ProgressMin = 0F; + this.lb5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb5.ProgressValue = 0F; + this.lb5.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb5.Sign = ""; + this.lb5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb5.SignColor = System.Drawing.Color.Yellow; + this.lb5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb5.Size = new System.Drawing.Size(496, 50); + this.lb5.TabIndex = 7; + this.lb5.Text = "*"; + this.lb5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb5.TextShadow = true; + this.lb5.TextVisible = true; + // + // panel3 + // + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(6, 293); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(496, 5); + this.panel3.TabIndex = 13; + // + // lb4 + // + this.lb4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb4.BackColor2 = System.Drawing.Color.Gray; + this.lb4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb4.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb4.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb4.BorderSize = new System.Windows.Forms.Padding(1); + this.lb4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb4.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb4.Dock = System.Windows.Forms.DockStyle.Top; + this.lb4.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb4.ForeColor = System.Drawing.Color.White; + this.lb4.GradientEnable = true; + this.lb4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb4.GradientRepeatBG = false; + this.lb4.isButton = false; + this.lb4.Location = new System.Drawing.Point(6, 243); + this.lb4.MouseDownColor = System.Drawing.Color.Yellow; + this.lb4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb4.msg = null; + this.lb4.Name = "lb4"; + this.lb4.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb4.ProgressEnable = false; + this.lb4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb4.ProgressForeColor = System.Drawing.Color.Black; + this.lb4.ProgressMax = 100F; + this.lb4.ProgressMin = 0F; + this.lb4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb4.ProgressValue = 0F; + this.lb4.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb4.Sign = ""; + this.lb4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb4.SignColor = System.Drawing.Color.Yellow; + this.lb4.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb4.Size = new System.Drawing.Size(496, 50); + this.lb4.TabIndex = 6; + this.lb4.Text = "*"; + this.lb4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb4.TextShadow = true; + this.lb4.TextVisible = true; + // + // panel2 + // + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(6, 238); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(496, 5); + this.panel2.TabIndex = 12; + // + // lb3 + // + this.lb3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb3.BackColor2 = System.Drawing.Color.Gray; + this.lb3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb3.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb3.BorderSize = new System.Windows.Forms.Padding(1); + this.lb3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb3.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb3.Dock = System.Windows.Forms.DockStyle.Top; + this.lb3.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb3.ForeColor = System.Drawing.Color.White; + this.lb3.GradientEnable = true; + this.lb3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb3.GradientRepeatBG = false; + this.lb3.isButton = false; + this.lb3.Location = new System.Drawing.Point(6, 188); + this.lb3.MouseDownColor = System.Drawing.Color.Yellow; + this.lb3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb3.msg = null; + this.lb3.Name = "lb3"; + this.lb3.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb3.ProgressEnable = false; + this.lb3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb3.ProgressForeColor = System.Drawing.Color.Black; + this.lb3.ProgressMax = 100F; + this.lb3.ProgressMin = 0F; + this.lb3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb3.ProgressValue = 0F; + this.lb3.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb3.Sign = ""; + this.lb3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb3.SignColor = System.Drawing.Color.Yellow; + this.lb3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb3.Size = new System.Drawing.Size(496, 50); + this.lb3.TabIndex = 5; + this.lb3.Text = "* 현재 위치 : "; + this.lb3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb3.TextShadow = true; + this.lb3.TextVisible = true; + // + // panel1 + // + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(6, 183); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(496, 5); + this.panel1.TabIndex = 11; + // + // lb2 + // + this.lb2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb2.BackColor2 = System.Drawing.Color.Gray; + this.lb2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb2.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb2.BorderSize = new System.Windows.Forms.Padding(1); + this.lb2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb2.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb2.Dock = System.Windows.Forms.DockStyle.Top; + this.lb2.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb2.ForeColor = System.Drawing.Color.White; + this.lb2.GradientEnable = true; + this.lb2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb2.GradientRepeatBG = false; + this.lb2.isButton = false; + this.lb2.Location = new System.Drawing.Point(6, 133); + this.lb2.MouseDownColor = System.Drawing.Color.Yellow; + this.lb2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb2.msg = null; + this.lb2.Name = "lb2"; + this.lb2.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb2.ProgressEnable = false; + this.lb2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb2.ProgressForeColor = System.Drawing.Color.Black; + this.lb2.ProgressMax = 100F; + this.lb2.ProgressMin = 0F; + this.lb2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb2.ProgressValue = 0F; + this.lb2.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb2.Sign = ""; + this.lb2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb2.SignColor = System.Drawing.Color.Yellow; + this.lb2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb2.Size = new System.Drawing.Size(496, 50); + this.lb2.TabIndex = 4; + this.lb2.Text = "* 호출 위치 : F1"; + this.lb2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb2.TextShadow = true; + this.lb2.TextVisible = true; + // + // panel4 + // + this.panel4.Dock = System.Windows.Forms.DockStyle.Top; + this.panel4.Location = new System.Drawing.Point(6, 128); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(496, 5); + this.panel4.TabIndex = 14; + // + // lb1 + // + this.lb1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb1.BackColor2 = System.Drawing.Color.Gray; + this.lb1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb1.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb1.BorderSize = new System.Windows.Forms.Padding(1); + this.lb1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb1.Dock = System.Windows.Forms.DockStyle.Top; + this.lb1.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb1.ForeColor = System.Drawing.Color.White; + this.lb1.GradientEnable = true; + this.lb1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb1.GradientRepeatBG = false; + this.lb1.isButton = false; + this.lb1.Location = new System.Drawing.Point(6, 78); + this.lb1.MouseDownColor = System.Drawing.Color.Yellow; + this.lb1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb1.msg = null; + this.lb1.Name = "lb1"; + this.lb1.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb1.ProgressEnable = false; + this.lb1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb1.ProgressForeColor = System.Drawing.Color.Black; + this.lb1.ProgressMax = 100F; + this.lb1.ProgressMin = 0F; + this.lb1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb1.ProgressValue = 0F; + this.lb1.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb1.Sign = ""; + this.lb1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb1.SignColor = System.Drawing.Color.Yellow; + this.lb1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb1.Size = new System.Drawing.Size(496, 50); + this.lb1.TabIndex = 2; + this.lb1.Text = "* 작업 : 상차"; + this.lb1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb1.TextShadow = true; + this.lb1.TextVisible = true; + // + // panel8 + // + this.panel8.Dock = System.Windows.Forms.DockStyle.Top; + this.panel8.Location = new System.Drawing.Point(6, 73); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(496, 5); + this.panel8.TabIndex = 18; + // + // lbTitle + // + this.lbTitle.BackColor = System.Drawing.Color.Brown; + this.lbTitle.BackColor2 = System.Drawing.Color.Tomato; + this.lbTitle.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbTitle.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbTitle.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderSize = new System.Windows.Forms.Padding(1); + this.lbTitle.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbTitle.Cursor = System.Windows.Forms.Cursors.Hand; + this.lbTitle.Dock = System.Windows.Forms.DockStyle.Top; + this.lbTitle.Font = new System.Drawing.Font("맑은 고딕", 22F, System.Drawing.FontStyle.Bold); + this.lbTitle.ForeColor = System.Drawing.Color.WhiteSmoke; + this.lbTitle.GradientEnable = true; + this.lbTitle.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Horizontal; + this.lbTitle.GradientRepeatBG = false; + this.lbTitle.isButton = true; + this.lbTitle.Location = new System.Drawing.Point(6, 6); + this.lbTitle.MouseDownColor = System.Drawing.Color.Yellow; + this.lbTitle.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbTitle.msg = null; + this.lbTitle.Name = "lbTitle"; + this.lbTitle.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbTitle.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbTitle.ProgressEnable = false; + this.lbTitle.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbTitle.ProgressForeColor = System.Drawing.Color.Black; + this.lbTitle.ProgressMax = 100F; + this.lbTitle.ProgressMin = 0F; + this.lbTitle.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbTitle.ProgressValue = 0F; + this.lbTitle.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.lbTitle.Sign = ""; + this.lbTitle.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbTitle.SignColor = System.Drawing.Color.Yellow; + this.lbTitle.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbTitle.Size = new System.Drawing.Size(496, 67); + this.lbTitle.TabIndex = 3; + this.lbTitle.Text = "작업 설정"; + this.lbTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbTitle.TextShadow = true; + this.lbTitle.TextVisible = true; + this.lbTitle.Click += new System.EventHandler(this.lbTitle_Click); + // + // fJobSelect + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.ClientSize = new System.Drawing.Size(518, 415); + this.Controls.Add(this.arPanel1); + this.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.KeyPreview = true; + this.MaximizeBox = false; + this.Name = "fJobSelect"; + this.Padding = new System.Windows.Forms.Padding(5); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Message Window"; + this.TopMost = true; + this.Load += new System.EventHandler(this.fMsg_Load); + this.arPanel1.ResumeLayout(false); + this.panButton.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public arCtl.arLabel lb1; + private arCtl.arPanel arPanel1; + public arCtl.arLabel lbTitle; + public arCtl.arLabel lb5; + public arCtl.arLabel lb4; + public arCtl.arLabel lb3; + public arCtl.arLabel lb2; + private System.Windows.Forms.Timer tmBlink; + public arCtl.arLabel btYes; + public arCtl.arLabel btNo; + private System.Windows.Forms.Panel panButton; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Panel panel8; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fJobSelect.cs b/Cs_HMI/Project/Dialog/fJobSelect.cs new file mode 100644 index 0000000..fa491e0 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fJobSelect.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fJobSelect : Form + { + private Boolean fMove = false; + private Point MDownPos; + private string _msg = string.Empty; + + public fJobSelect() + { + InitializeComponent(); + } + + public fJobSelect(string msg) + { + InitializeComponent(); + this.FormClosing += fMsgWindow_FormClosing; + this.KeyDown += FJobSelect_KeyDown; + this._msg = msg; + setMessage(msg); + this.lbTitle.MouseMove += label1_MouseMove; + lbTitle.MouseUp += label1_MouseUp; + lbTitle.MouseDown += label1_MouseDown; + lbTitle.MouseDoubleClick += label1_MouseDoubleClick; + } + + void fMsgWindow_FormClosing(object sender, FormClosingEventArgs e) + { + + } + + private void fMsg_Load(object sender, EventArgs e) + { + + } + private void FJobSelect_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + e.Handled = true; + e.SuppressKeyPress = false; + DialogResult = DialogResult.Cancel; + this.Close(); + } + else if (e.KeyCode == Keys.F5) + btYes.PerformClick(); + } + + public void setMessage(string msg) + { + //msg를 분리해서 표시를 한다. + var lbs = new arCtl.arLabel[] { lbTitle, lb1, lb2, lb3, lb4, lb5 }; + var lineBuf = msg.Replace("\r", "").Split('\n'); + int maxLine = Math.Min(lbs.Length, lineBuf.Length); + + for (int i = 0; i < lbs.Length; i++) //최대줄을 넘어가는건 표시불가 + { + if (i >= lineBuf.Length) + { + lbs[i].Text = string.Empty; + } + else + { + if (i > 0) lbs[i].Text = string.Format("{0}. {1}", i, lineBuf[i]); + else lbs[i].Text = lineBuf[i]; + } + + } + } + + + + private void label1_MouseMove(object sender, MouseEventArgs e) + { + if (fMove) + { + Point offset = new Point(e.X - MDownPos.X, e.Y - MDownPos.Y); + this.Left += offset.X; + this.Top += offset.Y; + offset = new Point(0, 0); + } + } + + private void label1_MouseUp(object sender, MouseEventArgs e) + { + fMove = false; + } + + private void label1_MouseDown(object sender, MouseEventArgs e) + { + MDownPos = new Point(e.X, e.Y); + fMove = true; + } + + private void label1_MouseDoubleClick(object sender, MouseEventArgs e) + { + + + } + public enum EWinColor + { + Attention = 0, + Error, + Information + } + + public void SetWindowColor(EWinColor wincolor) + { + switch (wincolor) + { + case EWinColor.Attention: + lbTitle.BackColor = Color.Gold; + lbTitle.BackColor2 = Color.Orange; + lbTitle.ShadowColor = Color.FromArgb(150, 150, 150); + lbTitle.ForeColor = Color.FromArgb(50, 50, 50); + break; + case EWinColor.Error: + lbTitle.BackColor = Color.Brown; + lbTitle.BackColor2 = Color.Tomato; + lbTitle.ShadowColor = Color.FromArgb(50, 50, 50); + lbTitle.ForeColor = Color.WhiteSmoke; + break; + default: + lbTitle.BackColor = Color.DarkTurquoise; + lbTitle.BackColor2 = Color.LightSkyBlue; + lbTitle.ShadowColor = Color.FromArgb(50, 50, 50); + lbTitle.ForeColor = Color.WhiteSmoke; + break; + } + } + + private void lbTitle_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + + private void tmBlink_Tick(object sender, EventArgs e) + { + var bg1 = lbTitle.BackColor; + var bg2 = lbTitle.BackColor2; + lbTitle.BackColor = bg2; + lbTitle.BackColor2 = bg1; + } + + private void btYes_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Yes; + this.Close(); + } + + private void btNo_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + this.Close(); + + } + } +} diff --git a/Cs_HMI/Project/Dialog/fJobSelect.resx b/Cs_HMI/Project/Dialog/fJobSelect.resx new file mode 100644 index 0000000..fcee611 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fJobSelect.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fLog.Designer.cs b/Cs_HMI/Project/Dialog/fLog.Designer.cs new file mode 100644 index 0000000..189793f --- /dev/null +++ b/Cs_HMI/Project/Dialog/fLog.Designer.cs @@ -0,0 +1,211 @@ +namespace Project.Dialog +{ + partial class fLog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.rtsys = new arCtl.LogTextBox(); + this.rtTx = new arCtl.LogTextBox(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.rtAGV = new arCtl.LogTextBox(); + this.rtPLC = new arCtl.LogTextBox(); + this.rtBMS = new arCtl.LogTextBox(); + this.rtCAL = new arCtl.LogTextBox(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // rtsys + // + this.rtsys.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.rtsys.ColorList = new arCtl.sLogMessageColor[0]; + this.tableLayoutPanel1.SetColumnSpan(this.rtsys, 2); + this.rtsys.DateFormat = "mm:ss.fff"; + this.rtsys.DefaultColor = System.Drawing.Color.LightGray; + this.rtsys.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtsys.EnableDisplayTimer = false; + this.rtsys.EnableGubunColor = true; + this.rtsys.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtsys.ListFormat = "[{0}] {1}"; + this.rtsys.Location = new System.Drawing.Point(3, 3); + this.rtsys.MaxListCount = ((ushort)(1000)); + this.rtsys.MaxTextLength = ((uint)(400000u)); + this.rtsys.MessageInterval = 50; + this.rtsys.Name = "rtsys"; + this.rtsys.Size = new System.Drawing.Size(334, 340); + this.rtsys.TabIndex = 0; + this.rtsys.Text = ""; + // + // rtTx + // + this.rtTx.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.rtTx.ColorList = new arCtl.sLogMessageColor[0]; + this.tableLayoutPanel1.SetColumnSpan(this.rtTx, 2); + this.rtTx.DateFormat = "mm:ss.fff"; + this.rtTx.DefaultColor = System.Drawing.Color.LightGray; + this.rtTx.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtTx.EnableDisplayTimer = false; + this.rtTx.EnableGubunColor = true; + this.rtTx.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtTx.ListFormat = "[{0}] {1}"; + this.rtTx.Location = new System.Drawing.Point(343, 3); + this.rtTx.MaxListCount = ((ushort)(1000)); + this.rtTx.MaxTextLength = ((uint)(400000u)); + this.rtTx.MessageInterval = 50; + this.rtTx.Name = "rtTx"; + this.rtTx.Size = new System.Drawing.Size(335, 340); + this.rtTx.TabIndex = 1; + this.rtTx.Text = ""; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 4; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Controls.Add(this.rtAGV, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.rtsys, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.rtTx, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.rtPLC, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.rtBMS, 2, 1); + this.tableLayoutPanel1.Controls.Add(this.rtCAL, 3, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 70F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(681, 495); + this.tableLayoutPanel1.TabIndex = 2; + // + // rtAGV + // + this.rtAGV.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.rtAGV.ColorList = new arCtl.sLogMessageColor[0]; + this.rtAGV.DateFormat = "mm:ss.fff"; + this.rtAGV.DefaultColor = System.Drawing.Color.LightGray; + this.rtAGV.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtAGV.EnableDisplayTimer = false; + this.rtAGV.EnableGubunColor = true; + this.rtAGV.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtAGV.ListFormat = "[{0}] {1}"; + this.rtAGV.Location = new System.Drawing.Point(3, 349); + this.rtAGV.MaxListCount = ((ushort)(1000)); + this.rtAGV.MaxTextLength = ((uint)(400000u)); + this.rtAGV.MessageInterval = 50; + this.rtAGV.Name = "rtAGV"; + this.rtAGV.Size = new System.Drawing.Size(164, 143); + this.rtAGV.TabIndex = 2; + this.rtAGV.Text = ""; + // + // rtPLC + // + this.rtPLC.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.rtPLC.ColorList = new arCtl.sLogMessageColor[0]; + this.rtPLC.DateFormat = "mm:ss.fff"; + this.rtPLC.DefaultColor = System.Drawing.Color.LightGray; + this.rtPLC.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtPLC.EnableDisplayTimer = false; + this.rtPLC.EnableGubunColor = true; + this.rtPLC.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtPLC.ListFormat = "[{0}] {1}"; + this.rtPLC.Location = new System.Drawing.Point(173, 349); + this.rtPLC.MaxListCount = ((ushort)(1000)); + this.rtPLC.MaxTextLength = ((uint)(400000u)); + this.rtPLC.MessageInterval = 50; + this.rtPLC.Name = "rtPLC"; + this.rtPLC.Size = new System.Drawing.Size(164, 143); + this.rtPLC.TabIndex = 2; + this.rtPLC.Text = ""; + // + // rtBMS + // + this.rtBMS.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.rtBMS.ColorList = new arCtl.sLogMessageColor[0]; + this.rtBMS.DateFormat = "mm:ss.fff"; + this.rtBMS.DefaultColor = System.Drawing.Color.LightGray; + this.rtBMS.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtBMS.EnableDisplayTimer = false; + this.rtBMS.EnableGubunColor = true; + this.rtBMS.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtBMS.ListFormat = "[{0}] {1}"; + this.rtBMS.Location = new System.Drawing.Point(343, 349); + this.rtBMS.MaxListCount = ((ushort)(1000)); + this.rtBMS.MaxTextLength = ((uint)(400000u)); + this.rtBMS.MessageInterval = 50; + this.rtBMS.Name = "rtBMS"; + this.rtBMS.Size = new System.Drawing.Size(164, 143); + this.rtBMS.TabIndex = 2; + this.rtBMS.Text = ""; + // + // rtCAL + // + this.rtCAL.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.rtCAL.ColorList = new arCtl.sLogMessageColor[0]; + this.rtCAL.DateFormat = "mm:ss.fff"; + this.rtCAL.DefaultColor = System.Drawing.Color.LightGray; + this.rtCAL.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtCAL.EnableDisplayTimer = false; + this.rtCAL.EnableGubunColor = true; + this.rtCAL.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtCAL.ListFormat = "[{0}] {1}"; + this.rtCAL.Location = new System.Drawing.Point(513, 349); + this.rtCAL.MaxListCount = ((ushort)(1000)); + this.rtCAL.MaxTextLength = ((uint)(400000u)); + this.rtCAL.MessageInterval = 50; + this.rtCAL.Name = "rtCAL"; + this.rtCAL.Size = new System.Drawing.Size(165, 143); + this.rtCAL.TabIndex = 2; + this.rtCAL.Text = ""; + // + // fLog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(681, 495); + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "fLog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "fLog"; + this.TopMost = true; + this.Load += new System.EventHandler(this.fLog_Load); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private arCtl.LogTextBox rtsys; + private arCtl.LogTextBox rtTx; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private arCtl.LogTextBox rtAGV; + private arCtl.LogTextBox rtPLC; + private arCtl.LogTextBox rtBMS; + private arCtl.LogTextBox rtCAL; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fLog.cs b/Cs_HMI/Project/Dialog/fLog.cs new file mode 100644 index 0000000..be655ad --- /dev/null +++ b/Cs_HMI/Project/Dialog/fLog.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fLog : Form + { + public fLog() + { + InitializeComponent(); + this.FormClosed += FLog_FormClosed; + } + + private void FLog_FormClosed(object sender, FormClosedEventArgs e) + { + PUB.log.RaiseMsg -= Log_RaiseMsg; + PUB.logagv.RaiseMsg -= Log_RaiseMsgagv; + PUB.logplc.RaiseMsg -= Log_RaiseMsgplc; + PUB.logbms.RaiseMsg -= Log_RaiseMsgbms; + PUB.logcal.RaiseMsg -= Log_RaiseMsgcal; + } + + private void fLog_Load(object sender, EventArgs e) + { + + var colorlist = new arCtl.sLogMessageColor[] + { + new arCtl.sLogMessageColor("NOR",Color.Black), + new arCtl.sLogMessageColor("NORM",Color.Black), + new arCtl.sLogMessageColor("NORMAL",Color.Black), + new arCtl.sLogMessageColor("ERR",Color.Red), + new arCtl.sLogMessageColor("FLAG",Color.Magenta), + new arCtl.sLogMessageColor("TX",Color.SkyBlue), + new arCtl.sLogMessageColor("SETUP",Color.Gold), + new arCtl.sLogMessageColor("MFLAG",Color.BlueViolet), + }; + this.rtsys.ColorList = colorlist; + this.rtTx.ColorList = colorlist; + this.rtAGV.ColorList = colorlist; + + PUB.log.RaiseMsg += Log_RaiseMsg; + PUB.logagv.RaiseMsg += Log_RaiseMsgagv; + PUB.logplc.RaiseMsg += Log_RaiseMsgplc; + PUB.logbms.RaiseMsg += Log_RaiseMsgbms; + PUB.logcal.RaiseMsg += Log_RaiseMsgcal; + } + + private void Log_RaiseMsg(DateTime LogTime, string TypeStr, string Message) + { + showlog(rtsys,LogTime, TypeStr, Message); + } + private void Log_RaiseMsgagv(DateTime LogTime, string TypeStr, string Message) + { + showlog(rtAGV, LogTime, TypeStr, Message); + } + private void Log_RaiseMsgplc(DateTime LogTime, string TypeStr, string Message) + { + showlog(rtPLC, LogTime, TypeStr, Message); + } + private void Log_RaiseMsgbms(DateTime LogTime, string TypeStr, string Message) + { + showlog(rtBMS, LogTime, TypeStr, Message); + } + private void Log_RaiseMsgcal(DateTime LogTime, string TypeStr, string Message) + { + showlog(rtCAL, LogTime, TypeStr, Message); + } + void showlog(arCtl.LogTextBox rtRx, DateTime LogTime, string TypeStr, string Message) + { + if (rtRx.Visible) + { + rtRx.AddMsg(LogTime, TypeStr, Message); + } + } + } +} diff --git a/Cs_HMI/Project/Dialog/fLog.resx b/Cs_HMI/Project/Dialog/fLog.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/Project/Dialog/fLog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fPassword.Designer.cs b/Cs_HMI/Project/Dialog/fPassword.Designer.cs new file mode 100644 index 0000000..53ec8a5 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fPassword.Designer.cs @@ -0,0 +1,93 @@ +namespace Project.Dialog +{ + partial class fPassword + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fPassword)); + this.tbInput = new System.Windows.Forms.TextBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.touchKey1 = new arCtl.TouchKey(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // tbInput + // + this.tbInput.Font = new System.Drawing.Font("Calibri", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tbInput.Location = new System.Drawing.Point(26, 140); + this.tbInput.Name = "tbInput"; + this.tbInput.PasswordChar = '●'; + this.tbInput.Size = new System.Drawing.Size(235, 40); + this.tbInput.TabIndex = 1; + this.tbInput.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(91, 23); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(96, 96); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 3; + this.pictureBox1.TabStop = false; + // + // touchKey1 + // + this.touchKey1.Location = new System.Drawing.Point(26, 194); + this.touchKey1.Margin = new System.Windows.Forms.Padding(6, 11, 6, 11); + this.touchKey1.Name = "touchKey1"; + this.touchKey1.Size = new System.Drawing.Size(235, 260); + this.touchKey1.TabIndex = 5; + this.touchKey1.keyClick += new arCtl.TouchKey.KeyClickHandler(this.touchKey1_keyClick); + // + // fPassword + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(284, 470); + this.Controls.Add(this.touchKey1); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.tbInput); + this.Font = new System.Drawing.Font("Calibri", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "fPassword"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Enter Password"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + public System.Windows.Forms.TextBox tbInput; + private arCtl.TouchKey touchKey1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fPassword.cs b/Cs_HMI/Project/Dialog/fPassword.cs new file mode 100644 index 0000000..8f26597 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fPassword.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fPassword : Form + { + public fPassword() + { + InitializeComponent(); + this.tbInput.KeyDown += (s1, e1) => { if (e1.KeyCode == Keys.Enter) Confirm(); }; + this.KeyPreview = true; + this.KeyDown += (s1, e1) => { + if (e1.KeyCode == Keys.Escape) this.Close(); + }; + } + + private void Confirm() + { + string id = tbInput.Text.Trim(); + if (id.isEmpty()) + { + tbInput.Focus(); + return; + } + DialogResult = DialogResult.OK; + } + + private void touchKey1_keyClick(string key) + { + if (key == "BACK" || key == "◁") + { + if (!tbInput.Text.isEmpty()) + { + if (tbInput.Text.Length == 1) tbInput.Text = ""; + else tbInput.Text = tbInput.Text.Substring(0, tbInput.Text.Length - 1); + } + //if (tbInput.Text == "") tbInput.Text = "0"; + } + else if (key == "CLEAR" || key == "RESET" || key == "◀") + { + tbInput.Text = "0"; + } + else if (key == "ENTER" || key == "ENT") + { + Confirm(); + } + else + { + if (tbInput.SelectionLength > 0 && tbInput.Text.Length == tbInput.SelectionLength) + { + tbInput.Text = key; + } + else if (tbInput.SelectionLength > 0) + { + //선택된 영역을 대체해준다. + tbInput.SelectedText = key; + } + else tbInput.Text += key; + + } + + tbInput.SelectionLength = 0; + if (!tbInput.Text.isEmpty()) + tbInput.SelectionStart = tbInput.Text.Length; + } + } +} diff --git a/Cs_HMI/Project/Dialog/fPassword.resx b/Cs_HMI/Project/Dialog/fPassword.resx new file mode 100644 index 0000000..f165537 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fPassword.resx @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fSystem.Designer.cs b/Cs_HMI/Project/Dialog/fSystem.Designer.cs new file mode 100644 index 0000000..3713c64 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fSystem.Designer.cs @@ -0,0 +1,557 @@ +namespace Project.Dialog +{ + partial class fSystem + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lbMsg = new arCtl.arLabel(); + this.arLabel4 = new arCtl.arLabel(); + this.arLabel9 = new arCtl.arLabel(); + this.arLabel10 = new arCtl.arLabel(); + this.arLabel1 = new arCtl.arLabel(); + this.arLabel6 = new arCtl.arLabel(); + this.arLabel2 = new arCtl.arLabel(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.arLabel3 = new arCtl.arLabel(); + this.arLabel5 = new arCtl.arLabel(); + this.arLabel7 = new arCtl.arLabel(); + this.SuspendLayout(); + // + // lbMsg + // + this.lbMsg.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.lbMsg.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.lbMsg.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbMsg.BorderColor = System.Drawing.Color.LightSkyBlue; + this.lbMsg.BorderColorOver = System.Drawing.Color.Red; + this.lbMsg.BorderSize = new System.Windows.Forms.Padding(1); + this.lbMsg.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbMsg.Cursor = System.Windows.Forms.Cursors.Hand; + this.lbMsg.Font = new System.Drawing.Font("Consolas", 12F); + this.lbMsg.ForeColor = System.Drawing.Color.White; + this.lbMsg.GradientEnable = true; + this.lbMsg.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lbMsg.GradientRepeatBG = true; + this.lbMsg.isButton = true; + this.lbMsg.Location = new System.Drawing.Point(9, 8); + this.lbMsg.Margin = new System.Windows.Forms.Padding(5); + this.lbMsg.MouseDownColor = System.Drawing.Color.Yellow; + this.lbMsg.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbMsg.msg = null; + this.lbMsg.Name = "lbMsg"; + this.lbMsg.ProgressBorderColor = System.Drawing.Color.Black; + this.lbMsg.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbMsg.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbMsg.ProgressEnable = false; + this.lbMsg.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbMsg.ProgressForeColor = System.Drawing.Color.Black; + this.lbMsg.ProgressMax = 100F; + this.lbMsg.ProgressMin = 0F; + this.lbMsg.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbMsg.ProgressValue = 0F; + this.lbMsg.ShadowColor = System.Drawing.Color.Black; + this.lbMsg.Sign = ""; + this.lbMsg.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbMsg.SignColor = System.Drawing.Color.Yellow; + this.lbMsg.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbMsg.Size = new System.Drawing.Size(165, 100); + this.lbMsg.TabIndex = 2; + this.lbMsg.Text = "폴더열기"; + this.lbMsg.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbMsg.TextShadow = true; + this.lbMsg.TextVisible = true; + this.lbMsg.Click += new System.EventHandler(this.lbMsg_Click); + // + // arLabel4 + // + this.arLabel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel4.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.arLabel4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel4.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel4.BorderColorOver = System.Drawing.Color.Red; + this.arLabel4.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel4.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel4.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel4.ForeColor = System.Drawing.Color.White; + this.arLabel4.GradientEnable = true; + this.arLabel4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel4.GradientRepeatBG = true; + this.arLabel4.isButton = true; + this.arLabel4.Location = new System.Drawing.Point(9, 387); + this.arLabel4.Margin = new System.Windows.Forms.Padding(5); + this.arLabel4.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel4.msg = null; + this.arLabel4.Name = "arLabel4"; + this.arLabel4.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel4.ProgressEnable = false; + this.arLabel4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel4.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel4.ProgressMax = 100F; + this.arLabel4.ProgressMin = 0F; + this.arLabel4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel4.ProgressValue = 0F; + this.arLabel4.ShadowColor = System.Drawing.Color.Black; + this.arLabel4.Sign = ""; + this.arLabel4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel4.SignColor = System.Drawing.Color.Yellow; + this.arLabel4.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel4.Size = new System.Drawing.Size(503, 51); + this.arLabel4.TabIndex = 2; + this.arLabel4.Text = "닫기"; + this.arLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel4.TextShadow = true; + this.arLabel4.TextVisible = true; + this.arLabel4.Click += new System.EventHandler(this.arLabel4_Click); + // + // arLabel9 + // + this.arLabel9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel9.BackColor2 = System.Drawing.Color.Red; + this.arLabel9.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel9.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel9.BorderColorOver = System.Drawing.Color.Red; + this.arLabel9.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel9.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel9.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel9.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel9.ForeColor = System.Drawing.Color.White; + this.arLabel9.GradientEnable = true; + this.arLabel9.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel9.GradientRepeatBG = true; + this.arLabel9.isButton = true; + this.arLabel9.Location = new System.Drawing.Point(9, 112); + this.arLabel9.Margin = new System.Windows.Forms.Padding(5); + this.arLabel9.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel9.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel9.msg = null; + this.arLabel9.Name = "arLabel9"; + this.arLabel9.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel9.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel9.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel9.ProgressEnable = false; + this.arLabel9.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel9.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel9.ProgressMax = 100F; + this.arLabel9.ProgressMin = 0F; + this.arLabel9.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel9.ProgressValue = 0F; + this.arLabel9.ShadowColor = System.Drawing.Color.Black; + this.arLabel9.Sign = ""; + this.arLabel9.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel9.SignColor = System.Drawing.Color.Yellow; + this.arLabel9.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel9.Size = new System.Drawing.Size(165, 100); + this.arLabel9.TabIndex = 2; + this.arLabel9.Text = "시스템 종료"; + this.arLabel9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel9.TextShadow = true; + this.arLabel9.TextVisible = true; + this.arLabel9.Click += new System.EventHandler(this.arLabel9_Click); + // + // arLabel10 + // + this.arLabel10.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel10.BackColor2 = System.Drawing.Color.DarkBlue; + this.arLabel10.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel10.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel10.BorderColorOver = System.Drawing.Color.Red; + this.arLabel10.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel10.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel10.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel10.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel10.ForeColor = System.Drawing.Color.White; + this.arLabel10.GradientEnable = true; + this.arLabel10.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel10.GradientRepeatBG = true; + this.arLabel10.isButton = true; + this.arLabel10.Location = new System.Drawing.Point(178, 112); + this.arLabel10.Margin = new System.Windows.Forms.Padding(5); + this.arLabel10.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel10.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel10.msg = null; + this.arLabel10.Name = "arLabel10"; + this.arLabel10.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel10.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel10.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel10.ProgressEnable = false; + this.arLabel10.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel10.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel10.ProgressMax = 100F; + this.arLabel10.ProgressMin = 0F; + this.arLabel10.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel10.ProgressValue = 0F; + this.arLabel10.ShadowColor = System.Drawing.Color.Black; + this.arLabel10.Sign = ""; + this.arLabel10.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel10.SignColor = System.Drawing.Color.Yellow; + this.arLabel10.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel10.Size = new System.Drawing.Size(165, 100); + this.arLabel10.TabIndex = 2; + this.arLabel10.Text = "시스템 재시작"; + this.arLabel10.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel10.TextShadow = true; + this.arLabel10.TextVisible = true; + this.arLabel10.Click += new System.EventHandler(this.arLabel10_Click); + // + // arLabel1 + // + this.arLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.arLabel1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel1.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel1.BorderColorOver = System.Drawing.Color.Red; + this.arLabel1.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel1.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel1.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel1.ForeColor = System.Drawing.Color.White; + this.arLabel1.GradientEnable = true; + this.arLabel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel1.GradientRepeatBG = true; + this.arLabel1.isButton = true; + this.arLabel1.Location = new System.Drawing.Point(347, 8); + this.arLabel1.Margin = new System.Windows.Forms.Padding(5); + this.arLabel1.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel1.msg = null; + this.arLabel1.Name = "arLabel1"; + this.arLabel1.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel1.ProgressEnable = false; + this.arLabel1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel1.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel1.ProgressMax = 100F; + this.arLabel1.ProgressMin = 0F; + this.arLabel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel1.ProgressValue = 0F; + this.arLabel1.ShadowColor = System.Drawing.Color.Black; + this.arLabel1.Sign = ""; + this.arLabel1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel1.SignColor = System.Drawing.Color.Yellow; + this.arLabel1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel1.Size = new System.Drawing.Size(165, 100); + this.arLabel1.TabIndex = 2; + this.arLabel1.Text = "시작메뉴"; + this.arLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel1.TextShadow = true; + this.arLabel1.TextVisible = true; + this.arLabel1.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel6 + // + this.arLabel6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel6.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.arLabel6.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel6.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel6.BorderColorOver = System.Drawing.Color.Red; + this.arLabel6.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel6.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel6.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel6.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel6.ForeColor = System.Drawing.Color.White; + this.arLabel6.GradientEnable = true; + this.arLabel6.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel6.GradientRepeatBG = true; + this.arLabel6.isButton = true; + this.arLabel6.Location = new System.Drawing.Point(178, 8); + this.arLabel6.Margin = new System.Windows.Forms.Padding(5); + this.arLabel6.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel6.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel6.msg = null; + this.arLabel6.Name = "arLabel6"; + this.arLabel6.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel6.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel6.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel6.ProgressEnable = false; + this.arLabel6.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel6.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel6.ProgressMax = 100F; + this.arLabel6.ProgressMin = 0F; + this.arLabel6.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel6.ProgressValue = 0F; + this.arLabel6.ShadowColor = System.Drawing.Color.Black; + this.arLabel6.Sign = ""; + this.arLabel6.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel6.SignColor = System.Drawing.Color.Yellow; + this.arLabel6.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel6.Size = new System.Drawing.Size(165, 100); + this.arLabel6.TabIndex = 2; + this.arLabel6.Text = "작업관리자"; + this.arLabel6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel6.TextShadow = true; + this.arLabel6.TextVisible = true; + this.arLabel6.Click += new System.EventHandler(this.arLabel6_Click); + // + // arLabel2 + // + this.arLabel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel2.BackColor2 = System.Drawing.Color.DarkBlue; + this.arLabel2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel2.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel2.BorderColorOver = System.Drawing.Color.Red; + this.arLabel2.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel2.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel2.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel2.ForeColor = System.Drawing.Color.White; + this.arLabel2.GradientEnable = true; + this.arLabel2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel2.GradientRepeatBG = true; + this.arLabel2.isButton = true; + this.arLabel2.Location = new System.Drawing.Point(347, 112); + this.arLabel2.Margin = new System.Windows.Forms.Padding(5); + this.arLabel2.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel2.msg = null; + this.arLabel2.Name = "arLabel2"; + this.arLabel2.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel2.ProgressEnable = false; + this.arLabel2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel2.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel2.ProgressMax = 100F; + this.arLabel2.ProgressMin = 0F; + this.arLabel2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel2.ProgressValue = 0F; + this.arLabel2.ShadowColor = System.Drawing.Color.Black; + this.arLabel2.Sign = ""; + this.arLabel2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel2.SignColor = System.Drawing.Color.Yellow; + this.arLabel2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel2.Size = new System.Drawing.Size(165, 100); + this.arLabel2.TabIndex = 2; + this.arLabel2.Text = "Process List"; + this.arLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel2.TextShadow = true; + this.arLabel2.TextVisible = true; + this.arLabel2.Click += new System.EventHandler(this.arLabel2_Click); + // + // label1 + // + this.label1.Font = new System.Drawing.Font("맑은 고딕", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(9, 327); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(515, 23); + this.label1.TabIndex = 3; + this.label1.Text = "label1"; + // + // label2 + // + this.label2.Font = new System.Drawing.Font("맑은 고딕", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(9, 359); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(515, 23); + this.label2.TabIndex = 3; + this.label2.Text = "label1"; + // + // arLabel3 + // + this.arLabel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel3.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.arLabel3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel3.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel3.BorderColorOver = System.Drawing.Color.Red; + this.arLabel3.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel3.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel3.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel3.ForeColor = System.Drawing.Color.White; + this.arLabel3.GradientEnable = true; + this.arLabel3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel3.GradientRepeatBG = true; + this.arLabel3.isButton = true; + this.arLabel3.Location = new System.Drawing.Point(9, 216); + this.arLabel3.Margin = new System.Windows.Forms.Padding(5); + this.arLabel3.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel3.msg = null; + this.arLabel3.Name = "arLabel3"; + this.arLabel3.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel3.ProgressEnable = false; + this.arLabel3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel3.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel3.ProgressMax = 100F; + this.arLabel3.ProgressMin = 0F; + this.arLabel3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel3.ProgressValue = 0F; + this.arLabel3.ShadowColor = System.Drawing.Color.Black; + this.arLabel3.Sign = ""; + this.arLabel3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel3.SignColor = System.Drawing.Color.Yellow; + this.arLabel3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel3.Size = new System.Drawing.Size(165, 100); + this.arLabel3.TabIndex = 4; + this.arLabel3.Text = "Emulator"; + this.arLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel3.TextShadow = true; + this.arLabel3.TextVisible = true; + this.arLabel3.Click += new System.EventHandler(this.arLabel3_Click); + // + // arLabel5 + // + this.arLabel5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel5.BackColor2 = System.Drawing.Color.Pink; + this.arLabel5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel5.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel5.BorderColorOver = System.Drawing.Color.Red; + this.arLabel5.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel5.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel5.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel5.ForeColor = System.Drawing.Color.White; + this.arLabel5.GradientEnable = true; + this.arLabel5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel5.GradientRepeatBG = true; + this.arLabel5.isButton = true; + this.arLabel5.Location = new System.Drawing.Point(178, 216); + this.arLabel5.Margin = new System.Windows.Forms.Padding(5); + this.arLabel5.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel5.msg = null; + this.arLabel5.Name = "arLabel5"; + this.arLabel5.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel5.ProgressEnable = false; + this.arLabel5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel5.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel5.ProgressMax = 100F; + this.arLabel5.ProgressMin = 0F; + this.arLabel5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel5.ProgressValue = 0F; + this.arLabel5.ShadowColor = System.Drawing.Color.Black; + this.arLabel5.Sign = ""; + this.arLabel5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel5.SignColor = System.Drawing.Color.Yellow; + this.arLabel5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel5.Size = new System.Drawing.Size(165, 100); + this.arLabel5.TabIndex = 5; + this.arLabel5.Text = "패치파일 생성"; + this.arLabel5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel5.TextShadow = true; + this.arLabel5.TextVisible = true; + this.arLabel5.Click += new System.EventHandler(this.arLabel5_Click); + // + // arLabel7 + // + this.arLabel7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(72)))), ((int)(((byte)(72))))); + this.arLabel7.BackColor2 = System.Drawing.Color.DarkBlue; + this.arLabel7.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel7.BorderColor = System.Drawing.Color.LightSkyBlue; + this.arLabel7.BorderColorOver = System.Drawing.Color.Red; + this.arLabel7.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel7.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel7.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel7.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel7.ForeColor = System.Drawing.Color.White; + this.arLabel7.GradientEnable = true; + this.arLabel7.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel7.GradientRepeatBG = true; + this.arLabel7.isButton = true; + this.arLabel7.Location = new System.Drawing.Point(347, 216); + this.arLabel7.Margin = new System.Windows.Forms.Padding(5); + this.arLabel7.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel7.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel7.msg = null; + this.arLabel7.Name = "arLabel7"; + this.arLabel7.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel7.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel7.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel7.ProgressEnable = false; + this.arLabel7.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel7.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel7.ProgressMax = 100F; + this.arLabel7.ProgressMin = 0F; + this.arLabel7.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel7.ProgressValue = 0F; + this.arLabel7.ShadowColor = System.Drawing.Color.Black; + this.arLabel7.Sign = ""; + this.arLabel7.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel7.SignColor = System.Drawing.Color.Yellow; + this.arLabel7.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel7.Size = new System.Drawing.Size(165, 100); + this.arLabel7.TabIndex = 6; + this.arLabel7.Text = "자동 재시작"; + this.arLabel7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel7.TextShadow = true; + this.arLabel7.TextVisible = true; + this.arLabel7.Click += new System.EventHandler(this.arLabel7_Click); + // + // fSystem + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.ClientSize = new System.Drawing.Size(519, 451); + this.Controls.Add(this.arLabel7); + this.Controls.Add(this.arLabel5); + this.Controls.Add(this.arLabel3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.arLabel4); + this.Controls.Add(this.lbMsg); + this.Controls.Add(this.arLabel9); + this.Controls.Add(this.arLabel10); + this.Controls.Add(this.arLabel1); + this.Controls.Add(this.arLabel2); + this.Controls.Add(this.arLabel6); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "fSystem"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "fSystem"; + this.Load += new System.EventHandler(this.fSystem_Load); + this.ResumeLayout(false); + + } + + #endregion + private arCtl.arLabel lbMsg; + private arCtl.arLabel arLabel4; + private arCtl.arLabel arLabel6; + private arCtl.arLabel arLabel9; + private arCtl.arLabel arLabel10; + private arCtl.arLabel arLabel1; + private arCtl.arLabel arLabel2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private arCtl.arLabel arLabel3; + private arCtl.arLabel arLabel5; + private arCtl.arLabel arLabel7; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fSystem.cs b/Cs_HMI/Project/Dialog/fSystem.cs new file mode 100644 index 0000000..df01d81 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fSystem.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fSystem : Form + { + public bool shutdown = false; + public fSystem() + { + InitializeComponent(); + } + + private void button1_Click(object sender, EventArgs e) + { + Util.RunProcess(@"c:\windows\system32\shutdown.exe", "-r -t 5"); + } + + private void button2_Click(object sender, EventArgs e) + { + Util.RunProcess(@"c:\windows\system32\shutdown.exe", "-s -t 5"); + } + + private void button3_Click(object sender, EventArgs e) + { + + } + + private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void lbMsg_Click(object sender, EventArgs e) + { + string path = AppDomain.CurrentDomain.BaseDirectory; + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("explorer") + { + Arguments = path + }; + prc.StartInfo = si; + prc.Start(); + } + + private void arLabel1_Click(object sender, EventArgs e) + { + SendKeys.Send("^{ESC}"); + } + + private void arLabel6_Click(object sender, EventArgs e) + { + SendKeys.Send("^+{ESC}"); + } + + private void arLabel9_Click(object sender, EventArgs e) + { + shutdown = true; + Util.SystemShutdown(10); + this.Close(); + + } + + private void arLabel10_Click(object sender, EventArgs e) + { + shutdown = true; + Util.SystemReboot(10); + this.Close(); + } + + private void arLabel4_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void arLabel2_Click(object sender, EventArgs e) + { + System.Text.StringBuilder sb = new StringBuilder(); + + sb.AppendLine("Current : " + System.Diagnostics.Process.GetCurrentProcess().ProcessName); + + foreach (var prc in System.Diagnostics.Process.GetProcesses()) + { + if (prc.ProcessName.StartsWith("svchost")) continue; + sb.Append(" " + prc.ProcessName); + } + Util.MsgI(sb.ToString(),true); + } + + private void fSystem_Load(object sender, EventArgs e) + { + this.label1.Text = "Patch Version " + PUB.PatchVersion; + this.label2.Text = "HMI Version " + Application.ProductVersion.ToString(); + } + + private void arLabel3_Click(object sender, EventArgs e) + { + var file = System.IO.Path.Combine( Util.CurrentPath, "Emulator.exe"); + if(System.IO.File.Exists(file)==false) + { + Util.MsgE("에물레이터 실행 파일이 없습니다", true); + return; + } + + Util.RunProcess(file); + } + + private void arLabel5_Click(object sender, EventArgs e) + { + //현재 폴더에서 dll 과, amkor.exe 파일을 압축한다 + var path = new System.IO.DirectoryInfo( AppDomain.CurrentDomain.BaseDirectory); + var files_dll = path.GetFiles("*.dll"); + var file_exe = System.IO.Path.Combine(path.FullName, "amkor.exe"); + if(System.IO.File.Exists(file_exe)==false) + { + Util.MsgE("실행파일 amkor.exe 가 없습니다."); + return; + } + var zipfile = new Ionic.Zip.ZipFile(); + zipfile.AddFile(file_exe,"/"); + foreach (var filedll in files_dll) + zipfile.AddFile(filedll.FullName,"/"); + + var veri = Application.ProductVersion.Split('.'); + var newfilename = "Patch_AGV_" + veri[0] + veri[1]+ veri[2] + "_" + + veri[3] + ".zip"; + zipfile.Save(newfilename); + + Util.MsgI("다음 패치 파일이 생성됨\n" + newfilename); + } + + private void arLabel7_Click(object sender, EventArgs e) + { + Util.SystemReboot(5,true); + } + } +} diff --git a/Cs_HMI/Project/Dialog/fSystem.resx b/Cs_HMI/Project/Dialog/fSystem.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/Project/Dialog/fSystem.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fTouchKey.Designer.cs b/Cs_HMI/Project/Dialog/fTouchKey.Designer.cs new file mode 100644 index 0000000..bc8a913 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchKey.Designer.cs @@ -0,0 +1,60 @@ +namespace Project.Dialog +{ + partial class fTouchKey + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.touchKeyCalc1 = new arCtl.TouchKeyCalc(); + this.SuspendLayout(); + // + // touchKeyCalc1 + // + this.touchKeyCalc1.Dock = System.Windows.Forms.DockStyle.Fill; + this.touchKeyCalc1.Font = new System.Drawing.Font("Consolas", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.touchKeyCalc1.Location = new System.Drawing.Point(0, 0); + this.touchKeyCalc1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.touchKeyCalc1.Name = "touchKeyCalc1"; + this.touchKeyCalc1.Size = new System.Drawing.Size(374, 330); + this.touchKeyCalc1.TabIndex = 0; + // + // fTouchKey + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(374, 330); + this.Controls.Add(this.touchKeyCalc1); + this.Name = "fTouchKey"; + this.Text = "fTouchKey"; + this.ResumeLayout(false); + + } + + #endregion + + private arCtl.TouchKeyCalc touchKeyCalc1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fTouchKey.cs b/Cs_HMI/Project/Dialog/fTouchKey.cs new file mode 100644 index 0000000..050b630 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchKey.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fTouchKey : Form + { + public fTouchKey() + { + InitializeComponent(); + } + } +} diff --git a/Cs_HMI/Project/Dialog/fTouchKey.resx b/Cs_HMI/Project/Dialog/fTouchKey.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchKey.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fTouchKeyFull.Designer.cs b/Cs_HMI/Project/Dialog/fTouchKeyFull.Designer.cs new file mode 100644 index 0000000..d853398 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchKeyFull.Designer.cs @@ -0,0 +1,147 @@ +namespace Project.Dialog +{ + partial class fTouchKeyFull + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.touchKeyFull1 = new arCtl.TouchKeyFull(); + this.tbInput = new System.Windows.Forms.TextBox(); + this.lbTitle = new arCtl.arLabel(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // touchKeyFull1 + // + this.touchKeyFull1.Dock = System.Windows.Forms.DockStyle.Fill; + this.touchKeyFull1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.touchKeyFull1.Location = new System.Drawing.Point(6, 95); + this.touchKeyFull1.Name = "touchKeyFull1"; + this.touchKeyFull1.Size = new System.Drawing.Size(788, 230); + this.touchKeyFull1.TabIndex = 0; + this.touchKeyFull1.keyClick += new arCtl.TouchKeyFull.KeyClickHandler(this.touchKeyFull1_keyClick); + // + // tbInput + // + this.tbInput.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.tbInput.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.tbInput.Dock = System.Windows.Forms.DockStyle.Top; + this.tbInput.Font = new System.Drawing.Font("맑은 고딕", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.tbInput.ForeColor = System.Drawing.Color.White; + this.tbInput.Location = new System.Drawing.Point(6, 49); + this.tbInput.Name = "tbInput"; + this.tbInput.Size = new System.Drawing.Size(788, 46); + this.tbInput.TabIndex = 0; + this.tbInput.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // lbTitle + // + this.lbTitle.BackColor = System.Drawing.Color.Gray; + this.lbTitle.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lbTitle.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbTitle.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderColorOver = System.Drawing.Color.DarkBlue; + this.lbTitle.BorderSize = new System.Windows.Forms.Padding(1); + this.lbTitle.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbTitle.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbTitle.Dock = System.Windows.Forms.DockStyle.Top; + this.lbTitle.Enabled = false; + this.lbTitle.Enabled = true; + this.lbTitle.Font = new System.Drawing.Font("Consolas", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbTitle.ForeColor = System.Drawing.Color.White; + this.lbTitle.GradientEnable = true; + this.lbTitle.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbTitle.GradientRepeatBG = false; + this.lbTitle.isButton = false; + this.lbTitle.Location = new System.Drawing.Point(6, 5); + this.lbTitle.MouseDownColor = System.Drawing.Color.Yellow; + this.lbTitle.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbTitle.msg = null; + this.lbTitle.Name = "lbTitle"; + this.lbTitle.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbTitle.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbTitle.ProgressEnable = false; + this.lbTitle.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbTitle.ProgressForeColor = System.Drawing.Color.Black; + this.lbTitle.ProgressMax = 100F; + this.lbTitle.ProgressMin = 0F; + this.lbTitle.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbTitle.ProgressValue = 0F; + this.lbTitle.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbTitle.Sign = ""; + this.lbTitle.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbTitle.SignColor = System.Drawing.Color.Yellow; + this.lbTitle.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbTitle.Size = new System.Drawing.Size(788, 44); + this.lbTitle.TabIndex = 2; + this.lbTitle.Text = "INPUT"; + this.lbTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbTitle.TextShadow = true; + this.lbTitle.TextVisible = true; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button1.Location = new System.Drawing.Point(728, 11); + this.button1.Margin = new System.Windows.Forms.Padding(0); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(60, 34); + this.button1.TabIndex = 3; + this.button1.Text = "CLOSE"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // fTouchKeyFull + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.ClientSize = new System.Drawing.Size(800, 330); + this.Controls.Add(this.button1); + this.Controls.Add(this.touchKeyFull1); + this.Controls.Add(this.tbInput); + this.Controls.Add(this.lbTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.KeyPreview = true; + this.Name = "fTouchKeyFull"; + this.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "fTouchKeyFull"; + this.Load += new System.EventHandler(this.fTouchKeyFull_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private arCtl.TouchKeyFull touchKeyFull1; + private arCtl.arLabel lbTitle; + public System.Windows.Forms.TextBox tbInput; + private System.Windows.Forms.Button button1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fTouchKeyFull.cs b/Cs_HMI/Project/Dialog/fTouchKeyFull.cs new file mode 100644 index 0000000..fa918b3 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchKeyFull.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fTouchKeyFull : Form + { + public fTouchKeyFull(string title,string value) + { + InitializeComponent(); + this.lbTitle.Text = title; + this.tbInput.Text = value; + this.KeyDown += (s1, e1) => + { + if (e1.KeyCode == Keys.Escape) + this.Close(); + }; + this.lbTitle.MouseMove += LbTitle_MouseMove; + this.lbTitle.MouseUp += LbTitle_MouseUp; + this.lbTitle.MouseDown += LbTitle_MouseDown; + } + + private void fTouchKeyFull_Load(object sender, EventArgs e) + { + this.Show(); + Application.DoEvents(); + this.tbInput.SelectAll(); + this.tbInput.Focus(); + } + #region "Mouse Form Move" + + private Boolean fMove = false; + private Point MDownPos; + private void LbTitle_MouseMove(object sender, MouseEventArgs e) + { + if (fMove) + { + Point offset = new Point(e.X - MDownPos.X, e.Y - MDownPos.Y); + this.Left += offset.X; + this.Top += offset.Y; + offset = new Point(0, 0); + } + } + private void LbTitle_MouseUp(object sender, MouseEventArgs e) + { + fMove = false; + } + private void LbTitle_MouseDown(object sender, MouseEventArgs e) + { + MDownPos = new Point(e.X, e.Y); + fMove = true; + } + + #endregion + + private void touchKeyFull1_keyClick(string key) + { + var seltext = tbInput.SelectedText; + switch(key) + { + + case "CLR": + this.tbInput.Text = string.Empty; + break; + case "BACK": + if (this.tbInput.TextLength < 2) this.tbInput.Text = string.Empty; + else this.tbInput.Text = this.tbInput.Text.Substring(0,tbInput.TextLength-1); + this.tbInput.SelectionStart = this.tbInput.TextLength; + break; + case "ENTER": + this.DialogResult = DialogResult.OK; + break; + case "SPACE": + if (seltext.Length == tbInput.TextLength) tbInput.Text = ""; + this.tbInput.Text += " "; + this.tbInput.SelectionStart = this.tbInput.TextLength; + break; + default: + + if (seltext.Length == tbInput.TextLength) tbInput.Text = ""; + this.tbInput.Text += key; + this.tbInput.SelectionStart = this.tbInput.TextLength; + break; + } + } + + private void button1_Click(object sender, EventArgs e) + { + this.Close(); + } + + } +} diff --git a/Cs_HMI/Project/Dialog/fTouchKeyFull.resx b/Cs_HMI/Project/Dialog/fTouchKeyFull.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchKeyFull.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fTouchNumDot.Designer.cs b/Cs_HMI/Project/Dialog/fTouchNumDot.Designer.cs new file mode 100644 index 0000000..1b2131a --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchNumDot.Designer.cs @@ -0,0 +1,835 @@ +namespace Project.Dialog +{ + partial class fTouchNumDot + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.arLabel1 = new arCtl.arLabel(); + this.arLabel2 = new arCtl.arLabel(); + this.arLabel3 = new arCtl.arLabel(); + this.arLabel4 = new arCtl.arLabel(); + this.arLabel5 = new arCtl.arLabel(); + this.arLabel6 = new arCtl.arLabel(); + this.arLabel7 = new arCtl.arLabel(); + this.arLabel8 = new arCtl.arLabel(); + this.arLabel9 = new arCtl.arLabel(); + this.arLabel11 = new arCtl.arLabel(); + this.arLabel12 = new arCtl.arLabel(); + this.arLabel13 = new arCtl.arLabel(); + this.arLabel14 = new arCtl.arLabel(); + this.arLabel15 = new arCtl.arLabel(); + this.arLabel10 = new arCtl.arLabel(); + this.tbInput = new System.Windows.Forms.TextBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 4; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Controls.Add(this.arLabel1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.arLabel2, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.arLabel3, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.arLabel4, 2, 1); + this.tableLayoutPanel1.Controls.Add(this.arLabel5, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.arLabel6, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.arLabel7, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.arLabel8, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.arLabel9, 2, 2); + this.tableLayoutPanel1.Controls.Add(this.arLabel11, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.arLabel12, 3, 0); + this.tableLayoutPanel1.Controls.Add(this.arLabel13, 2, 3); + this.tableLayoutPanel1.Controls.Add(this.arLabel14, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.arLabel15, 3, 1); + this.tableLayoutPanel1.Controls.Add(this.arLabel10, 3, 2); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(5, 50); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(324, 265); + this.tableLayoutPanel1.TabIndex = 1; + // + // arLabel1 + // + this.arLabel1.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel1.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel1.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel1.BorderColorOver = System.Drawing.Color.Red; + this.arLabel1.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel1.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel1.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel1.ForeColor = System.Drawing.Color.White; + this.arLabel1.GradientEnable = false; + this.arLabel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel1.GradientRepeatBG = false; + this.arLabel1.isButton = true; + this.arLabel1.Location = new System.Drawing.Point(0, 0); + this.arLabel1.Margin = new System.Windows.Forms.Padding(0); + this.arLabel1.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel1.msg = null; + this.arLabel1.Name = "arLabel1"; + this.arLabel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel1.ProgressEnable = false; + this.arLabel1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel1.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel1.ProgressMax = 100F; + this.arLabel1.ProgressMin = 0F; + this.arLabel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel1.ProgressValue = 0F; + this.arLabel1.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel1.Sign = ""; + this.arLabel1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel1.SignColor = System.Drawing.Color.Yellow; + this.arLabel1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel1.Size = new System.Drawing.Size(81, 66); + this.arLabel1.TabIndex = 0; + this.arLabel1.Tag = "1"; + this.arLabel1.Text = "1"; + this.arLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel1.TextShadow = false; + this.arLabel1.TextVisible = true; + this.arLabel1.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel2 + // + this.arLabel2.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel2.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel2.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel2.BorderColorOver = System.Drawing.Color.Red; + this.arLabel2.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel2.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel2.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel2.ForeColor = System.Drawing.Color.White; + this.arLabel2.GradientEnable = false; + this.arLabel2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel2.GradientRepeatBG = false; + this.arLabel2.isButton = true; + this.arLabel2.Location = new System.Drawing.Point(81, 0); + this.arLabel2.Margin = new System.Windows.Forms.Padding(0); + this.arLabel2.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel2.msg = null; + this.arLabel2.Name = "arLabel2"; + this.arLabel2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel2.ProgressEnable = false; + this.arLabel2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel2.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel2.ProgressMax = 100F; + this.arLabel2.ProgressMin = 0F; + this.arLabel2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel2.ProgressValue = 0F; + this.arLabel2.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel2.Sign = ""; + this.arLabel2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel2.SignColor = System.Drawing.Color.Yellow; + this.arLabel2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel2.Size = new System.Drawing.Size(81, 66); + this.arLabel2.TabIndex = 0; + this.arLabel2.Tag = "2"; + this.arLabel2.Text = "2"; + this.arLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel2.TextShadow = false; + this.arLabel2.TextVisible = true; + this.arLabel2.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel3 + // + this.arLabel3.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel3.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel3.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel3.BorderColorOver = System.Drawing.Color.Red; + this.arLabel3.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel3.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel3.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel3.ForeColor = System.Drawing.Color.White; + this.arLabel3.GradientEnable = false; + this.arLabel3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel3.GradientRepeatBG = false; + this.arLabel3.isButton = true; + this.arLabel3.Location = new System.Drawing.Point(162, 0); + this.arLabel3.Margin = new System.Windows.Forms.Padding(0); + this.arLabel3.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel3.msg = null; + this.arLabel3.Name = "arLabel3"; + this.arLabel3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel3.ProgressEnable = false; + this.arLabel3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel3.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel3.ProgressMax = 100F; + this.arLabel3.ProgressMin = 0F; + this.arLabel3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel3.ProgressValue = 0F; + this.arLabel3.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel3.Sign = ""; + this.arLabel3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel3.SignColor = System.Drawing.Color.Yellow; + this.arLabel3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel3.Size = new System.Drawing.Size(81, 66); + this.arLabel3.TabIndex = 0; + this.arLabel3.Tag = "3"; + this.arLabel3.Text = "3"; + this.arLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel3.TextShadow = false; + this.arLabel3.TextVisible = true; + this.arLabel3.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel4 + // + this.arLabel4.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel4.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel4.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel4.BorderColorOver = System.Drawing.Color.Red; + this.arLabel4.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel4.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel4.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel4.ForeColor = System.Drawing.Color.White; + this.arLabel4.GradientEnable = false; + this.arLabel4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel4.GradientRepeatBG = false; + this.arLabel4.isButton = true; + this.arLabel4.Location = new System.Drawing.Point(162, 66); + this.arLabel4.Margin = new System.Windows.Forms.Padding(0); + this.arLabel4.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel4.msg = null; + this.arLabel4.Name = "arLabel4"; + this.arLabel4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel4.ProgressEnable = false; + this.arLabel4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel4.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel4.ProgressMax = 100F; + this.arLabel4.ProgressMin = 0F; + this.arLabel4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel4.ProgressValue = 0F; + this.arLabel4.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel4.Sign = ""; + this.arLabel4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel4.SignColor = System.Drawing.Color.Yellow; + this.arLabel4.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel4.Size = new System.Drawing.Size(81, 66); + this.arLabel4.TabIndex = 0; + this.arLabel4.Tag = "6"; + this.arLabel4.Text = "6"; + this.arLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel4.TextShadow = false; + this.arLabel4.TextVisible = true; + this.arLabel4.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel5 + // + this.arLabel5.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel5.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel5.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel5.BorderColorOver = System.Drawing.Color.Red; + this.arLabel5.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel5.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel5.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel5.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel5.ForeColor = System.Drawing.Color.White; + this.arLabel5.GradientEnable = false; + this.arLabel5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel5.GradientRepeatBG = false; + this.arLabel5.isButton = true; + this.arLabel5.Location = new System.Drawing.Point(81, 66); + this.arLabel5.Margin = new System.Windows.Forms.Padding(0); + this.arLabel5.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel5.msg = null; + this.arLabel5.Name = "arLabel5"; + this.arLabel5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel5.ProgressEnable = false; + this.arLabel5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel5.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel5.ProgressMax = 100F; + this.arLabel5.ProgressMin = 0F; + this.arLabel5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel5.ProgressValue = 0F; + this.arLabel5.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel5.Sign = ""; + this.arLabel5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel5.SignColor = System.Drawing.Color.Yellow; + this.arLabel5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel5.Size = new System.Drawing.Size(81, 66); + this.arLabel5.TabIndex = 0; + this.arLabel5.Tag = "5"; + this.arLabel5.Text = "5"; + this.arLabel5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel5.TextShadow = false; + this.arLabel5.TextVisible = true; + this.arLabel5.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel6 + // + this.arLabel6.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel6.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel6.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel6.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel6.BorderColorOver = System.Drawing.Color.Red; + this.arLabel6.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel6.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel6.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel6.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel6.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel6.ForeColor = System.Drawing.Color.White; + this.arLabel6.GradientEnable = false; + this.arLabel6.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel6.GradientRepeatBG = false; + this.arLabel6.isButton = true; + this.arLabel6.Location = new System.Drawing.Point(0, 66); + this.arLabel6.Margin = new System.Windows.Forms.Padding(0); + this.arLabel6.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel6.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel6.msg = null; + this.arLabel6.Name = "arLabel6"; + this.arLabel6.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel6.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel6.ProgressEnable = false; + this.arLabel6.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel6.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel6.ProgressMax = 100F; + this.arLabel6.ProgressMin = 0F; + this.arLabel6.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel6.ProgressValue = 0F; + this.arLabel6.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel6.Sign = ""; + this.arLabel6.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel6.SignColor = System.Drawing.Color.Yellow; + this.arLabel6.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel6.Size = new System.Drawing.Size(81, 66); + this.arLabel6.TabIndex = 0; + this.arLabel6.Tag = "4"; + this.arLabel6.Text = "4"; + this.arLabel6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel6.TextShadow = false; + this.arLabel6.TextVisible = true; + this.arLabel6.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel7 + // + this.arLabel7.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel7.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel7.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel7.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel7.BorderColorOver = System.Drawing.Color.Red; + this.arLabel7.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel7.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel7.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel7.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel7.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel7.ForeColor = System.Drawing.Color.White; + this.arLabel7.GradientEnable = false; + this.arLabel7.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel7.GradientRepeatBG = false; + this.arLabel7.isButton = true; + this.arLabel7.Location = new System.Drawing.Point(0, 132); + this.arLabel7.Margin = new System.Windows.Forms.Padding(0); + this.arLabel7.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel7.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel7.msg = null; + this.arLabel7.Name = "arLabel7"; + this.arLabel7.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel7.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel7.ProgressEnable = false; + this.arLabel7.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel7.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel7.ProgressMax = 100F; + this.arLabel7.ProgressMin = 0F; + this.arLabel7.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel7.ProgressValue = 0F; + this.arLabel7.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel7.Sign = ""; + this.arLabel7.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel7.SignColor = System.Drawing.Color.Yellow; + this.arLabel7.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel7.Size = new System.Drawing.Size(81, 66); + this.arLabel7.TabIndex = 0; + this.arLabel7.Tag = "7"; + this.arLabel7.Text = "7"; + this.arLabel7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel7.TextShadow = false; + this.arLabel7.TextVisible = true; + this.arLabel7.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel8 + // + this.arLabel8.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel8.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel8.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel8.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel8.BorderColorOver = System.Drawing.Color.Red; + this.arLabel8.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel8.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel8.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel8.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel8.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel8.ForeColor = System.Drawing.Color.White; + this.arLabel8.GradientEnable = false; + this.arLabel8.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel8.GradientRepeatBG = false; + this.arLabel8.isButton = true; + this.arLabel8.Location = new System.Drawing.Point(81, 132); + this.arLabel8.Margin = new System.Windows.Forms.Padding(0); + this.arLabel8.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel8.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel8.msg = null; + this.arLabel8.Name = "arLabel8"; + this.arLabel8.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel8.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel8.ProgressEnable = false; + this.arLabel8.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel8.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel8.ProgressMax = 100F; + this.arLabel8.ProgressMin = 0F; + this.arLabel8.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel8.ProgressValue = 0F; + this.arLabel8.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel8.Sign = ""; + this.arLabel8.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel8.SignColor = System.Drawing.Color.Yellow; + this.arLabel8.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel8.Size = new System.Drawing.Size(81, 66); + this.arLabel8.TabIndex = 0; + this.arLabel8.Tag = "8"; + this.arLabel8.Text = "8"; + this.arLabel8.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel8.TextShadow = false; + this.arLabel8.TextVisible = true; + this.arLabel8.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel9 + // + this.arLabel9.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel9.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel9.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel9.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel9.BorderColorOver = System.Drawing.Color.Red; + this.arLabel9.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel9.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel9.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel9.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel9.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel9.ForeColor = System.Drawing.Color.White; + this.arLabel9.GradientEnable = false; + this.arLabel9.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel9.GradientRepeatBG = false; + this.arLabel9.isButton = true; + this.arLabel9.Location = new System.Drawing.Point(162, 132); + this.arLabel9.Margin = new System.Windows.Forms.Padding(0); + this.arLabel9.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel9.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel9.msg = null; + this.arLabel9.Name = "arLabel9"; + this.arLabel9.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel9.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel9.ProgressEnable = false; + this.arLabel9.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel9.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel9.ProgressMax = 100F; + this.arLabel9.ProgressMin = 0F; + this.arLabel9.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel9.ProgressValue = 0F; + this.arLabel9.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel9.Sign = ""; + this.arLabel9.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel9.SignColor = System.Drawing.Color.Yellow; + this.arLabel9.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel9.Size = new System.Drawing.Size(81, 66); + this.arLabel9.TabIndex = 0; + this.arLabel9.Tag = "9"; + this.arLabel9.Text = "9"; + this.arLabel9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel9.TextShadow = false; + this.arLabel9.TextVisible = true; + this.arLabel9.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel11 + // + this.arLabel11.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel11.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel11.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel11.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel11.BorderColorOver = System.Drawing.Color.Red; + this.arLabel11.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel11.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel11.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel11.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel11.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel11.ForeColor = System.Drawing.Color.White; + this.arLabel11.GradientEnable = false; + this.arLabel11.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel11.GradientRepeatBG = false; + this.arLabel11.isButton = true; + this.arLabel11.Location = new System.Drawing.Point(81, 198); + this.arLabel11.Margin = new System.Windows.Forms.Padding(0); + this.arLabel11.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel11.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel11.msg = null; + this.arLabel11.Name = "arLabel11"; + this.arLabel11.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel11.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel11.ProgressEnable = false; + this.arLabel11.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel11.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel11.ProgressMax = 100F; + this.arLabel11.ProgressMin = 0F; + this.arLabel11.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel11.ProgressValue = 0F; + this.arLabel11.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel11.Sign = ""; + this.arLabel11.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel11.SignColor = System.Drawing.Color.Yellow; + this.arLabel11.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel11.Size = new System.Drawing.Size(81, 67); + this.arLabel11.TabIndex = 0; + this.arLabel11.Tag = "0"; + this.arLabel11.Text = "0"; + this.arLabel11.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel11.TextShadow = false; + this.arLabel11.TextVisible = true; + this.arLabel11.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel12 + // + this.arLabel12.BackColor = System.Drawing.Color.Gray; + this.arLabel12.BackColor2 = System.Drawing.Color.Gold; + this.arLabel12.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel12.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel12.BorderColorOver = System.Drawing.Color.Red; + this.arLabel12.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel12.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel12.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel12.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel12.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel12.ForeColor = System.Drawing.Color.White; + this.arLabel12.GradientEnable = true; + this.arLabel12.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel12.GradientRepeatBG = false; + this.arLabel12.isButton = true; + this.arLabel12.Location = new System.Drawing.Point(243, 0); + this.arLabel12.Margin = new System.Windows.Forms.Padding(0); + this.arLabel12.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel12.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel12.msg = null; + this.arLabel12.Name = "arLabel12"; + this.arLabel12.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel12.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel12.ProgressEnable = false; + this.arLabel12.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel12.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel12.ProgressMax = 100F; + this.arLabel12.ProgressMin = 0F; + this.arLabel12.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel12.ProgressValue = 0F; + this.arLabel12.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel12.Sign = ""; + this.arLabel12.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel12.SignColor = System.Drawing.Color.Yellow; + this.arLabel12.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel12.Size = new System.Drawing.Size(81, 66); + this.arLabel12.TabIndex = 0; + this.arLabel12.Tag = "B"; + this.arLabel12.Text = "BACK"; + this.arLabel12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel12.TextShadow = false; + this.arLabel12.TextVisible = true; + this.arLabel12.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel13 + // + this.arLabel13.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel13.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel13.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel13.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel13.BorderColorOver = System.Drawing.Color.Red; + this.arLabel13.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel13.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel13.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel13.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel13.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel13.ForeColor = System.Drawing.Color.White; + this.arLabel13.GradientEnable = false; + this.arLabel13.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel13.GradientRepeatBG = false; + this.arLabel13.isButton = true; + this.arLabel13.Location = new System.Drawing.Point(162, 198); + this.arLabel13.Margin = new System.Windows.Forms.Padding(0); + this.arLabel13.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel13.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel13.msg = null; + this.arLabel13.Name = "arLabel13"; + this.arLabel13.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel13.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel13.ProgressEnable = false; + this.arLabel13.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel13.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel13.ProgressMax = 100F; + this.arLabel13.ProgressMin = 0F; + this.arLabel13.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel13.ProgressValue = 0F; + this.arLabel13.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel13.Sign = ""; + this.arLabel13.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel13.SignColor = System.Drawing.Color.Yellow; + this.arLabel13.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel13.Size = new System.Drawing.Size(81, 67); + this.arLabel13.TabIndex = 0; + this.arLabel13.Tag = "."; + this.arLabel13.Text = "."; + this.arLabel13.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel13.TextShadow = false; + this.arLabel13.TextVisible = true; + this.arLabel13.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel14 + // + this.arLabel14.BackColor = System.Drawing.Color.SkyBlue; + this.arLabel14.BackColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel14.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel14.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel14.BorderColorOver = System.Drawing.Color.Red; + this.arLabel14.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel14.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel14.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel14.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel14.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel14.ForeColor = System.Drawing.Color.White; + this.arLabel14.GradientEnable = false; + this.arLabel14.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel14.GradientRepeatBG = false; + this.arLabel14.isButton = true; + this.arLabel14.Location = new System.Drawing.Point(0, 198); + this.arLabel14.Margin = new System.Windows.Forms.Padding(0); + this.arLabel14.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel14.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel14.msg = null; + this.arLabel14.Name = "arLabel14"; + this.arLabel14.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel14.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel14.ProgressEnable = false; + this.arLabel14.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel14.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel14.ProgressMax = 100F; + this.arLabel14.ProgressMin = 0F; + this.arLabel14.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel14.ProgressValue = 0F; + this.arLabel14.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel14.Sign = ""; + this.arLabel14.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel14.SignColor = System.Drawing.Color.Yellow; + this.arLabel14.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel14.Size = new System.Drawing.Size(81, 67); + this.arLabel14.TabIndex = 0; + this.arLabel14.Tag = "-"; + this.arLabel14.Text = "-"; + this.arLabel14.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel14.TextShadow = false; + this.arLabel14.TextVisible = true; + this.arLabel14.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel15 + // + this.arLabel15.BackColor = System.Drawing.Color.Gray; + this.arLabel15.BackColor2 = System.Drawing.Color.SteelBlue; + this.arLabel15.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel15.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel15.BorderColorOver = System.Drawing.Color.Red; + this.arLabel15.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel15.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel15.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel15.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel15.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel15.ForeColor = System.Drawing.Color.White; + this.arLabel15.GradientEnable = true; + this.arLabel15.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel15.GradientRepeatBG = false; + this.arLabel15.isButton = true; + this.arLabel15.Location = new System.Drawing.Point(243, 66); + this.arLabel15.Margin = new System.Windows.Forms.Padding(0); + this.arLabel15.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel15.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel15.msg = null; + this.arLabel15.Name = "arLabel15"; + this.arLabel15.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel15.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel15.ProgressEnable = false; + this.arLabel15.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel15.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel15.ProgressMax = 100F; + this.arLabel15.ProgressMin = 0F; + this.arLabel15.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel15.ProgressValue = 0F; + this.arLabel15.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel15.Sign = ""; + this.arLabel15.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel15.SignColor = System.Drawing.Color.Yellow; + this.arLabel15.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel15.Size = new System.Drawing.Size(81, 66); + this.arLabel15.TabIndex = 0; + this.arLabel15.Tag = "C"; + this.arLabel15.Text = "CLEAR"; + this.arLabel15.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel15.TextShadow = false; + this.arLabel15.TextVisible = true; + this.arLabel15.Click += new System.EventHandler(this.arLabel1_Click); + // + // arLabel10 + // + this.arLabel10.BackColor = System.Drawing.Color.CadetBlue; + this.arLabel10.BackColor2 = System.Drawing.Color.Lime; + this.arLabel10.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel10.BorderColor = System.Drawing.Color.SteelBlue; + this.arLabel10.BorderColorOver = System.Drawing.Color.Red; + this.arLabel10.BorderSize = new System.Windows.Forms.Padding(2); + this.arLabel10.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel10.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel10.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel10.Font = new System.Drawing.Font("Consolas", 12F); + this.arLabel10.ForeColor = System.Drawing.Color.White; + this.arLabel10.GradientEnable = true; + this.arLabel10.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel10.GradientRepeatBG = false; + this.arLabel10.isButton = true; + this.arLabel10.Location = new System.Drawing.Point(243, 132); + this.arLabel10.Margin = new System.Windows.Forms.Padding(0); + this.arLabel10.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel10.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel10.msg = null; + this.arLabel10.Name = "arLabel10"; + this.arLabel10.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel10.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel10.ProgressEnable = false; + this.arLabel10.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel10.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel10.ProgressMax = 100F; + this.arLabel10.ProgressMin = 0F; + this.arLabel10.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel10.ProgressValue = 0F; + this.tableLayoutPanel1.SetRowSpan(this.arLabel10, 2); + this.arLabel10.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel10.Sign = ""; + this.arLabel10.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel10.SignColor = System.Drawing.Color.Yellow; + this.arLabel10.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel10.Size = new System.Drawing.Size(81, 133); + this.arLabel10.TabIndex = 0; + this.arLabel10.Tag = "E"; + this.arLabel10.Text = "ENTER"; + this.arLabel10.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel10.TextShadow = false; + this.arLabel10.TextVisible = true; + this.arLabel10.Click += new System.EventHandler(this.arLabel1_Click); + // + // tbInput + // + this.tbInput.Dock = System.Windows.Forms.DockStyle.Top; + this.tbInput.Font = new System.Drawing.Font("Calibri", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tbInput.Location = new System.Drawing.Point(5, 5); + this.tbInput.Name = "tbInput"; + this.tbInput.Size = new System.Drawing.Size(324, 40); + this.tbInput.TabIndex = 2; + this.tbInput.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // panel1 + // + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(5, 45); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(324, 5); + this.panel1.TabIndex = 3; + // + // fTouchNumDot + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.ClientSize = new System.Drawing.Size(334, 320); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.panel1); + this.Controls.Add(this.tbInput); + this.Name = "fTouchNumDot"; + this.Padding = new System.Windows.Forms.Padding(5); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Input Value"; + this.Load += new System.EventHandler(this.fTouchNumDot_Load); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private arCtl.arLabel arLabel1; + private arCtl.arLabel arLabel2; + private arCtl.arLabel arLabel3; + private arCtl.arLabel arLabel4; + private arCtl.arLabel arLabel5; + private arCtl.arLabel arLabel6; + private arCtl.arLabel arLabel7; + private arCtl.arLabel arLabel8; + private arCtl.arLabel arLabel9; + private arCtl.arLabel arLabel10; + private arCtl.arLabel arLabel11; + private arCtl.arLabel arLabel12; + public System.Windows.Forms.TextBox tbInput; + private System.Windows.Forms.Panel panel1; + private arCtl.arLabel arLabel13; + private arCtl.arLabel arLabel14; + private arCtl.arLabel arLabel15; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fTouchNumDot.cs b/Cs_HMI/Project/Dialog/fTouchNumDot.cs new file mode 100644 index 0000000..4c85a42 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchNumDot.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fTouchNumDot : Form + { + public fTouchNumDot(string value) + { + InitializeComponent(); + this.tbInput.KeyDown += (s1, e1) => { if (e1.KeyCode == Keys.Enter) Confirm(); }; + this.KeyPreview = true; + this.tbInput.Text = value; + this.KeyDown += (s1, e1) => + { + if (e1.KeyCode == Keys.Escape) this.Close(); + }; + } + + private void fTouchNumDot_Load(object sender, EventArgs e) + { + this.tbInput.SelectAll(); + this.tbInput.Focus(); + } + private void Confirm() + { + string id = tbInput.Text.Trim(); + if (id.isEmpty()) + { + tbInput.Focus(); + return; + } + DialogResult = DialogResult.OK; + } + + + public void ProcessKey(ref TextBox cmb_rfid, string key) + { + if (key == "B") + { + if (cmb_rfid.Text != "") + cmb_rfid.Text = cmb_rfid.Text.Substring(0, cmb_rfid.Text.Length - 1); + } + else if (key == "C") + { + cmb_rfid.Text = ""; + } + else if (key == "E") + { + Confirm(); + } + else + { + if (cmb_rfid.SelectionLength > 0 && cmb_rfid.TextLength == cmb_rfid.SelectionLength) + { + cmb_rfid.Text = key; + } + else if (cmb_rfid.SelectionLength > 0) + { + //선택된 영역을 대체해준다. + cmb_rfid.SelectedText = key; + } + else cmb_rfid.Text += key; + } + + cmb_rfid.SelectionLength = 0; + if (cmb_rfid.Text != "") + cmb_rfid.SelectionStart = cmb_rfid.Text.Length; + + } + + private void arLabel1_Click(object sender, EventArgs e) + { + var ctl = sender as arCtl.arLabel; + ProcessKey(ref tbInput, ctl.Tag.ToString()); + } + + } +} diff --git a/Cs_HMI/Project/Dialog/fTouchNumDot.resx b/Cs_HMI/Project/Dialog/fTouchNumDot.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/Project/Dialog/fTouchNumDot.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fUpdateForm.Designer.cs b/Cs_HMI/Project/Dialog/fUpdateForm.Designer.cs new file mode 100644 index 0000000..995dbaf --- /dev/null +++ b/Cs_HMI/Project/Dialog/fUpdateForm.Designer.cs @@ -0,0 +1,500 @@ +namespace Project.Dialog +{ + partial class fUpdateForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmBlink = new System.Windows.Forms.Timer(this.components); + this.arPanel1 = new arCtl.arPanel(); + this.panButton = new System.Windows.Forms.Panel(); + this.btYes = new arCtl.arLabel(); + this.btNo = new arCtl.arLabel(); + this.panel7 = new System.Windows.Forms.Panel(); + this.lb3 = new arCtl.arLabel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lb2 = new arCtl.arLabel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.lb1 = new arCtl.arLabel(); + this.panel8 = new System.Windows.Forms.Panel(); + this.lbTitle = new arCtl.arLabel(); + this.arLabel1 = new arCtl.arLabel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.arPanel1.SuspendLayout(); + this.panButton.SuspendLayout(); + this.SuspendLayout(); + // + // tmBlink + // + this.tmBlink.Enabled = true; + this.tmBlink.Interval = 300; + this.tmBlink.Tick += new System.EventHandler(this.tmBlink_Tick); + // + // arPanel1 + // + this.arPanel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arPanel1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arPanel1.BorderColor = System.Drawing.Color.DimGray; + this.arPanel1.BorderSize = new System.Windows.Forms.Padding(1); + this.arPanel1.Controls.Add(this.panButton); + this.arPanel1.Controls.Add(this.panel7); + this.arPanel1.Controls.Add(this.lb3); + this.arPanel1.Controls.Add(this.panel2); + this.arPanel1.Controls.Add(this.arLabel1); + this.arPanel1.Controls.Add(this.panel1); + this.arPanel1.Controls.Add(this.lb2); + this.arPanel1.Controls.Add(this.panel4); + this.arPanel1.Controls.Add(this.lb1); + this.arPanel1.Controls.Add(this.panel8); + this.arPanel1.Controls.Add(this.lbTitle); + this.arPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.arPanel1.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Italic); + this.arPanel1.ForeColor = System.Drawing.Color.Khaki; + this.arPanel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arPanel1.GradientRepeatBG = false; + this.arPanel1.Location = new System.Drawing.Point(5, 5); + this.arPanel1.Name = "arPanel1"; + this.arPanel1.Padding = new System.Windows.Forms.Padding(6); + this.arPanel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arPanel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arPanel1.ProgressMax = 100F; + this.arPanel1.ProgressMin = 0F; + this.arPanel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arPanel1.ProgressValue = 0F; + this.arPanel1.ShadowColor = System.Drawing.Color.Black; + this.arPanel1.ShowBorder = true; + this.arPanel1.Size = new System.Drawing.Size(508, 358); + this.arPanel1.TabIndex = 0; + this.arPanel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.arPanel1.TextShadow = false; + this.arPanel1.UseProgressBar = false; + // + // panButton + // + this.panButton.Controls.Add(this.btYes); + this.panButton.Controls.Add(this.btNo); + this.panButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.panButton.Location = new System.Drawing.Point(6, 298); + this.panButton.Name = "panButton"; + this.panButton.Size = new System.Drawing.Size(496, 54); + this.panButton.TabIndex = 10; + // + // btYes + // + this.btYes.BackColor = System.Drawing.Color.SeaGreen; + this.btYes.BackColor2 = System.Drawing.Color.SeaGreen; + this.btYes.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btYes.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btYes.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btYes.BorderSize = new System.Windows.Forms.Padding(1); + this.btYes.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btYes.Cursor = System.Windows.Forms.Cursors.Hand; + this.btYes.Dock = System.Windows.Forms.DockStyle.Fill; + this.btYes.Enabled = false; + this.btYes.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btYes.ForeColor = System.Drawing.Color.Black; + this.btYes.GradientEnable = true; + this.btYes.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btYes.GradientRepeatBG = false; + this.btYes.isButton = true; + this.btYes.Location = new System.Drawing.Point(0, 0); + this.btYes.MouseDownColor = System.Drawing.Color.Yellow; + this.btYes.MouseOverColor = System.Drawing.Color.Yellow; + this.btYes.msg = null; + this.btYes.Name = "btYes"; + this.btYes.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btYes.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btYes.ProgressEnable = false; + this.btYes.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btYes.ProgressForeColor = System.Drawing.Color.Black; + this.btYes.ProgressMax = 100F; + this.btYes.ProgressMin = 0F; + this.btYes.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btYes.ProgressValue = 0F; + this.btYes.ShadowColor = System.Drawing.Color.Gray; + this.btYes.Sign = ""; + this.btYes.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btYes.SignColor = System.Drawing.Color.Yellow; + this.btYes.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btYes.Size = new System.Drawing.Size(267, 54); + this.btYes.TabIndex = 0; + this.btYes.Text = "예(F5)"; + this.btYes.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btYes.TextShadow = true; + this.btYes.TextVisible = true; + this.btYes.Click += new System.EventHandler(this.btYes_Click); + // + // btNo + // + this.btNo.BackColor = System.Drawing.Color.Goldenrod; + this.btNo.BackColor2 = System.Drawing.Color.Goldenrod; + this.btNo.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btNo.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btNo.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btNo.BorderSize = new System.Windows.Forms.Padding(1); + this.btNo.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btNo.Cursor = System.Windows.Forms.Cursors.Hand; + this.btNo.Dock = System.Windows.Forms.DockStyle.Right; + this.btNo.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btNo.ForeColor = System.Drawing.Color.Black; + this.btNo.GradientEnable = true; + this.btNo.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btNo.GradientRepeatBG = false; + this.btNo.isButton = true; + this.btNo.Location = new System.Drawing.Point(267, 0); + this.btNo.MouseDownColor = System.Drawing.Color.Yellow; + this.btNo.MouseOverColor = System.Drawing.Color.Yellow; + this.btNo.msg = null; + this.btNo.Name = "btNo"; + this.btNo.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btNo.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btNo.ProgressEnable = false; + this.btNo.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btNo.ProgressForeColor = System.Drawing.Color.Black; + this.btNo.ProgressMax = 100F; + this.btNo.ProgressMin = 0F; + this.btNo.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btNo.ProgressValue = 0F; + this.btNo.ShadowColor = System.Drawing.Color.Gray; + this.btNo.Sign = ""; + this.btNo.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btNo.SignColor = System.Drawing.Color.Yellow; + this.btNo.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btNo.Size = new System.Drawing.Size(229, 54); + this.btNo.TabIndex = 1; + this.btNo.Text = "아니오(ESC)"; + this.btNo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btNo.TextShadow = true; + this.btNo.TextVisible = true; + this.btNo.Click += new System.EventHandler(this.btNo_Click); + // + // panel7 + // + this.panel7.Dock = System.Windows.Forms.DockStyle.Top; + this.panel7.Location = new System.Drawing.Point(6, 293); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(496, 5); + this.panel7.TabIndex = 0; + // + // lb3 + // + this.lb3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb3.BackColor2 = System.Drawing.Color.Gray; + this.lb3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb3.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb3.BorderSize = new System.Windows.Forms.Padding(1); + this.lb3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb3.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb3.Dock = System.Windows.Forms.DockStyle.Top; + this.lb3.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb3.ForeColor = System.Drawing.Color.White; + this.lb3.GradientEnable = true; + this.lb3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb3.GradientRepeatBG = false; + this.lb3.isButton = false; + this.lb3.Location = new System.Drawing.Point(6, 243); + this.lb3.MouseDownColor = System.Drawing.Color.Yellow; + this.lb3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb3.msg = null; + this.lb3.Name = "lb3"; + this.lb3.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb3.ProgressEnable = true; + this.lb3.ProgressFont = new System.Drawing.Font("Consolas", 20F); + this.lb3.ProgressForeColor = System.Drawing.Color.Black; + this.lb3.ProgressMax = 100F; + this.lb3.ProgressMin = 0F; + this.lb3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb3.ProgressValue = 50F; + this.lb3.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb3.Sign = ""; + this.lb3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb3.SignColor = System.Drawing.Color.Yellow; + this.lb3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb3.Size = new System.Drawing.Size(496, 50); + this.lb3.TabIndex = 5; + this.lb3.Text = "0%"; + this.lb3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lb3.TextShadow = true; + this.lb3.TextVisible = true; + // + // panel1 + // + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(6, 183); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(496, 5); + this.panel1.TabIndex = 11; + // + // lb2 + // + this.lb2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb2.BackColor2 = System.Drawing.Color.Gray; + this.lb2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb2.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb2.BorderSize = new System.Windows.Forms.Padding(1); + this.lb2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb2.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb2.Dock = System.Windows.Forms.DockStyle.Top; + this.lb2.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb2.ForeColor = System.Drawing.Color.White; + this.lb2.GradientEnable = true; + this.lb2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb2.GradientRepeatBG = false; + this.lb2.isButton = false; + this.lb2.Location = new System.Drawing.Point(6, 133); + this.lb2.MouseDownColor = System.Drawing.Color.Yellow; + this.lb2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb2.msg = null; + this.lb2.Name = "lb2"; + this.lb2.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb2.ProgressEnable = false; + this.lb2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb2.ProgressForeColor = System.Drawing.Color.Black; + this.lb2.ProgressMax = 100F; + this.lb2.ProgressMin = 0F; + this.lb2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb2.ProgressValue = 0F; + this.lb2.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb2.Sign = ""; + this.lb2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb2.SignColor = System.Drawing.Color.Yellow; + this.lb2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb2.Size = new System.Drawing.Size(496, 50); + this.lb2.TabIndex = 4; + this.lb2.Text = "현재버젼 : {0}"; + this.lb2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb2.TextShadow = true; + this.lb2.TextVisible = true; + // + // panel4 + // + this.panel4.Dock = System.Windows.Forms.DockStyle.Top; + this.panel4.Location = new System.Drawing.Point(6, 128); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(496, 5); + this.panel4.TabIndex = 14; + // + // lb1 + // + this.lb1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb1.BackColor2 = System.Drawing.Color.Gray; + this.lb1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb1.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb1.BorderSize = new System.Windows.Forms.Padding(1); + this.lb1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb1.Dock = System.Windows.Forms.DockStyle.Top; + this.lb1.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.lb1.ForeColor = System.Drawing.Color.White; + this.lb1.GradientEnable = true; + this.lb1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb1.GradientRepeatBG = false; + this.lb1.isButton = false; + this.lb1.Location = new System.Drawing.Point(6, 78); + this.lb1.MouseDownColor = System.Drawing.Color.Yellow; + this.lb1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb1.msg = null; + this.lb1.Name = "lb1"; + this.lb1.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb1.ProgressEnable = false; + this.lb1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb1.ProgressForeColor = System.Drawing.Color.Black; + this.lb1.ProgressMax = 100F; + this.lb1.ProgressMin = 0F; + this.lb1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb1.ProgressValue = 0F; + this.lb1.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb1.Sign = ""; + this.lb1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb1.SignColor = System.Drawing.Color.Yellow; + this.lb1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb1.Size = new System.Drawing.Size(496, 50); + this.lb1.TabIndex = 2; + this.lb1.Text = "드라이브 : {0}"; + this.lb1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb1.TextShadow = true; + this.lb1.TextVisible = true; + // + // panel8 + // + this.panel8.Dock = System.Windows.Forms.DockStyle.Top; + this.panel8.Location = new System.Drawing.Point(6, 73); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(496, 5); + this.panel8.TabIndex = 18; + // + // lbTitle + // + this.lbTitle.BackColor = System.Drawing.Color.Brown; + this.lbTitle.BackColor2 = System.Drawing.Color.Tomato; + this.lbTitle.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbTitle.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbTitle.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderSize = new System.Windows.Forms.Padding(1); + this.lbTitle.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbTitle.Cursor = System.Windows.Forms.Cursors.Hand; + this.lbTitle.Dock = System.Windows.Forms.DockStyle.Top; + this.lbTitle.Font = new System.Drawing.Font("맑은 고딕", 22F, System.Drawing.FontStyle.Bold); + this.lbTitle.ForeColor = System.Drawing.Color.WhiteSmoke; + this.lbTitle.GradientEnable = true; + this.lbTitle.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Horizontal; + this.lbTitle.GradientRepeatBG = false; + this.lbTitle.isButton = true; + this.lbTitle.Location = new System.Drawing.Point(6, 6); + this.lbTitle.MouseDownColor = System.Drawing.Color.Yellow; + this.lbTitle.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbTitle.msg = null; + this.lbTitle.Name = "lbTitle"; + this.lbTitle.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbTitle.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbTitle.ProgressEnable = false; + this.lbTitle.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbTitle.ProgressForeColor = System.Drawing.Color.Black; + this.lbTitle.ProgressMax = 100F; + this.lbTitle.ProgressMin = 0F; + this.lbTitle.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbTitle.ProgressValue = 0F; + this.lbTitle.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.lbTitle.Sign = ""; + this.lbTitle.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbTitle.SignColor = System.Drawing.Color.Yellow; + this.lbTitle.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbTitle.Size = new System.Drawing.Size(496, 67); + this.lbTitle.TabIndex = 3; + this.lbTitle.Text = "프로그램 업데이트"; + this.lbTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbTitle.TextShadow = true; + this.lbTitle.TextVisible = true; + this.lbTitle.Click += new System.EventHandler(this.lbTitle_Click); + // + // arLabel1 + // + this.arLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arLabel1.BackColor2 = System.Drawing.Color.Gray; + this.arLabel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.arLabel1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.arLabel1.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.arLabel1.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.arLabel1.Dock = System.Windows.Forms.DockStyle.Top; + this.arLabel1.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold); + this.arLabel1.ForeColor = System.Drawing.Color.White; + this.arLabel1.GradientEnable = true; + this.arLabel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel1.GradientRepeatBG = false; + this.arLabel1.isButton = false; + this.arLabel1.Location = new System.Drawing.Point(6, 188); + this.arLabel1.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel1.msg = null; + this.arLabel1.Name = "arLabel1"; + this.arLabel1.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.arLabel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel1.ProgressEnable = false; + this.arLabel1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel1.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel1.ProgressMax = 100F; + this.arLabel1.ProgressMin = 0F; + this.arLabel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel1.ProgressValue = 0F; + this.arLabel1.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel1.Sign = ""; + this.arLabel1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel1.SignColor = System.Drawing.Color.Yellow; + this.arLabel1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel1.Size = new System.Drawing.Size(496, 50); + this.arLabel1.TabIndex = 19; + this.arLabel1.Text = "패치버젼 : {0}"; + this.arLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.arLabel1.TextShadow = true; + this.arLabel1.TextVisible = true; + // + // panel2 + // + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(6, 238); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(496, 5); + this.panel2.TabIndex = 20; + // + // fUpdateForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.ClientSize = new System.Drawing.Size(518, 368); + this.Controls.Add(this.arPanel1); + this.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.KeyPreview = true; + this.MaximizeBox = false; + this.Name = "fUpdateForm"; + this.Padding = new System.Windows.Forms.Padding(5); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Message Window"; + this.TopMost = true; + this.Load += new System.EventHandler(this.fMsg_Load); + this.arPanel1.ResumeLayout(false); + this.panButton.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public arCtl.arLabel lb1; + private arCtl.arPanel arPanel1; + public arCtl.arLabel lbTitle; + public arCtl.arLabel lb3; + public arCtl.arLabel lb2; + private System.Windows.Forms.Timer tmBlink; + public arCtl.arLabel btYes; + public arCtl.arLabel btNo; + private System.Windows.Forms.Panel panButton; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Panel panel8; + private System.Windows.Forms.Panel panel2; + public arCtl.arLabel arLabel1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fUpdateForm.cs b/Cs_HMI/Project/Dialog/fUpdateForm.cs new file mode 100644 index 0000000..7cec84d --- /dev/null +++ b/Cs_HMI/Project/Dialog/fUpdateForm.cs @@ -0,0 +1,256 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fUpdateForm : Form + { + private Boolean fMove = false; + private Point MDownPos; + private string _drive = string.Empty; + + public fUpdateForm() + { + InitializeComponent(); + } + + public fUpdateForm(string drvName) + { + InitializeComponent(); + _drive = drvName; + this.FormClosing += fMsgWindow_FormClosing; + this.KeyDown += FJobSelect_KeyDown; + this.lbTitle.MouseMove += label1_MouseMove; + lbTitle.MouseUp += label1_MouseUp; + lbTitle.MouseDown += label1_MouseDown; + lbTitle.MouseDoubleClick += label1_MouseDoubleClick; + + + } + + void fMsgWindow_FormClosing(object sender, FormClosingEventArgs e) + { + + } + + private void fMsg_Load(object sender, EventArgs e) + { + //해당드라이브에서 패치를 체크한다. + // AGV폴더 아래에 Patch_AGV_20200407.zip 식으로 파일을 처리한다 + + lb3.ProgressValue = 0; + lb3.Text = "--"; + lb1.Text = string.Format("드라이브 : {0}", _drive); + lb2.Text = "현재버젼 : " + PUB.PatchVersion; + var dir = System.IO.Path.Combine(this._drive, "AGV"); + if(System.IO.Directory.Exists(dir)) + { + //폴더는 있다 + var files = System.IO.Directory.GetFiles(dir, "Patch_AGV_*.zip"); + if(files == null || files.Length == 0) + { + arLabel1.Text = "패치파일이 없습니다"; + } + else + { + var LastFile = files.OrderByDescending(t => t).FirstOrDefault(); + var splbuf = LastFile.Split('_'); + + patchversion = splbuf[2] + splbuf[3].ToUpper().Replace(".ZIP", ""); + arLabel1.Text = "패치버젼 : " + patchversion; + arLabel1.Tag = LastFile; + btYes.Enabled = true; + } + } + else + { + arLabel1.Text = "패치폴더("+dir +")가 없습니다"; + + } + } + string patchversion = ""; + private void FJobSelect_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + e.Handled = true; + e.SuppressKeyPress = false; + DialogResult = DialogResult.Cancel; + this.Close(); + } + else if (e.KeyCode == Keys.F5) + btYes.PerformClick(); + } + + //public void setMessage(string msg) + //{ + // //msg를 분리해서 표시를 한다. + // var lbs = new arCtl.arLabel[] { lbTitle, lb1, lb2, lb3 }; + // var lineBuf = msg.Replace("\r", "").Split('\n'); + // int maxLine = Math.Min(lbs.Length, lineBuf.Length); + + // for (int i = 0; i < lbs.Length; i++) //최대줄을 넘어가는건 표시불가 + // { + // if (i >= lineBuf.Length) + // { + // lbs[i].Text = string.Empty; + // } + // else + // { + // if (i > 0) lbs[i].Text = string.Format("{0}. {1}", i, lineBuf[i]); + // else lbs[i].Text = lineBuf[i]; + // } + + // } + //} + + + + private void label1_MouseMove(object sender, MouseEventArgs e) + { + if (fMove) + { + Point offset = new Point(e.X - MDownPos.X, e.Y - MDownPos.Y); + this.Left += offset.X; + this.Top += offset.Y; + offset = new Point(0, 0); + } + } + + private void label1_MouseUp(object sender, MouseEventArgs e) + { + fMove = false; + } + + private void label1_MouseDown(object sender, MouseEventArgs e) + { + MDownPos = new Point(e.X, e.Y); + fMove = true; + } + + private void label1_MouseDoubleClick(object sender, MouseEventArgs e) + { + + + } + public enum EWinColor + { + Attention = 0, + Error, + Information + } + + public void SetWindowColor(EWinColor wincolor) + { + switch (wincolor) + { + case EWinColor.Attention: + lbTitle.BackColor = Color.Gold; + lbTitle.BackColor2 = Color.Orange; + lbTitle.ShadowColor = Color.FromArgb(150, 150, 150); + lbTitle.ForeColor = Color.FromArgb(50, 50, 50); + break; + case EWinColor.Error: + lbTitle.BackColor = Color.Brown; + lbTitle.BackColor2 = Color.Tomato; + lbTitle.ShadowColor = Color.FromArgb(50, 50, 50); + lbTitle.ForeColor = Color.WhiteSmoke; + break; + default: + lbTitle.BackColor = Color.DarkTurquoise; + lbTitle.BackColor2 = Color.LightSkyBlue; + lbTitle.ShadowColor = Color.FromArgb(50, 50, 50); + lbTitle.ForeColor = Color.WhiteSmoke; + break; + } + } + + private void lbTitle_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + + private void tmBlink_Tick(object sender, EventArgs e) + { + var bg1 = lbTitle.BackColor; + var bg2 = lbTitle.BackColor2; + lbTitle.BackColor = bg2; + lbTitle.BackColor2 = bg1; + } + + private void btYes_Click(object sender, EventArgs e) + { + //파일 + var file = arLabel1.Tag.ToString(); + if(System.IO.File.Exists(file)) + { + //이 파일을 _patch 폴더에 압축해제한다. + var dir_path = new System.IO.DirectoryInfo(System.IO.Path.Combine(Util.CurrentPath,"_patch")); + if (dir_path.Exists == true) + { + try + { + dir_path.Delete(true); + } catch (Exception ex) + { + Util.MsgE(ex.Message); + return; + } + } + else + { + dir_path.Create(); //폴더를 생성해준다. + } + + //해당폴더에 압축을 해제해준다. + var f = new Ionic.Zip.ZipFile(file); + f.ExtractProgress += F_ExtractProgress; + f.ExtractAll(dir_path.FullName); + f.ExtractProgress -= F_ExtractProgress; + + //패치정보파일 추가 + var infofile = System.IO.Path.Combine(dir_path.FullName, "version.txt"); + System.IO.File.WriteAllText(infofile, patchversion, System.Text.Encoding.UTF8); + + DialogResult = DialogResult.Yes; + this.Close(); + } + else + { + Util.MsgE("패치파일이 없습니다\n" + file); + return; + } + + } + + private void F_ExtractProgress(object sender, Ionic.Zip.ExtractProgressEventArgs e) + { + if(e.TotalBytesToTransfer < 1) + { + lb3.ProgressValue = 0; + } + else + { + var perc = (e.BytesTransferred / e.TotalBytesToTransfer) * 100.0; + this.lb3.ProgressValue = (float)perc; + } + + + } + + private void btNo_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + this.Close(); + + } + } +} diff --git a/Cs_HMI/Project/Dialog/fUpdateForm.resx b/Cs_HMI/Project/Dialog/fUpdateForm.resx new file mode 100644 index 0000000..fcee611 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fUpdateForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fVolume.Designer.cs b/Cs_HMI/Project/Dialog/fVolume.Designer.cs new file mode 100644 index 0000000..ac34e42 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fVolume.Designer.cs @@ -0,0 +1,168 @@ +namespace Project.Dialog +{ + partial class fVolume + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(10, 9); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(169, 103); + this.button1.TabIndex = 0; + this.button1.Text = "up"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(185, 9); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(169, 103); + this.button2.TabIndex = 1; + this.button2.Text = "down"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(360, 9); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(169, 103); + this.button3.TabIndex = 2; + this.button3.Text = "mute"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(185, 118); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(169, 103); + this.button4.TabIndex = 4; + this.button4.Text = "music down"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(10, 118); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(169, 103); + this.button5.TabIndex = 3; + this.button5.Text = "music up"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(359, 118); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(169, 46); + this.button6.TabIndex = 5; + this.button6.Text = "play"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(359, 175); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(169, 46); + this.button7.TabIndex = 5; + this.button7.Text = "stop"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(10, 227); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(169, 46); + this.button8.TabIndex = 6; + this.button8.Text = "Speak"; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.button8_Click); + // + // textBox1 + // + this.textBox1.Font = new System.Drawing.Font("굴림", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.textBox1.Location = new System.Drawing.Point(185, 234); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(343, 32); + this.textBox1.TabIndex = 7; + this.textBox1.Text = "음성 테스트 메세지 입니다"; + // + // fVolume + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(540, 282); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button8); + this.Controls.Add(this.button7); + this.Controls.Add(this.button6); + this.Controls.Add(this.button4); + this.Controls.Add(this.button5); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "fVolume"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "fVolume"; + this.Load += new System.EventHandler(this.fVolume_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.TextBox textBox1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/Dialog/fVolume.cs b/Cs_HMI/Project/Dialog/fVolume.cs new file mode 100644 index 0000000..397cbb0 --- /dev/null +++ b/Cs_HMI/Project/Dialog/fVolume.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project.Dialog +{ + public partial class fVolume : Form + { + //AudioSwitcher.AudioApi.CoreAudio.CoreAudioController ac; + //AudioSwitcher.AudioApi.CoreAudio.CoreAudioDevice dev; + System.Media.SoundPlayer snd; + + private const int APPCOMMAND_VOLUME_MUTE = 0x80000; + private const int APPCOMMAND_VOLUME_UP = 0xA0000; + private const int APPCOMMAND_VOLUME_DOWN = 0x90000; + private const int WM_APPCOMMAND = 0x319; + + [DllImport("user32.dll")] + public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, + IntPtr wParam, IntPtr lParam); + + private void Mute() + { + SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, + (IntPtr)APPCOMMAND_VOLUME_MUTE); + } + + private void VolDown() + { + SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, + (IntPtr)APPCOMMAND_VOLUME_DOWN); + } + + private void VolUp() + { + SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, + (IntPtr)APPCOMMAND_VOLUME_UP); + } + + public fVolume() + { + InitializeComponent(); + } + + private void trackBar1_Scroll(object sender, EventArgs e) + { + //if(dev != null) + //{ + // dev.Volume = this.trackBar1.Value; + // System.Media.SystemSounds.Beep.Play(); + //} + } + + private void fVolume_Load(object sender, EventArgs e) + { + snd = new System.Media.SoundPlayer(); + //var dev = new AudioSwitcher.AudioApi.CoreAudio.CoreAudioController().GetPlaybackDevices(); + //if (dev == null) + //{ + // trackBar1.Enabled = false; + // Util.MsgE("사운드 장치가 없습니다", true); + //} + //else + //{ + // this.trackBar1.Value = (int)dev.Volume; + // System.Media.SystemSounds.Beep.Play(); + //} + } + + private void button1_Click(object sender, EventArgs e) + { + //up + VolUp(); + System.Media.SystemSounds.Beep.Play(); + } + + private void button2_Click(object sender, EventArgs e) + { + VolDown(); + System.Media.SystemSounds.Beep.Play(); + } + + private void button3_Click(object sender, EventArgs e) + { + Mute(); + } + + private void button5_Click(object sender, EventArgs e) + { + PUB.mplayer.Volume += 0.1; + PUB.setting.musicvol = (int)(PUB.mplayer.Volume * 100); + } + + private void button4_Click(object sender, EventArgs e) + { + PUB.mplayer.Volume -= 0.1; + PUB.setting.musicvol = (int)(PUB.mplayer.Volume * 100); + } + + private void button7_Click(object sender, EventArgs e) + { + PUB.mplayer.Stop(); + } + + private void button6_Click(object sender, EventArgs e) + { + PUB.mplayer.Play(); + } + + private void button8_Click(object sender, EventArgs e) + { + var s = "고수석님, 그 에러는 못고쳐요. 포기 하면 편해요"; + var s1 = $"현재시간은 {DateTime.Now.Hour}시 입니다"; + PUB.Speak( this.textBox1.Text); + } + } +} diff --git a/Cs_HMI/Project/Dialog/fVolume.resx b/Cs_HMI/Project/Dialog/fVolume.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/Project/Dialog/fVolume.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/Project/Manager/DataBaseManager.cs b/Cs_HMI/Project/Manager/DataBaseManager.cs new file mode 100644 index 0000000..c1753a3 --- /dev/null +++ b/Cs_HMI/Project/Manager/DataBaseManager.cs @@ -0,0 +1,417 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project.Manager +{ + public class DatabaseManager + { + /// + /// 파일검색방법 + /// + public enum eFileSearchMode + { + Normal, + Project, + Model, + MCCode, + Barcode, + All, + } + + public enum eStripSearchResult + { + None, + OK, + NG, + } + + /// + /// 버퍼갯수(지정 갯수가 차면 실제파일에 기록을 한다) + /// + private int MaxBufferCount = 1; + + /// + /// 최종파일 + /// + private String LastFileName; + + + private string[] dataPath = new string[] { }; + private DataSet1.ResultDataDataTable dt; + // private string _subDirName = string.Empty; + + /// + /// 파일디비초기화작업(클라이언트 갯수만큼 버퍼를 확보한다) + /// + public DatabaseManager(string[] dataPath_, int _MaxBufferCount = 100) + { + LastFileName = string.Empty; + dt = new DataSet1.ResultDataDataTable(); + + this.dataPath = dataPath_; + if (dataPath_.Length == 0) dataPath = new string[]{ System.IO.Path.Combine(Util.CurrentPath, "Data")}; + + //최대버퍼갯수(이 갯수를 넘어가면 실제 파일에 기록한다) + MaxBufferCount = _MaxBufferCount; + //_subDirName = subDirName; + } + + //해당 결과를 버퍼에 추가한다. + public void Add(DataSet1.ResultDataRow dataRow, Boolean autoFlush = false) + { + //입력된 자료를 복사해서 버퍼에 넣는다. + var newdr = this.dt.NewResultDataRow(); + foreach (string col in getDataColumnList()) + { + newdr[col] = dataRow[col]; + } + this.dt.AddResultDataRow(newdr); + + //만약자료가 일정데이터수를 넘었다면 flush 한다 + if (autoFlush || dt.Rows.Count >= MaxBufferCount) + { + Flush(); //파일에 실제저장한다. + } + } + + /// + /// 신규파일을 생성합니다. + /// + /// + void MakeFile(string filename) + { + //파일이없다면 헤더를 만들어준다. + arUtil.XMLHelper xml = new arUtil.XMLHelper(filename); + xml.CreateFile(); + } + + /// + /// 저장해야할 컬럼명을 반환한다.(idx는 제외한다) + /// + /// + public string[] getDataColumnList() + { + //저장하고자하는 순서를 미리 지정한다.(지정안된 자료는 알아서 저장된다) + string[] reserveCols = new string[] { }; + List cols = new List(); + cols.AddRange(reserveCols); + + for (int i = 0; i < this.dt.Columns.Count; i++) + { + string colname = dt.Columns[i].ColumnName; + if (reserveCols.Contains(colname)) continue; + cols.Add(colname); + } + return cols.ToArray(); + } + + public void Flush() + { + //데이터가없다면 처리하지 않음 + if (this.dt.Rows.Count < 1) return; + + //쓸데이터를 모두 버퍼에 밀어넣는다. + + foreach (DataSet1.ResultDataRow dr in dt.Rows) + { + if (dr.RowState == System.Data.DataRowState.Deleted || dr.RowState == System.Data.DataRowState.Detached) continue; + + //lot date check + if (dr.time_start.Year == 1982) dr.time_start = DateTime.Now; + if (dr.time_end.Year == 1982) dr.time_end = DateTime.Now; + + //작업이 종료된 시간을 기준으로 파일을 생성한다. + // if (dr.info_lot.isEmpty()) dr.info_lot = "NoLot"; + //if (dr.info_stripid.isEmpty()) dr.info_stripid = "S" + dr.time_pcbstart.ToString("yyyyMMddHHmmss"); + + //string curdatestr = string.Format("{0:0000}\\{1:00}\\{2:00}\\{3}\\{4}", + // dr.time_lotstart.Year, dr.time_lotstart.Month, dr.time_lotstart.Day, dr.info_lot,dr.info_stripid); + + //저장할 파일 체크 + System.IO.FileInfo fi =new System.IO.FileInfo( dr.info_filename+".xml"); + + //폴더새엇ㅇ + if (!fi.Directory.Exists) fi.Directory.Create(); + + //파일없는경우 헤더생성 + if (!fi.Exists) MakeFile(fi.FullName); + + //파일에기록 + try + { + //general info + var xml = new arUtil.XMLHelper(fi.FullName); + foreach(System.Data.DataColumn dc in this.dt.Columns) + { + if (dc.ColumnName.ToLower() == "idx") continue; + if (dc.ColumnName.ToLower() == "filename") continue; + var colname = dc.ColumnName.Split('_'); + var data = dr[dc.ColumnName]; + if(colname[0].ToLower()=="time") + { + string date_value = ""; + if (data != null && data != DBNull.Value) + date_value = ((DateTime)data).ToString("yyyy-MM-dd HH:mm:ss"); + xml.set_Data(colname[0], colname[1], date_value); + + } else + { + if(data != null && data != DBNull.Value) + xml.set_Data(colname[0], colname[1], data.ToString()); + else + xml.set_Data(colname[0], colname[1], ""); + } + } + string savemsg; + xml.Save(out savemsg); + } + catch (Exception ex) + { + PUB.log.AddE("DBMAN:FLUSH:" + ex.Message); + return; + } + + PUB.log.Add("DATABASE", string.Format("◆ Data Saved : {0}", fi.Name)); + } + + dt.Clear(); + dt.AcceptChanges(); + } + + /// + /// 지정된 파일의 모든 내용을 읽어서 DataTable 로 반환합니다. + /// + /// + /// + public DataSet1.ResultDataDataTable GetDatas(List files) + { + DataSet1.ResultDataDataTable retval = new DataSet1.ResultDataDataTable(); + //모든파일을 대상으로한다. + + foreach(var file in files) + { + var newdr = retval.NewResultDataRow(); + newdr.info_filename = file.FullName; + arUtil.XMLHelper xml = new arUtil.XMLHelper(file.FullName); + foreach (System.Data.DataColumn col in retval.Columns) + { + if (col.ColumnName.ToLower() == "idx") continue; + if (col.ColumnName.ToLower() == "filename") continue; + var colbuf = col.ColumnName.Split('_'); + + var readstr = xml.get_Data(colbuf[0], colbuf[1]); + if(col.DataType == typeof(DateTime)) + { + if(readstr != "") + { + DateTime dt; + if (DateTime.TryParse(readstr, out dt)) + newdr[col.ColumnName] = dt; + } + } + else + { + newdr[col.ColumnName] =readstr; + } + + + } + retval.AddResultDataRow(newdr); + } + + + retval.AcceptChanges(); + return retval; + } + + + public eStripSearchResult FindStrip(List pathlist, string strip) + { + //지정된 경로내에 스트립파일이 존재하는가? + foreach(var path in pathlist) + { + var filese = System.IO.Directory.GetFiles( path , strip + ".xml"); + if(filese .Length == 1) + { + var xml = new arUtil.XMLHelper(filese[0]); + var upload = xml.get_Data("info", "upload"); + if (upload == "O") return eStripSearchResult.OK; + } + } + return eStripSearchResult.None; + } + /// + /// 지정된 파일의 모든 내용을 읽어서 DataTable 로 반환합니다. + /// + /// + /// + public eStripSearchResult FindStrip(List files, string strip) + { + eStripSearchResult retval = eStripSearchResult.None; + System.Text.StringBuilder sbError = new StringBuilder(); + if (files.Count < 1) return eStripSearchResult.None; + + //가장최신의데이터를 찾아야한다. + DateTime MaxDate = DateTime.Parse("1982-11-23"); + string MaxResult = string.Empty; + + foreach (var fi in files.OrderByDescending(t => t.FullName)) + { + Boolean DataFind = false; + List cols = new List(); + System.IO.FileStream fs = new System.IO.FileStream(fi.FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite); + System.IO.StreamReader sr = new System.IO.StreamReader(fs, System.Text.Encoding.ASCII); + int LineCount = 0; + while (sr.Peek() > 0) + { + string buffer = sr.ReadLine(); + LineCount += 1; + if (buffer.isEmpty() || buffer.StartsWith(";")) continue; + var databuffer = buffer.Split(','); + if (cols.Count < 1) + { + //줄로처리한다. + foreach (string colname in databuffer) + cols.Add(colname); + } + else + { + //지정한 바코드 자료만 처리한다. + if (databuffer[2] != strip) continue; + + DateTime endtime; + if (DateTime.TryParse(databuffer[4], out endtime)) + { + MaxResult = databuffer[5]; + if (MaxResult.ToUpper() != "FAIL") + { + if (endtime > MaxDate) + { + MaxDate = endtime; + if (MaxResult == "OK") + retval = eStripSearchResult.OK; + else if (MaxResult == "NG") + retval = eStripSearchResult.NG; + } + DataFind = true; //다른파일은 작동하지 않게한다. + } + } + } + } + + sr.Close(); + sr.Dispose(); + fs.Close(); + fs.Dispose(); + if (DataFind) break; + } + return retval; + } + + public List GetPathListbyLot(DateTime sdate, DateTime edate, string lot) + { + List retfiles = new List(); + //날짜사이의 모든 파일을 대상으로해야함 + + string sd = sdate.ToShortDateString(); + string ed = edate.ToShortDateString(); + + int sy = sdate.Year; + int ey = edate.Year; + int sm = sdate.Month; + int em = edate.Month; + int sday = sdate.Day; + int eday = edate.Day; + + Boolean endtast = false; + for (int y = sy; y <= ey; y++) + { + for (int m = 1; m <= 12; m++) + { + for (int d = 1; d <= 31; d++) + { + string daystr = string.Format("{0:0000}-{1:00}-{2:00}", y, m, d); + if (ed == daystr) endtast = true; //마지막 날짜이다. + + if (y == sy && m < sm) continue; //시작년도 시작월 이전의 자료라면 넘어간다. + else if (y == sy && m == sm && d < sday) continue; //시작년도 시작월 시작일 이전의 자료라면 넘어간다. + + foreach (var data in this.dataPath) + { + var path = new System.IO.DirectoryInfo(System.IO.Path.Combine(data, daystr.Replace("-", "\\"), lot)); + if (path.Exists == false) continue; + else retfiles.Add(path.FullName); + } + + if (endtast) + break; // TODO: might not be correct. Was : Exit For + } + if (endtast) + break; // TODO: might not be correct. Was : Exit For + } + if (endtast) + break; // TODO: might not be correct. Was : Exit For + } + return retfiles; + } + + /// + /// 지정된 기간사이의 파일명을 반환합니다. + /// + /// 검색시작일(시간은 적용안함) + /// 검색종료일(시간은 적용안함) + /// 검색필터 + /// 장치번호 + /// 검색바코드 + /// + public List Getfiles(DateTime sdate, DateTime edate) + { + List retfiles = new List(); + //날짜사이의 모든 파일을 대상으로해야함 + + string sd = sdate.ToShortDateString(); + string ed = edate.ToShortDateString(); + + int sy = sdate.Year; + int ey = edate.Year; + int sm = sdate.Month; + int em = edate.Month; + int sday = sdate.Day; + int eday = edate.Day; + + Boolean endtast = false; + for (int y = sy; y <= ey; y++) + { + for (int m = 1; m <= 12; m++) + { + for (int d = 1; d <= 31; d++) + { + string daystr = string.Format("{0:0000}-{1:00}-{2:00}", y, m, d); + if (ed == daystr) endtast = true; //마지막 날짜이다. + + if (y == sy && m < sm) continue; //시작년도 시작월 이전의 자료라면 넘어간다. + else if (y == sy && m == sm && d < sday) continue; //시작년도 시작월 시작일 이전의 자료라면 넘어간다. + + foreach(var data in this.dataPath) + { + var path = new System.IO.DirectoryInfo(System.IO.Path.Combine(data, daystr.Replace("-", "\\"))); + if (path.Exists == false) continue; + var files = path.GetFiles("*.xml", System.IO.SearchOption.AllDirectories); + if (files != null && files.Length > 0) retfiles.AddRange(files); + } + + if (endtast) + break; // TODO: might not be correct. Was : Exit For + } + if (endtast) + break; // TODO: might not be correct. Was : Exit For + } + if (endtast) + break; // TODO: might not be correct. Was : Exit For + } + return retfiles; + } + } +} diff --git a/Cs_HMI/Project/MessageWindow/CMessageData.cs b/Cs_HMI/Project/MessageWindow/CMessageData.cs new file mode 100644 index 0000000..8f69860 --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/CMessageData.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class MessageWindow + { + public class CMessageData + { + public string Message { get; set; } + public eWindowType WindowType { get; set; } + public System.Drawing.Size WindowSize { get; set; } + public Boolean EnableClose { get; set; } + public System.Drawing.Font FontTitle { get; set; } + public System.Drawing.Font FontContent { get; set; } + public System.Windows.Forms.Form msgForm { get; set; } + public CMessageData() + { + WindowType = eWindowType.information; + WindowSize = new System.Drawing.Size(900, 500); + EnableClose = true; + FontContent = null; + FontTitle = null; + msgForm = null; + } + ~CMessageData() + { + if (msgForm != null) msgForm.Dispose(); + if (FontTitle != null) FontTitle.Dispose(); + if (FontContent != null) FontContent.Dispose(); + } + } + } + +} diff --git a/Cs_HMI/Project/MessageWindow/MessageWindow.cs b/Cs_HMI/Project/MessageWindow/MessageWindow.cs new file mode 100644 index 0000000..90e558c --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/MessageWindow.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using System.Windows.Forms; + +namespace Project +{ + public partial class MessageWindow + { + public enum eWindowPosition + { + center = 0, + top = 1, + bottom = 2 + } + + public enum eWindowType + { + information, + error, + attention, + } + + + public bool needClose = false; + public Boolean needShow = false; + private CMessageData msgBuffer = new CMessageData(); + + public void setMessage(CMessageData msgData) + { + //마지막데잍와 동일하고 버퍼에 데이터가 있다면 처리하지 않는다. + if (msgBuffer == msgData) return; + + //신규 메세지를 추가 + msgBuffer = msgData; + + //화면이 표시되어야하므로 플래그 설정 + needShow = true; + } + + public void setMessage(string msg, + eWindowType winType = eWindowType.error, + int width = 900, int height = 500, + Boolean enbClose = true, + Font fontTitle = null, + Font fontBody = null) + { + setMessage(new CMessageData() + { + EnableClose = enbClose, + FontContent = fontBody, + FontTitle = fontTitle, + Message = msg, + WindowSize = new Size(width, height), + WindowType = winType + }); + + } + + + fMessageWindow msgwin;// = new fMsgWindow(""); + + /// + /// 메세지 버퍼의 내용을 폼으로 표시합니다. + /// UI 쓰레드를 사용하므로 invoke 를 이용해 호출 하거나 + /// UI 쓰레드내에서 실행 하시기 바랍니다. + /// + public void showMessage() + { + //등록된 메세지 버퍼의 내용을 화면에 표시한다. + if (msgwin == null) msgwin = new fMessageWindow(""); + msgwin.TopMost = true; + // msgwin.Disposed += (s1, e1) => { CloseMsg(item.Key); }; + //msgwin.Width = this.msgBuffer.WindowSize.Width; + //msgwin.Height = msgBuffer.WindowSize.Height; + //msgwin.BackColor = Color.FromArgb(200, 200, 200); + msgwin.StartPosition = FormStartPosition.CenterScreen; + msgwin.btNo.Visible = false; + msgwin.btYes.Visible = false; + msgwin.Height = 474; + msgwin.setMessage(msgBuffer.Message); + //set font + if (msgBuffer.FontTitle != null) msgwin.lbTitle.Font = msgBuffer.FontTitle; + if (msgBuffer.FontContent != null) + { + msgwin.lb1.Font = msgBuffer.FontContent; + msgwin.lb2.Font = msgBuffer.FontContent; + msgwin.lb3.Font = msgBuffer.FontContent; + msgwin.lb4.Font = msgBuffer.FontContent; + msgwin.lb5.Font = msgBuffer.FontContent; + msgwin.lb6.Font = msgBuffer.FontContent; + msgwin.lb7.Font = msgBuffer.FontContent; + } + + switch (msgBuffer.WindowType) + { + case eWindowType.attention: + msgwin.SetWindowColor(fMessageWindow.EWinColor.Attention); + break; + case eWindowType.error: + msgwin.SetWindowColor(fMessageWindow.EWinColor.Error); + break; + default: + msgwin.SetWindowColor(fMessageWindow.EWinColor.Information); + break; + } + + if (!msgBuffer.EnableClose) msgwin.EnableUserClose = false; + if (msgwin.Visible == false) msgwin.Show(); + else + { + msgwin.Visible = true; + msgwin.Activate(); + } + + needShow = false; + } + + + public Boolean Visible + { + get + { + if (msgwin == null) return false; + return msgwin.Visible; + } + set + { + if(value == true) + { + if (msgwin.Visible == false) + { + msgwin.Show(); + msgwin.Activate(); + } + else + { + msgwin.Activate(); + } + needShow = false; + } + else + { + if (msgwin != null) + msgwin.Visible = false; + needClose = false; + } + + } + } + + } +} diff --git a/Cs_HMI/Project/MessageWindow/fMessageWindow.Designer.cs b/Cs_HMI/Project/MessageWindow/fMessageWindow.Designer.cs new file mode 100644 index 0000000..4fce6d4 --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/fMessageWindow.Designer.cs @@ -0,0 +1,676 @@ +namespace Project +{ + partial class fMessageWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmBlink = new System.Windows.Forms.Timer(this.components); + this.arPanel1 = new arCtl.arPanel(); + this.panButton = new System.Windows.Forms.Panel(); + this.btYes = new arCtl.arLabel(); + this.btNo = new arCtl.arLabel(); + this.panel7 = new System.Windows.Forms.Panel(); + this.lb7 = new arCtl.arLabel(); + this.panel6 = new System.Windows.Forms.Panel(); + this.lb6 = new arCtl.arLabel(); + this.panel5 = new System.Windows.Forms.Panel(); + this.lb5 = new arCtl.arLabel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lb4 = new arCtl.arLabel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.lb3 = new arCtl.arLabel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lb2 = new arCtl.arLabel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.lb1 = new arCtl.arLabel(); + this.panel8 = new System.Windows.Forms.Panel(); + this.lbTitle = new arCtl.arLabel(); + this.arPanel1.SuspendLayout(); + this.panButton.SuspendLayout(); + this.SuspendLayout(); + // + // tmBlink + // + this.tmBlink.Enabled = true; + this.tmBlink.Interval = 300; + this.tmBlink.Tick += new System.EventHandler(this.tmBlink_Tick); + // + // arPanel1 + // + this.arPanel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arPanel1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arPanel1.BorderColor = System.Drawing.Color.DimGray; + this.arPanel1.BorderSize = new System.Windows.Forms.Padding(1); + this.arPanel1.Controls.Add(this.panButton); + this.arPanel1.Controls.Add(this.panel7); + this.arPanel1.Controls.Add(this.lb7); + this.arPanel1.Controls.Add(this.panel6); + this.arPanel1.Controls.Add(this.lb6); + this.arPanel1.Controls.Add(this.panel5); + this.arPanel1.Controls.Add(this.lb5); + this.arPanel1.Controls.Add(this.panel3); + this.arPanel1.Controls.Add(this.lb4); + this.arPanel1.Controls.Add(this.panel2); + this.arPanel1.Controls.Add(this.lb3); + this.arPanel1.Controls.Add(this.panel1); + this.arPanel1.Controls.Add(this.lb2); + this.arPanel1.Controls.Add(this.panel4); + this.arPanel1.Controls.Add(this.lb1); + this.arPanel1.Controls.Add(this.panel8); + this.arPanel1.Controls.Add(this.lbTitle); + this.arPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.arPanel1.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Italic); + this.arPanel1.ForeColor = System.Drawing.Color.Khaki; + this.arPanel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arPanel1.GradientRepeatBG = false; + this.arPanel1.Location = new System.Drawing.Point(5, 5); + this.arPanel1.Name = "arPanel1"; + this.arPanel1.Padding = new System.Windows.Forms.Padding(6); + this.arPanel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arPanel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arPanel1.ProgressMax = 100F; + this.arPanel1.ProgressMin = 0F; + this.arPanel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arPanel1.ProgressValue = 0F; + this.arPanel1.ShadowColor = System.Drawing.Color.Black; + this.arPanel1.ShowBorder = true; + this.arPanel1.Size = new System.Drawing.Size(719, 530); + this.arPanel1.TabIndex = 4; + this.arPanel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.arPanel1.TextShadow = false; + this.arPanel1.UseProgressBar = false; + // + // panButton + // + this.panButton.Controls.Add(this.btYes); + this.panButton.Controls.Add(this.btNo); + this.panButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.panButton.Location = new System.Drawing.Point(6, 463); + this.panButton.Name = "panButton"; + this.panButton.Size = new System.Drawing.Size(707, 61); + this.panButton.TabIndex = 10; + // + // btYes + // + this.btYes.BackColor = System.Drawing.Color.SeaGreen; + this.btYes.BackColor2 = System.Drawing.Color.SeaGreen; + this.btYes.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btYes.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btYes.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btYes.BorderSize = new System.Windows.Forms.Padding(1); + this.btYes.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btYes.Cursor = System.Windows.Forms.Cursors.Hand; + this.btYes.Dock = System.Windows.Forms.DockStyle.Fill; + this.btYes.Font = new System.Drawing.Font("맑은 고딕", 25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btYes.ForeColor = System.Drawing.Color.Black; + this.btYes.GradientEnable = true; + this.btYes.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btYes.GradientRepeatBG = false; + this.btYes.isButton = true; + this.btYes.Location = new System.Drawing.Point(0, 0); + this.btYes.MouseDownColor = System.Drawing.Color.Yellow; + this.btYes.MouseOverColor = System.Drawing.Color.Yellow; + this.btYes.msg = null; + this.btYes.Name = "btYes"; + this.btYes.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btYes.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btYes.ProgressEnable = false; + this.btYes.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btYes.ProgressForeColor = System.Drawing.Color.Black; + this.btYes.ProgressMax = 100F; + this.btYes.ProgressMin = 0F; + this.btYes.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btYes.ProgressValue = 0F; + this.btYes.ShadowColor = System.Drawing.Color.Gray; + this.btYes.Sign = ""; + this.btYes.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btYes.SignColor = System.Drawing.Color.Yellow; + this.btYes.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btYes.Size = new System.Drawing.Size(478, 61); + this.btYes.TabIndex = 0; + this.btYes.Text = "예"; + this.btYes.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btYes.TextShadow = true; + this.btYes.TextVisible = true; + this.btYes.Click += new System.EventHandler(this.btYes_Click); + // + // btNo + // + this.btNo.BackColor = System.Drawing.Color.Goldenrod; + this.btNo.BackColor2 = System.Drawing.Color.Goldenrod; + this.btNo.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btNo.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btNo.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btNo.BorderSize = new System.Windows.Forms.Padding(1); + this.btNo.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btNo.Cursor = System.Windows.Forms.Cursors.Hand; + this.btNo.Dock = System.Windows.Forms.DockStyle.Right; + this.btNo.Font = new System.Drawing.Font("맑은 고딕", 25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btNo.ForeColor = System.Drawing.Color.Black; + this.btNo.GradientEnable = true; + this.btNo.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btNo.GradientRepeatBG = false; + this.btNo.isButton = true; + this.btNo.Location = new System.Drawing.Point(478, 0); + this.btNo.MouseDownColor = System.Drawing.Color.Yellow; + this.btNo.MouseOverColor = System.Drawing.Color.Yellow; + this.btNo.msg = null; + this.btNo.Name = "btNo"; + this.btNo.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btNo.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btNo.ProgressEnable = false; + this.btNo.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btNo.ProgressForeColor = System.Drawing.Color.Black; + this.btNo.ProgressMax = 100F; + this.btNo.ProgressMin = 0F; + this.btNo.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btNo.ProgressValue = 0F; + this.btNo.ShadowColor = System.Drawing.Color.Gray; + this.btNo.Sign = ""; + this.btNo.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btNo.SignColor = System.Drawing.Color.Yellow; + this.btNo.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btNo.Size = new System.Drawing.Size(229, 61); + this.btNo.TabIndex = 0; + this.btNo.Text = "아니오"; + this.btNo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btNo.TextShadow = true; + this.btNo.TextVisible = true; + this.btNo.Click += new System.EventHandler(this.btNo_Click); + // + // panel7 + // + this.panel7.Dock = System.Windows.Forms.DockStyle.Top; + this.panel7.Location = new System.Drawing.Point(6, 458); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(707, 5); + this.panel7.TabIndex = 17; + // + // lb7 + // + this.lb7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb7.BackColor2 = System.Drawing.Color.Gray; + this.lb7.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb7.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb7.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb7.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb7.BorderSize = new System.Windows.Forms.Padding(1); + this.lb7.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb7.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb7.Dock = System.Windows.Forms.DockStyle.Top; + this.lb7.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.lb7.ForeColor = System.Drawing.Color.White; + this.lb7.GradientEnable = true; + this.lb7.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb7.GradientRepeatBG = false; + this.lb7.isButton = false; + this.lb7.Location = new System.Drawing.Point(6, 408); + this.lb7.MouseDownColor = System.Drawing.Color.Yellow; + this.lb7.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb7.msg = null; + this.lb7.Name = "lb7"; + this.lb7.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb7.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb7.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb7.ProgressEnable = false; + this.lb7.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb7.ProgressForeColor = System.Drawing.Color.Black; + this.lb7.ProgressMax = 100F; + this.lb7.ProgressMin = 0F; + this.lb7.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb7.ProgressValue = 0F; + this.lb7.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb7.Sign = ""; + this.lb7.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb7.SignColor = System.Drawing.Color.Yellow; + this.lb7.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb7.Size = new System.Drawing.Size(707, 50); + this.lb7.TabIndex = 9; + this.lb7.Text = "*"; + this.lb7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb7.TextShadow = true; + this.lb7.TextVisible = true; + // + // panel6 + // + this.panel6.Dock = System.Windows.Forms.DockStyle.Top; + this.panel6.Location = new System.Drawing.Point(6, 403); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(707, 5); + this.panel6.TabIndex = 16; + // + // lb6 + // + this.lb6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb6.BackColor2 = System.Drawing.Color.Gray; + this.lb6.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb6.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb6.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb6.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb6.BorderSize = new System.Windows.Forms.Padding(1); + this.lb6.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb6.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb6.Dock = System.Windows.Forms.DockStyle.Top; + this.lb6.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.lb6.ForeColor = System.Drawing.Color.White; + this.lb6.GradientEnable = true; + this.lb6.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb6.GradientRepeatBG = false; + this.lb6.isButton = false; + this.lb6.Location = new System.Drawing.Point(6, 353); + this.lb6.MouseDownColor = System.Drawing.Color.Yellow; + this.lb6.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb6.msg = null; + this.lb6.Name = "lb6"; + this.lb6.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb6.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb6.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb6.ProgressEnable = false; + this.lb6.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb6.ProgressForeColor = System.Drawing.Color.Black; + this.lb6.ProgressMax = 100F; + this.lb6.ProgressMin = 0F; + this.lb6.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb6.ProgressValue = 0F; + this.lb6.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb6.Sign = ""; + this.lb6.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb6.SignColor = System.Drawing.Color.Yellow; + this.lb6.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb6.Size = new System.Drawing.Size(707, 50); + this.lb6.TabIndex = 8; + this.lb6.Text = "*"; + this.lb6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb6.TextShadow = true; + this.lb6.TextVisible = true; + // + // panel5 + // + this.panel5.Dock = System.Windows.Forms.DockStyle.Top; + this.panel5.Location = new System.Drawing.Point(6, 348); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(707, 5); + this.panel5.TabIndex = 15; + // + // lb5 + // + this.lb5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb5.BackColor2 = System.Drawing.Color.Gray; + this.lb5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb5.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb5.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb5.BorderSize = new System.Windows.Forms.Padding(1); + this.lb5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb5.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb5.Dock = System.Windows.Forms.DockStyle.Top; + this.lb5.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.lb5.ForeColor = System.Drawing.Color.White; + this.lb5.GradientEnable = true; + this.lb5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb5.GradientRepeatBG = false; + this.lb5.isButton = false; + this.lb5.Location = new System.Drawing.Point(6, 298); + this.lb5.MouseDownColor = System.Drawing.Color.Yellow; + this.lb5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb5.msg = null; + this.lb5.Name = "lb5"; + this.lb5.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb5.ProgressEnable = false; + this.lb5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb5.ProgressForeColor = System.Drawing.Color.Black; + this.lb5.ProgressMax = 100F; + this.lb5.ProgressMin = 0F; + this.lb5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb5.ProgressValue = 0F; + this.lb5.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb5.Sign = ""; + this.lb5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb5.SignColor = System.Drawing.Color.Yellow; + this.lb5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb5.Size = new System.Drawing.Size(707, 50); + this.lb5.TabIndex = 7; + this.lb5.Text = "*"; + this.lb5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb5.TextShadow = true; + this.lb5.TextVisible = true; + // + // panel3 + // + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(6, 293); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(707, 5); + this.panel3.TabIndex = 13; + // + // lb4 + // + this.lb4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb4.BackColor2 = System.Drawing.Color.Gray; + this.lb4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb4.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb4.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb4.BorderSize = new System.Windows.Forms.Padding(1); + this.lb4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb4.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb4.Dock = System.Windows.Forms.DockStyle.Top; + this.lb4.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.lb4.ForeColor = System.Drawing.Color.White; + this.lb4.GradientEnable = true; + this.lb4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb4.GradientRepeatBG = false; + this.lb4.isButton = false; + this.lb4.Location = new System.Drawing.Point(6, 243); + this.lb4.MouseDownColor = System.Drawing.Color.Yellow; + this.lb4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb4.msg = null; + this.lb4.Name = "lb4"; + this.lb4.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb4.ProgressEnable = false; + this.lb4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb4.ProgressForeColor = System.Drawing.Color.Black; + this.lb4.ProgressMax = 100F; + this.lb4.ProgressMin = 0F; + this.lb4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb4.ProgressValue = 0F; + this.lb4.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb4.Sign = ""; + this.lb4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb4.SignColor = System.Drawing.Color.Yellow; + this.lb4.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb4.Size = new System.Drawing.Size(707, 50); + this.lb4.TabIndex = 6; + this.lb4.Text = "*"; + this.lb4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb4.TextShadow = true; + this.lb4.TextVisible = true; + // + // panel2 + // + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(6, 238); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(707, 5); + this.panel2.TabIndex = 12; + // + // lb3 + // + this.lb3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb3.BackColor2 = System.Drawing.Color.Gray; + this.lb3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb3.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb3.BorderSize = new System.Windows.Forms.Padding(1); + this.lb3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb3.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb3.Dock = System.Windows.Forms.DockStyle.Top; + this.lb3.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.lb3.ForeColor = System.Drawing.Color.White; + this.lb3.GradientEnable = true; + this.lb3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb3.GradientRepeatBG = false; + this.lb3.isButton = false; + this.lb3.Location = new System.Drawing.Point(6, 188); + this.lb3.MouseDownColor = System.Drawing.Color.Yellow; + this.lb3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb3.msg = null; + this.lb3.Name = "lb3"; + this.lb3.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb3.ProgressEnable = false; + this.lb3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb3.ProgressForeColor = System.Drawing.Color.Black; + this.lb3.ProgressMax = 100F; + this.lb3.ProgressMin = 0F; + this.lb3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb3.ProgressValue = 0F; + this.lb3.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb3.Sign = ""; + this.lb3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb3.SignColor = System.Drawing.Color.Yellow; + this.lb3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb3.Size = new System.Drawing.Size(707, 50); + this.lb3.TabIndex = 5; + this.lb3.Text = "*"; + this.lb3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb3.TextShadow = true; + this.lb3.TextVisible = true; + // + // panel1 + // + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(6, 183); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(707, 5); + this.panel1.TabIndex = 11; + // + // lb2 + // + this.lb2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb2.BackColor2 = System.Drawing.Color.Gray; + this.lb2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb2.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb2.BorderSize = new System.Windows.Forms.Padding(1); + this.lb2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb2.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb2.Dock = System.Windows.Forms.DockStyle.Top; + this.lb2.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.lb2.ForeColor = System.Drawing.Color.White; + this.lb2.GradientEnable = true; + this.lb2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb2.GradientRepeatBG = false; + this.lb2.isButton = false; + this.lb2.Location = new System.Drawing.Point(6, 133); + this.lb2.MouseDownColor = System.Drawing.Color.Yellow; + this.lb2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb2.msg = null; + this.lb2.Name = "lb2"; + this.lb2.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb2.ProgressEnable = false; + this.lb2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb2.ProgressForeColor = System.Drawing.Color.Black; + this.lb2.ProgressMax = 100F; + this.lb2.ProgressMin = 0F; + this.lb2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb2.ProgressValue = 0F; + this.lb2.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb2.Sign = ""; + this.lb2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb2.SignColor = System.Drawing.Color.Yellow; + this.lb2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb2.Size = new System.Drawing.Size(707, 50); + this.lb2.TabIndex = 4; + this.lb2.Text = "*"; + this.lb2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb2.TextShadow = true; + this.lb2.TextVisible = true; + // + // panel4 + // + this.panel4.Dock = System.Windows.Forms.DockStyle.Top; + this.panel4.Location = new System.Drawing.Point(6, 128); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(707, 5); + this.panel4.TabIndex = 14; + // + // lb1 + // + this.lb1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb1.BackColor2 = System.Drawing.Color.Gray; + this.lb1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb1.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lb1.BorderSize = new System.Windows.Forms.Padding(1); + this.lb1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb1.Dock = System.Windows.Forms.DockStyle.Top; + this.lb1.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.lb1.ForeColor = System.Drawing.Color.White; + this.lb1.GradientEnable = true; + this.lb1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lb1.GradientRepeatBG = false; + this.lb1.isButton = false; + this.lb1.Location = new System.Drawing.Point(6, 78); + this.lb1.MouseDownColor = System.Drawing.Color.Yellow; + this.lb1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb1.msg = null; + this.lb1.Name = "lb1"; + this.lb1.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb1.ProgressEnable = false; + this.lb1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb1.ProgressForeColor = System.Drawing.Color.Black; + this.lb1.ProgressMax = 100F; + this.lb1.ProgressMin = 0F; + this.lb1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb1.ProgressValue = 0F; + this.lb1.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lb1.Sign = ""; + this.lb1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb1.SignColor = System.Drawing.Color.Yellow; + this.lb1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb1.Size = new System.Drawing.Size(707, 50); + this.lb1.TabIndex = 2; + this.lb1.Text = "*"; + this.lb1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb1.TextShadow = true; + this.lb1.TextVisible = true; + // + // panel8 + // + this.panel8.Dock = System.Windows.Forms.DockStyle.Top; + this.panel8.Location = new System.Drawing.Point(6, 73); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(707, 5); + this.panel8.TabIndex = 18; + // + // lbTitle + // + this.lbTitle.BackColor = System.Drawing.Color.Brown; + this.lbTitle.BackColor2 = System.Drawing.Color.Tomato; + this.lbTitle.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbTitle.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbTitle.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderSize = new System.Windows.Forms.Padding(1); + this.lbTitle.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbTitle.Cursor = System.Windows.Forms.Cursors.Hand; + this.lbTitle.Dock = System.Windows.Forms.DockStyle.Top; + this.lbTitle.Font = new System.Drawing.Font("맑은 고딕", 28F, System.Drawing.FontStyle.Bold); + this.lbTitle.ForeColor = System.Drawing.Color.WhiteSmoke; + this.lbTitle.GradientEnable = true; + this.lbTitle.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Horizontal; + this.lbTitle.GradientRepeatBG = false; + this.lbTitle.isButton = true; + this.lbTitle.Location = new System.Drawing.Point(6, 6); + this.lbTitle.MouseDownColor = System.Drawing.Color.Yellow; + this.lbTitle.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbTitle.msg = null; + this.lbTitle.Name = "lbTitle"; + this.lbTitle.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbTitle.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbTitle.ProgressEnable = false; + this.lbTitle.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbTitle.ProgressForeColor = System.Drawing.Color.Black; + this.lbTitle.ProgressMax = 100F; + this.lbTitle.ProgressMin = 0F; + this.lbTitle.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbTitle.ProgressValue = 0F; + this.lbTitle.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.lbTitle.Sign = ""; + this.lbTitle.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbTitle.SignColor = System.Drawing.Color.Yellow; + this.lbTitle.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbTitle.Size = new System.Drawing.Size(707, 67); + this.lbTitle.TabIndex = 3; + this.lbTitle.Text = "TITLE"; + this.lbTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbTitle.TextShadow = true; + this.lbTitle.TextVisible = true; + this.lbTitle.Click += new System.EventHandler(this.lbTitle_Click); + // + // fMessageWindow + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.ClientSize = new System.Drawing.Size(729, 540); + this.Controls.Add(this.arPanel1); + this.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.KeyPreview = true; + this.MaximizeBox = false; + this.Name = "fMessageWindow"; + this.Padding = new System.Windows.Forms.Padding(5); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Message Window"; + this.TopMost = true; + this.Load += new System.EventHandler(this.fMsg_Load); + this.arPanel1.ResumeLayout(false); + this.panButton.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public arCtl.arLabel lb1; + private arCtl.arPanel arPanel1; + public arCtl.arLabel lbTitle; + public arCtl.arLabel lb7; + public arCtl.arLabel lb6; + public arCtl.arLabel lb5; + public arCtl.arLabel lb4; + public arCtl.arLabel lb3; + public arCtl.arLabel lb2; + private System.Windows.Forms.Timer tmBlink; + public arCtl.arLabel btYes; + public arCtl.arLabel btNo; + private System.Windows.Forms.Panel panButton; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Panel panel8; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/MessageWindow/fMessageWindow.cs b/Cs_HMI/Project/MessageWindow/fMessageWindow.cs new file mode 100644 index 0000000..7befd3b --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/fMessageWindow.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project +{ + public partial class fMessageWindow : Form + { + private Boolean fMove = false; + private Point MDownPos; + private string _msg = string.Empty; + public Boolean DialogMode = false; + + /// + /// 사용자가 이 창을 닫을수 있는가? + /// + public Boolean EnableUserClose + { + get { return _enableuserclose; } + set + { + _enableuserclose = value; + // if (!EnableUserClose) btClose.Visible = false; + } + } + private Boolean _enableuserclose = true; + + public void setMessage(string msg) + { + //msg를 분리해서 표시를 한다. + var lbs = new arCtl.arLabel[] { lbTitle, lb1, lb2, lb3, lb4, lb5, lb6, lb7 }; + var lineBuf = msg.Replace("\r", "").Split('\n'); + int maxLine = Math.Min(lbs.Length, lineBuf.Length); + + for (int i = 0; i < lbs.Length; i++) //최대줄을 넘어가는건 표시불가 + { + if (i >= lineBuf.Length) + { + lbs[i].Text = string.Empty; + } + else + { + if (i > 0) lbs[i].Text = string.Format("{0}. {1}", i, lineBuf[i]); + else lbs[i].Text = lineBuf[i]; + } + + } + } + public fMessageWindow(string msg, string filename = "") + { + EnableUserClose = true; + InitializeComponent(); + this.FormClosing += fMsgWindow_FormClosing; + this.KeyDown += (s1, e1) => { if (EnableUserClose && e1.KeyCode == Keys.Escape) this.Close(); }; + this._msg = msg; + + + if (filename != "") + { + string fullname = AppDomain.CurrentDomain.BaseDirectory + "Image\\" + filename; + if (System.IO.File.Exists(fullname)) + { + var img = this.lb1.BackgroundImage; + this.lb1.BackgroundImage = Image.FromFile(fullname); + if (img != null) img.Dispose(); + } + else + { + msg += "\nNo Image File\n" + filename; + } + } + else + { + var img = this.lb1.BackgroundImage; + this.lb1.BackgroundImage = null; + if (img != null) img.Dispose(); + } + setMessage(msg); + this.lbTitle.MouseMove += label1_MouseMove; + lbTitle.MouseUp += label1_MouseUp; + lbTitle.MouseDown += label1_MouseDown; + lbTitle.MouseDoubleClick += label1_MouseDoubleClick; + //btClose.Click += arLabel1_Click; + } + + void fMsgWindow_FormClosing(object sender, FormClosingEventArgs e) + { + if (DialogMode==false) + { + e.Cancel = true; + return; + } + } + + private void fMsg_Load(object sender, EventArgs e) + { + + } + + private void label1_MouseMove(object sender, MouseEventArgs e) + { + if (fMove) + { + Point offset = new Point(e.X - MDownPos.X, e.Y - MDownPos.Y); + this.Left += offset.X; + this.Top += offset.Y; + offset = new Point(0, 0); + } + } + + private void label1_MouseUp(object sender, MouseEventArgs e) + { + fMove = false; + } + + private void label1_MouseDown(object sender, MouseEventArgs e) + { + MDownPos = new Point(e.X, e.Y); + fMove = true; + } + + private void label1_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (EnableUserClose) + { + if (DialogMode == false) this.Visible = false; + else this.Close(); + } + + } + public enum EWinColor + { + Attention=0, + Error, + Information + } + + public void SetWindowColor(EWinColor wincolor) + { + switch (wincolor) + { + case EWinColor.Attention: + lbTitle.BackColor = Color.Gold; + lbTitle.BackColor2 = Color.Orange; + lbTitle.ShadowColor = Color.FromArgb(150, 150, 150); + lbTitle.ForeColor = Color.FromArgb(50, 50, 50); + break; + case EWinColor.Error: + lbTitle.BackColor = Color.Brown; + lbTitle.BackColor2 = Color.Tomato; + lbTitle.ShadowColor = Color.FromArgb(50, 50, 50); + lbTitle.ForeColor = Color.WhiteSmoke; + break; + default: + lbTitle.BackColor = Color.DarkTurquoise; + lbTitle.BackColor2 = Color.LightSkyBlue; + lbTitle.ShadowColor = Color.FromArgb(50, 50, 50); + lbTitle.ForeColor = Color.WhiteSmoke; + break; + } + } + + private void lbTitle_Click(object sender, EventArgs e) + { + if (EnableUserClose) + { + if (DialogMode == false) this.Visible = false; + else this.Close(); + } + } + + private void tmBlink_Tick(object sender, EventArgs e) + { + var bg1 = lbTitle.BackColor; + var bg2 = lbTitle.BackColor2; + lbTitle.BackColor = bg2; + lbTitle.BackColor2 = bg1; + } + + private void btYes_Click(object sender, EventArgs e) + { + if (DialogMode == false) this.Visible = false; + else this.DialogResult = System.Windows.Forms.DialogResult.Yes; + } + + private void btNo_Click(object sender, EventArgs e) + { + if (DialogMode == false) this.Visible = false; + else this.Close(); + + } + } +} diff --git a/Cs_HMI/Project/MessageWindow/fMessageWindow.resx b/Cs_HMI/Project/MessageWindow/fMessageWindow.resx new file mode 100644 index 0000000..fcee611 --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/fMessageWindow.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/MessageWindow/fMsgWindow.Designer.cs b/Cs_HMI/Project/MessageWindow/fMsgWindow.Designer.cs new file mode 100644 index 0000000..10ee66d --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/fMsgWindow.Designer.cs @@ -0,0 +1,472 @@ +namespace Project +{ + partial class fMsgWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.lb1 = new arCtl.arLabel(); + this.arPanel1 = new arCtl.arPanel(); + this.lb7 = new arCtl.arLabel(); + this.lb6 = new arCtl.arLabel(); + this.lb5 = new arCtl.arLabel(); + this.lb4 = new arCtl.arLabel(); + this.lb3 = new arCtl.arLabel(); + this.lb2 = new arCtl.arLabel(); + this.lbTitle = new arCtl.arLabel(); + this.tmBlink = new System.Windows.Forms.Timer(this.components); + this.arPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // lb1 + // + this.lb1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb1.BackColor2 = System.Drawing.Color.Gray; + this.lb1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb1.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb1.BorderSize = new System.Windows.Forms.Padding(1); + this.lb1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb1.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.lb1.ForeColor = System.Drawing.Color.White; + this.lb1.GradientEnable = true; + this.lb1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lb1.GradientRepeatBG = false; + this.lb1.isButton = false; + this.lb1.Location = new System.Drawing.Point(8, 80); + this.lb1.MouseDownColor = System.Drawing.Color.Yellow; + this.lb1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb1.msg = null; + this.lb1.Name = "lb1"; + this.lb1.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb1.ProgressEnable = false; + this.lb1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb1.ProgressForeColor = System.Drawing.Color.Black; + this.lb1.ProgressMax = 100F; + this.lb1.ProgressMin = 0F; + this.lb1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb1.ProgressValue = 0F; + this.lb1.ShadowColor = System.Drawing.Color.Black; + this.lb1.Sign = ""; + this.lb1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb1.SignColor = System.Drawing.Color.Yellow; + this.lb1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb1.Size = new System.Drawing.Size(874, 50); + this.lb1.TabIndex = 2; + this.lb1.Text = "*"; + this.lb1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb1.TextShadow = true; + this.lb1.TextVisible = true; + // + // arPanel1 + // + this.arPanel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arPanel1.BackColor2 = System.Drawing.Color.Gray; + this.arPanel1.BorderColor = System.Drawing.Color.DimGray; + this.arPanel1.BorderSize = new System.Windows.Forms.Padding(1); + this.arPanel1.Controls.Add(this.lb7); + this.arPanel1.Controls.Add(this.lb6); + this.arPanel1.Controls.Add(this.lb5); + this.arPanel1.Controls.Add(this.lb4); + this.arPanel1.Controls.Add(this.lb3); + this.arPanel1.Controls.Add(this.lb2); + this.arPanel1.Controls.Add(this.lbTitle); + this.arPanel1.Controls.Add(this.lb1); + this.arPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.arPanel1.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Italic); + this.arPanel1.ForeColor = System.Drawing.Color.Khaki; + this.arPanel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arPanel1.GradientRepeatBG = false; + this.arPanel1.Location = new System.Drawing.Point(5, 5); + this.arPanel1.Name = "arPanel1"; + this.arPanel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arPanel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arPanel1.ProgressMax = 100F; + this.arPanel1.ProgressMin = 0F; + this.arPanel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arPanel1.ProgressValue = 0F; + this.arPanel1.ShadowColor = System.Drawing.Color.Black; + this.arPanel1.ShowBorder = true; + this.arPanel1.Size = new System.Drawing.Size(890, 480); + this.arPanel1.TabIndex = 4; + this.arPanel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.arPanel1.TextShadow = false; + this.arPanel1.UseProgressBar = false; + // + // lb7 + // + this.lb7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb7.BackColor2 = System.Drawing.Color.Gray; + this.lb7.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb7.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb7.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb7.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb7.BorderSize = new System.Windows.Forms.Padding(1); + this.lb7.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb7.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb7.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.lb7.ForeColor = System.Drawing.Color.White; + this.lb7.GradientEnable = true; + this.lb7.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lb7.GradientRepeatBG = false; + this.lb7.isButton = false; + this.lb7.Location = new System.Drawing.Point(8, 422); + this.lb7.MouseDownColor = System.Drawing.Color.Yellow; + this.lb7.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb7.msg = null; + this.lb7.Name = "lb7"; + this.lb7.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb7.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb7.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb7.ProgressEnable = false; + this.lb7.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb7.ProgressForeColor = System.Drawing.Color.Black; + this.lb7.ProgressMax = 100F; + this.lb7.ProgressMin = 0F; + this.lb7.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb7.ProgressValue = 0F; + this.lb7.ShadowColor = System.Drawing.Color.Black; + this.lb7.Sign = ""; + this.lb7.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb7.SignColor = System.Drawing.Color.Yellow; + this.lb7.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb7.Size = new System.Drawing.Size(874, 50); + this.lb7.TabIndex = 9; + this.lb7.Text = "*"; + this.lb7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb7.TextShadow = true; + this.lb7.TextVisible = true; + // + // lb6 + // + this.lb6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb6.BackColor2 = System.Drawing.Color.Gray; + this.lb6.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb6.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb6.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb6.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb6.BorderSize = new System.Windows.Forms.Padding(1); + this.lb6.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb6.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb6.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.lb6.ForeColor = System.Drawing.Color.White; + this.lb6.GradientEnable = true; + this.lb6.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lb6.GradientRepeatBG = false; + this.lb6.isButton = false; + this.lb6.Location = new System.Drawing.Point(8, 365); + this.lb6.MouseDownColor = System.Drawing.Color.Yellow; + this.lb6.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb6.msg = null; + this.lb6.Name = "lb6"; + this.lb6.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb6.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb6.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb6.ProgressEnable = false; + this.lb6.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb6.ProgressForeColor = System.Drawing.Color.Black; + this.lb6.ProgressMax = 100F; + this.lb6.ProgressMin = 0F; + this.lb6.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb6.ProgressValue = 0F; + this.lb6.ShadowColor = System.Drawing.Color.Black; + this.lb6.Sign = ""; + this.lb6.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb6.SignColor = System.Drawing.Color.Yellow; + this.lb6.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb6.Size = new System.Drawing.Size(874, 50); + this.lb6.TabIndex = 8; + this.lb6.Text = "*"; + this.lb6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb6.TextShadow = true; + this.lb6.TextVisible = true; + // + // lb5 + // + this.lb5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb5.BackColor2 = System.Drawing.Color.Gray; + this.lb5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb5.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb5.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb5.BorderSize = new System.Windows.Forms.Padding(1); + this.lb5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb5.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb5.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.lb5.ForeColor = System.Drawing.Color.White; + this.lb5.GradientEnable = true; + this.lb5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lb5.GradientRepeatBG = false; + this.lb5.isButton = false; + this.lb5.Location = new System.Drawing.Point(8, 308); + this.lb5.MouseDownColor = System.Drawing.Color.Yellow; + this.lb5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb5.msg = null; + this.lb5.Name = "lb5"; + this.lb5.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb5.ProgressEnable = false; + this.lb5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb5.ProgressForeColor = System.Drawing.Color.Black; + this.lb5.ProgressMax = 100F; + this.lb5.ProgressMin = 0F; + this.lb5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb5.ProgressValue = 0F; + this.lb5.ShadowColor = System.Drawing.Color.Black; + this.lb5.Sign = ""; + this.lb5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb5.SignColor = System.Drawing.Color.Yellow; + this.lb5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb5.Size = new System.Drawing.Size(874, 50); + this.lb5.TabIndex = 7; + this.lb5.Text = "*"; + this.lb5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb5.TextShadow = true; + this.lb5.TextVisible = true; + // + // lb4 + // + this.lb4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb4.BackColor2 = System.Drawing.Color.Gray; + this.lb4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb4.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb4.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb4.BorderSize = new System.Windows.Forms.Padding(1); + this.lb4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb4.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb4.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.lb4.ForeColor = System.Drawing.Color.White; + this.lb4.GradientEnable = true; + this.lb4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lb4.GradientRepeatBG = false; + this.lb4.isButton = false; + this.lb4.Location = new System.Drawing.Point(8, 251); + this.lb4.MouseDownColor = System.Drawing.Color.Yellow; + this.lb4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb4.msg = null; + this.lb4.Name = "lb4"; + this.lb4.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb4.ProgressEnable = false; + this.lb4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb4.ProgressForeColor = System.Drawing.Color.Black; + this.lb4.ProgressMax = 100F; + this.lb4.ProgressMin = 0F; + this.lb4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb4.ProgressValue = 0F; + this.lb4.ShadowColor = System.Drawing.Color.Black; + this.lb4.Sign = ""; + this.lb4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb4.SignColor = System.Drawing.Color.Yellow; + this.lb4.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb4.Size = new System.Drawing.Size(874, 50); + this.lb4.TabIndex = 6; + this.lb4.Text = "*"; + this.lb4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb4.TextShadow = true; + this.lb4.TextVisible = true; + // + // lb3 + // + this.lb3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb3.BackColor2 = System.Drawing.Color.Gray; + this.lb3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb3.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb3.BorderSize = new System.Windows.Forms.Padding(1); + this.lb3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb3.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb3.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.lb3.ForeColor = System.Drawing.Color.White; + this.lb3.GradientEnable = true; + this.lb3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lb3.GradientRepeatBG = false; + this.lb3.isButton = false; + this.lb3.Location = new System.Drawing.Point(8, 194); + this.lb3.MouseDownColor = System.Drawing.Color.Yellow; + this.lb3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb3.msg = null; + this.lb3.Name = "lb3"; + this.lb3.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb3.ProgressEnable = false; + this.lb3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb3.ProgressForeColor = System.Drawing.Color.Black; + this.lb3.ProgressMax = 100F; + this.lb3.ProgressMin = 0F; + this.lb3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb3.ProgressValue = 0F; + this.lb3.ShadowColor = System.Drawing.Color.Black; + this.lb3.Sign = ""; + this.lb3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb3.SignColor = System.Drawing.Color.Yellow; + this.lb3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb3.Size = new System.Drawing.Size(874, 50); + this.lb3.TabIndex = 5; + this.lb3.Text = "*"; + this.lb3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb3.TextShadow = true; + this.lb3.TextVisible = true; + // + // lb2 + // + this.lb2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.lb2.BackColor2 = System.Drawing.Color.Gray; + this.lb2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lb2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lb2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb2.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lb2.BorderSize = new System.Windows.Forms.Padding(1); + this.lb2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lb2.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lb2.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.lb2.ForeColor = System.Drawing.Color.White; + this.lb2.GradientEnable = true; + this.lb2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lb2.GradientRepeatBG = false; + this.lb2.isButton = false; + this.lb2.Location = new System.Drawing.Point(8, 137); + this.lb2.MouseDownColor = System.Drawing.Color.Yellow; + this.lb2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lb2.msg = null; + this.lb2.Name = "lb2"; + this.lb2.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lb2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lb2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lb2.ProgressEnable = false; + this.lb2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lb2.ProgressForeColor = System.Drawing.Color.Black; + this.lb2.ProgressMax = 100F; + this.lb2.ProgressMin = 0F; + this.lb2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lb2.ProgressValue = 0F; + this.lb2.ShadowColor = System.Drawing.Color.Black; + this.lb2.Sign = ""; + this.lb2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lb2.SignColor = System.Drawing.Color.Yellow; + this.lb2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lb2.Size = new System.Drawing.Size(874, 50); + this.lb2.TabIndex = 4; + this.lb2.Text = "*"; + this.lb2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lb2.TextShadow = true; + this.lb2.TextVisible = true; + // + // lbTitle + // + this.lbTitle.BackColor = System.Drawing.Color.Tomato; + this.lbTitle.BackColor2 = System.Drawing.Color.Red; + this.lbTitle.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.lbTitle.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbTitle.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbTitle.BorderColorOver = System.Drawing.Color.Gray; + this.lbTitle.BorderSize = new System.Windows.Forms.Padding(1); + this.lbTitle.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbTitle.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbTitle.Font = new System.Drawing.Font("맑은 고딕", 30F, System.Drawing.FontStyle.Bold); + this.lbTitle.ForeColor = System.Drawing.Color.WhiteSmoke; + this.lbTitle.GradientEnable = true; + this.lbTitle.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbTitle.GradientRepeatBG = false; + this.lbTitle.isButton = false; + this.lbTitle.Location = new System.Drawing.Point(8, 9); + this.lbTitle.MouseDownColor = System.Drawing.Color.Yellow; + this.lbTitle.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbTitle.msg = null; + this.lbTitle.Name = "lbTitle"; + this.lbTitle.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbTitle.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbTitle.ProgressEnable = false; + this.lbTitle.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbTitle.ProgressForeColor = System.Drawing.Color.Black; + this.lbTitle.ProgressMax = 100F; + this.lbTitle.ProgressMin = 0F; + this.lbTitle.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbTitle.ProgressValue = 0F; + this.lbTitle.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.lbTitle.Sign = ""; + this.lbTitle.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbTitle.SignColor = System.Drawing.Color.Yellow; + this.lbTitle.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbTitle.Size = new System.Drawing.Size(874, 67); + this.lbTitle.TabIndex = 3; + this.lbTitle.Text = "TITLE"; + this.lbTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbTitle.TextShadow = true; + this.lbTitle.TextVisible = true; + this.lbTitle.Click += new System.EventHandler(this.lbTitle_Click); + // + // tmBlink + // + this.tmBlink.Enabled = true; + this.tmBlink.Interval = 300; + this.tmBlink.Tick += new System.EventHandler(this.tmBlink_Tick); + // + // fMsgWindow + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.ClientSize = new System.Drawing.Size(900, 490); + this.Controls.Add(this.arPanel1); + this.Font = new System.Drawing.Font("Consolas", 21.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.KeyPreview = true; + this.MaximizeBox = false; + this.Name = "fMsgWindow"; + this.Padding = new System.Windows.Forms.Padding(5); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Message Window"; + this.TopMost = true; + this.Load += new System.EventHandler(this.fMsg_Load); + this.arPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + public arCtl.arLabel lb1; + private arCtl.arPanel arPanel1; + public arCtl.arLabel lbTitle; + public arCtl.arLabel lb7; + public arCtl.arLabel lb6; + public arCtl.arLabel lb5; + public arCtl.arLabel lb4; + public arCtl.arLabel lb3; + public arCtl.arLabel lb2; + private System.Windows.Forms.Timer tmBlink; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/MessageWindow/fMsgWindow.cs b/Cs_HMI/Project/MessageWindow/fMsgWindow.cs new file mode 100644 index 0000000..80ccd20 --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/fMsgWindow.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project +{ + public partial class fMsgWindow : Form + { + private Boolean fMove = false; + private Point MDownPos; + private string _msg = string.Empty; + public Boolean DialogMode = false; + + /// + /// 사용자가 이 창을 닫을수 있는가? + /// + public Boolean EnableUserClose + { + get { return _enableuserclose; } + set + { + _enableuserclose = value; + // if (!EnableUserClose) btClose.Visible = false; + } + } + private Boolean _enableuserclose = true; + + public void setMessage(string msg) + { + //msg를 분리해서 표시를 한다. + var lbs = new arCtl.arLabel[] { lbTitle, lb1, lb2, lb3, lb4, lb5, lb6, lb7 }; + var lineBuf = msg.Replace("\r", "").Split('\n'); + int maxLine = Math.Min(lbs.Length, lineBuf.Length); + + for (int i = 0; i < lbs.Length; i++) //최대줄을 넘어가는건 표시불가 + { + if (i >= lineBuf.Length) + { + lbs[i].Text = string.Empty; + } + else + { + if (i > 0) lbs[i].Text = string.Format("{0}. {1}", i, lineBuf[i]); + else lbs[i].Text = lineBuf[i]; + } + + } + } + public fMsgWindow(string msg, string filename = "") + { + EnableUserClose = true; + InitializeComponent(); + this.FormClosing += fMsgWindow_FormClosing; + this.KeyDown += (s1, e1) => { if (EnableUserClose && e1.KeyCode == Keys.Escape) this.Close(); }; + this._msg = msg; + + + if (filename != "") + { + string fullname = AppDomain.CurrentDomain.BaseDirectory + "Image\\" + filename; + if (System.IO.File.Exists(fullname)) + { + var img = this.lb1.BackgroundImage; + this.lb1.BackgroundImage = Image.FromFile(fullname); + if (img != null) img.Dispose(); + } + else + { + msg += "\nNo Image File\n" + filename; + } + } + else + { + var img = this.lb1.BackgroundImage; + this.lb1.BackgroundImage = null; + if (img != null) img.Dispose(); + } + setMessage(msg); + this.lbTitle.MouseMove += label1_MouseMove; + lbTitle.MouseUp += label1_MouseUp; + lbTitle.MouseDown += label1_MouseDown; + lbTitle.MouseDoubleClick += label1_MouseDoubleClick; + //btClose.Click += arLabel1_Click; + } + + void fMsgWindow_FormClosing(object sender, FormClosingEventArgs e) + { + if (DialogMode==false) + { + e.Cancel = true; + return; + } + } + + private void fMsg_Load(object sender, EventArgs e) + { + + } + + private void label1_MouseMove(object sender, MouseEventArgs e) + { + if (fMove) + { + Point offset = new Point(e.X - MDownPos.X, e.Y - MDownPos.Y); + this.Left += offset.X; + this.Top += offset.Y; + offset = new Point(0, 0); + } + } + + private void label1_MouseUp(object sender, MouseEventArgs e) + { + fMove = false; + } + + private void label1_MouseDown(object sender, MouseEventArgs e) + { + MDownPos = new Point(e.X, e.Y); + fMove = true; + } + + private void label1_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (EnableUserClose) + { + if (DialogMode == false) this.Visible = false; + else this.Close(); + } + + } + + + private void lbTitle_Click(object sender, EventArgs e) + { + if (EnableUserClose) + { + if (DialogMode == false) this.Visible = false; + else this.Close(); + } + } + + private void tmBlink_Tick(object sender, EventArgs e) + { + var bg1 = lbTitle.BackColor; + var bg2 = lbTitle.BackColor2; + lbTitle.BackColor = bg2; + lbTitle.BackColor2 = bg1; + } + } +} diff --git a/Cs_HMI/Project/MessageWindow/fMsgWindow.resx b/Cs_HMI/Project/MessageWindow/fMsgWindow.resx new file mode 100644 index 0000000..fcee611 --- /dev/null +++ b/Cs_HMI/Project/MessageWindow/fMsgWindow.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/MethodExtentions.cs b/Cs_HMI/Project/MethodExtentions.cs new file mode 100644 index 0000000..91746c1 --- /dev/null +++ b/Cs_HMI/Project/MethodExtentions.cs @@ -0,0 +1,224 @@ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Project +{ + /// + /// generic method Extension + /// + public static class MethodExtensions + { + public static Rectangle AddOffset(this System.Drawing.Rectangle rect,System.Drawing.Point offset) + { + return new Rectangle(rect.Left + offset.X, rect.Top + offset.Y, rect.Width, rect.Height); + } + public static Rectangle AddOffset(this System.Drawing.Rectangle rect, int x, int y) + { + return new Rectangle(rect.Left + x, rect.Top + y, rect.Width, rect.Height); + } + public static string ToString(this System.Drawing.Rectangle rect) + { + return string.Format("X={0},Y={1},W={2},H={3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string ToString(this System.Drawing.RectangleF rect) + { + return string.Format("X={0},Y={1},W={2},H={3}", rect.X, rect.Y, rect.Width, rect.Height); + } + + //public static void SetBGColor(this System.Windows.Forms.Label ctl,System.Drawing.Color color1) + //{ + // ctl.BackColor = System.Drawing.Color.Red; + //} + + /// + /// 0101이 반복되는 문자열 형태로 전환합니다. + /// + /// + /// + public static string BitString(this System.Collections.BitArray arr) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + for (int i = arr.Length; i > 0; i--) + sb.Append(arr[i - 1] ? "1" : "0"); + return sb.ToString(); + } + + /// + /// int 값으로 변환합니다. + /// + /// + /// + public static int ValueI(this System.Collections.BitArray arr) + { + byte[] buf = new byte[4]; + arr.CopyTo(buf, 0); + return BitConverter.ToInt32(buf, 0); + } + + /// + /// 숫자인지 검사합니다. + /// + /// + /// + public static bool IsNumeric(this string input) + { + double data; + return double.TryParse(input, out data); + //return Regex.IsMatch(input, @"^\d+$"); + } + + /// + /// isnullorempty 를 수행합니다. + /// + /// + /// + public static Boolean isEmpty(this string input) + { + return string.IsNullOrEmpty(input); + } + + /// + /// default 인코딩을 사용하여 문자열로 반환합니다. + /// + /// + /// + public static string GetString(this Byte[] input) + { + return System.Text.Encoding.Default.GetString(input); + } + + /// + /// 16진수 문자열 형태로 반환합니다. + /// + /// + /// + public static string GetHexString(this Byte[] input) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + foreach (byte b in input) + sb.Append(" " + b.ToString("X2")); + return sb.ToString(); + } + + public static string Base64Encode(this string src) + { + string base64enc = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(src)); + return base64enc; + } + public static string Base64Decode(this string src) + { + var base64dec = Convert.FromBase64String(src); + return System.Text.Encoding.UTF8.GetString(base64dec); + } + public static string UrlPathEncode(this string src) + { + string data = System.Web.HttpUtility.UrlPathEncode(src); + return data; + } + public static string UrlEncode(this string src) + { + string data = System.Web.HttpUtility.UrlEncode(src, System.Text.Encoding.UTF8); + return data; + } + public static string UrlDecode(this string src) + { + string data = System.Web.HttpUtility.UrlDecode(src, System.Text.Encoding.UTF8); + return data; + } + public static string toSizeStr(this Size rect) + { + return string.Format("{0};{1}", rect.Width, rect.Height); + } + public static string toPointStr(this PointF rect) + { + return string.Format("{0};{1}", rect.X, rect.Y); + } + public static string toPointStr(this Point rect) + { + return string.Format("{0};{1}", rect.X, rect.Y); + } + public static string toRectStr(this Rectangle rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Top, rect.Width, rect.Height); + } + public static string toRectStr(this RectangleF rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Top, rect.Width, rect.Height); + } + public static RectangleF toRectF(this string str) + { + var buffer = str.Split(';'); + if (buffer.Length != 4) return RectangleF.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new RectangleF(float.Parse(buffer[0]), float.Parse(buffer[1]), float.Parse(buffer[2]), float.Parse(buffer[3])); + } + public static Rectangle toRect(this string str) + { + var buffer = str.Split(';'); + if (buffer.Length != 4) return Rectangle.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new Rectangle(int.Parse(buffer[0]), int.Parse(buffer[1]), int.Parse(buffer[2]), int.Parse(buffer[3])); + } + public static Point toPoint(this string str) + { + str = str.Replace(",", ";").Replace("*", ";").Replace("x", ";").Replace(":", ";"); + + var buffer = str.Split(';'); + if (buffer.Length != 2) return Point.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new Point(int.Parse(buffer[0]), int.Parse(buffer[1])); + } + public static Size toSize(this string str) + { + str = str.Replace(",", ";").Replace("*", ";").Replace("x", ";").Replace(":", ";"); + + var buffer = str.Split(';'); + if (buffer.Length != 2) return Size.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new Size(int.Parse(buffer[0]), int.Parse(buffer[1])); + } + public static PointF toPointF(this string str) + { + str = str.Replace(",", ";").Replace("*", ";").Replace("x", ";").Replace(":", ";"); + + var buffer = str.Split(';'); + if (buffer.Length != 2) return PointF.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new PointF(float.Parse(buffer[0]), float.Parse(buffer[1])); + } + public static Rectangle Fix(this Rectangle rect, Size imgsize) + { + //영역보정 + if (rect.Left < 1) rect.X = 1; + if (rect.Top < 1) rect.Y = 1; + if (rect.Right > imgsize.Width) rect.Width = imgsize.Width - rect.Left - 1; + if (rect.Bottom > imgsize.Height) rect.Height = imgsize.Height - rect.Top - 1; + if (rect.Width < 2 || rect.Height < 2) rect = Rectangle.Empty; + return rect; + } + public static RectangleF FixRoi(this RectangleF rect, Size imgsize) + { + //영역보정 + if (rect.Left < 1) rect.X = 1; + if (rect.Top < 1) rect.Y = 1; + if (rect.Right > imgsize.Width) rect.Width = imgsize.Width - rect.Left - 1; + if (rect.Bottom > imgsize.Height) rect.Height = imgsize.Height - rect.Top - 1; + if (rect.Width < 2 || rect.Height < 2) rect = Rectangle.Empty; + return rect; + } + + } +} + diff --git a/Cs_HMI/Project/PUB.cs b/Cs_HMI/Project/PUB.cs new file mode 100644 index 0000000..eec8d39 --- /dev/null +++ b/Cs_HMI/Project/PUB.cs @@ -0,0 +1,439 @@ +using Microsoft.Speech.Synthesis; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Media; +using COMM; +using System.Threading.Tasks; +using System.Net.NetworkInformation; +using System.Net; +using System.Management; +using System.Data.SqlClient; +using System.Data; + +namespace Project +{ + public static class PUB + { + //public static Device.CFlag flag; + public static bool bShutdown = false; + public static bool Automodeonreboot = false; + public static bool AutRebootAlreay = false; + public static bool DriveSpeed = false; + + #region "Hardware" + + /// + /// 읽기/쓰기용이며 구동모터 와 비상정지가 연결됨(USB-ATMEGA 2560) + /// + public static arDev.FakePLC PLC; + + ///// + ///// 읽기전용이며 Z축 모터와 외부 버튼이 연결됨(USB-ATMEGA 2560) + ///// + //public static Device.PLC2 plcS; + + /// + /// XBEE 통신(USB-TTL) + /// + public static Device.Xbee XBE; + + /// + /// 배터리 잔량 확인(COM2 : RS232C - TTL) + /// + // public static arDevice.BMS bms; + + /// + /// RFID READER (COM1 : RS232C) + /// + public static arDev.Narumi AGV; + + public static arDev.BMS BMS; + + #endregion + + /// + /// 디버그모니터용 소켓(데이터를 전송만 한다) + /// + public static Device.Socket sock_debug; + + private static SpeechSynthesizer voice; + public static MediaPlayer mplayer; + + + public static bool CheckPassword() + { + var f = new Dialog.fPassword(); + if (f.ShowDialog() != System.Windows.Forms.DialogResult.OK) return false; + var pass = f.tbInput.Text.Trim(); + var passok = DateTime.Now.ToString("ddMM"); + if (pass.Equals(passok)) return true; + else return false; + } + + public static void Speak(string m, Boolean force = false, bool addlog = true) + { + if (force == false && PUB.setting.Enable_Speak == false) return; + if (force) + voice.SpeakAsyncCancelAll(); + if (voice.State == SynthesizerState.Ready) + voice.SpeakAsync(m); + if (addlog) PUB.log.Add("SPEAK",m); + } + + /// + /// 콜을 받을 수 있는 상황인가? + /// + /// + public static bool IsCanCALL() + { + //콜가능여부도 전송한다 + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] && + VAR.BOOL[eVarBool.FLAG_CHARGEONM] == false && + PUB.BMS.Current_Level > PUB.setting.ChargeEmergencyLevel && + PUB.sm.RunStep != StateMachine.ERunStep.GOUP && + VAR.BOOL[eVarBool.WAIT_COVER_DOWN] == false && + VAR.BOOL[eVarBool.WAIT_COVER_UP] == false) + { + return true; + } + else return false; + } + + public static CounterSetting counter; + + /// + /// popup message window + /// + public static MessageWindow popup; + + /// + /// database manager + /// + public static Manager.DatabaseManager dbm; + + /// + /// 설정정보 + /// + public static CSetting setting; + + /// + /// 시스템로그 + /// + public static arUtil.Log log, logagv, logplc, logbms, logcal; + + public static Boolean bPlayMusic = false; + + /// + /// 사용자 인풋 감지 시간 + /// + public static DateTime LastInputTime = DateTime.Now; + + public static CResult Result; + + public static string PatchVersion { get; set; } + + /// + /// 상태머신 + /// + public static StateMachine sm; //상태머신분리 190529 + + public static System.IO.DirectoryInfo path; + + + public static void initCore() + { + //setting + setting = new CSetting(); + setting.Load(); + + //counter setting + counter = new CounterSetting(); + counter.Load(); + + //log + log = new arUtil.Log(); + logagv = new arUtil.Log(); + logplc = new arUtil.Log(); + logbms = new arUtil.Log(); + logcal = new arUtil.Log(); + + logagv.FileNameFormat = "{yyyyMMdd}_agv"; + logplc.FileNameFormat = "{yyyyMMdd}_plc"; + logbms.FileNameFormat = "{yyyyMMdd}_bms"; + logcal.FileNameFormat = "{yyyyMMdd}_cal"; + + //popupmessage + popup = new MessageWindow(); + + Result = new CResult(); + Result.Clear(); + } + + public static void init() + { + Result = new CResult(); + + //state machine + sm = new StateMachine(); + + path = new System.IO.DirectoryInfo(Util.CurrentPath); + + + + mplayer = new MediaPlayer + { + Volume = PUB.setting.musicvol / 100.0 + }; + if (PUB.setting.musicfile.isEmpty() == false) + if (System.IO.File.Exists(PUB.setting.musicfile)) + PUB.mplayer.Open(new Uri(PUB.setting.musicfile)); + + voice = new SpeechSynthesizer(); + voice.SelectVoice("Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)"); + voice.SetOutputToDefaultAudioDevice(); + + var file_version = System.IO.Path.Combine(Util.CurrentPath, "version.txt"); + if (System.IO.File.Exists(file_version)) + { + PUB.PatchVersion = System.IO.File.ReadAllText(file_version, System.Text.Encoding.UTF8); + } + else PUB.PatchVersion = string.Empty; + } + + public static Boolean CheckManualChargeMode(bool Prompt = true ) + { + if (VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true) + { + string msg = "수동 충전 상태이므로 진행 할 수 없습니다"; + PUB.Speak(msg); + if(Prompt) + Util.MsgE(msg); + return false; + } + else return true; + } + + public static double GetFreeSpace(string driveletter) + { + try + { + var di = new System.IO.DriveInfo(driveletter); + var freespace = di.TotalFreeSpace; + var totalspace = di.TotalSize; + var freeSpaceRate = (freespace * 1.0 / totalspace) * 100.0; + return freeSpaceRate; + } + catch + { + return 100.0; + } + } + + public static double GetFreeSpace() + { + double retval = 100.0; + string savePath1 = path.FullName; + if (savePath1 != "" && System.IO.Directory.Exists(savePath1)) + { + //이폴더를 사용 + if (savePath1.StartsWith("\\") == false) + { + //남은잔량을 체크한다. + retval = GetFreeSpace(savePath1.Substring(0, 1)); + //if (freespace1 >= Pub.setting.AutoDeleteThreshold) return savePath1; + } + } + return retval; + } + + /// + /// 장치에 오류가 있는지? + /// + /// + public static Boolean HasHWError() + { + if (PUB.PLC.IsValid == false) return true; + if (PUB.AGV.IsOpen == false) return true; + if (PUB.XBE.IsOpen == false) return true; + return false; + } + + //public static void AddStatusSQL(StateMachine.eSMStep status, string remark, DateTime wdate) + //{ + // VAR.TIME[eVarTime.StatusReporttime] = DateTime.Now; + // try + // { + // var state = 0; + // if (status == StateMachine.eSMStep.RUN) state = 1; + // else if (status == StateMachine.eSMStep.ERROR || status == StateMachine.eSMStep.EMERGENCY) state = 2; + // if (string.IsNullOrEmpty(remark)) remark = status.ToString(); + // var mcid = PUB.setting.MCID; + // var path = System.IO.Path.Combine(Util.CurrentPath, "Status"); + // var file = System.IO.Path.Combine(path, $"{DateTime.Now.ToString("HHmmssfff")}_{status}.sql"); + // var sql = "insert into MCMonitor_Rawdata(Model,status,remark,ip,mac,time) values('{0}','{1}','{2}','{3}','{4}','{5}')"; + // sql = string.Format(sql, mcid, state, remark, IP, MAC, wdate.ToString("yyyy-MM-dd HH:mm:ss")); + // System.IO.File.WriteAllText(file, sql, System.Text.Encoding.Default); + + // //만들어진지 3분이 지난 파일은 삭제한다. + // //var di = new System.IO.DirectoryInfo(path); + // //var fi = di.GetFiles("*.sql", System.IO.SearchOption.TopDirectoryOnly).Where(t => t.LastWriteTime < DateTime.Now.AddMinutes(-3)).FirstOrDefault(); + // //if (fi != null) fi.Delete(); + // } + // catch (Exception ex) + // { + // PUB.log.AddE(ex.Message); + // } + //} + + public static void AddEEDB(string remark) + { + var step = PUB.sm.Step.ToString(); + var rtep = PUB.sm.RunStep.ToString(); + var mcid = PUB.setting.MCID; + var path = System.IO.Path.Combine(Util.CurrentPath, "Status"); + var file = System.IO.Path.Combine(path, $"{DateTime.Now.ToString("HHmmssfff")}_{step}_{rtep}.sql"); + var wdate = DateTime.Now; + try + { + var sql = "insert into AGV_History(mcid,step,runstep,remark,ip,wdate) values('{0}','{1}','{2}','{3}','{4}','{5}')"; + sql = string.Format(sql, mcid, step, rtep, remark,IP,wdate.ToString("yyyy-MM-dd HH:mm:ss")); + System.IO.File.WriteAllText(file, sql, System.Text.Encoding.Default); + + //만들어진지 3분이 지난 파일은 삭제한다. + //var di = new System.IO.DirectoryInfo(path); + //var fi = di.GetFiles("*.sql", System.IO.SearchOption.TopDirectoryOnly).Where(t => t.LastWriteTime < DateTime.Now.AddMinutes(-3)).FirstOrDefault(); + //if (fi != null) fi.Delete(); + } + catch (Exception ex) + { + PUB.log.AddE(ex.Message); + } + } + + + public static string IP { get; set; } + public static string MAC { get; set; } + + /// + /// 프로그램 사용기록 추가 + /// + /// + /// + /// + public static void CheckNRegister3(string prgmName, string develop, string prgmVersion) + { + if (prgmName.Length > 50) prgmName = prgmName.Substring(0, 50); //길이제한 + var task = Task.Factory.StartNew(() => + { + try + { + string ip = ""; + string mac = ""; + // string prgmName = Application.ProductName; + + var nif = NetworkInterface.GetAllNetworkInterfaces(); + var host = Dns.GetHostEntry(Dns.GetHostName()); + string fullname = System.Net.Dns.GetHostEntry("").HostName; + foreach (IPAddress r in host.AddressList) + { + string str = r.ToString(); + + if (str != "" && str.Substring(0, 3) == "10.") + { + ip = str; + break; + } + } + + string rtn = string.Empty; + ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled='TRUE'"); + ManagementObjectSearcher query1 = new ManagementObjectSearcher(oq); + foreach (ManagementObject mo in query1.Get()) + { + string[] address = (string[])mo["IPAddress"]; + if (address[0] == ip && mo["MACAddress"] != null) + { + mac = mo["MACAddress"].ToString(); + break; + } + } + + if (ip == "" || mac == "") + { + return; + } + + + SqlConnection conn = new SqlConnection("Data Source=10.131.15.18;Initial Catalog=EE;Persist Security Info=True;User ID=eeuser;Password=Amkor123!"); + conn.Open(); + string ProcName = "AddPrgmUser3"; + SqlCommand cmd = new SqlCommand(ProcName, conn) + { + CommandType = CommandType.StoredProcedure + }; + + SqlParameter param = cmd.Parameters.Add("@mac", SqlDbType.NVarChar, 50); + param.Value = mac; + + param = cmd.Parameters.Add("@ip", SqlDbType.NVarChar, 50); + param.Value = ip; + + param = cmd.Parameters.Add("@pgrm", SqlDbType.NVarChar, 50); + param.Value = prgmName; + + param = cmd.Parameters.Add("@develop", SqlDbType.NVarChar, 50); + param.Value = develop; + + param = cmd.Parameters.Add("@pgver", SqlDbType.NVarChar, 50); + param.Value = prgmVersion; + + param = cmd.Parameters.Add("@prgmLogin", SqlDbType.VarChar, 20); + param.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + param = cmd.Parameters.Add("@account", SqlDbType.NVarChar, 50); + param.Value = System.Environment.UserName; + + param = cmd.Parameters.Add("@hostname", SqlDbType.NVarChar, 100); + param.Value = fullname; + + cmd.ExecuteNonQuery(); + conn.Close(); + + IP = ip; + MAC = mac; + } + catch (Exception ex) + { + PUB.log.AddE(ex.Message); + } + }); + } + + + public static void ChangeUIPopup(System.Windows.Forms.NumericUpDown valueCtl) + { + var value = valueCtl.Value.ToString(); + var f = AR.UTIL.InputBox("input", value);// new Dialog.fInput(value); + if (f.Item1) + { + var val = decimal.Parse(f.Item2); + if (val < valueCtl.Minimum) + { + Util.MsgE(string.Format("최소 입력값은 {0} 입니다.", valueCtl.Minimum)); + val = valueCtl.Minimum; + } + if (val > valueCtl.Maximum) + { + Util.MsgE(string.Format("최대 입력값은 {0} 입니다.", valueCtl.Maximum)); + val = valueCtl.Maximum; + } + valueCtl.Value = val; + } + + } + + } +} diff --git a/Cs_HMI/Project/Program.cs b/Cs_HMI/Project/Program.cs new file mode 100644 index 0000000..4258887 --- /dev/null +++ b/Cs_HMI/Project/Program.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Resources; +using System.Threading; + +namespace Project +{ + static class Program + { + /// + /// 해당 응용 프로그램의 주 진입점입니다. + /// + [STAThread] + static void Main() + { + //중복실행방지 + var guidAttr = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), true); + if (guidAttr != null) + { + var guida = (GuidAttribute)guidAttr[0]; + var guidstr = guida.Value; + Mutex mtx = new Mutex(true, guidstr); + var success = mtx.WaitOne(new TimeSpan(0, 0, 1)); + if (success == false) + { + MessageBox.Show("중복실행 불가\n\n프로그램이 실행 중 입니다"); + return; + } + } + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + //Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); + //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + Application.Run(new fMain()); + } + + static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + string emsg = "Fatal Error(UHE)\n\n" + e.ExceptionObject.ToString(); + PUB.log.AddE(emsg); + PUB.log.Flush(); + Util.SaveBugReport(emsg); + var f = new fErrorException(emsg); + f.ShowDialog(); + Application.ExitThread(); + } + + static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) + { + string emsg = "Fatal Error(ATE)\n\n" + e.Exception.ToString(); + PUB.log.AddE(emsg); + PUB.log.Flush(); + Util.SaveBugReport(emsg); + var f = new fErrorException(emsg); + f.ShowDialog(); + Application.ExitThread(); + } + } +} diff --git a/Cs_HMI/Project/Properties/AssemblyInfo.cs b/Cs_HMI/Project/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a085014 --- /dev/null +++ b/Cs_HMI/Project/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("(OTP) 2D Reading System")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Amkor K4")] +[assembly: AssemblyProduct("(OTP) 2D Reading System")] +[assembly: AssemblyCopyright("Copyright ©Amkor-EET 2020")] +[assembly: AssemblyTrademark("EET")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("65f3e762-800c-772e-862f-b444642ec59f")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 +// 지정되도록 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("24.12.06.1300")] +[assembly: AssemblyFileVersion("24.12.06.1300")] diff --git a/Cs_HMI/Project/Properties/Resources.Designer.cs b/Cs_HMI/Project/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0e97cab --- /dev/null +++ b/Cs_HMI/Project/Properties/Resources.Designer.cs @@ -0,0 +1,173 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Project.Properties { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Project.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap Charge { + get { + object obj = ResourceManager.GetObject("Charge", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap ChargeH { + get { + object obj = ResourceManager.GetObject("ChargeH", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_charged_battery_80 { + get { + object obj = ResourceManager.GetObject("icons8_charged_battery_80", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_checked_radio_button_48 { + get { + object obj = ResourceManager.GetObject("icons8-checked-radio-button-48", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_exercise_40 { + get { + object obj = ResourceManager.GetObject("icons8-exercise-40", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_new_40 { + get { + object obj = ResourceManager.GetObject("icons8-new-40", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_no_running_40 { + get { + object obj = ResourceManager.GetObject("icons8-no-running-40", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_running_40 { + get { + object obj = ResourceManager.GetObject("icons8-running-40", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_save_40 { + get { + object obj = ResourceManager.GetObject("icons8-save-40", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap icons8_unavailable_40 { + get { + object obj = ResourceManager.GetObject("icons8-unavailable-40", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. + /// + internal static System.Drawing.Bitmap setup_40 { + get { + object obj = ResourceManager.GetObject("setup_40", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Cs_HMI/Project/Properties/Resources.resx b/Cs_HMI/Project/Properties/Resources.resx new file mode 100644 index 0000000..32a9015 --- /dev/null +++ b/Cs_HMI/Project/Properties/Resources.resx @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\icons8-no-running-40.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-save-40.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-unavailable-40.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-new-40.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-exercise-40.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-running-40.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-checked-radio-button-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-charged-battery-80.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-automatic-gearbox-warning-80.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons8-charge-empty-battery-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ChargeH.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Cs_HMI/Project/Properties/Settings.Designer.cs b/Cs_HMI/Project/Properties/Settings.Designer.cs new file mode 100644 index 0000000..b54975d --- /dev/null +++ b/Cs_HMI/Project/Properties/Settings.Designer.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Project.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("asdfasdfasdf\r\nasdfasdfasdf\r\nasdf")] + public string css { + get { + return ((string)(this["css"])); + } + set { + this["css"] = value; + } + } + } +} diff --git a/Cs_HMI/Project/Properties/Settings.settings b/Cs_HMI/Project/Properties/Settings.settings new file mode 100644 index 0000000..f8293bd --- /dev/null +++ b/Cs_HMI/Project/Properties/Settings.settings @@ -0,0 +1,11 @@ + + + + + + asdfasdfasdf +asdfasdfasdf +asdf + + + \ No newline at end of file diff --git a/Cs_HMI/Project/ReadMe.txt b/Cs_HMI/Project/ReadMe.txt new file mode 100644 index 0000000..81495c3 --- /dev/null +++ b/Cs_HMI/Project/ReadMe.txt @@ -0,0 +1,20 @@ +==================================== +HostName : EET1PAGV2 +IP Address : 192.168.1.78 +==================================== +XB24C / 802.15.4 TH +call button setting : ch-17 / id-45A4 / DH:0 / DL:FFFF +충전기 No : 30 : ch-C / ID-3332 + + +GO-QA,GO-QC 라벨 출력 후 장비에 붙이기 +무선 안테나 1개 파손 , 정면 우측 +바닥 회색 테이프 마감 필요 + +08:00~09:00 +18:00~19:00 + + +230425 chi countQA추가 및 메인 디스플레이 방식 변경 + 충전중 수동전환하면 충전 해제 함 +230424 chi QA루트 추가 및 관련 테스트 작업, RFID 입력 diff --git a/Cs_HMI/Project/Resources/ChargeH.png b/Cs_HMI/Project/Resources/ChargeH.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1db55dcf3bbd530f77009435df08d5a367be77 GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|V1B zPZ!6KiaBp*`Fe*0N;L34R+?1S%H|Zvt*E4>ZDi8rkt6uz&g0`wT$2n=tx4IlyzFfh ziy(_`mt9EK^+mp~bv~I-`N4l_%bw!&cW0jQs`JcL^N_85e$Iw}&+Ec_&uyMJWbpv4 z#s)%U9na5YZhXF6V*eMuN$ZlGSzG4WOGK&nXzyh{U*E>Cy23%=LCI^E24@G~{rqzI z4GIpwMWVPa#J4=GMy6ZaFIP^ zSHqq%UJip@rV0mMTx(!h9L>zslZPVUe1|3FSH9=Bi;|sk^P?_5xo5gQ>*4=34_|hE z`s1gW$HXPHj^E?m;d5X0i;lgxF5u4C`chJN&Wk_Otzrc)zpjx^(oWdfws6Mv2S;NL z%$J(C#rxmuU)d*Wvoz+sFg<%|w?V;LHr6Q{+g_YqxaqHrsk%bUPqQ^Zt|`;0@WW4D zWp}9Y1vjMeUUcDRI#qis{`uej ztlaYa)6^gCKMPWM&Ht@atSU9R$24u?=kKqW^S``F%D#T(&o{N1zA9RN4iSsmUOe6S zN+96R{KA*(1Udb_o$Rm8{j@i6`x(_&TFwozfrpQ~o!qw~i1Fy;eFjR7)$4V(m9Eye zkD0e`N=jbbDqhAOXNL$*_C_WdrYrsnmoofyjaaAfH#MU5A#VXkfPL#UrZ3`&JDa{t zPZVu4KM=aJVM(@c^nb<2)9*OWD7h=G1xr&0awPUM7%j^by8QM=B}mZI)z4*}Q$iB} D%Jy9~ literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/Resources/icons8-automatic-gearbox-warning-80.png b/Cs_HMI/Project/Resources/icons8-automatic-gearbox-warning-80.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd72357c095fd3cb86e29b5253b493e5856ea44 GIT binary patch literal 5724 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 sXWYY>z5avGx-QHrR@~ literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/Resources/icons8-exercise-40.png b/Cs_HMI/Project/Resources/icons8-exercise-40.png new file mode 100644 index 0000000000000000000000000000000000000000..ee72597e8efd6dc71cba99c11434d88218cfc8e4 GIT binary patch literal 1185 zcmV;S1YY}zP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1U5-TK~z{r?U>(B z990y@iN5r~$3E&~qwx>$QGICHo!!}m(zI%;_CZXHsU})AQKQ5kl=-!Q+ESuXQ8d+7 zi4+P}DPonKxdRCOVfoc!Ew;97Yj>Ar3ru&8_e{@@6c!8EWia|lzS(8w+&kaBKh8Zv z!TRU56jz$90mZn2DvFo~3(Gt2qTAkr=0wei*S3#Zz2_zYwd>HR6;fHkFB!K} zn0FLcnXPE(m$(fxh1b?cSPO+M9zkZJsIfnMk`D6;?+dd205!=;KsF}(&Q4ut4uvC$ z(@kNEC#11UZ3Brp9nVz9P!cv&cTI>2dzqTe!Bc}MeE6fay{T}e`QgUBdvB%YF1R6b zPI22At2kmdQ`q7OR2V_NkT2z$S`_~QQ>{P8orev?EO_eU;}b=dto^>S?^aV64nFzE zJ8?tQ96IA}68tWzMm(>Z#8;u;&rK%xm=`i=vVY8ihj;g04XDO+q11H`g*i}~IY4P9 zUBpw)T3KI1xATX;+_*cevGY5cMyyA6_rVkO!|+_gSqP{s!$-M)R=8`QdBrHc>Sj*1z>rO8q|Nn#-!ZEe=7Afgl@iQj>+@lcJ|) zFZiV>s4{r`qaoPEtU2bglG>BbNYbO12cOjWilDIcOHJqPT&A+xX-q?D-5@t;0yWJq zVp;cUo*FKPR1=iL<2g-bC3PfW(>uNJdgF*Q+SEnhmX=hYl zZHZ;4bUYwMH&HmBrDZl4*393^nnqoNDCywuzzYEzr*!tQHQQh=VX21aJvI4@rRG6g zcORHZ*WiKS3_Q5A4+Keno4R(v_^iSC^lg6vLJ{L4HTmcGl&Dlv-2;sSmTU4oBY_D! zgS(u<92Qcl;r*Lx5D_)=Zc|*him!Jw5r<2 zT!Z_LO*+TkI+fi^Vcz1eU>o^J!k!sv=e6ch2&-m{LcE8kmBuZ+{%htN1r6>Wyb2{% zU9e6zo}mzr0k}nsu*Jz00u<|Tg(b&+2d z`c^knKb+#{bcAK7i~O<_gHCSKjO8g%`3WIluF5sF^C=u*wjf0%>cTttI(uwGwK>5~ zr=5{wzor5I7UXCtg?Pt&=I}a&c*noX9RFM~=7Mr`%ZfFJh$>5Tj-*zmIfR!^v9C|W zp<{S_<(Wf*N_1^lV`KQgW>I0A>GFSxf`UH*x_Z}kWrz!^00000NkvXXu0mjf_X<7< literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/Resources/icons8-new-40.png b/Cs_HMI/Project/Resources/icons8-new-40.png new file mode 100644 index 0000000000000000000000000000000000000000..85f3a28a9c9723d68e093425cf11b52111873174 GIT binary patch literal 1520 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1%*jOK~z{r-B?>} z6jc~*^hr%L(Ki!Kd{N_r4<`C*qHXtD1rZ@e-&Bl^5se{Dh&EB%?(Xbri_n!I2B?CR z#48lBEef=|Gqb%=N-OCF+R_W)wrtzI^|EvPznwG8wmWMVx?K%l@?~ewob!L*`Oi5s z=S;zE3$x4rq|GJ$Wp@V-6<4%A&WmpVWw?hrsLPAX6>3S!9Y z6r(1GKVho!GrK1c^PGvKnOKRQ(~)Fb#6T>>vWnu612?`|Kwt zrVInF1);UBrY#I@c;I%H!s-far=CQ%{WzA$<%-Rg(1bQT(ChIdZcB$%kb}aXVZ+Ax zBs{HgAY@40ECM)~AsZ}&93a9cWF_W16yIHhQf zFMgvkFco8LPrDvK997uFEL&116%GALvV1zu*!gSfHHdPcaZoQC4k@gEQvVNacz_pf zYboqPpfPorfd%?$AJ>Bz8EhR<*um~Zl3#bIWc4LNp@y zf23D!Ti2zxfwt8phT(2Cwp5s1(#G{Q9ka{#asUkO?M$%noH~?7 z28U=abxx? z19`0l5I zo-GFk* zD$M2Ly)@JvZ|?7pdfWbkcQI+cv9B)%4;fE@_VTv7>1BOk`_XHLLDrJcgm#f|_8xA> z7$u%SYr|`C@XT;1XxKjm)6KdgF#2ozw4rKeSMFlFlRnI?g=IWmX6Dur!B=CbDP=K+&upnec>3>>)4y_Q#J%NjC481c ztej;}1MM!F-m4#0@WjXGidS}ah0HE-?#0jBBQAr-5>98hhdP_6F4~|i?e`SBTUvQB z+$>Damd8rmayy;4em6V(Wkprub9iT(UH;c7BN2KND4MzQ<3R;wR;Tzn>Yy&#pe;RT z+bosRqdaVWV6JR^n&wmxJMyhZM&@Y&OcpzQ&+yy-4-`6E9<&RTAtJ7M@$HU+f`0&* WQ;3kFgb-l>0000 literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/Resources/icons8-no-running-40.png b/Cs_HMI/Project/Resources/icons8-no-running-40.png new file mode 100644 index 0000000000000000000000000000000000000000..be7c8776f3414570c10e145f3f32fa55c89474ea GIT binary patch literal 1512 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 literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/Resources/icons8-save-40.png b/Cs_HMI/Project/Resources/icons8-save-40.png new file mode 100644 index 0000000000000000000000000000000000000000..a096fb198afe6195f0514898a0763b7a640696c5 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4St?3jv*25Z>Q|_Vs;d1{eE2Lfs(eZIZGZLyjlC(-FE%w|0`B{e_!xB zb`y)fym;FGFYBf**=#xC&eh9I_uf0DN1kqzTXfjIk!#wbrll^Nm)fzE`xzk~$MRMB%eKhVZmi5NT?6(z=Fi@m6Jju7zw(dS3A(4P)_H@MFa{a zL9szlPy}6s5p~sF7ePPh9|$2xl7bS7Zc4(7f(#bi3Uy~%8BnrckQt$pxI512;+eHq6H_QZeC`K|XKRp((%;{ZqV$ z(FRM-;uri;o!@|4u)M+gz1=*wo->yWSY&lzpZchk@Ii$yhWRcb#18{q1@21Nfv2#x z#=lTu`$m3l8L$d>KpKrqr|{Z2cHPbNZ2lKX=u6lccoo+~k4{t=nGLcbVD(tX7OecKX5O5$p|NW8anL^YQwHvO)l8`oEAmPi}y0GqB zoTPPNrZsrJ6L4^zomidCLw@g!C$DN-IpM!z^<)<#f!*zdn`G4m4y*RkI5Nnl+TLcS z2v!naicHs6_`aQRhgfzYZ9Ox%fEQ}vW(0)6G!H+HOv|G2kv?{`3U{2Vdf1ISBlCwt zd^6Mf`8G{wd$?yEldZrV<>qo))^CZ-tu;*poKDy-ZOAh%FLR*4i{tb*3s#`7$jjw4 z=VG`M6&`K`$N#-?k4P5p)kmyFdwCRVQD48+Y9TH#ujsPZzd{sZhctJF^Z)<=07*qo IM6N<$f{x|H>Hq)$ literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/StateMachine/Display/GetErrorMessage.cs b/Cs_HMI/Project/StateMachine/Display/GetErrorMessage.cs new file mode 100644 index 0000000..c70b4aa --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Display/GetErrorMessage.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Windows.Forms; +using System.Management; +using COMM; + +namespace Project +{ + public static partial class UTIL + { + public static string GetResultCodeMessage(eResult err) + { + return err.ToString().ToUpper(); + } + + + public static string GetErrorMessage(eECode err, params object[] values) + { + switch (err) + { + case eECode.NOTALLOWUP: + return "상차 허용 위치가 아닙니다"; + case eECode.AGVCONN: + return Lang.AGV연결실패; + case eECode.PLCCONN: + return Lang.PLC통신실패; + + default: + return err.ToString(); + } + } + + } +} diff --git a/Cs_HMI/Project/StateMachine/DisplayTextHandler.cs b/Cs_HMI/Project/StateMachine/DisplayTextHandler.cs new file mode 100644 index 0000000..13bd24a --- /dev/null +++ b/Cs_HMI/Project/StateMachine/DisplayTextHandler.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Windows.Forms; + +namespace Project +{ + public partial class fMain + { + + delegate void UpdateControlTextHandler(Control ctl, string value); + void UpdateControlText(Control ctl, string value) + { + if (ctl.InvokeRequired) + { + ctl.BeginInvoke(new UpdateControlTextHandler(UpdateControlText), new object[] { ctl, value }); + } + else + { + ctl.Text = value; + } + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs new file mode 100644 index 0000000..c3f07e0 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN.cs @@ -0,0 +1,550 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + DateTime LastSpeakTime = DateTime.Now; + DateTime CoverControlTime = DateTime.Now; + DateTime LastCommandTime = DateTime.Now; + DateTime LastCommandTimeNextStop = DateTime.Now; + bool runStepisFirst = false; + private void _SM_RUN(Boolean isFirst, TimeSpan stepTime) + { + //중단기능이 동작이라면 처리하지 않는다. + if (PUB.sm.bPause) + { + System.Threading.Thread.Sleep(200); + return; + } + + //사용자 스텝처리가 아닌경우에만 검사 + //if (Pub.flag.get(eFlag.UserStepCheck) == false) + { + + //가동불가 조건 확인 + if (CheckStopCondition() == false) + { + PUB.sm.SetNewStep(eSMStep.PAUSE); + return; + } + } + + //이머전시상태라면 stop 처리한다. + if (PUB.AGV.error.Emergency && PUB.AGV.system1.agv_stop == true && + PUB.AGV.system1.stop_by_front_detect == false) + { + PUB.Speak(Lang.비상정지로인해작업을중단합니다); + PUB.sm.SetNewStep(eSMStep.IDLE); + } + + //실행스텝보정 + //if (Pub.sm.runStep == eRunStep.NOTSET && Pub.sm.runStepNew == eRunStep.NOTSET) + //{ + // Pub.sm.setNewRunStep(eRunStep.IDLE); + // Pub.log.Add("RUnStep Initialize"); + //} + + //스텝이 변경되었다면? + if (PUB.sm.RunStep != PUB.sm.RunStepNew) + { + runStepisFirst = true; + PUB.sm.ApplyRunStep(); + } + else runStepisFirst = false; + + if (isFirst) + { + if (PUB.sm.RunStep == ERunStep.READY) + VAR.TIME.Set(eVarTime.ReadyStart); + else + VAR.TIME.Set(eVarTime.RunStart); + } + + switch (PUB.sm.RunStep) + { + case ERunStep.READY: + _SM_RUN_READY(runStepisFirst, PUB.sm.GetRunSteptime); + break; + + case ERunStep.GOCHARGE: //충전위치로 이동 + if (runStepisFirst) + { + VAR.TIME[eVarTime.ChargeTry] = DateTime.Now; + PUB.sm.ResetRunStepSeq(); + PUB.log.Add("충전 명령 시작"); + } + else if (_SM_RUN_GOCHARGE(runStepisFirst, PUB.sm.GetRunSteptime)) + { + //230601 + //if (PUB.Result != null && PUB.sm != null) + // EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString()); + + PUB.Speak(Lang.충전을시작합니다) ; + PUB.sm.SetNewRunStep(ERunStep.CHARGECHECK); + return; + } + break; + + case ERunStep.CHARGECHECK: //충전중 + if (runStepisFirst) + { + VAR.TIME.Set(eVarTime.ChargeStart); + LastCommandTime = DateTime.Now; + } + else if (_SM_RUN_GOCHARGECHECK(runStepisFirst, PUB.sm.GetRunSteptime)) + { + //충전상태가 활성화되었으므로 대기상태로 전환한다 + PUB.sm.SetNewRunStep(ERunStep.READY); + PUB.log.AddAT("충전상태 확인 완료로 인해 대기 합니다"); + } + break; + + case ERunStep.CHARGEOFF: + if (runStepisFirst) + { + VAR.TIME.Set(eVarTime.ChargeEnd); + LastCommandTime = DateTime.Now; + } + else + { + //충전 상태가 OFF되어야 동작하게한다 + if (_SM_RUN_CHGOFF(isFirst, stepTime) == true) + { + //충전상태가 활성화되었으므로 대기상태로 전환한다 + PUB.sm.ClearRunStep(); + + //충전기위치에서 OFF를 한 경우이다 + if (PUB.Result.CurrentPos != ePosition.CHARGE || PUB.Result.TargetPos != ePosition.CHARGE) + { + PUB.Result.CurrentPos = ePosition.NONE; + } + else + { + PUB.Result.TargetPos = ePosition.QC; + } + PUB.Result.CurrentPosCW = "1"; + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + PUB.log.AddAT("충전 해제로 홈으로 이동"); + } + } + break; + case ERunStep.GOUP: //상차이동 + if (_SM_RUN_GOUP(runStepisFirst, PUB.sm.GetRunSteptime)) + { + PUB.Speak(Lang.상차작업이완료되었습니다); + + //230601 + // if (PUB.Result != null && PUB.sm != null) + // EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString()); + + //QA를 제외한 경우에는 기본 QC로 이동한다 + if (PUB.Result.NextPos == ePosition.QA) + PUB.Result.TargetPos = ePosition.QA; + else + PUB.Result.TargetPos = ePosition.QC; + + + PUB.sm.SetNewRunStep(ERunStep.GODOWN); //하차작업으로 전환 + return; + } + break; + + case ERunStep.GODOWN: //하차이동 + if (_SM_RUN_GODOWN(runStepisFirst, PUB.sm.GetRunSteptime)) + { + PUB.Speak(Lang.하차작업이완료되었습니다); + VAR.TIME.Set(eVarTime.ChargeTry); + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down);// (Device.PLC.ZMotDirection.Down); //하차작업이 완료되면 커버를 내려서 바로 작업할 수 있게 한다. + + //230601 + //if (PUB.Result != null && PUB.sm != null) + // EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString()); + + //하차가 완료되면 충전대기시간을 30초 남겨두고 없데이트한다 + //충전이 필요할 경우 바로 될수있도록 220118 + VAR.TIME[eVarTime.ChargeTry] = DateTime.Now.AddSeconds(-1 * PUB.setting.ChargeRetryTerm + 30); + + if (PUB.Result.CurrentPos == ePosition.QC) + { + PUB.Speak(Lang.대기상태로전환합니다); + PUB.sm.SetNewRunStep(ERunStep.READY); + } + else + { + //홈 이동 명령처리 + PUB.sm.ClearRunStep(); + PUB.Result.TargetPos = ePosition.QC; + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + PUB.Speak( Lang.홈위치로이동합니다); + } + return; + } + break; + + case ERunStep.GOHOME: + if (runStepisFirst) + { + PUB.Speak(Lang.홈검색을시작합니다); + } + else if (_SM_RUN_GOHOME(runStepisFirst, PUB.sm.GetRunSteptime)) + { + //230601 + // if (PUB.Result != null && PUB.sm != null) + // EEMStatus.AddEEDBSQL(PUB.sm.Step, PUB.sm.RunStep.ToString(), PUB.Result.TargetPos.ToString()); + + PUB.Speak(Lang.홈이동완료대기상태로전환합니다); + VAR.TIME.Set(eVarTime.ChargeTry); + PUB.sm.SetNewRunStep(ERunStep.READY); //대기상태로 전환한다 + return; + } + break; + } + } + + bool CheckStopCondition() + { + return true; + } + + void CheckAGVMoveTo(eGoDir dir) + { + //계속내려간다 + if (dir == eGoDir.Down) + { + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalMilliseconds >= 1999) + { + //현재 동작중인상태에서 방향이 맞지 않다면 일단 움직임을 멈춘다 + if (PUB.AGV.system1.agv_run) + { + if (PUB.AGV.data.Direction == 'B') + { + PUB.log.Add($"방향이 맞지 않아 정지 합니다({dir})"); + PUB.AGV.AGVMoveStop("CheckAGVMoveTo"); + } + else if (PUB.AGV.data.Speed == 'S') + { + PUB.log.Add($"마크정지를 해제하기 위해 장비를 멈춥니다"); + } + //이동해야하는데 마크 스탑이 되어있다면 일단 멈춘다 + + } + else + { + //움직이지 않으므로 전진하도록 한다 + PUB.log.Add($"AGV 기동 방향(DOWN):{dir}"); + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);//PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition(" + sender + ")"); + + } + LastCommandTime = DateTime.Now; + } + } + else + { + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalMilliseconds >= 1999) + { + if (PUB.AGV.system1.agv_run) + { + if (PUB.AGV.data.Direction == 'F') + { + PUB.log.Add($"방향이 맞지 않아 정지 합니다({dir})"); + PUB.AGV.AGVMoveStop("CheckAGVMoveTo"); + } + else if (PUB.AGV.data.Speed == 'S') + { + PUB.log.Add($"마크정지를 해제하기 위해 장비를 멈춥니다"); + } + } + else + { + PUB.log.Add($"AGV 기동 방향(UP):{dir}"); + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);//PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition(" + sender + ")"); + + } + LastCommandTime = DateTime.Now; + } + } + } + + void CheckAGVStopbyMARK(string sender) + { + //계속내려간다 + var tsCmd = DateTime.Now - LastCommandTime; + if (VAR.BOOL[eVarBool.NEXTSTOP_MARK] == false || tsCmd.TotalMilliseconds >= 1500) + { + PUB.AGV.AGVMoveStop("CheckAGVStopbyMARK", arDev.Narumi.eStopOpt.MarkStop); + LastCommandTime = DateTime.Now; + PUB.log.Add($"[{sender}] MARK신호에 멈춤 설정"); + } + } + + Boolean UpdateMotionPositionForMark(string sender) + { + //이머전시상태에서는 처리하지 않는다. + if (VAR.BOOL[eVarBool.EMERGENCY]) return false; + + //DOWN 작업 + // if (goDIR == eGoDir.Down) + { + //1. 현재위치 > 대상위치 + if (PUB.Result.CurrentPos > PUB.Result.TargetPos) + { + //계속내려간다 + if (PUB.setting.AGV_Direction_FVI_Backward) + CheckAGVMoveTo(eGoDir.Down); + else + CheckAGVMoveTo(eGoDir.Up); + } + //2. 현재위치 < 대상위치 + else if (PUB.Result.CurrentPos < PUB.Result.TargetPos) + { + //올라가야한다 + if (PUB.setting.AGV_Direction_FVI_Backward) + CheckAGVMoveTo(eGoDir.Up); + else + CheckAGVMoveTo(eGoDir.Down); + } + //3. 현재위치 = 대상위치 + else + { + //현재위치가 확정되었는가? + var actpos = ctlPos1.GetPositionActive(PUB.Result.CurrentPos); + if (actpos == false && PUB.AGV.system1.agv_stop == true) + { + //위치확정이되지 않았다면 AGV멈춤시에 기동하게 한다. + var lastcom = DateTime.Now - LastCommandTime; + if (lastcom.TotalSeconds > 3) + { + if (PUB.Result.CurrentPosCW == "1") + { + if (PUB.setting.AGV_Direction_FVI_Backward) + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); + else + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + } + + else + { + if (PUB.setting.AGV_Direction_FVI_Backward) + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + else + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); + } + + + LastCommandTime = DateTime.Now; + PUB.logagv.Add($"AGV가 멈춰있다 동작을 재개 합니다"); + } + } + else + { + //마크센서가 들어와잇고, 위치가 act 되어있다면 해당 위치에 있는 것이다 + if (PUB.AGV.error.Emergency == false && + PUB.AGV.system1.agv_stop && + PUB.AGV.signal.mark_sensor && actpos && + PUB.Result.CurrentPos == PUB.Result.TargetPos) + { + //PUB.AGV.AGVMoveStop(); + return true; + } + + if (PUB.AGV.system1.agv_stop == true && PUB.AGV.system1.agv_run == false) + { + PUB.log.Add($"멈춰있으므로 이동을 시작 합니다"); + if (PUB.Result.CurrentPosCW == "1") + { + if (PUB.setting.AGV_Direction_FVI_Backward) + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + else + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); + } + else + { + if (PUB.setting.AGV_Direction_FVI_Backward) + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); + else + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + } + + } + + //AGV는 아래로 FVI방향으로 내려가고 있다 + if (VAR.BOOL[eVarBool.AGVDIR_UP] == false) + { + if (PUB.Result.CurrentPosCW == "0") + { + //장비가 마크센서에의해 멈췃다면 완료이다 + if (PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor) + { + PUB.AGV.AGVMoveStop("UPdateMotionPositionForMark"); + return true; + } + else CheckAGVStopbyMARK(sender); + } + else if (PUB.Result.CurrentPosCW == "1") + { + //내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다 + CheckAGVMoveTo(eGoDir.Up); + } + else + { + PUB.Result.CurrentPosCW = "1"; + CheckAGVMoveTo(eGoDir.Up); + } + } + //AGV는 Qc방향으로 올라가고 있다 + else + { + if (PUB.Result.CurrentPosCW == "1") + { + //네려가는 방향에서 내려가는 위치가 인식되었다면 마크에서 멈춰야 한다 + if (PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor) + { + PUB.AGV.AGVMoveStop("UPdateMotionPositionForMark"); + return true; + } + else CheckAGVStopbyMARK(sender); + } + else if (PUB.Result.CurrentPosCW == "0") + { + //내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다 + CheckAGVMoveTo(eGoDir.Down); + } + else + { + PUB.Result.CurrentPosCW = "0"; + CheckAGVMoveTo(eGoDir.Down); + } + } + } + + + } + } + //UP 작업 + //else + //{ + // //1. 현재위치 > 대상위치 + // if (PUB.Result.CurrentPos > PUB.Result.TargetPos) + // { + // //계속내려간다 + // CheckAGVMoveTo(eGoDir.Down); + // } + // //2. 현재위치 < 대상위치 + // else if (PUB.Result.CurrentPos < PUB.Result.TargetPos) + // { + // //올라가야한다 + // CheckAGVMoveTo(eGoDir.Up); + // } + // //3. 현재위치 = 대상위치 + // else + // { + // //AGV는 위로가고 있다 + // if (VAR.BOOL[eVarBool.AGVDIR_UP] == true) + // { + // if (PUB.Result.CurrentPosCW == "0") + // { + // //장비가 마크센서에의해 멈췃다면 완료이다 + // if (PUB.AGV.system1.agv_stop && PUB.AGV.system1.stop_by_front_detect == false && PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor) + // { + // return true; + // } + // else CheckAGVStopbyMARK(); + // } + // else if (PUB.Result.CurrentPosCW == "1") + // { + // //내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다 + // CheckAGVMoveTo(eGoDir.Down); + // } + // } + // //AGV는 내려가고 있다 + // else if (VAR.BOOL[eVarBool.AGVDIR_UP] == false) + // { + // if (PUB.Result.CurrentPosCW == "1") + // { + // //네려가는 방향에서 내려가는 위치가 인식되었다면 마크에서 멈춰야 한다 + // if (PUB.AGV.system1.agv_stop && PUB.AGV.system1.stop_by_front_detect == false && PUB.AGV.error.Emergency == false && PUB.AGV.signal.mark_sensor) + // { + // return true; + // } + // else CheckAGVStopbyMARK(); + // } + // else if (PUB.Result.CurrentPosCW == "0") + // { + // //내려가는 작업이고 AGV는 올라가고 있는데 RFID는 위졲이 감지되었다면 아래로 내려가야한다 + // CheckAGVMoveTo(eGoDir.Up); + // } + // } + // } + //} + + + + + + + return false; + } + Boolean UpdateMotionPositionForCharger(string sender) + { + if (VAR.BOOL[eVarBool.AGVDIR_UP] == false)// PUB.flag.get(EFlag.FLAG_DIR_BW) == true) + { + //충전기 검색은 항상 뒤로 검색한다 + var tsCmd = DateTime.Now - tm_gocharge_command; + if (tsCmd.TotalMilliseconds >= 1999 && + PUB.AGV.error.Emergency == false && + PUB.AGV.system1.agv_run == false) + { + //PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition(" + sender + ")"); + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);// + tm_gocharge_command = DateTime.Now; + } + } + else + { + //CCW (역방향 ) + //if (Pub.Result.RFIDPos < ePosition.CHARGE || Pub.Result.RFIDPos > ePosition.QC) + //{ + // //정상적이라면 RFID값은 QC + 혹은 QC - 에 있어야 하므로 항상 차저보다 높이 있다 + // //그렇지 않다면 초기화해서 QC검색부터 다시 실행하게 한다 + // //여기는 비정상 위치 값이다. + // Pub.sm.SetStepSeq(1); + //} + //else + //{ + //현재위치가 충전위치이고, 움직이지 않았다면 완료된 경우라 할수 있따 + if (PUB.Result.CurrentPos == ePosition.CHARGE && + PUB.AGV.signal.mark_sensor == true) + { + PUB.log.AddI("충전위치 검색 완료"); + return true; + } + else + { + //이동중이지 않다면 항상 이동을 해줘야한다 + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalMilliseconds >= 1999 && + PUB.AGV.error.Emergency == false && + PUB.AGV.system1.agv_run == false) + { + //PUB.PLC.Move(Device.PLC.Rundirection.Backward, "UpdateMotionPosition #1(" + sender + ")"); + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);// + LastCommandTime = DateTime.Now; + } + } + //} + } + + return false; + } + + }//cvass +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHGOFF.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHGOFF.cs new file mode 100644 index 0000000..7e7806b --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_CHGOFF.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + + public Boolean _SM_RUN_CHGOFF(bool isFirst, TimeSpan stepTime) + { + // + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true || PUB.AGV.system1.Battery_charging == true) + { + if (isFirst) + { + VAR.TIME.Set(eVarTime.ChargeEnd); + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) + { + PUB.Speak(Lang.충전을해제합니다); + } + } + + //AGV는 충전을 해제한 상태이다 + if (PUB.AGV.system1.Battery_charging == false) + { + //너무빨리 처리되지 않도록 5초후에 완료 처리를 한다 + var ts1 = VAR.TIME.RUN(eVarTime.ChargeEnd); + var ts2 = VAR.TIME.RUN(eVarTime.SendChargeOff); + if (ts1.TotalSeconds >= 5 && ts2.TotalSeconds > 5) VAR.BOOL[eVarBool.FLAG_CHARGEONA] = false; + } + else + { + //OFF전송이 처음이라면 시간 섲렁 + if (VAR.TIME.IsSet(eVarTime.SendChargeOff)==false) + VAR.TIME[eVarTime.SendChargeOff] = DateTime.Now.AddSeconds(-10); + + var tsChgOff = VAR.TIME.RUN(eVarTime.SendChargeOff); + if (tsChgOff.TotalSeconds >= 3) + { + PUB.log.Add("충전 해제 전송"); + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + VAR.TIME.Set(eVarTime.SendChargeOff); + } + + } + return false; + } + else + { + //PUB.logsys.Add($"충전OFF확인완료"); + return true; + } + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGE.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGE.cs new file mode 100644 index 0000000..ad79f2a --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGE.cs @@ -0,0 +1,264 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + DateTime tm_gocharge_command = DateTime.Now; + public Boolean _SM_RUN_GOCHARGE(bool isFirst, TimeSpan stepTime) + { + if (runStepisFirst) + { + //홈을 찾도록 항상 위치를 지워버리자 + PUB.Result.CurrentPos = ePosition.NONE; + PUB.Result.CurrentPos = ePosition.NONE; + } + + //HW 연결오류 + if (PUB.AGV.IsOpen == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR); + return false; + } + else if (PUB.PLC.IsValid == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR); + return false; + } + + //충전 상태가 OFF되어야 동작하게한다 + if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) + return false; + + + //라이더멈춤이 설정되어있다면 음성으로 알려준다 200409 + if (PUB.AGV.system1.stop_by_front_detect == true) + { + var tsSpeak = DateTime.Now - LastSpeakTime; + if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm) + { + PUB.Speak(Lang.전방에물체가감지되었습니다); + LastSpeakTime = DateTime.Now; + } + return false; + } + + //현재 위치가 결정되어있는지 체크한다 + if (_SM_RUN_POSCHK(isFirst, stepTime) == false) + { + PUB.Result.result_message = "충전기 검색 전 현재 위치 검색"; + PUB.Result.result_progressmax = 0; + return false; + } + + //충전작업진행상태 //220629 + //if (PUB.flag.get(EFlag.FLAG_GO_CHAGER_TEMP) == false) + //{ + // PUB.flag.set(EFlag.FLAG_GO_CHAGER_TEMP, true); + //} + + var idx = 1; + if (PUB.sm.RunStepSeq == idx++) + { + PUB.Speak(Lang.충전을위해홈위치로이동합니다); + PUB.Result.TargetPos = ePosition.QC; + VAR.TIME.Set(eVarTime.ChargeSearch); + PUB.sm.UpdateRunStepSeq(); + PUB.log.Add($"충전:대상위치 QC 시작"); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //모션 전후진 제어 + if (UpdateMotionPositionForMark("GOCHARGE #1") == true) + { + PUB.log.Add($"충전:충전기 검색 전 QC위치 확인 완료"); + PUB.sm.UpdateRunStepSeq(); + } + else + { + //아직 충진기 위치를 찾지 못했다 + var ts = VAR.TIME.RUN(eVarTime.ChargeSearch); + if (ts.TotalSeconds > PUB.setting.ChargeSearchTime) + { + PUB.log.Add($"충전:충전검색시간초과({ts.TotalSeconds}/{PUB.setting.ChargeSearchTime})"); + PUB.Speak(Lang.충전기검색실패); + VAR.BOOL[eVarBool.WAIT_CHARGEACK] = false; + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.counter.CountChargeE += 1; + PUB.counter.Save(); + } + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB.setting.chargerpos == 0) //down search + { + PUB.log.Add($"충전:충전기 검색을 위한 전진시작"); + PUB.Speak(Lang.충전기를검색합니다); + PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData + { + Speed = arDev.Narumi.eMoveSpd.Low, + Bunki = arDev.Narumi.eBunki.Strate, + Direction = arDev.Narumi.eMoveDir.Forward, + PBSSensor = 1, + }); + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); + //PUB.Result.TargetPos = ePosition.CHARGE; + VAR.TIME.Set(eVarTime.ChargeSearch); + } + else if (PUB.setting.chargerpos == 2) //up search + { + PUB.log.Add($"충전:충전기 검색을 위한 전진시작"); + PUB.Speak(Lang.충전기를검색합니다); + PUB.AGV.AGVMoveSet(new arDev.Narumi.BunkiData + { + Speed = arDev.Narumi.eMoveSpd.Low, + Bunki = arDev.Narumi.eBunki.Strate, + Direction = arDev.Narumi.eMoveDir.Backward, + PBSSensor = 1, + }); + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + //PUB.Result.TargetPos = ePosition.CHARGE; + VAR.TIME.Set(eVarTime.ChargeSearch); + } + else + { + PUB.log.Add($"충전기위치가 QC위치로 설정되어 있습니다"); + } + + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB.setting.chargerpos != 1) + { + if (PUB.AGV.system1.agv_run) + { + PUB.log.Add($"충전:AGV기동확인으로 마크정지신호설정"); + PUB.Speak(Lang.다음마크위치에서정지합니다); + PUB.AGV.AGVMoveStop("SM_RUN_GOCHARGE", arDev.Narumi.eStopOpt.MarkStop); + VAR.TIME.Set(eVarTime.ChargeSearch); + PUB.sm.UpdateRunStepSeq(); + } + else + { + if (VAR.TIME.RUN(eVarTime.ChargeSearch).TotalSeconds > 5) + { + //5초이상 이곳에서 대기한다면 다시 돌려준다 + PUB.sm.UpdateRunStepSeq(-1); + PUB.log.Add($"충전:AGV기동확인 안됨, 롤백 다시 이동할 수 있게 함"); + } + } + } + else + { + VAR.TIME.Set(eVarTime.ChargeSearch); + PUB.sm.UpdateRunStepSeq(); + } + + + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB.AGV.system1.agv_stop) + { + PUB.log.Add($"충전:충전기멈춤확인 다음진행"); + PUB.logagv.Add("충전 위치에 멈췄습니다"); + PUB.sm.UpdateRunStepSeq(); + } + else + { + if (VAR.TIME.RUN(eVarTime.ChargeSearch).TotalSeconds > 60) + { + PUB.log.Add($"충전:멈춤 확인 60초 초과로 전체 취소함"); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.counter.CountChargeE += 1; + PUB.counter.Save(); + VAR.BOOL[eVarBool.WAIT_CHARGEACK] = false; + PUB.AddEEDB("충전실패로 인한 취소"); + } + } + return false; + } + //충전기위치까지 왔다 + else if (PUB.sm.RunStepSeq == idx++) + { + //센서가 안정화되기 위한 5초간 기다려준다 + if (stepTime.TotalSeconds <= 3) return false; + PUB.log.Add($"충전:충전기위치정지완료"); + PUB.Result.CurrentPos = ePosition.CHARGE; //현재위치를 충전기로 한다 + PUB.Result.TargetPos = ePosition.CHARGE; + PUB.Result.CurrentPosCW = "1"; + ctlPos1.SetPosition(ePosition.CHARGE); + ctlPos1.SetPositionActive(ePosition.CHARGE); + ctlPos1.Invalidate(); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //충전시작 명령을 전송한다 + PUB.log.Add($"충전:충전명령전송"); + PUB.Speak(Lang.충전시작명령을전송합니다); + PUB.AGV.AGVCharge(PUB.setting.ChargerID, true); + VAR.BOOL[eVarBool.WAIT_CHARGEACK] = true; + LastCommandTime = DateTime.Now; + VAR.BYTE[eVarByte.CHARGE_CMDCNT] = 0; + PUB.sm.UpdateRunStepSeq(); + return false; + } + //충전시작명령의 ACK를 체크합니다 + else if (PUB.sm.RunStepSeq == idx++) + { + //충전시작 명령을 전송한다 + if (PUB.AGV.ACKData.Equals("CBT")) + { + PUB.log.Add($"충전명령 회신 확인"); + PUB.sm.UpdateRunStepSeq(); + } + else + { + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalSeconds > 3) + { + if (VAR.BYTE[eVarByte.CHARGE_CMDCNT] > 5) + { + PUB.logagv.Add($"충전명령 재전송 5회초과로 전체 취소함"); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.counter.CountChargeE += 1; + PUB.counter.Save(); + VAR.BOOL[eVarBool.WAIT_CHARGEACK] = false; + PUB.AddEEDB("충전실패로 인한 취소"); + } + else + { + PUB.logagv.Add($"충전시작명령 재전송"); + VAR.BYTE.Add(eVarByte.CHARGE_CMDCNT, 1); + PUB.AGV.AGVCharge(PUB.setting.ChargerID, true); + LastCommandTime = DateTime.Now; + } + } + } + return false; + } + + return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGECHECK.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGECHECK.cs new file mode 100644 index 0000000..d0a7124 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOCHARGECHECK.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + + public Boolean _SM_RUN_GOCHARGECHECK(bool isFirst, TimeSpan stepTime) + { + //충전상태체크를 확인합니다 + //10초안에 충전 플래그가 활성화되지 않으면 QC상태로 이동한다 + if (PUB.AGV.system1.Battery_charging == false || VAR.BOOL[eVarBool.FLAG_CHARGEONA] == false) + { + if (PUB.AGV.error.Charger_pos_error) + { + PUB.Speak(Lang.충전기위치오류로작업을취소합니다, true); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + } + else if (PUB.AGV.error.Charger_run_error) + { + PUB.Speak(Lang.충전기위치오류로작업을취소합니다, true); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + } + else + { + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalSeconds >= 30) + { + PUB.log.AddE( Lang.충전기작동확인이오버되어홈으로이동조치합니다); + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + } + else + { + PUB.Result.result_message = string.Format("충전기 활성화 수신 확인 중({0:N1}/{1})", tsCmd.TotalSeconds, 30); + PUB.Result.result_progressmax = 15; + PUB.Result.result_progressvalue = tsCmd.TotalSeconds; + } + } + + return false; + } + else return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GODOWN.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GODOWN.cs new file mode 100644 index 0000000..06f6121 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GODOWN.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + public Boolean _SM_RUN_GODOWN(bool isFirst, TimeSpan stepTime) + { + if (runStepisFirst) + { + //PUB.flag.set(EFlag.FLAG_NEXTSTOP_ALIGN, false); + VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;// + //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;//); + } + + //HW 연결오류 + if (PUB.AGV.IsOpen == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR); + return false; + } + else if (PUB.PLC.IsValid == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR); + return false; + } + + //충전 상태가 OFF되어야 동작하게한다 + if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) + return false; + + //라이더멈춤이 설정되어있다면 음성으로 알려준다 200409 + if (PUB.AGV.system1.stop_by_front_detect == true) + { + var tsSpeak = DateTime.Now - LastSpeakTime; + if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm) + { + PUB.Speak(Lang.전방에물체가감지되었습니다); + LastSpeakTime = DateTime.Now; + } + return false; + } + + + //현재 위치가 결정되어있는지 체크한다 + if (_SM_RUN_POSCHK(isFirst, stepTime) == false) + return false; + + if (PUB.sm.RunStepSeq == 1) + { + //하차는 무조건 대상이 QC가 된다 + if (PUB.Result.TargetPos == ePosition.NONE) + PUB.Result.TargetPos = ePosition.QC; + + //if (PUB.Result.TargetPos == ePosition.QA && + // PUB.Result.CurrentPos == ePosition.QC && + // (PUB.PLC.IsLimitDn())) + //{ + // PUB.Speak("안전 커버를 올리고 다시 시도하세요", true); + // PUB.sm.ClearRunStep(); + // PUB.sm.SetNewRunStep(ERunStep.READY); + //} + PUB.AddEEDB($"하차작업시작({PUB.Result.TargetPos})"); + PUB.Speak(Lang.하차작업을시작합니다); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == 2) + { + //모션 전후진 제어 + if (UpdateMotionPositionForMark("GODOWN")) + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == 3) + { + //위치 확정이 완료될때까지 대기 + if (PUB.Result.CurrentPos == PUB.Result.TargetPos) + { + //PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GODOWN:위치확정"); + PUB.AGV.AGVMoveStop("sm_run_godown"); + PUB.sm.UpdateRunStepSeq(); + } + else if (PUB.AGV.system1.agv_run == false) + { + //움직이지않으면 방향을 다시 조정한다 + PUB.sm.SetStepSeq(2); + } + + return false; + } + else if (PUB.sm.RunStepSeq == 4) + { + //대상까지 모두 완료되었다.(완전히 정차할때까지 기다린다) + if (PUB.AGV.system1.agv_run == false) + { + PUB.log.Add("이동 정지 확인"); + PUB.sm.UpdateRunStepSeq(); + } + + return false; + } + else if (PUB.sm.RunStepSeq == 5) + { + //하차수량증가 + if (PUB.Result.TargetPos == ePosition.QA) + PUB.counter.CountQA += 1; + else + PUB.counter.CountQC += 1; + PUB.counter.Save(); + + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == 6) + { + //커버를 자동으로 내려준다 + CoverControlTime = DateTime.Now; + UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를내립니다); + VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = true; + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down);// + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == 7) + { + //커버 내림이 완료될때까지 기다린다 + if (PUB.PLC.IsLimitDn() == true) + { + VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = false; + PUB.sm.UpdateRunStepSeq(); + } + else + { + //경과시간이 10초가 지나면 5초마다 음성을 출력한다 + var tsCover = DateTime.Now - CoverControlTime; + if (tsCover.TotalSeconds >= 7) + { + PUB.Speak(Lang.안전커버를내려주세요); + CoverControlTime = DateTime.Now; + } + } + + return false; + } + else if (PUB.sm.RunStepSeq == 8) + { + //IO업데이트 간격 전송 + UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를올려주세요); + PUB.Speak(Lang.안전커버를올리면하차가완료됩니다); + VAR.BOOL[eVarBool.WAIT_COVER_UP] = true; + CoverControlTime = DateTime.Now; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == 9) + { + //커버 올림이 완료될때까지 기다린다 + if (VAR.BOOL[eVarBool.FLAG_LIMITHIGH] == true) + { + VAR.BOOL[eVarBool.WAIT_COVER_UP] = false; + VAR.BOOL[eVarBool.ITEMON] = false; + PUB.sm.UpdateRunStepSeq(); + } + else + { + //경과시간이 10초가 지나면 5초마다 음성을 출력한다 + var tsCover = DateTime.Now - CoverControlTime; + if (tsCover.TotalSeconds >= PUB.setting.doorSoundTerm) + { + PUB.Speak(Lang.안전커버를올려주세요); + CoverControlTime = DateTime.Now; + + //한쪽이 올라가 있는 상태에.. + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == true) + { + //모터는 올리는 방향일때에... + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LDIR) == true) + { + //모터가 멈춰있을때에.. + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LRUN) == false) + { + //자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음) + + //왼쪽이 올라가 있지 않은 경우 + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false) + PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up); + } + } + } + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == true) + { + //모터는 올리는 방향일때에... + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RDIR) == true) + { + //모터가 멈춰있을때에.. + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RRUN) == false) + { + //자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음) + + //왼쪽이 올라가 있지 않은 경우 + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false) + PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up); + } + } + } + + + } + } + + return false; + } + + PUB.AddEEDB($"하차작업완료({PUB.Result.TargetPos})"); + EEMStatus.AddStatusCount(1, PUB.Result.TargetPos.ToString()); //230620 + return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOHOME.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOHOME.cs new file mode 100644 index 0000000..bc925c8 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOHOME.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + public Boolean _SM_RUN_GOHOME(bool isFirst, TimeSpan stepTime) + { + if (runStepisFirst) + { + // PUB.flag.set(EFlag.FLAG_NEXTSTOP_ALIGN, false); + + //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;//); + VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;//); + } + + //220629 + // if(PUB.flag.get(EFlag.FLAG_GO_CHAGER_TEMP)) + //{ + // PUB.flag.set(EFlag.FLAG_GO_CHAGER_TEMP, false); + //} + + //HW 연결오류 + if (PUB.AGV.IsOpen == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR); + return false; + } + else if (PUB.PLC.IsValid == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR); + return false; + } + + //충전 상태가 OFF되어야 동작하게한다 + if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) + return false; + + //라이더멈춤이 설정되어있다면 음성으로 알려준다 200409 + if (PUB.AGV.system1.stop_by_front_detect == true) + { + var tsSpeak = DateTime.Now - LastSpeakTime; + if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm) + { + PUB.Speak(Lang.전방에물체가감지되었습니다); + LastSpeakTime = DateTime.Now; + } + return false; + } + + //현재 위치가 결정되어있는지 체크한다 + if (_SM_RUN_POSCHK(isFirst, stepTime) == false) + return false; + + var idx = 1; + if (PUB.sm.RunStepSeq == idx++) + { + PUB.Speak(Lang.홈으로이동합니다); + + //홈은 무조건 QC위치로 간다 + PUB.AddEEDB($"홈검색시작({PUB.Result.TargetPos})"); + PUB.Result.TargetPos = ePosition.QC; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //모션 전후진 제어 + if (UpdateMotionPositionForMark("GOHOME")) + { + PUB.AGV.AGVMoveStop("SM_RUN_GOHOME"); + PUB.sm.UpdateRunStepSeq(); + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //QC까지 모두 완료되었다.(완전히 정차할때까지 기다린다) + PUB.Speak(Lang.홈검색완료, true); + PUB.AddEEDB($"홈검색완료({PUB.Result.TargetPos})"); + PUB.sm.UpdateRunStepSeq(); + return false; + } + + return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOUP.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOUP.cs new file mode 100644 index 0000000..97669af --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_GOUP.cs @@ -0,0 +1,272 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + + public Boolean _SM_RUN_GOUP(bool isFirst, TimeSpan stepTime) + { + if (runStepisFirst) + { + // VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;//); + VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false; + } + + //HW 연결오류 + if (PUB.AGV.IsOpen == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR); + return false; + } + else if (PUB.PLC.IsValid == false) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.PLCCONN, eNextStep.ERROR); + return false; + } + + + //충전 상태가 OFF되어야 동작하게한다 + if (_SM_RUN_CHGOFF(isFirst, stepTime) == false) + return false; + + //라이더멈춤이 설정되어있다면 음성으로 알려준다 200409 + if (PUB.AGV.system1.stop_by_front_detect == true) + { + var tsSpeak = DateTime.Now - LastSpeakTime; + if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm) + { + PUB.Speak(Lang.전방에물체가감지되었습니다); + LastSpeakTime = DateTime.Now; + } + return false; + } + + //현재 위치가 결정되어있는지 체크한다 + if (_SM_RUN_POSCHK(isFirst, stepTime) == false) + return false; + + var idx = 1; + if (PUB.sm.RunStepSeq == idx++) + { + //상차 가능 조건 확인 + if (PUB.Result.TargetPos == ePosition.NONE) + { + PUB.Result.SetResultMessage(eResult.Hardware, eECode.NOTALLOWUP, eNextStep.ERROR); + } + else + { + PUB.AddEEDB($"상차작업시작({PUB.Result.TargetPos})"); + PUB.Speak(Lang.상차작업을시작합니다); + PUB.sm.UpdateRunStepSeq(); + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //모션 전후진 제어 + if (UpdateMotionPositionForMark("GOUP")) + PUB.sm.UpdateRunStepSeq(); + + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //장비멈춤확인 + if (PUB.AGV.system1.agv_run == true) + { + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalMilliseconds > 2000) + { + PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정"); + LastCommandTime = DateTime.Now; + } + } + else + { + //움직이지 않고 있다면 다시 이동을 시켜준다. + PUB.log.Add("이동 정지 확인"); + PUB.sm.UpdateRunStepSeq(); + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB.AGV.system1.agv_run == true) + { + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalMilliseconds > 2000) + { + PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정"); + LastCommandTime = DateTime.Now; + } + } + + //커버를 자동으로 내려준다 + CoverControlTime = DateTime.Now; + UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를내립니다); + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down); + VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = true; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB.AGV.system1.agv_run == true) + { + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalMilliseconds > 2000) + { + PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정"); + LastCommandTime = DateTime.Now; + } + } + + + //커버 내림이 완료될때까지 기다린다 + if (PUB.PLC.IsLimitDn() == true) + { + VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = false; + PUB.Result.NextPos = ePosition.NONE; + PUB.sm.UpdateRunStepSeq(); + } + else + { + //경과시간이 10초가 지나면 5초마다 음성을 출력한다 + var tsCover = DateTime.Now - CoverControlTime; + if (tsCover.TotalSeconds >= 7) + { + PUB.Speak(Lang.안전커버를내려주세요); + CoverControlTime = DateTime.Now; + } + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB.AGV.system1.agv_run == true) + { + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalMilliseconds > 2000) + { + PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정"); + LastCommandTime = DateTime.Now; + } + return false; + } + + + //상차는 여기서 수량확인한다 + if (PUB.Result.TargetPos == ePosition.F1) + PUB.counter.CountUp1 += 1; + else if (PUB.Result.TargetPos == ePosition.F2) + PUB.counter.CountUp2 += 1; + else if (PUB.Result.TargetPos == ePosition.F3) + PUB.counter.CountUp3 += 1; + else if (PUB.Result.TargetPos == ePosition.F4) + PUB.counter.CountUp4 += 1; + //else if (PUB.Result.TargetPos == ePosition.QA) + // PUB.counter.CountQA += 1; + PUB.counter.Save(); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + + //IO업데이트 간격 전송 + UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를올려주세요); + PUB.Speak(Lang.안전커버를올리면상차가완료됩니다); + PUB.sm.UpdateRunStepSeq(); + VAR.BOOL[eVarBool.WAIT_COVER_UP] = true; + PUB.Result.NextPos = ePosition.NONE; + CoverControlTime = DateTime.Now; + return false; + } + + else if (PUB.sm.RunStepSeq == idx++) + { + if (PUB.AGV.system1.agv_run == true) + { + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalMilliseconds > 2000) + { + PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정"); + LastCommandTime = DateTime.Now; + } + } + + + //커버 올림이 완료될때까지 기다린다 + if (VAR.BOOL[eVarBool.FLAG_LIMITHIGH] == true) + { + VAR.BOOL[eVarBool.WAIT_COVER_UP] = false; + VAR.BOOL[eVarBool.ITEMON] = true; + PUB.sm.UpdateRunStepSeq(); + } + else + { + //경과시간이 10초가 지나면 5초마다 음성을 출력한다 + var tsCover = DateTime.Now - CoverControlTime; + if (tsCover.TotalSeconds >= PUB.setting.doorSoundTerm) + { + PUB.Speak(Lang.안전커버를올려주세요); + CoverControlTime = DateTime.Now; + + //한쪽이 올라가 있는 상태에.. + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == true) + { + //모터는 올리는 방향일때에... + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LDIR) == true) + { + //모터가 멈춰있을때에.. + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LRUN) == false) + { + //자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음) + + //왼쪽이 올라가 있지 않은 경우 + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false) + PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up); + + //오른쪽이 올라가 있지 않은 경우 + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false) + PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up); + } + } + } + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == true) + { + //모터는 올리는 방향일때에... + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RDIR) == true) + { + //모터가 멈춰있을때에.. + if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RRUN) == false) + { + //자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음) + + //왼쪽이 올라가 있지 않은 경우 + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false) + PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up); + + //오른쪽이 올라가 있지 않은 경우 + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false) + PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up); + } + } + } + } + } + return false; + } + + PUB.AddEEDB($"상차작업완료({PUB.Result.TargetPos})"); + return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_INIT.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_INIT.cs new file mode 100644 index 0000000..ac69c2d --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_INIT.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Media; + +namespace Project +{ + public partial class fMain + { + /// + /// 웨이퍼를 집기 위해 지정된 위치로 이동을 합니다. + /// + /// + private bool _SM_RUN_INIT(Boolean firstRun, TimeSpan RunTime) + { + //result message + int progress = 0; + var ProgressMax = 13; + + //setting socket + UpdateProgressStatus(++progress, ProgressMax, "소켓 초기화"); System.Threading.Thread.Sleep(5); + if (PUB.sock_debug.Listen(PUB.setting.listenPort)) + PUB.log.AddI("Socket Listen : " + PUB.setting.listenPort); + else + PUB.log.AddE("Socket Listen : " + PUB.sock_debug.errorMessage); + + + //UpdateProgressStatus(++progress, ProgressMax, "PLC 확인"); System.Threading.Thread.Sleep(5); + //if (PUB.setting.Port_PLC != "") + //{ + // if (PUB.PLC.Init(PUB.setting.Port_PLC, PUB.setting.Baud_PLC)) + // { + // //VAR.BOOL[eVarBool.FLAG_SETUP] = true; + // PUB.log.Add("Entering Setup Mode (Main)"); + // } + // else PUB.log.AddE("PLC Init error : " + PUB.PLC.GetErrorMessage()); + //} + + //UpdateProgressStatus("PLC #2 확인", ++progress, ProgressMax); System.Threading.Thread.Sleep(5); + //if (Pub.setting.Port_PLC2 != "") + //{ + // if (Pub.plcS.Init(Pub.setting.Port_PLC2, Pub.setting.Baud_plc2)) + // { + // Pub.plcS.SetFlag(Device.PLC2.PLCFlag.FLAG_SETUP, true); + // Pub.log.Add("Entering Setup Mode (Sub)"); + // } + // else Pub.log.AddE("DIO #S Init error : " + Pub.plcS.GetErrorMessage()); + //} + + //setting Port_Xbee + //UpdateProgressStatus(++progress, ProgressMax, "Port_Xbee 확인"); System.Threading.Thread.Sleep(5); + //if (PUB.setting.Port_XBE.isEmpty() == false) + //{ + // PUB.XBE.PortName = PUB.setting.Port_XBE; + // if (PUB.XBE.Open() == false) + // PUB.log.AddE(string.Format("Barcode Port({0}) Open Error: {1}", PUB.setting.Port_XBE, PUB.XBE.errorMessage)); + //} + //else + //{ + // PUB.log.AddAT("NOT-SET Port_Xbee PORTNAME"); + // PUB.XBE.errorMessage = "NOT-SET Port_Xbee PORTNAME"; + //} + + ////setting Port_Xbee + //UpdateProgressStatus(++progress, ProgressMax, "Port_AGV 확인"); System.Threading.Thread.Sleep(5); + //if (PUB.setting.Port_AGV.isEmpty() == false) + //{ + // PUB.AGV.PortName = PUB.setting.Port_AGV; + // PUB.AGV.BaudRate = PUB.setting.Baud_AGV; + // if (PUB.AGV.Open() == false) + // PUB.log.AddE(string.Format("RFID Host:{0} Open Error: {1}", PUB.setting.Port_AGV, PUB.AGV.errorMessage)); + //} + //else + //{ + // PUB.log.AddAT("NOT-SET Port_AGV PORTNAME"); + // PUB.AGV.errorMessage = "NOT-SET Port_AGV PORTNAME"; + //} + + + ////setting Port_Xbee + //UpdateProgressStatus(++progress, ProgressMax, "Port_BMS 확인"); System.Threading.Thread.Sleep(5); + //if (!PUB.setting.Port_BAT.isEmpty()) + //{ + // PUB.BAT.PortName = PUB.setting.Port_BAT;//.Port_BMS; + // PUB.BAT.BaudRate = PUB.setting.Baud_BAT;// + // PUB.BAT.ScanInterval = 1000;// Pub.setting.interval_bms; + // var binit_bms = PUB.BAT.Open(); + // if (binit_bms == false) PUB.log.AddE(string.Format("binit_bms Port({0}) Open Error: {1}", PUB.setting.Port_BAT, PUB.BAT.errorMessage)); + //} + //else + //{ + // PUB.log.AddAT("NOT-SET binit_bms PORTNAME"); + //} + + //남은 공간 + UpdateProgressStatus(++progress, ProgressMax, "공간 확인"); System.Threading.Thread.Sleep(5); + CheckFreeSpace(); //181225 + + //시스템 오류가 있다면 경고 메시지를 표싷ㄴ다. + UpdateProgressStatus(++progress, ProgressMax, "오류 수집"); System.Threading.Thread.Sleep(5); + //var AlertMessage = new System.Text.StringBuilder(); + //if (Pub.Xbee.IsInit == false) AlertMessage.AppendLine(string.Format("BARCODE : {0}", Pub.Xbee.errorMessage)); + if (freeSpaceRate < PUB.setting.AutoDeleteThreshold) + { + PUB.Speak(string.Format("디스크 용량이 {0:N0}% 남았습니다", freeSpaceRate)); + } + + //if (AlertMessage.Length > 1) + //{ + // AlertMessage.Insert(0, "SYSTEM ALERT\n"); + // Pub.popup.setMessage(AlertMessage.ToString()); + //} + + UpdateProgressStatus(++progress, ProgressMax, "--"); System.Threading.Thread.Sleep(5); + PUB.log.Add("초기화 완료"); + return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs new file mode 100644 index 0000000..f1b66e8 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_POSCHK.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class fMain + { + public Boolean _SM_RUN_POSCHK(bool isFirst, TimeSpan stepTime) + { + //현재 위치가 찾아지지 않았다면. 먼저 위치를 찾는다. 위로 이동시켜서 찾는다. + if (PUB.Result.CurrentPos == ePosition.NONE) + { + if (isFirst) + { + PUB.Speak( Lang.현재위치를검색합니다); + } + + if (PUB.AGV.system1.agv_run) + { + //방향을 체크한다 + var basedir = PUB.setting.AGV_Direction_FVI_Backward ? 'F' : 'B'; + if (PUB.AGV.data.Direction == basedir) + { + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalMilliseconds >= 1999) + { + PUB.AGV.AGVMoveStop("SM_RUN_POSCHK",arDev.Narumi.eStopOpt.Stop); + LastCommandTime = DateTime.Now; + } + } + } + else if (PUB.AGV.system1.agv_run == false) + { + //전진이동한다 + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalMilliseconds >= 1999) + { + if (PUB.setting.AGV_Direction_FVI_Backward) + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Backward);// + else + PUB.AGV.AGVMoveRun(arDev.Narumi.eRunOpt.Forward);// + LastCommandTime = DateTime.Now; + } + } + + return false; + } + else return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_READY.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_READY.cs new file mode 100644 index 0000000..71833d7 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_READY.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using COMM; +using static Project.StateMachine; + +namespace Project +{ + public partial class fMain + { + public Boolean _SM_RUN_READY(bool isFirst, TimeSpan stepTime) + { + //이동 불가 조건이 걸려있다면 충전을 하지 못하게 한다. + Boolean bAutoChageOn = true; + if (PUB.AGV.system1.stop_by_front_detect) bAutoChageOn = false; + else if (PUB.AGV.error.Emergency) bAutoChageOn = false; + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) bAutoChageOn = false; + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) bAutoChageOn = false; + + + //자동 충전 중이라면 최대 충전시간과 레벨을 체크한다 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true) + { + if (VAR.TIME.IsSet(eVarTime.ChargeStart) == false) + VAR.TIME.Set(eVarTime.ChargeStart); + + //충전중이라면 최대 충전 시간을 체크한다. + var tsChargeRunTime = VAR.TIME.RUN(eVarTime.ChargeStart); + if (PUB.BMS.Current_Level >= PUB.setting.ChargeMaxLevel) + { + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.log.Add($"최대충전레벨 OVER로 인한 자동 해제(레벨:{PUB.setting.ChargeMaxLevel})"); + PUB.AddEEDB($"최대충전레벨 OVER로 인한 자동 해제(레벨:{PUB.setting.ChargeMaxLevel})"); + PUB.Speak(Lang.충전완료로해제합니다); + } + else if (PUB.setting.ChargeMaxTime > 1 && tsChargeRunTime.TotalSeconds >= PUB.setting.ChargeMaxTime) + { + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.CHARGEOFF); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.log.Add($"최대충전시간 OVER로 인한 자동 해제(시간:{PUB.setting.ChargeMaxTime})"); + PUB.AddEEDB($"최대충전시간 OVER로 인한 자동 해제(시간:{PUB.setting.ChargeMaxTime})"); + PUB.Speak(Lang.충전완료로해제합니다); + } + VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 중"; + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true) + { + if (VAR.TIME.IsSet(eVarTime.ChargeStart) == false) + VAR.TIME.Set(eVarTime.ChargeStart); + VAR.STR[eVarString.ChargeCheckMsg] = "수동 충전"; + } + + //현재위치를 모르는 상태라면 이동하여 현재 위치를 찾는다 + else if (PUB.Result.CurrentPos == ePosition.NONE) + { + if (PUB.AGV.system1.agv_run == false && + PUB.AGV.error.Emergency == false && + PUB.AGV.error.runerror_by_no_magent_line == false) + { + //현재위치를 검색해야함 + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.AddEEDB($"READY상태에서 현재위치를 몰라 홈으로 이동"); + } + VAR.STR[eVarString.ChargeCheckMsg] = "현재 위치 모름"; + } + else if (PUB.setting.Enable_AutoCharge == true ) + { + if(bAutoChageOn) + { + VAR.BOOL[eVarBool.CHARGE_READY] = true; + if (PUB.BMS.Current_Level < PUB.setting.ChargeStartLevel) + { + //레벨에 의한 자동 충전간격은 + var ts = VAR.TIME.RUN(eVarTime.ChargeTry); + if (ts.TotalSeconds >= PUB.setting.ChargeRetryTerm) + { + VAR.I32[eVarInt32.ChargeWaitSec] = 0; + VAR.BOOL[eVarBool.CHARGE_WAIT] = false; + PUB.log.Add($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}"); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.GOCHARGE); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.AddEEDB($"자동충전레벨시작 {PUB.BMS.Current_Level}/{PUB.setting.ChargeStartLevel}"); + } + else + { + VAR.I32[eVarInt32.ChargeWaitSec] = (int)(PUB.setting.ChargeRetryTerm - ts.TotalSeconds); + VAR.BOOL[eVarBool.CHARGE_WAIT] = true; + } + VAR.STR[eVarString.ChargeCheckMsg] = "배터리 충전 레벨 필요"; + } + else + { + //아직 레벨이 높다 + VAR.BOOL[eVarBool.CHARGE_READY] = false; + VAR.I32[eVarInt32.ChargeWaitSec] = 0; + VAR.BOOL[eVarBool.CHARGE_WAIT] = false; + VAR.STR[eVarString.ChargeCheckMsg] = "배터리 레벨상 충전 불필요"; + } + } + else + { + VAR.BOOL[eVarBool.CHARGE_READY] = false; + VAR.I32[eVarInt32.ChargeWaitSec] = 0; + VAR.BOOL[eVarBool.CHARGE_WAIT] = false; + VAR.STR[eVarString.ChargeCheckMsg] = "충전 불가 조건"; + //충전조건이 맞지 않는다 + } + } + else + { + VAR.BOOL[eVarBool.CHARGE_READY] = false; + VAR.I32[eVarInt32.ChargeWaitSec] = 0; + VAR.BOOL[eVarBool.CHARGE_WAIT] = false; + //자동충전이 해제된 상태이므로 처리하지 않는다 + VAR.STR[eVarString.ChargeCheckMsg] = "자동 충전 해제 됨"; + } + + //대기모드에서는 움직이지 않게 한다 + if(PUB.AGV.system1.agv_run) + { + var ts = VAR.TIME.RUN(eVarTime.IdleStopTime); + if(ts.TotalSeconds > 1) + { + PUB.log.Add($"대기상태에서는 정차"); + PUB.AGV.AGVMoveStop("대기상태에서는 정차"); + VAR.TIME.Set(eVarTime.IdleStopTime); + } + } + + return false; + + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_RESET.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_RESET.cs new file mode 100644 index 0000000..fed8f2d --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_RESET.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + public Boolean _SM_RUN_RESET(bool isFirst, TimeSpan stepTime) + { + if (runStepisFirst) + { + PUB.Speak(Lang.장비상태초기화); + + //충전기검색시퀀스 OFF + //PUB.flag.set(EFlag.FLAG_GO_CHAGER_TEMP, false); + } + + var idx = 1; + if (PUB.sm.RunStepSeq == idx++) + { + //충전중이라면 충전off코드를 넣는다 + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false,PUB.setting.ChargetWaitSec); + LastCommandTime = DateTime.Now; + PUB.AddEEDB($"초기화"); + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + UpdateProgressStatus(stepTime.TotalSeconds, 5, "SYNC : 수동 모드 확인 중"); + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) + PUB.sm.UpdateRunStepSeq(); + else + { + //일정시간동안 명령을 재전송한다 + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalMilliseconds >= 1999) + { + VAR.BOOL[eVarBool.FLAG_AUTORUN] = false; + LastCommandTime = DateTime.Now; + } + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //모션을 멈춥니다 + //PUB.PLC.Move(Device.PLC.Rundirection.Stop,"RESET"); + PUB.AGV.AGVMoveStop("_sm_run_reset"); + LastCommandTime = DateTime.Now; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //모션이 멈출때까지 기다린다 + if (PUB.AGV.system1.agv_stop == false) + { + PUB.sm.UpdateRunStepSeq(); + } + else + { + //모션이 멈추지 않는다면 멈춤코드를 계속 넣는다 + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalMilliseconds >= 1999) + { + //PUB.PLC.Move(Device.PLC.Rundirection.Stop,"RESET(Re)"); + PUB.AGV.AGVMoveStop("_sm_run_reset"); + LastCommandTime = DateTime.Now; + } + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //대상위치 초기화 + PUB.Result.TargetPos = ePosition.NONE; + PUB.Result.CurrentPos = ePosition.NONE; + PUB.Result.CurrentPosCW = "0"; + ctlPos1.SetPositionDeActive(); + ctlPos1.SetPosition(ePosition.NONE); + ctlPos1.SetDirection("0"); + ctlPos1.Invalidate(); + + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //자동 스탑 플래그 해제 + //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;//"reset #6"); + VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false; + + LastCommandTime = DateTime.Now; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + UpdateProgressStatus(stepTime.TotalSeconds, 5, "자동멈춤해제(ALIGN)"); + if (VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] == false) + PUB.sm.UpdateRunStepSeq(); + else + { + //일정시간동안 명령을 재전송한다 + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalMilliseconds >= 1999) + { + VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;// "reset #7"); + //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;// + LastCommandTime = DateTime.Now; + } + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //자동 스탑 플래그 해제 + //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;// "reset #8"); + + LastCommandTime = DateTime.Now; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //설정모드가 되어있다면 해제 해준다 + VAR.BOOL[eVarBool.FLAG_SETUP] = false; + VAR.BOOL[eVarBool.ITEMON] = false; + VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = false; + VAR.BOOL[eVarBool.WAIT_COVER_UP] = false; + + LastCommandTime = DateTime.Now; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + UpdateProgressStatus(stepTime.TotalSeconds, 5, "설정모드해제(MARK)"); + + if (VAR.BOOL[eVarBool.FLAG_SETUP] == false) + PUB.sm.UpdateRunStepSeq(); + else + { + //일정시간동안 명령을 재전송한다 + var tsCmd = DateTime.Now - LastCommandTime; + if (tsCmd.TotalMilliseconds >= 1999) + { + VAR.BOOL[eVarBool.FLAG_SETUP] = false; + LastCommandTime = DateTime.Now; + } + } + return false; + } + return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs new file mode 100644 index 0000000..baedea2 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_SM_RUN_SYNC.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; +using COMM; +using System.Diagnostics; + +namespace Project +{ + public partial class fMain + { + Dictionary synlist; + int synidx; + public Boolean _SM_RUN_SYNC(bool isFirst, TimeSpan stepTime) + { + var idx = 1; + if (PUB.sm.RunStepSeq == idx++) + { + // return true; + UpdateProgressStatus(stepTime.TotalSeconds, 5, "SYNC : 장치 연결(MAIN) 확인 중"); + if (PUB.AGV.IsOpen == false) + { + //agv connect + ConnectSerialPort(PUB.AGV, PUB.setting.Port_AGV, PUB.setting.Baud_AGV, + eVarTime.LastConn_AGV, eVarTime.LastConnTry_AGV, eVarTime.LastRecv_AGV); + } + else if (PUB.AGV.IsValid == true) + { + //설정모드 진입 + VAR.BOOL[eVarBool.FLAG_SETUP] = true; + LastCommandTime = DateTime.Now; + + PUB.sm.UpdateRunStepSeq(); + } + else + { + UpdateProgressStatus(stepTime.TotalMilliseconds, 10000.0, "wait"); + if (stepTime.TotalSeconds >= 10) + { + PUB.log.AddE("시간초과로 인해 Sync 작업이 실패되었습니다"); + PUB.sm.SetNewStep(eSMStep.IDLE); + } + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //동기화 명령 생성 + synlist = new Dictionary(); + synlist.Add("SSH", PUB.setting.SPD_H.ToString("0000")); // PUB.AGV.AGVCommand(item.Key, item.Value); + synlist.Add("SSM", PUB.setting.SPD_M.ToString("0000")); + synlist.Add("SSL", PUB.setting.SPD_L.ToString("0000")); + + synlist.Add("SSS", PUB.setting.SPD_S.ToString("0000")); + synlist.Add("SRS", PUB.setting.SPD_R.ToString("0000")); + + synlist.Add("SPK", PUB.setting.PID_PH.ToString("0000")); + synlist.Add("SPM", PUB.setting.PID_PM.ToString("0000")); + synlist.Add("SPL", PUB.setting.PID_PL.ToString("0000")); + + synlist.Add("SIK", PUB.setting.PID_IH.ToString("0000")); + synlist.Add("SIM", PUB.setting.PID_IM.ToString("0000")); + synlist.Add("SIL", PUB.setting.PID_IL.ToString("0000")); + + synlist.Add("SDK", PUB.setting.PID_DH.ToString("0000")); + synlist.Add("SDM", PUB.setting.PID_DM.ToString("0000")); + synlist.Add("SDL", PUB.setting.PID_DL.ToString("0000")); + + synlist.Add("SPS", PUB.setting.PID_PS.ToString("0000")); + synlist.Add("SIS", PUB.setting.PID_IS.ToString("0000")); + synlist.Add("SDS", PUB.setting.PID_DS.ToString("0000")); + + //추가 230110 + synlist.Add("SCK", PUB.setting.SCK.ToString("0000")); + synlist.Add("SSK", PUB.setting.SSK.ToString("0000")); + synlist.Add("STT", PUB.setting.STT.ToString("0000")); + //synlist.Add("SBN", PUB.setting.ChargerID.ToString("0000")); + + PUB.AddEEDB($"SYNC시작({PUB.Result.TargetPos})"); + + synidx = 0; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //잠시 대기 + var ts = DateTime.Now - LastCommandTime; + if (ts.TotalSeconds > 0.15) + { + PUB.sm.UpdateRunStepSeq(); + } + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + //통신 확인되었으므로 스피드를 전송한다. + if (synidx < synlist.Count) + { + var item = synlist.ElementAt(synidx); + UpdateProgressStatus(stepTime.TotalSeconds, 5, $"SYNC :{item.Key}"); + PUB.AGV.AGVCommand(item.Key, item.Value); + } + LastCommandTime = DateTime.Now; + PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + if (synidx < synlist.Count) + { + var ts = DateTime.Now - LastCommandTime; + var item = synlist.ElementAt(synidx); + UpdateProgressStatus(stepTime.TotalSeconds, 5, $"SYNC 변경 확인 중 :{item.Key}"); + if (PUB.AGV.ACKData.Equals(item.Key)) + { + synidx += 1; + if(ts.TotalSeconds < 0.15) PUB.sm.UpdateRunStepSeq(-2); //싱크중에 추가 지연시간 확보 + else PUB.sm.UpdateRunStepSeq(-1); + LastCommandTime = DateTime.Now; + } + else + { + if (ts.TotalSeconds > 1) + { + PUB.AGV.AGVCommand(item.Key, item.Value); + LastCommandTime = DateTime.Now; + Console.WriteLine($"RE.send Sync : {item.Key}:{item.Value}"); + } + } + } + else PUB.sm.UpdateRunStepSeq(); + return false; + } + else if (PUB.sm.RunStepSeq == idx++) + { + PUB.AddEEDB($"SYNC완료({PUB.Result.TargetPos})"); + UpdateProgressStatus(stepTime.TotalSeconds, 5, "SYNC : 완료"); + LastCommandTime = DateTime.Now; + PUB.sm.UpdateRunStepSeq(); + return false; + } + return true; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/Step/_STEP_CLOSE.cs b/Cs_HMI/Project/StateMachine/Step/_STEP_CLOSE.cs new file mode 100644 index 0000000..d9d4247 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/Step/_STEP_CLOSE.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; + +namespace Project +{ + public partial class fMain + { + /// + /// 프로그램을 닫을때 1회 실행되는 함수 + /// + private void _STEP_CLOSING_START(eSMStep step) + { + PUB.bShutdown = true; + if (PUB.PLC != null) PUB.PLC.Dispose(); + + PUB.AddEEDB("프로그램 종료"); + PUB.log.Add("Program Close"); + PUB.log.Flush(); + PUB.logagv.Flush(); + PUB.logplc.Flush(); + PUB.logbms.Flush(); + PUB.logcal.Flush(); + // PUB.sm.Stop(); + + } + public StepResult _STEP_CLOSING(eSMStep step, TimeSpan stepTime, TimeSpan seqTime) + { + + //############################ + //#### 사용자 전용 코드 + //############################ + + + //############################ + //#### 개발자 권장코드 + //############################ + PUB.sm.SetNewStep(eSMStep.CLOSED); + return StepResult.Complete; + } + + public void _STEP_CLOSED_START(eSMStep step) + { + try + { + this.BeginInvoke(new Action(() => + { + //화면을 닫는다 + PUB.sm.Stop(); + this.Close(); + })); + } + catch { } + } + public StepResult _STEP_CLOSED(eSMStep step, TimeSpan stepTime, TimeSpan seqTime) + { + return StepResult.Wait; + } + } +} diff --git a/Cs_HMI/Project/StateMachine/_AGV.cs b/Cs_HMI/Project/StateMachine/_AGV.cs new file mode 100644 index 0000000..6649c3e --- /dev/null +++ b/Cs_HMI/Project/StateMachine/_AGV.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using arCtl; +using static Project.StateMachine; +using COMM; +namespace Project +{ + + public partial class fMain + { + private void AGV_Message(object sender, arDev.Narumi.MessageEventArgs e) + { + if (e.MsgType == arDev.arRS232.MessageType.Normal) + + PUB.logagv.AddE(e.Message); + else if (e.MsgType == arDev.arRS232.MessageType.Normal) + + PUB.logagv.Add(e.Message); + else if (e.MsgType == arDev.arRS232.MessageType.Recv) + { + if (e.Message.Substring(1).StartsWith("STS") == false) + PUB.logagv.Add("AGV-RX", e.Message); + } + else if (e.MsgType == arDev.arRS232.MessageType.Send) + PUB.logagv.Add("AGV-TX", e.Message); + else + { + + PUB.logagv.Add(e.MsgType.ToString(), e.Message); + } + } + + ePosition ParsePosition(int tag, out string dirBW) + { + var tagstr = tag.ToString(); + var tagno = tagstr.Substring(0, tagstr.Length - 1); + + if (tag == PUB.setting.TAGNOT) { dirBW = "0"; return ePosition.NOT; } + + else if (tag == PUB.setting.TAG_QA_QC) { dirBW = "0"; return ePosition.QA_QC; } + else if (tag == PUB.setting.TAG_QC_F1) { dirBW = "0"; return ePosition.QC_F1; } + else if (tag == PUB.setting.TAG_F1_F2) { dirBW = "0"; return ePosition.F1_F2; } + else if (tag == PUB.setting.TAG_F2_F3) { dirBW = "0"; return ePosition.F2_F3; } + else if (tag == PUB.setting.TAG_F3_F4) { dirBW = "0"; return ePosition.F3_F4; } + else if (tag == PUB.setting.TAG_F4_F5) { dirBW = "0"; return ePosition.F4_F5; } + + else if (tag == PUB.setting.TAGQAB) { dirBW = "0"; return ePosition.QA; } + else if (tag == PUB.setting.TAGQCB) { dirBW = "0"; return ePosition.QC; } + else if (tag == PUB.setting.TAGF1B) { dirBW = "0"; return ePosition.F1; } + else if (tag == PUB.setting.TAGF2B) { dirBW = "0"; return ePosition.F2; } + else if (tag == PUB.setting.TAGF3B) { dirBW = "0"; return ePosition.F3; } + else if (tag == PUB.setting.TAGF4B) { dirBW = "0"; return ePosition.F4; } + else if (tag == PUB.setting.TAGF5B) { dirBW = "0"; return ePosition.F5; } + //else if (tag == PUB.setting.TAGQAA) { dirBW = "1"; return ePosition.QA; } + //else if (tag == PUB.setting.TAGCHA) { dirBW = "1"; return ePosition.CHARGE; } + else if (tag == PUB.setting.TAGQAA) { dirBW = "1"; return ePosition.QA; } + else if (tag == PUB.setting.TAGQCA) { dirBW = "1"; return ePosition.QC; } + else if (tag == PUB.setting.TAGF1A) { dirBW = "1"; return ePosition.F1; } + else if (tag == PUB.setting.TAGF2A) { dirBW = "1"; return ePosition.F2; } + else if (tag == PUB.setting.TAGF3A) { dirBW = "1"; return ePosition.F3; } + else if (tag == PUB.setting.TAGF4A) { dirBW = "1"; return ePosition.F4; } + else if (tag == PUB.setting.TAGF5A) { dirBW = "1"; return ePosition.F5; } + else if (tag == PUB.setting.TAGPOT) { dirBW = "0"; return ePosition.POT; } + else + { + if (tag > 9350 && tag < 9400) + { + dirBW = "0"; return ePosition.QC_F1; + } + else if (tag > 9250 && tag < 9300) + { + dirBW = "0"; return ePosition.QA_QC; + } + else if (tag > 9000 && tag < 9100) + { + dirBW = "0"; return ePosition.NOT; + } + else + { + dirBW = "0"; return ePosition.NONE; + } + + } + } + + + bool _charging = false; + private void AGV_DataReceive(object sender, arDev.Narumi.DataEventArgs e) + { + switch (e.DataType) + { + case arDev.Narumi.DataType.STS: + { + //마크센서 확인 + var chg_mark1 = PUB.AGV.signal.GetChanged(arDev.Narumi.Signal.eflag.mark_sensor_1); + var chg_mark2 = PUB.AGV.signal.GetChanged(arDev.Narumi.Signal.eflag.mark_sensor_1); + var chg_run = PUB.AGV.system1.GetChanged(arDev.Narumi.SystemFlag1.eflag.agv_run); + var chg_stop = PUB.AGV.system1.GetChanged(arDev.Narumi.SystemFlag1.eflag.agv_stop); + //if (chg_run && PUB.AGV.system1.agv_run) PUB.Speak("이동을 시작 합니다"); + VAR.BOOL[eVarBool.AGVDIR_UP] = PUB.AGV.data.Direction == 'B'; + // PUB.AGV.signal.mark_sensor = PUB.AGV.signal.mark_sensor; + VAR.BOOL[eVarBool.AGV_ERROR] = PUB.AGV.error.Value > 0; + VAR.BOOL[eVarBool.EMERGENCY] = PUB.AGV.error.Emergency; + + if (PUB.AGV.signal.mark_sensor == false) + { + if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == false) + { + VAR.BOOL[eVarBool.MARK_SENSOROFF] = true; + VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now; + PUB.log.Add($"마크센서off를 설정"); + } + } + else + { + if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == true) + { + VAR.BOOL[eVarBool.MARK_SENSOROFF] = false; + VAR.TIME[eVarTime.MarkSensorOff] = DateTime.Now; + PUB.log.Add($"마크센서off를 해제"); + } + } + + + //차징상태변경 + if (_charging != PUB.AGV.system1.Battery_charging) + { + if (PUB.AGV.system1.Battery_charging) + { + VAR.TIME[eVarTime.ChargeStart] = DateTime.Now; + PUB.logagv.Add($"충전시작:{VAR.TIME[eVarTime.ChargeStart]}"); + } + _charging = PUB.AGV.system1.Battery_charging; + } + + //배터리충전상태 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] != PUB.AGV.system1.Battery_charging) + { + PUB.log.Add($"충전상태전환 {PUB.AGV.system1.Battery_charging}"); + VAR.BOOL[eVarBool.FLAG_CHARGEONA] = PUB.AGV.system1.Battery_charging; + } + //자동충전해제시 곧바로 수동 충전되는 경우가 있어 자동 상태를 BMS에 넣는다 230118 + PUB.BMS.AutoCharge = PUB.AGV.system1.Battery_charging; + + if (PUB.AGV.error.Charger_pos_error != VAR.BOOL[eVarBool.CHG_POSERR]) + { + if (PUB.AGV.error.Charger_pos_error) + { + PUB.Speak(Lang.충전기위치오류); + } + VAR.BOOL[eVarBool.CHG_POSERR] = PUB.AGV.error.Charger_pos_error; + } + + if (VAR.BOOL[eVarBool.MARK_SENSOROFF] == true && PUB.AGV.signal.mark_sensor == false) + { + //현재 활성화된 위치를 꺼준다 + if (this.ctlPos1.GetPositionActive(PUB.Result.CurrentPos)) + { + var ts = VAR.TIME.RUN(eVarTime.MarkSensorOff); + if (ts.TotalSeconds >= 2) + { + ctlPos1.SetPositionDeActive(); + PUB.log.Add($"현재 활성위치를 해제 함"); + } + } + + } + + //나르미가 멈췄다면 다음 마크 이동 기능이 OFF 된다 + if (PUB.AGV.system1.agv_stop) + VAR.BOOL[eVarBool.NEXTSTOP_MARK] = false; + + if (VAR.BOOL[eVarBool.MARK_SENSOR] != PUB.AGV.signal.mark_sensor) + { + if (PUB.AGV.signal.mark_sensor) + { + //현재위치를 확정한다 + var curact = ctlPos1.GetPositionActive(PUB.Result.CurrentPos); + if (curact == false) + { + PUB.log.Add($"마크센서로인해 현재위치 설정완료:{PUB.Result.CurrentPos}"); + ctlPos1.SetPositionActive(PUB.Result.CurrentPos); + ctlPos1.SetDirection(""); + ctlPos1.Invalidate(); + } + } + VAR.BOOL[eVarBool.MARK_SENSOR] = PUB.AGV.signal.mark_sensor; + } + } + break; + case arDev.Narumi.DataType.TAG: + { + //자동 실행 중이다. + + PUB.log.Add($"RFID값에서 위치정보를 추출할 수 있도록 해야한다"); + + PUB.Result.LastTAG = PUB.AGV.data.TagNo.ToString(); + + var curpos = ParsePosition(PUB.AGV.data.TagNo, out string dirForward); + if (curpos != PUB.Result.CurrentPos) + { + PUB.log.Add($"현재위치변경 {PUB.Result.CurrentPos} -> {curpos}"); + PUB.Result.CurrentPos = curpos; + } + + PUB.Result.CurrentPosCW = dirForward; + ctlPos1.SetPositionDeActive(); + ctlPos1.SetPosition(PUB.Result.CurrentPos); + ctlPos1.SetDirection(dirForward); + ctlPos1.Invalidate(); + + //pot not를 보면 일단 바로 멈추게한다 + if (PUB.Result.CurrentPos == ePosition.POT || PUB.Result.CurrentPos == ePosition.NOT) + { + PUB.AGV.AGVMoveStop("TAG:pot/not 발견으로 즉시 멈춤"); + } + + //자동, 상하차 모드일때 RFID 가 타겟위치에 올때는 - 멈춤을 설정해준다 + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true && + PUB.Result.CurrentPos == PUB.Result.TargetPos && + PUB.Result.TargetPos != ePosition.NONE && + (PUB.sm.RunStep == ERunStep.GODOWN || + PUB.sm.RunStep == ERunStep.GOUP || + PUB.sm.RunStep == ERunStep.GOHOME || + PUB.sm.RunStep == ERunStep.GOCHARGE)) + { + if (PUB.AGV.data.Sts == 'F' && dirForward == "0") //아래로 내려오고있음 + { + PUB.AGV.AGVMoveStop("AGV_DataReceive", arDev.Narumi.eStopOpt.MarkStop); + PUB.Speak( Lang.다음마크위치에서정지합니다); + } + else if (PUB.AGV.data.Sts == 'B' && dirForward == "1") + { + //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = true; + PUB.AGV.AGVMoveStop("AGV_DataReceive", arDev.Narumi.eStopOpt.MarkStop); + PUB.Speak(Lang.다음마크위치에서정지합니다); + } + } + + } + break; + case arDev.Narumi.DataType.ACK: + PUB.logagv.Add($"AGV_[ACK]Receive : {PUB.AGV.ACKData}"); + break; + default: + PUB.logagv.Add($"AGV_DataReceive : {e.DataType}"); + break; + + } + + } + + } +} diff --git a/Cs_HMI/Project/StateMachine/_BMS.cs b/Cs_HMI/Project/StateMachine/_BMS.cs new file mode 100644 index 0000000..01189fd --- /dev/null +++ b/Cs_HMI/Project/StateMachine/_BMS.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using arCtl; +using static Project.StateMachine; +using COMM; + +namespace Project +{ + public partial class fMain + { + string lastbms03 = ""; + string lastbms04 = ""; + string lastbmsA03 = ""; + string lastbmsA04 = ""; + string lastbms = ""; + DateTime lastbmstime03 = DateTime.Now; + DateTime lastbmstime04 = DateTime.Now; + DateTime lastbmstimeA03 = DateTime.Now; + DateTime lastbmstimeA04 = DateTime.Now; + DateTime lastbmstime = DateTime.Now; + private void Bms_Message(object sender, arDev.BMS.MessageEventArgs e) + { + if (e.MsgType == arDev.arRS232.MessageType.Error) PUB.logbms.AddE( e.Message); + else + { + var hexstr = e.Data.GetHexString().Trim(); + bool addlog = false; + var logtimesec = 30; + if (hexstr.StartsWith("DD 04")) + { + if (lastbms04.Equals(hexstr.Substring(0,5)) == false) + { + addlog = true; + lastbms04 = "DD 04"; + lastbmstime04 = DateTime.Now; + } + else + { + var ts = DateTime.Now - lastbmstime04; + if (ts.TotalSeconds > logtimesec) + { + addlog = true; + lastbms04 = "DD 04"; + lastbmstime04 = DateTime.Now; + } + } + + } + else if (hexstr.StartsWith("DD 03")) + { + if (lastbms03.Equals(hexstr.Substring(0, 5)) == false) + { + addlog = true; + lastbms03 = "DD 03"; + lastbmstime03 = DateTime.Now; + } + else + { + var ts = DateTime.Now - lastbmstime03; + if (ts.TotalSeconds > logtimesec) + { + addlog = true; + lastbms03 = "DD 03"; + lastbmstime03 = DateTime.Now; + } + } + } + + else if (hexstr.StartsWith("DD A5 04")) + { + if (lastbmsA04.Equals(hexstr.Substring(0, 8)) == false) + { + addlog = true; + lastbmsA04 = "DD A5 04"; + lastbmstimeA04 = DateTime.Now; + } + else + { + var ts = DateTime.Now - lastbmstimeA04; + if (ts.TotalSeconds > logtimesec) + { + addlog = true; + lastbmsA04 = "DD A5 04"; + lastbmstimeA04 = DateTime.Now; + } + } + } + + else if (hexstr.StartsWith("DD A5 03")) + { + if (lastbmsA03.Equals(hexstr.Substring(0, 8)) == false) + { + addlog = true; + lastbmsA03 = "DD A5 03"; + lastbmstimeA03 = DateTime.Now; + } + else + { + var ts = DateTime.Now - lastbmstimeA03; + if (ts.TotalSeconds > logtimesec) + { + addlog = true; + lastbmsA03 = "DD A5 03"; + lastbmstimeA03 = DateTime.Now; + } + } + } + + + + else if (hexstr.isEmpty() == false) + { + if (lastbms.Equals(hexstr) == false) + { + lastbms = hexstr; + lastbmstime = DateTime.Now; + addlog = true; + } + else + { + var ts = DateTime.Now - lastbmstime; + if (ts.TotalSeconds > logtimesec) + { + addlog = true; + lastbms = hexstr; + lastbmstime = DateTime.Now; + } + } + } + + if(addlog) + PUB.logbms.Add("BMS:" + hexstr); + + } + } + private void BMS_ChargeDetect(object sender, arDev.ChargetDetectArgs e) + { + //자동충전중이아니고 멈춰있다면 수동 충전으로 전환한다 + if (PUB.AGV.system1.Battery_charging == false && PUB.AGV.system1.agv_stop == true && VAR.BOOL[eVarBool.FLAG_CHARGEONM] == false) + { + if (PUB.setting.DetectManualCharge) + { + VAR.BOOL[eVarBool.FLAG_CHARGEONM] = true; + PUB.Speak(Lang.충전이감지되어수동충전으로전환합니다); + } + else + { + PUB.log.Add($"충전이 감지되었지만 메뉴얼 전환 비활성화됨"); + } + + } + } + + private void Bms_BMSDataReceive(object sender, EventArgs e) + { + + if (PUB.BMS.Current_Level <= PUB.setting.ChargeStartLevel) + { + //배터리 레벨이 기준보다 낮다면 경고를 활성화 한다 + if (VAR.BOOL[eVarBool.BATTERY_LOW] == false) + { + VAR.BOOL[eVarBool.BATTERY_LOW] = true; + PUB.log.AddAT("배터리 부족 경고 활성화"); + } + } + else + { + //배터리 경고를 해제한다 + if (VAR.BOOL[eVarBool.BATTERY_LOW] == true) + { + VAR.BOOL[eVarBool.BATTERY_LOW] = false; + PUB.log.AddAT("배터리 부족 경고 비활성화"); + } + } + } + } +} diff --git a/Cs_HMI/Project/StateMachine/_DIO.cs b/Cs_HMI/Project/StateMachine/_DIO.cs new file mode 100644 index 0000000..d0e4947 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/_DIO.cs @@ -0,0 +1,297 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using arDev; +using COMM; + +namespace Project +{ + public partial class fMain + { + + private void PLC_DioChanged(object sender, arDev.FakePLC.IOValueEventArgs e) + { + if (e.Direction == arDev.Arduino.IODirection.Input) + { + var diName = (arDev.FakePLC.DIName)e.ArrIDX; + Console.WriteLine(string.Format("[DI:{1}]{0}=>{2}", diName, e.ArrIDX, e.NewValue)); + + if (diName == arDev.FakePLC.DIName.PINI_BTN_1) //reset + { + if (e.NewValue == true) + { + PUB.log.Add($"버튼({diName}) 눌림(AGV_RESET)"); + PUB.AGV.AGVErrorReset(); + + //241203 + if(PUB.AGV.system1.agv_run || PUB.AGV.system1.agv_run_manual) + { + PUB.AGV.AGVMoveStop("button1"); + } + //PUB.XBE.NewMsgEvent('0', '1'); + } + } + else if (diName == arDev.FakePLC.DIName.PINI_BTN_2) //auto -> QC //230424 + { + if (e.NewValue == true) + { + PUB.log.Add($"버튼({diName}) 눌림"); + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true) + { + if (PUB.sm.RunStep == StateMachine.ERunStep.GOUP) + { + //zup을 자동으로 해준다 + if (VAR.BOOL[eVarBool.WAIT_COVER_UP]) + { + PUB.log.Add($"버튼({diName}) 눌림"); + PUB.PLC.ZMot(FakePLC.ZMotDirection.Up); + PUB.Result.NextPos = ePosition.QC; + } + else PUB.Speak(Lang.커버업대기상태가아닙니다); + } + else if (PUB.sm.RunStep == StateMachine.ERunStep.GODOWN) + { + //이미 하차진행중에 누른 경우이다 + PUB.Result.NextPos = ePosition.QC; + PUB.Result.TargetPos = ePosition.QC; + } + else + { + PUB.log.Add(Lang.QC이동버튼은상하차에서만사용가능합니다); + PUB.Speak(Lang.하차상태에서만사용가능합니다); + } + } + else PUB.Speak(Lang.자동운전상태가아닙니다); + + //if (VAR.BOOL[eVarBool.FLAG_AUTORUN]==false) + //{ + // PUB.sm.ClearRunStep(); + // PUB.sm.SetNewRunStep(StateMachine.ERunStep.READY); + // PUB.sm.SetNewStep(StateMachine.eSMStep.RUN); + // PUB.Speak("자동 상태로 전환 합니다"); + //} + //else + //{ + // PUB.Speak("현재 자동 상태 입니다"); + //} + } + } + else if (diName == arDev.FakePLC.DIName.PINI_BTN_3) //z-down -> QA //230424 + { + if (e.NewValue == true) + { + //Z-dn기능으로 업데이트 230119 + PUB.log.Add($"버튼({diName}) 눌림"); + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true) + { + if (PUB.sm.RunStep == StateMachine.ERunStep.GOUP) + { + //zup.을 자동으로 해준다 + if (VAR.BOOL[eVarBool.WAIT_COVER_UP]) + { + PUB.log.Add($"버튼({diName}) 눌림"); + PUB.PLC.ZMot(FakePLC.ZMotDirection.Up); + PUB.Result.NextPos = ePosition.QA; + } + else PUB.Speak(Lang.커버업대기상태가아닙니다); + } + else if (PUB.sm.RunStep == StateMachine.ERunStep.GODOWN) + { + //이미 하차진행중에 누른 경우이다 + PUB.Result.NextPos = ePosition.QA; + PUB.Result.TargetPos = ePosition.QA; + } + else + { + PUB.log.Add($"QA이동 버튼은 상/하차에서만 사용 가능합니다"); + PUB.Speak(Lang.하차상태에서만사용가능합니다); + } + } + else PUB.Speak(Lang.자동운전상태가아닙니다); + + //PUB.PLC.ZMot(FakePLC.ZMotDirection.Down); + } + } + else if (diName == arDev.FakePLC.DIName.PINI_BTN_4) //z-up + { + if (e.NewValue == true) + { + //Z-up기능으로 업데이트 230119 + PUB.log.Add($"버튼({diName}) 눌림"); + PUB.PLC.ZMot(FakePLC.ZMotDirection.Up); + } + } + else if (diName == arDev.FakePLC.DIName.PINI_EMG) + { + if (e.NewValue == true) + { + PUB.log.Add($"버튼({diName}) 눌림"); + PUB.Speak(Lang.비상정지); + } + //else Pub.Speak("비상 정지 해제"); + } + else if (diName == arDev.FakePLC.DIName.PINI_OVERLOADL) + { + if (e.NewValue == true) + { + PUB.log.Add($"버튼({diName}) 눌림"); + PUB.Speak(Lang.오버로드감지); + } + VAR.BOOL[eVarBool.OVERLOADL] = e.NewValue; + } + else if (diName == arDev.FakePLC.DIName.PINI_OVERLOADR) + { + if (e.NewValue == true) + { + PUB.log.Add($"버튼({diName}) 눌림"); + PUB.Speak(Lang.오버로드감지); + } + VAR.BOOL[eVarBool.OVERLOADR] = e.NewValue; + } + //else if (diName == FakePLC.DIName.PINI_LIMIT_LU) + //{ + // PUB.flag.set(EFlag.FLAG_LIMITHIGHL, e.NewValue); + //} + //else if (diName == FakePLC.DIName.PINI_LIMIT_RU) + //{ + // PUB.flag.set(EFlag.FLAG_LIMITHIGHR, e.NewValue); + //} + //else if (diName == FakePLC.DIName.PINI_LIMIT_LD) + //{ + // PUB.flag.set(EFlag.FLAG_LIMITLOWL, e.NewValue); + //} + //else if (diName == FakePLC.DIName.PINI_LIMIT_RD) + //{ + // PUB.flag.set(EFlag.FLAG_LIMITLOWR, e.NewValue); + //} + //else + //{ + // //처리하지 않음 + //} + //PUB.flag.set(EFlag.FLAG_LIMITHIGH, (PUB.flag.get(EFlag.FLAG_LIMITHIGHL) && PUB.flag.get(EFlag.FLAG_LIMITHIGHR))); + //PUB.flag.set(EFlag.FLAG_LIMITLOW, (PUB.flag.get(EFlag.FLAG_LIMITLOWL) && PUB.flag.get(EFlag.FLAG_LIMITLOWR))); + VAR.BOOL[eVarBool.FLAG_LIMITHIGH] = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) || PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU); + VAR.BOOL[eVarBool.FLAG_LIMITLOW] = PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LD) || PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RD); + VAR.BOOL[eVarBool.OVERLOAD] = (VAR.BOOL[eVarBool.OVERLOADL] || VAR.BOOL[eVarBool.OVERLOADR]); + } + else + { + //출력포트값 변경 + var doName = (arDev.FakePLC.DOName)e.ArrIDX; + PUB.logplc.Add($"출력({doName}) {(e.NewValue ? "O" : "X")}"); + } + } + + //string oldflagmessage = string.Empty; + string lastplclogmessage = ""; + DateTime lastplclogtime = DateTime.Now; + string logmessage = ""; + bool logerror = false; + void PLC_Message(object sender, FakePLC.MessageEventArgs e) + { + if (e.MsgType == arRS232.MessageType.Error) + { + PUB.logplc.Add("ERROR-MAIN", e.Message); + } + else if (e.MsgType == arRS232.MessageType.Normal) + { + //내부클래스에서 발생한 메세지(이 프로그램) + if (e.Message.StartsWith("@STP:") && e.Message.Length > 5) + { + PUB.Result.StopMessageSWR = e.Message.Substring(5); + PUB.Result.StopMessageTimeSWR = DateTime.Now; + } + PUB.logplc.Add("MOT", "[Inner Msg]" + e.Message); + } + else + { + //PLC에서 수신된 메세지 + if (e.Message.StartsWith("@STP|") && e.Message.Length > 5) + { + PUB.Result.StopMessagePLC = e.Message.Substring(5); + PUB.Result.StopMessageTimePLC = DateTime.Now; + PUB.logplc.Add("PLC", "[" + e.MsgType.ToString() + "]" + e.Message); + } + else if (e.Message.StartsWith("@FLAG|") && e.Message.Length > 6) + { + var flagData = e.Message.Split('|')[1].Split(','); + var flag = (COMM.eVarBool)(byte.Parse(flagData[0])); + + var flagmsg = "[" + flag.ToString() + "] = " + flagData[1]; + + + //플래그값이 바뀌면 로깅한다 + var fValueTrue = flagData[1] == "1"; + if (PUB.PLC.GetFlag(flag) != fValueTrue) + { + PUB.logplc.Add("MFLAG", flagmsg); + } + } + else if (e.Message.StartsWith("@SET|") && e.Message.Length > 5) + { + //셋팅관련 정보이다 + var flagData = e.Message.Split('|')[1]; + var splBuf = flagData.Split(':'); + if (splBuf[0] == "SAVE") PUB.PLC.SaveTime = DateTime.Now; + PUB.logplc.Add("SETUP", "[SETTING] " + flagData); + + } + else + { + + if (e.Message.StartsWith("ERR")) + { + logmessage = e.Message; + logerror = true; + } + else if (e.Message.StartsWith("@@") & e.Data.Length == 16) + { + //표시하지 말자 + logerror = false; + var hexstr = e.Data.GetHexString(); + logmessage = "[" + e.MsgType.ToString() + "]" + hexstr; + } + else + { + logmessage = "[" + e.MsgType.ToString() + "]" + e.Message; + logerror = false; + } + + bool addlog = false; + if (lastplclogmessage.StartsWith("[Recv] 40 40")) + { + if (lastplclogmessage.Length > 40) + { + var st = lastplclogmessage.Substring(0, 40); + var cr = logmessage.Substring(0, 40); + addlog = st.Equals(cr) == false; + if (addlog == false) + { + var ts = DateTime.Now - lastplclogtime; + if (ts.TotalSeconds > 5) addlog = true; + } + } + else addlog = true; + } + else if (logmessage.Equals(lastplclogmessage) == false) addlog = true; + else + { + var ts = DateTime.Now - lastplclogtime; + if (ts.TotalSeconds > 30) addlog = true; + } + if (addlog) + { + if (logerror) PUB.logplc.AddE(logmessage); + else PUB.logplc.Add("PLC", logmessage); + lastplclogmessage = logmessage; + lastplclogtime = DateTime.Now; + } + } + } + + } + } +} + diff --git a/Cs_HMI/Project/StateMachine/_Flag.cs b/Cs_HMI/Project/StateMachine/_Flag.cs new file mode 100644 index 0000000..25aadd8 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/_Flag.cs @@ -0,0 +1,107 @@ +using COMM; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class fMain + { + void gridView2_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e) + { + //메인화면 하단의 플래그 상태창에서 클릭된 경우 + //var gv = sender as arFrame.Control.GridView; + //var flagIndex = gv.getNameItem(e.idx); + //if(flagIndex != "") + //{ + // var fidx = int.Parse(flagIndex); + // var flag = (eFlag)fidx; + // var curValue = Pub.flag.get(flag); + // Pub.flag.set(flag, !curValue); + //} + } + + private void BOOL_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + var buf = e.PropertyName.Split('|'); + var flag = (COMM.eVarBool)int.Parse(buf[0]); + var NewValue = buf[1].ToUpper() == "TRUE"; + if (flag == COMM.eVarBool.FLAG_AUTORUN) + { + //자동운전이 해제되면 현재위치값을 삭제한다 + if (NewValue == false && PUB.setting.AutoModeOffAndClearPosition == true) + { + if (PUB.Result.CurrentPos != ePosition.NONE) + { + PUB.log.AddAT($"자동운전이 해제되어 현재 위치를 제거합니다"); + PUB.Result.CurrentPos = ePosition.NONE; + PUB.Result.CurrentPosCW = "1"; + } + } + // Pub.mplayer.Stop(); + //if (NewValue == true) + //{ + // btAutoRun.BackColor = Color.Lime; + // btAutoRun.BackColor2 = Color.Green; + // btAutoRun.Text = "자동 실행 상태"; + + // //if (Pub.sm.Step >= StateMachine.eSMStep.IDLE) Pub.Speak("자동 실행 모드"); + //} + //else + //{ + // btAutoRun.BackColor2 = Color.DimGray; + // btAutoRun.BackColor = Color.FromArgb(100, 100, 100); + // btAutoRun.Text = "수동 조작 상태"; + // //if (Pub.sm.Step >= StateMachine.eSMStep.IDLE) Pub.Speak("수동 조작 모드"); + //} + } + else if (flag == COMM.eVarBool.FLAG_CHARGEONA) + { + if (NewValue) + { + VAR.TIME.Set(eVarTime.ChargeStart); + PUB.counter.CountChargeA += 1; + PUB.counter.Save(); + PUB.Speak(Lang.충전을시작합니다); + } + else + { + PUB.Speak(Lang.충전을해제합니다); + } + } + else if (flag == COMM.eVarBool.FLAG_CHARGEONM) + { + if (NewValue) + { + VAR.TIME.Set(eVarTime.ChargeStart); + PUB.counter.CountChargeM += 1; + PUB.counter.Save(); + PUB.Speak(Lang.수동충전을시작합니다); + } + else + { + PUB.Speak(Lang.수동충전을해제합니다); + } + } + else if (flag == COMM.eVarBool.NEXTSTOP_MARK) + { + if (NewValue) + { + //PUB.Speak("다음 위치에서 멈춥니다"); + PUB.log.Add($"마크인식시 멈춤 신호 변경 : {NewValue}"); + } + } + + } + + void PLC_FlagChanged(object sender, arDev.Arduino.DIO.FlagValueEventArgs e) + { + //플래그 상태표시는 메인의 타이머를 이용한다 + // var flag = (arDev.FakePLC.PLCFlag)e.ArrIDX; + PUB.log.Add($"PLC Flag Changed {e.ArrIDX} : {e.NewValue}"); + } + } +} diff --git a/Cs_HMI/Project/StateMachine/_Loop.cs b/Cs_HMI/Project/StateMachine/_Loop.cs new file mode 100644 index 0000000..6f28d88 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/_Loop.cs @@ -0,0 +1,405 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using arCtl; +using static Project.StateMachine; +using COMM; +using System.Windows.Forms; +using Project.ViewForm; + +namespace Project +{ + + public partial class fMain + { + + + DateTime lastDeleteTime = DateTime.Now; + DateTime startuptime = new DateTime(1982, 11, 23); + enum EScreen + { + Auto = 0, + Manual, + IO, + Flag + } + void SetScreen(System.Windows.Forms.Form newscreen) + { + if (newscreen == null) + throw new Exception("화면전용용 폼이 Null 입니다. SM_RUN_INIT 에서 해당 폼이 초기화 되었는지 확인하세요"); + + //작업시작 + if (this.InvokeRequired) + { + this.BeginInvoke(new Action(() => + { + SetScreen(newscreen); + })); + } + else + { + if (newscreen.GetType() == typeof(fManual)) + { + + } + else if (PUB.DriveSpeed) + { + var rlt = PUB.AGV.AGVCommand("SSH", PUB.setting.SPD_H.ToString("0000")); + if (rlt) PUB.DriveSpeed = false; + PUB.log.Add($"Screen Change and DriveSpeed Off:{rlt}"); + } + + MenuAuto.ForeColor = Color.FromArgb(180, 180, 180); + MenuFlag.ForeColor = Color.FromArgb(180, 180, 180); + MenuLift.ForeColor = Color.FromArgb(180, 180, 180); + MenuLog.ForeColor = Color.FromArgb(180, 180, 180); + MenuMAN.ForeColor = Color.FromArgb(180, 180, 180); + MenuAGV.ForeColor = Color.FromArgb(180, 180, 180); + MenuBMS.ForeColor = Color.FromArgb(180, 180, 180); + + + if (panDlg.Controls.Count > 0) + { + var f = panDlg.Controls[0] as System.Windows.Forms.Form; + if (f.GetType() == newscreen.GetType()) return; + else f.Hide(); //숨김처리 + } + panDlg.Controls.Clear(); + panDlg.Controls.Add(newscreen); + newscreen.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + newscreen.WindowState = System.Windows.Forms.FormWindowState.Maximized; + newscreen.Show(); + } + } + + + void sm_Running(object sender, StateMachine.RunningEventArgs e) + { + + //창을 닫아야하는 상황에는 처리하지 않는다. + if (PUB.popup.needClose) + { + System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다. + PUB.sm.WaitFirstRun = true; + return; + } + else PUB.sm.WaitFirstRun = false; + + //main loop + switch (e.Step) + { + case eSMStep.CLOSING: + _STEP_CLOSING_START(e.Step); + PUB.sm.SetNewStep(eSMStep.CLOSED); + break; + case eSMStep.CLOSED: + if (e.isFirst) _STEP_CLOSED_START(e.Step); + else _STEP_CLOSED(e.Step, e.StepTime, e.StepTime); + break; + case eSMStep.NOTSET: + PUB.log.Add("S/M Initialize Start"); + PUB.sm.SetNewStep(eSMStep.INIT); + break; + + case eSMStep.INIT: //최초실행이다. + + if (_SM_RUN_INIT(e.isFirst, PUB.sm.StepRunTime)) + { + //메인화면을 설정한다 + form_auto = new ViewForm.fAuto(); + form_manu = new ViewForm.fManual(); + form_zlift = new ViewForm.fIO(); + form_flag = new ViewForm.fFlag(); + form_bms = new ViewForm.fBms(); + form_agv = new ViewForm.fAgv(); + + + form_auto.TopLevel = false; + form_manu.TopLevel = false; + form_zlift.TopLevel = false; + form_flag.TopLevel = false; + form_bms.TopLevel = false; + form_agv.TopLevel = false; + + + form_auto.Dock = System.Windows.Forms.DockStyle.Fill; + form_manu.Dock = System.Windows.Forms.DockStyle.Fill; + form_zlift.Dock = System.Windows.Forms.DockStyle.Fill; + form_flag.Dock = System.Windows.Forms.DockStyle.Fill; + form_bms.Dock = System.Windows.Forms.DockStyle.Fill; + form_agv.Dock = System.Windows.Forms.DockStyle.Fill; + + SetScreen(form_auto); + + PUB.sm.ResetRunStepSeq(); + PUB.sm.SetNewStep(eSMStep.SYNC); + PUB.Speak(Lang.프로그램이초기화되었습니다); + } + break; + + + case eSMStep.IDLE: + + if (e.isFirst) + { + PUB.sm.bPause = false; + //Pub.flag.set(eFlag.UserStepCheck, false); + PUB.sm.ClearRunStep(); + // Util_DO.SetMGZMotor(false); + PUB.Result.SMSG_ProgressEnable = false; + UpdateStatusMessage("준비 완료", Color.Red, Color.Gold); + if (startuptime.Year == 1982) startuptime = DateTime.Now; + } + + //자동소거기능 + if (PUB.setting.AutoDeleteDay > 0) + { + if (VAR.BOOL[eVarBool.MINSPACE] == true) + { + var ts = DateTime.Now - lastDeleteTime; + if (ts.TotalSeconds > 1) + { + //파일을 찾아서 소거한다. + if (System.IO.Directory.Exists(PUB.path.FullName)) + DeleteFile(PUB.path.FullName); + + + lastDeleteTime = DateTime.Now; + } + + } + } + break; + + case eSMStep.SYNC: + if (_SM_RUN_SYNC(runStepisFirst, PUB.sm.GetRunSteptime)) + { + var b1 = PUB.XBE.IsOpen; + var b2 = PUB.AGV.IsOpen; + var b3 = PUB.PLC.IsOpen; + var b4 = PUB.BMS.IsOpen; + + if (b1 == false || b2 == false || b3 == false || b4 == false) + PUB.Speak(Lang.하드웨어오류발생); + else + PUB.Speak( Lang.초기화완료); + + PUB.sm.SetNewStep(eSMStep.IDLE); + return; + } + break; + + case eSMStep.RUN: + _SM_RUN(e.isFirst, e.StepTime); + break; + + case eSMStep.PAUSE: + case eSMStep.EMERGENCY: + case eSMStep.ERROR: + + + //창을 닫아야하는 상황에는 처리하지 않는다. + if (PUB.popup.needClose) + { + System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다. + PUB.sm.WaitFirstRun = true; + return; + } + else PUB.sm.WaitFirstRun = false; + + if (e.isFirst) + { + + if (PUB.Result.ResultCode != eResult.NoError) + { + //에러메세지가 있는 경우에만 표시함 + if (PUB.Result.ResultMessage != "") + PUB.popup.setMessage(PUB.Result.ResultMessage); + + if (PUB.Result.ResultCode == eResult.Hardware) + { + PUB.Speak(Lang.하드웨어오류로인해진행할수없습니다); + } + else PUB.Speak(PUB.Result.ResultMessage); + + } + if (e.Step == eSMStep.EMERGENCY) PUB.log.AddE("Enter Emergency Step"); + else if (e.Step == eSMStep.PAUSE) PUB.log.AddE("Enter Pause Step : " + PUB.Result.ResultMessage); + else PUB.log.AddE(string.Format("Enter Error Step : {0}", PUB.Result.ResultMessage)); + + + + PUB.sm.bPause = false; + PUB.sm.ClearRunStep(); + PUB.sm.SetNewStep(eSMStep.IDLE); + } + break; + + case eSMStep.RESET: + + if (e.isFirst) + { + Resultclear(); + PUB.sm.bPause = false; + } + else + { + if (_SM_RUN_RESET(runStepisFirst, PUB.sm.GetRunSteptime)) + PUB.sm.SetNewStep(eSMStep.IDLE); + } + break; + } + } + + void DeleteFile(string path) + { + var basetime = DateTime.Now.AddDays(-1 * PUB.setting.AutoDeleteDay); + var di = new System.IO.DirectoryInfo(path); + if (di.Exists) + { + var dirYear = di.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirYear != null) + { + var dirMon = dirYear.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirMon != null) + { + var dirDay = dirMon.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirDay != null) + { + var curDay = DateTime.Parse(string.Format("{0}-{1}-{2} 00:00:00", dirYear.ToString(), dirMon.ToString(), dirDay.ToString())); + if (curDay < basetime) + { + var dirLot = dirDay.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirLot != null) + { + var delfile = dirLot.GetFiles().FirstOrDefault(); + if (delfile != null) + { + try + { + PUB.log.AddI("Remove Fle : " + delfile.FullName + ",time=" + delfile.LastWriteTime.ToString()); + delfile.Delete(); + } + catch (Exception ex) + { + PUB.log.AddE("deleete error : " + ex.Message); + } + } + else + { + string delpath = dirLot.FullName; + try + { + dirLot.Delete(true); + } + catch (Exception ex) + { + PUB.log.AddE("remove dir" + ex.Message + "," + delpath); + } + + } + } + else + { + //이 폴더아래에 다른 폴더가 하나도 없다 즉 비어 있따. + string delpath = dirDay.FullName; + try + { + dirDay.Delete(true); + } + catch (Exception ex) + { + PUB.log.AddE("remove dir" + ex.Message + "," + delpath); + } + } + } + + } + else + { + //날짜에 해당하는 폴더가 하나도 없다. 월 폴더를 제거한다. + string delpath = dirMon.FullName; + try + { + dirMon.Delete(true); + } + catch (Exception ex) + { + PUB.log.AddE("remove dir" + ex.Message + "," + delpath); + } + } + } + else + { + //이 달에 해당하는 데이터가 없다. 이 년도를 삭제한다. + string delpath = dirYear.FullName; + try + { + dirYear.Delete(true); + } + catch (Exception ex) + { + PUB.log.AddE("remove dir" + ex.Message + "," + delpath); + } + } + } + //년도별폴더목록을 정리함 + //가장작은 년도를 기준으로 파일을 검색해서 1개씩 삭제함 + } + } + + void sm_Message(object sender, StateMachine.StateMachineMessageEventArgs e) + { + //상태머신에서 발생한 메세지 + if (e.Header != "SM-STEP") + PUB.log.Add(e.Header, e.Message); + } + + + void sm_StepChanged(object sender, StateMachine.StepChangeEventArgs e) + { + //상태머신의 스텝이 변경될때 발생함 + //Pub.log.Add(string.Format("SM:Step Changed {0} to {1}",e.Old,e.New)); + VAR.BOOL[eVarBool.FLAG_AUTORUN] = e.New == eSMStep.RUN; + VAR.BOOL[eVarBool.FLAG_SYNC] = (e.New == eSMStep.SYNC); + + //230313 + var n = (eSMStep)e.New; + EEMStatus.AddStatusSQL(n, extrun: true); + + if (e.New == eSMStep.IDLE) + { + VAR.TIME[eVarTime.IdleStart] = DateTime.Now; + PUB.AGV.AGVMoveStop("_sm_stepchange", arDev.Narumi.eStopOpt.Stop); + + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] || VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + + if (VAR.BOOL[eVarBool.FLAG_AUTORUN]) + { + PUB.logagv.Add($"IDLE 전환으로인해 autorun 해제"); + VAR.BOOL[eVarBool.FLAG_AUTORUN] = false; + } + } + } + + //void uploadForm_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e) + //{ + // //이벤트 해제 + // if (uploadForm != null) + // uploadForm.FormClosed -= uploadForm_FormClosed; + + // //업로드 창이 닫히면 그 결과를 화면에 표시 해준다. + // //foreach (System.Windows.Forms.ListViewItem lv in uploadForm.listView1.Items) + // //{ + // // string slot = lv.SubItems[0].Text; + // // string wafer = lv.SubItems[2].Text; + // // string state = lv.SubItems[3].Text; + + // //} + //} + } +} diff --git a/Cs_HMI/Project/StateMachine/_SPS.cs b/Cs_HMI/Project/StateMachine/_SPS.cs new file mode 100644 index 0000000..6c77a58 --- /dev/null +++ b/Cs_HMI/Project/StateMachine/_SPS.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using arCtl; +using COMM; +using static Project.StateMachine; + +namespace Project +{ + + public partial class fMain + { + DateTime chargesynctime = DateTime.Now; + DateTime agvsendstarttime = DateTime.Now; + + void ConnectSerialPort(arDev.arRS232 dev, string port, int baud, eVarTime conn, eVarTime conntry, eVarTime recvtime) + { + if (dev.IsOpen == false && port.isEmpty() == false) + { + var tsPLC = VAR.TIME.RUN(conntry); + if (tsPLC.TotalSeconds > 5) + { + VAR.TIME.Set(conntry); + try + { + VAR.TIME.Set(recvtime); //this.LastReceiveTime = DateTime.Now; + dev.PortName = port; + dev.BaudRate = baud; + if (dev.Open()) + { + PUB.log.Add(port, "연결완료"); + } + else + { + var errmessage = dev.errorMessage; + PUB.log.Add("ERROR-" + port, errmessage); + } + VAR.TIME.Set(conn); + VAR.TIME.Set(conntry); + } + catch (Exception ex) + { + PUB.log.AddE(ex.Message); + } + } + } + else if (dev.PortName.Equals(port) == false) + { + PUB.log.Add(port, $"포트변경({dev.PortName}->{port})으로 연결 종료"); + dev.Close(); + VAR.TIME.Set(conntry); + } + } + void sm_SPS(object sender, EventArgs e) + { + if (PUB.sm.Step < eSMStep.IDLE || PUB.sm.Step >= eSMStep.CLOSING) return; + + //plc connect + ConnectSerialPort(PUB.PLC, PUB.setting.Port_PLC, PUB.setting.Baud_PLC, + eVarTime.LastConn_PLC, eVarTime.LastConnTry_PLC, eVarTime.LastRecv_PLC); + + //agv connect + ConnectSerialPort(PUB.AGV, PUB.setting.Port_AGV, PUB.setting.Baud_AGV, + eVarTime.LastConn_AGV, eVarTime.LastConnTry_AGV, eVarTime.LastRecv_AGV); + + //xbee connect + ConnectSerialPort(PUB.XBE, PUB.setting.Port_XBE, PUB.setting.Baud_XBE, + eVarTime.LastConn_XBE, eVarTime.LastConnTry_XBE, eVarTime.LastRecv_XBE); + + //bms connect + ConnectSerialPort(PUB.BMS, PUB.setting.Port_BAT, PUB.setting.Baud_BAT, + eVarTime.LastConn_BAT, eVarTime.LastConnTry_BAT, eVarTime.LastRecv_BAT); + + //지그비상태전송 + if (PUB.XBE != null && PUB.XBE.IsOpen) + { + //일정간격으로 상태를 전송한다 + if (PUB.XBE.lastSendTime.Year == 1982) PUB.XBE.lastSendTime = DateTime.Now.AddSeconds(1); + var ts = DateTime.Now - PUB.XBE.lastSendTime; + if (ts.TotalSeconds >= PUB.setting.interval_xbe) + { + var statusMsg = PUB.XBE.GetStatusString(); + PUB.XBE.SendStatus(statusMsg); + } + } + //배터리쿼리 + if (PUB.BMS != null && PUB.BMS.IsOpen) + { + if (PUB.BMS.lastSendTime.Year == 1982) PUB.BMS.lastSendTime = DateTime.Now.AddSeconds(1); + var ts = DateTime.Now - PUB.BMS.lastSendTime; + if (ts.TotalMilliseconds >= PUB.setting.interval_bms) + { + PUB.BMS.SendQuery(); + } + + + Update_BatteryWarnSpeak(); + + } + } + } +} diff --git a/Cs_HMI/Project/StateMachine/_TMDisplay.cs b/Cs_HMI/Project/StateMachine/_TMDisplay.cs new file mode 100644 index 0000000..b79a4dd --- /dev/null +++ b/Cs_HMI/Project/StateMachine/_TMDisplay.cs @@ -0,0 +1,798 @@ +using COMM; +using System; +using System.Drawing; +using static Project.StateMachine; + +namespace Project +{ + public partial class fMain + { + + + + void BlinkGridViewItem(arFrame.Control.GridView ctl, int row, int col, int value1, int value2) + { + var curValue = ctl.getValue(row, col); + ctl.setValue(row, col, (byte)(curValue == value1 ? value2 : value1)); // + } + + void BlinkLabel(arCtl.arLabel ctl, bool Statue + , Color onColor1, Color onColor2, Color ofColor1, Color ofColor2, + String onText = "", String OffText = "") + { + if (Statue == false) + { + ctl.BackColor2 = ofColor2; + ctl.BackColor = ofColor1; + if (OffText != "" && ctl.Text != OffText) ctl.Text = OffText; + } + else + { + if (onText != "" && ctl.Text != onText) ctl.Text = onText; + //깜박인다 + if (ctl.BackColor2 == Color.DimGray) + { + ctl.BackColor = onColor1; + ctl.BackColor2 = onColor2; + } + else + { + ctl.BackColor2 = Color.DimGray; + ctl.BackColor = Color.FromArgb(100, 100, 100); + } + } + + } + + Boolean displayOn = false; + private void tmDisplay_Tick(object sender, EventArgs e) + { + if (displayOn == false) displayOn = true; + else + { + PUB.log.AddAT("Display Timer Overlab");// Console.WriteLine("display overlab"); + return; + } + + if (PUB.sm.Step > eSMStep.INIT && + panTopMenu.Enabled == false) panTopMenu.Enabled = true; + + //배터리정보표시 + lbBat.VLevel = PUB.BMS.Current_Level; + lbBat.Volt = PUB.BMS.Current_Volt; + lbBat.MaxA = PUB.BMS.Current_MaxAmp; + lbBat.CurA = PUB.BMS.Current_Amp; + lbBat.IsOpen = PUB.BMS.IsOpen; + + + //쓰레드로인해서 메인에서 진행하게한다. SPS는 메인쓰레드에서 진행 됨 + //팝을 제거 혹은 표시하는 기능 + if (PUB.popup.needShow) PUB.popup.showMessage(); + else if (PUB.popup.needClose) PUB.popup.Visible = false; // .setVision(false)(); + + //자동 리부트 코드 실행 (230710) + var chargeon = VAR.BOOL[eVarBool.FLAG_CHARGEONA] || VAR.BOOL[eVarBool.FLAG_CHARGEONM]; + if (PUB.sm.Step == eSMStep.RUN & PUB.sm.RunStep == ERunStep.READY && chargeon == false && + PUB.setting.AutoRebootTimeStart.isEmpty() == false && startuptime.Year != 1982 && + PUB.Automodeonreboot == false && PUB.setting.SetAutoModeOn == false && PUB.AutRebootAlreay == false) + { + var strbuf = PUB.setting.AutoRebootTimeStart.Split('~'); + if (strbuf.Length == 2) + { + strbuf[0] = strbuf[0].Trim(); + strbuf[1] = strbuf[1].Trim(); + + var btimes = DateTime.TryParse(DateTime.Now.ToString("yyyy-MM-dd ") + strbuf[0], out DateTime TimeS); + var btimee = DateTime.TryParse(DateTime.Now.ToString("yyyy-MM-dd ") + strbuf[1], out DateTime TimeE); + + //이미 재부팅을 했는지 확인한다 + if (PUB.setting.AutoRebootTimeStart.isEmpty() == false) + { + if (DateTime.TryParse(PUB.setting.AutoRebootTimeStart, out DateTime RebootLast)) + { + //지정된 시간내에서 재부팅이 되었다 + if (RebootLast >= TimeS.AddMinutes(-1) && RebootLast <= TimeE.AddMinutes(1)) + { + //재부팅이 완료됨 + PUB.log.Add($"이미 재부팅을 진행 했습니다"); + PUB.AutRebootAlreay = true; + } + } + } + + if (PUB.AutRebootAlreay == false && btimes && btimee && TimeS <= TimeE && DateTime.Now >= TimeS && DateTime.Now <= TimeE) //둘다시간조건에 맞아야한다 + { + //기록을 남긴다.(확인용) + EEMStatus.AddStatusSQL(eSMStep.IDLE, $"자동재부팅실행({strbuf[0]}~{strbuf[1]})", DateTime.Now, true); + + //자동모드도 해제 해준다(다른 일이 발생하지 않도록) + VAR.BOOL[eVarBool.FLAG_AUTORUN] = false; + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + PUB.AGV.AGVMoveStop("autoreboot"); + PUB.sm.SetNewStep(eSMStep.IDLE); + + if (System.Diagnostics.Debugger.IsAttached == false) + { + PUB.Speak(Lang.자동재부팅을실행합니다); + Util.SystemReboot(5, true); + } + else PUB.setting.SetAutoModeOn = true; + + } + } + } + + //자동실행-230710 - 프로그램이 켜진 후 5분안에만 동작한다 + if (startuptime.Year != 1982 && PUB.setting.SetAutoModeOn && PUB.sm.Step == eSMStep.IDLE && PUB.Automodeonreboot == false) + { + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == true) //이미 자동상태라면 + { + //이미 켜져있으니 처리하지 않는다 + PUB.setting.SetAutoModeOn = false; + PUB.setting.Save(); + } + else + { + var tsStartup = DateTime.Now - startuptime; + if (tsStartup.TotalMinutes < 3) + { + if (tsStartup.TotalSeconds > 10) //5초이전에는동작하지 말자 + { + PUB.log.Add($"자동 오토런 실행"); + func_sw_start(false); + PUB.setting.SetAutoModeOn = false; + PUB.setting.Save(); + } + } + else + { + //5분을 넘어선 데이터는 쓸모없다 폐기 + PUB.setting.SetAutoModeOn = false; + PUB.setting.Save(); + } + } + + } + + + + lbTime.Text = PUB.sm.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss"); + + //자동충전중이다(프로그램에 의해 충전이 진행된 상태) + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true || VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true) + { + lbStStep.Text = VAR.BOOL[eVarBool.FLAG_CHARGEONA] ? "자동충전" : "수동충전"; + lbIDLE.ProgressForeColor = Color.Tomato; + if (lbIDLE.ProgressEnable == false) + lbIDLE.ProgressEnable = true; + + //lbIDLE.ForeColor = Color.Gold; + lbIDLE.ProgressForeColor = Color.Gold; + + if (PUB.sm.Step != eSMStep.RUN) + { + var tsIdle = VAR.TIME.RUN(eVarTime.ChargeStart); + lbIDLE.ProgressMax = 100;// PUB.setting.ChargeMaxLevel; + lbIDLE.ProgressMin = 0; + lbIDLE.Text = $"{PUB.BMS.Current_Level:N0}%"; + lbIDLE.ProgressValue = (float)PUB.BMS.Current_Level; + } + else + { + //if (PUB.setting.ChargeMaxTime < 1) + //{/ + var tsIdle = VAR.TIME.RUN(eVarTime.ChargeStart); + lbIDLE.ProgressMax = PUB.setting.ChargeMaxLevel; + lbIDLE.ProgressMin = 0; + lbIDLE.Text = $"({PUB.BMS.Current_Level:N0}/{PUB.setting.ChargeMaxLevel})%"; + lbIDLE.ProgressValue = (float)PUB.BMS.Current_Level; + //} + //else + //{ + // var tsIdle = VAR.TIME.RUN(eVarTime.ChargeStart); + // lbIDLE.ProgressMax = PUB.setting.ChargeMaxTime; + // lbIDLE.ProgressMin = 0; + // lbIDLE.Text = string.Format("{0:N0}/{1} 초 충전 중", tsIdle.TotalSeconds, PUB.setting.ChargeMaxTime); + // lbIDLE.ProgressValue = (float)tsIdle.TotalSeconds; + //} + + } + + + } + else + { + TimeSpan timerun; + if (PUB.sm.Step == eSMStep.RUN) + { + if (PUB.sm.RunStep == ERunStep.READY) + { + //대기시간 + lbStStep.Text = "대기중"; + timerun = VAR.TIME.RUN(eVarTime.ReadyStart); + } + else + { + //가동시간 + lbStStep.Text = "가동중"; + timerun = VAR.TIME.RUN(eVarTime.RunStart); + } + } + else + { + lbStStep.Text = "장비멈춤"; + timerun = VAR.TIME.RUN(eVarTime.IdleStart); + } + lbIDLE.Text = string.Format("{0}일 {1}시 {2}분 {3}초", timerun.Days, timerun.Hours, timerun.Minutes, timerun.Seconds); + if (lbIDLE.ProgressEnable == true) + lbIDLE.ProgressEnable = false; + } + + //hw접속상태 표시 + MenuAGV.BackColor = PUB.AGV.IsValid ? Color.FromArgb(40, 40, 40) : Color.Brown; + MenuBMS.BackColor = PUB.BMS.IsValid ? Color.FromArgb(40, 40, 40) : Color.Brown; + MenuMAN.BackColor = PUB.PLC.IsValid ? Color.FromArgb(40, 40, 40) : Color.Brown; + + + btChargeA.Enabled = !VAR.BOOL[eVarBool.FLAG_CHARGEONM]; + btHome.Enabled = btChargeA.Enabled; + btAutoRun.Enabled = btChargeA.Enabled; + + var bCharge = + (PUB.sm.RunStep == ERunStep.GOCHARGE || PUB.sm.RunStep == ERunStep.CHARGECHECK || VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true); + + var bHome = PUB.sm.Step == eSMStep.RUN && (PUB.sm.RunStep == ERunStep.GOHOME); + //var bChargeM = PUB.flag.get(EFlag.FLAG_CHARGEONM); + var bAuto = VAR.BOOL[eVarBool.FLAG_AUTORUN]; + //if(batu) + + var bChargeM = VAR.BOOL[eVarBool.FLAG_CHARGEONM]; + if (btHome.Enabled == false) + { + btHome.BackColor2 = Color.Gray; + btHome.BackColor = Color.DimGray; + } + else BlinkLabel(this.btHome, bHome, Color.Aqua, Color.Teal, Color.Aqua, Color.Teal, "홈\n취소", "홈\n이동"); + if (btChargeA.Enabled == false) + { + btChargeA.BackColor2 = Color.Gray; + btChargeA.BackColor = Color.DimGray; + } + else + { + //충전가능요건이라면 해당 시간을 표시해준다. + BlinkLabel(this.btChargeA, bCharge, Color.LightSalmon, Color.Tomato, Color.LightSalmon, Color.Tomato, "자동충전취소", "자동충전\n실행(" + PUB.counter.CountChargeA.ToString() + ")"); + } + BlinkLabel(this.btChargeM, bChargeM, Color.LightSalmon, Color.Tomato, Color.LightSalmon, Color.Tomato, "수동충전취소", "수동충전\n실행(" + PUB.counter.CountChargeM.ToString() + ")"); + //BlinkLabel(this.btChargeM, bChargeM, Color.LightSalmon, Color.Tomato, "수동충전취소", "수동충전\n실행(" + Pub.counter.CountChargeM.ToString() + ")"); + if (btAutoRun.Enabled == false) + { + btAutoRun.BackColor2 = Color.Gray; + btAutoRun.BackColor = Color.DimGray; + } + else BlinkLabel(this.btAutoRun, bAuto == false, Color.DarkMagenta, Color.BlueViolet, Color.Lime, Color.Green, "수동\n조작중", "자동\n실행중"); + + //상태 표시 + Update_SSStatus(); + + //IO상태(상단줄) 표시 + Update_IOStatus(); + + //display mesasge + Update_StatusMessage(); + + //음악 on/off 처리 + Update_Music(); + + //HWState.Invalidate(); + SSInfo.Invalidate(); + IOState.Invalidate(); + + #region retgion"1분 time 루틴" + var ts = DateTime.Now - tm1minute; + if (ts.TotalMinutes >= 1) + { + //리셋카운트 + _AutoResetCount(); + + //상태를 DB에 저장한다. 230314 + var tsrun = COMM.VAR.TIME.RUN(eVarTime.StatusReporttime); + if (tsrun.TotalSeconds >= PUB.setting.StatusInterval) EEMStatus.UpdateStatusSQL(PUB.sm.Step, _extrun: true); + + tm1minute = DateTime.Now; + } + #endregion + + #region retgion"5분 time 루틴" + ts = DateTime.Now - tm5minute; + if (ts.TotalMinutes >= 5) + { + //남은디스크확인 + CheckFreeSpace(); + tm5minute = DateTime.Now; + } + #endregion + + //wat.Stop(); + //Console.WriteLine("disp time : " + wat.ElapsedMilliseconds.ToString() + "ms"); + displayOn = false; + } + + void Update_Count() + { + if (this.InvokeRequired) + { + this.BeginInvoke(new System.Windows.Forms.MethodInvoker(Update_Count), null); + } + else + { + lbCntDN.Text = PUB.counter.CountDn.ToString(); + lbCNtUP.Text = PUB.counter.CountUp.ToString(); + lbCntQA.Text = PUB.counter.CountQA.ToString(); + lbCntQC.Text = PUB.counter.CountQC.ToString(); + // lbCntPk.Text = PUB.counter.CountQa2.ToString(); + } + + } + void Update_IOStatus() + { + int inputrow = 0; + int inputcol = 0; + + ////비상정지는 깜박임으로 알려준다 + if (VAR.BOOL[eVarBool.EMERGENCY]) BlinkGridViewItem(IOState, inputrow, inputcol++, 2, 0); + else IOState.setValue(inputrow, inputcol++, 0); + + IOState.setTitle(inputrow, inputcol, "DIR:" + PUB.AGV.data.Direction.ToString()); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, "MOV:" + PUB.AGV.data.Sts.ToString()); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, "SPD:" + PUB.AGV.data.Speed.ToString()); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, $"PBS:{PUB.AGV.data.guidesensor}"); IOState.setValue(inputrow, inputcol++, 0); + + if (PUB.AGV.data.TagNo < 0) + { + IOState.setTitle(inputrow, inputcol, "(TAG)"); IOState.setValue(inputrow, inputcol++, 0); + } + else + { + IOState.setTitle(inputrow, inputcol, "T" + PUB.AGV.data.TagNo.ToString()); IOState.setValue(inputrow, inputcol++, 0); + } + if (PUB.AGV.data.CallNo < 0) + { + IOState.setTitle(inputrow, inputcol, "(CAL)"); + IOState.setValue(inputrow, inputcol++, 0); + } + else + { + IOState.setTitle(inputrow, inputcol, "CAL:" + PUB.AGV.data.CallNo.ToString()); + IOState.setValue(inputrow, inputcol++, 0); + } + + IOState.setTitle(inputrow, inputcol, "RUN"); IOState.setValue(inputrow, inputcol++, (PUB.AGV.system1.agv_run ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "MARK"); IOState.setValue(inputrow, inputcol++, (PUB.AGV.signal.mark_sensor ? 1 : (VAR.BOOL[eVarBool.NEXTSTOP_MARK] ? 2 : 0))); + IOState.setTitle(inputrow, inputcol, "CHG"); IOState.setValue(inputrow, inputcol++, (PUB.AGV.system1.Battery_charging ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "ITM"); IOState.setValue(inputrow, inputcol++, (VAR.BOOL[eVarBool.ITEMON] ? 1 : 0)); + IOState.Invalidate(); + } + + /// + /// 가동중 40% 미만에서는 배터리 경고 메세지를 추가한다(리더) + /// + void Update_BatteryWarnSpeak() + { + if (PUB.BMS == null || PUB.BMS.Current_Level > 40) return; + + //가동중이거나 수동모드에서는 메세지 알림한다 + if (PUB.AGV.system1.agv_run || VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) + { + var timeoutsec = 15; + if (PUB.BMS.IsValid == false) timeoutsec = 30; + + var tswarnmsg = VAR.TIME.RUN(eVarTime.BatWarnTime); + if (tswarnmsg.TotalSeconds >= timeoutsec) + { + if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]==false && VAR.BOOL[eVarBool.FLAG_CHARGEONA] == false) + { + if (PUB.BMS.IsValid == false) + { + PUB.Speak(Lang.배터리통신에문제가있습니다); + } + else + { + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) + PUB.Speak(Lang.충전이필요합니다자동모드로전환하세요); + else + PUB.Speak(Lang.충전이필요합니다); + } + } + else + { + //충전중이므로 메세지처리를 하지 않는다 + } + + + VAR.TIME.Set(eVarTime.BatWarnTime); + } + } + } + + /// + /// 가동중일때 음악이 나오게 한다 + /// + void Update_Music() + { + + if (PUB.mplayer != null && PUB.mplayer.HasAudio && PUB.bPlayMusic) + { + if (PUB.AGV.system1.agv_run == false) + { + if (PUB.bPlayMusic) + { + PUB.mplayer.Stop(); + PUB.bPlayMusic = false; + } + + } + } + else if (PUB.setting.Enable_Music && PUB.mplayer != null && PUB.mplayer.HasAudio) + { + if (PUB.AGV.system1.agv_run == true) + { + if (PUB.bPlayMusic == false) + { + PUB.mplayer.Play(); + PUB.bPlayMusic = true; + } + } + } + } + + void Update_SSStatus() + { + if (PUB.sm.IsThreadRun) SSInfo.setValue(0, 0, 0); + else SSInfo.setValue(0, 0, 2); + + var runspeed = PUB.sm.RunSpeed.TotalMilliseconds; + SSInfo.setTitle(0, 0, $"{PUB.sm.Step}\n{runspeed:N1} ms"); + + if (runspeed > 9) + SSInfo.setValue(0, 0, 2); + else if (runspeed > 4) + SSInfo.setValue(0, 0, 3); + else + SSInfo.setValue(0, 0, 0); + + + SSInfo.setTitle(1, 0, string.Format("{0}({1})", PUB.sm.RunStep, PUB.sm.RunStepSeq)); + if (PUB.sm.Step == eSMStep.RUN) + SSInfo.setTitle(1, 1, string.Format("{0:N1} sec", PUB.sm.GetRunSteptime.TotalSeconds)); + else + SSInfo.setTitle(1, 1, "--"); + + } + + /// + /// 환경설정에따른 카운트를 리셋처리한다. 171128 + /// + void _AutoResetCount() + { + if (PUB.setting.datetime_Check_1 && PUB.setting.datetime_Reset_1 != "") //오전 + { + try + { + DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + PUB.setting.datetime_Reset_1 + ":00"); + DateTime LastClearTime = PUB.counter.CountReset; + + //현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함 + if (DateTime.Now > SetTime && LastClearTime < SetTime) + { + PUB.log.AddI("Count Reset #1"); + PUB.counter.CountClear(); + } + } + catch { } + } + + if (PUB.setting.datetime_Check_2 && PUB.setting.datetime_Reset_2 != "") //오후 + { + try + { + DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + PUB.setting.datetime_Reset_2 + ":00"); + DateTime LastClearTime = PUB.counter.CountReset; + + //현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함 + if (DateTime.Now > SetTime && LastClearTime < SetTime) + { + PUB.log.AddI("Count Reset #2"); + PUB.counter.CountClear(); + } + } + catch { } + } + } + + DateTime tm1minute = DateTime.Now.AddDays(-1); + DateTime tm5minute = DateTime.Now; + + void UpdateProgressStatus(double value, double max, string title) + { + UpdateProgressStatus((float)value, (float)max, title); + } + + void UpdateProgressStatus(float value, float max, string title = "") + { + if (PUB.Result.SMSG_ProgressEnable == false) PUB.Result.SMSG_ProgressEnable = true; + if (PUB.Result.SMSG_ProgressMax != max) PUB.Result.SMSG_ProgressMax = max; + if (PUB.Result.SMSG_ProgressValue != value) + { + if (value < max) PUB.Result.SMSG_ProgressValue = value; + else PUB.Result.SMSG_ProgressValue = max; + } + if (PUB.Result.SMSG_ProgressForeColor != Color.White) + PUB.Result.SMSG_ProgressForeColor = Color.White; + + if (title != "") + if (VAR.STR[eVarString.StatusMessage].Equals(title) == false) VAR.STR[eVarString.StatusMessage] = title; + } + + void UpdateStatusMessage(string dispmsg, Color fcolor, Color shadow) + { + UpdateStatusMessage(dispmsg, Color.DimGray, Color.Gray, fcolor, shadow); + } + + void UpdateStatusMessage(string dispmsg, Color bColor, Color bColor2, Color fcolor, Color shadow, Boolean blank = false) + { + + //if (lbMsg.ProgressEnable == true) lbMsg.ProgressEnable = false; + if (dispmsg != VAR.STR[eVarString.StatusMessage] || PUB.Result.SMSG_ForeColor != fcolor || + PUB.Result.SMSG_ShadowColor != shadow + || (PUB.Result.SMSG_BackColor != bColor && PUB.Result.SMSG_BackColor2 != bColor)) + { + PUB.Result.SMSG_BackColor = bColor; + PUB.Result.SMSG_BackColor2 = bColor2; + PUB.Result.SMSG_ForeColor = fcolor; + PUB.Result.SMSG_ShadowColor = shadow; + VAR.STR[eVarString.StatusMessage] = dispmsg; + if (blank) PUB.Result.SMSG_Tag = "BLANK"; + else PUB.Result.SMSG_Tag = null; + //PUB.Result.UpdateStatusMessage(); + } + } + + + void Update_StatusMessage() + { + //최우선 점검 사항 표시 + if (PUB.sm.Step > eSMStep.INIT) + { + //오류가 있다면 오류를 표시해준다. + if (PUB.AGV.IsOpen == false) + { + UpdateStatusMessage("AGV 연결실패", Color.Tomato, Color.Black); + } + else if (PUB.AGV.error.Emergency) + { + if (PUB.AGV.error.runerror_by_no_magent_line) + { + UpdateStatusMessage("마그넷이 감지 되지 않습니다", Color.Tomato, Color.Black); + } + else + { + UpdateStatusMessage("비상 정지", Color.Tomato, Color.Black); + } + } + else if (PUB.PLC.IsOpen == false) + { + UpdateStatusMessage(Lang.PLC연결실패, Color.Tomato, Color.Black); + } + else if (PUB.PLC.IsValid == false) + { + UpdateStatusMessage(Lang.PLC통신실패, Color.Tomato, Color.Black); + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true) + { + //남은 충전시간 계산 + string msg = string.Empty; + if (PUB.BMS.Current_Level < PUB.setting.ChargeEmergencyLevel) + { + msg = $"충전 진행 중(이동 불가)\n저전압으로 인해 사용이 불가 합니다"; + } + else + { + var remaintime = VAR.TIME.RUN(eVarTime.ChargeStart); + var remainsec = PUB.setting.ChargeMaxTime - remaintime.TotalSeconds; + msg = "충전 진행 중 (이동 불가) " + remainsec.ToString("N0") + "초 후 충전이 자동 OFF 됩니다"; + } + UpdateStatusMessage(msg, Color.Orange, Color.Black); + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true)// PUB.flag.get(EFlag.FLAG_CHARGEONM) == true) + { + UpdateStatusMessage("충전(수동) 진행 중 (이동 불가)", Color.Orange, Color.Black); + } + else if (PUB.AGV.IsOpen == false) + { + UpdateStatusMessage(Lang.AGV연결실패, Color.Tomato, Color.Black); + } + else + { + if (PUB.sm.Step == eSMStep.IDLE) + { + if (PUB.AGV.system1.agv_run) + { + if (PUB.AGV.system1.stop_by_front_detect) + UpdateStatusMessage("장애물로 인한 일시 정지", Color.SkyBlue, Color.Black); + else + UpdateStatusMessage("AGV 이동 중", Color.SkyBlue, Color.Black); + } + else if (PUB.AGV.error.Emergency) + { + if (PUB.AGV.error.runerror_by_no_magent_line) + { + UpdateStatusMessage("비상 정지 : 마그넷 라인이 감지 안됨", Color.SkyBlue, Color.Black); + } + else + { + UpdateStatusMessage("비상 정지", Color.SkyBlue, Color.Black); + } + } + else + { + var smg = "(작업을 시작 하려면 [AUTO]로 전환 하세요)"; + UpdateStatusMessage(smg, Color.SkyBlue, Color.Black); + } + } + else if (PUB.sm.Step == eSMStep.RUN) + { + + string stMsg; + if (PUB.AGV.system1.stop_by_front_detect)//.GetValueI(arDev.FakePLC.DIName.PINI_LIDAR_STOP)) + stMsg = Lang.전방에물체가감지되었습니다; + else if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_EMG)) + stMsg = Lang.비상정지신호가감지되었습니다; + else if (PUB.AGV.signal.front_gate_out == true) + stMsg = Lang.선로를이탈했습니다; + else if (PUB.AGV.error.runerror_by_no_magent_line) + stMsg = "마그네틱 라인을 벗어났습니다"; + else + { + stMsg = "자동 대기"; + if (PUB.setting.Enable_AutoCharge) + { + var tsIdle = VAR.TIME.RUN(eVarTime.ReadyStart); + var remainTry = (int)(PUB.setting.ChargeRetryTerm - tsIdle.TotalSeconds); + var progMax = PUB.setting.ChargeRetryTerm; + stMsg += " / (" + remainTry.ToString() + ") 초 후 충전을 시작 합니다"; + UpdateProgressStatus(tsIdle.TotalSeconds, progMax, ""); + } + else + { + stMsg += "(자동충전 해제됨)"; + } + } + + UpdateStatusMessage(stMsg, Color.SkyBlue, Color.Black); + //자동 충전 대기상태를 프로그레시브로 표시한다 + + + if (PUB.AGV.system1.stop_by_front_detect == true) + { + UpdateStatusMessage("이동 방향 근접거리 물체 감지(이동 불가 - 일시정지)", Color.Tomato, Color.Black); + } + else if (VAR.BOOL[eVarBool.OVERLOAD] == true) + { + UpdateStatusMessage("오버로드 감지(안전커버를 확인하세요)", Color.Tomato, Color.Black); + } + else if (PUB.AGV.error.runerror_by_no_magent_line) + { + UpdateStatusMessage("마그네틱 라인을 벗어 났습니다", Color.Black, Color.White); + } + else + { + if (VAR.BOOL[eVarBool.WAIT_COVER_DOWN] == true) + { + UpdateStatusMessage(Lang.안전커버를내려주세요, Color.Lime, Color.Black); + } + else if (VAR.BOOL[eVarBool.WAIT_COVER_UP] == true) + { + UpdateStatusMessage(Lang.안전커버를올려주세요, Color.Lime, Color.Black); + } + else + { + if (PUB.sm.RunStep == ERunStep.GODOWN) + { + if (PUB.sm.RunStepSeq == 1) + { + UpdateStatusMessage(String.Format("하차 이동 전 (현재 위치 검색)", PUB.Result.TargetPos), Color.Lime, Color.Black); + } + else UpdateStatusMessage(String.Format("하차 이동 중 ({0})", PUB.Result.TargetPos), Color.Lime, Color.Black); + } + else if (PUB.sm.RunStep == ERunStep.GOUP) + { + if (PUB.sm.RunStepSeq == 1) + { + UpdateStatusMessage(String.Format("상차 이동 전 (현재 위치 검색)", PUB.Result.TargetPos), Color.Lime, Color.Black); + } + else UpdateStatusMessage(String.Format("상차 이동 중 ({0})", PUB.Result.TargetPos), Color.Lime, Color.Black); + } + else if (PUB.sm.RunStep == ERunStep.GOCHARGE) + { + if (PUB.Result.result_message.isEmpty() == true) + { + UpdateStatusMessage(String.Format("충전기로 이동 중"), Color.Lime, Color.Black); + } + else + { + if (PUB.Result.result_progressmax > 0) + UpdateProgressStatus(PUB.Result.result_progressvalue, PUB.Result.result_progressmax, PUB.Result.result_message); + else + UpdateStatusMessage(PUB.Result.result_message, Color.Lime, Color.Black); + } + } + else if (PUB.sm.RunStep == ERunStep.CHARGECHECK) + { + if (PUB.Result.result_message.isEmpty() == true) + { + UpdateStatusMessage(String.Format("충전기 작동 확인 중"), Color.Lime, Color.Black); + } + else + { + if (PUB.Result.result_progressmax > 0) + UpdateProgressStatus(PUB.Result.result_progressvalue, PUB.Result.result_progressmax, PUB.Result.result_message); + else + UpdateStatusMessage(PUB.Result.result_message, Color.Lime, Color.Black); + } + } + else if (PUB.sm.RunStep == ERunStep.GOHOME) + { + UpdateStatusMessage(String.Format("홈(QC) 이동 중", PUB.Result.TargetPos), Color.Lime, Color.Black); + } + else + { + //충전준비상태라면 관련 정보를 표시한다 230117 + if (VAR.BOOL[eVarBool.CHARGE_READY]) + { + var sec = VAR.I32[eVarInt32.ChargeWaitSec]; + UpdateStatusMessage($"{sec} 초 후 충전이 시작 됩니다", Color.Lime, Color.Black); + } + else + { + var msg = $"대기상태(현재위치:{PUB.Result.CurrentPos}/대상위치:{PUB.Result.TargetPos})"; + if (PUB.setting.Enable_AutoCharge) msg += "(자동충전:ON)"; + else msg += "(자동충전:OFF)"; + UpdateStatusMessage(msg, Color.Lime, Color.Black); + } + + //UpdateStatusMessage(String.Format("--", Pub.Result.TargetPos), Color.White, Color.Black); + } + } + } + + + } + else if (PUB.sm.Step == eSMStep.ERROR) + { + UpdateStatusMessage("오류 발생", Color.Red, Color.Black); + } + else if (PUB.sm.Step == eSMStep.PAUSE) + { + UpdateStatusMessage("정지 됨", Color.Tomato, Color.Black); + } + else if (PUB.sm.Step == eSMStep.FINISH) + { + UpdateStatusMessage("작업 완료", Color.Lime, Color.Black); + } + else if (PUB.sm.bPause == true) + { + UpdateStatusMessage("[START]를 누르면 시작 됩니다", Color.Yellow, Color.Black); + } + else + { + string msg = "진행 중"; + UpdateStatusMessage(msg, Color.Lime, Color.Black); + } + } + + + } + } + } +} diff --git a/Cs_HMI/Project/Util.cs b/Cs_HMI/Project/Util.cs new file mode 100644 index 0000000..142bd73 --- /dev/null +++ b/Cs_HMI/Project/Util.cs @@ -0,0 +1,510 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Management; +using System.Net; +using System.Text; +using System.Windows; +using System.Windows.Forms; + +namespace Project +{ + public static class Util + { + #region "MessageBox" + public static void MsgI(string m, Boolean legacy = false) + { + if (legacy) + { + MessageBox.Show(m, "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + var f = new fMessageWindow("알림\n" + m); + f.SetWindowColor(fMessageWindow.EWinColor.Information); + f.btNo.Visible = false; + f.btYes.Text = "확인"; + f.EnableUserClose = true; + f.DialogMode = true; + f.ShowDialog(); + } + } + public static void MsgE(string m, Boolean legacy = false) + { + if (legacy) + { + MessageBox.Show(m, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + var f = new fMessageWindow("오류 알림\n" + m); + f.SetWindowColor(fMessageWindow.EWinColor.Error); + f.btNo.Visible = false; + f.btYes.Text = "확인"; + f.EnableUserClose = true; + f.DialogMode = true; + f.ShowDialog(); + } + } + public static DialogResult MsgQ(string m, Boolean legacy = false, string btOK = "확인", string btCancel = "아니오") + { + if (legacy) + { + DialogResult dlg = MessageBox.Show(m, "확인", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + return dlg; + } + else + { + var f = new fMessageWindow("선택 알림\n" + m); + f.SetWindowColor(fMessageWindow.EWinColor.Attention); + f.EnableUserClose = true; + f.DialogMode = true; + f.btNo.Text = btCancel; + f.btYes.Text = btOK; + var dlg = f.ShowDialog(); + return dlg; + } + } + + #endregion + + public static string SelectSerialPort() + { + var f = new System.Windows.Forms.Form(); + f.WindowState = System.Windows.Forms.FormWindowState.Normal; + f.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + f.Size = new System.Drawing.Size(800, 400); + f.MaximizeBox = false; + f.MinimizeBox = false; + f.Text = "Select Port"; + f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + var lst = new System.Windows.Forms.ListBox(); + lst.Font = new System.Drawing.Font("Consolas", 15, System.Drawing.FontStyle.Bold); + lst.Dock = System.Windows.Forms.DockStyle.Fill; + lst.DoubleClick += (s1, e1) => + { + if (lst.SelectedItem != null) f.DialogResult = System.Windows.Forms.DialogResult.OK; + }; + using (var searcher = new ManagementObjectSearcher("SELECT * FROM WIN32_SerialPort")) + { + var portnames = System.IO.Ports.SerialPort.GetPortNames().OrderBy(t => t); + var ports = searcher.Get().Cast().ToList(); + foreach (var port in portnames) + { + var desc = ""; + var portInfo = ports.Where(t => t["DeviceId"].ToString() == port).FirstOrDefault(); + if (portInfo != null) desc = portInfo["Caption"].ToString(); + lst.Items.Add(string.Format("{0} - {1}", port, desc)); + } + } + f.Controls.Add(lst); + if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + var name = lst.SelectedItem.ToString().Split('-'); + return name[0].Trim(); + } + else return string.Empty; + } + + public static void ScreenCaptrue(int _BitmapWidth, int _BitmapHeight, System.Drawing.Point ptSouce) + { + try + { + Bitmap bitmap = new Bitmap(_BitmapWidth, _BitmapHeight); + Graphics _graphic = Graphics.FromImage(bitmap); + + _graphic.CopyFromScreen(ptSouce, new System.Drawing.Point(0, 0), new System.Drawing.Size(_BitmapWidth, _BitmapHeight)); + + string savefile = System.IO.Path.Combine(Util.CurrentPath, "ScreenShot", DateTime.Now.ToString("yyyyMMddHHmmss") + ".png"); + System.IO.FileInfo grpath = new FileInfo(savefile); + if (!grpath.Directory.Exists) grpath.Directory.Create(); + + bitmap.Save(grpath.FullName, System.Drawing.Imaging.ImageFormat.Png); + Util.MsgI("화면 캡쳐 성공\n" + + "위치:" + grpath.Directory.FullName + "\n" + + "파일명: " + grpath.Name); + } + catch (Exception ex) + { + Util.MsgE("화면 캡쳐 실패\n" + ex.Message); + } + } + + public static void SystemReboot(UInt16 timeout, bool setautomode = false) + { + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(); + si.FileName = @"c:\windows\system32\shutdown.exe"; + si.Arguments = "-r -t " + timeout.ToString(); + si.UseShellExecute = false; + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + prc.StartInfo = si; + + PUB.AGV.AGVMoveStop("user reboot"); + + if (setautomode) + { + PUB.Automodeonreboot = true; + PUB.setting.SetAutoModeOn = true; + PUB.setting.AUtoRebootLastTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + PUB.setting.Save(); + } + + + prc.Start(); + + } + public static void SystemShutdown(UInt16 timeout) + { + //System.Text.StringBuilder sb = new StringBuilder(); + //sb.AppendLine("@echo off"); + //sb.AppendLine("echo System OFF After " + timeout.ToString() + "Seconds"); + //sb.AppendLine("shutdown -s -t " + timeout.ToString()); + //string bfile = AppDomain.CurrentDomain.BaseDirectory + "Shutdown.bat"; + //System.IO.File.WriteAllText(bfile, string.Format(sb.ToString(), AppDomain.CurrentDomain.BaseDirectory), System.Text.Encoding.Default); + + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(); + si.FileName = @"c:\windows\system32\shutdown.exe"; + si.Arguments = "-s -t " + timeout.ToString(); + si.UseShellExecute = false; + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + prc.StartInfo = si; + prc.Start(); + } + public static void SaveBugReport(string content, string subdirName = "BugReport") + { + try + { + var path = CurrentPath + subdirName; + if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); + var file = path + "\\" + DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + ".txt"; + System.IO.File.WriteAllText(file, content, System.Text.Encoding.UTF8); + } + catch + { + //nothing + } + } + + public static void CopyData(System.Data.DataRow drSrc, System.Data.DataRow drDes) + { + if (drDes == null || drSrc == null) return; + foreach (System.Data.DataColumn col in drSrc.Table.Columns) + { + if (col.ColumnName.ToUpper() == "IDX") continue; + drDes[col.ColumnName] = drSrc[col.ColumnName]; + } + + } + + /// + /// 현재실행중인폴더를 반환합니다. + /// + public static string CurrentPath + { + get + { + return AppDomain.CurrentDomain.BaseDirectory; + } + } + /// + /// 콤마와 줄바꿈등을 제거합니다. + /// + /// + public static string ToCSVString(string src) + { + string retval = src.Replace("\r", "").Replace("\n", "").Replace(",", ""); + return retval; + } + + public static Boolean RunProcess(string file, string arg = "") + { + var fi = new System.IO.FileInfo(file); + if (!fi.Exists) + { + PUB.log.AddE("Run Error : " + file); + return false; + } + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(file); + si.Arguments = arg; + prc.StartInfo = si; + prc.Start(); + return true; + } + + #region "convert" + public static string RectToStr(Rectangle rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string RectToStr(RectangleF rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string PointToStr(System.Drawing.Point pt) + { + return string.Format("{0};{1}", pt.X, pt.Y); + } + public static string PointToStr(PointF pt) + { + return string.Format("{0};{1}", pt.X, pt.Y); + } + public static Rectangle StrToRect(string str) + { + if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.Rectangle( + int.Parse(roibuf1[0]), + int.Parse(roibuf1[1]), + int.Parse(roibuf1[2]), + int.Parse(roibuf1[3])); + } + public static RectangleF StrToRectF(string str) + { + if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.RectangleF( + float.Parse(roibuf1[0]), + float.Parse(roibuf1[1]), + float.Parse(roibuf1[2]), + float.Parse(roibuf1[3])); + } + public static System.Drawing.Point StrToPoint(string str) + { + if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.Point( + int.Parse(roibuf1[0]), + int.Parse(roibuf1[1])); + } + public static PointF StrToPointF(string str) + { + if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.PointF( + float.Parse(roibuf1[0]), + float.Parse(roibuf1[1])); + } + #endregion + + #region "NIC" + + /// + /// 지정된 nic카드가 현재 목록에 존재하는지 확인한다. + /// + /// + public static Boolean ExistNIC(string NICName) + { + if (string.IsNullOrEmpty(NICName)) return false; + foreach (string NetName in NICCardList()) + { + if (NetName.ToLower() == NICName.ToLower()) + { + return true; + } + } + return false; + } + + /// + /// Ehternet Card 를 사용안함으로 설정합니다.(관리자권한필요) + /// + /// + public static Boolean NICDisable(string NICName) + { + //해당 nic 가 현재 목록에 존재하는지 확인한다. + + string cmd = "interface set interface " + NICName + " disable"; + Process prc = new Process(); + ProcessStartInfo si = new ProcessStartInfo("netsh", cmd); + si.WindowStyle = ProcessWindowStyle.Hidden; + prc.StartInfo = si; + prc.Start(); + + ////목록에서 사라질때까지 기다린다. + DateTime SD = DateTime.Now; + Boolean timeout = false; + while ((true)) + { + + bool FindNetwork = false; + foreach (string NetName in NICCardList()) + { + if (NetName == NICName.ToLower()) + { + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + + if (!FindNetwork) + break; // TODO: might not be correct. Was : Exit While + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + timeout = true; + break; // TODO: might not be correct. Was : Exit While + } + } + return !timeout; + } + + public static List NICCardList() + { + List Retval = new List(); + foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + if (Net.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) + { + Retval.Add(Net.Name.ToUpper()); + } + } + return Retval; + } + + /// + /// 이더넷카드를 사용함으로 설정합니다. + /// + /// + public static Boolean NICEnable(string NICName) + { + string cmd = "interface set interface " + NICName + " enable"; + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("netsh", cmd); + si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; + prc.StartInfo = si; + prc.Start(); + + + ////목록에생길떄까지 대기 + DateTime SD = DateTime.Now; + while ((true)) + { + + bool FindNetwork = false; + foreach (string NetName in NICCardList()) + { + if (NetName.ToLower() == NICName.ToLower()) + { + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + + if (FindNetwork) + break; // TODO: might not be correct. Was : Exit While + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + return false; + } + } + + ////결이 완료될떄까지 기다린다. + SD = DateTime.Now; + while ((true)) + { + + bool FindNetwork = false; + foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + if (Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.GigabitEthernet && + Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) continue; + if (Net.Name.ToLower() == NICName.ToLower()) + { + //string data = Net.GetIPProperties().GatewayAddresses[0].ToString(); + + if (Net.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) + { + + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + } + if (FindNetwork) + return true; + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + return false; + } + } + + } + + #endregion + + public static void RunExplorer(string arg) + { + System.Diagnostics.ProcessStartInfo si = new ProcessStartInfo("explorer"); + si.Arguments = arg; + System.Diagnostics.Process.Start(si); + } + + #region "watchdog" + public static void WatchDog_Run() + { + System.IO.FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "WatchCat.exe"); + if (!fi.Exists) return; + var Exist = CheckExistProcess("watchcat"); + if (Exist) return; + RunProcess(fi.FullName); + } + + public static Boolean CheckExistProcess(string ProcessName) + { + foreach (var prc in System.Diagnostics.Process.GetProcesses()) + { + if (prc.ProcessName.StartsWith("svchost")) continue; + if (prc.ProcessName.ToUpper() == ProcessName.ToUpper()) return true; + } + return false; + } + #endregion + + #region "web function" + /// + /// URL로부터 문자열을 수신합니다. + /// + /// + /// + /// + public static string GetStrfromurl(string url, out Boolean isError) + { + isError = false; + string result = ""; + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); + request.Timeout = 60000; + request.ReadWriteTimeout = 60000; + + request.MaximumAutomaticRedirections = 4; + request.MaximumResponseHeadersLength = 4; + request.Credentials = CredentialCache.DefaultCredentials; + var response = request.GetResponse() as HttpWebResponse; + var txtReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); + result = txtReader.ReadToEnd(); + } + catch (Exception ex) + { + isError = true; + result = ex.Message.ToString(); + } + return result; + } + + #endregion + + } +} diff --git a/Cs_HMI/Project/Util_FG.cs b/Cs_HMI/Project/Util_FG.cs new file mode 100644 index 0000000..aee2af5 --- /dev/null +++ b/Cs_HMI/Project/Util_FG.cs @@ -0,0 +1,273 @@ +///* +// * Created by SharpDevelop. +// * User: amkor +// * Date: 5/16/2018 +// * Time: 3:08 PM +// * +// * To change this template use Tools | Options | Coding | Edit Standard Headers. +// */ +//using System; + +//namespace Project +//{ +// public static class Util_DO +// { +// /// +// /// ADLink I/O Board input status +// /// +// /// +// /// +// public static Boolean GetIOInput(eDIName pin) +// { +// var curValue = Pub.dio.INPUT(GetDINum(pin) - 1); +// if (pin == eDIName.EMERGENCY || +// pin == eDIName.PCB_PUSHER_END || +// pin == eDIName.PCB_PUSHER_HOME || +// pin == eDIName.PCB_IN_MGZ || +// pin == eDIName.PCB_OVERLOAD || +// pin == eDIName.PCB_PUSHER_OVR) +// { +// return !curValue; +// } +// else return curValue; +// } + +// /// +// /// ADLink I/O Board Output Status +// /// +// /// +// /// +// public static Boolean GetIOOutput(eDOName pin) +// { +// return Pub.dio.OUTPUT(GetDONum(pin) - 1); +// } + +// /// +// /// A/D Link Digital input Pin number +// /// +// /// +// /// +// public static int GetDINum(eDIName pin) +// { +// return (int)pin + 1; +// //return Pub.setting.DI[(byte)pin]; +// } + +// /// +// /// adlink digital output in number +// /// +// /// +// /// +// public static int GetDONum(eDOName pin) +// { +// return (int)pin + 1; +// //return Pub.setting.DO[(byte)pin]; + +// } + +// /// +// /// 도어각 닫혀있는 경우 TRUE, +// /// +// /// +// public static Boolean CheckDoorSafty() +// { +// var door1 = CheckDoorSafty_Front(); +// var door2 = CheckDoorSafty_Rear(); +// var door3 = CheckDoorSafty_Left(); +// var door4 = CheckDoorSafty_Right(); +// if (door1 && door2 && door3 && door4) return true; +// else return false; +// } +// public static Boolean CheckDoorSafty_Front() +// { +// var door = GetIOInput(eDIName.DOOR_FRONT) || Pub.setting.DisableDoorFront; +// return door; +// } +// public static Boolean CheckDoorSafty_Rear() +// { +// var door = GetIOInput(eDIName.DOOR_REAR) || Pub.setting.DisableDoorRear; +// return door; +// } +// public static Boolean CheckDoorSafty_Left() +// { +// var door = GetIOInput(eDIName.DOOR_LEFT) || Pub.setting.DisableDoorLeft; +// return door; +// } +// public static Boolean CheckDoorSafty_Right() +// { +// var door = GetIOInput(eDIName.DOOR_RIGHT) || Pub.setting.DisableDoorRight; +// return door; +// } + +// public static Boolean checkMGZReady() +// { +// var ready1 = GetIOInput(eDIName.MGZ_CLAMP_RDY1); +// var ready2 = GetIOInput(eDIName.MGZ_CLAMP_RDY2); +// return ready1 && ready2; +// } + +// public static Boolean SetAIR(Boolean ON) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// return Pub.dio.SetOutput(GetDONum(eDOName.MAIN_AIR) - 1, ON); + +// } +// //public static Boolean SetEMGLamp(Boolean ON) +// //{ +// // if (Pub.dio == null || !Pub.dio.initOK) return false; +// // return Pub.dio.SetOutput(GetDONum(eDOName.em) - 1, ON); +// //} +// public static Boolean SetPusher(eMotDir Direction) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// if (Direction == eMotDir.CW) +// { +// if(Util_DO.GetIOInput( eDIName.MGZ_CLAMP_RDY1)==false && +// Util_DO.GetIOInput(eDIName.MGZ_CLAMP_RDY2)==false) +// { +// Pub.log.AddE("매거진이 없어서 푸셔 작동이 불가 합니다"); +// return false; +// } +// Pub.dio.SetOutput(GetDONum(eDOName.PCB_PUSHER_DIR) - 1, true); +// return Pub.dio.SetOutput(GetDONum(eDOName.PCB_PUSHER_RUN) - 1, true); +// } +// else if (Direction == eMotDir.CCW) +// { +// Pub.dio.SetOutput(GetDONum(eDOName.PCB_PUSHER_DIR) - 1, false); +// return Pub.dio.SetOutput(GetDONum(eDOName.PCB_PUSHER_RUN) - 1, true); +// } +// else +// { +// return Pub.dio.SetOutput(GetDONum(eDOName.PCB_PUSHER_RUN) - 1, false); +// } +// } + +// public static Boolean SetMGZMotor(Boolean run) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// if (run) +// { +// Pub.MGZRunTime = DateTime.Now; +// Pub.log.Add("MGZ In Run : " + Pub.MGZRunTime.ToString()); +// return Pub.dio.SetOutput((int)eDOName.MGZ_IN, true); +// } +// else +// { +// return Pub.dio.SetOutput((int)eDOName.MGZ_IN, false); +// } +// } + +// #region "Tower Lamp" + +// /// +// /// 타워램프버튼 작업 +// /// +// /// +// /// +// /// +// public static void SetTWLamp(Boolean r, Boolean g, Boolean y) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return; +// if (Util_DO.GetIOOutput(eDOName.TWR_GRN) != g) Pub.dio.SetOutput(GetDONum(eDOName.TWR_GRN) - 1, g); +// if (Util_DO.GetIOOutput(eDOName.TWR_RED) != r) Pub.dio.SetOutput(GetDONum(eDOName.TWR_RED) - 1, r); +// if (Util_DO.GetIOOutput(eDOName.TWR_YEL) != y) Pub.dio.SetOutput(GetDONum(eDOName.TWR_YEL) - 1, y); + +// if (Util_DO.GetIOOutput(eDOName.LED_START) != g) Pub.dio.SetOutput(GetDONum(eDOName.LED_START) - 1, g); +// if (Util_DO.GetIOOutput(eDOName.LED_STOP) != r) Pub.dio.SetOutput(GetDONum(eDOName.LED_STOP) - 1, r); +// if (Util_DO.GetIOOutput(eDOName.LED_RESET) != y) Pub.dio.SetOutput(GetDONum(eDOName.LED_RESET) - 1, y); +// } + +// public static Boolean SetTwRed(Boolean ON) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// Pub.dio.SetOutput(GetDONum(eDOName.LED_STOP) - 1, ON); +// return Pub.dio.SetOutput(GetDONum(eDOName.TWR_RED) - 1, ON); +// } +// public static Boolean SetTwYel(Boolean ON) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// Pub.dio.SetOutput(GetDONum(eDOName.LED_RESET) - 1, ON); +// return Pub.dio.SetOutput(GetDONum(eDOName.TWR_YEL) - 1, ON); +// } +// public static Boolean SetTwGrn(Boolean ON) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// Pub.dio.SetOutput(GetDONum(eDOName.LED_START) - 1, ON); +// return Pub.dio.SetOutput(GetDONum(eDOName.TWR_GRN) - 1, ON); +// } + +// #endregion + +// public static void ToggleRoomLight() +// { +// var current = Util_DO.GetIOOutput(eDOName.ROOM_LIGHT); +// Pub.dio.SetOutput((int)eDOName.ROOM_LIGHT, !current); +// } + + +// public static Boolean SetBrake(Boolean ON) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// return Pub.dio.SetOutput(GetDONum(eDOName.BRAKE_OFF) - 1, !ON); +// } + +// public static Boolean SetBuzzer(Boolean ON) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// if (ON) +// { +// Pub.BuzzerTime = DateTime.Now; +// if (Pub.setting.EnableBuzzer == false) return true; //부저기능OFF시 사용 안함 +// } +// if (ON && Pub.setting.EnableBuzzer==false) +// { +// Pub.log.AddAT("buzzer Disabled"); +// ON = false; +// } +// return Pub.dio.SetOutput(GetDONum(eDOName.BUZZER) - 1, ON); +// } +// public static Boolean getBrakeOn() +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// return !GetIOOutput(eDOName.BRAKE_OFF); +// } + +// public static Boolean setGripper(Boolean close) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// var rlt = Pub.dio.SetOutput(GetDONum(eDOName.PCB_GRIPPER_CLOSE) - 1, close); +// if (!rlt) Pub.log.AddE("Grip Set Error vlaue=" + close.ToString()); +// else +// { +// System.Threading.Thread.Sleep(Pub.setting.GripperOnOffDelay); +// //Pub.log.Add("DELAY:GRIP:" + Pub.setting.GripperOnOffDelay); +// } +// return rlt; +// } +// public static Boolean setMGZClamp(Boolean close) +// { +// if (Pub.dio == null || !Pub.dio.IsInit) return false; +// bool rlt1, rlt2; +// if (close) +// { +// rlt1 = Pub.dio.SetOutput((int)eDOName.MGZ_CLAMP_OPEN, false); +// rlt2 = Pub.dio.SetOutput((int)eDOName.MGZ_CLAMP_CLOSE, true); +// } +// else +// { +// rlt2 = Pub.dio.SetOutput((int)eDOName.MGZ_CLAMP_CLOSE, false); +// rlt1 = Pub.dio.SetOutput((int)eDOName.MGZ_CLAMP_OPEN, true); +// } + +// Pub.log.AddAT("gripper set close = " + close.ToString()); + +// if (rlt1 == false || rlt2 == false) Pub.log.AddE("Grip Set Error vlaue=" + close.ToString()); +// else +// { +// System.Threading.Thread.Sleep(Pub.setting.GripperOnOffDelay); +// // Pub.log.Add("DELAY:GRIP:" + Pub.setting.GripperOnOffDelay); +// } +// return rlt1 && rlt2; +// } +// } +//} diff --git a/Cs_HMI/Project/ViewForm/fAgv.Designer.cs b/Cs_HMI/Project/ViewForm/fAgv.Designer.cs new file mode 100644 index 0000000..77ccf4d --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fAgv.Designer.cs @@ -0,0 +1,273 @@ +namespace Project.ViewForm +{ + partial class fAgv + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.richTextBox2 = new System.Windows.Forms.RichTextBox(); + this.richTextBox3 = new System.Windows.Forms.RichTextBox(); + this.richTextBox4 = new System.Windows.Forms.RichTextBox(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.panel1 = new System.Windows.Forms.Panel(); + this.button7 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.tableLayoutPanel1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 4; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Controls.Add(this.richTextBox1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.richTextBox2, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.richTextBox3, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.richTextBox4, 3, 0); + this.tableLayoutPanel1.Controls.Add(this.label1, 0, 2); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1050, 510); + this.tableLayoutPanel1.TabIndex = 6; + // + // richTextBox1 + // + this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBox1.Location = new System.Drawing.Point(3, 3); + this.richTextBox1.Name = "richTextBox1"; + this.tableLayoutPanel1.SetRowSpan(this.richTextBox1, 2); + this.richTextBox1.Size = new System.Drawing.Size(256, 454); + this.richTextBox1.TabIndex = 1; + this.richTextBox1.Text = ""; + // + // richTextBox2 + // + this.richTextBox2.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBox2.Location = new System.Drawing.Point(265, 3); + this.richTextBox2.Name = "richTextBox2"; + this.tableLayoutPanel1.SetRowSpan(this.richTextBox2, 2); + this.richTextBox2.Size = new System.Drawing.Size(256, 454); + this.richTextBox2.TabIndex = 1; + this.richTextBox2.Text = ""; + // + // richTextBox3 + // + this.richTextBox3.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBox3.Location = new System.Drawing.Point(527, 3); + this.richTextBox3.Name = "richTextBox3"; + this.tableLayoutPanel1.SetRowSpan(this.richTextBox3, 2); + this.richTextBox3.Size = new System.Drawing.Size(256, 454); + this.richTextBox3.TabIndex = 1; + this.richTextBox3.Text = ""; + // + // richTextBox4 + // + this.richTextBox4.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBox4.Location = new System.Drawing.Point(789, 3); + this.richTextBox4.Name = "richTextBox4"; + this.tableLayoutPanel1.SetRowSpan(this.richTextBox4, 2); + this.richTextBox4.Size = new System.Drawing.Size(258, 454); + this.richTextBox4.TabIndex = 1; + this.richTextBox4.Text = ""; + // + // timer1 + // + this.timer1.Interval = 200; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // panel1 + // + this.panel1.Controls.Add(this.button7); + this.panel1.Controls.Add(this.button6); + this.panel1.Controls.Add(this.button5); + this.panel1.Controls.Add(this.button3); + this.panel1.Controls.Add(this.button2); + this.panel1.Controls.Add(this.button1); + this.panel1.Controls.Add(this.button8); + this.panel1.Controls.Add(this.button4); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(3, 513); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1050, 67); + this.panel1.TabIndex = 7; + // + // button7 + // + this.button7.Dock = System.Windows.Forms.DockStyle.Right; + this.button7.Location = new System.Drawing.Point(550, 0); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(100, 67); + this.button7.TabIndex = 6; + this.button7.Text = "Go - Front\r\nManual"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // button6 + // + this.button6.Dock = System.Windows.Forms.DockStyle.Right; + this.button6.Location = new System.Drawing.Point(650, 0); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(100, 67); + this.button6.TabIndex = 5; + this.button6.Text = "Go - Back\r\nManual"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button5 + // + this.button5.Dock = System.Windows.Forms.DockStyle.Right; + this.button5.Location = new System.Drawing.Point(750, 0); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(100, 67); + this.button5.TabIndex = 4; + this.button5.Text = "Stop(Mark)"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // button3 + // + this.button3.Dock = System.Windows.Forms.DockStyle.Left; + this.button3.Location = new System.Drawing.Point(200, 0); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(100, 67); + this.button3.TabIndex = 2; + this.button3.Text = "Charge Off"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button2 + // + this.button2.Dock = System.Windows.Forms.DockStyle.Left; + this.button2.Location = new System.Drawing.Point(100, 0); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(100, 67); + this.button2.TabIndex = 1; + this.button2.Text = "Charge On"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button1 + // + this.button1.Dock = System.Windows.Forms.DockStyle.Left; + this.button1.Location = new System.Drawing.Point(0, 0); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(100, 67); + this.button1.TabIndex = 0; + this.button1.Text = "Reset"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button8 + // + this.button8.Dock = System.Windows.Forms.DockStyle.Right; + this.button8.Location = new System.Drawing.Point(850, 0); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(100, 67); + this.button8.TabIndex = 7; + this.button8.Text = "Run"; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.button8_Click); + // + // button4 + // + this.button4.Dock = System.Windows.Forms.DockStyle.Right; + this.button4.Location = new System.Drawing.Point(950, 0); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(100, 67); + this.button4.TabIndex = 3; + this.button4.Text = "Stop"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // label1 + // + this.tableLayoutPanel1.SetColumnSpan(this.label1, 2); + this.label1.Dock = System.Windows.Forms.DockStyle.Fill; + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(3, 460); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(518, 50); + this.label1.TabIndex = 2; + this.label1.Text = "label1"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // fAgv + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.ClientSize = new System.Drawing.Size(1056, 583); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "fAgv"; + this.Padding = new System.Windows.Forms.Padding(3); + this.Text = "fFlag"; + this.Load += new System.EventHandler(this.fFlag_Load); + this.VisibleChanged += new System.EventHandler(this.fAgv_VisibleChanged); + this.tableLayoutPanel1.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.RichTextBox richTextBox2; + private System.Windows.Forms.RichTextBox richTextBox3; + private System.Windows.Forms.RichTextBox richTextBox4; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fAgv.cs b/Cs_HMI/Project/ViewForm/fAgv.cs new file mode 100644 index 0000000..aace338 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fAgv.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using COMM; + +namespace Project.ViewForm +{ + public partial class fAgv : Form + { + public fAgv() + { + InitializeComponent(); + + + this.FormClosed += FIO_FormClosed; + } + + private void fFlag_Load(object sender, EventArgs e) + { + this.timer1.Start(); + } + + private void FIO_FormClosed(object sender, FormClosedEventArgs e) + { + this.timer1.Stop(); + } + + + bool tmrun = false; + private void timer1_Tick(object sender, EventArgs e) + { + timer1.Stop(); + label1.Text = PUB.AGV.LastSTS; + richTextBox1.Text = PUB.AGV.system0.ToString(); + richTextBox2.Text = PUB.AGV.system1.ToString(); + richTextBox3.Text = PUB.AGV.signal.ToString() + "\n" + PUB.AGV.data.ToString(); + richTextBox4.Text = PUB.AGV.error.ToString(); + timer1.Start(); + } + + private void fAgv_VisibleChanged(object sender, EventArgs e) + { + this.timer1.Enabled = this.Visible; + if (timer1.Enabled) timer1.Start(); + else timer1.Stop(); + } + + private void button1_Click(object sender, EventArgs e) + { + PUB.AGV.AGVErrorReset(); + if(PUB.sm.Step == StateMachine.eSMStep.RUN) + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void button2_Click(object sender, EventArgs e) + { + PUB.log.Add($"사용자 충전 명령 전송 : {PUB.setting.ChargerID}"); + PUB.AGV.AGVCharge(PUB.setting.ChargerID, true); + if (PUB.sm.Step == StateMachine.eSMStep.RUN) + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void button3_Click(object sender, EventArgs e) + { + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + if (PUB.sm.Step == StateMachine.eSMStep.RUN) + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void button4_Click(object sender, EventArgs e) + { + PUB.AGV.AGVMoveStop("userbutton page:fagv button:button4"); + if (PUB.sm.Step == StateMachine.eSMStep.RUN) + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void button5_Click(object sender, EventArgs e) + { + PUB.AGV.AGVMoveStop("user button clic fagv",arDev.Narumi.eStopOpt.MarkStop); + if (PUB.sm.Step == StateMachine.eSMStep.RUN) + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void button7_Click(object sender, EventArgs e) + { + PUB.AGV.AGVMoveManual(arDev.Narumi.ManulOpt.FS, arDev.Narumi.Speed.Low, arDev.Narumi.Sensor.AllOn); + if (PUB.sm.Step == StateMachine.eSMStep.RUN) + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void button6_Click(object sender, EventArgs e) + { + PUB.AGV.AGVMoveManual(arDev.Narumi.ManulOpt.BS, arDev.Narumi.Speed.Low, arDev.Narumi.Sensor.AllOn); + if (PUB.sm.Step == StateMachine.eSMStep.RUN) + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void button8_Click(object sender, EventArgs e) + { + PUB.AGV.AGVMoveRun(); + } + } +} diff --git a/Cs_HMI/Project/ViewForm/fAgv.resx b/Cs_HMI/Project/ViewForm/fAgv.resx new file mode 100644 index 0000000..aac33d5 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fAgv.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fAuto.Designer.cs b/Cs_HMI/Project/ViewForm/fAuto.Designer.cs new file mode 100644 index 0000000..38e8041 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fAuto.Designer.cs @@ -0,0 +1,86 @@ +namespace Project.ViewForm +{ + partial class fAuto + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.ctlAuto1 = new Project.CtlAuto(); + this.SuspendLayout(); + // + // timer1 + // + this.timer1.Interval = 200; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // ctlAuto1 + // + this.ctlAuto1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.ctlAuto1.BorderColor = System.Drawing.Color.Transparent; + this.ctlAuto1.Dock = System.Windows.Forms.DockStyle.Fill; + this.ctlAuto1.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.ctlAuto1.Font_BMS_Level = new System.Drawing.Font("Bahnschrift Condensed", 250F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ctlAuto1.Font_BMS_Volt = new System.Drawing.Font("Bahnschrift Condensed", 50.25F, System.Drawing.FontStyle.Bold); + this.ctlAuto1.Font_MAIN_BMSLevel = new System.Drawing.Font("Arial Narrow", 150F, System.Drawing.FontStyle.Bold); + this.ctlAuto1.ForeColor = System.Drawing.Color.White; + this.ctlAuto1.ItemGap = 0; + this.ctlAuto1.Items = null; + this.ctlAuto1.Location = new System.Drawing.Point(0, 0); + this.ctlAuto1.MinimumSize = new System.Drawing.Size(100, 30); + this.ctlAuto1.Name = "ctlAuto1"; + this.ctlAuto1.ProgressMax = 100F; + this.ctlAuto1.ProgressVal = 50F; + this.ctlAuto1.Scean = Project.CtlAuto.eScean.Normal; + this.ctlAuto1.Size = new System.Drawing.Size(1014, 579); + this.ctlAuto1.StatusMessage = "상태메세지 입니다"; + this.ctlAuto1.StopMessage = ""; + this.ctlAuto1.StopTime = new System.DateTime(((long)(0))); + this.ctlAuto1.TabIndex = 20; + this.ctlAuto1.Text = "ctlAuto1"; + // + // fAuto + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.ClientSize = new System.Drawing.Size(1014, 579); + this.Controls.Add(this.ctlAuto1); + this.DoubleBuffered = true; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "fAuto"; + this.Text = "fAuto"; + this.Load += new System.EventHandler(this.fAuto_Load); + this.VisibleChanged += new System.EventHandler(this.fAuto_VisibleChanged); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Timer timer1; + private CtlAuto ctlAuto1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fAuto.cs b/Cs_HMI/Project/ViewForm/fAuto.cs new file mode 100644 index 0000000..df7b060 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fAuto.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using static Project.StateMachine; +using COMM; + +namespace Project.ViewForm +{ + public partial class fAuto : Form + { + public fAuto() + { + InitializeComponent(); + this.FormClosed += FAuto_FormClosed; + PUB.sm.StepChanged += Sm_StepChanged; + this.ctlAuto1.ButtonClick += CtlAuto1_ButtonClick; + if (PUB.sm.Step == eSMStep.INIT || PUB.sm.Step == eSMStep.SYNC) + this.ctlAuto1.Scean = CtlAuto.eScean.Progress; + else + this.ctlAuto1.Scean = CtlAuto.eScean.Normal; + } + private void fAuto_Load(object sender, EventArgs e) + { + ctlAuto1.dev_agv = PUB.AGV; + ctlAuto1.dev_plc = PUB.PLC; + ctlAuto1.dev_bms = PUB.BMS; + ctlAuto1.dev_xbe = PUB.XBE; + this.timer1.Start(); + } + + private void CtlAuto1_ButtonClick(CtlAuto.UIButton idx) + { + if (idx.cmd.Equals("EMG")) + { + PUB.log.Add("ui reset click"); + PUB.AGV.AGVErrorReset(); + } + } + + private void Sm_StepChanged(object sender, StepChangeEventArgs e) + { + if (e.New == eSMStep.INIT || e.New == eSMStep.SYNC) + this.ctlAuto1.Scean = CtlAuto.eScean.Progress; + else + this.ctlAuto1.Scean = CtlAuto.eScean.Normal; + } + + private void FAuto_FormClosed(object sender, FormClosedEventArgs e) + { + timer1.Stop(); + PUB.sm.StepChanged -= Sm_StepChanged; + this.ctlAuto1.ButtonClick -= CtlAuto1_ButtonClick; + } + + bool tmrun = false; + private void timer1_Tick(object sender, EventArgs e) + { + if (this.Visible == false) return; + if (tmrun == true) return; + tmrun = true; + + this.ctlAuto1.OnUpdateMode = true; + + //lbBatteryLevel.Text = $"{PUB.BMS.Current_Level}%"; + //lbBatteryLevel.ProgressValue = PUB.BMS.Current_Level; + + if(this.ctlAuto1.Scean == CtlAuto.eScean.Progress) + { + ctlAuto1.ProgressVal = PUB.Result.SMSG_ProgressValue; + ctlAuto1.ProgressMax = PUB.Result.SMSG_ProgressMax; + ctlAuto1.StatusMessage = VAR.STR?.Get(eVarString.StatusMessage) ?? string.Empty; + } + + //if(Pub.Result.StopMessagePLC.StartsWith() + if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_EMG) == true) + this.ctlAuto1.StopMessage = PUB.Result.StopMessagePLC; + else + this.ctlAuto1.StopMessage = string.Empty; + + if (PUB.sm.Step == StateMachine.eSMStep.RUN) + { + this.ctlAuto1.runStep = PUB.sm.RunStep; + } + else + { + this.ctlAuto1.runStep = ERunStep.READY; + } + this.ctlAuto1.OnUpdateMode = false; + this.ctlAuto1.Invalidate(); + tmrun = false; + } + + private void fAuto_VisibleChanged(object sender, EventArgs e) + { + this.timer1.Enabled = this.Visible; + if (timer1.Enabled) timer1.Start(); + else timer1.Stop(); + } + } +} diff --git a/Cs_HMI/Project/ViewForm/fAuto.resx b/Cs_HMI/Project/ViewForm/fAuto.resx new file mode 100644 index 0000000..aac33d5 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fAuto.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fBms.Designer.cs b/Cs_HMI/Project/ViewForm/fBms.Designer.cs new file mode 100644 index 0000000..65b3f8d --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fBms.Designer.cs @@ -0,0 +1,541 @@ +namespace Project.ViewForm +{ + partial class fBms + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.panel1 = new System.Windows.Forms.Panel(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.arLabel1 = new arCtl.arLabel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.cv1 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.cv2 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.panel4 = new System.Windows.Forms.Panel(); + this.cv3 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.cv4 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.panel6 = new System.Windows.Forms.Panel(); + this.cv5 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.panel7 = new System.Windows.Forms.Panel(); + this.cv6 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.panel8 = new System.Windows.Forms.Panel(); + this.cv7 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.panel9 = new System.Windows.Forms.Panel(); + this.cv8 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.lbinfost = new System.Windows.Forms.Label(); + this.lbcvSt = new System.Windows.Forms.Label(); + this.panel1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.panel3.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel6.SuspendLayout(); + this.panel7.SuspendLayout(); + this.panel8.SuspendLayout(); + this.panel9.SuspendLayout(); + this.SuspendLayout(); + // + // timer1 + // + this.timer1.Interval = 200; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // panel1 + // + this.panel1.Controls.Add(this.groupBox1); + this.panel1.Controls.Add(this.button2); + this.panel1.Controls.Add(this.button1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Left; + this.panel1.Location = new System.Drawing.Point(3, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(187, 577); + this.panel1.TabIndex = 0; + // + // button2 + // + this.button2.Dock = System.Windows.Forms.DockStyle.Top; + this.button2.Location = new System.Drawing.Point(0, 67); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(187, 67); + this.button2.TabIndex = 1; + this.button2.Text = "Query Cell Voltage"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button1 + // + this.button1.Dock = System.Windows.Forms.DockStyle.Top; + this.button1.Location = new System.Drawing.Point(0, 0); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(187, 67); + this.button1.TabIndex = 0; + this.button1.Text = "Query Remain"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // arLabel1 + // + this.arLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.arLabel1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.arLabel1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel1.BorderColor = System.Drawing.Color.Red; + this.arLabel1.BorderColorOver = System.Drawing.Color.Red; + this.arLabel1.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.arLabel1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.arLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 150F, System.Drawing.FontStyle.Bold); + this.arLabel1.ForeColor = System.Drawing.Color.White; + this.arLabel1.GradientEnable = true; + this.arLabel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arLabel1.GradientRepeatBG = false; + this.arLabel1.isButton = false; + this.arLabel1.Location = new System.Drawing.Point(190, 3); + this.arLabel1.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel1.msg = null; + this.arLabel1.Name = "arLabel1"; + this.arLabel1.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel1.ProgressEnable = false; + this.arLabel1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel1.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel1.ProgressMax = 100F; + this.arLabel1.ProgressMin = 0F; + this.arLabel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel1.ProgressValue = 0F; + this.arLabel1.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.arLabel1.Sign = "26.5v"; + this.arLabel1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel1.SignColor = System.Drawing.Color.Yellow; + this.arLabel1.SignFont = new System.Drawing.Font("Microsoft Sans Serif", 50F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)))); + this.arLabel1.Size = new System.Drawing.Size(863, 577); + this.arLabel1.TabIndex = 1; + this.arLabel1.Text = "80%"; + this.arLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel1.TextShadow = false; + this.arLabel1.TextVisible = true; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.lbcvSt); + this.groupBox1.Controls.Add(this.panel9); + this.groupBox1.Controls.Add(this.panel8); + this.groupBox1.Controls.Add(this.panel7); + this.groupBox1.Controls.Add(this.panel6); + this.groupBox1.Controls.Add(this.panel5); + this.groupBox1.Controls.Add(this.panel4); + this.groupBox1.Controls.Add(this.panel3); + this.groupBox1.Controls.Add(this.panel2); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.ForeColor = System.Drawing.Color.White; + this.groupBox1.Location = new System.Drawing.Point(0, 134); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(187, 443); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Cell voltage"; + // + // panel2 + // + this.panel2.Controls.Add(this.cv1); + this.panel2.Controls.Add(this.label1); + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(3, 17); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(181, 40); + this.panel2.TabIndex = 0; + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Left; + this.label1.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label1.Location = new System.Drawing.Point(0, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(47, 40); + this.label1.TabIndex = 0; + this.label1.Text = "#1"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // cv1 + // + this.cv1.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv1.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv1.Location = new System.Drawing.Point(47, 0); + this.cv1.Name = "cv1"; + this.cv1.Size = new System.Drawing.Size(134, 40); + this.cv1.TabIndex = 0; + this.cv1.Text = "--"; + this.cv1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel3 + // + this.panel3.Controls.Add(this.cv2); + this.panel3.Controls.Add(this.label4); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(3, 57); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(181, 40); + this.panel3.TabIndex = 1; + this.panel3.Paint += new System.Windows.Forms.PaintEventHandler(this.panel3_Paint); + // + // cv2 + // + this.cv2.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv2.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv2.Location = new System.Drawing.Point(47, 0); + this.cv2.Name = "cv2"; + this.cv2.Size = new System.Drawing.Size(134, 40); + this.cv2.TabIndex = 0; + this.cv2.Text = "--"; + this.cv2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label4 + // + this.label4.Dock = System.Windows.Forms.DockStyle.Left; + this.label4.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label4.Location = new System.Drawing.Point(0, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(47, 40); + this.label4.TabIndex = 0; + this.label4.Text = "#2"; + this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel4 + // + this.panel4.Controls.Add(this.cv3); + this.panel4.Controls.Add(this.label6); + this.panel4.Dock = System.Windows.Forms.DockStyle.Top; + this.panel4.Location = new System.Drawing.Point(3, 97); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(181, 40); + this.panel4.TabIndex = 2; + this.panel4.Paint += new System.Windows.Forms.PaintEventHandler(this.panel4_Paint); + // + // cv3 + // + this.cv3.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv3.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv3.Location = new System.Drawing.Point(47, 0); + this.cv3.Name = "cv3"; + this.cv3.Size = new System.Drawing.Size(134, 40); + this.cv3.TabIndex = 0; + this.cv3.Text = "--"; + this.cv3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label6 + // + this.label6.Dock = System.Windows.Forms.DockStyle.Left; + this.label6.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label6.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label6.Location = new System.Drawing.Point(0, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(47, 40); + this.label6.TabIndex = 0; + this.label6.Text = "#3"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel5 + // + this.panel5.Controls.Add(this.cv4); + this.panel5.Controls.Add(this.label8); + this.panel5.Dock = System.Windows.Forms.DockStyle.Top; + this.panel5.Location = new System.Drawing.Point(3, 137); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(181, 40); + this.panel5.TabIndex = 3; + // + // cv4 + // + this.cv4.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv4.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv4.Location = new System.Drawing.Point(47, 0); + this.cv4.Name = "cv4"; + this.cv4.Size = new System.Drawing.Size(134, 40); + this.cv4.TabIndex = 0; + this.cv4.Text = "--"; + this.cv4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label8 + // + this.label8.Dock = System.Windows.Forms.DockStyle.Left; + this.label8.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label8.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label8.Location = new System.Drawing.Point(0, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(47, 40); + this.label8.TabIndex = 0; + this.label8.Text = "#4"; + this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel6 + // + this.panel6.Controls.Add(this.cv5); + this.panel6.Controls.Add(this.label10); + this.panel6.Dock = System.Windows.Forms.DockStyle.Top; + this.panel6.Location = new System.Drawing.Point(3, 177); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(181, 40); + this.panel6.TabIndex = 4; + this.panel6.Paint += new System.Windows.Forms.PaintEventHandler(this.panel6_Paint); + // + // cv5 + // + this.cv5.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv5.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv5.Location = new System.Drawing.Point(47, 0); + this.cv5.Name = "cv5"; + this.cv5.Size = new System.Drawing.Size(134, 40); + this.cv5.TabIndex = 0; + this.cv5.Text = "--"; + this.cv5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label10 + // + this.label10.Dock = System.Windows.Forms.DockStyle.Left; + this.label10.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label10.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label10.Location = new System.Drawing.Point(0, 0); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(47, 40); + this.label10.TabIndex = 0; + this.label10.Text = "#5"; + this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel7 + // + this.panel7.Controls.Add(this.cv6); + this.panel7.Controls.Add(this.label12); + this.panel7.Dock = System.Windows.Forms.DockStyle.Top; + this.panel7.Location = new System.Drawing.Point(3, 217); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(181, 40); + this.panel7.TabIndex = 5; + // + // cv6 + // + this.cv6.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv6.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv6.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv6.Location = new System.Drawing.Point(47, 0); + this.cv6.Name = "cv6"; + this.cv6.Size = new System.Drawing.Size(134, 40); + this.cv6.TabIndex = 0; + this.cv6.Text = "--"; + this.cv6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label12 + // + this.label12.Dock = System.Windows.Forms.DockStyle.Left; + this.label12.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label12.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label12.Location = new System.Drawing.Point(0, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(47, 40); + this.label12.TabIndex = 0; + this.label12.Text = "#6"; + this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel8 + // + this.panel8.Controls.Add(this.cv7); + this.panel8.Controls.Add(this.label14); + this.panel8.Dock = System.Windows.Forms.DockStyle.Top; + this.panel8.Location = new System.Drawing.Point(3, 257); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(181, 40); + this.panel8.TabIndex = 6; + this.panel8.Paint += new System.Windows.Forms.PaintEventHandler(this.panel8_Paint); + // + // cv7 + // + this.cv7.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv7.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv7.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv7.Location = new System.Drawing.Point(47, 0); + this.cv7.Name = "cv7"; + this.cv7.Size = new System.Drawing.Size(134, 40); + this.cv7.TabIndex = 0; + this.cv7.Text = "--"; + this.cv7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label14 + // + this.label14.Dock = System.Windows.Forms.DockStyle.Left; + this.label14.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label14.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label14.Location = new System.Drawing.Point(0, 0); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(47, 40); + this.label14.TabIndex = 0; + this.label14.Text = "#7"; + this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel9 + // + this.panel9.Controls.Add(this.cv8); + this.panel9.Controls.Add(this.label16); + this.panel9.Dock = System.Windows.Forms.DockStyle.Top; + this.panel9.Location = new System.Drawing.Point(3, 297); + this.panel9.Name = "panel9"; + this.panel9.Size = new System.Drawing.Size(181, 40); + this.panel9.TabIndex = 7; + // + // cv8 + // + this.cv8.Dock = System.Windows.Forms.DockStyle.Fill; + this.cv8.Font = new System.Drawing.Font("Tahoma", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cv8.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.cv8.Location = new System.Drawing.Point(47, 0); + this.cv8.Name = "cv8"; + this.cv8.Size = new System.Drawing.Size(134, 40); + this.cv8.TabIndex = 0; + this.cv8.Text = "--"; + this.cv8.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label16 + // + this.label16.Dock = System.Windows.Forms.DockStyle.Left; + this.label16.Font = new System.Drawing.Font("굴림", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label16.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192))))); + this.label16.Location = new System.Drawing.Point(0, 0); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(47, 40); + this.label16.TabIndex = 0; + this.label16.Text = "#8"; + this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lbinfost + // + this.lbinfost.AutoSize = true; + this.lbinfost.Font = new System.Drawing.Font("굴림", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.lbinfost.ForeColor = System.Drawing.Color.White; + this.lbinfost.Location = new System.Drawing.Point(194, 8); + this.lbinfost.Name = "lbinfost"; + this.lbinfost.Size = new System.Drawing.Size(39, 27); + this.lbinfost.TabIndex = 2; + this.lbinfost.Text = "●"; + // + // lbcvSt + // + this.lbcvSt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lbcvSt.AutoSize = true; + this.lbcvSt.Font = new System.Drawing.Font("굴림", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.lbcvSt.ForeColor = System.Drawing.Color.White; + this.lbcvSt.Location = new System.Drawing.Point(2, 411); + this.lbcvSt.Name = "lbcvSt"; + this.lbcvSt.Size = new System.Drawing.Size(39, 27); + this.lbcvSt.TabIndex = 8; + this.lbcvSt.Text = "●"; + // + // fBms + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.ClientSize = new System.Drawing.Size(1056, 583); + this.Controls.Add(this.lbinfost); + this.Controls.Add(this.arLabel1); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "fBms"; + this.Padding = new System.Windows.Forms.Padding(3); + this.Text = "fFlag"; + this.Load += new System.EventHandler(this.fFlag_Load); + this.VisibleChanged += new System.EventHandler(this.fAgv_VisibleChanged); + this.panel1.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.panel4.ResumeLayout(false); + this.panel5.ResumeLayout(false); + this.panel6.ResumeLayout(false); + this.panel7.ResumeLayout(false); + this.panel8.ResumeLayout(false); + this.panel9.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button button1; + private arCtl.arLabel arLabel1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label cv1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel9; + private System.Windows.Forms.Label cv8; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Panel panel8; + private System.Windows.Forms.Label cv7; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.Label cv6; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Label cv5; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Label cv4; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Label cv3; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label cv2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label lbinfost; + private System.Windows.Forms.Label lbcvSt; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fBms.cs b/Cs_HMI/Project/ViewForm/fBms.cs new file mode 100644 index 0000000..431c95f --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fBms.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using COMM; + +namespace Project.ViewForm +{ + public partial class fBms : Form + { + public fBms() + { + InitializeComponent(); + + + this.FormClosed += FIO_FormClosed; + PUB.BMS.BMSCellDataReceive += BMS_BMSCellDataReceive; + PUB.BMS.BMSDataReceive += BMS_BMSDataReceive; + } + + private void BMS_BMSDataReceive(object sender, arDev.BMSInformationEventArgs e) + { + if (this.IsDisposed == true || this.Visible == false) return; + this.BeginInvoke(new Action(() => + { + if (lbinfost.ForeColor == Color.FromArgb(32, 32, 32)) + lbinfost.ForeColor = Color.Lime; + else + lbinfost.ForeColor = Color.FromArgb(32, 32, 32); + })); + } + + private void BMS_BMSCellDataReceive(object sender, arDev.BMSCelvoltageEventArgs e) + { + if (this.IsDisposed == true || this.Visible == false) return; + this.BeginInvoke(new Action(() => + { + if (lbcvSt.ForeColor == Color.FromArgb(15, 15, 15)) + lbcvSt.ForeColor = Color.Lime; + else + lbcvSt.ForeColor = Color.FromArgb(15, 15, 15); + })); + } + + private void fFlag_Load(object sender, EventArgs e) + { + this.timer1.Start(); + } + + private void FIO_FormClosed(object sender, FormClosedEventArgs e) + { + this.timer1.Stop(); + PUB.BMS.BMSCellDataReceive -= BMS_BMSCellDataReceive; + PUB.BMS.BMSDataReceive -= BMS_BMSDataReceive; + } + + + bool tmrun = false; + private void timer1_Tick(object sender, EventArgs e) + { + timer1.Stop(); + this.arLabel1.Text = PUB.BMS.Current_Level.ToString("N1") + "%"; + this.arLabel1.Sign = PUB.BMS.Current_Volt.ToString() + "v"; + this.cv1.Text = PUB.BMS.CellVoltage[0].ToString("N3") + "v"; + this.cv2.Text = PUB.BMS.CellVoltage[1].ToString("N3") + "v"; + this.cv3.Text = PUB.BMS.CellVoltage[2].ToString("N3") + "v"; + this.cv4.Text = PUB.BMS.CellVoltage[3].ToString("N3") + "v"; + this.cv5.Text = PUB.BMS.CellVoltage[4].ToString("N3") + "v"; + this.cv6.Text = PUB.BMS.CellVoltage[5].ToString("N3") + "v"; + this.cv7.Text = PUB.BMS.CellVoltage[6].ToString("N3") + "v"; + this.cv8.Text = PUB.BMS.CellVoltage[7].ToString("N3") + "v"; + timer1.Start(); + } + + private void fAgv_VisibleChanged(object sender, EventArgs e) + { + this.timer1.Enabled = this.Visible; + } + + private void button1_Click(object sender, EventArgs e) + { + PUB.BMS.SendQuery_ReadStatue(); + } + + private void button2_Click(object sender, EventArgs e) + { + PUB.BMS.SendQuery_ReadCellvoltage(); + } + + private void panel3_Paint(object sender, PaintEventArgs e) + { + + } + + private void panel4_Paint(object sender, PaintEventArgs e) + { + + } + + private void panel6_Paint(object sender, PaintEventArgs e) + { + + } + + private void panel8_Paint(object sender, PaintEventArgs e) + { + + } + } +} diff --git a/Cs_HMI/Project/ViewForm/fBms.resx b/Cs_HMI/Project/ViewForm/fBms.resx new file mode 100644 index 0000000..aac33d5 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fBms.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fFlag.Designer.cs b/Cs_HMI/Project/ViewForm/fFlag.Designer.cs new file mode 100644 index 0000000..1f9be26 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fFlag.Designer.cs @@ -0,0 +1,189 @@ +namespace Project.ViewForm +{ + partial class fFlag + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.listView2 = new System.Windows.Forms.ListView(); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.listView3 = new System.Windows.Forms.ListView(); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.listView4 = new System.Windows.Forms.ListView(); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 4; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Controls.Add(this.listView1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.listView2, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.listView3, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.listView4, 3, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1050, 577); + this.tableLayoutPanel1.TabIndex = 6; + // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(3, 3); + this.listView1.Name = "listView1"; + this.tableLayoutPanel1.SetRowSpan(this.listView1, 2); + this.listView1.Size = new System.Drawing.Size(256, 571); + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); + // + // columnHeader1 + // + this.columnHeader1.Width = 120; + // + // columnHeader2 + // + this.columnHeader2.Width = 120; + // + // listView2 + // + this.listView2.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader3, + this.columnHeader4}); + this.listView2.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView2.HideSelection = false; + this.listView2.Location = new System.Drawing.Point(265, 3); + this.listView2.Name = "listView2"; + this.tableLayoutPanel1.SetRowSpan(this.listView2, 2); + this.listView2.Size = new System.Drawing.Size(256, 571); + this.listView2.TabIndex = 0; + this.listView2.UseCompatibleStateImageBehavior = false; + this.listView2.View = System.Windows.Forms.View.Details; + // + // columnHeader3 + // + this.columnHeader3.Width = 120; + // + // listView3 + // + this.listView3.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader5, + this.columnHeader6}); + this.listView3.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView3.HideSelection = false; + this.listView3.Location = new System.Drawing.Point(527, 3); + this.listView3.Name = "listView3"; + this.tableLayoutPanel1.SetRowSpan(this.listView3, 2); + this.listView3.Size = new System.Drawing.Size(256, 571); + this.listView3.TabIndex = 0; + this.listView3.UseCompatibleStateImageBehavior = false; + this.listView3.View = System.Windows.Forms.View.Details; + // + // columnHeader5 + // + this.columnHeader5.Width = 120; + // + // listView4 + // + this.listView4.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader7, + this.columnHeader8}); + this.listView4.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView4.HideSelection = false; + this.listView4.Location = new System.Drawing.Point(789, 3); + this.listView4.Name = "listView4"; + this.tableLayoutPanel1.SetRowSpan(this.listView4, 2); + this.listView4.Size = new System.Drawing.Size(258, 571); + this.listView4.TabIndex = 0; + this.listView4.UseCompatibleStateImageBehavior = false; + this.listView4.View = System.Windows.Forms.View.Details; + // + // columnHeader7 + // + this.columnHeader7.Width = 120; + // + // timer1 + // + this.timer1.Interval = 500; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // fFlag + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.ClientSize = new System.Drawing.Size(1056, 583); + this.Controls.Add(this.tableLayoutPanel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "fFlag"; + this.Padding = new System.Windows.Forms.Padding(3); + this.Text = "fFlag"; + this.Load += new System.EventHandler(this.fFlag_Load); + this.VisibleChanged += new System.EventHandler(this.fFlag_VisibleChanged); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ListView listView2; + private System.Windows.Forms.ListView listView3; + private System.Windows.Forms.ListView listView4; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fFlag.cs b/Cs_HMI/Project/ViewForm/fFlag.cs new file mode 100644 index 0000000..877fe32 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fFlag.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using COMM; + +namespace Project.ViewForm +{ + public partial class fFlag : Form + { + public fFlag() + { + InitializeComponent(); + + + this.FormClosed += FIO_FormClosed; + } + + private void fFlag_Load(object sender, EventArgs e) + { + MakeControl(); + this.timer1.Start(); + } + + void MakeControl() + { + ListView[] lvs = new ListView[] { listView1, listView2, listView3, listView4 }; + foreach (var lv in lvs) + { + lv.Columns.Clear(); + lv.Columns.Add("Idx"); + lv.Columns.Add("Title"); + lv.Columns.Add("Value"); + lv.Columns[0].Width = 25; + lv.Columns[1].Width = 150; + lv.Columns[2].Width = 100; + } + Array valuelist; + + valuelist = Enum.GetValues(typeof(COMM.eVarBool)); + foreach (var item in valuelist) + { + var v = (COMM.eVarBool)item; + var lv = listView1.Items.Add($"{(int)v}"); + lv.SubItems.Add($"{item}"); + lv.SubItems.Add("--"); + } + + valuelist = Enum.GetValues(typeof(COMM.eVarInt32)); + foreach (var item in valuelist) + { + var v = (COMM.eVarInt32)item; + var lv = listView2.Items.Add($"{(int)v}"); + lv.SubItems.Add($"{item}"); + lv.SubItems.Add("--"); + } + + valuelist = Enum.GetValues(typeof(COMM.eVarString)); + foreach (var item in valuelist) + { + var v = (COMM.eVarString)item; + var lv = listView3.Items.Add($"{(int)v}"); + lv.SubItems.Add($"{item}"); + lv.SubItems.Add("--"); + } + + valuelist = Enum.GetValues(typeof(COMM.eVarTime)); + foreach (var item in valuelist) + { + var v = (COMM.eVarString)item; + var lv = listView4.Items.Add($"{(int)v}"); + lv.SubItems.Add($"{item}"); + lv.SubItems.Add("--"); + } + + + } + + private void FIO_FormClosed(object sender, FormClosedEventArgs e) + { + this.timer1.Stop(); + } + + + bool tmrun = false; + private void timer1_Tick(object sender, EventArgs e) + { + timer1.Stop(); + listView1.SuspendLayout(); + foreach (ListViewItem item in listView1.Items) + { + var idx = int.Parse(item.SubItems[0].Text); + var v = VAR.BOOL.Get(idx); + var desc = VAR.BOOL.GetCodeDesc(idx); + item.SubItems[2].Text = v ? "O" : "X"; + } + listView1.ResumeLayout(); + listView2.SuspendLayout(); + foreach (ListViewItem item in listView2.Items) + { + var idx = int.Parse(item.SubItems[0].Text); + var v = VAR.I32.Get(idx); + var desc = VAR.I32.GetCodeDesc(idx); + item.SubItems[2].Text = v.ToString(); + } + listView2.ResumeLayout(); + listView3.SuspendLayout(); + foreach (ListViewItem item in listView3.Items) + { + var idx = int.Parse(item.SubItems[0].Text); + var v = VAR.STR.Get(idx); + var desc = VAR.STR.GetCodeDesc(idx); + item.SubItems[2].Text = v; + } + listView3.ResumeLayout(); + listView4.SuspendLayout(); + foreach (ListViewItem item in listView4.Items) + { + var idx = int.Parse(item.SubItems[0].Text); + var v = VAR.TIME.Get(idx); + var desc = VAR.TIME.GetCodeDesc(idx); + item.SubItems[2].Text = v.ToString("HH:mm:ss.fff"); + } + listView4.ResumeLayout(); + timer1.Start(); + } + + private void fFlag_VisibleChanged(object sender, EventArgs e) + { + this.timer1.Enabled = this.Visible; + if (timer1.Enabled) timer1.Start(); + else timer1.Stop(); + } + + private void listView1_SelectedIndexChanged(object sender, EventArgs e) + { + + } + } +} diff --git a/Cs_HMI/Project/ViewForm/fFlag.resx b/Cs_HMI/Project/ViewForm/fFlag.resx new file mode 100644 index 0000000..aac33d5 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fFlag.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fIO.Designer.cs b/Cs_HMI/Project/ViewForm/fIO.Designer.cs new file mode 100644 index 0000000..9445ff9 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fIO.Designer.cs @@ -0,0 +1,302 @@ +namespace Project.ViewForm +{ + partial class fIO + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + arFrame.Control.ColorListItem colorListItem1 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem2 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem3 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem4 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem5 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem6 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem7 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem8 = new arFrame.Control.ColorListItem(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fIO)); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.HWState = new arFrame.Control.GridView(); + this.tblMain = new arFrame.Control.GridView(); + this.panel1 = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.panel2 = new System.Windows.Forms.Panel(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.tableLayoutPanel1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.HWState, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.tblMain, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 58F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(957, 583); + this.tableLayoutPanel1.TabIndex = 5; + // + // HWState + // + this.HWState.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(60)))), ((int)(((byte)(60))))); + this.HWState.BorderSize = 0; + colorListItem1.BackColor1 = System.Drawing.Color.Gray; + colorListItem1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + colorListItem1.Remark = "타이틀바(상)"; + colorListItem2.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem2.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + colorListItem2.Remark = "상태표시(하)"; + colorListItem3.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem3.BackColor2 = System.Drawing.Color.Lime; + colorListItem3.Remark = "정상"; + colorListItem4.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem4.BackColor2 = System.Drawing.Color.Red; + colorListItem4.Remark = "오류"; + colorListItem5.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem5.BackColor2 = System.Drawing.Color.Yellow; + colorListItem5.Remark = "오류(깜박)"; + colorListItem6.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem6.BackColor2 = System.Drawing.Color.DarkViolet; + colorListItem6.Remark = "오류(유효)"; + this.HWState.ColorList = new arFrame.Control.ColorListItem[] { + colorListItem1, + colorListItem2, + colorListItem3, + colorListItem4, + colorListItem5, + colorListItem6}; + this.HWState.Dock = System.Windows.Forms.DockStyle.Fill; + this.HWState.Font = new System.Drawing.Font("Consolas", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.HWState.FontPin = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.HWState.ForeColor = System.Drawing.Color.Moccasin; + this.HWState.ForeColorPin = System.Drawing.Color.Moccasin; + this.HWState.Location = new System.Drawing.Point(0, 525); + this.HWState.Margin = new System.Windows.Forms.Padding(0); + this.HWState.MatrixSize = new System.Drawing.Point(4, 2); + this.HWState.MenuBorderSize = 1; + this.HWState.MenuGap = 5; + this.HWState.MinimumSize = new System.Drawing.Size(100, 0); + this.HWState.Name = "HWState"; + this.HWState.Names = new string[] { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ""}; + this.HWState.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(60)))), ((int)(((byte)(60)))), ((int)(((byte)(60))))); + this.HWState.showDebugInfo = false; + this.HWState.ShowIndexString = false; + this.HWState.Size = new System.Drawing.Size(957, 58); + this.HWState.TabIndex = 9; + this.HWState.Tags = null; + this.HWState.Text = "gridView3"; + this.HWState.TextAttachToImage = true; + this.HWState.Titles = new string[] { + "AGV|XBE|PLC|BAT|", + "C00|C00|C00|C00|"}; + this.HWState.Values = new ushort[] { + ((ushort)(0)), + ((ushort)(0)), + ((ushort)(0)), + ((ushort)(0)), + ((ushort)(1)), + ((ushort)(1)), + ((ushort)(1)), + ((ushort)(1))}; + // + // tblMain + // + this.tblMain.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.tblMain.BorderSize = 1; + colorListItem7.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30))))); + colorListItem7.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + colorListItem7.Remark = ""; + colorListItem8.BackColor1 = System.Drawing.Color.Orange; + colorListItem8.BackColor2 = System.Drawing.Color.DarkOrange; + colorListItem8.Remark = ""; + this.tblMain.ColorList = new arFrame.Control.ColorListItem[] { + colorListItem7, + colorListItem8}; + this.tblMain.Cursor = System.Windows.Forms.Cursors.Arrow; + this.tblMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.tblMain.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tblMain.FontPin = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold); + this.tblMain.ForeColor = System.Drawing.Color.White; + this.tblMain.ForeColorPin = System.Drawing.Color.WhiteSmoke; + this.tblMain.Location = new System.Drawing.Point(3, 23); + this.tblMain.MatrixSize = new System.Drawing.Point(8, 4); + this.tblMain.MenuBorderSize = 1; + this.tblMain.MenuGap = 5; + this.tblMain.MinimumSize = new System.Drawing.Size(100, 50); + this.tblMain.Name = "tblMain"; + this.tblMain.Names = null; + this.tblMain.ShadowColor = System.Drawing.Color.Black; + this.tblMain.showDebugInfo = false; + this.tblMain.ShowIndexString = true; + this.tblMain.Size = new System.Drawing.Size(951, 499); + this.tblMain.TabIndex = 4; + this.tblMain.Tags = null; + this.tblMain.Text = "gridView1"; + this.tblMain.TextAttachToImage = true; + this.tblMain.Titles = null; + this.tblMain.Values = null; + this.tblMain.ItemClick += new System.EventHandler(this.tblIn1_ItemClick); + // + // panel1 + // + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.label3); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(3, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(951, 14); + this.panel1.TabIndex = 6; + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Fill; + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(0, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(551, 14); + this.label1.TabIndex = 5; + this.label1.Text = "label1"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label3 + // + this.label3.Dock = System.Windows.Forms.DockStyle.Right; + this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(128))))); + this.label3.Location = new System.Drawing.Point(551, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(400, 14); + this.label3.TabIndex = 6; + this.label3.Text = "label3"; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // timer1 + // + this.timer1.Interval = 200; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(120)))), ((int)(((byte)(120)))), ((int)(((byte)(120))))); + this.panel2.Controls.Add(this.button2); + this.panel2.Controls.Add(this.button3); + this.panel2.Controls.Add(this.button1); + this.panel2.Dock = System.Windows.Forms.DockStyle.Right; + this.panel2.Location = new System.Drawing.Point(957, 0); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(99, 583); + this.panel2.TabIndex = 6; + // + // button2 + // + this.button2.Dock = System.Windows.Forms.DockStyle.Fill; + this.button2.Image = ((System.Drawing.Image)(resources.GetObject("button2.Image"))); + this.button2.Location = new System.Drawing.Point(0, 100); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(99, 383); + this.button2.TabIndex = 1; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button3 + // + this.button3.Dock = System.Windows.Forms.DockStyle.Bottom; + this.button3.Image = ((System.Drawing.Image)(resources.GetObject("button3.Image"))); + this.button3.Location = new System.Drawing.Point(0, 483); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(99, 100); + this.button3.TabIndex = 2; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click_1); + // + // button1 + // + this.button1.Dock = System.Windows.Forms.DockStyle.Top; + this.button1.Image = ((System.Drawing.Image)(resources.GetObject("button1.Image"))); + this.button1.Location = new System.Drawing.Point(0, 0); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(99, 100); + this.button1.TabIndex = 0; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // fIO + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.ClientSize = new System.Drawing.Size(1056, 583); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "fIO"; + this.Text = "fIO"; + this.Load += new System.EventHandler(this.fIO_Load); + this.VisibleChanged += new System.EventHandler(this.fIO_VisibleChanged); + this.tableLayoutPanel1.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private arFrame.Control.GridView tblMain; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Panel panel1; + private arFrame.Control.GridView HWState; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button1; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fIO.cs b/Cs_HMI/Project/ViewForm/fIO.cs new file mode 100644 index 0000000..4163df5 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fIO.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Project.ViewForm +{ + public partial class fIO : Form + { + public fIO() + { + InitializeComponent(); + + tblMain.SuspendLayout(); + + //이름설정 INput #1 + List namearray = new List(32); + List tagarray = new List(32); + + namearray.Clear(); + tagarray.Clear(); + for (byte i = 0; i < 16; i++) + { + var flagName = ((arDev.FakePLC.DIName)i).ToString(); + var enumValue = Enum.Parse(typeof(arDev.FakePLC.DIPin), flagName); + if (flagName == i.ToString()) tagarray.Add(string.Empty); + else + { + //동일한 이름의 pin 번호르 찾아서 할당해준다. + var eV = (arDev.FakePLC.DIPin)enumValue; + tagarray.Add(((byte)eV).ToString()); + } + namearray.Add(flagName.Replace("_", "\n")); + } + for (byte i = 0; i < 8; i++) + { + var flagName = ((arDev.FakePLC.DOName)i).ToString(); + var enumValue = Enum.Parse(typeof(arDev.FakePLC.DOPin), flagName); + if (flagName == i.ToString()) tagarray.Add(string.Empty); + else + { + //동일한 이름의 pin 번호르 찾아서 할당해준다. + var eV = (arDev.FakePLC.DOPin)enumValue; + tagarray.Add(((byte)eV).ToString()); + } + namearray.Add(flagName); + } + this.tblMain.setTitle(namearray.ToArray()); + this.tblMain.setTag(tagarray.ToArray()); + this.tblMain.setItemTextAlign(ContentAlignment.BottomLeft); + + + //값설정 + List fgValueM = new List(); + List fgValueS = new List(); + + //mainplc + for (byte i = 0; i < 16; i++) + fgValueM.Add(PUB.PLC.GetValueI(i)); + for (byte i = 0; i < 16; i++) + fgValueM.Add(PUB.PLC.GetValueO(i)); + + + + tblMain.setValue(fgValueM.ToArray()); + tblMain.ResumeLayout(); + + this.FormClosed += FIO_FormClosed; + UpdateControl(); + } + void Update_HWStatus() + { + var rownum = 1; + var colIdx = 0; + + + if (PUB.AGV.IsOpen == false) BlinkGridViewItem(HWState, rownum, colIdx++, 3, 4); + else HWState.setValue(rownum, colIdx++, 2); // + + if (PUB.XBE.IsOpen == false) BlinkGridViewItem(HWState, rownum, colIdx++, 3, 4); + else HWState.setValue(rownum, colIdx++, 2); // + + if (PUB.PLC.IsOpen == false) BlinkGridViewItem(HWState, rownum, colIdx++, 3, 4); + else HWState.setValue(rownum, colIdx++, 2); // + + if (PUB.BMS.IsOpen == false) BlinkGridViewItem(HWState, rownum, colIdx++, 3, 4); + else HWState.setValue(rownum, colIdx++, 2); // + } + void BlinkGridViewItem(arFrame.Control.GridView ctl, int row, int col, int value1, int value2) + { + var curValue = ctl.getValue(row, col); + ctl.setValue(row, col, (byte)(curValue == value1 ? value2 : value1)); // + } + + void UpdateControl() + { + var rowNum = 1; + var colIdx = 0; + HWState.setTitle(0, colIdx++, "AGV"); + HWState.setTitle(0, colIdx++, "XBE"); + HWState.setTitle(0, colIdx++, "PLC"); + HWState.setTitle(0, colIdx++, "BAT"); + + colIdx = 0; + HWState.setTitle(rowNum, colIdx++, PUB.setting.Port_AGV); + HWState.setTitle(rowNum, colIdx++, PUB.setting.Port_XBE); + HWState.setTitle(rowNum, colIdx++, PUB.setting.Port_PLC); + HWState.setTitle(rowNum, colIdx++, PUB.setting.Port_BAT); + + HWState.Invalidate(); + + } + private void fIO_Load(object sender, EventArgs e) + { + this.timer1.Start(); + } + private void FIO_FormClosed(object sender, FormClosedEventArgs e) + { + //Pub.plcM.ValueChanged -= Plc1_ValueChanged; + //Pub.plcS.ValueChanged -= Plc2_ValueChanged; + } + + + private void tblIn1_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e) + { + var dataIndex = (byte)e.idx; + if (dataIndex >= 16) + { + var ctl = sender as arFrame.Control.GridView; + var pinNoStr = ctl.Tags[e.idx]; + if (pinNoStr.isEmpty() == true) + { + Util.MsgE("해당 포트는 핀번호가 설정되지 않았습니다", true); + } + else + { + var pinNo = byte.Parse(pinNoStr); + var curVal = PUB.PLC.GetValueO((byte)(dataIndex - 16)); + PUB.PLC.SetOutput(pinNo, !curVal);// .Sendcommand(Device.PLC1.eCommand.SET_DOUTPUT, pinNo, newval); + } + } + else Util.MsgE("해당 주소는 허용되지 않습니다.", true); + } + + + + bool tmrun = false; + private void timer1_Tick(object sender, EventArgs e) + { + if (this.Visible == false) return; + if (tmrun == true) return; + tmrun = true; + + label1.Text = string.Format("{0} / {1}", + PUB.PLC.ioBinStr, PUB.PLC.SetupStr); + label3.Text = PUB.PLC.LastMessage; + + Update_HWStatus(); + + List fgValueM = new List(); + List fgValueS = new List(); + + //mainplc + for (byte i = 0; i < 16; i++) + this.tblMain.setValue(i, PUB.PLC.GetValueI(i)); + + for (byte i = 0; i < 16; i++) + this.tblMain.setValue(i + 16, PUB.PLC.GetValueO(i)); + + + this.tblMain.Invalidate(); + + tmrun = false; + } + + private void fIO_VisibleChanged(object sender, EventArgs e) + { + this.timer1.Enabled = this.Visible; + if (timer1.Enabled) timer1.Start(); + else timer1.Stop(); + } + + private void button1_Click(object sender, EventArgs e) + { + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Up); + } + + + private void button2_Click(object sender, EventArgs e) + { + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Stop); + } + + private void button3_Click_1(object sender, EventArgs e) + { + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down); + } + } +} diff --git a/Cs_HMI/Project/ViewForm/fIO.resx b/Cs_HMI/Project/ViewForm/fIO.resx new file mode 100644 index 0000000..f0d1f60 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fIO.resx @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAA/ZJREFUWEfd + WLtOG0EUtZR0ST4jDyVR8gE0GNtrGxKlwKYAFOAHMA9DxRsaCl6/kR5RpiH4AY0DOBgpiYkjmoCR2LUp + smhzzjLgRwZ7/QpWjnSk9e7M3OOZO3PvHdt/i4jd/jrsco1uezwbEY8nGVGUTMjp1Ek+4913fgu5XCNs + K7o1FpstLY8iLtd4xO1O7XR0qIcDAxfHwaCRnp01tMVFI7u0ZJLPfHc8NmYc9vdn2RZ9foSdzuDH1taH + Yrj6AYPeDytKEOLUeG9v5mRy0rhYWbHO5WWDfeI9PRpmXeXMc0wxfG3YUpRnUUU53O3qUs/m5+UCKiDH + 2PX51Kjbndi0258KM9UBS/IO4rSfw8OXMmO1MBUIXGJFtFBb21thrjJEHI4+/MtMemZGaqAePJ2eNqIe + TybidL4XZq3BnDmIO1tYkA5cT3LJKXLL4XgjzJeG8DmtkTNXzNOpKYPLjVV7ImTIwZ3FDdEInytH+KSO + VTsoubu5/T/7/eeyAf4FY36/hpkcEXIKIQ5ha0fJ6uoVZd9ktNj+bG7OQBQ6lx7mEDfOQ1jWsYAwpMfj + hr63Z1mkHosZeiJhXKytSb/nM97drTHiCFk5MHydwFllnW4oxF3DikiKu4YVkYw48MUjIesKDOaMlwxJ + sk75zDdIlBJZSdsbQsN2e7v2SVFeCnnmuRdk4Jd2kNCK4arECTLBgKYhIc9mY1rErETW+DaWElCLOJJa + oGldyDMFJpkeyRqXokxIreLINEIgNH0V8uCDiBzM4WSNy7FYUD6qEUeq0IL0ThXybDZmwVkLG+Q2ykRW + K47MIOmFD/4W8hokcH+/fgKbfombfpPgxwYLHFnj21hKSK0ij0dHDVSFuWOGWQwOx6Y5qBN9fVloCgh5 + EOhwvGqqUOf1alG7/YWQd4VttztZtpzE4Nyd17BiMF+kfnBQNln4NTHxd7JAMB6zbpV1KqAQWcmSUaQV + caSZbsHlhKwcmCTiw50mrGkkrDhezmOK8kDIKkTI4RhBUX03KT98L+bzaWG3O5fFFMMsmlDxs6iWDtJA + pgYHdYj78sHvvyfkyMHrCJaALKplAzWCzOQZzeBij4WM0uB1BA7KTD3uYsrRLJQ8nmzE6ewQ5q2B1xGs + +FlUywauBzlztIGZ6xVmKwOvI7jcqaGh+vokNgR9jsta8cwVg9cRrPhR0KtcDqnBCsijJNbZqXJDWPa5 + cuDuxj8dZlHNw9yMOJXkj2hrXmDyEMYYEBYou1urgXmYI+Kghj7a8XpVVl/mFTB2vHkFDCGkeQWMd8xK + GPhZRqJPEsJ4s1r/K2AZGMxZGiJVW4cLfKOv3lyi49l8h29sg2Tkuej2v8Fm+wNDbvcV8BObjwAAAABJ + RU5ErkJggg== + + + + + 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 + + + \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fManual.Designer.cs b/Cs_HMI/Project/ViewForm/fManual.Designer.cs new file mode 100644 index 0000000..1187632 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fManual.Designer.cs @@ -0,0 +1,900 @@ +namespace Project.ViewForm +{ + partial class fManual + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.btStart = new arCtl.arLabel(); + this.btRight = new arCtl.arLabel(); + this.btBack = new arCtl.arLabel(); + this.btForward = new arCtl.arLabel(); + this.btLeft = new arCtl.arLabel(); + this.btMarkStop = new System.Windows.Forms.Button(); + this.btchargeOff = new System.Windows.Forms.Button(); + this.btChargeOn = new System.Windows.Forms.Button(); + this.btErrReset = new System.Windows.Forms.Button(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.panel2 = new System.Windows.Forms.Panel(); + this.button1 = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.radpbs2 = new AGVControl.MyRadioButton(); + this.panel9 = new System.Windows.Forms.Panel(); + this.radpbs1 = new AGVControl.MyRadioButton(); + this.panel3 = new System.Windows.Forms.Panel(); + this.radpbs0 = new AGVControl.MyRadioButton(); + this.grpSpeed = new System.Windows.Forms.GroupBox(); + this.radspdh = new AGVControl.MyRadioButton(); + this.panel8 = new System.Windows.Forms.Panel(); + this.radspdm = new AGVControl.MyRadioButton(); + this.panel4 = new System.Windows.Forms.Panel(); + this.radspdl = new AGVControl.MyRadioButton(); + this.grpBunki = new System.Windows.Forms.GroupBox(); + this.radright = new AGVControl.MyRadioButton(); + this.panel7 = new System.Windows.Forms.Panel(); + this.radstrai = new AGVControl.MyRadioButton(); + this.panel5 = new System.Windows.Forms.Panel(); + this.radleft = new AGVControl.MyRadioButton(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.arLabel1 = new arCtl.arLabel(); + this.panel12 = new System.Windows.Forms.Panel(); + this.radbackward = new AGVControl.MyRadioButton(); + this.panel6 = new System.Windows.Forms.Panel(); + this.radforward = new AGVControl.MyRadioButton(); + this.label1 = new System.Windows.Forms.Label(); + this.guideSensor1 = new Narumi.UC.GuideSensor(); + this.tableLayoutPanel1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.grpSpeed.SuspendLayout(); + this.grpBunki.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.Controls.Add(this.btStart, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.btRight, 2, 1); + this.tableLayoutPanel1.Controls.Add(this.btBack, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.btForward, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.btLeft, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.btMarkStop, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.btchargeOff, 2, 2); + this.tableLayoutPanel1.Controls.Add(this.btChargeOn, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.btErrReset, 2, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Left; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 21); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(604, 555); + this.tableLayoutPanel1.TabIndex = 7; + // + // btStart + // + this.btStart.BackColor = System.Drawing.Color.Gray; + this.btStart.BackColor2 = System.Drawing.Color.Black; + this.btStart.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btStart.BorderColor = System.Drawing.Color.Black; + this.btStart.BorderColorOver = System.Drawing.Color.DarkBlue; + this.btStart.BorderSize = new System.Windows.Forms.Padding(1); + this.btStart.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btStart.Cursor = System.Windows.Forms.Cursors.Hand; + this.btStart.Dock = System.Windows.Forms.DockStyle.Fill; + this.btStart.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btStart.ForeColor = System.Drawing.Color.White; + this.btStart.GradientEnable = true; + this.btStart.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btStart.GradientRepeatBG = false; + this.btStart.isButton = true; + this.btStart.Location = new System.Drawing.Point(204, 188); + this.btStart.MouseDownColor = System.Drawing.Color.Yellow; + this.btStart.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btStart.msg = new string[] { + "커버", + "UP"}; + this.btStart.Name = "btStart"; + this.btStart.ProgressBorderColor = System.Drawing.Color.Black; + this.btStart.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btStart.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btStart.ProgressEnable = false; + this.btStart.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btStart.ProgressForeColor = System.Drawing.Color.Black; + this.btStart.ProgressMax = 100F; + this.btStart.ProgressMin = 0F; + this.btStart.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btStart.ProgressValue = 0F; + this.btStart.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btStart.Sign = ""; + this.btStart.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btStart.SignColor = System.Drawing.Color.Yellow; + this.btStart.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btStart.Size = new System.Drawing.Size(195, 179); + this.btStart.TabIndex = 6; + this.btStart.Text = "RUN"; + this.btStart.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btStart.TextShadow = true; + this.btStart.TextVisible = true; + this.btStart.Click += new System.EventHandler(this.arLabel11_Click); + // + // btRight + // + this.btRight.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(23)))), ((int)(((byte)(55)))), ((int)(((byte)(93))))); + this.btRight.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(36)))), ((int)(((byte)(64))))); + this.btRight.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btRight.BorderColor = System.Drawing.Color.Black; + this.btRight.BorderColorOver = System.Drawing.Color.DarkBlue; + this.btRight.BorderSize = new System.Windows.Forms.Padding(1); + this.btRight.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btRight.Cursor = System.Windows.Forms.Cursors.Hand; + this.btRight.Dock = System.Windows.Forms.DockStyle.Fill; + this.btRight.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btRight.ForeColor = System.Drawing.Color.White; + this.btRight.GradientEnable = true; + this.btRight.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btRight.GradientRepeatBG = false; + this.btRight.isButton = true; + this.btRight.Location = new System.Drawing.Point(405, 188); + this.btRight.MouseDownColor = System.Drawing.Color.Yellow; + this.btRight.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btRight.msg = null; + this.btRight.Name = "btRight"; + this.btRight.ProgressBorderColor = System.Drawing.Color.Black; + this.btRight.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btRight.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btRight.ProgressEnable = false; + this.btRight.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btRight.ProgressForeColor = System.Drawing.Color.Black; + this.btRight.ProgressMax = 100F; + this.btRight.ProgressMin = 0F; + this.btRight.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btRight.ProgressValue = 0F; + this.btRight.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btRight.Sign = ""; + this.btRight.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btRight.SignColor = System.Drawing.Color.Yellow; + this.btRight.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btRight.Size = new System.Drawing.Size(196, 179); + this.btRight.TabIndex = 0; + this.btRight.Text = "좌회전"; + this.btRight.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btRight.TextShadow = true; + this.btRight.TextVisible = true; + this.btRight.Click += new System.EventHandler(this.arLabel4_Click); + // + // btBack + // + this.btBack.AccessibleDescription = ""; + this.btBack.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(23)))), ((int)(((byte)(55)))), ((int)(((byte)(93))))); + this.btBack.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(36)))), ((int)(((byte)(64))))); + this.btBack.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btBack.BorderColor = System.Drawing.Color.Black; + this.btBack.BorderColorOver = System.Drawing.Color.DarkBlue; + this.btBack.BorderSize = new System.Windows.Forms.Padding(1); + this.btBack.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btBack.Cursor = System.Windows.Forms.Cursors.Hand; + this.btBack.Dock = System.Windows.Forms.DockStyle.Fill; + this.btBack.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btBack.ForeColor = System.Drawing.Color.White; + this.btBack.GradientEnable = true; + this.btBack.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btBack.GradientRepeatBG = false; + this.btBack.isButton = true; + this.btBack.Location = new System.Drawing.Point(204, 3); + this.btBack.MouseDownColor = System.Drawing.Color.Yellow; + this.btBack.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btBack.msg = null; + this.btBack.Name = "btBack"; + this.btBack.ProgressBorderColor = System.Drawing.Color.Black; + this.btBack.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btBack.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btBack.ProgressEnable = false; + this.btBack.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btBack.ProgressForeColor = System.Drawing.Color.Black; + this.btBack.ProgressMax = 100F; + this.btBack.ProgressMin = 0F; + this.btBack.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btBack.ProgressValue = 0F; + this.btBack.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btBack.Sign = ""; + this.btBack.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btBack.SignColor = System.Drawing.Color.Yellow; + this.btBack.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btBack.Size = new System.Drawing.Size(195, 179); + this.btBack.TabIndex = 0; + this.btBack.Text = "후진"; + this.btBack.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btBack.TextShadow = true; + this.btBack.TextVisible = true; + this.btBack.Click += new System.EventHandler(this.arLabel1_Click); + // + // btForward + // + this.btForward.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(23)))), ((int)(((byte)(55)))), ((int)(((byte)(93))))); + this.btForward.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(36)))), ((int)(((byte)(64))))); + this.btForward.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btForward.BorderColor = System.Drawing.Color.Black; + this.btForward.BorderColorOver = System.Drawing.Color.DarkBlue; + this.btForward.BorderSize = new System.Windows.Forms.Padding(1); + this.btForward.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btForward.Cursor = System.Windows.Forms.Cursors.Hand; + this.btForward.Dock = System.Windows.Forms.DockStyle.Fill; + this.btForward.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btForward.ForeColor = System.Drawing.Color.White; + this.btForward.GradientEnable = true; + this.btForward.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btForward.GradientRepeatBG = false; + this.btForward.isButton = true; + this.btForward.Location = new System.Drawing.Point(204, 373); + this.btForward.MouseDownColor = System.Drawing.Color.Yellow; + this.btForward.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btForward.msg = null; + this.btForward.Name = "btForward"; + this.btForward.ProgressBorderColor = System.Drawing.Color.Black; + this.btForward.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btForward.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btForward.ProgressEnable = false; + this.btForward.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btForward.ProgressForeColor = System.Drawing.Color.Black; + this.btForward.ProgressMax = 100F; + this.btForward.ProgressMin = 0F; + this.btForward.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btForward.ProgressValue = 0F; + this.btForward.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btForward.Sign = ""; + this.btForward.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btForward.SignColor = System.Drawing.Color.Yellow; + this.btForward.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btForward.Size = new System.Drawing.Size(195, 179); + this.btForward.TabIndex = 0; + this.btForward.Text = "전진"; + this.btForward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btForward.TextShadow = true; + this.btForward.TextVisible = true; + this.btForward.Click += new System.EventHandler(this.arLabel2_Click); + // + // btLeft + // + this.btLeft.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(23)))), ((int)(((byte)(55)))), ((int)(((byte)(93))))); + this.btLeft.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(36)))), ((int)(((byte)(64))))); + this.btLeft.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btLeft.BorderColor = System.Drawing.Color.Black; + this.btLeft.BorderColorOver = System.Drawing.Color.DarkBlue; + this.btLeft.BorderSize = new System.Windows.Forms.Padding(1); + this.btLeft.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btLeft.Cursor = System.Windows.Forms.Cursors.Hand; + this.btLeft.Dock = System.Windows.Forms.DockStyle.Fill; + this.btLeft.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btLeft.ForeColor = System.Drawing.Color.White; + this.btLeft.GradientEnable = true; + this.btLeft.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btLeft.GradientRepeatBG = false; + this.btLeft.isButton = true; + this.btLeft.Location = new System.Drawing.Point(3, 188); + this.btLeft.MouseDownColor = System.Drawing.Color.Yellow; + this.btLeft.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btLeft.msg = null; + this.btLeft.Name = "btLeft"; + this.btLeft.ProgressBorderColor = System.Drawing.Color.Black; + this.btLeft.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btLeft.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btLeft.ProgressEnable = false; + this.btLeft.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btLeft.ProgressForeColor = System.Drawing.Color.Black; + this.btLeft.ProgressMax = 100F; + this.btLeft.ProgressMin = 0F; + this.btLeft.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btLeft.ProgressValue = 0F; + this.btLeft.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btLeft.Sign = ""; + this.btLeft.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btLeft.SignColor = System.Drawing.Color.Yellow; + this.btLeft.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btLeft.Size = new System.Drawing.Size(195, 179); + this.btLeft.TabIndex = 0; + this.btLeft.Text = "우회전"; + this.btLeft.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btLeft.TextShadow = true; + this.btLeft.TextVisible = true; + this.btLeft.Click += new System.EventHandler(this.arLabel3_Click); + // + // btMarkStop + // + this.btMarkStop.Dock = System.Windows.Forms.DockStyle.Fill; + this.btMarkStop.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btMarkStop.Location = new System.Drawing.Point(3, 3); + this.btMarkStop.Name = "btMarkStop"; + this.btMarkStop.Size = new System.Drawing.Size(195, 179); + this.btMarkStop.TabIndex = 7; + this.btMarkStop.Text = "마크정지"; + this.btMarkStop.UseVisualStyleBackColor = true; + this.btMarkStop.Click += new System.EventHandler(this.button1_Click); + // + // btchargeOff + // + this.btchargeOff.Dock = System.Windows.Forms.DockStyle.Fill; + this.btchargeOff.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btchargeOff.Location = new System.Drawing.Point(405, 373); + this.btchargeOff.Name = "btchargeOff"; + this.btchargeOff.Size = new System.Drawing.Size(196, 179); + this.btchargeOff.TabIndex = 8; + this.btchargeOff.Text = "충전해제"; + this.btchargeOff.UseVisualStyleBackColor = true; + this.btchargeOff.Click += new System.EventHandler(this.btchargeOff_Click); + // + // btChargeOn + // + this.btChargeOn.Dock = System.Windows.Forms.DockStyle.Fill; + this.btChargeOn.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btChargeOn.Location = new System.Drawing.Point(3, 373); + this.btChargeOn.Name = "btChargeOn"; + this.btChargeOn.Size = new System.Drawing.Size(195, 179); + this.btChargeOn.TabIndex = 9; + this.btChargeOn.Text = "충전"; + this.btChargeOn.UseVisualStyleBackColor = true; + this.btChargeOn.Click += new System.EventHandler(this.btChargeOn_Click); + // + // btErrReset + // + this.btErrReset.Dock = System.Windows.Forms.DockStyle.Fill; + this.btErrReset.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btErrReset.Location = new System.Drawing.Point(405, 3); + this.btErrReset.Name = "btErrReset"; + this.btErrReset.Size = new System.Drawing.Size(196, 179); + this.btErrReset.TabIndex = 10; + this.btErrReset.Text = "오류소거"; + this.btErrReset.UseVisualStyleBackColor = true; + this.btErrReset.Click += new System.EventHandler(this.button3_Click); + // + // timer1 + // + this.timer1.Interval = 250; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // panel2 + // + this.panel2.Controls.Add(this.button1); + this.panel2.Controls.Add(this.groupBox1); + this.panel2.Controls.Add(this.grpSpeed); + this.panel2.Controls.Add(this.grpBunki); + this.panel2.Controls.Add(this.groupBox2); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(607, 21); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(404, 517); + this.panel2.TabIndex = 9; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint); + // + // button1 + // + this.button1.Dock = System.Windows.Forms.DockStyle.Fill; + this.button1.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.button1.Location = new System.Drawing.Point(0, 380); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(404, 137); + this.button1.TabIndex = 10; + this.button1.Text = "설정 적용"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click_2); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.radpbs2); + this.groupBox1.Controls.Add(this.panel9); + this.groupBox1.Controls.Add(this.radpbs1); + this.groupBox1.Controls.Add(this.panel3); + this.groupBox1.Controls.Add(this.radpbs0); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox1.Location = new System.Drawing.Point(0, 285); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Padding = new System.Windows.Forms.Padding(10, 5, 5, 10); + this.groupBox1.Size = new System.Drawing.Size(404, 95); + this.groupBox1.TabIndex = 9; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "근접센서(PBS)"; + // + // radpbs2 + // + this.radpbs2.BackColor = System.Drawing.Color.WhiteSmoke; + this.radpbs2.Bordercolor = System.Drawing.Color.DimGray; + this.radpbs2.BorderRadius = 7; + this.radpbs2.BorderSize = 2; + this.radpbs2.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radpbs2.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radpbs2.CheckWidth = 30; + this.radpbs2.Dock = System.Windows.Forms.DockStyle.Left; + this.radpbs2.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radpbs2.Location = new System.Drawing.Point(278, 19); + this.radpbs2.Name = "radpbs2"; + this.radpbs2.Size = new System.Drawing.Size(119, 66); + this.radpbs2.TabIndex = 10; + this.radpbs2.Text = "On(2)"; + this.radpbs2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radpbs2.UseVisualStyleBackColor = false; + // + // panel9 + // + this.panel9.Dock = System.Windows.Forms.DockStyle.Left; + this.panel9.Location = new System.Drawing.Point(263, 19); + this.panel9.Name = "panel9"; + this.panel9.Size = new System.Drawing.Size(15, 66); + this.panel9.TabIndex = 12; + // + // radpbs1 + // + this.radpbs1.BackColor = System.Drawing.Color.WhiteSmoke; + this.radpbs1.Bordercolor = System.Drawing.Color.DimGray; + this.radpbs1.BorderRadius = 7; + this.radpbs1.BorderSize = 2; + this.radpbs1.Checked = true; + this.radpbs1.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radpbs1.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radpbs1.CheckWidth = 30; + this.radpbs1.Dock = System.Windows.Forms.DockStyle.Left; + this.radpbs1.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radpbs1.ForeColor = System.Drawing.Color.Blue; + this.radpbs1.Location = new System.Drawing.Point(144, 19); + this.radpbs1.Name = "radpbs1"; + this.radpbs1.Size = new System.Drawing.Size(119, 66); + this.radpbs1.TabIndex = 9; + this.radpbs1.TabStop = true; + this.radpbs1.Text = "On(1)"; + this.radpbs1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radpbs1.UseVisualStyleBackColor = false; + // + // panel3 + // + this.panel3.Dock = System.Windows.Forms.DockStyle.Left; + this.panel3.Location = new System.Drawing.Point(129, 19); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(15, 66); + this.panel3.TabIndex = 11; + // + // radpbs0 + // + this.radpbs0.BackColor = System.Drawing.Color.WhiteSmoke; + this.radpbs0.Bordercolor = System.Drawing.Color.DimGray; + this.radpbs0.BorderRadius = 7; + this.radpbs0.BorderSize = 2; + this.radpbs0.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radpbs0.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radpbs0.CheckWidth = 30; + this.radpbs0.Dock = System.Windows.Forms.DockStyle.Left; + this.radpbs0.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radpbs0.Location = new System.Drawing.Point(10, 19); + this.radpbs0.Name = "radpbs0"; + this.radpbs0.Size = new System.Drawing.Size(119, 66); + this.radpbs0.TabIndex = 8; + this.radpbs0.Text = "Off(0)"; + this.radpbs0.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radpbs0.UseVisualStyleBackColor = false; + // + // grpSpeed + // + this.grpSpeed.Controls.Add(this.radspdh); + this.grpSpeed.Controls.Add(this.panel8); + this.grpSpeed.Controls.Add(this.radspdm); + this.grpSpeed.Controls.Add(this.panel4); + this.grpSpeed.Controls.Add(this.radspdl); + this.grpSpeed.Dock = System.Windows.Forms.DockStyle.Top; + this.grpSpeed.Location = new System.Drawing.Point(0, 190); + this.grpSpeed.Name = "grpSpeed"; + this.grpSpeed.Padding = new System.Windows.Forms.Padding(10, 5, 5, 10); + this.grpSpeed.Size = new System.Drawing.Size(404, 95); + this.grpSpeed.TabIndex = 0; + this.grpSpeed.TabStop = false; + this.grpSpeed.Text = "속도"; + // + // radspdh + // + this.radspdh.BackColor = System.Drawing.Color.WhiteSmoke; + this.radspdh.Bordercolor = System.Drawing.Color.DimGray; + this.radspdh.BorderRadius = 7; + this.radspdh.BorderSize = 2; + this.radspdh.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radspdh.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radspdh.CheckWidth = 30; + this.radspdh.Dock = System.Windows.Forms.DockStyle.Left; + this.radspdh.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radspdh.Location = new System.Drawing.Point(278, 19); + this.radspdh.Name = "radspdh"; + this.radspdh.Size = new System.Drawing.Size(119, 66); + this.radspdh.TabIndex = 2; + this.radspdh.Text = "고속"; + this.radspdh.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radspdh.UseVisualStyleBackColor = false; + // + // panel8 + // + this.panel8.Dock = System.Windows.Forms.DockStyle.Left; + this.panel8.Location = new System.Drawing.Point(263, 19); + this.panel8.Name = "panel8"; + this.panel8.Size = new System.Drawing.Size(15, 66); + this.panel8.TabIndex = 13; + // + // radspdm + // + this.radspdm.BackColor = System.Drawing.Color.WhiteSmoke; + this.radspdm.Bordercolor = System.Drawing.Color.DimGray; + this.radspdm.BorderRadius = 7; + this.radspdm.BorderSize = 2; + this.radspdm.Checked = true; + this.radspdm.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radspdm.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radspdm.CheckWidth = 30; + this.radspdm.Dock = System.Windows.Forms.DockStyle.Left; + this.radspdm.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radspdm.ForeColor = System.Drawing.Color.Blue; + this.radspdm.Location = new System.Drawing.Point(144, 19); + this.radspdm.Name = "radspdm"; + this.radspdm.Size = new System.Drawing.Size(119, 66); + this.radspdm.TabIndex = 1; + this.radspdm.TabStop = true; + this.radspdm.Text = "중속"; + this.radspdm.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radspdm.UseVisualStyleBackColor = false; + // + // panel4 + // + this.panel4.Dock = System.Windows.Forms.DockStyle.Left; + this.panel4.Location = new System.Drawing.Point(129, 19); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(15, 66); + this.panel4.TabIndex = 12; + // + // radspdl + // + this.radspdl.BackColor = System.Drawing.Color.WhiteSmoke; + this.radspdl.Bordercolor = System.Drawing.Color.DimGray; + this.radspdl.BorderRadius = 7; + this.radspdl.BorderSize = 2; + this.radspdl.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radspdl.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radspdl.CheckWidth = 30; + this.radspdl.Dock = System.Windows.Forms.DockStyle.Left; + this.radspdl.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radspdl.Location = new System.Drawing.Point(10, 19); + this.radspdl.Name = "radspdl"; + this.radspdl.Size = new System.Drawing.Size(119, 66); + this.radspdl.TabIndex = 0; + this.radspdl.Text = "저속"; + this.radspdl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radspdl.UseVisualStyleBackColor = false; + // + // grpBunki + // + this.grpBunki.Controls.Add(this.radright); + this.grpBunki.Controls.Add(this.panel7); + this.grpBunki.Controls.Add(this.radstrai); + this.grpBunki.Controls.Add(this.panel5); + this.grpBunki.Controls.Add(this.radleft); + this.grpBunki.Dock = System.Windows.Forms.DockStyle.Top; + this.grpBunki.Location = new System.Drawing.Point(0, 95); + this.grpBunki.Name = "grpBunki"; + this.grpBunki.Padding = new System.Windows.Forms.Padding(10, 5, 5, 10); + this.grpBunki.Size = new System.Drawing.Size(404, 95); + this.grpBunki.TabIndex = 1; + this.grpBunki.TabStop = false; + this.grpBunki.Text = "분기"; + // + // radright + // + this.radright.BackColor = System.Drawing.Color.WhiteSmoke; + this.radright.Bordercolor = System.Drawing.Color.DimGray; + this.radright.BorderRadius = 7; + this.radright.BorderSize = 2; + this.radright.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radright.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radright.CheckWidth = 30; + this.radright.Dock = System.Windows.Forms.DockStyle.Left; + this.radright.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radright.Location = new System.Drawing.Point(278, 19); + this.radright.Name = "radright"; + this.radright.Size = new System.Drawing.Size(119, 66); + this.radright.TabIndex = 4; + this.radright.Text = "우측"; + this.radright.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radright.UseVisualStyleBackColor = false; + // + // panel7 + // + this.panel7.Dock = System.Windows.Forms.DockStyle.Left; + this.panel7.Location = new System.Drawing.Point(263, 19); + this.panel7.Name = "panel7"; + this.panel7.Size = new System.Drawing.Size(15, 66); + this.panel7.TabIndex = 13; + // + // radstrai + // + this.radstrai.BackColor = System.Drawing.Color.WhiteSmoke; + this.radstrai.Bordercolor = System.Drawing.Color.DimGray; + this.radstrai.BorderRadius = 7; + this.radstrai.BorderSize = 2; + this.radstrai.Checked = true; + this.radstrai.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radstrai.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radstrai.CheckWidth = 30; + this.radstrai.Dock = System.Windows.Forms.DockStyle.Left; + this.radstrai.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radstrai.ForeColor = System.Drawing.Color.Blue; + this.radstrai.Location = new System.Drawing.Point(144, 19); + this.radstrai.Name = "radstrai"; + this.radstrai.Size = new System.Drawing.Size(119, 66); + this.radstrai.TabIndex = 3; + this.radstrai.TabStop = true; + this.radstrai.Text = "직진"; + this.radstrai.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radstrai.UseVisualStyleBackColor = false; + // + // panel5 + // + this.panel5.Dock = System.Windows.Forms.DockStyle.Left; + this.panel5.Location = new System.Drawing.Point(129, 19); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(15, 66); + this.panel5.TabIndex = 12; + // + // radleft + // + this.radleft.BackColor = System.Drawing.Color.WhiteSmoke; + this.radleft.Bordercolor = System.Drawing.Color.DimGray; + this.radleft.BorderRadius = 7; + this.radleft.BorderSize = 2; + this.radleft.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radleft.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radleft.CheckWidth = 30; + this.radleft.Dock = System.Windows.Forms.DockStyle.Left; + this.radleft.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radleft.Location = new System.Drawing.Point(10, 19); + this.radleft.Name = "radleft"; + this.radleft.Size = new System.Drawing.Size(119, 66); + this.radleft.TabIndex = 5; + this.radleft.Text = "좌측"; + this.radleft.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radleft.UseVisualStyleBackColor = false; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.arLabel1); + this.groupBox2.Controls.Add(this.panel12); + this.groupBox2.Controls.Add(this.radbackward); + this.groupBox2.Controls.Add(this.panel6); + this.groupBox2.Controls.Add(this.radforward); + this.groupBox2.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox2.Location = new System.Drawing.Point(0, 0); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Padding = new System.Windows.Forms.Padding(10, 5, 5, 10); + this.groupBox2.Size = new System.Drawing.Size(404, 95); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "방향"; + // + // arLabel1 + // + this.arLabel1.BackColor = System.Drawing.Color.Pink; + this.arLabel1.BackColor2 = System.Drawing.Color.Tomato; + this.arLabel1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel1.BorderColor = System.Drawing.Color.Black; + this.arLabel1.BorderColorOver = System.Drawing.Color.DarkBlue; + this.arLabel1.BorderSize = new System.Windows.Forms.Padding(1); + this.arLabel1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel1.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.arLabel1.Font = new System.Drawing.Font("맑은 고딕", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.arLabel1.ForeColor = System.Drawing.Color.White; + this.arLabel1.GradientEnable = true; + this.arLabel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel1.GradientRepeatBG = false; + this.arLabel1.isButton = true; + this.arLabel1.Location = new System.Drawing.Point(278, 19); + this.arLabel1.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel1.msg = new string[] { + "커버", + "UP"}; + this.arLabel1.Name = "arLabel1"; + this.arLabel1.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel1.ProgressEnable = false; + this.arLabel1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel1.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel1.ProgressMax = 100F; + this.arLabel1.ProgressMin = 0F; + this.arLabel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel1.ProgressValue = 0F; + this.arLabel1.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel1.Sign = ""; + this.arLabel1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel1.SignColor = System.Drawing.Color.Yellow; + this.arLabel1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel1.Size = new System.Drawing.Size(121, 66); + this.arLabel1.TabIndex = 15; + this.arLabel1.Text = "주행속도"; + this.arLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel1.TextShadow = true; + this.arLabel1.TextVisible = true; + this.arLabel1.Click += new System.EventHandler(this.arLabel1_Click_1); + // + // panel12 + // + this.panel12.Dock = System.Windows.Forms.DockStyle.Left; + this.panel12.Location = new System.Drawing.Point(263, 19); + this.panel12.Name = "panel12"; + this.panel12.Size = new System.Drawing.Size(15, 66); + this.panel12.TabIndex = 14; + // + // radbackward + // + this.radbackward.BackColor = System.Drawing.Color.WhiteSmoke; + this.radbackward.Bordercolor = System.Drawing.Color.DimGray; + this.radbackward.BorderRadius = 7; + this.radbackward.BorderSize = 2; + this.radbackward.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radbackward.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radbackward.CheckWidth = 30; + this.radbackward.Dock = System.Windows.Forms.DockStyle.Left; + this.radbackward.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radbackward.Location = new System.Drawing.Point(144, 19); + this.radbackward.Name = "radbackward"; + this.radbackward.Size = new System.Drawing.Size(119, 66); + this.radbackward.TabIndex = 6; + this.radbackward.Text = "후진"; + this.radbackward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radbackward.UseVisualStyleBackColor = false; + // + // panel6 + // + this.panel6.Dock = System.Windows.Forms.DockStyle.Left; + this.panel6.Location = new System.Drawing.Point(129, 19); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(15, 66); + this.panel6.TabIndex = 12; + // + // radforward + // + this.radforward.BackColor = System.Drawing.Color.WhiteSmoke; + this.radforward.Bordercolor = System.Drawing.Color.DimGray; + this.radforward.BorderRadius = 7; + this.radforward.BorderSize = 2; + this.radforward.Checked = true; + this.radforward.CheckOffColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.radforward.CheckOnColor = System.Drawing.Color.LimeGreen; + this.radforward.CheckWidth = 30; + this.radforward.Dock = System.Windows.Forms.DockStyle.Left; + this.radforward.Font = new System.Drawing.Font("맑은 고딕", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.radforward.ForeColor = System.Drawing.Color.Blue; + this.radforward.Location = new System.Drawing.Point(10, 19); + this.radforward.Name = "radforward"; + this.radforward.Size = new System.Drawing.Size(119, 66); + this.radforward.TabIndex = 7; + this.radforward.TabStop = true; + this.radforward.Text = "전진"; + this.radforward.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.radforward.UseVisualStyleBackColor = false; + // + // label1 + // + this.label1.BackColor = System.Drawing.Color.Blue; + this.label1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.label1.Font = new System.Drawing.Font("맑은 고딕", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(607, 538); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 3, 0, 3); + this.label1.Size = new System.Drawing.Size(404, 38); + this.label1.TabIndex = 9; + this.label1.Text = "----------"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // guideSensor1 + // + this.guideSensor1.Dock = System.Windows.Forms.DockStyle.Top; + this.guideSensor1.LMark = false; + this.guideSensor1.Location = new System.Drawing.Point(3, 3); + this.guideSensor1.Name = "guideSensor1"; + this.guideSensor1.RMark = false; + this.guideSensor1.SensorValue = 0; + this.guideSensor1.Size = new System.Drawing.Size(1008, 18); + this.guideSensor1.TabIndex = 8; + this.guideSensor1.Text = "guideSensor1"; + // + // fManual + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.SlateGray; + this.ClientSize = new System.Drawing.Size(1014, 579); + this.Controls.Add(this.panel2); + this.Controls.Add(this.label1); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.guideSensor1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "fManual"; + this.Padding = new System.Windows.Forms.Padding(3); + this.Text = "fManual"; + this.Load += new System.EventHandler(this.fManual_Load); + this.VisibleChanged += new System.EventHandler(this.fManual_VisibleChanged); + this.tableLayoutPanel1.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.grpSpeed.ResumeLayout(false); + this.grpBunki.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private arCtl.arLabel btBack; + private arCtl.arLabel btForward; + private arCtl.arLabel btLeft; + private arCtl.arLabel btRight; + private arCtl.arLabel btStart; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Button btMarkStop; + private System.Windows.Forms.Button btchargeOff; + private System.Windows.Forms.Button btChargeOn; + private Narumi.UC.GuideSensor guideSensor1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btErrReset; + private System.Windows.Forms.GroupBox grpSpeed; + private System.Windows.Forms.GroupBox grpBunki; + private System.Windows.Forms.GroupBox groupBox2; + private AGVControl.MyRadioButton radspdl; + private AGVControl.MyRadioButton radspdh; + private AGVControl.MyRadioButton radspdm; + private AGVControl.MyRadioButton radleft; + private AGVControl.MyRadioButton radright; + private AGVControl.MyRadioButton radstrai; + private AGVControl.MyRadioButton radbackward; + private AGVControl.MyRadioButton radforward; + private AGVControl.MyRadioButton radpbs0; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.GroupBox groupBox1; + private AGVControl.MyRadioButton radpbs1; + private AGVControl.MyRadioButton radpbs2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Panel panel9; + private System.Windows.Forms.Panel panel8; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Panel panel7; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Button button1; + private arCtl.arLabel arLabel1; + private System.Windows.Forms.Panel panel12; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/ViewForm/fManual.cs b/Cs_HMI/Project/ViewForm/fManual.cs new file mode 100644 index 0000000..94513ce --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fManual.cs @@ -0,0 +1,372 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using arDev; +using COMM; + +namespace Project.ViewForm +{ + public partial class fManual : Form + { + public fManual() + { + InitializeComponent(); + this.FormClosed += FIO_FormClosed; + } + + private void fManual_Load(object sender, EventArgs e) + { + if (PUB.AGV.data.Direction == 'F') radforward.Checked = true; + else radbackward.Checked = false; + + //if (PUB.AGV.data.Sts == 'L') radleft.Checked = true; + //else if (PUB.AGV.data.Sts == 'R') radright.Checked = true; + //else + radstrai.Checked = true; + + if (PUB.AGV.data.Speed == 'H') radspdh.Checked = true; + else if (PUB.AGV.data.Speed == 'L') radspdl.Checked = true; + else radspdm.Checked = true; + + this.timer1.Start(); + } + private void FIO_FormClosed(object sender, FormClosedEventArgs e) + { + timer1.Stop(); + } + + #region "Z축 커버" + + private void arLabel10_Click(object sender, EventArgs e) + { + + } + + + + private void arLabel8_Click(object sender, EventArgs e) + { + + + } + + private void arLabel7_Click(object sender, EventArgs e) + { + + } + #endregion + + #region "AGV 수동 이동" + private void arLabel1_Click(object sender, EventArgs e) + { + //후진 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) + { + Util.MsgE("자동 충전 중입니다\n충전을 해제 하세요"); + return; + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + { + Util.MsgE("수동 충전 중입니다\b충전을 해제 하세요"); + return; + } + if (PUB.CheckManualChargeMode() == false) return; + arDev.Narumi.Speed spd = arDev.Narumi.Speed.Low; + if (radspdh.Checked) spd = arDev.Narumi.Speed.High; + else if (radspdl.Checked) spd = arDev.Narumi.Speed.Mid; + arDev.Narumi.Sensor ss = arDev.Narumi.Sensor.PBSOff; + if (radpbs0.Checked) ss = arDev.Narumi.Sensor.PBSOn; + PUB.AGV.AGVMoveManual(arDev.Narumi.ManulOpt.BS, spd, ss); + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void arLabel2_Click(object sender, EventArgs e) + { + //전진 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) + { + Util.MsgE("자동 충전 중입니다\n충전을 해제 하세요"); + return; + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + { + Util.MsgE("수동 충전 중입니다\b충전을 해제 하세요"); + return; + } + if (PUB.CheckManualChargeMode() == false) return; + arDev.Narumi.Speed spd = arDev.Narumi.Speed.Low; + if (radspdh.Checked) spd = arDev.Narumi.Speed.High; + else if (radspdl.Checked) spd = arDev.Narumi.Speed.Mid; + arDev.Narumi.Sensor ss = arDev.Narumi.Sensor.PBSOff; + if (radpbs0.Checked) ss = arDev.Narumi.Sensor.PBSOn; + PUB.AGV.AGVMoveManual(arDev.Narumi.ManulOpt.FS, spd, ss); + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void arLabel3_Click(object sender, EventArgs e) + { + //우회전 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) + { + Util.MsgE("자동 충전 중입니다\n충전을 해제 하세요"); + return; + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + { + Util.MsgE("수동 충전 중입니다\b충전을 해제 하세요"); + return; + } + if (PUB.CheckManualChargeMode() == false) return; + arDev.Narumi.Speed spd = arDev.Narumi.Speed.Low; + if (radspdh.Checked) spd = arDev.Narumi.Speed.High; + else if (radspdl.Checked) spd = arDev.Narumi.Speed.Mid; + arDev.Narumi.Sensor ss = arDev.Narumi.Sensor.PBSOff; + if (radpbs0.Checked) ss = arDev.Narumi.Sensor.PBSOn; + PUB.AGV.AGVMoveManual(arDev.Narumi.ManulOpt.RT, spd, ss); + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void arLabel4_Click(object sender, EventArgs e) + { + //좌회전 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) + { + Util.MsgE("자동 충전 중입니다\n충전을 해제 하세요"); + return; + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + { + Util.MsgE("수동 충전 중입니다\b충전을 해제 하세요"); + return; + } + if (PUB.CheckManualChargeMode() == false) return; + arDev.Narumi.Speed spd = arDev.Narumi.Speed.Low; + if (radspdh.Checked) spd = arDev.Narumi.Speed.High; + else if (radspdl.Checked) spd = arDev.Narumi.Speed.Mid; + arDev.Narumi.Sensor ss = arDev.Narumi.Sensor.PBSOff; + if (radpbs0.Checked) ss = arDev.Narumi.Sensor.PBSOn; + PUB.AGV.AGVMoveManual(arDev.Narumi.ManulOpt.LT, spd, ss); + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + } + + private void arLabel11_Click(object sender, EventArgs e) + { + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA]) + { + Util.MsgE("자동 충전 중입니다\n충전을 해제 하세요"); + return; + } + else if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + { + Util.MsgE("수동 충전 중입니다\b충전을 해제 하세요"); + return; + } + if (PUB.CheckManualChargeMode() == false) return; + PUB.sm.SetNewStep(StateMachine.eSMStep.IDLE); + if (PUB.AGV.system1.agv_run == false && PUB.AGV.system1.agv_run_manual == false) + { + var dlg = Util.MsgQ("자동 진행을 시작할까요?\n우측 옵션을 확인 하세요"); + if (dlg != DialogResult.Yes) return; + var opt = makeopt(); + PUB.AGV.AGVMoveSet(opt); + PUB.AGV.AGVMoveRun(); + } + else + { + PUB.AGV.AGVMoveStop("fmanual arlabel11_Clcik", arDev.Narumi.eStopOpt.Stop); + } + + } + #endregion + + + bool tmrun = false; + private void timer1_Tick(object sender, EventArgs e) + { + if (this.Visible == false) return; + if (tmrun == true) return; + tmrun = true; + + //충전중이면 수동버튼을 누를수없게한다 + if (VAR.BOOL[eVarBool.FLAG_CHARGEONA] || VAR.BOOL[eVarBool.FLAG_CHARGEONM]) btLeft.Enabled = false; + else btLeft.Enabled = true; + + btRight.Enabled = btLeft.Enabled; + btStart.Enabled = btLeft.Enabled; + btBack.Enabled = btLeft.Enabled; + btForward.Enabled = btLeft.Enabled; + + + + //상태메세지 + label1.Text = VAR.STR[eVarString.StatusMessage]; + + //마크정보 + guideSensor1.SensorValue = PUB.AGV.data.guidesensor; + guideSensor1.LMark = PUB.AGV.signal.mark_sensor_1; + guideSensor1.RMark = PUB.AGV.signal.mark_sensor_2; + guideSensor1.Invalidate(); + + if (PUB.AGV.system1.agv_run || PUB.AGV.system1.agv_run_manual) + { + btStart.Text = "동작\n멈춤"; + btStart.BackColor = Color.Tomato; + btStart.BackColor2 = Color.Orange; + } + else + { + btStart.Text = "자돟\n진행"; + btStart.BackColor = Color.DimGray; + btStart.BackColor2 = Color.Gray; + } + + + //모터전원상태에따라서 배경색상을 변경해준다. + //var Mot_Dir_Backward = PUB.AGV.data.Direction == 'B';// PUB.flag.get(EFlag.FLAG_DIR_CW);// PUB.flag.get(EFlag.FLAG_DIR_CW); + + //if (Mot_Dir_Backward == true) + //{ + // btBack.BackColor = Color.Lime; + // btBack.BackColor2 = Color.Green; + + // btForward.BackColor = Color.FromArgb(23, 55, 93); + // btForward.BackColor2 = Color.FromArgb(12, 36, 64); + //} + //else + //{ + // btForward.BackColor = Color.Lime; + // btForward.BackColor2 = Color.Green; + + // btBack.BackColor = Color.FromArgb(23, 55, 93); + // btBack.BackColor2 = Color.FromArgb(12, 36, 64); + //} + + tmrun = false; + } + + + + + private void button1_Click(object sender, EventArgs e) + { + PUB.AGV.AGVMoveStop("fmanual button1_click", arDev.Narumi.eStopOpt.MarkStop); + //VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = true; + + + } + + private void fManual_VisibleChanged(object sender, EventArgs e) + { + this.timer1.Enabled = this.Visible; + if (timer1.Enabled) timer1.Start(); + else timer1.Stop(); + } + + private void button3_Click(object sender, EventArgs e) + { + PUB.AGV.AGVErrorReset(); + } + + private void panel2_Paint(object sender, PaintEventArgs e) + { + + } + + arDev.Narumi.BunkiData makeopt() + { + var p = new arDev.Narumi.BunkiData(); + if (radbackward.Checked) p.Direction = arDev.Narumi.eMoveDir.Backward; + else p.Direction = arDev.Narumi.eMoveDir.Forward; + + if (radleft.Checked) p.Bunki = arDev.Narumi.eBunki.Left; + else if (radright.Checked) p.Bunki = arDev.Narumi.eBunki.Right; + else p.Bunki = arDev.Narumi.eBunki.Strate; + + if (radspdh.Checked) p.Speed = arDev.Narumi.eMoveSpd.High; + else if (radspdl.Checked) p.Speed = arDev.Narumi.eMoveSpd.Low; + else p.Speed = arDev.Narumi.eMoveSpd.Middle; + + if (radpbs1.Checked) p.PBSSensor = 2; + else if (radpbs2.Checked) p.PBSSensor = 2; + else p.PBSSensor = 0; + return p; + } + + private void btchargeOff_Click(object sender, EventArgs e) + { + if (Util.MsgQ("충전 해제 명령을 전송 할까요?") == DialogResult.Yes) + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); + } + + private void btChargeOn_Click(object sender, EventArgs e) + { + if (PUB.AGV.signal.mark_sensor == false) + { + Util.MsgE("마크센서가 확인되지 않아 충전을 시작할 수 없습니다"); + return; + } + var dlg = Util.MsgQ("충전 시작 명령을 전송 할까요?"); + if (dlg != DialogResult.Yes) return; + PUB.AGV.AGVCharge(PUB.setting.ChargerID, true); + } + + arDev.Narumi.BunkiData bunkiopt = null; + private void button1_Click_2(object sender, EventArgs e) + { + bunkiopt = makeopt(); + PUB.AGV.AGVMoveSet(bunkiopt); + PUB.log.Add($"사용자 설정 : {bunkiopt}"); + if (PUB.DriveSpeed) + { + if (PUB.AGV.AGVCommand("SSH", PUB.setting.SPD_H.ToString("0000")) == true) + PUB.DriveSpeed = false; + } + + } + + private void button2_Click(object sender, EventArgs e) + { + PUB.AGV.AGVCommand("SCK", "0010"); + } + + private void button2_Click_1(object sender, EventArgs e) + { + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Stop); + } + + private void button3_Click_1(object sender, EventArgs e) + { + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Up); + } + + private void button4_Click_1(object sender, EventArgs e) + { + PUB.PLC.ZMot(arDev.FakePLC.ZMotDirection.Down); + } + + private void arLabel1_Click_1(object sender, EventArgs e) + { + + if (PUB.AGV.AGVCommand("SSH", PUB.setting.SPD_DRIVE.ToString("0000")) == false) + { + AR.UTIL.MsgE("고속속도에 주행속도 연결 실패\n잠시 후 다시 시도하세요"); + return; + } + + if (this.bunkiopt == null) bunkiopt = makeopt(); + bunkiopt.Speed = arDev.Narumi.eMoveSpd.High; + PUB.AGV.AGVMoveSet(bunkiopt); + PUB.log.Add($"고속주행설정 : {bunkiopt}"); + PUB.DriveSpeed = true; + + AR.UTIL.MsgI($"주행속도({PUB.setting.SPD_DRIVE})가 '고속' 속도에 연결되었습니다.\n" + + $"창을 이동하거나 '설정적용'을 누르면 원래속도({PUB.setting.SPD_H})로 변경 됩니다"); + } + } +} diff --git a/Cs_HMI/Project/ViewForm/fManual.resx b/Cs_HMI/Project/ViewForm/fManual.resx new file mode 100644 index 0000000..aac33d5 --- /dev/null +++ b/Cs_HMI/Project/ViewForm/fManual.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/app.config b/Cs_HMI/Project/app.config new file mode 100644 index 0000000..16d62dc --- /dev/null +++ b/Cs_HMI/Project/app.config @@ -0,0 +1,17 @@ + + + + +
+ + + + + + asdfasdfasdf +asdfasdfasdf +asdf + + + + diff --git a/Cs_HMI/Project/fMain.Designer.cs b/Cs_HMI/Project/fMain.Designer.cs new file mode 100644 index 0000000..453156f --- /dev/null +++ b/Cs_HMI/Project/fMain.Designer.cs @@ -0,0 +1,2284 @@ +namespace Project +{ + partial class fMain + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fMain)); + arFrame.Control.ColorListItem colorListItem1 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem2 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem3 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem4 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem5 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem6 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem7 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem8 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem9 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem10 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem11 = new arFrame.Control.ColorListItem(); + Project.CtlPos.item item1 = new Project.CtlPos.item(); + Project.CtlPos.item item2 = new Project.CtlPos.item(); + Project.CtlPos.item item3 = new Project.CtlPos.item(); + Project.CtlPos.item item4 = new Project.CtlPos.item(); + Project.CtlPos.item item5 = new Project.CtlPos.item(); + Project.CtlPos.item item6 = new Project.CtlPos.item(); + Project.CtlPos.item item7 = new Project.CtlPos.item(); + Project.CtlPos.item item8 = new Project.CtlPos.item(); + Project.CtlPos.item item9 = new Project.CtlPos.item(); + Project.CtlPos.item item10 = new Project.CtlPos.item(); + Project.CtlPos.item item11 = new Project.CtlPos.item(); + Project.CtlPos.item item12 = new Project.CtlPos.item(); + Project.CtlPos.item item13 = new Project.CtlPos.item(); + Project.CtlPos.item item14 = new Project.CtlPos.item(); + Project.CtlPos.item item15 = new Project.CtlPos.item(); + Project.CtlPos.item item16 = new Project.CtlPos.item(); + this.tmDisplay = new System.Windows.Forms.Timer(this.components); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.MenuLift = new System.Windows.Forms.Button(); + this.MenuMAN = new System.Windows.Forms.Button(); + this.MenuFlag = new System.Windows.Forms.Button(); + this.MenuAuto = new System.Windows.Forms.Button(); + this.MenuLog = new System.Windows.Forms.Button(); + this.MenuAGV = new System.Windows.Forms.Button(); + this.MenuBMS = new System.Windows.Forms.Button(); + this.btAutoRun = new arCtl.arLabel(); + this.btChargeA = new arCtl.arLabel(); + this.lbTime = new arCtl.arLabel(); + this.btDebug = new arCtl.arLabel(); + this.btOpenDir = new arCtl.arLabel(); + this.btMReset = new arCtl.arLabel(); + this.btCapture = new arCtl.arLabel(); + this.arLabel3 = new arCtl.arLabel(); + this.arLabel2 = new arCtl.arLabel(); + this.arLabel5 = new arCtl.arLabel(); + this.btClose = new arCtl.arLabel(); + this.systemParameterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator(); + this.demoRunToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setZValidToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.gridviewTestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.으ㅆㄷㄴㅅToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.messageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.errorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.informationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.attentionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reloadLotListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveSourceListToDestListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.needShowUploadTrueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.선택상태보기ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.idxDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.stripIdDataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.oKDataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.nGDataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.mISSDataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.fileMapDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataPathDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.mapOriginDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.mapArrayDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.panRight = new System.Windows.Forms.Panel(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.btHome = new arCtl.arLabel(); + this.btChargeM = new arCtl.arLabel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.lbCntQA = new arCtl.arLabel(); + this.arLabel4 = new arCtl.arLabel(); + this.lbCntQC = new arCtl.arLabel(); + this.arLabel9 = new arCtl.arLabel(); + this.panel16 = new System.Windows.Forms.Panel(); + this.lbCntDN = new arCtl.arLabel(); + this.arLabel7 = new arCtl.arLabel(); + this.lbCNtUP = new arCtl.arLabel(); + this.arLabel8 = new arCtl.arLabel(); + this.panel5 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lbIDLE = new arCtl.arLabel(); + this.lbStStep = new arCtl.arLabel(); + this.panTopMenu = new System.Windows.Forms.Panel(); + this.lbBat = new AGVControl.BatteryLevelGauge(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.cmDebug = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.demoListLotToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.refreshListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.debugtestToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pandBottomDIO = new System.Windows.Forms.Panel(); + this.panel9 = new System.Windows.Forms.Panel(); + this.IOState = new arFrame.Control.GridView(); + this.SSInfo = new arFrame.Control.GridView(); + this.panDlg = new System.Windows.Forms.Panel(); + this.arPanel2 = new arCtl.arPanel(); + this.arPanel1 = new arCtl.arPanel(); + this.ctlPos1 = new Project.CtlPos(); + this.panRight.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panel16.SuspendLayout(); + this.panel1.SuspendLayout(); + this.panTopMenu.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.cmDebug.SuspendLayout(); + this.pandBottomDIO.SuspendLayout(); + this.panel9.SuspendLayout(); + this.SuspendLayout(); + // + // tmDisplay + // + this.tmDisplay.Interval = 300; + this.tmDisplay.Tick += new System.EventHandler(this.tmDisplay_Tick); + // + // MenuLift + // + this.MenuLift.AutoSize = true; + this.MenuLift.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuLift.FlatAppearance.BorderSize = 0; + this.MenuLift.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MenuLift.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.MenuLift.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.MenuLift.Location = new System.Drawing.Point(285, 0); + this.MenuLift.Name = "MenuLift"; + this.MenuLift.Size = new System.Drawing.Size(92, 50); + this.MenuLift.TabIndex = 6; + this.MenuLift.Text = "LIFT"; + this.toolTip1.SetToolTip(this.MenuLift, "I/O 및 FLAG를 확인 합니다"); + this.MenuLift.UseVisualStyleBackColor = true; + this.MenuLift.Click += new System.EventHandler(this.button3_Click); + // + // MenuMAN + // + this.MenuMAN.AutoSize = true; + this.MenuMAN.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuMAN.FlatAppearance.BorderSize = 0; + this.MenuMAN.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MenuMAN.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.MenuMAN.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.MenuMAN.Location = new System.Drawing.Point(154, 0); + this.MenuMAN.Name = "MenuMAN"; + this.MenuMAN.Size = new System.Drawing.Size(131, 50); + this.MenuMAN.TabIndex = 1; + this.MenuMAN.Text = "MANUAL"; + this.toolTip1.SetToolTip(this.MenuMAN, "작업 내역을 확인 합니다"); + this.MenuMAN.UseVisualStyleBackColor = true; + this.MenuMAN.Click += new System.EventHandler(this.button4_Click); + // + // MenuFlag + // + this.MenuFlag.AutoSize = true; + this.MenuFlag.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuFlag.FlatAppearance.BorderSize = 0; + this.MenuFlag.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MenuFlag.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.MenuFlag.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.MenuFlag.Location = new System.Drawing.Point(561, 0); + this.MenuFlag.Name = "MenuFlag"; + this.MenuFlag.Size = new System.Drawing.Size(92, 50); + this.MenuFlag.TabIndex = 17; + this.MenuFlag.Text = "FLAG"; + this.toolTip1.SetToolTip(this.MenuFlag, "I/O 및 FLAG를 확인 합니다"); + this.MenuFlag.UseVisualStyleBackColor = true; + this.MenuFlag.Click += new System.EventHandler(this.button1_Click); + // + // MenuAuto + // + this.MenuAuto.AutoSize = true; + this.MenuAuto.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuAuto.FlatAppearance.BorderSize = 0; + this.MenuAuto.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MenuAuto.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.MenuAuto.ForeColor = System.Drawing.Color.Gold; + this.MenuAuto.Location = new System.Drawing.Point(49, 0); + this.MenuAuto.Name = "MenuAuto"; + this.MenuAuto.Size = new System.Drawing.Size(105, 50); + this.MenuAuto.TabIndex = 18; + this.MenuAuto.Text = "AUTO"; + this.toolTip1.SetToolTip(this.MenuAuto, "작업 내역을 확인 합니다"); + this.MenuAuto.UseVisualStyleBackColor = true; + this.MenuAuto.Click += new System.EventHandler(this.button2_Click); + // + // MenuLog + // + this.MenuLog.AutoSize = true; + this.MenuLog.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuLog.FlatAppearance.BorderSize = 0; + this.MenuLog.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MenuLog.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.MenuLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.MenuLog.Location = new System.Drawing.Point(653, 0); + this.MenuLog.Name = "MenuLog"; + this.MenuLog.Size = new System.Drawing.Size(92, 50); + this.MenuLog.TabIndex = 19; + this.MenuLog.Text = "LOG"; + this.toolTip1.SetToolTip(this.MenuLog, "I/O 및 FLAG를 확인 합니다"); + this.MenuLog.UseVisualStyleBackColor = true; + this.MenuLog.Click += new System.EventHandler(this.btLog_Click); + // + // MenuAGV + // + this.MenuAGV.AutoSize = true; + this.MenuAGV.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.MenuAGV.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuAGV.FlatAppearance.BorderSize = 0; + this.MenuAGV.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MenuAGV.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.MenuAGV.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.MenuAGV.Location = new System.Drawing.Point(377, 0); + this.MenuAGV.Name = "MenuAGV"; + this.MenuAGV.Size = new System.Drawing.Size(92, 50); + this.MenuAGV.TabIndex = 21; + this.MenuAGV.Text = "AGV"; + this.toolTip1.SetToolTip(this.MenuAGV, "I/O 및 FLAG를 확인 합니다"); + this.MenuAGV.UseVisualStyleBackColor = false; + this.MenuAGV.Click += new System.EventHandler(this.button1_Click_1); + // + // MenuBMS + // + this.MenuBMS.AutoSize = true; + this.MenuBMS.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuBMS.FlatAppearance.BorderSize = 0; + this.MenuBMS.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.MenuBMS.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold); + this.MenuBMS.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.MenuBMS.Location = new System.Drawing.Point(469, 0); + this.MenuBMS.Name = "MenuBMS"; + this.MenuBMS.Size = new System.Drawing.Size(92, 50); + this.MenuBMS.TabIndex = 22; + this.MenuBMS.Text = "BMS"; + this.toolTip1.SetToolTip(this.MenuBMS, "I/O 및 FLAG를 확인 합니다"); + this.MenuBMS.UseVisualStyleBackColor = true; + this.MenuBMS.Click += new System.EventHandler(this.button2_Click_1); + // + // btAutoRun + // + this.btAutoRun.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btAutoRun.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.btAutoRun.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btAutoRun.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btAutoRun.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btAutoRun.BorderSize = new System.Windows.Forms.Padding(0, 0, 1, 1); + this.btAutoRun.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.tableLayoutPanel1.SetColumnSpan(this.btAutoRun, 2); + this.btAutoRun.Cursor = System.Windows.Forms.Cursors.Hand; + this.btAutoRun.Dock = System.Windows.Forms.DockStyle.Fill; + this.btAutoRun.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btAutoRun.ForeColor = System.Drawing.Color.WhiteSmoke; + this.btAutoRun.GradientEnable = true; + this.btAutoRun.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btAutoRun.GradientRepeatBG = false; + this.btAutoRun.isButton = true; + this.btAutoRun.Location = new System.Drawing.Point(0, 274); + this.btAutoRun.Margin = new System.Windows.Forms.Padding(0); + this.btAutoRun.MouseDownColor = System.Drawing.Color.Empty; + this.btAutoRun.MouseOverColor = System.Drawing.Color.Empty; + this.btAutoRun.msg = null; + this.btAutoRun.Name = "btAutoRun"; + this.btAutoRun.ProgressBorderColor = System.Drawing.Color.Black; + this.btAutoRun.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btAutoRun.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btAutoRun.ProgressEnable = false; + this.btAutoRun.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btAutoRun.ProgressForeColor = System.Drawing.Color.Black; + this.btAutoRun.ProgressMax = 100F; + this.btAutoRun.ProgressMin = 0F; + this.btAutoRun.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btAutoRun.ProgressValue = 0F; + this.btAutoRun.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btAutoRun.Sign = ""; + this.btAutoRun.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btAutoRun.SignColor = System.Drawing.Color.Yellow; + this.btAutoRun.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btAutoRun.Size = new System.Drawing.Size(259, 139); + this.btAutoRun.TabIndex = 22; + this.btAutoRun.Text = "수동"; + this.btAutoRun.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btAutoRun.TextShadow = true; + this.btAutoRun.TextVisible = true; + this.toolTip1.SetToolTip(this.btAutoRun, "작업상태(자동/수동)를 표시 합니다"); + this.btAutoRun.Click += new System.EventHandler(this.btStart_Click); + // + // btChargeA + // + this.btChargeA.BackColor = System.Drawing.Color.LightSalmon; + this.btChargeA.BackColor2 = System.Drawing.Color.Tomato; + this.btChargeA.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btChargeA.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btChargeA.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btChargeA.BorderSize = new System.Windows.Forms.Padding(0, 0, 1, 1); + this.btChargeA.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btChargeA.Cursor = System.Windows.Forms.Cursors.Hand; + this.btChargeA.Dock = System.Windows.Forms.DockStyle.Fill; + this.btChargeA.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.btChargeA.ForeColor = System.Drawing.Color.WhiteSmoke; + this.btChargeA.GradientEnable = true; + this.btChargeA.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btChargeA.GradientRepeatBG = false; + this.btChargeA.isButton = true; + this.btChargeA.Location = new System.Drawing.Point(116, 0); + this.btChargeA.Margin = new System.Windows.Forms.Padding(0); + this.btChargeA.MouseDownColor = System.Drawing.Color.Yellow; + this.btChargeA.MouseOverColor = System.Drawing.Color.Lime; + this.btChargeA.msg = null; + this.btChargeA.Name = "btChargeA"; + this.btChargeA.ProgressBorderColor = System.Drawing.Color.Black; + this.btChargeA.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btChargeA.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btChargeA.ProgressEnable = false; + this.btChargeA.ProgressFont = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.btChargeA.ProgressForeColor = System.Drawing.Color.Black; + this.btChargeA.ProgressMax = 100F; + this.btChargeA.ProgressMin = 0F; + this.btChargeA.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btChargeA.ProgressValue = 0F; + this.btChargeA.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btChargeA.Sign = ""; + this.btChargeA.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btChargeA.SignColor = System.Drawing.Color.Yellow; + this.btChargeA.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btChargeA.Size = new System.Drawing.Size(143, 137); + this.btChargeA.TabIndex = 141; + this.btChargeA.Text = "자동충전"; + this.btChargeA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btChargeA.TextShadow = true; + this.btChargeA.TextVisible = true; + this.toolTip1.SetToolTip(this.btChargeA, "도어 상태"); + this.btChargeA.Click += new System.EventHandler(this.btCharge_Click); + // + // lbTime + // + this.lbTime.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.lbTime.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(80)))), ((int)(((byte)(80))))); + this.lbTime.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbTime.BorderColor = System.Drawing.Color.Red; + this.lbTime.BorderColorOver = System.Drawing.Color.Red; + this.lbTime.BorderSize = new System.Windows.Forms.Padding(0); + this.lbTime.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbTime.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbTime.Dock = System.Windows.Forms.DockStyle.Bottom; + this.lbTime.Font = new System.Drawing.Font("Consolas", 12.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbTime.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.lbTime.GradientEnable = false; + this.lbTime.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.lbTime.GradientRepeatBG = false; + this.lbTime.isButton = false; + this.lbTime.Location = new System.Drawing.Point(5, 554); + this.lbTime.Margin = new System.Windows.Forms.Padding(0); + this.lbTime.MouseDownColor = System.Drawing.Color.Yellow; + this.lbTime.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbTime.msg = null; + this.lbTime.Name = "lbTime"; + this.lbTime.ProgressBorderColor = System.Drawing.Color.Black; + this.lbTime.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbTime.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbTime.ProgressEnable = false; + this.lbTime.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbTime.ProgressForeColor = System.Drawing.Color.Black; + this.lbTime.ProgressMax = 100F; + this.lbTime.ProgressMin = 0F; + this.lbTime.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbTime.ProgressValue = 0F; + this.lbTime.ShadowColor = System.Drawing.Color.WhiteSmoke; + this.lbTime.Sign = ""; + this.lbTime.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbTime.SignColor = System.Drawing.Color.Yellow; + this.lbTime.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbTime.Size = new System.Drawing.Size(259, 25); + this.lbTime.TabIndex = 0; + this.lbTime.Text = "1982-11-23 00:00:00"; + this.lbTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbTime.TextShadow = false; + this.lbTime.TextVisible = true; + this.toolTip1.SetToolTip(this.lbTime, "현재 시간"); + // + // btDebug + // + this.btDebug.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btDebug.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.btDebug.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btDebug.BackgroundImage"))); + this.btDebug.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.btDebug.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btDebug.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btDebug.BorderColorOver = System.Drawing.Color.SkyBlue; + this.btDebug.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.btDebug.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btDebug.Cursor = System.Windows.Forms.Cursors.Hand; + this.btDebug.Dock = System.Windows.Forms.DockStyle.Right; + this.btDebug.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.btDebug.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.btDebug.GradientEnable = false; + this.btDebug.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btDebug.GradientRepeatBG = false; + this.btDebug.isButton = true; + this.btDebug.Location = new System.Drawing.Point(878, 0); + this.btDebug.Margin = new System.Windows.Forms.Padding(0); + this.btDebug.MouseDownColor = System.Drawing.Color.Yellow; + this.btDebug.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btDebug.msg = null; + this.btDebug.Name = "btDebug"; + this.btDebug.ProgressBorderColor = System.Drawing.Color.Black; + this.btDebug.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btDebug.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btDebug.ProgressEnable = false; + this.btDebug.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btDebug.ProgressForeColor = System.Drawing.Color.Black; + this.btDebug.ProgressMax = 100F; + this.btDebug.ProgressMin = 0F; + this.btDebug.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btDebug.ProgressValue = 0F; + this.btDebug.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btDebug.Sign = ""; + this.btDebug.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btDebug.SignColor = System.Drawing.Color.Yellow; + this.btDebug.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btDebug.Size = new System.Drawing.Size(50, 50); + this.btDebug.TabIndex = 15; + this.btDebug.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btDebug.TextShadow = true; + this.btDebug.TextVisible = true; + this.toolTip1.SetToolTip(this.btDebug, "개발자 메뉴"); + this.btDebug.Visible = false; + this.btDebug.Click += new System.EventHandler(this.btDebug_Click); + // + // btOpenDir + // + this.btOpenDir.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btOpenDir.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.btOpenDir.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btOpenDir.BackgroundImage"))); + this.btOpenDir.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.btOpenDir.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btOpenDir.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btOpenDir.BorderColorOver = System.Drawing.Color.SkyBlue; + this.btOpenDir.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.btOpenDir.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btOpenDir.Cursor = System.Windows.Forms.Cursors.Hand; + this.btOpenDir.Dock = System.Windows.Forms.DockStyle.Right; + this.btOpenDir.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.btOpenDir.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.btOpenDir.GradientEnable = false; + this.btOpenDir.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btOpenDir.GradientRepeatBG = false; + this.btOpenDir.isButton = true; + this.btOpenDir.Location = new System.Drawing.Point(928, 0); + this.btOpenDir.Margin = new System.Windows.Forms.Padding(0); + this.btOpenDir.MouseDownColor = System.Drawing.Color.Yellow; + this.btOpenDir.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btOpenDir.msg = null; + this.btOpenDir.Name = "btOpenDir"; + this.btOpenDir.ProgressBorderColor = System.Drawing.Color.Black; + this.btOpenDir.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btOpenDir.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btOpenDir.ProgressEnable = false; + this.btOpenDir.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btOpenDir.ProgressForeColor = System.Drawing.Color.Black; + this.btOpenDir.ProgressMax = 100F; + this.btOpenDir.ProgressMin = 0F; + this.btOpenDir.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btOpenDir.ProgressValue = 0F; + this.btOpenDir.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btOpenDir.Sign = ""; + this.btOpenDir.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btOpenDir.SignColor = System.Drawing.Color.Yellow; + this.btOpenDir.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btOpenDir.Size = new System.Drawing.Size(50, 50); + this.btOpenDir.TabIndex = 16; + this.btOpenDir.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btOpenDir.TextShadow = true; + this.btOpenDir.TextVisible = true; + this.toolTip1.SetToolTip(this.btOpenDir, "폴더 열기"); + this.btOpenDir.Click += new System.EventHandler(this.btOpenDir_Click); + // + // btMReset + // + this.btMReset.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btMReset.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.btMReset.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btMReset.BackgroundImage"))); + this.btMReset.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.btMReset.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btMReset.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btMReset.BorderColorOver = System.Drawing.Color.SkyBlue; + this.btMReset.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.btMReset.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btMReset.Cursor = System.Windows.Forms.Cursors.Hand; + this.btMReset.Dock = System.Windows.Forms.DockStyle.Right; + this.btMReset.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.btMReset.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.btMReset.GradientEnable = false; + this.btMReset.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btMReset.GradientRepeatBG = false; + this.btMReset.isButton = true; + this.btMReset.Location = new System.Drawing.Point(978, 0); + this.btMReset.Margin = new System.Windows.Forms.Padding(0); + this.btMReset.MouseDownColor = System.Drawing.Color.Yellow; + this.btMReset.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btMReset.msg = null; + this.btMReset.Name = "btMReset"; + this.btMReset.ProgressBorderColor = System.Drawing.Color.Black; + this.btMReset.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btMReset.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btMReset.ProgressEnable = false; + this.btMReset.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btMReset.ProgressForeColor = System.Drawing.Color.Black; + this.btMReset.ProgressMax = 100F; + this.btMReset.ProgressMin = 0F; + this.btMReset.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btMReset.ProgressValue = 0F; + this.btMReset.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btMReset.Sign = ""; + this.btMReset.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btMReset.SignColor = System.Drawing.Color.Yellow; + this.btMReset.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btMReset.Size = new System.Drawing.Size(50, 50); + this.btMReset.TabIndex = 13; + this.btMReset.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btMReset.TextShadow = true; + this.btMReset.TextVisible = true; + this.toolTip1.SetToolTip(this.btMReset, "장치 초기화"); + this.btMReset.Click += new System.EventHandler(this.btMReset_Click); + // + // btCapture + // + this.btCapture.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btCapture.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.btCapture.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btCapture.BackgroundImage"))); + this.btCapture.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.btCapture.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btCapture.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btCapture.BorderColorOver = System.Drawing.Color.SkyBlue; + this.btCapture.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.btCapture.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btCapture.Cursor = System.Windows.Forms.Cursors.Hand; + this.btCapture.Dock = System.Windows.Forms.DockStyle.Right; + this.btCapture.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.btCapture.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.btCapture.GradientEnable = false; + this.btCapture.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btCapture.GradientRepeatBG = false; + this.btCapture.isButton = true; + this.btCapture.Location = new System.Drawing.Point(1028, 0); + this.btCapture.Margin = new System.Windows.Forms.Padding(0); + this.btCapture.MouseDownColor = System.Drawing.Color.Yellow; + this.btCapture.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btCapture.msg = null; + this.btCapture.Name = "btCapture"; + this.btCapture.ProgressBorderColor = System.Drawing.Color.Black; + this.btCapture.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btCapture.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btCapture.ProgressEnable = false; + this.btCapture.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btCapture.ProgressForeColor = System.Drawing.Color.Black; + this.btCapture.ProgressMax = 100F; + this.btCapture.ProgressMin = 0F; + this.btCapture.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btCapture.ProgressValue = 0F; + this.btCapture.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btCapture.Sign = ""; + this.btCapture.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btCapture.SignColor = System.Drawing.Color.Yellow; + this.btCapture.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btCapture.Size = new System.Drawing.Size(50, 50); + this.btCapture.TabIndex = 12; + this.btCapture.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btCapture.TextShadow = true; + this.btCapture.TextVisible = true; + this.toolTip1.SetToolTip(this.btCapture, "화면 캡쳐"); + this.btCapture.Click += new System.EventHandler(this.btCapture_Click); + // + // arLabel3 + // + this.arLabel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel3.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arLabel3.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("arLabel3.BackgroundImage"))); + this.arLabel3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.arLabel3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel3.BorderColorOver = System.Drawing.Color.SkyBlue; + this.arLabel3.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.arLabel3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel3.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel3.Dock = System.Windows.Forms.DockStyle.Right; + this.arLabel3.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.arLabel3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.arLabel3.GradientEnable = false; + this.arLabel3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel3.GradientRepeatBG = false; + this.arLabel3.isButton = true; + this.arLabel3.Location = new System.Drawing.Point(1078, 0); + this.arLabel3.Margin = new System.Windows.Forms.Padding(0); + this.arLabel3.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel3.msg = null; + this.arLabel3.Name = "arLabel3"; + this.arLabel3.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel3.ProgressEnable = false; + this.arLabel3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel3.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel3.ProgressMax = 100F; + this.arLabel3.ProgressMin = 0F; + this.arLabel3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel3.ProgressValue = 0F; + this.arLabel3.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel3.Sign = ""; + this.arLabel3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel3.SignColor = System.Drawing.Color.Yellow; + this.arLabel3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel3.Size = new System.Drawing.Size(50, 50); + this.arLabel3.TabIndex = 10; + this.arLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel3.TextShadow = true; + this.arLabel3.TextVisible = true; + this.toolTip1.SetToolTip(this.arLabel3, "메뉴얼 보기"); + this.arLabel3.Click += new System.EventHandler(this.arLabel3_Click); + // + // arLabel2 + // + this.arLabel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel2.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arLabel2.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("arLabel2.BackgroundImage"))); + this.arLabel2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.arLabel2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel2.BorderColorOver = System.Drawing.Color.SkyBlue; + this.arLabel2.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.arLabel2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel2.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel2.Dock = System.Windows.Forms.DockStyle.Right; + this.arLabel2.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.arLabel2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.arLabel2.GradientEnable = false; + this.arLabel2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel2.GradientRepeatBG = false; + this.arLabel2.isButton = true; + this.arLabel2.Location = new System.Drawing.Point(1128, 0); + this.arLabel2.Margin = new System.Windows.Forms.Padding(0); + this.arLabel2.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel2.msg = null; + this.arLabel2.Name = "arLabel2"; + this.arLabel2.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel2.ProgressEnable = false; + this.arLabel2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel2.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel2.ProgressMax = 100F; + this.arLabel2.ProgressMin = 0F; + this.arLabel2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel2.ProgressValue = 0F; + this.arLabel2.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel2.Sign = ""; + this.arLabel2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel2.SignColor = System.Drawing.Color.Yellow; + this.arLabel2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel2.Size = new System.Drawing.Size(50, 50); + this.arLabel2.TabIndex = 20; + this.arLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel2.TextShadow = true; + this.arLabel2.TextVisible = true; + this.toolTip1.SetToolTip(this.arLabel2, "개발자 메뉴"); + this.arLabel2.Click += new System.EventHandler(this.arLabel2_Click_1); + // + // arLabel5 + // + this.arLabel5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel5.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.arLabel5.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("arLabel5.BackgroundImage"))); + this.arLabel5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.arLabel5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel5.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel5.BorderColorOver = System.Drawing.Color.SkyBlue; + this.arLabel5.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.arLabel5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel5.Cursor = System.Windows.Forms.Cursors.Hand; + this.arLabel5.Dock = System.Windows.Forms.DockStyle.Right; + this.arLabel5.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.arLabel5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.arLabel5.GradientEnable = false; + this.arLabel5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel5.GradientRepeatBG = false; + this.arLabel5.isButton = true; + this.arLabel5.Location = new System.Drawing.Point(1178, 0); + this.arLabel5.Margin = new System.Windows.Forms.Padding(0); + this.arLabel5.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel5.msg = null; + this.arLabel5.Name = "arLabel5"; + this.arLabel5.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel5.ProgressEnable = false; + this.arLabel5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel5.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel5.ProgressMax = 100F; + this.arLabel5.ProgressMin = 0F; + this.arLabel5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel5.ProgressValue = 0F; + this.arLabel5.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel5.Sign = ""; + this.arLabel5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel5.SignColor = System.Drawing.Color.Yellow; + this.arLabel5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.arLabel5.Size = new System.Drawing.Size(50, 50); + this.arLabel5.TabIndex = 9; + this.arLabel5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel5.TextShadow = true; + this.arLabel5.TextVisible = true; + this.toolTip1.SetToolTip(this.arLabel5, "프로그램 설정"); + this.arLabel5.Click += new System.EventHandler(this.arLabel5_Click); + // + // btClose + // + this.btClose.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btClose.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.btClose.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btClose.BackgroundImage"))); + this.btClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.btClose.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btClose.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btClose.BorderColorOver = System.Drawing.Color.SkyBlue; + this.btClose.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.btClose.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btClose.Cursor = System.Windows.Forms.Cursors.Hand; + this.btClose.Dock = System.Windows.Forms.DockStyle.Right; + this.btClose.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.btClose.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.btClose.GradientEnable = false; + this.btClose.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btClose.GradientRepeatBG = false; + this.btClose.isButton = true; + this.btClose.Location = new System.Drawing.Point(1228, 0); + this.btClose.Margin = new System.Windows.Forms.Padding(0); + this.btClose.MouseDownColor = System.Drawing.Color.Yellow; + this.btClose.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btClose.msg = null; + this.btClose.Name = "btClose"; + this.btClose.ProgressBorderColor = System.Drawing.Color.Black; + this.btClose.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btClose.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btClose.ProgressEnable = false; + this.btClose.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btClose.ProgressForeColor = System.Drawing.Color.Black; + this.btClose.ProgressMax = 100F; + this.btClose.ProgressMin = 0F; + this.btClose.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btClose.ProgressValue = 0F; + this.btClose.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btClose.Sign = ""; + this.btClose.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btClose.SignColor = System.Drawing.Color.Yellow; + this.btClose.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btClose.Size = new System.Drawing.Size(50, 50); + this.btClose.TabIndex = 7; + this.btClose.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btClose.TextShadow = true; + this.btClose.TextVisible = true; + this.toolTip1.SetToolTip(this.btClose, "프로그램 종료"); + this.btClose.Click += new System.EventHandler(this.btClose_Click); + // + // systemParameterToolStripMenuItem + // + this.systemParameterToolStripMenuItem.Name = "systemParameterToolStripMenuItem"; + this.systemParameterToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.systemParameterToolStripMenuItem.Text = "System Parameter"; + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(225, 6); + // + // demoRunToolStripMenuItem + // + this.demoRunToolStripMenuItem.Name = "demoRunToolStripMenuItem"; + this.demoRunToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.demoRunToolStripMenuItem.Text = "Demo Run"; + this.demoRunToolStripMenuItem.Click += new System.EventHandler(this.demoRunToolStripMenuItem_Click); + // + // setZValidToolStripMenuItem + // + this.setZValidToolStripMenuItem.Name = "setZValidToolStripMenuItem"; + this.setZValidToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.setZValidToolStripMenuItem.Text = "Set A-Valid On"; + this.setZValidToolStripMenuItem.Click += new System.EventHandler(this.setZValidToolStripMenuItem_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(225, 6); + // + // gridviewTestToolStripMenuItem + // + this.gridviewTestToolStripMenuItem.Name = "gridviewTestToolStripMenuItem"; + this.gridviewTestToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.gridviewTestToolStripMenuItem.Text = "GridviewTest"; + this.gridviewTestToolStripMenuItem.Click += new System.EventHandler(this.gridviewTestToolStripMenuItem_Click); + // + // 으ㅆㄷㄴㅅToolStripMenuItem + // + this.으ㅆㄷㄴㅅToolStripMenuItem.Name = "으ㅆㄷㄴㅅToolStripMenuItem"; + this.으ㅆㄷㄴㅅToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.으ㅆㄷㄴㅅToolStripMenuItem.Text = "Test DataMatrix StripID"; + this.으ㅆㄷㄴㅅToolStripMenuItem.Click += new System.EventHandler(this.으ㅆㄷㄴㅅToolStripMenuItem_Click); + // + // messageToolStripMenuItem + // + this.messageToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.errorToolStripMenuItem, + this.informationToolStripMenuItem, + this.attentionToolStripMenuItem}); + this.messageToolStripMenuItem.Name = "messageToolStripMenuItem"; + this.messageToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.messageToolStripMenuItem.Text = "Message"; + // + // errorToolStripMenuItem + // + this.errorToolStripMenuItem.Name = "errorToolStripMenuItem"; + this.errorToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.errorToolStripMenuItem.Text = "Error"; + this.errorToolStripMenuItem.Click += new System.EventHandler(this.errorToolStripMenuItem_Click); + // + // informationToolStripMenuItem + // + this.informationToolStripMenuItem.Name = "informationToolStripMenuItem"; + this.informationToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.informationToolStripMenuItem.Text = "Information"; + this.informationToolStripMenuItem.Click += new System.EventHandler(this.informationToolStripMenuItem_Click); + // + // attentionToolStripMenuItem + // + this.attentionToolStripMenuItem.Name = "attentionToolStripMenuItem"; + this.attentionToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.attentionToolStripMenuItem.Text = "Attention"; + this.attentionToolStripMenuItem.Click += new System.EventHandler(this.attentionToolStripMenuItem_Click); + // + // reloadLotListToolStripMenuItem + // + this.reloadLotListToolStripMenuItem.Name = "reloadLotListToolStripMenuItem"; + this.reloadLotListToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.reloadLotListToolStripMenuItem.Text = "Reload Lot List"; + this.reloadLotListToolStripMenuItem.Click += new System.EventHandler(this.reloadLotListToolStripMenuItem_Click); + // + // moveSourceListToDestListToolStripMenuItem + // + this.moveSourceListToDestListToolStripMenuItem.Name = "moveSourceListToDestListToolStripMenuItem"; + this.moveSourceListToDestListToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.moveSourceListToDestListToolStripMenuItem.Text = "Move Source List to DestList"; + // + // needShowUploadTrueToolStripMenuItem + // + this.needShowUploadTrueToolStripMenuItem.Name = "needShowUploadTrueToolStripMenuItem"; + this.needShowUploadTrueToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.needShowUploadTrueToolStripMenuItem.Text = "Need Show Upload = True"; + // + // 선택상태보기ToolStripMenuItem + // + this.선택상태보기ToolStripMenuItem.Name = "선택상태보기ToolStripMenuItem"; + this.선택상태보기ToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.선택상태보기ToolStripMenuItem.Text = "선택 상태 보기"; + // + // idxDataGridViewTextBoxColumn + // + this.idxDataGridViewTextBoxColumn.DataPropertyName = "idx"; + this.idxDataGridViewTextBoxColumn.HeaderText = "idx"; + this.idxDataGridViewTextBoxColumn.Name = "idxDataGridViewTextBoxColumn"; + this.idxDataGridViewTextBoxColumn.Width = 5; + // + // stripIdDataGridViewTextBoxColumn2 + // + this.stripIdDataGridViewTextBoxColumn2.DataPropertyName = "StripId"; + this.stripIdDataGridViewTextBoxColumn2.HeaderText = "StripId"; + this.stripIdDataGridViewTextBoxColumn2.Name = "stripIdDataGridViewTextBoxColumn2"; + this.stripIdDataGridViewTextBoxColumn2.Width = 5; + // + // oKDataGridViewTextBoxColumn2 + // + this.oKDataGridViewTextBoxColumn2.DataPropertyName = "OK"; + this.oKDataGridViewTextBoxColumn2.HeaderText = "OK"; + this.oKDataGridViewTextBoxColumn2.Name = "oKDataGridViewTextBoxColumn2"; + this.oKDataGridViewTextBoxColumn2.Width = 5; + // + // nGDataGridViewTextBoxColumn2 + // + this.nGDataGridViewTextBoxColumn2.DataPropertyName = "NG"; + this.nGDataGridViewTextBoxColumn2.HeaderText = "NG"; + this.nGDataGridViewTextBoxColumn2.Name = "nGDataGridViewTextBoxColumn2"; + this.nGDataGridViewTextBoxColumn2.Width = 5; + // + // mISSDataGridViewTextBoxColumn2 + // + this.mISSDataGridViewTextBoxColumn2.DataPropertyName = "MISS"; + this.mISSDataGridViewTextBoxColumn2.HeaderText = "MISS"; + this.mISSDataGridViewTextBoxColumn2.Name = "mISSDataGridViewTextBoxColumn2"; + this.mISSDataGridViewTextBoxColumn2.Width = 5; + // + // fileMapDataGridViewTextBoxColumn + // + this.fileMapDataGridViewTextBoxColumn.DataPropertyName = "FileMap"; + this.fileMapDataGridViewTextBoxColumn.HeaderText = "FileMap"; + this.fileMapDataGridViewTextBoxColumn.Name = "fileMapDataGridViewTextBoxColumn"; + this.fileMapDataGridViewTextBoxColumn.Width = 5; + // + // dataPathDataGridViewTextBoxColumn + // + this.dataPathDataGridViewTextBoxColumn.DataPropertyName = "DataPath"; + this.dataPathDataGridViewTextBoxColumn.HeaderText = "DataPath"; + this.dataPathDataGridViewTextBoxColumn.Name = "dataPathDataGridViewTextBoxColumn"; + this.dataPathDataGridViewTextBoxColumn.Width = 5; + // + // mapOriginDataGridViewTextBoxColumn + // + this.mapOriginDataGridViewTextBoxColumn.DataPropertyName = "MapOrigin"; + this.mapOriginDataGridViewTextBoxColumn.HeaderText = "MapOrigin"; + this.mapOriginDataGridViewTextBoxColumn.Name = "mapOriginDataGridViewTextBoxColumn"; + this.mapOriginDataGridViewTextBoxColumn.Width = 5; + // + // mapArrayDataGridViewTextBoxColumn + // + this.mapArrayDataGridViewTextBoxColumn.DataPropertyName = "MapArray"; + this.mapArrayDataGridViewTextBoxColumn.HeaderText = "MapArray"; + this.mapArrayDataGridViewTextBoxColumn.Name = "mapArrayDataGridViewTextBoxColumn"; + this.mapArrayDataGridViewTextBoxColumn.Width = 5; + // + // panRight + // + this.panRight.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.panRight.Controls.Add(this.tableLayoutPanel1); + this.panRight.Controls.Add(this.panel2); + this.panRight.Controls.Add(this.panel4); + this.panRight.Controls.Add(this.panel16); + this.panRight.Controls.Add(this.panel5); + this.panRight.Controls.Add(this.lbTime); + this.panRight.Controls.Add(this.panel3); + this.panRight.Controls.Add(this.panel1); + this.panRight.Dock = System.Windows.Forms.DockStyle.Right; + this.panRight.Location = new System.Drawing.Point(1015, 146); + this.panRight.Name = "panRight"; + this.panRight.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0); + this.panRight.Size = new System.Drawing.Size(264, 579); + this.panRight.TabIndex = 131; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 55F)); + this.tableLayoutPanel1.Controls.Add(this.btAutoRun, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.btHome, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.btChargeA, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.btChargeM, 1, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(5, 136); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(259, 413); + this.tableLayoutPanel1.TabIndex = 0; + // + // btHome + // + this.btHome.BackColor = System.Drawing.Color.Aqua; + this.btHome.BackColor2 = System.Drawing.Color.Teal; + this.btHome.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btHome.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btHome.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btHome.BorderSize = new System.Windows.Forms.Padding(0, 0, 1, 1); + this.btHome.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btHome.Cursor = System.Windows.Forms.Cursors.Hand; + this.btHome.Dock = System.Windows.Forms.DockStyle.Fill; + this.btHome.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.btHome.ForeColor = System.Drawing.Color.WhiteSmoke; + this.btHome.GradientEnable = true; + this.btHome.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btHome.GradientRepeatBG = false; + this.btHome.isButton = true; + this.btHome.Location = new System.Drawing.Point(0, 0); + this.btHome.Margin = new System.Windows.Forms.Padding(0); + this.btHome.MouseDownColor = System.Drawing.Color.Yellow; + this.btHome.MouseOverColor = System.Drawing.Color.Lime; + this.btHome.msg = null; + this.btHome.Name = "btHome"; + this.btHome.ProgressBorderColor = System.Drawing.Color.Black; + this.btHome.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btHome.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btHome.ProgressEnable = false; + this.btHome.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btHome.ProgressForeColor = System.Drawing.Color.Black; + this.btHome.ProgressMax = 100F; + this.btHome.ProgressMin = 0F; + this.btHome.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btHome.ProgressValue = 0F; + this.tableLayoutPanel1.SetRowSpan(this.btHome, 2); + this.btHome.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btHome.Sign = ""; + this.btHome.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btHome.SignColor = System.Drawing.Color.Yellow; + this.btHome.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btHome.Size = new System.Drawing.Size(116, 274); + this.btHome.TabIndex = 141; + this.btHome.Text = "홈"; + this.btHome.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btHome.TextShadow = true; + this.btHome.TextVisible = true; + this.btHome.Click += new System.EventHandler(this.arLabel1_Click); + // + // btChargeM + // + this.btChargeM.BackColor = System.Drawing.Color.LightSalmon; + this.btChargeM.BackColor2 = System.Drawing.Color.Tomato; + this.btChargeM.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btChargeM.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btChargeM.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btChargeM.BorderSize = new System.Windows.Forms.Padding(0, 0, 1, 1); + this.btChargeM.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btChargeM.Cursor = System.Windows.Forms.Cursors.Hand; + this.btChargeM.Dock = System.Windows.Forms.DockStyle.Fill; + this.btChargeM.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.btChargeM.ForeColor = System.Drawing.Color.WhiteSmoke; + this.btChargeM.GradientEnable = true; + this.btChargeM.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btChargeM.GradientRepeatBG = false; + this.btChargeM.isButton = true; + this.btChargeM.Location = new System.Drawing.Point(116, 137); + this.btChargeM.Margin = new System.Windows.Forms.Padding(0); + this.btChargeM.MouseDownColor = System.Drawing.Color.Yellow; + this.btChargeM.MouseOverColor = System.Drawing.Color.Lime; + this.btChargeM.msg = null; + this.btChargeM.Name = "btChargeM"; + this.btChargeM.ProgressBorderColor = System.Drawing.Color.Black; + this.btChargeM.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btChargeM.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btChargeM.ProgressEnable = false; + this.btChargeM.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btChargeM.ProgressForeColor = System.Drawing.Color.Black; + this.btChargeM.ProgressMax = 100F; + this.btChargeM.ProgressMin = 0F; + this.btChargeM.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btChargeM.ProgressValue = 0F; + this.btChargeM.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btChargeM.Sign = ""; + this.btChargeM.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btChargeM.SignColor = System.Drawing.Color.Yellow; + this.btChargeM.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btChargeM.Size = new System.Drawing.Size(143, 137); + this.btChargeM.TabIndex = 141; + this.btChargeM.Text = "수동충전"; + this.btChargeM.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btChargeM.TextShadow = true; + this.btChargeM.TextVisible = true; + this.btChargeM.Click += new System.EventHandler(this.btChargeM_Click); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(5, 131); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(259, 5); + this.panel2.TabIndex = 139; + // + // panel4 + // + this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.panel4.Controls.Add(this.lbCntQA); + this.panel4.Controls.Add(this.arLabel4); + this.panel4.Controls.Add(this.lbCntQC); + this.panel4.Controls.Add(this.arLabel9); + this.panel4.Dock = System.Windows.Forms.DockStyle.Top; + this.panel4.Location = new System.Drawing.Point(5, 82); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(259, 49); + this.panel4.TabIndex = 145; + // + // lbCntQA + // + this.lbCntQA.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCntQA.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCntQA.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbCntQA.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbCntQA.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbCntQA.BorderSize = new System.Windows.Forms.Padding(0); + this.lbCntQA.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbCntQA.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbCntQA.Dock = System.Windows.Forms.DockStyle.Left; + this.lbCntQA.Font = new System.Drawing.Font("Consolas", 25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbCntQA.ForeColor = System.Drawing.Color.Gray; + this.lbCntQA.GradientEnable = true; + this.lbCntQA.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbCntQA.GradientRepeatBG = false; + this.lbCntQA.isButton = false; + this.lbCntQA.Location = new System.Drawing.Point(161, 0); + this.lbCntQA.Margin = new System.Windows.Forms.Padding(0); + this.lbCntQA.MouseDownColor = System.Drawing.Color.Yellow; + this.lbCntQA.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbCntQA.msg = null; + this.lbCntQA.Name = "lbCntQA"; + this.lbCntQA.ProgressBorderColor = System.Drawing.Color.Black; + this.lbCntQA.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbCntQA.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbCntQA.ProgressEnable = false; + this.lbCntQA.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbCntQA.ProgressForeColor = System.Drawing.Color.Black; + this.lbCntQA.ProgressMax = 100F; + this.lbCntQA.ProgressMin = 0F; + this.lbCntQA.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbCntQA.ProgressValue = 0F; + this.lbCntQA.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbCntQA.Sign = ""; + this.lbCntQA.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbCntQA.SignColor = System.Drawing.Color.Yellow; + this.lbCntQA.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbCntQA.Size = new System.Drawing.Size(93, 49); + this.lbCntQA.TabIndex = 6; + this.lbCntQA.Text = "0000"; + this.lbCntQA.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbCntQA.TextShadow = true; + this.lbCntQA.TextVisible = true; + // + // arLabel4 + // + this.arLabel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel4.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel4.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.arLabel4.BorderColorOver = System.Drawing.Color.DarkBlue; + this.arLabel4.BorderSize = new System.Windows.Forms.Padding(0); + this.arLabel4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel4.Cursor = System.Windows.Forms.Cursors.Arrow; + this.arLabel4.Dock = System.Windows.Forms.DockStyle.Left; + this.arLabel4.Font = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.arLabel4.GradientEnable = true; + this.arLabel4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel4.GradientRepeatBG = false; + this.arLabel4.isButton = false; + this.arLabel4.Location = new System.Drawing.Point(127, 0); + this.arLabel4.Margin = new System.Windows.Forms.Padding(0); + this.arLabel4.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel4.msg = null; + this.arLabel4.Name = "arLabel4"; + this.arLabel4.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel4.ProgressEnable = false; + this.arLabel4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel4.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel4.ProgressMax = 100F; + this.arLabel4.ProgressMin = 0F; + this.arLabel4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel4.ProgressValue = 0F; + this.arLabel4.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel4.Sign = ""; + this.arLabel4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel4.SignColor = System.Drawing.Color.Yellow; + this.arLabel4.SignFont = new System.Drawing.Font("Consolas", 15F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)))); + this.arLabel4.Size = new System.Drawing.Size(34, 49); + this.arLabel4.TabIndex = 5; + this.arLabel4.Text = "QA"; + this.arLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel4.TextShadow = true; + this.arLabel4.TextVisible = true; + // + // lbCntQC + // + this.lbCntQC.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCntQC.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCntQC.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbCntQC.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbCntQC.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbCntQC.BorderSize = new System.Windows.Forms.Padding(0); + this.lbCntQC.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbCntQC.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbCntQC.Dock = System.Windows.Forms.DockStyle.Left; + this.lbCntQC.Font = new System.Drawing.Font("Consolas", 25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbCntQC.ForeColor = System.Drawing.Color.Gray; + this.lbCntQC.GradientEnable = true; + this.lbCntQC.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbCntQC.GradientRepeatBG = false; + this.lbCntQC.isButton = false; + this.lbCntQC.Location = new System.Drawing.Point(34, 0); + this.lbCntQC.Margin = new System.Windows.Forms.Padding(0); + this.lbCntQC.MouseDownColor = System.Drawing.Color.Yellow; + this.lbCntQC.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbCntQC.msg = null; + this.lbCntQC.Name = "lbCntQC"; + this.lbCntQC.ProgressBorderColor = System.Drawing.Color.Black; + this.lbCntQC.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbCntQC.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbCntQC.ProgressEnable = false; + this.lbCntQC.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbCntQC.ProgressForeColor = System.Drawing.Color.Black; + this.lbCntQC.ProgressMax = 100F; + this.lbCntQC.ProgressMin = 0F; + this.lbCntQC.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbCntQC.ProgressValue = 0F; + this.lbCntQC.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbCntQC.Sign = ""; + this.lbCntQC.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbCntQC.SignColor = System.Drawing.Color.Yellow; + this.lbCntQC.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbCntQC.Size = new System.Drawing.Size(93, 49); + this.lbCntQC.TabIndex = 4; + this.lbCntQC.Text = "0000"; + this.lbCntQC.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbCntQC.TextShadow = true; + this.lbCntQC.TextVisible = true; + // + // arLabel9 + // + this.arLabel9.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel9.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel9.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel9.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.arLabel9.BorderColorOver = System.Drawing.Color.DarkBlue; + this.arLabel9.BorderSize = new System.Windows.Forms.Padding(0); + this.arLabel9.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel9.Cursor = System.Windows.Forms.Cursors.Arrow; + this.arLabel9.Dock = System.Windows.Forms.DockStyle.Left; + this.arLabel9.Font = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel9.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.arLabel9.GradientEnable = true; + this.arLabel9.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel9.GradientRepeatBG = false; + this.arLabel9.isButton = false; + this.arLabel9.Location = new System.Drawing.Point(0, 0); + this.arLabel9.Margin = new System.Windows.Forms.Padding(0); + this.arLabel9.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel9.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel9.msg = null; + this.arLabel9.Name = "arLabel9"; + this.arLabel9.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel9.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel9.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel9.ProgressEnable = false; + this.arLabel9.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel9.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel9.ProgressMax = 100F; + this.arLabel9.ProgressMin = 0F; + this.arLabel9.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel9.ProgressValue = 0F; + this.arLabel9.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel9.Sign = ""; + this.arLabel9.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel9.SignColor = System.Drawing.Color.Yellow; + this.arLabel9.SignFont = new System.Drawing.Font("Consolas", 15F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)))); + this.arLabel9.Size = new System.Drawing.Size(34, 49); + this.arLabel9.TabIndex = 4; + this.arLabel9.Text = "QC"; + this.arLabel9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel9.TextShadow = true; + this.arLabel9.TextVisible = true; + // + // panel16 + // + this.panel16.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.panel16.Controls.Add(this.lbCntDN); + this.panel16.Controls.Add(this.arLabel7); + this.panel16.Controls.Add(this.lbCNtUP); + this.panel16.Controls.Add(this.arLabel8); + this.panel16.Dock = System.Windows.Forms.DockStyle.Top; + this.panel16.Location = new System.Drawing.Point(5, 33); + this.panel16.Name = "panel16"; + this.panel16.Size = new System.Drawing.Size(259, 49); + this.panel16.TabIndex = 16; + // + // lbCntDN + // + this.lbCntDN.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCntDN.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCntDN.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbCntDN.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbCntDN.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbCntDN.BorderSize = new System.Windows.Forms.Padding(0); + this.lbCntDN.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbCntDN.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbCntDN.Dock = System.Windows.Forms.DockStyle.Left; + this.lbCntDN.Font = new System.Drawing.Font("Consolas", 25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbCntDN.ForeColor = System.Drawing.Color.Gray; + this.lbCntDN.GradientEnable = true; + this.lbCntDN.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbCntDN.GradientRepeatBG = false; + this.lbCntDN.isButton = false; + this.lbCntDN.Location = new System.Drawing.Point(161, 0); + this.lbCntDN.Margin = new System.Windows.Forms.Padding(0); + this.lbCntDN.MouseDownColor = System.Drawing.Color.Yellow; + this.lbCntDN.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbCntDN.msg = null; + this.lbCntDN.Name = "lbCntDN"; + this.lbCntDN.ProgressBorderColor = System.Drawing.Color.Black; + this.lbCntDN.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbCntDN.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbCntDN.ProgressEnable = false; + this.lbCntDN.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbCntDN.ProgressForeColor = System.Drawing.Color.Black; + this.lbCntDN.ProgressMax = 100F; + this.lbCntDN.ProgressMin = 0F; + this.lbCntDN.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbCntDN.ProgressValue = 0F; + this.lbCntDN.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbCntDN.Sign = ""; + this.lbCntDN.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbCntDN.SignColor = System.Drawing.Color.Yellow; + this.lbCntDN.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbCntDN.Size = new System.Drawing.Size(93, 49); + this.lbCntDN.TabIndex = 4; + this.lbCntDN.Text = "0000"; + this.lbCntDN.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbCntDN.TextShadow = true; + this.lbCntDN.TextVisible = true; + this.lbCntDN.Click += new System.EventHandler(this.lbCNtUp_Click); + // + // arLabel7 + // + this.arLabel7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel7.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel7.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel7.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.arLabel7.BorderColorOver = System.Drawing.Color.DarkBlue; + this.arLabel7.BorderSize = new System.Windows.Forms.Padding(0); + this.arLabel7.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel7.Cursor = System.Windows.Forms.Cursors.Arrow; + this.arLabel7.Dock = System.Windows.Forms.DockStyle.Left; + this.arLabel7.Font = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel7.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.arLabel7.GradientEnable = true; + this.arLabel7.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel7.GradientRepeatBG = false; + this.arLabel7.isButton = false; + this.arLabel7.Location = new System.Drawing.Point(127, 0); + this.arLabel7.Margin = new System.Windows.Forms.Padding(0); + this.arLabel7.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel7.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel7.msg = null; + this.arLabel7.Name = "arLabel7"; + this.arLabel7.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel7.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel7.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel7.ProgressEnable = false; + this.arLabel7.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel7.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel7.ProgressMax = 100F; + this.arLabel7.ProgressMin = 0F; + this.arLabel7.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel7.ProgressValue = 0F; + this.arLabel7.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel7.Sign = ""; + this.arLabel7.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel7.SignColor = System.Drawing.Color.Yellow; + this.arLabel7.SignFont = new System.Drawing.Font("Consolas", 15F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)))); + this.arLabel7.Size = new System.Drawing.Size(34, 49); + this.arLabel7.TabIndex = 4; + this.arLabel7.Text = "DN"; + this.arLabel7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel7.TextShadow = true; + this.arLabel7.TextVisible = true; + // + // lbCNtUP + // + this.lbCNtUP.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCNtUP.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbCNtUP.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbCNtUP.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbCNtUP.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbCNtUP.BorderSize = new System.Windows.Forms.Padding(0); + this.lbCNtUP.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbCNtUP.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbCNtUP.Dock = System.Windows.Forms.DockStyle.Left; + this.lbCNtUP.Font = new System.Drawing.Font("Consolas", 25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbCNtUP.ForeColor = System.Drawing.Color.Gray; + this.lbCNtUP.GradientEnable = true; + this.lbCNtUP.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbCNtUP.GradientRepeatBG = false; + this.lbCNtUP.isButton = false; + this.lbCNtUP.Location = new System.Drawing.Point(34, 0); + this.lbCNtUP.Margin = new System.Windows.Forms.Padding(0); + this.lbCNtUP.MouseDownColor = System.Drawing.Color.Yellow; + this.lbCNtUP.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbCNtUP.msg = null; + this.lbCNtUP.Name = "lbCNtUP"; + this.lbCNtUP.ProgressBorderColor = System.Drawing.Color.Black; + this.lbCNtUP.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbCNtUP.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbCNtUP.ProgressEnable = false; + this.lbCNtUP.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbCNtUP.ProgressForeColor = System.Drawing.Color.Black; + this.lbCNtUP.ProgressMax = 100F; + this.lbCNtUP.ProgressMin = 0F; + this.lbCNtUP.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbCNtUP.ProgressValue = 0F; + this.lbCNtUP.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbCNtUP.Sign = ""; + this.lbCNtUP.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbCNtUP.SignColor = System.Drawing.Color.Yellow; + this.lbCNtUP.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbCNtUP.Size = new System.Drawing.Size(93, 49); + this.lbCNtUP.TabIndex = 4; + this.lbCNtUP.Text = "0000"; + this.lbCNtUP.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbCNtUP.TextShadow = true; + this.lbCNtUP.TextVisible = true; + this.lbCNtUP.Click += new System.EventHandler(this.lbCNtUp_Click); + // + // arLabel8 + // + this.arLabel8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel8.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.arLabel8.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.arLabel8.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.arLabel8.BorderColorOver = System.Drawing.Color.DarkBlue; + this.arLabel8.BorderSize = new System.Windows.Forms.Padding(0); + this.arLabel8.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.arLabel8.Cursor = System.Windows.Forms.Cursors.Arrow; + this.arLabel8.Dock = System.Windows.Forms.DockStyle.Left; + this.arLabel8.Font = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.arLabel8.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + this.arLabel8.GradientEnable = true; + this.arLabel8.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.arLabel8.GradientRepeatBG = false; + this.arLabel8.isButton = false; + this.arLabel8.Location = new System.Drawing.Point(0, 0); + this.arLabel8.Margin = new System.Windows.Forms.Padding(0); + this.arLabel8.MouseDownColor = System.Drawing.Color.Yellow; + this.arLabel8.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.arLabel8.msg = null; + this.arLabel8.Name = "arLabel8"; + this.arLabel8.ProgressBorderColor = System.Drawing.Color.Black; + this.arLabel8.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arLabel8.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arLabel8.ProgressEnable = false; + this.arLabel8.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.arLabel8.ProgressForeColor = System.Drawing.Color.Black; + this.arLabel8.ProgressMax = 100F; + this.arLabel8.ProgressMin = 0F; + this.arLabel8.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arLabel8.ProgressValue = 0F; + this.arLabel8.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arLabel8.Sign = ""; + this.arLabel8.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.arLabel8.SignColor = System.Drawing.Color.Yellow; + this.arLabel8.SignFont = new System.Drawing.Font("Consolas", 15F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)))); + this.arLabel8.Size = new System.Drawing.Size(34, 49); + this.arLabel8.TabIndex = 4; + this.arLabel8.Text = "UP"; + this.arLabel8.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.arLabel8.TextShadow = true; + this.arLabel8.TextVisible = true; + // + // panel5 + // + this.panel5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.panel5.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel5.Location = new System.Drawing.Point(5, 549); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(259, 5); + this.panel5.TabIndex = 142; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Location = new System.Drawing.Point(5, 28); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(259, 5); + this.panel3.TabIndex = 144; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.panel1.Controls.Add(this.lbIDLE); + this.panel1.Controls.Add(this.lbStStep); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(5, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(259, 28); + this.panel1.TabIndex = 143; + // + // lbIDLE + // + this.lbIDLE.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbIDLE.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbIDLE.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbIDLE.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbIDLE.BorderColorOver = System.Drawing.Color.DodgerBlue; + this.lbIDLE.BorderSize = new System.Windows.Forms.Padding(0); + this.lbIDLE.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbIDLE.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbIDLE.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbIDLE.Font = new System.Drawing.Font("맑은 고딕", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbIDLE.ForeColor = System.Drawing.Color.Gold; + this.lbIDLE.GradientEnable = true; + this.lbIDLE.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbIDLE.GradientRepeatBG = false; + this.lbIDLE.isButton = false; + this.lbIDLE.Location = new System.Drawing.Point(70, 0); + this.lbIDLE.Margin = new System.Windows.Forms.Padding(0); + this.lbIDLE.MouseDownColor = System.Drawing.Color.Yellow; + this.lbIDLE.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbIDLE.msg = null; + this.lbIDLE.Name = "lbIDLE"; + this.lbIDLE.ProgressBorderColor = System.Drawing.Color.Black; + this.lbIDLE.ProgressColor1 = System.Drawing.Color.DarkCyan; + this.lbIDLE.ProgressColor2 = System.Drawing.Color.DarkTurquoise; + this.lbIDLE.ProgressEnable = true; + this.lbIDLE.ProgressFont = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbIDLE.ProgressForeColor = System.Drawing.Color.DimGray; + this.lbIDLE.ProgressMax = 100F; + this.lbIDLE.ProgressMin = 0F; + this.lbIDLE.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbIDLE.ProgressValue = 50F; + this.lbIDLE.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbIDLE.Sign = ""; + this.lbIDLE.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbIDLE.SignColor = System.Drawing.Color.Yellow; + this.lbIDLE.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbIDLE.Size = new System.Drawing.Size(189, 28); + this.lbIDLE.TabIndex = 4; + this.lbIDLE.Text = "75%"; + this.lbIDLE.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbIDLE.TextShadow = true; + this.lbIDLE.TextVisible = true; + // + // lbStStep + // + this.lbStStep.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbStStep.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.lbStStep.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.lbStStep.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.lbStStep.BorderColorOver = System.Drawing.Color.DarkBlue; + this.lbStStep.BorderSize = new System.Windows.Forms.Padding(0); + this.lbStStep.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.lbStStep.Cursor = System.Windows.Forms.Cursors.Arrow; + this.lbStStep.Dock = System.Windows.Forms.DockStyle.Left; + this.lbStStep.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbStStep.ForeColor = System.Drawing.Color.White; + this.lbStStep.GradientEnable = true; + this.lbStStep.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.lbStStep.GradientRepeatBG = false; + this.lbStStep.isButton = false; + this.lbStStep.Location = new System.Drawing.Point(0, 0); + this.lbStStep.Margin = new System.Windows.Forms.Padding(0); + this.lbStStep.MouseDownColor = System.Drawing.Color.Yellow; + this.lbStStep.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lbStStep.msg = null; + this.lbStStep.Name = "lbStStep"; + this.lbStStep.ProgressBorderColor = System.Drawing.Color.Black; + this.lbStStep.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.lbStStep.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.lbStStep.ProgressEnable = false; + this.lbStStep.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.lbStStep.ProgressForeColor = System.Drawing.Color.Black; + this.lbStStep.ProgressMax = 100F; + this.lbStStep.ProgressMin = 0F; + this.lbStStep.ProgressPadding = new System.Windows.Forms.Padding(0); + this.lbStStep.ProgressValue = 0F; + this.lbStStep.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.lbStStep.Sign = ""; + this.lbStStep.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.lbStStep.SignColor = System.Drawing.Color.Yellow; + this.lbStStep.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.lbStStep.Size = new System.Drawing.Size(70, 28); + this.lbStStep.TabIndex = 4; + this.lbStStep.Text = "--"; + this.lbStStep.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.lbStStep.TextShadow = true; + this.lbStStep.TextVisible = true; + // + // panTopMenu + // + this.panTopMenu.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.panTopMenu.Controls.Add(this.lbBat); + this.panTopMenu.Controls.Add(this.MenuLog); + this.panTopMenu.Controls.Add(this.MenuFlag); + this.panTopMenu.Controls.Add(this.MenuBMS); + this.panTopMenu.Controls.Add(this.MenuAGV); + this.panTopMenu.Controls.Add(this.btDebug); + this.panTopMenu.Controls.Add(this.btOpenDir); + this.panTopMenu.Controls.Add(this.btMReset); + this.panTopMenu.Controls.Add(this.btCapture); + this.panTopMenu.Controls.Add(this.arLabel3); + this.panTopMenu.Controls.Add(this.MenuLift); + this.panTopMenu.Controls.Add(this.MenuMAN); + this.panTopMenu.Controls.Add(this.MenuAuto); + this.panTopMenu.Controls.Add(this.pictureBox1); + this.panTopMenu.Controls.Add(this.arLabel2); + this.panTopMenu.Controls.Add(this.arLabel5); + this.panTopMenu.Controls.Add(this.btClose); + this.panTopMenu.Dock = System.Windows.Forms.DockStyle.Top; + this.panTopMenu.Location = new System.Drawing.Point(1, 1); + this.panTopMenu.Name = "panTopMenu"; + this.panTopMenu.Size = new System.Drawing.Size(1278, 50); + this.panTopMenu.TabIndex = 134; + // + // lbBat + // + this.lbBat.BorderColor = System.Drawing.Color.DimGray; + this.lbBat.CurA = 0F; + this.lbBat.Dock = System.Windows.Forms.DockStyle.Right; + this.lbBat.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbBat.ForeColor = System.Drawing.Color.Gray; + this.lbBat.IsOpen = true; + this.lbBat.Location = new System.Drawing.Point(830, 0); + this.lbBat.MaxA = 0F; + this.lbBat.Name = "lbBat"; + this.lbBat.Padding = new System.Windows.Forms.Padding(0, 12, 0, 12); + this.lbBat.sign = "%"; + this.lbBat.Size = new System.Drawing.Size(48, 50); + this.lbBat.TabIndex = 23; + this.lbBat.Text = "12"; + this.lbBat.VLevel = 50F; + this.lbBat.Volt = 0F; + this.lbBat.Click += new System.EventHandler(this.lbBat_Click); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(0, 0); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(49, 50); + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click); + // + // cmDebug + // + this.cmDebug.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.systemParameterToolStripMenuItem, + this.toolStripMenuItem4, + this.demoRunToolStripMenuItem, + this.setZValidToolStripMenuItem, + this.toolStripMenuItem1, + this.gridviewTestToolStripMenuItem, + this.으ㅆㄷㄴㅅToolStripMenuItem, + this.messageToolStripMenuItem, + this.reloadLotListToolStripMenuItem, + this.moveSourceListToDestListToolStripMenuItem, + this.needShowUploadTrueToolStripMenuItem, + this.선택상태보기ToolStripMenuItem, + this.toolStripMenuItem5, + this.demoListLotToolStripMenuItem, + this.refreshListToolStripMenuItem}); + this.cmDebug.Name = "cmVision"; + this.cmDebug.Size = new System.Drawing.Size(229, 302); + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(228, 22); + this.toolStripMenuItem5.Text = "--"; + // + // demoListLotToolStripMenuItem + // + this.demoListLotToolStripMenuItem.Name = "demoListLotToolStripMenuItem"; + this.demoListLotToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.demoListLotToolStripMenuItem.Text = "demo List (Lot)"; + // + // refreshListToolStripMenuItem + // + this.refreshListToolStripMenuItem.Name = "refreshListToolStripMenuItem"; + this.refreshListToolStripMenuItem.Size = new System.Drawing.Size(228, 22); + this.refreshListToolStripMenuItem.Text = "Refresh List"; + // + // debugtestToolStripMenuItem + // + this.debugtestToolStripMenuItem.Name = "debugtestToolStripMenuItem"; + this.debugtestToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.debugtestToolStripMenuItem.Text = "debugtest"; + // + // pandBottomDIO + // + this.pandBottomDIO.Controls.Add(this.panel9); + this.pandBottomDIO.Dock = System.Windows.Forms.DockStyle.Bottom; + this.pandBottomDIO.Location = new System.Drawing.Point(1, 725); + this.pandBottomDIO.Margin = new System.Windows.Forms.Padding(0); + this.pandBottomDIO.Name = "pandBottomDIO"; + this.pandBottomDIO.Size = new System.Drawing.Size(1278, 55); + this.pandBottomDIO.TabIndex = 136; + // + // panel9 + // + this.panel9.Controls.Add(this.IOState); + this.panel9.Controls.Add(this.SSInfo); + this.panel9.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel9.Location = new System.Drawing.Point(0, 0); + this.panel9.Margin = new System.Windows.Forms.Padding(0); + this.panel9.Name = "panel9"; + this.panel9.Size = new System.Drawing.Size(1278, 55); + this.panel9.TabIndex = 0; + // + // IOState + // + this.IOState.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.IOState.BorderSize = 0; + colorListItem1.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem1.Remark = ""; + colorListItem2.BackColor1 = System.Drawing.Color.ForestGreen; + colorListItem2.BackColor2 = System.Drawing.Color.ForestGreen; + colorListItem2.Remark = ""; + colorListItem3.BackColor1 = System.Drawing.Color.Firebrick; + colorListItem3.BackColor2 = System.Drawing.Color.Firebrick; + colorListItem3.Remark = ""; + colorListItem4.BackColor1 = System.Drawing.Color.Purple; + colorListItem4.BackColor2 = System.Drawing.Color.Purple; + colorListItem4.Remark = ""; + colorListItem5.BackColor1 = System.Drawing.Color.SteelBlue; + colorListItem5.BackColor2 = System.Drawing.Color.SteelBlue; + colorListItem5.Remark = ""; + colorListItem6.BackColor1 = System.Drawing.Color.DarkGoldenrod; + colorListItem6.BackColor2 = System.Drawing.Color.DarkGoldenrod; + colorListItem6.Remark = ""; + colorListItem7.BackColor1 = System.Drawing.Color.Teal; + colorListItem7.BackColor2 = System.Drawing.Color.Teal; + colorListItem7.Remark = ""; + this.IOState.ColorList = new arFrame.Control.ColorListItem[] { + colorListItem1, + colorListItem2, + colorListItem3, + colorListItem4, + colorListItem5, + colorListItem6, + colorListItem7}; + this.IOState.Dock = System.Windows.Forms.DockStyle.Fill; + this.IOState.Font = new System.Drawing.Font("Consolas", 20F, System.Drawing.FontStyle.Bold); + this.IOState.FontPin = new System.Drawing.Font("Consolas", 8F, System.Drawing.FontStyle.Bold); + this.IOState.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.IOState.ForeColorPin = System.Drawing.Color.WhiteSmoke; + this.IOState.Location = new System.Drawing.Point(0, 0); + this.IOState.MatrixSize = new System.Drawing.Point(11, 1); + this.IOState.MenuBorderSize = 1; + this.IOState.MenuGap = 5; + this.IOState.MinimumSize = new System.Drawing.Size(100, 0); + this.IOState.Name = "IOState"; + this.IOState.Names = new string[] { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ""}; + this.IOState.ShadowColor = System.Drawing.Color.Transparent; + this.IOState.showDebugInfo = false; + this.IOState.ShowIndexString = false; + this.IOState.Size = new System.Drawing.Size(1151, 55); + this.IOState.TabIndex = 6; + this.IOState.Tags = null; + this.IOState.Text = "gridView2"; + this.IOState.TextAttachToImage = true; + this.IOState.Titles = new string[] { + "EMG|TAG|DIR|STS|SPD|SEN|CAL|RUN|MARK|CHG|ITM"}; + this.IOState.Values = new ushort[] { + ((ushort)(0)), + ((ushort)(1)), + ((ushort)(2)), + ((ushort)(3)), + ((ushort)(4)), + ((ushort)(5)), + ((ushort)(6)), + ((ushort)(7)), + ((ushort)(8)), + ((ushort)(8)), + ((ushort)(8))}; + this.IOState.ItemClick += new System.EventHandler(this.IOState_ItemClick_1); + // + // SSInfo + // + this.SSInfo.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.SSInfo.BorderSize = 0; + colorListItem8.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem8.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + colorListItem8.Remark = ""; + colorListItem9.BackColor1 = System.Drawing.Color.Lime; + colorListItem9.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + colorListItem9.Remark = ""; + colorListItem10.BackColor1 = System.Drawing.Color.Red; + colorListItem10.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + colorListItem10.Remark = ""; + colorListItem11.BackColor1 = System.Drawing.Color.DarkViolet; + colorListItem11.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + colorListItem11.Remark = ""; + this.SSInfo.ColorList = new arFrame.Control.ColorListItem[] { + colorListItem8, + colorListItem9, + colorListItem10, + colorListItem11}; + this.SSInfo.Dock = System.Windows.Forms.DockStyle.Right; + this.SSInfo.Font = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Bold); + this.SSInfo.FontPin = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Bold); + this.SSInfo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200))))); + this.SSInfo.ForeColorPin = System.Drawing.Color.WhiteSmoke; + this.SSInfo.Location = new System.Drawing.Point(1151, 0); + this.SSInfo.MatrixSize = new System.Drawing.Point(2, 2); + this.SSInfo.MenuBorderSize = 1; + this.SSInfo.MenuGap = 5; + this.SSInfo.MinimumSize = new System.Drawing.Size(100, 0); + this.SSInfo.Name = "SSInfo"; + this.SSInfo.Names = new string[] { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ""}; + this.SSInfo.ShadowColor = System.Drawing.Color.Transparent; + this.SSInfo.showDebugInfo = false; + this.SSInfo.ShowIndexString = false; + this.SSInfo.Size = new System.Drawing.Size(127, 55); + this.SSInfo.TabIndex = 10; + this.SSInfo.Tags = null; + this.SSInfo.Text = "gridView3"; + this.SSInfo.TextAttachToImage = true; + this.SSInfo.Titles = new string[] { + "STEPINFO|FREESPACE", + "INFO1|INFO2"}; + this.SSInfo.Values = new ushort[] { + ((ushort)(0)), + ((ushort)(0)), + ((ushort)(0)), + ((ushort)(0))}; + this.SSInfo.Click += new System.EventHandler(this.SSInfo_Click); + // + // panDlg + // + this.panDlg.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(64))))); + this.panDlg.Dock = System.Windows.Forms.DockStyle.Fill; + this.panDlg.Location = new System.Drawing.Point(1, 146); + this.panDlg.Margin = new System.Windows.Forms.Padding(0); + this.panDlg.Name = "panDlg"; + this.panDlg.Size = new System.Drawing.Size(1014, 579); + this.panDlg.TabIndex = 146; + // + // arPanel2 + // + this.arPanel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(5)))), ((int)(((byte)(5))))); + this.arPanel2.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arPanel2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25))))); + this.arPanel2.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 5); + this.arPanel2.Dock = System.Windows.Forms.DockStyle.Top; + this.arPanel2.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Italic); + this.arPanel2.ForeColor = System.Drawing.Color.Khaki; + this.arPanel2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arPanel2.GradientRepeatBG = false; + this.arPanel2.Location = new System.Drawing.Point(1, 143); + this.arPanel2.Name = "arPanel2"; + this.arPanel2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arPanel2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arPanel2.ProgressMax = 100F; + this.arPanel2.ProgressMin = 0F; + this.arPanel2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arPanel2.ProgressValue = 0F; + this.arPanel2.ShadowColor = System.Drawing.Color.Black; + this.arPanel2.ShowBorder = true; + this.arPanel2.Size = new System.Drawing.Size(1278, 3); + this.arPanel2.TabIndex = 145; + this.arPanel2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.arPanel2.TextShadow = false; + this.arPanel2.UseProgressBar = false; + // + // arPanel1 + // + this.arPanel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(5)))), ((int)(((byte)(5)))), ((int)(((byte)(5))))); + this.arPanel1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.arPanel1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(25)))), ((int)(((byte)(25)))), ((int)(((byte)(25))))); + this.arPanel1.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 5); + this.arPanel1.Dock = System.Windows.Forms.DockStyle.Top; + this.arPanel1.Font = new System.Drawing.Font("Consolas", 10F, System.Drawing.FontStyle.Italic); + this.arPanel1.ForeColor = System.Drawing.Color.Khaki; + this.arPanel1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.arPanel1.GradientRepeatBG = false; + this.arPanel1.Location = new System.Drawing.Point(1, 51); + this.arPanel1.Name = "arPanel1"; + this.arPanel1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.arPanel1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.arPanel1.ProgressMax = 100F; + this.arPanel1.ProgressMin = 0F; + this.arPanel1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.arPanel1.ProgressValue = 0F; + this.arPanel1.ShadowColor = System.Drawing.Color.Black; + this.arPanel1.ShowBorder = true; + this.arPanel1.Size = new System.Drawing.Size(1278, 4); + this.arPanel1.TabIndex = 135; + this.arPanel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.arPanel1.TextShadow = false; + this.arPanel1.UseProgressBar = false; + // + // ctlPos1 + // + this.ctlPos1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32))))); + this.ctlPos1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.ctlPos1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.ctlPos1.Dock = System.Windows.Forms.DockStyle.Top; + this.ctlPos1.Font = new System.Drawing.Font("맑은 고딕", 30F, System.Drawing.FontStyle.Bold); + this.ctlPos1.ForeColor = System.Drawing.Color.White; + this.ctlPos1.ItemGap = 5; + item1.Active = true; + item1.Direction = '1'; + item1.Enable_Direction = true; + item1.Focus = false; + item1.fullrect = new System.Drawing.Rectangle(8, 8, 10, 75); + item1.ItemType = Project.CtlPos.itemtype.NLimit; + item1.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item1.Position = Project.ePosition.NOT; + item1.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item1.Target = false; + item1.Title = "N"; + item2.Active = false; + item2.Direction = '1'; + item2.Enable_Direction = true; + item2.Focus = false; + item2.fullrect = new System.Drawing.Rectangle(23, 8, 138, 58); + item2.ItemType = Project.CtlPos.itemtype.Item; + item2.leftrect = new System.Drawing.Rectangle(23, 70, 67, 13); + item2.Position = Project.ePosition.QA; + item2.rightrect = new System.Drawing.Rectangle(94, 70, 67, 13); + item2.Target = false; + item2.Title = "QC"; + item3.Active = false; + item3.Direction = '0'; + item3.Enable_Direction = true; + item3.Focus = false; + item3.fullrect = new System.Drawing.Rectangle(166, 8, 10, 75); + item3.ItemType = Project.CtlPos.itemtype.Spacer; + item3.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item3.Position = Project.ePosition.QA_QC; + item3.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item3.Target = false; + item3.Title = null; + item4.Active = false; + item4.Direction = '1'; + item4.Enable_Direction = true; + item4.Focus = false; + item4.fullrect = new System.Drawing.Rectangle(181, 8, 138, 58); + item4.ItemType = Project.CtlPos.itemtype.Item; + item4.leftrect = new System.Drawing.Rectangle(181, 70, 67, 13); + item4.Position = Project.ePosition.QC; + item4.rightrect = new System.Drawing.Rectangle(252, 70, 67, 13); + item4.Target = true; + item4.Title = "QA"; + item5.Active = true; + item5.Direction = '0'; + item5.Enable_Direction = false; + item5.Focus = true; + item5.fullrect = new System.Drawing.Rectangle(324, 8, 138, 75); + item5.ItemType = Project.CtlPos.itemtype.Item; + item5.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item5.Position = Project.ePosition.CHARGE; + item5.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item5.Target = false; + item5.Title = "BAT"; + item6.Active = false; + item6.Direction = '0'; + item6.Enable_Direction = true; + item6.Focus = false; + item6.fullrect = new System.Drawing.Rectangle(467, 8, 10, 75); + item6.ItemType = Project.CtlPos.itemtype.Spacer; + item6.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item6.Position = Project.ePosition.QC_F1; + item6.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item6.Target = false; + item6.Title = null; + item7.Active = false; + item7.Direction = '2'; + item7.Enable_Direction = true; + item7.Focus = false; + item7.fullrect = new System.Drawing.Rectangle(482, 8, 138, 58); + item7.ItemType = Project.CtlPos.itemtype.Item; + item7.leftrect = new System.Drawing.Rectangle(482, 70, 67, 13); + item7.Position = Project.ePosition.F1; + item7.rightrect = new System.Drawing.Rectangle(553, 70, 67, 13); + item7.Target = false; + item7.Title = "#1"; + item8.Active = false; + item8.Direction = '0'; + item8.Enable_Direction = true; + item8.Focus = false; + item8.fullrect = new System.Drawing.Rectangle(625, 8, 10, 75); + item8.ItemType = Project.CtlPos.itemtype.Spacer; + item8.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item8.Position = Project.ePosition.F1_F2; + item8.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item8.Target = false; + item8.Title = null; + item9.Active = false; + item9.Direction = '0'; + item9.Enable_Direction = true; + item9.Focus = false; + item9.fullrect = new System.Drawing.Rectangle(640, 8, 138, 58); + item9.ItemType = Project.CtlPos.itemtype.Item; + item9.leftrect = new System.Drawing.Rectangle(640, 70, 67, 13); + item9.Position = Project.ePosition.F2; + item9.rightrect = new System.Drawing.Rectangle(711, 70, 67, 13); + item9.Target = false; + item9.Title = "#2"; + item10.Active = false; + item10.Direction = '0'; + item10.Enable_Direction = true; + item10.Focus = false; + item10.fullrect = new System.Drawing.Rectangle(783, 8, 10, 75); + item10.ItemType = Project.CtlPos.itemtype.Spacer; + item10.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item10.Position = Project.ePosition.F2_F3; + item10.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item10.Target = false; + item10.Title = null; + item11.Active = false; + item11.Direction = '1'; + item11.Enable_Direction = true; + item11.Focus = false; + item11.fullrect = new System.Drawing.Rectangle(798, 8, 138, 58); + item11.ItemType = Project.CtlPos.itemtype.Item; + item11.leftrect = new System.Drawing.Rectangle(798, 70, 67, 13); + item11.Position = Project.ePosition.F3; + item11.rightrect = new System.Drawing.Rectangle(869, 70, 67, 13); + item11.Target = false; + item11.Title = "#3"; + item12.Active = false; + item12.Direction = '0'; + item12.Enable_Direction = true; + item12.Focus = false; + item12.fullrect = new System.Drawing.Rectangle(941, 8, 10, 75); + item12.ItemType = Project.CtlPos.itemtype.Spacer; + item12.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item12.Position = Project.ePosition.F3_F4; + item12.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item12.Target = false; + item12.Title = null; + item13.Active = false; + item13.Direction = '2'; + item13.Enable_Direction = true; + item13.Focus = false; + item13.fullrect = new System.Drawing.Rectangle(956, 8, 138, 58); + item13.ItemType = Project.CtlPos.itemtype.Item; + item13.leftrect = new System.Drawing.Rectangle(956, 70, 67, 13); + item13.Position = Project.ePosition.F4; + item13.rightrect = new System.Drawing.Rectangle(1027, 70, 67, 13); + item13.Target = false; + item13.Title = "#4"; + item14.Active = false; + item14.Direction = '0'; + item14.Enable_Direction = true; + item14.Focus = false; + item14.fullrect = new System.Drawing.Rectangle(1099, 8, 10, 75); + item14.ItemType = Project.CtlPos.itemtype.Spacer; + item14.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item14.Position = Project.ePosition.F4_F5; + item14.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item14.Target = false; + item14.Title = null; + item15.Active = false; + item15.Direction = '2'; + item15.Enable_Direction = true; + item15.Focus = false; + item15.fullrect = new System.Drawing.Rectangle(1114, 8, 138, 58); + item15.ItemType = Project.CtlPos.itemtype.Item; + item15.leftrect = new System.Drawing.Rectangle(1114, 70, 67, 13); + item15.Position = Project.ePosition.F5; + item15.rightrect = new System.Drawing.Rectangle(1185, 70, 67, 13); + item15.Target = false; + item15.Title = "#5"; + item16.Active = true; + item16.Direction = '1'; + item16.Enable_Direction = true; + item16.Focus = false; + item16.fullrect = new System.Drawing.Rectangle(1257, 8, 10, 75); + item16.ItemType = Project.CtlPos.itemtype.PLimit; + item16.leftrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item16.Position = Project.ePosition.POT; + item16.rightrect = new System.Drawing.Rectangle(0, 0, 0, 0); + item16.Target = false; + item16.Title = "P"; + this.ctlPos1.Items = new Project.CtlPos.item[] { + item1, + item2, + item3, + item4, + item5, + item6, + item7, + item8, + item9, + item10, + item11, + item12, + item13, + item14, + item15, + item16}; + this.ctlPos1.Location = new System.Drawing.Point(1, 55); + this.ctlPos1.MinimumSize = new System.Drawing.Size(100, 30); + this.ctlPos1.msg = null; + this.ctlPos1.Name = "ctlPos1"; + this.ctlPos1.Padding = new System.Windows.Forms.Padding(8); + this.ctlPos1.Size = new System.Drawing.Size(1278, 88); + this.ctlPos1.TabIndex = 0; + this.ctlPos1.Text = "ctlPos1"; + // + // fMain + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.ClientSize = new System.Drawing.Size(1280, 781); + this.Controls.Add(this.panDlg); + this.Controls.Add(this.panRight); + this.Controls.Add(this.arPanel2); + this.Controls.Add(this.pandBottomDIO); + this.Controls.Add(this.ctlPos1); + this.Controls.Add(this.arPanel1); + this.Controls.Add(this.panTopMenu); + this.DoubleBuffered = true; + this.Font = new System.Drawing.Font("Calibri", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; + this.Name = "fMain"; + this.Padding = new System.Windows.Forms.Padding(1); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.@__Load); + this.panRight.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.panel4.ResumeLayout(false); + this.panel16.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panTopMenu.ResumeLayout(false); + this.panTopMenu.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.cmDebug.ResumeLayout(false); + this.pandBottomDIO.ResumeLayout(false); + this.panel9.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Timer tmDisplay; + private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.ToolStripMenuItem systemParameterToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem demoRunToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem setZValidToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem gridviewTestToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem 으ㅆㄷㄴㅅToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem messageToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem errorToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem informationToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem attentionToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reloadLotListToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveSourceListToDestListToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem needShowUploadTrueToolStripMenuItem; + private System.Windows.Forms.DataGridViewTextBoxColumn idxDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn stripIdDataGridViewTextBoxColumn2; + private System.Windows.Forms.DataGridViewTextBoxColumn oKDataGridViewTextBoxColumn2; + private System.Windows.Forms.DataGridViewTextBoxColumn nGDataGridViewTextBoxColumn2; + private System.Windows.Forms.DataGridViewTextBoxColumn mISSDataGridViewTextBoxColumn2; + private System.Windows.Forms.DataGridViewTextBoxColumn fileMapDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn dataPathDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn mapOriginDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn mapArrayDataGridViewTextBoxColumn; + private System.Windows.Forms.Panel panRight; + private System.Windows.Forms.ToolStripMenuItem 선택상태보기ToolStripMenuItem; + private System.Windows.Forms.Panel panTopMenu; + private arCtl.arLabel btDebug; + private arCtl.arLabel btOpenDir; + private arCtl.arLabel btMReset; + private arCtl.arLabel btCapture; + private arCtl.arLabel arLabel3; + private arCtl.arLabel arLabel5; + private arCtl.arLabel btClose; + private System.Windows.Forms.Button MenuLift; + private System.Windows.Forms.Button MenuMAN; + private System.Windows.Forms.PictureBox pictureBox1; + private arCtl.arPanel arPanel1; + private System.Windows.Forms.ContextMenuStrip cmDebug; + private System.Windows.Forms.ToolStripMenuItem debugtestToolStripMenuItem; + private System.Windows.Forms.Panel pandBottomDIO; + private System.Windows.Forms.Panel panel9; + private arFrame.Control.GridView IOState; + private System.Windows.Forms.Panel panel16; + private arCtl.arLabel lbCntDN; + private arCtl.arLabel arLabel7; + private arCtl.arLabel lbCNtUP; + private arCtl.arLabel arLabel8; + private arCtl.arLabel lbTime; + private arFrame.Control.GridView SSInfo; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem demoListLotToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem refreshListToolStripMenuItem; + private arCtl.arLabel btChargeA; + private System.Windows.Forms.Panel panel5; + private arCtl.arPanel arPanel2; + private System.Windows.Forms.Button MenuFlag; + private System.Windows.Forms.Button MenuAuto; + private System.Windows.Forms.Panel panDlg; + private System.Windows.Forms.Button MenuLog; + private CtlPos ctlPos1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private arCtl.arLabel btHome; + private arCtl.arLabel arLabel2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Panel panel1; + private arCtl.arLabel lbIDLE; + private arCtl.arLabel lbStStep; + private arCtl.arLabel btAutoRun; + private System.Windows.Forms.Button MenuBMS; + private System.Windows.Forms.Button MenuAGV; + private AGVControl.BatteryLevelGauge lbBat; + private arCtl.arLabel btChargeM; + private System.Windows.Forms.Panel panel4; + private arCtl.arLabel lbCntQA; + private arCtl.arLabel arLabel4; + private arCtl.arLabel lbCntQC; + private arCtl.arLabel arLabel9; + } +} + diff --git a/Cs_HMI/Project/fMain.cs b/Cs_HMI/Project/fMain.cs new file mode 100644 index 0000000..c0249be --- /dev/null +++ b/Cs_HMI/Project/fMain.cs @@ -0,0 +1,1029 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using static Project.StateMachine; +using Microsoft.Speech.Synthesis; +using Microsoft.Speech; +using COMM; +using System.CodeDom; + +namespace Project +{ + public partial class fMain : Form + { + double freeSpaceRate = 0.0; + + //뷰어용화면 + ViewForm.fAuto form_auto = null; + ViewForm.fManual form_manu = null; + ViewForm.fIO form_zlift = null; + ViewForm.fFlag form_flag = null; + ViewForm.fAgv form_agv = null; + ViewForm.fBms form_bms = null; + + readonly usbdetect.DriveDetector usbdet; + public fMain() + { + InitializeComponent(); + COMM.VAR.Init(128); + PUB.initCore(); + this.KeyDown += (s1, e1) => + { + if (e1.KeyCode == Keys.Escape) this.Close(); + else if (e1.KeyCode == Keys.F1 && e1.Control && e1.Shift) + { + + } + else if (e1.KeyCode == Keys.F5) btAutoRun.PerformClick(); + else if (e1.KeyCode == Keys.F9) btAutoRun.PerformClick(); + + if (DateTime.Now > PUB.LastInputTime) PUB.LastInputTime = DateTime.Now; + }; + usbdet = new usbdetect.DriveDetector(this); + usbdet.DeviceArrived += Usbdet_DeviceArrived; + usbdet.DeviceRemoved += Usbdet_DeviceRemoved; + + this.panTopMenu.MouseMove += LbTitle_MouseMove; + this.panTopMenu.MouseUp += LbTitle_MouseUp; + this.panTopMenu.MouseDown += LbTitle_MouseDown; + this.panTopMenu.DoubleClick += LbTitle_DoubleClick; + + this.ctlPos1.ItemClick += CtlPos1_ItemClick; + this.MouseMove += (s1, e1) => { if (DateTime.Now > PUB.LastInputTime) PUB.LastInputTime = DateTime.Now; }; + this.FormClosing += __Closing; + + if (PUB.setting.FullScreen) this.WindowState = FormWindowState.Maximized; + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + if (usbdet != null) + { + usbdet.WndProc(ref m); + } + } + + private void Usbdet_DeviceRemoved(object sender, usbdetect.DriveDetectorEventArgs e) + { + //throw new NotImplementedException(); + Console.WriteLine(e.Drive); + } + + private void Usbdet_DeviceArrived(object sender, usbdetect.DriveDetectorEventArgs e) + { + //throw new NotImplementedException(); + using (var fUpdate = new Dialog.fUpdateForm(e.Drive)) + if (fUpdate.ShowDialog() == DialogResult.Yes) + { + //종료한다 + remoteClose = true; + this.Close(); + } + } + + /// + /// 상단 위치 표시기의 대상 위치값을 표시 합니다 + /// + /// + /// + private void Display_Position_TargetPosSet(object sender, EventArgs e) + { + //대상위치가 설정되었다x + this.ctlPos1.SetTargetPosition(PUB.Result.TargetPos); + this.ctlPos1.Invalidate(); + } + + bool remoteClose = false; + bool forceClose = false; + private void __Closing(object sender, FormClosingEventArgs e) + { + PUB.popup.needClose = true; + if (remoteClose == true) + { + PUB.log.Add("패치로 인해 프로그램을 종료 합니다"); + PUB.sm.SetNewStep(eSMStep.IDLE); + //_Close_Start(); + _STEP_CLOSING_START(PUB.sm.Step); + PUB.sm.Stop(); + + var patchfile = new System.IO.FileInfo(System.IO.Path.Combine(Util.CurrentPath, "SWPatch.exe")); + if (patchfile.Exists == false) + { + Util.MsgE("패치파일(" + patchfile.Name + ")이 없습니다.\n프로그램을 다시 실행해주세요", true); + } + else + { + Util.RunProcess(patchfile.FullName); + } + } + else if (forceClose == true) + { + PUB.log.Add("강제 종료"); + PUB.sm.SetNewStep(eSMStep.IDLE); + //_Close_Start(); + _STEP_CLOSING_START(PUB.sm.Step); + PUB.sm.Stop(); + + + } + else + { + if (PUB.sm.Step == eSMStep.RUN) + { + Util.MsgE("동작 중에는 종료 할 수 없습니다."); + e.Cancel = true; + return; + } + if (PUB.sm.Step < eSMStep.CLOSING) + { + var rlt = Util.MsgQ("종료하시겠습니까"); + if (rlt == System.Windows.Forms.DialogResult.Yes) + { + //비젼의 측정상태가 변경된 경우 + PUB.sm.SetNewStep(eSMStep.CLOSING, true); + + } + e.Cancel = true; + return; + //_Close_Start(); + } + } + + } + + short[] FlagMapValue; + private void __Load(object sender, EventArgs e) + { + this.Text = Application.ProductName + " ver " + Application.ProductVersion; + //this.lbTitle.Text = this.Text; + PUB.init(); //public initialize + if (PUB.setting.FullScreen) this.WindowState = FormWindowState.Maximized; + // PUB.log.RaiseMsg += log_RaiseMsg; + this.Show(); + + PUB.Result.TargetPosSet += Display_Position_TargetPosSet; + + this.ctlPos1.ClearData(); + this.ctlPos1.Invalidate(); + + //lbDM1.Text = ""; + //sbBatteryLv.Text = ""; + btHome.Text = "홈"; + btChargeA.Text = "자동충전"; + VAR.STR[eVarString.SWVersion] = Application.ProductVersion; + Application.DoEvents(); + + //setting dio events + this.IOState.ItemClick += gridView2_ItemClick; + //PUB.flag.ValueChanged += Flag_ValueChagned; + VAR.BOOL.PropertyChanged += BOOL_PropertyChanged; + + + ///모터용 pLC + PUB.PLC = new arDev.FakePLC(); + PUB.PLC.ValueChanged += PLC_DioChanged; + PUB.PLC.FlagChanged += PLC_FlagChanged; + PUB.PLC.Message += PLC_Message; + + //지그비통신 + PUB.XBE = new Device.Xbee(); + PUB.XBE.Message += Xbee_Message; + //HWState.setTitle(1, 3, Pub.setting.Port_Xbee); + //HWState.setTitle(1, 0, Pub.setting.Address_RFID); + + //AGV + PUB.AGV = new arDev.Narumi(); + PUB.AGV.Message += AGV_Message; + PUB.AGV.DataReceive += AGV_DataReceive; + + + //배터리관리시스템 + PUB.BMS = new arDev.BMS(); + PUB.BMS.BMSDataReceive += Bms_BMSDataReceive; + PUB.BMS.Message += Bms_Message; + PUB.BMS.ChargeDetect += BMS_ChargeDetect; + + + //디버그메세지 출력용 소켓 + PUB.sock_debug = new Device.Socket(); + PUB.sock_debug.GetMessage += socket_GetMessage; + PUB.sock_debug.RecvMessage += socket_RecvMessage; + PUB.sock_debug.SendMessage += socket_SendMessage; + + //clear + Resultclear(); + + //충전이 시작되지 않도록 기본값을 넣는다 + VAR.TIME[eVarTime.ChargeTry] = DateTime.Now; + VAR.TIME[eVarTime.ChargeSearch] = DateTime.Now; + + PUB.sm.SetMsgOptOff(); //모든 메세지출력을 해제한다. (이벤트는 동작함) + + PUB.log.Add("State Machine Start"); + PUB.sm = new StateMachine(); + PUB.sm.StepChanged += sm_StepChanged; + PUB.sm.Message += sm_Message; + PUB.sm.Running += sm_Running; + PUB.sm.SPS += sm_SPS; + PUB.sm.Start(); + + tmDisplay.Start(); //start Display + this.btDebug.Visible = PUB.setting.UseDebugMode; + + PUB.log.Add("Program Start"); + UpdateControlText(); + + //수량표시 + PUB.counter.PropertyChanged += Counter_PropertyChanged; + Update_Count(); + + PUB.log.Add("프로그램 실행 기록 추가"); + PUB.CheckNRegister3(Application.ProductName, "chi", Application.ProductVersion); + + if (PUB.setting.StartLog) + MenuLog.PerformClick(); + + PUB.AddEEDB("프로그램 시작"); + + } + + + private void Counter_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + //수량에 변화가 잇다면 업데이트 한다 + Update_Count(); + } + + + #region "Mouse Form Move" + + private Boolean fMove = false; + private Point MDownPos; + + private void LbTitle_DoubleClick(object sender, EventArgs e) + { + if (this.WindowState == FormWindowState.Maximized) this.WindowState = FormWindowState.Normal; + else this.WindowState = FormWindowState.Maximized; + } + private void LbTitle_MouseMove(object sender, MouseEventArgs e) + { + if (fMove) + { + Point offset = new Point(e.X - MDownPos.X, e.Y - MDownPos.Y); + this.Left += offset.X; + this.Top += offset.Y; + //offset = new Point(0, 0); + } + } + private void LbTitle_MouseUp(object sender, MouseEventArgs e) + { + fMove = false; + } + private void LbTitle_MouseDown(object sender, MouseEventArgs e) + { + MDownPos = new Point(e.X, e.Y); + fMove = true; + } + + #endregion + + string last_xbee_tx = ""; + string last_xbee_rx = ""; + + DateTime lasttime_xbee_tx = DateTime.Now; + DateTime lasttime_xbee_rx = DateTime.Now; + private void Xbee_Message(object sender, arDev.arRS232.MessageEventArgs e) + { + if (e.MsgType == arDev.arRS232.MessageType.Error) PUB.logcal.AddE("xbee err : " + e.Message); + else if (e.MsgType == arDev.arRS232.MessageType.Normal) PUB.logcal.Add("xbe", e.Message); + else if (e.MsgType == arDev.arRS232.MessageType.Recv) + { + var datastr = System.Text.Encoding.Default.GetString(e.Data, 1, e.Data.Length - 2); + var val = datastr.Substring(datastr.Length - 1); + var kitno = datastr.Substring(0, datastr.Length - 1); + + if (last_xbee_rx.Equals(e.Message) == false) + { + PUB.logcal.Add("xbe-rx", e.Message); + last_xbee_rx = e.Message; + lasttime_xbee_rx = DateTime.Now; + } + else + { + var ts = DateTime.Now - lasttime_xbee_rx; + if (ts.TotalSeconds > 30) + { + PUB.logcal.Add("xbe-rx", e.Message); + last_xbee_rx = e.Message; + lasttime_xbee_rx = DateTime.Now; + } + } + + PUB.log.Add($"콜버튼:{kitno} 값:{val} 수신"); + //PUB.XBE.NewMsgEvent(kitno[0], val[0]); + } + else if (e.MsgType == arDev.arRS232.MessageType.Send) + { + if (last_xbee_tx.Equals(e.Message) == false) + { + PUB.logcal.Add("xbe-tx", e.Message); + last_xbee_tx = e.Message; + lasttime_xbee_tx = DateTime.Now; + } + else + { + var ts = DateTime.Now - lasttime_xbee_tx; + if (ts.TotalSeconds > 30) + { + PUB.logcal.Add("xbe-tx", e.Message); + last_xbee_tx = e.Message; + lasttime_xbee_tx = DateTime.Now; + } + } + + } + else PUB.logcal.Add("XBEE", $"Rx:{e.Message}"); + } + private void CtlPos1_ItemClick(object sender, CtlPos.ItemClickEventArgs e) + { + if (VAR.BOOL[eVarBool.FLAG_CHARGEONM] == true) + { + Util.MsgE("수동 충전 상태이므로 진행 할 수 없습니다"); + return; + } + if (VAR.BOOL[eVarBool.EMERGENCY]==true) + { + var dlgE = Util.MsgQ("비상정지 상태입니다.\n오류를 먼저 소거하고 실행 할까요?"); + if (dlgE == DialogResult.Yes) PUB.AGV.AGVErrorReset(); + else return; + } + //위치표시 컨트롤에서 아이템을 클릭했다 + var dlg = new Dialog.fJobSelect(); + PUB.log.Add("사용자 임의 위치 클릭 : " + e.Item.Title); + switch (e.Item.Position) + { + case ePosition.QA: + + //아이템을 가지고 있었으니 하차를 해야한다 + if (VAR.BOOL[eVarBool.ITEMON]) + { + dlg.setMessage("작업 실행\n" + + "(QA) 위치로 하차를 진행 할까요?\n" + + "대상위치 : QA\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + if (dlg.ShowDialog() == DialogResult.Yes) + { + //아이템이 있으면 하차이고 없으면 상차이다 + PUB.sm.ClearRunStep(); + PUB.Result.TargetPos = ePosition.QA; + PUB.sm.SetNewRunStep(ERunStep.GODOWN); + PUB.sm.SetNewStep(eSMStep.RUN); + } + } + else + { + dlg.setMessage("작업 실행\n" + + "(QA) 위치로 이동을 실행 할까요?\n" + + "대상위치 : QA\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + + if (dlg.ShowDialog() == DialogResult.Yes) + { + + //아이템이 있으면 하차이고 없으면 상차이다 + PUB.sm.ClearRunStep(); + PUB.Result.TargetPos = ePosition.QA; + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + PUB.sm.SetNewStep(eSMStep.RUN); + } + } + + break; + case ePosition.QC: + + //아이템을 가지고 있었으니 하차를 해야한다 + if (VAR.BOOL[eVarBool.ITEMON]) + { + dlg.setMessage("작업 실행\n" + + "홈(QC) 위치로 하차를 진행 할까요?\n" + + "대상위치 : QC\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + if (dlg.ShowDialog() == DialogResult.Yes) + { + //아이템이 있으면 하차이고 없으면 상차이다 + PUB.sm.ClearRunStep(); + PUB.Result.TargetPos = ePosition.QC; + PUB.sm.SetNewRunStep(ERunStep.GODOWN); + PUB.sm.SetNewStep(eSMStep.RUN); + } + } + else + { + dlg.setMessage("작업 실행\n" + + "홈(QC) 위치로 이동을 실행 할까요?\n" + + "대상위치 : QC\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + + if (dlg.ShowDialog() == DialogResult.Yes) + { + + //아이템이 있으면 하차이고 없으면 상차이다 + PUB.sm.ClearRunStep(); + PUB.Result.TargetPos = ePosition.QC; + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + PUB.sm.SetNewStep(eSMStep.RUN); + } + } + + break; + case ePosition.F1: //FVI영역은 모두 상차이동 + dlg.setMessage("작업 실행\n" + + "(상차) 작업을 실행 할까요?\n" + + "대상위치 : FVI-1\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + if (dlg.ShowDialog() == DialogResult.Yes) + { + PUB.Result.TargetPos = ePosition.F1; + PUB.sm.SetNewRunStep(ERunStep.GOUP); + PUB.sm.SetNewStep(eSMStep.RUN); + } + + break; + case ePosition.F2: + dlg.setMessage("작업 실행\n" + + "(상차) 작업을 실행 할까요?\n" + + "대상위치 : FVI-2\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + if (dlg.ShowDialog() == DialogResult.Yes) + { + + PUB.Result.TargetPos = ePosition.F2; + PUB.sm.SetNewRunStep(ERunStep.GOUP); + PUB.sm.SetNewStep(eSMStep.RUN); + } + + break; + case ePosition.F3: + dlg.setMessage("작업 실행\n" + + "(상차) 작업을 실행 할까요?\n" + + "대상위치 : FVI-3\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + if (dlg.ShowDialog() == DialogResult.Yes) + { + + PUB.Result.TargetPos = ePosition.F3; + PUB.sm.SetNewRunStep(ERunStep.GOUP); + PUB.sm.SetNewStep(eSMStep.RUN); + //VAR.BOOL[eVarBool.FLAG_AUTORUN] = true; + } + + break; + case ePosition.F4: + dlg.setMessage("작업 실행\n" + + "(상차) 작업을 실행 할까요?\n" + + "대상위치 : FVI-4\n" + + "현재위치 : " + PUB.Result.CurrentPos.ToString()); + if (dlg.ShowDialog() == DialogResult.Yes) + { + + PUB.Result.TargetPos = ePosition.F4; + PUB.sm.SetNewRunStep(ERunStep.GOUP); + PUB.sm.SetNewStep(eSMStep.RUN); + } + + break; + + } + if (dlg != null) dlg.Dispose(); + } + + void socket_SendMessage(object sender, Device.Socket.SocketMessageEventArgs e) + { + //핑로그가 꺼져있는 상황일때 핑로그는 로그를 기록하지 않는다. 181205 + if (!PUB.setting.Log_Ping && e.Message.Type == Device.Socket.eType.REPLY && e.Message.SType == Device.Socket.eSType.STATUS) + { + return; + } + PUB.log.Add("WS << " + e.rawData); + } + + void socket_RecvMessage(object sender, Device.Socket.SocketMessageEventArgs e) + { + if (e.Message.isError) + PUB.log.AddE("WS >> " + e.Message.ErrorMessage + ",RAW=" + e.rawData); + else + { + + switch (e.Message.Type) + { + case Device.Socket.eType.REQUEST: + if (e.Message.SType == Device.Socket.eSType.STATUS) + { + var packet = PUB.sock_debug.makeReplyStatus(Device.Socket.eStatus.IDLE); + var rlt = PUB.sock_debug.Send(PUB.setting.Asset, Device.Socket.eType.REPLY, Device.Socket.eSType.STATUS, packet); + if (!rlt) + { + PUB.log.AddE("Status Reply Error"); + } + else + { + if (PUB.setting.Log_Ping) PUB.log.AddI("Server Status Reply OK"); + } + } + else + { + PUB.log.Add("WS >> " + e.rawData); + } + break; + } + } + } + + void socket_GetMessage(object sender, Device.Socket.MesasgeEventArgs e) + { + if (e.isError) PUB.log.AddE("WS:" + e.Message); + else PUB.log.Add("WS:" + e.Message); + } + delegate void SelectModelHandler(string modelName); + void SelectModelM(string modelName) + { + if (this.InvokeRequired) + { + this.Invoke(new SelectModelHandler(SelectModelM), new object[] { modelName }); + return; + } + } + + void func_sw_start(bool Prompt = false) + { + if (VAR.BOOL[eVarBool.FLAG_AUTORUN] == false) //자동상태가 아니라면 + { + PUB.AGV.AGVErrorReset(); + if (Prompt) + { + if (Util.MsgQ("AGV상태를 자동으로 전환 할까요?") != DialogResult.Yes) return; + } + //충전상태확인 + if (PUB.CheckManualChargeMode() == false) return; + PUB.popup.needClose = true; + PUB.sm.bPause = false; + PUB.sm.SetNewStep(eSMStep.RUN); + + if (PUB.Result.CurrentPos == ePosition.NONE || PUB.Result.TargetPos == ePosition.NONE) + { + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + } + PUB.Speak(Lang.자동전환); + } + else + { + PUB.AGV.AGVCharge(PUB.setting.ChargerID, false); //230425 수동전환하면 충전 해제한다 + PUB.sm.SetNewStep(eSMStep.IDLE); + PUB.Speak(Lang.작업종료); + } + } + + void Resultclear() + { + PUB.Result.Clear(); + PUB.log.AddI("Clear Resultclear"); + } + + + void CheckFreeSpace() + { + try + { + + if (PUB.path.FullName.StartsWith("\\")) + { + SSInfo.setTitle(0, 1, "UNC Path Detected"); + SSInfo.setValue(0, 1, 2); + } + else + { + double freeSpaceRate_ = PUB.GetFreeSpace(); + this.freeSpaceRate = freeSpaceRate_; + SSInfo.setTitle(0, 1, "FREE(" + PUB.path.FullName.Substring(0, 1) + ") : " + freeSpaceRate.ToString("N2") + "%"); + if (freeSpaceRate < PUB.setting.AutoDeleteThreshold) + { + VAR.BOOL[eVarBool.MINSPACE] = true; + SSInfo.setValue(0, 1, 2); //lbFreeSpace.ForeColor = Color.Tomato; + } + else + { + VAR.BOOL[eVarBool.MINSPACE] = false; + SSInfo.setValue(0, 1, 3);// lbFreeSpace.ForeColor = Color.White; + } + } + + //Pub.log.Add("남은디스크공간확인:" + freeSpaceRate.ToString("N2") + "%"); 190129 + } + catch (Exception ex) + { + SSInfo.setTitle(0, 1, "FREE SPACE : -ERROR-"); + PUB.log.AddE("check free space : " + ex.Message); + } + } + + private void demoRunToolStripMenuItem_Click(object sender, EventArgs e) + { + PUB.Result.JobEndTime = DateTime.Now; + // Pub.flag.Toggle(eFlag.DemoRun); + // Pub.log.AddAT(string.Format("데모변경: {0}", Pub.flag.get(eFlag.DemoRun))); + } + + private void openMapFileToolStripMenuItem_Click(object sender, EventArgs e) + { + using (OpenFileDialog od = new OpenFileDialog()) + if (od.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + //if (orgImage != null) orgImage.Dispose(); + + } + + + + private void setZValidToolStripMenuItem_Click(object sender, EventArgs e) + { + + PUB.log.Add("user set z-home set on"); + } + + private void gridviewTestToolStripMenuItem_Click(object sender, EventArgs e) + { + + + } + + private void 으ㅆㄷㄴㅅToolStripMenuItem_Click(object sender, EventArgs e) + { + /////HB9225-4280A 0901 + //var striplist = new string[]{ + // "HB9125-7560A 0704", + //"HB9125-7800A 0104", + //"HB9125-8480A 0701", + //"HB9130-8550A 5108", + //"HB9130-8620A 0701", + //"HB9131-9340A 0201", + //"HB9206-0810A 5301", + //"HB9206-0820A 0902", + //"HB9222-3020A 0208", + //"HB9222-3020A 0508", + //"HB9222-3720A 0205", + //"HB9222-3720A 0902", + //"HB9225-3790A 0604", + //"HB9225-4280A 0901", + //"HB9228-4840A 0104", + //"HB9228-4840A 5908", + //"HB9313-7600A 1006", + //"HB9319-9540A 6003", + //"ZGP490510700 1305" + //}; + + } + + private void errorToolStripMenuItem_Click(object sender, EventArgs e) + { + PUB.popup.setMessage("error\berror message"); + } + + private void informationToolStripMenuItem_Click(object sender, EventArgs e) + { + PUB.popup.setMessage("info\ninformation message", MessageWindow.eWindowType.information); + } + + private void attentionToolStripMenuItem_Click(object sender, EventArgs e) + { + PUB.popup.setMessage("attention\nattention message", MessageWindow.eWindowType.attention); + } + + private void reloadLotListToolStripMenuItem_Click(object sender, EventArgs e) + { + + } + + + + private void arLabel3_Click(object sender, EventArgs e) + { + string file = System.IO.Path.Combine(Util.CurrentPath, "manual.pdf"); + if (System.IO.File.Exists(file) == false) + { + Util.MsgE("사용설명서 파일이 존재하지 않습니다\n" + + "문의 : T8567 (장비기술 1파트)\n" + + "파일명 : " + file); + return; + } + Util.RunExplorer(file); + } + + private void btClose_Click(object sender, EventArgs e) + { + this.Close(); + } + + void UpdateControlText() + { + + } + + private void arLabel5_Click(object sender, EventArgs e) + { + //SetScreen(form_setup); + + + var popmsg = PUB.popup.Visible; + PUB.popup.Visible = false; + VAR.BOOL[eVarBool.FLAG_SETUP] = true; + using (var f = new fSetup()) + if (f.ShowDialog() == DialogResult.OK) + { + //music volume200522 + PUB.mplayer.Volume = PUB.setting.musicvol / 100.0; + + //AGV정보 싱크 + PUB.sm.ResetRunStepSeq(); + PUB.sm.SetNewStep(eSMStep.SYNC); + } + + VAR.BOOL[eVarBool.FLAG_SETUP] = false;// VAR.BOOL[eVarBool.FLAG_SETUP] = false;//VAR.BOOL[eVarBool.FLAG_SETUP] = false; + UpdateControlText(); + if (popmsg) PUB.popup.Visible = true; + } + + private void btMReset_Click(object sender, EventArgs e) + { + + //if (Pub.sm.Step != eSMStep.IDLE) + //{ + var dlg = Util.MsgQ( + "프로그램 상태를 초기화 하시겠습니까?\n" + + "진행 중인 사항은 모두 취소 됩니다"); + if (dlg != System.Windows.Forms.DialogResult.Yes) return; + //} + //else Pub.log.AddAT("대기상태일때에는 초기화 할 수 없습니다"); + + PUB.log.Add("User Click : initialize", false); + PUB.sm.ClearRunStep(); + PUB.sm.SetNewStep(eSMStep.RESET); + PUB.sm.bPause = false; + if (PUB.mplayer != null && PUB.mplayer.HasAudio) + { + PUB.mplayer.Stop(); + PUB.bPlayMusic = false; + } + } + + private void btCapture_Click(object sender, EventArgs e) + { + Util.ScreenCaptrue(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, new Point(0, 0)); + } + + private void btOpenDir_Click(object sender, EventArgs e) + { + Util.RunExplorer(Util.CurrentPath); + } + + private void button4_Click(object sender, EventArgs e) + { + SetScreen(form_manu); + MenuMAN.ForeColor = Color.Gold; + } + + private void button3_Click(object sender, EventArgs e) + { + SetScreen(form_zlift); + MenuLift.ForeColor = Color.Gold; + } + + private void btDebug_Click(object sender, EventArgs e) + { + arCtl.arLabel ctl = sender as arCtl.arLabel; + this.cmDebug.Show(ctl, new Point((int)(ctl.Width / 1.5), (int)(ctl.Height / 1.5))); + } + + private void btStart_Click(object sender, EventArgs e) + { + var ctl = sender as arCtl.arLabel; + if (ctl.Enabled == false) return; + PUB.log.Add("User Click : Start", false); + func_sw_start(true); + } + + private void button2_Click(object sender, EventArgs e) + { + SetScreen(form_auto); + MenuAuto.ForeColor = Color.Gold; + } + + private void button1_Click(object sender, EventArgs e) + { + SetScreen(form_flag); + MenuFlag.ForeColor = Color.Gold; + } + + + Dialog.fLog form_log = null; + private void btLog_Click(object sender, EventArgs e) + { + if (form_log == null || form_log.IsDisposed || form_log.Disposing) + form_log = new Dialog.fLog(); + + form_log.Show(); + form_log.Activate(); + if (form_log.WindowState == FormWindowState.Minimized) + form_log.WindowState = FormWindowState.Normal; + } + + + private void btCharge_Click(object sender, EventArgs e) + { + var bCharge = + (PUB.sm.RunStep == ERunStep.GOCHARGE || PUB.sm.RunStep == ERunStep.CHARGECHECK || VAR.BOOL[eVarBool.FLAG_CHARGEONA] == true); + + if (VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + { + Util.MsgE("수동 충전 상태이므로 진행 할 수 없습니다"); + return; + } + + //충전을 시작해라ㅏ + if (bCharge == true) + { + var dlg = Util.MsgQ("충전을 중지할까요?"); + if (dlg == DialogResult.Yes) + { + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.log.Add("사용자 충전 해제"); + } + } + else + { + var dlg = Util.MsgQ("충전을 시작할까요?"); + if (dlg == DialogResult.Yes) + { + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.GOCHARGE); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.log.Add("충전(사용자)작업 시작"); + } + } + } + + private void pictureBox1_Click(object sender, EventArgs e) + { + using (var f = new Dialog.fSystem()) + { + f.ShowDialog(); + if (f.shutdown) + { + forceClose = true; + this.Close(); + } + } + + } + + private void SSInfo_Click(object sender, EventArgs e) + { + PUB.Speak("고경석 수석님 밥은 드셨습니까?", true); + UpdateProgressStatus(20, 100, "progre"); + } + + private void arLabel1_Click(object sender, EventArgs e) + { + var bCharge = PUB.sm.Step == eSMStep.RUN && + (PUB.sm.RunStep == ERunStep.GOHOME); + + if (PUB.CheckManualChargeMode() == false) return; + + if (bCharge == true) + { + var dlg = Util.MsgQ("홈(QC) 이동을 취소 할까요?"); + if (dlg == DialogResult.Yes) + { + PUB.sm.ClearRunStep(); + PUB.sm.SetNewStep(eSMStep.IDLE); + PUB.AGV.AGVMoveStop("user home cancle", arDev.Narumi.eStopOpt.Stop); + //PUB.AGV.AddCommand(arDev.Narumi.eAgvCmd.MoveStop);//.Move(Device.PLC.Rundirection.Stop, "사용자 홈 이동 취소"); + PUB.log.Add("사용자 홈 이동 취소"); + } + } + else + { + var dlg = Util.MsgQ("홈(QC) 이동을 실행 할까요?"); + if (dlg == DialogResult.Yes) + { + PUB.sm.ClearRunStep(); + PUB.sm.SetNewRunStep(ERunStep.GOHOME); + PUB.sm.SetNewStep(eSMStep.RUN); + PUB.log.Add("사용자 홈 이동 실행"); + } + } + + } + + //private void btChargeM_Click(object sender, EventArgs e) + //{ + // var bCharge = PUB.flag.get(EFlag.FLAG_CHARGEONM); + + // //충전을 시작해라ㅏ + // if (bCharge == true) + // { + // var dlg = Util.MsgQ("수동 충전 상태를 해제 할까요?"); + // if (dlg == DialogResult.Yes) + // { + // PUB.flag.set(EFlag.FLAG_CHARGEONM, false); + // Pub.log.Add("수동 충전 상태 해제"); + // } + // } + // else + // { + // var dlg = Util.MsgQ("수동 충전 상태를 설정 할까요?\n수동충전이 설정되면 AGV는 움직지 않습니다"); + // if (dlg == DialogResult.Yes) + // { + // PUB.flag.set(EFlag.FLAG_CHARGEONM, true); + // Pub.log.Add("수동 충전 상태 설정"); + // } + // } + //} + + private void arLabel2_Click_1(object sender, EventArgs e) + { + using (var f = new Dialog.fVolume()) + f.ShowDialog(); + } + + private void lbCNtUp_Click(object sender, EventArgs e) + { + using (var f = new Dialog.fCounter()) + f.ShowDialog(); + } + + private void button1_Click_1(object sender, EventArgs e) + { + SetScreen(form_agv); + MenuAGV.ForeColor = Color.Gold; + } + + private void button2_Click_1(object sender, EventArgs e) + { + SetScreen(form_bms); + MenuBMS.ForeColor = Color.Gold; + } + + private void lbBat_Click(object sender, EventArgs e) + { + var bat = (int)PUB.BMS.Current_Level; + var msg = $"{bat}퍼센트"; + PUB.Speak(msg, false, false); + PUB.counter.CountQA += 1; + } + private void IOState_ItemClick_1(object sender, arFrame.Control.GridView.ItemClickEventArgs e) + { + var title = IOState.Titles[e.idx]; + switch (title.ToLower()) + { + case "emg": + PUB.AGV.AGVErrorReset(); + break; + case "itm": + var itemon = VAR.BOOL[eVarBool.ITEMON]; + VAR.BOOL[eVarBool.ITEMON] = !itemon; + break; + } + } + + private void btChargeM_Click(object sender, EventArgs e) + { + if (COMM.VAR.BOOL[eVarBool.FLAG_CHARGEONM]) + { + var dlg = Util.MsgQ("수동 충전을 해제 할까요?"); + if (dlg != DialogResult.Yes) return; + VAR.BOOL[eVarBool.FLAG_CHARGEONM] = false; + PUB.log.Add("수동 충전 실행"); + } + else + { + if (PUB.AGV.system1.Battery_charging) + { + Util.MsgE("현재 자동 충전 중이라 진행 할 수 없습니다"); + return; + } + var dlg = Util.MsgQ("수동 충전을 진행 할까요?"); + if (dlg != DialogResult.Yes) return; + VAR.BOOL[eVarBool.FLAG_CHARGEONM] = true; + PUB.log.Add("수동 충전 실행"); + } + } + } +} diff --git a/Cs_HMI/Project/fMain.resx b/Cs_HMI/Project/fMain.resx new file mode 100644 index 0000000..a0d11b6 --- /dev/null +++ b/Cs_HMI/Project/fMain.resx @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 124, 17 + + + + + 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 + eXSITOY/N4AkP6QQbUkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAkNJREFUWEft + lU1LVFEYx6+F0KKXhRKR9QVSVxLoQqJoUdjCiAgl3CpKi/AjiGG0KVfRIiVoM34DC2Yzi7nz1sxiKkjQ + xahEazVfp98znYnT47nTmRgHIg/8OM88/3PO87/n3HsmOG7/TIvH46cymcxsNptN0Ue1EJ5Bq5nWuMai + c1D2ZNZM82+xWOxkOp3ugpsaFhxTBf7EHjv10LUWdEktU/Zny+VyfUxaUYscJcsY7K0UTyQSZ0isqQHN + oFQsFk8Hsi0OUThw5BqK1A7krBzCY/pWtDdaM+ybr+GtYOJ9o3kjtZ0GyPXI8WBkVGl78DyVSl0QPQzD + NkFiyaG9MGPsOZFEGoCP5J/Sf7NyG+Ru0Z+DJ7Bq8kIJs9PJZPIs/W1+b1haJLUMHIJxD3jKy8SftWbx + CROX6IdV3kk9BhbL5fIJxspZu3SbpIxlJ947tN/wNsBi9wSX5oI179Lf13mNtwFoh3mViwSzrwuFwnmX + ZuNrYJctbfHZ0iqs+U7mEO9qzcZ7B+TGol/Q+RrEzA3r0n7hbYAx/fSPdD4Kxk/wxVxzaTb1GHgp3zjx + V605WDdP/0rlD+FtAHZ4ok7G3iDeUprNJlyHbtgxuUjqMSB84W/7Ikau8kKmHXrIWj0yhnhJaU7qNSCU + YMDc/Z34GBIoekVyrHUH3b6ia/I3Bqp8gCmKjwgSQ95o3lQMEAxqoYkMBvl8voNgWwnN4Lu8L3J0cgwT + JLz/xxuA3JDjleLVRkI+nUmYOWKkRrcpe9z++xYEPwDT4GdbjzYebAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAP5JREFUWEft + lj0KwkAQhVNY6n0Uj6BtagvxEFqJvYWnEL1EmiBKfrrcIK3gDfSNTDZk2WQj65IQ9sFHZObtzCMkQc/J + qTdKkmQax/G1gQs4gVUYhhM+JkQ16rGHvKoZX2gXHyuFhg/eLXlFUbTmoxR+QzXJ04TPR0tRUTJpQYg9 + rge53oL/BDDAeoAjoHl1M60HEAsUvUpfiIqSyYTOA+gYeAC8njdciw+PyjP8Z8AFcAG6DdCH11BHDwPg + ts0VRiukaTrjtaWCIBih+ZDNFrjTLl5bVZZlY/y/24EzjMVDVMcTFEPpt8oj4Jlb2sHrzISBSwzMmQWX + nZx+lOd9AOxqphdZ7gKgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAABGdBTUEAALGPC/xhBQAABHFJREFUWEe1 + mFtIXFcUhifk8pqSPORCSGn7VPIcaFpCA+lDSUjfpIRCI97vKN5vGUEUhEFFRGkfRBEVa0GtdzQ+WBE1 + EPRF0XhDJAreo45Dra78a7tncs6e7ajjnAUfnnPW2mv97r32uYzNXwsODv4iPDz8+8jIyN9BVERERBzO + Q8BPYWFh92SYtRYdHf01CueBd+AQkA/mQQWLlsMDZ0j6AMn/BqeJOIlR8Fym89+CgoKuIVER+E8mvij/ + xMTE3Jbpz2chISF3kYD/M13ii7CCHnssy5zNMOgbwD2gSxgI9tEGv8hyvg3Bd8CcYbBVuKKiop7IsnrL + y8u7gsB/lYFWshEaGvqlLO9tCMhVBlyI2NhYyszM1Prc4B72BqUvHSswGBrtKwQ41QGnkZ6eToODg1RU + VOTlKygoIKfTSTU1NV4+IxD1Usr4bLj4py74JBBPVVVVtLu7S2xtbW0mPwvlv/n5+bS9vS1ijX6F97jF + XJZSbDZM7U1cdClBJ5KVlUWTk5NCiNtUQUtLS9TX10doXCosLKS9vT0xzhhjxLTrcBKjC1LhWamtrSWX + yyVlfDZVUHJyMs3NzVF7e7s47+npoZGREVOMEWhoknKEoA5dUFxcHBUXF1NJSQmVl5fT/Py8LO9tbkH1 + 9fVi9hITEykjI0Msqd1up7S0NDo4OKCUlBSvOpKP4CrruYSDbYPDAxc5q7kF4QFMo6OjNDw8LM67u7up + t7dXHE9PT1N1dbUnvwom5iFv9fuqww0nOqsZlywhIUHMTE5Ojmjq9fV1cb2lpYUGBgY8cRpe8XZ/rHEI + /BXEDA0NUWNjo+i7w8NDsfy806ampkxxCnbe7s80DsFFBDU3N4tdxsebm5titrgfFxcXTXEKDssE8e7q + 7OwUx7zls7OzqbS0lGZnZ01xCg7Llmx8fFw0MPeTccnGxsZMcQp2S5qab4D7+/uUlJREFRUV4n7E13kJ + Ozo6PHEaXvnc9rzmExMTgpmZGVlab25BLIb7hHuIz3lG+GbKxysrK+RwODz5VcS2Z8NJu+rUUVZWRhsb + G1KC2dyCFhYWqLW1VeyuyspK8RzjZWMha2tr4lGi5pV4bowsKNrg8An3At/sjo6OpJRjU3uIZ3dnZ0f8 + EyyCm7murs4Uo/CXEMOGl6QbuHDmhyvDrxvLy8tSjllQQ0MDbW1tCTF83tXVJQT5mB2e0RdSzrHh4h9q + 0GnwCxg/NHkXNTU1ea7zErEvPj6e+vv7aXV1lVJTU01jFaZNrx9s/CoJx7lf0Bh+98HnjekaP+15lrip + +djoU8Hs/CplmA3ObDXYX7ipc3NztT6FXlne23jakOiNZpBVrIP7srze+MsSQbOGQVbB32Y/yrK+DcH8 + oWjlt5nTa1edZhjEH4zDhiSB4gO2/w+yzPkMg6+CAhCoHxua8TC/JdP7b0jyLaa4EQn9+jkGvTKC8T/L + dIEz/phE8tco8hb8byyqYQaUQ8gjOdxaQ7HrEPgdBP6Gou6f9IJx/JR/ypFh5zSb7RMJw7xfBlQNxwAA + AABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAlxJREFUWEfV + l81u00AUhcOrIMGqgg0sYEMFe1QE5QlQd63oug/QbstT0B2UVgEKgW1+7GxoWSAeghKJSgGF70bHlpnc + cYbW5edIn6LcuefesT0e263/Ur1e7/pgMHiZZdmB0e/327Cg4fMXzTdhUoUJbGj4/MVRP3cm8FTDzYiC + DyjcodkVhUoR/1RtLg41XMq8xDvUuq9QmjA+xDhW4RP+P55MJhdsjOt/i9h3jVUZ53l+w3Isl/9r8K0Y + g2UbmyubrQxhg3fwIYh55NR448THSWeCpF3H3Ai2dtQmLiZwkeTj0NwAo263e1lt6sVMV5wCZ+WRys+X + LaLIdTwV1GqrdJq0ij+GhQJM2yIDL2cKZ7Sn0mnidrrjFRJfOKK7Si1FfAmia8e2b6XOSnv7lu6Az/Cj + MIZ4zQtxpPc8j7C9wzawZ7DJQV6TbTr7ffBMv0DzvixRkVd7OSrsyzK99dpOgse2LFGR8yTwuFhPWf6B + CRDYCxMiZLJERc4w8MTYk2V6BhZgg+AOHIH3LChYkm1G1LDniOcxrOYh7Fgv6ynbrFjNtyvGkGNb7Uot + peZfg9yS2tswVOJGlINdb6P2tP/2RmQTwPTeK3ZKXltNlZ8vTue6U+SsrKp8vWxxkFy8yTTJCbvfVbWJ + i8ROYGySt2oTl1bzzG3ImjjgN+mVDF4FMSPtlcxE8rIZZBzRfEVDNsFFYt7DasytdlNpxUvNqBiDtJfS + QjZb2B0Oh5cUKkUxe2KGEzjScCnzWo3kI08VzV4EzW1vb/bDpE403HIm8Oc+zfQC8/c+TptTq/UT/J7v + URSJG9cAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAsRJREFUWEft + lz9TU0EUxdOovWKv9Golo59AsRMr0ELQRjsHO4n4CWD8A/oNUD9IZpKQxCYVIg1gKTYChejvvDmbbN57 + IS8gY8OZOZPHuefe3b27+xJKpzgKqtXqhdXV1Sv1ev0OHNezNIdPBgw0Cl8xWAv+6cNmo9GYZzKXnXZ8 + NJvNixR+A/ejgQZR3tdwxGWOBlZzgyLbLhq4g77C5xyfD0U/S9uxJ3Cbro253HAg8R4FdqNiX9Em+Txj + SwaKwSm4DkPeLpObsKUYSNDKO4Mz8Lt2u33W4YGQl7ylkA93C3fCe/49JJP4zKGhQf5sqAO3Ct0UjDpw + SRKdeGs5QZECaQ91lkM9FrNoOR8YRjGG074et53O3ETTIXtsKQPF5JHXUmltbe0c2jeomvuHXlEmoHse + ZjtpWYVHYDjhv2FmEtIck0fezhWkkw+siy8tZ0Hwi0076UPHhGbQwwAH8KlDebEnDiXgb92OH443LPdC + e2eD9n7Fcg+IxatMOpGn2d4D9E/2HFQqlfOWu2Dfrtmg9r+wnAHx9IADBxeIzdmnBV613AWD6kslGKYt + 5yLVcjHT9jScE+rfttyFxGCQ2XIu+kygcybyQM6j4GesW5a7+O9bEB9CJvDRcg+IHecQfrYn/xAKBJs2 + FbmGnT3PifVsh19GPxXHW7ecBa2ZdxFxyrIm9i9fRGXLWeg1ieEkXsUbUDX3Wq3WJYfygUm/ZMJslywn + SH/R5CHtocb7UI9OLFjuD4xqd/wraNahoUHu86jOZpEFJOCcjJEQ/xpaVisdHgh5We2HKP9XrVa77nAx + UGCCxHgSG2j307cjhmI+cGHPk8HR7toyHNyJraiYqOukL5YyhadFPVtLrlrEzaFXnob2jYksUmyYn+V7 + TGyh8J4XAcV0RbXSRjRQmoqVB16140KvUgbSv2bjop77vl5PcShKpb/SGsNeH5IytgAAAABJRU5ErkJg + gg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAA5hJREFUaEPt + mvtTElEUx/3v+lea6X9oppnGV5LV+EABUSRG8f3gvaZGagaakuIDFdPR0nykaZqv0/1eASmuAstursbX + +fyye45zvnDv2XN3KMhLq3poefzgke2J/i6BmmPlXwk3rBNt1DHbeydArag5Vv6VcBEB3uW+OwFqzRvR + EnkjWiNvRA0axuxUM9x4I9aJVmGuZow4FjxU5jXS1Nr8jZR4aoT5mjFSNWSh8NoCpZPmjRS59HTB/qC1 + 3Q3htwE0beQ1Gy96Q/3cBMw8dVQJ9wfQ9B4p9dbSwfEhNxJanWUFW4VxN3HrRrrnXaQftHET0AupnpyL + HmHsTdy6kQp/Ay1sfuYmdg/3SddnFMal41aNeJYlKnbXcBNQc8BB9qkuYWw6ZBkxjNqoTDKk8Ixhn868 + EAt7APrCQ9zE2fk5M6UXxmWCLCNogSLtHx2wpWEQ5ogo9lTT0ckxzw1EQ2RiH5AoLhMUNQJV9lupJ+IW + 5iXTOesg07uWWBaRzmci15JPGJsJsowUsSXQNu5O0D7u4d8GNL8RpUq2gUV5ybwcMNPqzhees7G3ReVv + TMK4TJFlpCfiovaZ3gT1Y83UEnTzoqASdy15o6l5cdxLEpV6DLFoosaRTmoL9whjM0WWERGFrmq2Yc94 + Yf2zo9QQtAvjQF2gifyRII89ZTnXjR3ZoJgRI9uoI4sfL4s7O2Wf+PXFFTPTJywG8kcCZA42CeOyQTEj + 7qiPdGwMj8v6vpNaw90pcVhCFraU4sISQ+7fcdmimBGADbyyvc4L3PqxK9zAuPZ17xuPwZT7atCcEiMH + RY10zTnJ4LfzIqFyyfzH3ORm7fW5VBe7S7z9og0n/w+5KGoEYOMeHP/khYZW50ifNMliIvjAHnzQ8ekv + KvHmvsnjKG4k+WwBYZbCTIV7ha6qRGeTZobZiNKSki8XxY0AtOKLi8vTnvPTID8MYQbDUBhXumdNtqhi + BCe5yZUZXjBmKRycdJKRdg6/82uLmytU8Tb90z8bVDHiXPSyA5KZFw1hU+PAFJd+wManA1GuXFQxAtBm + N/e3eeFoszjCQmgEpT62rAQ5uaCakcsHXwcvPlloBGgIopxcUM0IwEEJbTZZmJzjXUxJVDWCV6BS7AQI + Ta9HqHoo+zckmaCqEbTXIqc+8XJN5zXxV6PC2BxR1wjDNtmWeLmGb0gUowSqG/lX5I1ojbwRrfF/GLkX + P+G4Nz+qyUsTKij4DaqNxnRXLBhpAAAAAElFTkSuQmCC + + + + 221, 17 + + + 84 + + + + AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAMMOAADDDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWqUeEVyo + H1Bbpx59W6gepVunH8xbqB7gW6gf7lqoH/1aqB/9W6gf7luoHuBaqB/LW6gepVunHn1apyBPX68fEAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF2n + ISZaqB+BW6cfzFunH/xbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1unH/xaqB/LWqgfgVypHCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA/vwAEW6keXFunHsZbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6cexlupHlw/vwAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAD+/AARaqR5lWqcf3luoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf3FqnHmM/vwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFynHjpapx7QW6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gezluoHzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX58fCFqnHpVbpx/+W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9aqB/9W6gfkUi2 + JAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWaUbJVunHs9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB7OWaUbJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWqgfQVun + HvBbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1qnHu9ZqSA/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAW6YeVFunHvhbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//Wqge91um + H1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAWqcfUlunH/xbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bpx/8W6YdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXKYeQlunHvlbqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1unHvhcph5CAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW6kgJ1unHvBbqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//Zq4u/3CzPP9cqSH/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6ce8Fyp + HCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVKkcCVqn + HtBbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9cqCD/u9uj//7+/f//////5PHa/3O1QP9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9apx/NSLYkBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFuoHpZbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//k8Zr//////////////////// + ///P5r7/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1qnH5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFmqHTxbpx/+W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/7bY + nP//////////////////////8fjt/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9aqB/9W6gfOAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/AARbqB7RW6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/+726P///////////////////////X68v9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1unHs9VqgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbqCBnW6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//u9uj///////////////////////1+vL/W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6geZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA/vwAEWqcf3luoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/7vbo/////////////// + ////////9fry/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH9w/vwAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAXKgdXluoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/+726P///////////////////////X68v9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//WageWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqoHshbqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//u9uj///////////////////////1+vL/W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1unHsYAAAAAAAAAAAAAAAAAAAAAAAAAAFmlHyhbqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/7vbo///////////////////////9fry/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//XKkcJAAAAAAAAAAAAAAAAAAA + AABaqB6EW6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/+726P///////// + //////////////X68v9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1qo + H4EAAAAAAAAAAAAAAAAAAAAAW6gezluoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//u9uj///////////////////////1+vL/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9aqB/LAAAAAAAAAAAAAAAAXa4aE1qoH/1bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//dbZC//D36v///////////////////////////6nRif9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6cf/FqlHhEAAAAAAAAAAFumH1FbqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//dbZC//D36v////////////////////////////// + ////////qdGJ/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9apyBPAAAAAAAA + AABbpx+AW6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//dbZC//D36v////////////// + ///2+vP/1+rJ//////////////////////+p0Yn/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6cefgAAAAAAAAAAWqcepluoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//dbZC//D3 + 6v/////////////////2+vP/gLxS/1+qJP/N5bv//////////////////////6nRif9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1unH6QAAAAAAAAAAFuoHs5bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//dbZC//D36v/////////////////2+vP/gLxS/1uoH/9bqB//X6ok/83lu/////////////// + ////////qdGJ/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9aqB/LAAAAAAAAAABapx7hW6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//dbZC//D36v/////////////////2+vP/gLxS/1uoH/9bqB//W6gf/1uo + H/9fqiT/zeW7//////////////////////+p0Yn/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//Wqce4QAA + AAAAAAAAW6ce8FuoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//dbZC//D36v/////////////////2+vP/gLxS/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1+qJP/N5bv//////////////////////6nRif9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1qnHu8AAAAAAAAAAFqoH/1bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//dbZC//D36v////////////// + ///2+vP/gLxS/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//X6ok/83lu/////////////// + ////////qdGJ/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bpx/8AAAAAAAAAABaqB/9W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9gqyb/q9KM/3a2RP9bqB//W6gf/1uoH/9bqB//dbZC//D3 + 6v/////////////////2+vP/gLxS/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9fqiT/zeW7//////////////////////+p0Yn/W6gf/1uoH/9bqB//W6gf/1+qJP+o0Yj/e7lL/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6cf/AAAAAAAAAAAW6ce8Fuo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//kMRn///////z+e7/erhJ/1uo + H/9bqB//dbZC//D36v/////////////////2+vP/gLxS/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1+qJP/N5bv//////////////////////6nRif9bqB//W6gf/1+q + JP/O5bz//////9Dmv/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1qn + Hu8AAAAAAAAAAFqnHuFbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/7PX + l/////////////P57v97uUr/dbZC//D36v/////////////////2+vP/gLxS/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//X6ok/83lu/////////////// + ////////qdGJ/1+qJP/O5bz////////////y+O3/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9apx7hAAAAAAAAAABbqB7OW6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH//W6cf/////////////////8/nu//D36v/////////////////2+vP/gLxS/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9fqiT/zeW7///////////////////////l8dv//////////////////////3K0P/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//WqgfywAAAAAAAAAAWqcepluoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9dqSL/9/v0//////////////////////////////////// + ///2+vP/gLxS/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1+qJP/N5bv///////////////////////////////////////// + //+Uxm3/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1unH6QAAAAAAAAAAFun + H4BbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//ebhH//////////////////// + ///////////////////2+vP/gLxS/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//X6ok/83lu/////////////// + ////////////////////////uNmd/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bpx5+AAAAAAAAAABapx9SW6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/5vK + dv//////////////////////////////////////8fjt/3m4SP9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/12p + Iv/E4K7//////////////////////////////////////9rszf9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//WqcgTwAAAAAAAAAAXa4aE1qoH/1bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/+/3af////////////////////////////////////////////x+O3/ebhI/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/12pIv/E4K7////////////////////////////////////////////6/Pj/X6ok/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6cf/FqlHhEAAAAAAAAAAAAAAABapx7QW6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//4e/W//////////////////////////////////// + //////////////H47f91tkP/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH//C36z///////////////////////////////////////// + /////////////3y5TP9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1unH8wAAAAAAAAAAAAA + AAAAAAAAWqgehVuoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//Yqwp//3+/P////////////// + ////////////////////////////////////////ptCG/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9hqyj//P37//////////////////// + //////////////////////////////////+gzX3/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9aqB+CAAAAAAAAAAAAAAAAAAAAAF2nHylbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/4O9 + Vf//////////////////////////////////////8ffs/87lvP+r043/iMBc/16pI/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/3W2 + Qv+gzX3/w9+t/+by3f/+//7/////////////////////////////////wd6r/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//WaUbJQAAAAAAAAAAAAAAAAAAAAAAAAAAWqcfyluoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/+Wx3D////////////5/Pf/2evL/7bYnP+Uxmz/cLM8/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//Za0t/4nAXf+r043/zuW8//H47f///////////9jq + yf9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//WqcexwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqn + H2BbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//Xqoj/5DEaP97uUv/Xqkj/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//cLM8/5PGa/91tkP/W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1upHlwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA/vwAEW6ge31uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H90/vwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFuoH2pbqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9apx5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/vwAEWqcf01uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bpx7PP78ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFunHT1bpx/+W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bpx/+XKceOgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW6cel1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gflAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGayGQpbqB7RW6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gezl+fHwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAWaUfKFunHvBbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6ce8F2nISYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcph5CW6ce+VuoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6ce+VymHkIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFqoHlVbpx/8W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6cf/FumH1EAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAW6YeVFunHvhbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6ce+Fum + HlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbpx5DWqce8luoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//Wqge8VqoH0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFmlHyhapx/TW6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6cez12nISYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVKkcCVqnHphbpx/+W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bpx/+W6cel1+fHwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW6cdPVqnH9NbqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB7RWqgeOwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/vwAEWqYea1uo + Ht9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1qnH95bqCBnP78ABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABmmTMFW6kgX1unHslbqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//Wqcex1up + IF8/vwAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWaUfKFunHoZapx7QWqgf/Vuo + H/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//W6gf/1uoH/9bqB//Wqgf/Vuo + Hs5aqB6EWaUfKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAF2uGhNapx9SW6cfgFunHqdapx/NW6ge4luoH+5bpx/+W6cf/luoH+5bqB7iWqcfzVun + Hqdbpx+AW6YfUV2uGhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA//////////////8AAP//////+AAAH//////AAAAD/////wAAAAD////+AAAAAH////gAAAAA + H///8AAAAAAP///gAAAAAAf//8AAAAAAA///gAAAAAAB//8AAAAAAAD//gAAAAAAAH/8AAAAAAAAP/wA + AAAAAAA/+AAAAAAAAB/wAAAAAAAAD/AAAAAAAAAP4AAAAAAAAAfgAAAAAAAAB+AAAAAAAAAHwAAAAAAA + AAPAAAAAAAAAA8AAAAAAAAADgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAA + AAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAA + AAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA8AAAAAAAAADwAAAAAAAAAPgAAAAAAAAB+AA + AAAAAAAH4AAAAAAAAAfwAAAAAAAAD/AAAAAAAAAP+AAAAAAAAB/8AAAAAAAAP/wAAAAAAAA//gAAAAAA + AH//AAAAAAAA//+AAAAAAAH//8AAAAAAA///4AAAAAAH///wAAAAAA////gAAAAAH////gAAAAB///// + AAAAAP/////AAAAD//////gAAB///////wAA//////////////8= + + + \ No newline at end of file diff --git a/Cs_HMI/Project/fSetup.Designer.cs b/Cs_HMI/Project/fSetup.Designer.cs new file mode 100644 index 0000000..0e61e4b --- /dev/null +++ b/Cs_HMI/Project/fSetup.Designer.cs @@ -0,0 +1,3649 @@ +namespace Project +{ + partial class fSetup + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fSetup)); + this.label2 = new System.Windows.Forms.Label(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage6 = new System.Windows.Forms.TabPage(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.btMusic = new arCtl.arLabel(); + this.btAutoCharge = new arCtl.arLabel(); + this.btSpeaker = new arCtl.arLabel(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tbagvchannel = new System.Windows.Forms.TextBox(); + this.tbagvpanid = new System.Windows.Forms.TextBox(); + this.tbagvaddr = new System.Windows.Forms.TextBox(); + this.button7 = new System.Windows.Forms.Button(); + this.label52 = new System.Windows.Forms.Label(); + this.button6 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.label50 = new System.Windows.Forms.Label(); + this.label40 = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label57 = new System.Windows.Forms.Label(); + this.label56 = new System.Windows.Forms.Label(); + this.label55 = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.label31 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.label25 = new System.Windows.Forms.Label(); + this.vcSAD = new AGVControl.ValueSelect(); + this.vcSpeedDrive = new AGVControl.ValueSelect(); + this.vcSTT = new AGVControl.ValueSelect(); + this.vcSSK = new AGVControl.ValueSelect(); + this.vcSCK = new AGVControl.ValueSelect(); + this.vcpidDS = new AGVControl.ValueSelect(); + this.vcpidPS = new AGVControl.ValueSelect(); + this.vcpidIS = new AGVControl.ValueSelect(); + this.vcpidDL = new AGVControl.ValueSelect(); + this.vcpidDH = new AGVControl.ValueSelect(); + this.vcpidDM = new AGVControl.ValueSelect(); + this.vcpidIL = new AGVControl.ValueSelect(); + this.vcpidIH = new AGVControl.ValueSelect(); + this.vcpidIM = new AGVControl.ValueSelect(); + this.vcpidPL = new AGVControl.ValueSelect(); + this.vcpidPH = new AGVControl.ValueSelect(); + this.vcpidPM = new AGVControl.ValueSelect(); + this.vcSpeedR = new AGVControl.ValueSelect(); + this.vcSpeedH = new AGVControl.ValueSelect(); + this.vcSpeedS = new AGVControl.ValueSelect(); + this.vcSpeedL = new AGVControl.ValueSelect(); + this.vcSpeedM = new AGVControl.ValueSelect(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.button3 = new System.Windows.Forms.Button(); + this.label30 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.tbBaudBAT = new System.Windows.Forms.ComboBox(); + this.tbportBMS = new System.Windows.Forms.TextBox(); + this.label27 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.tbBaudAGV = new System.Windows.Forms.ComboBox(); + this.tbPortAGV = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.btSelPlc1 = new System.Windows.Forms.Button(); + this.btSelXbee = new System.Windows.Forms.Button(); + this.tbBaudPLC = new System.Windows.Forms.ComboBox(); + this.tbBaudXBE = new System.Windows.Forms.ComboBox(); + this.tbPortPLC = new System.Windows.Forms.TextBox(); + this.tbPortXBE = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.valIntervalBMS = new AGVControl.ValueSelect(); + this.valueSelect4 = new AGVControl.ValueSelect(); + this.valIntervalXBE = new AGVControl.ValueSelect(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.cmbChargerPos = new System.Windows.Forms.ComboBox(); + this.label58 = new System.Windows.Forms.Label(); + this.label19 = new System.Windows.Forms.Label(); + this.label44 = new System.Windows.Forms.Label(); + this.label29 = new System.Windows.Forms.Label(); + this.label43 = new System.Windows.Forms.Label(); + this.label42 = new System.Windows.Forms.Label(); + this.label41 = new System.Windows.Forms.Label(); + this.label39 = new System.Windows.Forms.Label(); + this.label28 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.label33 = new System.Windows.Forms.Label(); + this.label36 = new System.Windows.Forms.Label(); + this.label37 = new System.Windows.Forms.Label(); + this.label35 = new System.Windows.Forms.Label(); + this.label34 = new System.Windows.Forms.Label(); + this.label38 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.label24 = new System.Windows.Forms.Label(); + this.vcChargeStartLevel = new AGVControl.ValueSelect(); + this.vcChargeMaxLevel = new AGVControl.ValueSelect(); + this.vcChargeWaitSec = new AGVControl.ValueSelect(); + this.tbChargerID = new AGVControl.ValueSelect(); + this.vcChargeEmergencyLevel = new AGVControl.ValueSelect(); + this.vcChargeMaxTime = new AGVControl.ValueSelect(); + this.vcChargeRetryTerm = new AGVControl.ValueSelect(); + this.vcChargeSearchTime = new AGVControl.ValueSelect(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.label54 = new System.Windows.Forms.Label(); + this.vcTagF5A = new AGVControl.ValueSelect(); + this.vcTagF5B = new AGVControl.ValueSelect(); + this.vcTagF4F5 = new AGVControl.ValueSelect(); + this.vcTagQAA = new AGVControl.ValueSelect(); + this.vcTagQAB = new AGVControl.ValueSelect(); + this.label17 = new System.Windows.Forms.Label(); + this.button4 = new System.Windows.Forms.Button(); + this.label49 = new System.Windows.Forms.Label(); + this.label53 = new System.Windows.Forms.Label(); + this.label47 = new System.Windows.Forms.Label(); + this.label48 = new System.Windows.Forms.Label(); + this.label51 = new System.Windows.Forms.Label(); + this.label46 = new System.Windows.Forms.Label(); + this.label45 = new System.Windows.Forms.Label(); + this.vcTagQAQC = new AGVControl.ValueSelect(); + this.vcTagF3F4 = new AGVControl.ValueSelect(); + this.vcTagF2F3 = new AGVControl.ValueSelect(); + this.vcTagF1A = new AGVControl.ValueSelect(); + this.vcTagF1B = new AGVControl.ValueSelect(); + this.vcTagF3A = new AGVControl.ValueSelect(); + this.vcTagQCA = new AGVControl.ValueSelect(); + this.vcTagF3B = new AGVControl.ValueSelect(); + this.vcTagF2A = new AGVControl.ValueSelect(); + this.vcTagQCB = new AGVControl.ValueSelect(); + this.vcTagF4A = new AGVControl.ValueSelect(); + this.vcTagF1F2 = new AGVControl.ValueSelect(); + this.vcTagF2B = new AGVControl.ValueSelect(); + this.vcTagF4B = new AGVControl.ValueSelect(); + this.vcTagQCF1 = new AGVControl.ValueSelect(); + this.vcTagPOT = new AGVControl.ValueSelect(); + this.vcTagNOT = new AGVControl.ValueSelect(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.tbMCID = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.chkDetectManualCharge = new System.Windows.Forms.CheckBox(); + this.chkAGVDirBack = new System.Windows.Forms.CheckBox(); + this.chkFullScreen = new System.Windows.Forms.CheckBox(); + this.nudMusicVol = new System.Windows.Forms.NumericUpDown(); + this.label22 = new System.Windows.Forms.Label(); + this.linkLabel5 = new System.Windows.Forms.LinkLabel(); + this.linkLabel4 = new System.Windows.Forms.LinkLabel(); + this.linkLabel3 = new System.Windows.Forms.LinkLabel(); + this.tbMusic = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.nudDoorSoundTerm = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.cleartime2 = new System.Windows.Forms.DateTimePicker(); + this.cleartime1 = new System.Windows.Forms.DateTimePicker(); + this.chkClear2 = new System.Windows.Forms.CheckBox(); + this.chkClear1 = new System.Windows.Forms.CheckBox(); + this.panel6 = new System.Windows.Forms.Panel(); + this.panTopMenu = new System.Windows.Forms.Panel(); + this.label10 = new System.Windows.Forms.Label(); + this.btClose = new arCtl.arLabel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.label8 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.bt5 = new arCtl.arLabel(); + this.bt4 = new arCtl.arLabel(); + this.bt3 = new arCtl.arLabel(); + this.bt2 = new arCtl.arLabel(); + this.bt1 = new arCtl.arLabel(); + this.bt0 = new arCtl.arLabel(); + this.btSave = new arCtl.arLabel(); + this.chkClearPos = new System.Windows.Forms.CheckBox(); + this.tabControl1.SuspendLayout(); + this.tabPage6.SuspendLayout(); + this.panel1.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.tabPage5.SuspendLayout(); + this.tabPage4.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nudMusicVol)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nudDoorSoundTerm)).BeginInit(); + this.groupBox4.SuspendLayout(); + this.panTopMenu.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label2.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label2.Location = new System.Drawing.Point(76, 32); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(187, 24); + this.label2.TabIndex = 5; + this.label2.Text = "속도(저/중/고)"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // tabControl1 + // + this.tabControl1.Alignment = System.Windows.Forms.TabAlignment.Right; + this.tabControl1.Controls.Add(this.tabPage6); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage3); + this.tabControl1.Controls.Add(this.tabPage5); + this.tabControl1.Controls.Add(this.tabPage4); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(5, 142); + this.tabControl1.Multiline = true; + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(1270, 598); + this.tabControl1.TabIndex = 14; + // + // tabPage6 + // + this.tabPage6.Controls.Add(this.panel1); + this.tabPage6.Location = new System.Drawing.Point(4, 4); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.Size = new System.Drawing.Size(1244, 590); + this.tabPage6.TabIndex = 6; + this.tabPage6.Text = "일반"; + this.tabPage6.UseVisualStyleBackColor = true; + // + // panel1 + // + this.panel1.Controls.Add(this.tableLayoutPanel1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0); + this.panel1.Size = new System.Drawing.Size(1244, 648); + this.panel1.TabIndex = 0; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.btMusic, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.btAutoCharge, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.btSpeaker, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(1238, 648); + this.tableLayoutPanel1.TabIndex = 24; + // + // btMusic + // + this.btMusic.BackColor = System.Drawing.Color.Lime; + this.btMusic.BackColor2 = System.Drawing.Color.Green; + this.btMusic.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btMusic.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btMusic.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.btMusic.BorderSize = new System.Windows.Forms.Padding(2); + this.btMusic.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btMusic.Cursor = System.Windows.Forms.Cursors.Hand; + this.btMusic.Dock = System.Windows.Forms.DockStyle.Fill; + this.btMusic.Font = new System.Drawing.Font("맑은 고딕", 80F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btMusic.ForeColor = System.Drawing.Color.White; + this.btMusic.GradientEnable = true; + this.btMusic.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btMusic.GradientRepeatBG = false; + this.btMusic.isButton = true; + this.btMusic.Location = new System.Drawing.Point(3, 327); + this.btMusic.MouseDownColor = System.Drawing.Color.Yellow; + this.btMusic.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btMusic.msg = null; + this.btMusic.Name = "btMusic"; + this.btMusic.ProgressBorderColor = System.Drawing.Color.Black; + this.btMusic.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btMusic.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btMusic.ProgressEnable = false; + this.btMusic.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btMusic.ProgressForeColor = System.Drawing.Color.Black; + this.btMusic.ProgressMax = 100F; + this.btMusic.ProgressMin = 0F; + this.btMusic.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btMusic.ProgressValue = 0F; + this.btMusic.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btMusic.Sign = ""; + this.btMusic.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btMusic.SignColor = System.Drawing.Color.Yellow; + this.btMusic.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btMusic.Size = new System.Drawing.Size(613, 318); + this.btMusic.TabIndex = 23; + this.btMusic.Tag = "2"; + this.btMusic.Text = "배경음악"; + this.btMusic.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btMusic.TextShadow = true; + this.btMusic.TextVisible = true; + this.btMusic.Click += new System.EventHandler(this.btMagnet_Click); + // + // btAutoCharge + // + this.btAutoCharge.BackColor = System.Drawing.Color.Lime; + this.btAutoCharge.BackColor2 = System.Drawing.Color.Green; + this.btAutoCharge.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btAutoCharge.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btAutoCharge.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.btAutoCharge.BorderSize = new System.Windows.Forms.Padding(2); + this.btAutoCharge.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btAutoCharge.Cursor = System.Windows.Forms.Cursors.Hand; + this.btAutoCharge.Dock = System.Windows.Forms.DockStyle.Fill; + this.btAutoCharge.Font = new System.Drawing.Font("맑은 고딕", 80F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btAutoCharge.ForeColor = System.Drawing.Color.White; + this.btAutoCharge.GradientEnable = true; + this.btAutoCharge.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btAutoCharge.GradientRepeatBG = false; + this.btAutoCharge.isButton = true; + this.btAutoCharge.Location = new System.Drawing.Point(622, 3); + this.btAutoCharge.MouseDownColor = System.Drawing.Color.Yellow; + this.btAutoCharge.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btAutoCharge.msg = null; + this.btAutoCharge.Name = "btAutoCharge"; + this.btAutoCharge.ProgressBorderColor = System.Drawing.Color.Black; + this.btAutoCharge.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btAutoCharge.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btAutoCharge.ProgressEnable = false; + this.btAutoCharge.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btAutoCharge.ProgressForeColor = System.Drawing.Color.Black; + this.btAutoCharge.ProgressMax = 100F; + this.btAutoCharge.ProgressMin = 0F; + this.btAutoCharge.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btAutoCharge.ProgressValue = 0F; + this.btAutoCharge.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btAutoCharge.Sign = ""; + this.btAutoCharge.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btAutoCharge.SignColor = System.Drawing.Color.Yellow; + this.btAutoCharge.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btAutoCharge.Size = new System.Drawing.Size(613, 318); + this.btAutoCharge.TabIndex = 20; + this.btAutoCharge.Tag = "1"; + this.btAutoCharge.Text = "자동충전"; + this.btAutoCharge.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btAutoCharge.TextShadow = true; + this.btAutoCharge.TextVisible = true; + this.btAutoCharge.Click += new System.EventHandler(this.btMagnet_Click); + // + // btSpeaker + // + this.btSpeaker.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.btSpeaker.BackColor2 = System.Drawing.Color.Gray; + this.btSpeaker.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btSpeaker.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btSpeaker.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.btSpeaker.BorderSize = new System.Windows.Forms.Padding(2); + this.btSpeaker.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btSpeaker.Cursor = System.Windows.Forms.Cursors.Hand; + this.btSpeaker.Dock = System.Windows.Forms.DockStyle.Fill; + this.btSpeaker.Font = new System.Drawing.Font("맑은 고딕", 80F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btSpeaker.ForeColor = System.Drawing.Color.White; + this.btSpeaker.GradientEnable = true; + this.btSpeaker.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.btSpeaker.GradientRepeatBG = false; + this.btSpeaker.isButton = true; + this.btSpeaker.Location = new System.Drawing.Point(3, 3); + this.btSpeaker.MouseDownColor = System.Drawing.Color.Yellow; + this.btSpeaker.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btSpeaker.msg = null; + this.btSpeaker.Name = "btSpeaker"; + this.btSpeaker.ProgressBorderColor = System.Drawing.Color.Black; + this.btSpeaker.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btSpeaker.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btSpeaker.ProgressEnable = false; + this.btSpeaker.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btSpeaker.ProgressForeColor = System.Drawing.Color.Black; + this.btSpeaker.ProgressMax = 100F; + this.btSpeaker.ProgressMin = 0F; + this.btSpeaker.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btSpeaker.ProgressValue = 0F; + this.btSpeaker.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btSpeaker.Sign = ""; + this.btSpeaker.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btSpeaker.SignColor = System.Drawing.Color.Yellow; + this.btSpeaker.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btSpeaker.Size = new System.Drawing.Size(613, 318); + this.btSpeaker.TabIndex = 11; + this.btSpeaker.Tag = "0"; + this.btSpeaker.Text = "음성지원"; + this.btSpeaker.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btSpeaker.TextShadow = true; + this.btSpeaker.TextVisible = true; + this.btSpeaker.Click += new System.EventHandler(this.btMagnet_Click); + // + // tabPage1 + // + this.tabPage1.BackColor = System.Drawing.Color.Navy; + this.tabPage1.Controls.Add(this.tbagvchannel); + this.tabPage1.Controls.Add(this.tbagvpanid); + this.tabPage1.Controls.Add(this.tbagvaddr); + this.tabPage1.Controls.Add(this.button7); + this.tabPage1.Controls.Add(this.label52); + this.tabPage1.Controls.Add(this.button6); + this.tabPage1.Controls.Add(this.button5); + this.tabPage1.Controls.Add(this.label50); + this.tabPage1.Controls.Add(this.label40); + this.tabPage1.Controls.Add(this.label20); + this.tabPage1.Controls.Add(this.label11); + this.tabPage1.Controls.Add(this.label18); + this.tabPage1.Controls.Add(this.label57); + this.tabPage1.Controls.Add(this.label56); + this.tabPage1.Controls.Add(this.label55); + this.tabPage1.Controls.Add(this.label32); + this.tabPage1.Controls.Add(this.label31); + this.tabPage1.Controls.Add(this.label15); + this.tabPage1.Controls.Add(this.label25); + this.tabPage1.Controls.Add(this.label2); + this.tabPage1.Controls.Add(this.vcSAD); + this.tabPage1.Controls.Add(this.vcSpeedDrive); + this.tabPage1.Controls.Add(this.vcSTT); + this.tabPage1.Controls.Add(this.vcSSK); + this.tabPage1.Controls.Add(this.vcSCK); + this.tabPage1.Controls.Add(this.vcpidDS); + this.tabPage1.Controls.Add(this.vcpidPS); + this.tabPage1.Controls.Add(this.vcpidIS); + this.tabPage1.Controls.Add(this.vcpidDL); + this.tabPage1.Controls.Add(this.vcpidDH); + this.tabPage1.Controls.Add(this.vcpidDM); + this.tabPage1.Controls.Add(this.vcpidIL); + this.tabPage1.Controls.Add(this.vcpidIH); + this.tabPage1.Controls.Add(this.vcpidIM); + this.tabPage1.Controls.Add(this.vcpidPL); + this.tabPage1.Controls.Add(this.vcpidPH); + this.tabPage1.Controls.Add(this.vcpidPM); + this.tabPage1.Controls.Add(this.vcSpeedR); + this.tabPage1.Controls.Add(this.vcSpeedH); + this.tabPage1.Controls.Add(this.vcSpeedS); + this.tabPage1.Controls.Add(this.vcSpeedL); + this.tabPage1.Controls.Add(this.vcSpeedM); + this.tabPage1.Location = new System.Drawing.Point(4, 4); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(1244, 590); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "AGV"; + // + // tbagvchannel + // + this.tbagvchannel.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold); + this.tbagvchannel.Location = new System.Drawing.Point(975, 201); + this.tbagvchannel.Name = "tbagvchannel"; + this.tbagvchannel.Size = new System.Drawing.Size(164, 54); + this.tbagvchannel.TabIndex = 77; + // + // tbagvpanid + // + this.tbagvpanid.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold); + this.tbagvpanid.Location = new System.Drawing.Point(975, 141); + this.tbagvpanid.Name = "tbagvpanid"; + this.tbagvpanid.Size = new System.Drawing.Size(164, 54); + this.tbagvpanid.TabIndex = 76; + // + // tbagvaddr + // + this.tbagvaddr.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold); + this.tbagvaddr.Location = new System.Drawing.Point(975, 77); + this.tbagvaddr.Name = "tbagvaddr"; + this.tbagvaddr.Size = new System.Drawing.Size(164, 54); + this.tbagvaddr.TabIndex = 75; + // + // button7 + // + this.button7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button7.Font = new System.Drawing.Font("궁서체", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.button7.Location = new System.Drawing.Point(1145, 77); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(93, 56); + this.button7.TabIndex = 74; + this.button7.Tag = "SAD"; + this.button7.Text = "SET"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // label52 + // + this.label52.AutoSize = true; + this.label52.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label52.ForeColor = System.Drawing.Color.Gray; + this.label52.Location = new System.Drawing.Point(868, 92); + this.label52.Name = "label52"; + this.label52.Size = new System.Drawing.Size(101, 24); + this.label52.TabIndex = 73; + this.label52.Text = "Address"; + this.label52.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // button6 + // + this.button6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button6.Font = new System.Drawing.Font("궁서체", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.button6.Location = new System.Drawing.Point(1145, 197); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(93, 56); + this.button6.TabIndex = 71; + this.button6.Tag = "SCH"; + this.button6.Text = "SET"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button5 + // + this.button5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button5.Font = new System.Drawing.Font("궁서체", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.button5.Location = new System.Drawing.Point(1145, 137); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(93, 56); + this.button5.TabIndex = 70; + this.button5.Tag = "SPN"; + this.button5.Text = "SET"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // label50 + // + this.label50.AutoSize = true; + this.label50.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label50.ForeColor = System.Drawing.Color.Gray; + this.label50.Location = new System.Drawing.Point(868, 212); + this.label50.Name = "label50"; + this.label50.Size = new System.Drawing.Size(101, 24); + this.label50.TabIndex = 69; + this.label50.Text = "Channel"; + this.label50.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label40 + // + this.label40.AutoSize = true; + this.label40.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label40.ForeColor = System.Drawing.Color.Gray; + this.label40.Location = new System.Drawing.Point(881, 152); + this.label40.Name = "label40"; + this.label40.Size = new System.Drawing.Size(88, 24); + this.label40.TabIndex = 67; + this.label40.Text = "Pan ID"; + this.label40.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label20.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label20.Location = new System.Drawing.Point(526, 464); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(101, 24); + this.label20.TabIndex = 65; + this.label20.Text = "Address"; + this.label20.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label11.ForeColor = System.Drawing.Color.Gray; + this.label11.Location = new System.Drawing.Point(846, 32); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(123, 24); + this.label11.TabIndex = 63; + this.label11.Text = "주행 속도"; + this.label11.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label18.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label18.Location = new System.Drawing.Point(49, 342); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(214, 24); + this.label18.TabIndex = 61; + this.label18.Text = "정지상수 (P/I/D)"; + this.label18.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label57 + // + this.label57.AutoSize = true; + this.label57.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label57.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label57.Location = new System.Drawing.Point(63, 464); + this.label57.Name = "label57"; + this.label57.Size = new System.Drawing.Size(200, 24); + this.label57.TabIndex = 60; + this.label57.Text = "TAG 재입력 시간"; + this.label57.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label56 + // + this.label56.AutoSize = true; + this.label56.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label56.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label56.Location = new System.Drawing.Point(441, 404); + this.label56.Name = "label56"; + this.label56.Size = new System.Drawing.Size(186, 24); + this.label56.TabIndex = 58; + this.label56.Text = "정지 감속 주기"; + this.label56.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label55 + // + this.label55.AutoSize = true; + this.label55.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label55.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label55.Location = new System.Drawing.Point(77, 404); + this.label55.Name = "label55"; + this.label55.Size = new System.Drawing.Size(186, 24); + this.label55.TabIndex = 58; + this.label55.Text = "정지 감속 상수"; + this.label55.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label32.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label32.Location = new System.Drawing.Point(58, 280); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(205, 24); + this.label32.TabIndex = 51; + this.label32.Text = "PID (H/M/L) - D"; + this.label32.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label31.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label31.Location = new System.Drawing.Point(58, 218); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(205, 24); + this.label31.TabIndex = 47; + this.label31.Text = "PID (H/M/L) - I"; + this.label31.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label15.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label15.Location = new System.Drawing.Point(58, 156); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(205, 24); + this.label15.TabIndex = 43; + this.label15.Text = "PID (H/M/L) - P"; + this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label25.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label25.Location = new System.Drawing.Point(64, 94); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(199, 24); + this.label25.TabIndex = 36; + this.label25.Text = "속도(정지/회전)"; + this.label25.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // vcSAD + // + this.vcSAD.BackColorButton = System.Drawing.Color.White; + this.vcSAD.ButtonWidth = "30"; + this.vcSAD.ColorBorder = System.Drawing.Color.White; + this.vcSAD.DecimalPosition = ((ushort)(0)); + this.vcSAD.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSAD.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSAD.ForeColor = System.Drawing.Color.White; + this.vcSAD.ForeColorButton = System.Drawing.Color.Black; + this.vcSAD.Location = new System.Drawing.Point(633, 449); + this.vcSAD.MaxValue = 9999D; + this.vcSAD.MinValue = 0D; + this.vcSAD.Name = "vcSAD"; + this.vcSAD.NullDisplay = "--"; + this.vcSAD.SideButtonClickValue = 1D; + this.vcSAD.Size = new System.Drawing.Size(164, 54); + this.vcSAD.TabIndex = 64; + this.vcSAD.Tag = "SAD"; + this.vcSAD.Text = "30"; + this.vcSAD.Value = 30D; + this.vcSAD.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSAD.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSpeedDrive + // + this.vcSpeedDrive.BackColorButton = System.Drawing.Color.White; + this.vcSpeedDrive.ButtonWidth = "30"; + this.vcSpeedDrive.ColorBorder = System.Drawing.Color.White; + this.vcSpeedDrive.DecimalPosition = ((ushort)(0)); + this.vcSpeedDrive.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSpeedDrive.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSpeedDrive.ForeColor = System.Drawing.Color.DimGray; + this.vcSpeedDrive.ForeColorButton = System.Drawing.Color.Black; + this.vcSpeedDrive.Location = new System.Drawing.Point(975, 17); + this.vcSpeedDrive.MaxValue = 9999D; + this.vcSpeedDrive.MinValue = 0D; + this.vcSpeedDrive.Name = "vcSpeedDrive"; + this.vcSpeedDrive.NullDisplay = "--"; + this.vcSpeedDrive.SideButtonClickValue = 3D; + this.vcSpeedDrive.Size = new System.Drawing.Size(164, 54); + this.vcSpeedDrive.TabIndex = 62; + this.vcSpeedDrive.Tag = "SSL"; + this.vcSpeedDrive.Text = "30"; + this.vcSpeedDrive.Value = 30D; + this.vcSpeedDrive.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSpeedDrive.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSTT + // + this.vcSTT.BackColorButton = System.Drawing.Color.White; + this.vcSTT.ButtonWidth = "30"; + this.vcSTT.ColorBorder = System.Drawing.Color.White; + this.vcSTT.DecimalPosition = ((ushort)(0)); + this.vcSTT.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSTT.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSTT.ForeColor = System.Drawing.Color.White; + this.vcSTT.ForeColorButton = System.Drawing.Color.Black; + this.vcSTT.Location = new System.Drawing.Point(269, 449); + this.vcSTT.MaxValue = 9999D; + this.vcSTT.MinValue = 0D; + this.vcSTT.Name = "vcSTT"; + this.vcSTT.NullDisplay = "--"; + this.vcSTT.SideButtonClickValue = 1D; + this.vcSTT.Size = new System.Drawing.Size(164, 54); + this.vcSTT.TabIndex = 59; + this.vcSTT.Tag = "SDH"; + this.vcSTT.Text = "30"; + this.vcSTT.Value = 30D; + this.vcSTT.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSTT.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSSK + // + this.vcSSK.BackColorButton = System.Drawing.Color.White; + this.vcSSK.ButtonWidth = "30"; + this.vcSSK.ColorBorder = System.Drawing.Color.White; + this.vcSSK.DecimalPosition = ((ushort)(0)); + this.vcSSK.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSSK.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSSK.ForeColor = System.Drawing.Color.White; + this.vcSSK.ForeColorButton = System.Drawing.Color.Black; + this.vcSSK.Location = new System.Drawing.Point(633, 389); + this.vcSSK.MaxValue = 9999D; + this.vcSSK.MinValue = 0D; + this.vcSSK.Name = "vcSSK"; + this.vcSSK.NullDisplay = "--"; + this.vcSSK.SideButtonClickValue = 1D; + this.vcSSK.Size = new System.Drawing.Size(164, 54); + this.vcSSK.TabIndex = 57; + this.vcSSK.Tag = "SDH"; + this.vcSSK.Text = "10"; + this.vcSSK.Value = 10D; + this.vcSSK.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSSK.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSCK + // + this.vcSCK.BackColorButton = System.Drawing.Color.White; + this.vcSCK.ButtonWidth = "30"; + this.vcSCK.ColorBorder = System.Drawing.Color.White; + this.vcSCK.DecimalPosition = ((ushort)(0)); + this.vcSCK.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSCK.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSCK.ForeColor = System.Drawing.Color.White; + this.vcSCK.ForeColorButton = System.Drawing.Color.Black; + this.vcSCK.Location = new System.Drawing.Point(269, 389); + this.vcSCK.MaxValue = 9999D; + this.vcSCK.MinValue = 0D; + this.vcSCK.Name = "vcSCK"; + this.vcSCK.NullDisplay = "--"; + this.vcSCK.SideButtonClickValue = 1D; + this.vcSCK.Size = new System.Drawing.Size(164, 54); + this.vcSCK.TabIndex = 57; + this.vcSCK.Tag = "SDH"; + this.vcSCK.Text = "10"; + this.vcSCK.Value = 10D; + this.vcSCK.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSCK.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidDS + // + this.vcpidDS.BackColorButton = System.Drawing.Color.White; + this.vcpidDS.ButtonWidth = "30"; + this.vcpidDS.ColorBorder = System.Drawing.Color.White; + this.vcpidDS.DecimalPosition = ((ushort)(0)); + this.vcpidDS.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidDS.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidDS.ForeColor = System.Drawing.Color.White; + this.vcpidDS.ForeColorButton = System.Drawing.Color.Black; + this.vcpidDS.Location = new System.Drawing.Point(633, 327); + this.vcpidDS.MaxValue = 9999D; + this.vcpidDS.MinValue = 0D; + this.vcpidDS.Name = "vcpidDS"; + this.vcpidDS.NullDisplay = "--"; + this.vcpidDS.SideButtonClickValue = 3D; + this.vcpidDS.Size = new System.Drawing.Size(164, 54); + this.vcpidDS.TabIndex = 56; + this.vcpidDS.Tag = "SDS"; + this.vcpidDS.Text = "15"; + this.vcpidDS.Value = 15D; + this.vcpidDS.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidDS.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidPS + // + this.vcpidPS.BackColorButton = System.Drawing.Color.White; + this.vcpidPS.ButtonWidth = "30"; + this.vcpidPS.ColorBorder = System.Drawing.Color.White; + this.vcpidPS.DecimalPosition = ((ushort)(0)); + this.vcpidPS.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidPS.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidPS.ForeColor = System.Drawing.Color.White; + this.vcpidPS.ForeColorButton = System.Drawing.Color.Black; + this.vcpidPS.Location = new System.Drawing.Point(269, 327); + this.vcpidPS.MaxValue = 9999D; + this.vcpidPS.MinValue = 0D; + this.vcpidPS.Name = "vcpidPS"; + this.vcpidPS.NullDisplay = "--"; + this.vcpidPS.SideButtonClickValue = 1D; + this.vcpidPS.Size = new System.Drawing.Size(164, 54); + this.vcpidPS.TabIndex = 53; + this.vcpidPS.Tag = "SPS"; + this.vcpidPS.Text = "200"; + this.vcpidPS.Value = 200D; + this.vcpidPS.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidPS.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidIS + // + this.vcpidIS.BackColorButton = System.Drawing.Color.White; + this.vcpidIS.ButtonWidth = "30"; + this.vcpidIS.ColorBorder = System.Drawing.Color.White; + this.vcpidIS.DecimalPosition = ((ushort)(0)); + this.vcpidIS.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidIS.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidIS.ForeColor = System.Drawing.Color.White; + this.vcpidIS.ForeColorButton = System.Drawing.Color.Black; + this.vcpidIS.Location = new System.Drawing.Point(454, 327); + this.vcpidIS.MaxValue = 9999D; + this.vcpidIS.MinValue = 0D; + this.vcpidIS.Name = "vcpidIS"; + this.vcpidIS.NullDisplay = "--"; + this.vcpidIS.SideButtonClickValue = 3D; + this.vcpidIS.Size = new System.Drawing.Size(164, 54); + this.vcpidIS.TabIndex = 54; + this.vcpidIS.Tag = "SIS"; + this.vcpidIS.Text = "1"; + this.vcpidIS.Value = 1D; + this.vcpidIS.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidIS.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidDL + // + this.vcpidDL.BackColorButton = System.Drawing.Color.White; + this.vcpidDL.ButtonWidth = "30"; + this.vcpidDL.ColorBorder = System.Drawing.Color.White; + this.vcpidDL.DecimalPosition = ((ushort)(0)); + this.vcpidDL.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidDL.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidDL.ForeColor = System.Drawing.Color.White; + this.vcpidDL.ForeColorButton = System.Drawing.Color.Black; + this.vcpidDL.Location = new System.Drawing.Point(633, 265); + this.vcpidDL.MaxValue = 9999D; + this.vcpidDL.MinValue = 0D; + this.vcpidDL.Name = "vcpidDL"; + this.vcpidDL.NullDisplay = "--"; + this.vcpidDL.SideButtonClickValue = 3D; + this.vcpidDL.Size = new System.Drawing.Size(164, 54); + this.vcpidDL.TabIndex = 52; + this.vcpidDL.Tag = "SDL"; + this.vcpidDL.Text = "15"; + this.vcpidDL.Value = 15D; + this.vcpidDL.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidDL.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidDH + // + this.vcpidDH.BackColorButton = System.Drawing.Color.White; + this.vcpidDH.ButtonWidth = "30"; + this.vcpidDH.ColorBorder = System.Drawing.Color.White; + this.vcpidDH.DecimalPosition = ((ushort)(0)); + this.vcpidDH.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidDH.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidDH.ForeColor = System.Drawing.Color.White; + this.vcpidDH.ForeColorButton = System.Drawing.Color.Black; + this.vcpidDH.Location = new System.Drawing.Point(269, 265); + this.vcpidDH.MaxValue = 9999D; + this.vcpidDH.MinValue = 0D; + this.vcpidDH.Name = "vcpidDH"; + this.vcpidDH.NullDisplay = "--"; + this.vcpidDH.SideButtonClickValue = 1D; + this.vcpidDH.Size = new System.Drawing.Size(164, 54); + this.vcpidDH.TabIndex = 49; + this.vcpidDH.Tag = "SDH"; + this.vcpidDH.Text = "15"; + this.vcpidDH.Value = 15D; + this.vcpidDH.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidDH.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidDM + // + this.vcpidDM.BackColorButton = System.Drawing.Color.White; + this.vcpidDM.ButtonWidth = "30"; + this.vcpidDM.ColorBorder = System.Drawing.Color.White; + this.vcpidDM.DecimalPosition = ((ushort)(0)); + this.vcpidDM.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidDM.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidDM.ForeColor = System.Drawing.Color.White; + this.vcpidDM.ForeColorButton = System.Drawing.Color.Black; + this.vcpidDM.Location = new System.Drawing.Point(454, 265); + this.vcpidDM.MaxValue = 9999D; + this.vcpidDM.MinValue = 0D; + this.vcpidDM.Name = "vcpidDM"; + this.vcpidDM.NullDisplay = "--"; + this.vcpidDM.SideButtonClickValue = 3D; + this.vcpidDM.Size = new System.Drawing.Size(164, 54); + this.vcpidDM.TabIndex = 50; + this.vcpidDM.Tag = "SDM"; + this.vcpidDM.Text = "15"; + this.vcpidDM.Value = 15D; + this.vcpidDM.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidDM.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidIL + // + this.vcpidIL.BackColorButton = System.Drawing.Color.White; + this.vcpidIL.ButtonWidth = "30"; + this.vcpidIL.ColorBorder = System.Drawing.Color.White; + this.vcpidIL.DecimalPosition = ((ushort)(0)); + this.vcpidIL.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidIL.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidIL.ForeColor = System.Drawing.Color.White; + this.vcpidIL.ForeColorButton = System.Drawing.Color.Black; + this.vcpidIL.Location = new System.Drawing.Point(633, 203); + this.vcpidIL.MaxValue = 9999D; + this.vcpidIL.MinValue = 0D; + this.vcpidIL.Name = "vcpidIL"; + this.vcpidIL.NullDisplay = "--"; + this.vcpidIL.SideButtonClickValue = 3D; + this.vcpidIL.Size = new System.Drawing.Size(164, 54); + this.vcpidIL.TabIndex = 48; + this.vcpidIL.Tag = "SIL"; + this.vcpidIL.Text = "1"; + this.vcpidIL.Value = 1D; + this.vcpidIL.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidIL.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidIH + // + this.vcpidIH.BackColorButton = System.Drawing.Color.White; + this.vcpidIH.ButtonWidth = "30"; + this.vcpidIH.ColorBorder = System.Drawing.Color.White; + this.vcpidIH.DecimalPosition = ((ushort)(0)); + this.vcpidIH.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidIH.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidIH.ForeColor = System.Drawing.Color.White; + this.vcpidIH.ForeColorButton = System.Drawing.Color.Black; + this.vcpidIH.Location = new System.Drawing.Point(269, 203); + this.vcpidIH.MaxValue = 9999D; + this.vcpidIH.MinValue = 0D; + this.vcpidIH.Name = "vcpidIH"; + this.vcpidIH.NullDisplay = "--"; + this.vcpidIH.SideButtonClickValue = 1D; + this.vcpidIH.Size = new System.Drawing.Size(164, 54); + this.vcpidIH.TabIndex = 45; + this.vcpidIH.Tag = "SIH"; + this.vcpidIH.Text = "1"; + this.vcpidIH.Value = 1D; + this.vcpidIH.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidIH.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidIM + // + this.vcpidIM.BackColorButton = System.Drawing.Color.White; + this.vcpidIM.ButtonWidth = "30"; + this.vcpidIM.ColorBorder = System.Drawing.Color.White; + this.vcpidIM.DecimalPosition = ((ushort)(0)); + this.vcpidIM.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidIM.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidIM.ForeColor = System.Drawing.Color.White; + this.vcpidIM.ForeColorButton = System.Drawing.Color.Black; + this.vcpidIM.Location = new System.Drawing.Point(454, 203); + this.vcpidIM.MaxValue = 9999D; + this.vcpidIM.MinValue = 0D; + this.vcpidIM.Name = "vcpidIM"; + this.vcpidIM.NullDisplay = "--"; + this.vcpidIM.SideButtonClickValue = 3D; + this.vcpidIM.Size = new System.Drawing.Size(164, 54); + this.vcpidIM.TabIndex = 46; + this.vcpidIM.Tag = "SIM"; + this.vcpidIM.Text = "1"; + this.vcpidIM.Value = 1D; + this.vcpidIM.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidIM.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidPL + // + this.vcpidPL.BackColorButton = System.Drawing.Color.White; + this.vcpidPL.ButtonWidth = "30"; + this.vcpidPL.ColorBorder = System.Drawing.Color.White; + this.vcpidPL.DecimalPosition = ((ushort)(0)); + this.vcpidPL.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidPL.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidPL.ForeColor = System.Drawing.Color.White; + this.vcpidPL.ForeColorButton = System.Drawing.Color.Black; + this.vcpidPL.Location = new System.Drawing.Point(633, 141); + this.vcpidPL.MaxValue = 9999D; + this.vcpidPL.MinValue = 0D; + this.vcpidPL.Name = "vcpidPL"; + this.vcpidPL.NullDisplay = "--"; + this.vcpidPL.SideButtonClickValue = 3D; + this.vcpidPL.Size = new System.Drawing.Size(164, 54); + this.vcpidPL.TabIndex = 44; + this.vcpidPL.Tag = "SPL"; + this.vcpidPL.Text = "200"; + this.vcpidPL.Value = 200D; + this.vcpidPL.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidPL.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidPH + // + this.vcpidPH.BackColorButton = System.Drawing.Color.White; + this.vcpidPH.ButtonWidth = "30"; + this.vcpidPH.ColorBorder = System.Drawing.Color.White; + this.vcpidPH.DecimalPosition = ((ushort)(0)); + this.vcpidPH.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidPH.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidPH.ForeColor = System.Drawing.Color.White; + this.vcpidPH.ForeColorButton = System.Drawing.Color.Black; + this.vcpidPH.Location = new System.Drawing.Point(269, 141); + this.vcpidPH.MaxValue = 9999D; + this.vcpidPH.MinValue = 0D; + this.vcpidPH.Name = "vcpidPH"; + this.vcpidPH.NullDisplay = "--"; + this.vcpidPH.SideButtonClickValue = 1D; + this.vcpidPH.Size = new System.Drawing.Size(164, 54); + this.vcpidPH.TabIndex = 41; + this.vcpidPH.Tag = "SPH"; + this.vcpidPH.Text = "200"; + this.vcpidPH.Value = 200D; + this.vcpidPH.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidPH.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcpidPM + // + this.vcpidPM.BackColorButton = System.Drawing.Color.White; + this.vcpidPM.ButtonWidth = "30"; + this.vcpidPM.ColorBorder = System.Drawing.Color.White; + this.vcpidPM.DecimalPosition = ((ushort)(0)); + this.vcpidPM.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcpidPM.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcpidPM.ForeColor = System.Drawing.Color.White; + this.vcpidPM.ForeColorButton = System.Drawing.Color.Black; + this.vcpidPM.Location = new System.Drawing.Point(454, 141); + this.vcpidPM.MaxValue = 9999D; + this.vcpidPM.MinValue = 0D; + this.vcpidPM.Name = "vcpidPM"; + this.vcpidPM.NullDisplay = "--"; + this.vcpidPM.SideButtonClickValue = 3D; + this.vcpidPM.Size = new System.Drawing.Size(164, 54); + this.vcpidPM.TabIndex = 42; + this.vcpidPM.Tag = "SPM"; + this.vcpidPM.Text = "200"; + this.vcpidPM.Value = 200D; + this.vcpidPM.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcpidPM.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSpeedR + // + this.vcSpeedR.BackColorButton = System.Drawing.Color.White; + this.vcSpeedR.ButtonWidth = "30"; + this.vcSpeedR.ColorBorder = System.Drawing.Color.White; + this.vcSpeedR.DecimalPosition = ((ushort)(0)); + this.vcSpeedR.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSpeedR.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSpeedR.ForeColor = System.Drawing.Color.White; + this.vcSpeedR.ForeColorButton = System.Drawing.Color.Black; + this.vcSpeedR.Location = new System.Drawing.Point(454, 79); + this.vcSpeedR.MaxValue = 9999D; + this.vcSpeedR.MinValue = 0D; + this.vcSpeedR.Name = "vcSpeedR"; + this.vcSpeedR.NullDisplay = "--"; + this.vcSpeedR.SideButtonClickValue = 1D; + this.vcSpeedR.Size = new System.Drawing.Size(164, 54); + this.vcSpeedR.TabIndex = 39; + this.vcSpeedR.Tag = "SRS"; + this.vcSpeedR.Text = "70"; + this.vcSpeedR.Value = 70D; + this.vcSpeedR.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSpeedR.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSpeedH + // + this.vcSpeedH.BackColorButton = System.Drawing.Color.White; + this.vcSpeedH.ButtonWidth = "30"; + this.vcSpeedH.ColorBorder = System.Drawing.Color.White; + this.vcSpeedH.DecimalPosition = ((ushort)(0)); + this.vcSpeedH.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSpeedH.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSpeedH.ForeColor = System.Drawing.Color.White; + this.vcSpeedH.ForeColorButton = System.Drawing.Color.Black; + this.vcSpeedH.Location = new System.Drawing.Point(633, 17); + this.vcSpeedH.MaxValue = 9999D; + this.vcSpeedH.MinValue = 0D; + this.vcSpeedH.Name = "vcSpeedH"; + this.vcSpeedH.NullDisplay = "--"; + this.vcSpeedH.SideButtonClickValue = 3D; + this.vcSpeedH.Size = new System.Drawing.Size(164, 54); + this.vcSpeedH.TabIndex = 38; + this.vcSpeedH.Tag = "SSL"; + this.vcSpeedH.Text = "30"; + this.vcSpeedH.Value = 30D; + this.vcSpeedH.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSpeedH.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSpeedS + // + this.vcSpeedS.BackColorButton = System.Drawing.Color.White; + this.vcSpeedS.ButtonWidth = "30"; + this.vcSpeedS.ColorBorder = System.Drawing.Color.White; + this.vcSpeedS.DecimalPosition = ((ushort)(0)); + this.vcSpeedS.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSpeedS.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSpeedS.ForeColor = System.Drawing.Color.White; + this.vcSpeedS.ForeColorButton = System.Drawing.Color.Black; + this.vcSpeedS.Location = new System.Drawing.Point(269, 79); + this.vcSpeedS.MaxValue = 9999D; + this.vcSpeedS.MinValue = 0D; + this.vcSpeedS.Name = "vcSpeedS"; + this.vcSpeedS.NullDisplay = "--"; + this.vcSpeedS.SideButtonClickValue = 1D; + this.vcSpeedS.Size = new System.Drawing.Size(164, 54); + this.vcSpeedS.TabIndex = 35; + this.vcSpeedS.Tag = "SSS"; + this.vcSpeedS.Text = "61"; + this.vcSpeedS.Value = 61D; + this.vcSpeedS.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSpeedS.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSpeedL + // + this.vcSpeedL.BackColorButton = System.Drawing.Color.White; + this.vcSpeedL.ButtonWidth = "30"; + this.vcSpeedL.ColorBorder = System.Drawing.Color.White; + this.vcSpeedL.DecimalPosition = ((ushort)(0)); + this.vcSpeedL.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSpeedL.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSpeedL.ForeColor = System.Drawing.Color.White; + this.vcSpeedL.ForeColorButton = System.Drawing.Color.Black; + this.vcSpeedL.Location = new System.Drawing.Point(269, 17); + this.vcSpeedL.MaxValue = 9999D; + this.vcSpeedL.MinValue = 0D; + this.vcSpeedL.Name = "vcSpeedL"; + this.vcSpeedL.NullDisplay = "--"; + this.vcSpeedL.SideButtonClickValue = 1D; + this.vcSpeedL.Size = new System.Drawing.Size(164, 54); + this.vcSpeedL.TabIndex = 2; + this.vcSpeedL.Tag = "SSH"; + this.vcSpeedL.Text = "110"; + this.vcSpeedL.Value = 110D; + this.vcSpeedL.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSpeedL.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcSpeedM + // + this.vcSpeedM.BackColorButton = System.Drawing.Color.White; + this.vcSpeedM.ButtonWidth = "30"; + this.vcSpeedM.ColorBorder = System.Drawing.Color.White; + this.vcSpeedM.DecimalPosition = ((ushort)(0)); + this.vcSpeedM.Font = new System.Drawing.Font("맑은 고딕", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcSpeedM.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcSpeedM.ForeColor = System.Drawing.Color.White; + this.vcSpeedM.ForeColorButton = System.Drawing.Color.Black; + this.vcSpeedM.Location = new System.Drawing.Point(454, 17); + this.vcSpeedM.MaxValue = 9999D; + this.vcSpeedM.MinValue = 0D; + this.vcSpeedM.Name = "vcSpeedM"; + this.vcSpeedM.NullDisplay = "--"; + this.vcSpeedM.SideButtonClickValue = 3D; + this.vcSpeedM.Size = new System.Drawing.Size(164, 54); + this.vcSpeedM.TabIndex = 4; + this.vcSpeedM.Tag = "SSM"; + this.vcSpeedM.Text = "70"; + this.vcSpeedM.Value = 70D; + this.vcSpeedM.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcSpeedM.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // tabPage2 + // + this.tabPage2.BackColor = System.Drawing.Color.Navy; + this.tabPage2.Controls.Add(this.button3); + this.tabPage2.Controls.Add(this.label30); + this.tabPage2.Controls.Add(this.label12); + this.tabPage2.Controls.Add(this.label13); + this.tabPage2.Controls.Add(this.button2); + this.tabPage2.Controls.Add(this.tbBaudBAT); + this.tabPage2.Controls.Add(this.tbportBMS); + this.tabPage2.Controls.Add(this.label27); + this.tabPage2.Controls.Add(this.button1); + this.tabPage2.Controls.Add(this.tbBaudAGV); + this.tabPage2.Controls.Add(this.tbPortAGV); + this.tabPage2.Controls.Add(this.label6); + this.tabPage2.Controls.Add(this.btSelPlc1); + this.tabPage2.Controls.Add(this.btSelXbee); + this.tabPage2.Controls.Add(this.tbBaudPLC); + this.tabPage2.Controls.Add(this.tbBaudXBE); + this.tabPage2.Controls.Add(this.tbPortPLC); + this.tabPage2.Controls.Add(this.tbPortXBE); + this.tabPage2.Controls.Add(this.label7); + this.tabPage2.Controls.Add(this.label5); + this.tabPage2.Controls.Add(this.valIntervalBMS); + this.tabPage2.Controls.Add(this.valueSelect4); + this.tabPage2.Controls.Add(this.valIntervalXBE); + this.tabPage2.Location = new System.Drawing.Point(4, 4); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(1244, 590); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "통신"; + // + // button3 + // + this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button3.Location = new System.Drawing.Point(1157, 9); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(79, 38); + this.button3.TabIndex = 34; + this.button3.Text = "TEST"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label30.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label30.Location = new System.Drawing.Point(946, 273); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(49, 24); + this.label30.TabIndex = 33; + this.label30.Text = "sec"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label12.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label12.Location = new System.Drawing.Point(946, 194); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(36, 24); + this.label12.TabIndex = 33; + this.label12.Text = "ms"; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label13.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label13.Location = new System.Drawing.Point(946, 114); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(36, 24); + this.label13.TabIndex = 15; + this.label13.Text = "ms"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(383, 178); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(89, 56); + this.button2.TabIndex = 28; + this.button2.Tag = "BAT"; + this.button2.Text = "..."; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.btSelXbee_Click); + // + // tbBaudBAT + // + this.tbBaudBAT.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbBaudBAT.FormattingEnabled = true; + this.tbBaudBAT.Items.AddRange(new object[] { + "4800", + "9600", + "19200", + "46800", + "115200", + "250000"}); + this.tbBaudBAT.Location = new System.Drawing.Point(478, 181); + this.tbBaudBAT.Name = "tbBaudBAT"; + this.tbBaudBAT.Size = new System.Drawing.Size(217, 51); + this.tbBaudBAT.TabIndex = 27; + this.tbBaudBAT.Tag = "P1"; + // + // tbportBMS + // + this.tbportBMS.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.tbportBMS.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbportBMS.Location = new System.Drawing.Point(161, 178); + this.tbportBMS.Name = "tbportBMS"; + this.tbportBMS.Size = new System.Drawing.Size(216, 56); + this.tbportBMS.TabIndex = 26; + this.tbportBMS.Tag = "P1"; + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label27.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label27.Location = new System.Drawing.Point(38, 194); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(114, 24); + this.label27.TabIndex = 25; + this.label27.Text = "BAT PORT"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(383, 18); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(89, 56); + this.button1.TabIndex = 24; + this.button1.Tag = "AGV"; + this.button1.Text = "..."; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.btSelXbee_Click); + // + // tbBaudAGV + // + this.tbBaudAGV.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbBaudAGV.FormattingEnabled = true; + this.tbBaudAGV.Items.AddRange(new object[] { + "4800", + "9600", + "19200", + "46800", + "115200", + "250000"}); + this.tbBaudAGV.Location = new System.Drawing.Point(478, 21); + this.tbBaudAGV.Name = "tbBaudAGV"; + this.tbBaudAGV.Size = new System.Drawing.Size(217, 51); + this.tbBaudAGV.TabIndex = 23; + this.tbBaudAGV.Tag = "P1"; + // + // tbPortAGV + // + this.tbPortAGV.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.tbPortAGV.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbPortAGV.Location = new System.Drawing.Point(161, 18); + this.tbPortAGV.Name = "tbPortAGV"; + this.tbPortAGV.Size = new System.Drawing.Size(216, 56); + this.tbPortAGV.TabIndex = 22; + this.tbPortAGV.Tag = "P1"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label6.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label6.Location = new System.Drawing.Point(38, 34); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(114, 24); + this.label6.TabIndex = 21; + this.label6.Text = "AGV PORT"; + // + // btSelPlc1 + // + this.btSelPlc1.Location = new System.Drawing.Point(383, 98); + this.btSelPlc1.Name = "btSelPlc1"; + this.btSelPlc1.Size = new System.Drawing.Size(89, 56); + this.btSelPlc1.TabIndex = 15; + this.btSelPlc1.Tag = "PLC"; + this.btSelPlc1.Text = "..."; + this.btSelPlc1.UseVisualStyleBackColor = true; + this.btSelPlc1.Click += new System.EventHandler(this.btSelXbee_Click); + // + // btSelXbee + // + this.btSelXbee.Location = new System.Drawing.Point(383, 257); + this.btSelXbee.Name = "btSelXbee"; + this.btSelXbee.Size = new System.Drawing.Size(89, 56); + this.btSelXbee.TabIndex = 13; + this.btSelXbee.Tag = "XBE"; + this.btSelXbee.Text = "..."; + this.btSelXbee.UseVisualStyleBackColor = true; + this.btSelXbee.Click += new System.EventHandler(this.btSelXbee_Click); + // + // tbBaudPLC + // + this.tbBaudPLC.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbBaudPLC.FormattingEnabled = true; + this.tbBaudPLC.Items.AddRange(new object[] { + "4800", + "9600", + "19200", + "46800", + "115200", + "250000"}); + this.tbBaudPLC.Location = new System.Drawing.Point(478, 101); + this.tbBaudPLC.Name = "tbBaudPLC"; + this.tbBaudPLC.Size = new System.Drawing.Size(217, 51); + this.tbBaudPLC.TabIndex = 10; + this.tbBaudPLC.Tag = "P1"; + // + // tbBaudXBE + // + this.tbBaudXBE.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbBaudXBE.FormattingEnabled = true; + this.tbBaudXBE.Items.AddRange(new object[] { + "4800", + "9600", + "19200", + "46800", + "115200", + "250000"}); + this.tbBaudXBE.Location = new System.Drawing.Point(478, 260); + this.tbBaudXBE.Name = "tbBaudXBE"; + this.tbBaudXBE.Size = new System.Drawing.Size(217, 51); + this.tbBaudXBE.TabIndex = 8; + this.tbBaudXBE.Tag = "XB"; + // + // tbPortPLC + // + this.tbPortPLC.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.tbPortPLC.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbPortPLC.Location = new System.Drawing.Point(161, 98); + this.tbPortPLC.Name = "tbPortPLC"; + this.tbPortPLC.Size = new System.Drawing.Size(216, 56); + this.tbPortPLC.TabIndex = 5; + this.tbPortPLC.Tag = "P1"; + // + // tbPortXBE + // + this.tbPortXBE.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.tbPortXBE.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.tbPortXBE.Location = new System.Drawing.Point(161, 257); + this.tbPortXBE.Name = "tbPortXBE"; + this.tbPortXBE.Size = new System.Drawing.Size(216, 56); + this.tbPortXBE.TabIndex = 3; + this.tbPortXBE.Tag = "XB"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label7.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label7.Location = new System.Drawing.Point(38, 114); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(114, 24); + this.label7.TabIndex = 2; + this.label7.Text = "PLC PORT"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label5.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label5.Location = new System.Drawing.Point(38, 273); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(114, 24); + this.label5.TabIndex = 1; + this.label5.Text = "XBE PORT"; + // + // valIntervalBMS + // + this.valIntervalBMS.BackColorButton = System.Drawing.Color.White; + this.valIntervalBMS.ButtonWidth = "30"; + this.valIntervalBMS.ColorBorder = System.Drawing.Color.White; + this.valIntervalBMS.DecimalPosition = ((ushort)(1)); + this.valIntervalBMS.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.valIntervalBMS.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.valIntervalBMS.ForeColor = System.Drawing.Color.White; + this.valIntervalBMS.ForeColorButton = System.Drawing.Color.Black; + this.valIntervalBMS.Location = new System.Drawing.Point(701, 181); + this.valIntervalBMS.MaxValue = 999999D; + this.valIntervalBMS.MinValue = 0D; + this.valIntervalBMS.Name = "valIntervalBMS"; + this.valIntervalBMS.NullDisplay = "--"; + this.valIntervalBMS.SideButtonClickValue = 0.5D; + this.valIntervalBMS.Size = new System.Drawing.Size(239, 51); + this.valIntervalBMS.TabIndex = 32; + this.valIntervalBMS.Tag = "CL"; + this.valIntervalBMS.Text = "0"; + this.valIntervalBMS.Value = 0D; + this.valIntervalBMS.ButtonClick += new System.EventHandler(this.valIntervalBMS_ButtonClick); + // + // valueSelect4 + // + this.valueSelect4.BackColorButton = System.Drawing.Color.White; + this.valueSelect4.ButtonWidth = "30"; + this.valueSelect4.ColorBorder = System.Drawing.Color.White; + this.valueSelect4.DecimalPosition = ((ushort)(0)); + this.valueSelect4.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.valueSelect4.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.valueSelect4.ForeColor = System.Drawing.Color.White; + this.valueSelect4.ForeColorButton = System.Drawing.Color.Black; + this.valueSelect4.Location = new System.Drawing.Point(701, 101); + this.valueSelect4.MaxValue = 254D; + this.valueSelect4.MinValue = 0D; + this.valueSelect4.Name = "valueSelect4"; + this.valueSelect4.NullDisplay = "--"; + this.valueSelect4.SideButtonClickValue = 20D; + this.valueSelect4.Size = new System.Drawing.Size(239, 51); + this.valueSelect4.TabIndex = 13; + this.valueSelect4.Tag = "SL"; + this.valueSelect4.Text = "1"; + this.valueSelect4.Value = 1D; + this.valueSelect4.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // valIntervalXBE + // + this.valIntervalXBE.BackColorButton = System.Drawing.Color.White; + this.valIntervalXBE.ButtonWidth = "30"; + this.valIntervalXBE.ColorBorder = System.Drawing.Color.White; + this.valIntervalXBE.DecimalPosition = ((ushort)(1)); + this.valIntervalXBE.Font = new System.Drawing.Font("궁서체", 32F, System.Drawing.FontStyle.Bold); + this.valIntervalXBE.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.valIntervalXBE.ForeColor = System.Drawing.Color.White; + this.valIntervalXBE.ForeColorButton = System.Drawing.Color.Black; + this.valIntervalXBE.Location = new System.Drawing.Point(701, 260); + this.valIntervalXBE.MaxValue = 100D; + this.valIntervalXBE.MinValue = 0D; + this.valIntervalXBE.Name = "valIntervalXBE"; + this.valIntervalXBE.NullDisplay = "--"; + this.valIntervalXBE.SideButtonClickValue = 0.5D; + this.valIntervalXBE.Size = new System.Drawing.Size(239, 51); + this.valIntervalXBE.TabIndex = 20; + this.valIntervalXBE.Tag = "CL"; + this.valIntervalXBE.Text = "0"; + this.valIntervalXBE.Value = 0D; + // + // tabPage3 + // + this.tabPage3.BackColor = System.Drawing.Color.DarkSlateBlue; + this.tabPage3.Controls.Add(this.cmbChargerPos); + this.tabPage3.Controls.Add(this.label58); + this.tabPage3.Controls.Add(this.label19); + this.tabPage3.Controls.Add(this.label44); + this.tabPage3.Controls.Add(this.label29); + this.tabPage3.Controls.Add(this.label43); + this.tabPage3.Controls.Add(this.label42); + this.tabPage3.Controls.Add(this.label41); + this.tabPage3.Controls.Add(this.label39); + this.tabPage3.Controls.Add(this.label28); + this.tabPage3.Controls.Add(this.label14); + this.tabPage3.Controls.Add(this.label33); + this.tabPage3.Controls.Add(this.label36); + this.tabPage3.Controls.Add(this.label37); + this.tabPage3.Controls.Add(this.label35); + this.tabPage3.Controls.Add(this.label34); + this.tabPage3.Controls.Add(this.label38); + this.tabPage3.Controls.Add(this.label21); + this.tabPage3.Controls.Add(this.label1); + this.tabPage3.Controls.Add(this.label9); + this.tabPage3.Controls.Add(this.label26); + this.tabPage3.Controls.Add(this.label23); + this.tabPage3.Controls.Add(this.label24); + this.tabPage3.Controls.Add(this.vcChargeStartLevel); + this.tabPage3.Controls.Add(this.vcChargeMaxLevel); + this.tabPage3.Controls.Add(this.vcChargeWaitSec); + this.tabPage3.Controls.Add(this.tbChargerID); + this.tabPage3.Controls.Add(this.vcChargeEmergencyLevel); + this.tabPage3.Controls.Add(this.vcChargeMaxTime); + this.tabPage3.Controls.Add(this.vcChargeRetryTerm); + this.tabPage3.Controls.Add(this.vcChargeSearchTime); + this.tabPage3.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold); + this.tabPage3.Location = new System.Drawing.Point(4, 4); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(1244, 590); + this.tabPage3.TabIndex = 4; + this.tabPage3.Text = "충전"; + // + // cmbChargerPos + // + this.cmbChargerPos.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbChargerPos.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold); + this.cmbChargerPos.FormattingEnabled = true; + this.cmbChargerPos.Items.AddRange(new object[] { + "HOME 아래", + "HOME", + "HOME 위"}); + this.cmbChargerPos.Location = new System.Drawing.Point(1004, 11); + this.cmbChargerPos.Name = "cmbChargerPos"; + this.cmbChargerPos.Size = new System.Drawing.Size(217, 45); + this.cmbChargerPos.TabIndex = 69; + // + // label58 + // + this.label58.AutoSize = true; + this.label58.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label58.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label58.Location = new System.Drawing.Point(863, 21); + this.label58.Name = "label58"; + this.label58.Size = new System.Drawing.Size(135, 24); + this.label58.TabIndex = 68; + this.label58.Text = "충전기위치"; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("궁서체", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label19.ForeColor = System.Drawing.Color.Orange; + this.label19.Location = new System.Drawing.Point(374, 286); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(496, 18); + this.label19.TabIndex = 67; + this.label19.Text = "배터리 레벨이 지정값 아래일 경우 가동이 제한 됩니다"; + // + // label44 + // + this.label44.AutoSize = true; + this.label44.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label44.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label44.Location = new System.Drawing.Point(473, 546); + this.label44.Name = "label44"; + this.label44.Size = new System.Drawing.Size(49, 24); + this.label44.TabIndex = 64; + this.label44.Text = "sec"; + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label29.ForeColor = System.Drawing.Color.SkyBlue; + this.label29.Location = new System.Drawing.Point(51, 546); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(211, 24); + this.label29.TabIndex = 62; + this.label29.Text = "충전기 대기 시간"; + // + // label43 + // + this.label43.AutoSize = true; + this.label43.Font = new System.Drawing.Font("궁서체", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label43.ForeColor = System.Drawing.Color.Orange; + this.label43.Location = new System.Drawing.Point(266, 51); + this.label43.Name = "label43"; + this.label43.Size = new System.Drawing.Size(524, 18); + this.label43.TabIndex = 61; + this.label43.Text = "배터리 레벨이 지정값보다 떨어진다면 충전을 시작 합니다"; + // + // label42 + // + this.label42.AutoSize = true; + this.label42.Font = new System.Drawing.Font("궁서체", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label42.ForeColor = System.Drawing.Color.Orange; + this.label42.Location = new System.Drawing.Point(266, 127); + this.label42.Name = "label42"; + this.label42.Size = new System.Drawing.Size(506, 18); + this.label42.TabIndex = 61; + this.label42.Text = "배터리 레벨이 지정 값을 초과하면 충전이 해제 됩니다."; + // + // label41 + // + this.label41.AutoSize = true; + this.label41.Font = new System.Drawing.Font("궁서체", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label41.ForeColor = System.Drawing.Color.Orange; + this.label41.Location = new System.Drawing.Point(266, 207); + this.label41.Name = "label41"; + this.label41.Size = new System.Drawing.Size(429, 18); + this.label41.TabIndex = 61; + this.label41.Text = "지정된 시간 이후에는 충전이 자동 해제 됩니다"; + // + // label39 + // + this.label39.AutoSize = true; + this.label39.Font = new System.Drawing.Font("궁서체", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label39.ForeColor = System.Drawing.Color.Orange; + this.label39.Location = new System.Drawing.Point(267, 375); + this.label39.Name = "label39"; + this.label39.Size = new System.Drawing.Size(381, 36); + this.label39.TabIndex = 61; + this.label39.Text = "충전기 얼라인 검색을 수행하는 최대 시간\r\n지정 시간이 넘어가면 충전이 취소 됩니다"; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label28.ForeColor = System.Drawing.Color.SkyBlue; + this.label28.Location = new System.Drawing.Point(138, 503); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(124, 24); + this.label28.TabIndex = 29; + this.label28.Text = "충전기 ID"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Font = new System.Drawing.Font("궁서체", 13F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label14.ForeColor = System.Drawing.Color.Orange; + this.label14.Location = new System.Drawing.Point(266, 472); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(496, 18); + this.label14.TabIndex = 61; + this.label14.Text = "배터리 레벨이 지정값 아래일 경우 가동이 제한 됩니다"; + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label33.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label33.Location = new System.Drawing.Point(473, 17); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(23, 24); + this.label33.TabIndex = 50; + this.label33.Text = "%"; + // + // label36 + // + this.label36.AutoSize = true; + this.label36.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label36.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label36.Location = new System.Drawing.Point(76, 17); + this.label36.Name = "label36"; + this.label36.Size = new System.Drawing.Size(186, 24); + this.label36.TabIndex = 49; + this.label36.Text = "충전 시작 레벨"; + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label37.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label37.Location = new System.Drawing.Point(473, 87); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(23, 24); + this.label37.TabIndex = 44; + this.label37.Text = "%"; + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label35.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label35.Location = new System.Drawing.Point(76, 428); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(186, 24); + this.label35.TabIndex = 46; + this.label35.Text = "가동 제한 레벨"; + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label34.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label34.Location = new System.Drawing.Point(473, 428); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(23, 24); + this.label34.TabIndex = 47; + this.label34.Text = "%"; + // + // label38 + // + this.label38.AutoSize = true; + this.label38.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label38.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label38.Location = new System.Drawing.Point(76, 87); + this.label38.Name = "label38"; + this.label38.Size = new System.Drawing.Size(186, 24); + this.label38.TabIndex = 43; + this.label38.Text = "최대 충전 레벨"; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label21.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label21.Location = new System.Drawing.Point(473, 337); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(49, 24); + this.label21.TabIndex = 40; + this.label21.Text = "sec"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label1.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label1.Location = new System.Drawing.Point(473, 245); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(49, 24); + this.label1.TabIndex = 34; + this.label1.Text = "sec"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label9.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label9.Location = new System.Drawing.Point(51, 245); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(211, 24); + this.label9.TabIndex = 33; + this.label9.Text = "충전 재시도 간격"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label26.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label26.Location = new System.Drawing.Point(127, 337); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(135, 24); + this.label26.TabIndex = 39; + this.label26.Text = "충전기검색"; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label23.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label23.Location = new System.Drawing.Point(473, 164); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(49, 24); + this.label23.TabIndex = 31; + this.label23.Text = "sec"; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Font = new System.Drawing.Font("궁서체", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label24.ForeColor = System.Drawing.Color.WhiteSmoke; + this.label24.Location = new System.Drawing.Point(76, 164); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(186, 24); + this.label24.TabIndex = 30; + this.label24.Text = "최대 충전 시간"; + // + // vcChargeStartLevel + // + this.vcChargeStartLevel.BackColorButton = System.Drawing.Color.White; + this.vcChargeStartLevel.ButtonWidth = "30"; + this.vcChargeStartLevel.ColorBorder = System.Drawing.Color.White; + this.vcChargeStartLevel.DecimalPosition = ((ushort)(0)); + this.vcChargeStartLevel.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcChargeStartLevel.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcChargeStartLevel.ForeColor = System.Drawing.Color.WhiteSmoke; + this.vcChargeStartLevel.ForeColorButton = System.Drawing.Color.Black; + this.vcChargeStartLevel.Location = new System.Drawing.Point(270, 11); + this.vcChargeStartLevel.MaxValue = 999999D; + this.vcChargeStartLevel.MinValue = 0D; + this.vcChargeStartLevel.Name = "vcChargeStartLevel"; + this.vcChargeStartLevel.NullDisplay = "--"; + this.vcChargeStartLevel.SideButtonClickValue = 30D; + this.vcChargeStartLevel.Size = new System.Drawing.Size(197, 37); + this.vcChargeStartLevel.TabIndex = 65; + this.vcChargeStartLevel.Tag = "SL"; + this.vcChargeStartLevel.Text = "50"; + this.vcChargeStartLevel.Value = 50D; + this.vcChargeStartLevel.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcChargeStartLevel.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcChargeMaxLevel + // + this.vcChargeMaxLevel.BackColorButton = System.Drawing.Color.White; + this.vcChargeMaxLevel.ButtonWidth = "30"; + this.vcChargeMaxLevel.ColorBorder = System.Drawing.Color.White; + this.vcChargeMaxLevel.DecimalPosition = ((ushort)(0)); + this.vcChargeMaxLevel.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcChargeMaxLevel.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcChargeMaxLevel.ForeColor = System.Drawing.Color.WhiteSmoke; + this.vcChargeMaxLevel.ForeColorButton = System.Drawing.Color.Black; + this.vcChargeMaxLevel.Location = new System.Drawing.Point(270, 81); + this.vcChargeMaxLevel.MaxValue = 999999D; + this.vcChargeMaxLevel.MinValue = 0D; + this.vcChargeMaxLevel.Name = "vcChargeMaxLevel"; + this.vcChargeMaxLevel.NullDisplay = "--"; + this.vcChargeMaxLevel.SideButtonClickValue = 30D; + this.vcChargeMaxLevel.Size = new System.Drawing.Size(197, 37); + this.vcChargeMaxLevel.TabIndex = 66; + this.vcChargeMaxLevel.Tag = "SL"; + this.vcChargeMaxLevel.Text = "85"; + this.vcChargeMaxLevel.Value = 85D; + this.vcChargeMaxLevel.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcChargeMaxLevel.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcChargeWaitSec + // + this.vcChargeWaitSec.BackColorButton = System.Drawing.Color.White; + this.vcChargeWaitSec.ButtonWidth = "30"; + this.vcChargeWaitSec.ColorBorder = System.Drawing.Color.White; + this.vcChargeWaitSec.DecimalPosition = ((ushort)(0)); + this.vcChargeWaitSec.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcChargeWaitSec.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcChargeWaitSec.ForeColor = System.Drawing.Color.WhiteSmoke; + this.vcChargeWaitSec.ForeColorButton = System.Drawing.Color.Black; + this.vcChargeWaitSec.Location = new System.Drawing.Point(270, 540); + this.vcChargeWaitSec.MaxValue = 999999D; + this.vcChargeWaitSec.MinValue = 0D; + this.vcChargeWaitSec.Name = "vcChargeWaitSec"; + this.vcChargeWaitSec.NullDisplay = "--"; + this.vcChargeWaitSec.SideButtonClickValue = 30D; + this.vcChargeWaitSec.Size = new System.Drawing.Size(197, 37); + this.vcChargeWaitSec.TabIndex = 63; + this.vcChargeWaitSec.Tag = ""; + this.vcChargeWaitSec.Text = "3"; + this.vcChargeWaitSec.Value = 3D; + this.vcChargeWaitSec.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcChargeWaitSec.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // tbChargerID + // + this.tbChargerID.BackColorButton = System.Drawing.Color.White; + this.tbChargerID.ButtonWidth = "30"; + this.tbChargerID.ColorBorder = System.Drawing.Color.White; + this.tbChargerID.DecimalPosition = ((ushort)(0)); + this.tbChargerID.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.tbChargerID.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tbChargerID.ForeColor = System.Drawing.Color.WhiteSmoke; + this.tbChargerID.ForeColorButton = System.Drawing.Color.Black; + this.tbChargerID.Location = new System.Drawing.Point(270, 497); + this.tbChargerID.MaxValue = 999999D; + this.tbChargerID.MinValue = 0D; + this.tbChargerID.Name = "tbChargerID"; + this.tbChargerID.NullDisplay = "--"; + this.tbChargerID.SideButtonClickValue = 30D; + this.tbChargerID.Size = new System.Drawing.Size(197, 37); + this.tbChargerID.TabIndex = 57; + this.tbChargerID.Tag = ""; + this.tbChargerID.Text = "30"; + this.tbChargerID.Value = 30D; + this.tbChargerID.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.tbChargerID.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcChargeEmergencyLevel + // + this.vcChargeEmergencyLevel.BackColorButton = System.Drawing.Color.White; + this.vcChargeEmergencyLevel.ButtonWidth = "30"; + this.vcChargeEmergencyLevel.ColorBorder = System.Drawing.Color.White; + this.vcChargeEmergencyLevel.DecimalPosition = ((ushort)(0)); + this.vcChargeEmergencyLevel.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcChargeEmergencyLevel.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcChargeEmergencyLevel.ForeColor = System.Drawing.Color.WhiteSmoke; + this.vcChargeEmergencyLevel.ForeColorButton = System.Drawing.Color.Black; + this.vcChargeEmergencyLevel.Location = new System.Drawing.Point(270, 422); + this.vcChargeEmergencyLevel.MaxValue = 999999D; + this.vcChargeEmergencyLevel.MinValue = 0D; + this.vcChargeEmergencyLevel.Name = "vcChargeEmergencyLevel"; + this.vcChargeEmergencyLevel.NullDisplay = "--"; + this.vcChargeEmergencyLevel.SideButtonClickValue = 30D; + this.vcChargeEmergencyLevel.Size = new System.Drawing.Size(197, 37); + this.vcChargeEmergencyLevel.TabIndex = 57; + this.vcChargeEmergencyLevel.Tag = ""; + this.vcChargeEmergencyLevel.Text = "30"; + this.vcChargeEmergencyLevel.Value = 30D; + this.vcChargeEmergencyLevel.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcChargeEmergencyLevel.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcChargeMaxTime + // + this.vcChargeMaxTime.BackColorButton = System.Drawing.Color.White; + this.vcChargeMaxTime.ButtonWidth = "30"; + this.vcChargeMaxTime.ColorBorder = System.Drawing.Color.White; + this.vcChargeMaxTime.DecimalPosition = ((ushort)(0)); + this.vcChargeMaxTime.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcChargeMaxTime.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcChargeMaxTime.ForeColor = System.Drawing.Color.WhiteSmoke; + this.vcChargeMaxTime.ForeColorButton = System.Drawing.Color.Black; + this.vcChargeMaxTime.Location = new System.Drawing.Point(270, 158); + this.vcChargeMaxTime.MaxValue = 999999D; + this.vcChargeMaxTime.MinValue = 0D; + this.vcChargeMaxTime.Name = "vcChargeMaxTime"; + this.vcChargeMaxTime.NullDisplay = "--"; + this.vcChargeMaxTime.SideButtonClickValue = 30D; + this.vcChargeMaxTime.Size = new System.Drawing.Size(197, 37); + this.vcChargeMaxTime.TabIndex = 29; + this.vcChargeMaxTime.Tag = "SL"; + this.vcChargeMaxTime.Text = "3600"; + this.vcChargeMaxTime.Value = 3600D; + this.vcChargeMaxTime.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcChargeMaxTime.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcChargeRetryTerm + // + this.vcChargeRetryTerm.BackColorButton = System.Drawing.Color.White; + this.vcChargeRetryTerm.ButtonWidth = "30"; + this.vcChargeRetryTerm.ColorBorder = System.Drawing.Color.White; + this.vcChargeRetryTerm.DecimalPosition = ((ushort)(0)); + this.vcChargeRetryTerm.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcChargeRetryTerm.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcChargeRetryTerm.ForeColor = System.Drawing.Color.WhiteSmoke; + this.vcChargeRetryTerm.ForeColorButton = System.Drawing.Color.Black; + this.vcChargeRetryTerm.Location = new System.Drawing.Point(270, 239); + this.vcChargeRetryTerm.MaxValue = 999999D; + this.vcChargeRetryTerm.MinValue = 0D; + this.vcChargeRetryTerm.Name = "vcChargeRetryTerm"; + this.vcChargeRetryTerm.NullDisplay = "--"; + this.vcChargeRetryTerm.SideButtonClickValue = 30D; + this.vcChargeRetryTerm.Size = new System.Drawing.Size(197, 37); + this.vcChargeRetryTerm.TabIndex = 32; + this.vcChargeRetryTerm.Tag = "SL"; + this.vcChargeRetryTerm.Text = "300"; + this.vcChargeRetryTerm.Value = 300D; + this.vcChargeRetryTerm.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + this.vcChargeRetryTerm.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // vcChargeSearchTime + // + this.vcChargeSearchTime.BackColorButton = System.Drawing.Color.White; + this.vcChargeSearchTime.ButtonWidth = "30"; + this.vcChargeSearchTime.ColorBorder = System.Drawing.Color.White; + this.vcChargeSearchTime.DecimalPosition = ((ushort)(0)); + this.vcChargeSearchTime.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.vcChargeSearchTime.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcChargeSearchTime.ForeColor = System.Drawing.Color.WhiteSmoke; + this.vcChargeSearchTime.ForeColorButton = System.Drawing.Color.Black; + this.vcChargeSearchTime.Location = new System.Drawing.Point(270, 331); + this.vcChargeSearchTime.MaxValue = 999999D; + this.vcChargeSearchTime.MinValue = 0D; + this.vcChargeSearchTime.Name = "vcChargeSearchTime"; + this.vcChargeSearchTime.NullDisplay = "--"; + this.vcChargeSearchTime.SideButtonClickValue = 30D; + this.vcChargeSearchTime.Size = new System.Drawing.Size(197, 37); + this.vcChargeSearchTime.TabIndex = 38; + this.vcChargeSearchTime.Tag = "SL"; + this.vcChargeSearchTime.Text = "120"; + this.vcChargeSearchTime.Value = 120D; + this.vcChargeSearchTime.ValueChanged += new System.EventHandler(this.vcChargeLow_ValueChanged); + // + // tabPage5 + // + this.tabPage5.BackColor = System.Drawing.Color.Orange; + this.tabPage5.Controls.Add(this.label54); + this.tabPage5.Controls.Add(this.vcTagF5A); + this.tabPage5.Controls.Add(this.vcTagF5B); + this.tabPage5.Controls.Add(this.vcTagF4F5); + this.tabPage5.Controls.Add(this.vcTagQAA); + this.tabPage5.Controls.Add(this.vcTagQAB); + this.tabPage5.Controls.Add(this.label17); + this.tabPage5.Controls.Add(this.button4); + this.tabPage5.Controls.Add(this.label49); + this.tabPage5.Controls.Add(this.label53); + this.tabPage5.Controls.Add(this.label47); + this.tabPage5.Controls.Add(this.label48); + this.tabPage5.Controls.Add(this.label51); + this.tabPage5.Controls.Add(this.label46); + this.tabPage5.Controls.Add(this.label45); + this.tabPage5.Controls.Add(this.vcTagQAQC); + this.tabPage5.Controls.Add(this.vcTagF3F4); + this.tabPage5.Controls.Add(this.vcTagF2F3); + this.tabPage5.Controls.Add(this.vcTagF1A); + this.tabPage5.Controls.Add(this.vcTagF1B); + this.tabPage5.Controls.Add(this.vcTagF3A); + this.tabPage5.Controls.Add(this.vcTagQCA); + this.tabPage5.Controls.Add(this.vcTagF3B); + this.tabPage5.Controls.Add(this.vcTagF2A); + this.tabPage5.Controls.Add(this.vcTagQCB); + this.tabPage5.Controls.Add(this.vcTagF4A); + this.tabPage5.Controls.Add(this.vcTagF1F2); + this.tabPage5.Controls.Add(this.vcTagF2B); + this.tabPage5.Controls.Add(this.vcTagF4B); + this.tabPage5.Controls.Add(this.vcTagQCF1); + this.tabPage5.Controls.Add(this.vcTagPOT); + this.tabPage5.Controls.Add(this.vcTagNOT); + this.tabPage5.Location = new System.Drawing.Point(4, 4); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.Size = new System.Drawing.Size(1244, 590); + this.tabPage5.TabIndex = 5; + this.tabPage5.Text = "TAG"; + // + // label54 + // + this.label54.AutoSize = true; + this.label54.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label54.ForeColor = System.Drawing.Color.Black; + this.label54.Location = new System.Drawing.Point(220, 535); + this.label54.Name = "label54"; + this.label54.Size = new System.Drawing.Size(102, 27); + this.label54.TabIndex = 80; + this.label54.Text = "FVI #5"; + // + // vcTagF5A + // + this.vcTagF5A.BackColorButton = System.Drawing.Color.White; + this.vcTagF5A.ButtonWidth = "30"; + this.vcTagF5A.ColorBorder = System.Drawing.Color.White; + this.vcTagF5A.DecimalPosition = ((ushort)(0)); + this.vcTagF5A.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF5A.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF5A.ForeColor = System.Drawing.Color.Black; + this.vcTagF5A.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF5A.Location = new System.Drawing.Point(324, 529); + this.vcTagF5A.MaxValue = 99999D; + this.vcTagF5A.MinValue = 0D; + this.vcTagF5A.Name = "vcTagF5A"; + this.vcTagF5A.NullDisplay = "--"; + this.vcTagF5A.SideButtonClickValue = 3D; + this.vcTagF5A.Size = new System.Drawing.Size(197, 37); + this.vcTagF5A.TabIndex = 82; + this.vcTagF5A.Tag = ""; + this.vcTagF5A.Text = "9701"; + this.vcTagF5A.Value = 9701D; + this.vcTagF5A.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF5B + // + this.vcTagF5B.BackColorButton = System.Drawing.Color.White; + this.vcTagF5B.ButtonWidth = "30"; + this.vcTagF5B.ColorBorder = System.Drawing.Color.White; + this.vcTagF5B.DecimalPosition = ((ushort)(0)); + this.vcTagF5B.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF5B.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF5B.ForeColor = System.Drawing.Color.Black; + this.vcTagF5B.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF5B.Location = new System.Drawing.Point(19, 529); + this.vcTagF5B.MaxValue = 99999D; + this.vcTagF5B.MinValue = 0D; + this.vcTagF5B.Name = "vcTagF5B"; + this.vcTagF5B.NullDisplay = "--"; + this.vcTagF5B.SideButtonClickValue = 3D; + this.vcTagF5B.Size = new System.Drawing.Size(197, 37); + this.vcTagF5B.TabIndex = 81; + this.vcTagF5B.Tag = ""; + this.vcTagF5B.Text = "9700"; + this.vcTagF5B.Value = 9700D; + this.vcTagF5B.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF4F5 + // + this.vcTagF4F5.BackColor = System.Drawing.Color.Purple; + this.vcTagF4F5.BackColorButton = System.Drawing.Color.White; + this.vcTagF4F5.ButtonWidth = "30"; + this.vcTagF4F5.ColorBorder = System.Drawing.Color.White; + this.vcTagF4F5.DecimalPosition = ((ushort)(0)); + this.vcTagF4F5.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF4F5.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF4F5.ForeColor = System.Drawing.Color.LightGray; + this.vcTagF4F5.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF4F5.Location = new System.Drawing.Point(19, 485); + this.vcTagF4F5.MaxValue = 99999D; + this.vcTagF4F5.MinValue = 0D; + this.vcTagF4F5.Name = "vcTagF4F5"; + this.vcTagF4F5.NullDisplay = "--"; + this.vcTagF4F5.SideButtonClickValue = 3D; + this.vcTagF4F5.Size = new System.Drawing.Size(502, 37); + this.vcTagF4F5.TabIndex = 79; + this.vcTagF4F5.Tag = ""; + this.vcTagF4F5.Text = "9750"; + this.vcTagF4F5.Value = 9750D; + this.vcTagF4F5.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagQAA + // + this.vcTagQAA.BackColorButton = System.Drawing.Color.White; + this.vcTagQAA.ButtonWidth = "30"; + this.vcTagQAA.ColorBorder = System.Drawing.Color.White; + this.vcTagQAA.DecimalPosition = ((ushort)(0)); + this.vcTagQAA.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagQAA.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagQAA.ForeColor = System.Drawing.Color.Black; + this.vcTagQAA.ForeColorButton = System.Drawing.Color.Black; + this.vcTagQAA.Location = new System.Drawing.Point(324, 21); + this.vcTagQAA.MaxValue = 99999D; + this.vcTagQAA.MinValue = 0D; + this.vcTagQAA.Name = "vcTagQAA"; + this.vcTagQAA.NullDisplay = "--"; + this.vcTagQAA.SideButtonClickValue = 3D; + this.vcTagQAA.Size = new System.Drawing.Size(197, 37); + this.vcTagQAA.TabIndex = 78; + this.vcTagQAA.Tag = ""; + this.vcTagQAA.Text = "9201"; + this.vcTagQAA.Value = 9201D; + this.vcTagQAA.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagQAB + // + this.vcTagQAB.BackColorButton = System.Drawing.Color.White; + this.vcTagQAB.ButtonWidth = "30"; + this.vcTagQAB.ColorBorder = System.Drawing.Color.White; + this.vcTagQAB.DecimalPosition = ((ushort)(0)); + this.vcTagQAB.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagQAB.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagQAB.ForeColor = System.Drawing.Color.Black; + this.vcTagQAB.ForeColorButton = System.Drawing.Color.Black; + this.vcTagQAB.Location = new System.Drawing.Point(19, 21); + this.vcTagQAB.MaxValue = 99999D; + this.vcTagQAB.MinValue = 0D; + this.vcTagQAB.Name = "vcTagQAB"; + this.vcTagQAB.NullDisplay = "--"; + this.vcTagQAB.SideButtonClickValue = 3D; + this.vcTagQAB.Size = new System.Drawing.Size(197, 37); + this.vcTagQAB.TabIndex = 76; + this.vcTagQAB.Tag = ""; + this.vcTagQAB.Text = "9200"; + this.vcTagQAB.Value = 9200D; + this.vcTagQAB.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label17.ForeColor = System.Drawing.Color.Black; + this.label17.Location = new System.Drawing.Point(250, 27); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(42, 27); + this.label17.TabIndex = 75; + this.label17.Text = "QA"; + // + // button4 + // + this.button4.Font = new System.Drawing.Font("맑은 고딕", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.button4.Location = new System.Drawing.Point(1043, 6); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(195, 108); + this.button4.TabIndex = 74; + this.button4.Text = "기본값"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // label49 + // + this.label49.AutoSize = true; + this.label49.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label49.ForeColor = System.Drawing.Color.Black; + this.label49.Location = new System.Drawing.Point(220, 197); + this.label49.Name = "label49"; + this.label49.Size = new System.Drawing.Size(102, 27); + this.label49.TabIndex = 67; + this.label49.Text = "FVI #1"; + // + // label53 + // + this.label53.AutoSize = true; + this.label53.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label53.ForeColor = System.Drawing.Color.Black; + this.label53.Location = new System.Drawing.Point(220, 362); + this.label53.Name = "label53"; + this.label53.Size = new System.Drawing.Size(102, 27); + this.label53.TabIndex = 67; + this.label53.Text = "FVI #3"; + // + // label47 + // + this.label47.AutoSize = true; + this.label47.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label47.ForeColor = System.Drawing.Color.Black; + this.label47.Location = new System.Drawing.Point(250, 113); + this.label47.Name = "label47"; + this.label47.Size = new System.Drawing.Size(42, 27); + this.label47.TabIndex = 67; + this.label47.Text = "QC"; + // + // label48 + // + this.label48.AutoSize = true; + this.label48.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label48.ForeColor = System.Drawing.Color.Black; + this.label48.Location = new System.Drawing.Point(220, 277); + this.label48.Name = "label48"; + this.label48.Size = new System.Drawing.Size(102, 27); + this.label48.TabIndex = 67; + this.label48.Text = "FVI #2"; + // + // label51 + // + this.label51.AutoSize = true; + this.label51.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label51.ForeColor = System.Drawing.Color.Black; + this.label51.Location = new System.Drawing.Point(220, 448); + this.label51.Name = "label51"; + this.label51.Size = new System.Drawing.Size(102, 27); + this.label51.TabIndex = 67; + this.label51.Text = "FVI #4"; + // + // label46 + // + this.label46.AutoSize = true; + this.label46.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label46.ForeColor = System.Drawing.Color.Black; + this.label46.Location = new System.Drawing.Point(760, 65); + this.label46.Name = "label46"; + this.label46.Size = new System.Drawing.Size(57, 27); + this.label46.TabIndex = 61; + this.label46.Text = "POT"; + // + // label45 + // + this.label45.AutoSize = true; + this.label45.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.label45.ForeColor = System.Drawing.Color.Black; + this.label45.Location = new System.Drawing.Point(760, 31); + this.label45.Name = "label45"; + this.label45.Size = new System.Drawing.Size(57, 27); + this.label45.TabIndex = 59; + this.label45.Text = "NOT"; + // + // vcTagQAQC + // + this.vcTagQAQC.BackColor = System.Drawing.Color.Purple; + this.vcTagQAQC.BackColorButton = System.Drawing.Color.White; + this.vcTagQAQC.ButtonWidth = "30"; + this.vcTagQAQC.ColorBorder = System.Drawing.Color.White; + this.vcTagQAQC.DecimalPosition = ((ushort)(0)); + this.vcTagQAQC.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagQAQC.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagQAQC.ForeColor = System.Drawing.Color.LightGray; + this.vcTagQAQC.ForeColorButton = System.Drawing.Color.Black; + this.vcTagQAQC.Location = new System.Drawing.Point(19, 64); + this.vcTagQAQC.MaxValue = 99999D; + this.vcTagQAQC.MinValue = 0D; + this.vcTagQAQC.Name = "vcTagQAQC"; + this.vcTagQAQC.NullDisplay = "--"; + this.vcTagQAQC.SideButtonClickValue = 3D; + this.vcTagQAQC.Size = new System.Drawing.Size(502, 37); + this.vcTagQAQC.TabIndex = 77; + this.vcTagQAQC.Tag = ""; + this.vcTagQAQC.Text = "9250"; + this.vcTagQAQC.Value = 9250D; + this.vcTagQAQC.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF3F4 + // + this.vcTagF3F4.BackColor = System.Drawing.Color.Purple; + this.vcTagF3F4.BackColorButton = System.Drawing.Color.White; + this.vcTagF3F4.ButtonWidth = "30"; + this.vcTagF3F4.ColorBorder = System.Drawing.Color.White; + this.vcTagF3F4.DecimalPosition = ((ushort)(0)); + this.vcTagF3F4.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF3F4.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF3F4.ForeColor = System.Drawing.Color.LightGray; + this.vcTagF3F4.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF3F4.Location = new System.Drawing.Point(19, 399); + this.vcTagF3F4.MaxValue = 99999D; + this.vcTagF3F4.MinValue = 0D; + this.vcTagF3F4.Name = "vcTagF3F4"; + this.vcTagF3F4.NullDisplay = "--"; + this.vcTagF3F4.SideButtonClickValue = 3D; + this.vcTagF3F4.Size = new System.Drawing.Size(502, 37); + this.vcTagF3F4.TabIndex = 73; + this.vcTagF3F4.Tag = ""; + this.vcTagF3F4.Text = "9650"; + this.vcTagF3F4.Value = 9650D; + this.vcTagF3F4.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF2F3 + // + this.vcTagF2F3.BackColor = System.Drawing.Color.Purple; + this.vcTagF2F3.BackColorButton = System.Drawing.Color.White; + this.vcTagF2F3.ButtonWidth = "30"; + this.vcTagF2F3.ColorBorder = System.Drawing.Color.White; + this.vcTagF2F3.DecimalPosition = ((ushort)(0)); + this.vcTagF2F3.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF2F3.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF2F3.ForeColor = System.Drawing.Color.LightGray; + this.vcTagF2F3.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF2F3.Location = new System.Drawing.Point(19, 313); + this.vcTagF2F3.MaxValue = 99999D; + this.vcTagF2F3.MinValue = 0D; + this.vcTagF2F3.Name = "vcTagF2F3"; + this.vcTagF2F3.NullDisplay = "--"; + this.vcTagF2F3.SideButtonClickValue = 3D; + this.vcTagF2F3.Size = new System.Drawing.Size(502, 37); + this.vcTagF2F3.TabIndex = 72; + this.vcTagF2F3.Tag = ""; + this.vcTagF2F3.Text = "9550"; + this.vcTagF2F3.Value = 9550D; + this.vcTagF2F3.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF1A + // + this.vcTagF1A.BackColorButton = System.Drawing.Color.White; + this.vcTagF1A.ButtonWidth = "30"; + this.vcTagF1A.ColorBorder = System.Drawing.Color.White; + this.vcTagF1A.DecimalPosition = ((ushort)(0)); + this.vcTagF1A.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF1A.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF1A.ForeColor = System.Drawing.Color.Black; + this.vcTagF1A.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF1A.Location = new System.Drawing.Point(324, 191); + this.vcTagF1A.MaxValue = 99999D; + this.vcTagF1A.MinValue = 0D; + this.vcTagF1A.Name = "vcTagF1A"; + this.vcTagF1A.NullDisplay = "--"; + this.vcTagF1A.SideButtonClickValue = 3D; + this.vcTagF1A.Size = new System.Drawing.Size(197, 37); + this.vcTagF1A.TabIndex = 70; + this.vcTagF1A.Tag = ""; + this.vcTagF1A.Text = "9401"; + this.vcTagF1A.Value = 9401D; + this.vcTagF1A.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF1B + // + this.vcTagF1B.BackColorButton = System.Drawing.Color.White; + this.vcTagF1B.ButtonWidth = "30"; + this.vcTagF1B.ColorBorder = System.Drawing.Color.White; + this.vcTagF1B.DecimalPosition = ((ushort)(0)); + this.vcTagF1B.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF1B.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF1B.ForeColor = System.Drawing.Color.Black; + this.vcTagF1B.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF1B.Location = new System.Drawing.Point(19, 191); + this.vcTagF1B.MaxValue = 99999D; + this.vcTagF1B.MinValue = 0D; + this.vcTagF1B.Name = "vcTagF1B"; + this.vcTagF1B.NullDisplay = "--"; + this.vcTagF1B.SideButtonClickValue = 3D; + this.vcTagF1B.Size = new System.Drawing.Size(197, 37); + this.vcTagF1B.TabIndex = 68; + this.vcTagF1B.Tag = ""; + this.vcTagF1B.Text = "9400"; + this.vcTagF1B.Value = 9400D; + this.vcTagF1B.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF3A + // + this.vcTagF3A.BackColorButton = System.Drawing.Color.White; + this.vcTagF3A.ButtonWidth = "30"; + this.vcTagF3A.ColorBorder = System.Drawing.Color.White; + this.vcTagF3A.DecimalPosition = ((ushort)(0)); + this.vcTagF3A.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF3A.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF3A.ForeColor = System.Drawing.Color.Black; + this.vcTagF3A.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF3A.Location = new System.Drawing.Point(324, 356); + this.vcTagF3A.MaxValue = 99999D; + this.vcTagF3A.MinValue = 0D; + this.vcTagF3A.Name = "vcTagF3A"; + this.vcTagF3A.NullDisplay = "--"; + this.vcTagF3A.SideButtonClickValue = 3D; + this.vcTagF3A.Size = new System.Drawing.Size(197, 37); + this.vcTagF3A.TabIndex = 70; + this.vcTagF3A.Tag = ""; + this.vcTagF3A.Text = "9601"; + this.vcTagF3A.Value = 9601D; + this.vcTagF3A.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagQCA + // + this.vcTagQCA.BackColorButton = System.Drawing.Color.White; + this.vcTagQCA.ButtonWidth = "30"; + this.vcTagQCA.ColorBorder = System.Drawing.Color.White; + this.vcTagQCA.DecimalPosition = ((ushort)(0)); + this.vcTagQCA.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagQCA.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagQCA.ForeColor = System.Drawing.Color.Black; + this.vcTagQCA.ForeColorButton = System.Drawing.Color.Black; + this.vcTagQCA.Location = new System.Drawing.Point(324, 107); + this.vcTagQCA.MaxValue = 99999D; + this.vcTagQCA.MinValue = 0D; + this.vcTagQCA.Name = "vcTagQCA"; + this.vcTagQCA.NullDisplay = "--"; + this.vcTagQCA.SideButtonClickValue = 3D; + this.vcTagQCA.Size = new System.Drawing.Size(197, 37); + this.vcTagQCA.TabIndex = 70; + this.vcTagQCA.Tag = ""; + this.vcTagQCA.Text = "9301"; + this.vcTagQCA.Value = 9301D; + this.vcTagQCA.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF3B + // + this.vcTagF3B.BackColorButton = System.Drawing.Color.White; + this.vcTagF3B.ButtonWidth = "30"; + this.vcTagF3B.ColorBorder = System.Drawing.Color.White; + this.vcTagF3B.DecimalPosition = ((ushort)(0)); + this.vcTagF3B.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF3B.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF3B.ForeColor = System.Drawing.Color.Black; + this.vcTagF3B.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF3B.Location = new System.Drawing.Point(19, 356); + this.vcTagF3B.MaxValue = 99999D; + this.vcTagF3B.MinValue = 0D; + this.vcTagF3B.Name = "vcTagF3B"; + this.vcTagF3B.NullDisplay = "--"; + this.vcTagF3B.SideButtonClickValue = 3D; + this.vcTagF3B.Size = new System.Drawing.Size(197, 37); + this.vcTagF3B.TabIndex = 68; + this.vcTagF3B.Tag = ""; + this.vcTagF3B.Text = "9600"; + this.vcTagF3B.Value = 9600D; + this.vcTagF3B.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF2A + // + this.vcTagF2A.BackColorButton = System.Drawing.Color.White; + this.vcTagF2A.ButtonWidth = "30"; + this.vcTagF2A.ColorBorder = System.Drawing.Color.White; + this.vcTagF2A.DecimalPosition = ((ushort)(0)); + this.vcTagF2A.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF2A.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF2A.ForeColor = System.Drawing.Color.Black; + this.vcTagF2A.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF2A.Location = new System.Drawing.Point(324, 271); + this.vcTagF2A.MaxValue = 99999D; + this.vcTagF2A.MinValue = 0D; + this.vcTagF2A.Name = "vcTagF2A"; + this.vcTagF2A.NullDisplay = "--"; + this.vcTagF2A.SideButtonClickValue = 3D; + this.vcTagF2A.Size = new System.Drawing.Size(197, 37); + this.vcTagF2A.TabIndex = 70; + this.vcTagF2A.Tag = ""; + this.vcTagF2A.Text = "9501"; + this.vcTagF2A.Value = 9501D; + this.vcTagF2A.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagQCB + // + this.vcTagQCB.BackColorButton = System.Drawing.Color.White; + this.vcTagQCB.ButtonWidth = "30"; + this.vcTagQCB.ColorBorder = System.Drawing.Color.White; + this.vcTagQCB.DecimalPosition = ((ushort)(0)); + this.vcTagQCB.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagQCB.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagQCB.ForeColor = System.Drawing.Color.Black; + this.vcTagQCB.ForeColorButton = System.Drawing.Color.Black; + this.vcTagQCB.Location = new System.Drawing.Point(19, 107); + this.vcTagQCB.MaxValue = 99999D; + this.vcTagQCB.MinValue = 0D; + this.vcTagQCB.Name = "vcTagQCB"; + this.vcTagQCB.NullDisplay = "--"; + this.vcTagQCB.SideButtonClickValue = 3D; + this.vcTagQCB.Size = new System.Drawing.Size(197, 37); + this.vcTagQCB.TabIndex = 68; + this.vcTagQCB.Tag = ""; + this.vcTagQCB.Text = "9300"; + this.vcTagQCB.Value = 9300D; + this.vcTagQCB.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF4A + // + this.vcTagF4A.BackColorButton = System.Drawing.Color.White; + this.vcTagF4A.ButtonWidth = "30"; + this.vcTagF4A.ColorBorder = System.Drawing.Color.White; + this.vcTagF4A.DecimalPosition = ((ushort)(0)); + this.vcTagF4A.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF4A.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF4A.ForeColor = System.Drawing.Color.Black; + this.vcTagF4A.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF4A.Location = new System.Drawing.Point(324, 442); + this.vcTagF4A.MaxValue = 99999D; + this.vcTagF4A.MinValue = 0D; + this.vcTagF4A.Name = "vcTagF4A"; + this.vcTagF4A.NullDisplay = "--"; + this.vcTagF4A.SideButtonClickValue = 3D; + this.vcTagF4A.Size = new System.Drawing.Size(197, 37); + this.vcTagF4A.TabIndex = 70; + this.vcTagF4A.Tag = ""; + this.vcTagF4A.Text = "9701"; + this.vcTagF4A.Value = 9701D; + this.vcTagF4A.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF1F2 + // + this.vcTagF1F2.BackColor = System.Drawing.Color.Purple; + this.vcTagF1F2.BackColorButton = System.Drawing.Color.White; + this.vcTagF1F2.ButtonWidth = "30"; + this.vcTagF1F2.ColorBorder = System.Drawing.Color.White; + this.vcTagF1F2.DecimalPosition = ((ushort)(0)); + this.vcTagF1F2.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF1F2.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF1F2.ForeColor = System.Drawing.Color.LightGray; + this.vcTagF1F2.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF1F2.Location = new System.Drawing.Point(19, 231); + this.vcTagF1F2.MaxValue = 99999D; + this.vcTagF1F2.MinValue = 0D; + this.vcTagF1F2.Name = "vcTagF1F2"; + this.vcTagF1F2.NullDisplay = "--"; + this.vcTagF1F2.SideButtonClickValue = 3D; + this.vcTagF1F2.Size = new System.Drawing.Size(502, 37); + this.vcTagF1F2.TabIndex = 70; + this.vcTagF1F2.Tag = ""; + this.vcTagF1F2.Text = "9450"; + this.vcTagF1F2.Value = 9450D; + this.vcTagF1F2.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF2B + // + this.vcTagF2B.BackColorButton = System.Drawing.Color.White; + this.vcTagF2B.ButtonWidth = "30"; + this.vcTagF2B.ColorBorder = System.Drawing.Color.White; + this.vcTagF2B.DecimalPosition = ((ushort)(0)); + this.vcTagF2B.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF2B.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF2B.ForeColor = System.Drawing.Color.Black; + this.vcTagF2B.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF2B.Location = new System.Drawing.Point(19, 271); + this.vcTagF2B.MaxValue = 99999D; + this.vcTagF2B.MinValue = 0D; + this.vcTagF2B.Name = "vcTagF2B"; + this.vcTagF2B.NullDisplay = "--"; + this.vcTagF2B.SideButtonClickValue = 3D; + this.vcTagF2B.Size = new System.Drawing.Size(197, 37); + this.vcTagF2B.TabIndex = 68; + this.vcTagF2B.Tag = ""; + this.vcTagF2B.Text = "9500"; + this.vcTagF2B.Value = 9500D; + this.vcTagF2B.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagF4B + // + this.vcTagF4B.BackColorButton = System.Drawing.Color.White; + this.vcTagF4B.ButtonWidth = "30"; + this.vcTagF4B.ColorBorder = System.Drawing.Color.White; + this.vcTagF4B.DecimalPosition = ((ushort)(0)); + this.vcTagF4B.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagF4B.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagF4B.ForeColor = System.Drawing.Color.Black; + this.vcTagF4B.ForeColorButton = System.Drawing.Color.Black; + this.vcTagF4B.Location = new System.Drawing.Point(19, 442); + this.vcTagF4B.MaxValue = 99999D; + this.vcTagF4B.MinValue = 0D; + this.vcTagF4B.Name = "vcTagF4B"; + this.vcTagF4B.NullDisplay = "--"; + this.vcTagF4B.SideButtonClickValue = 3D; + this.vcTagF4B.Size = new System.Drawing.Size(197, 37); + this.vcTagF4B.TabIndex = 68; + this.vcTagF4B.Tag = ""; + this.vcTagF4B.Text = "9700"; + this.vcTagF4B.Value = 9700D; + this.vcTagF4B.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagQCF1 + // + this.vcTagQCF1.BackColor = System.Drawing.Color.Purple; + this.vcTagQCF1.BackColorButton = System.Drawing.Color.White; + this.vcTagQCF1.ButtonWidth = "30"; + this.vcTagQCF1.ColorBorder = System.Drawing.Color.White; + this.vcTagQCF1.DecimalPosition = ((ushort)(0)); + this.vcTagQCF1.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagQCF1.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagQCF1.ForeColor = System.Drawing.Color.LightGray; + this.vcTagQCF1.ForeColorButton = System.Drawing.Color.Black; + this.vcTagQCF1.Location = new System.Drawing.Point(19, 150); + this.vcTagQCF1.MaxValue = 99999D; + this.vcTagQCF1.MinValue = 0D; + this.vcTagQCF1.Name = "vcTagQCF1"; + this.vcTagQCF1.NullDisplay = "--"; + this.vcTagQCF1.SideButtonClickValue = 3D; + this.vcTagQCF1.Size = new System.Drawing.Size(502, 37); + this.vcTagQCF1.TabIndex = 68; + this.vcTagQCF1.Tag = ""; + this.vcTagQCF1.Text = "9350"; + this.vcTagQCF1.Value = 9350D; + this.vcTagQCF1.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagPOT + // + this.vcTagPOT.BackColor = System.Drawing.Color.Tomato; + this.vcTagPOT.BackColorButton = System.Drawing.Color.White; + this.vcTagPOT.ButtonWidth = "30"; + this.vcTagPOT.ColorBorder = System.Drawing.Color.White; + this.vcTagPOT.DecimalPosition = ((ushort)(0)); + this.vcTagPOT.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagPOT.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagPOT.ForeColor = System.Drawing.Color.Black; + this.vcTagPOT.ForeColorButton = System.Drawing.Color.Black; + this.vcTagPOT.Location = new System.Drawing.Point(549, 64); + this.vcTagPOT.MaxValue = 99999D; + this.vcTagPOT.MinValue = 0D; + this.vcTagPOT.Name = "vcTagPOT"; + this.vcTagPOT.NullDisplay = "--"; + this.vcTagPOT.SideButtonClickValue = 3D; + this.vcTagPOT.Size = new System.Drawing.Size(197, 37); + this.vcTagPOT.TabIndex = 62; + this.vcTagPOT.Tag = ""; + this.vcTagPOT.Text = "9900"; + this.vcTagPOT.Value = 9900D; + this.vcTagPOT.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // vcTagNOT + // + this.vcTagNOT.BackColor = System.Drawing.Color.Tomato; + this.vcTagNOT.BackColorButton = System.Drawing.Color.White; + this.vcTagNOT.ButtonWidth = "30"; + this.vcTagNOT.ColorBorder = System.Drawing.Color.White; + this.vcTagNOT.DecimalPosition = ((ushort)(0)); + this.vcTagNOT.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.vcTagNOT.FontSideButton = new System.Drawing.Font("Consolas", 15F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.vcTagNOT.ForeColor = System.Drawing.Color.Black; + this.vcTagNOT.ForeColorButton = System.Drawing.Color.Black; + this.vcTagNOT.Location = new System.Drawing.Point(549, 21); + this.vcTagNOT.MaxValue = 99999D; + this.vcTagNOT.MinValue = 0D; + this.vcTagNOT.Name = "vcTagNOT"; + this.vcTagNOT.NullDisplay = "--"; + this.vcTagNOT.SideButtonClickValue = 3D; + this.vcTagNOT.Size = new System.Drawing.Size(197, 37); + this.vcTagNOT.TabIndex = 60; + this.vcTagNOT.Tag = ""; + this.vcTagNOT.Text = "9000"; + this.vcTagNOT.Value = 9000D; + this.vcTagNOT.ButtonClick += new System.EventHandler(this.vcChargeLow_ButtonClick); + // + // tabPage4 + // + this.tabPage4.Controls.Add(this.groupBox3); + this.tabPage4.Controls.Add(this.panel6); + this.tabPage4.Location = new System.Drawing.Point(4, 4); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Padding = new System.Windows.Forms.Padding(0, 5, 0, 2); + this.tabPage4.Size = new System.Drawing.Size(1244, 590); + this.tabPage4.TabIndex = 3; + this.tabPage4.Text = "Advance"; + this.tabPage4.UseVisualStyleBackColor = true; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.chkClearPos); + this.groupBox3.Controls.Add(this.propertyGrid1); + this.groupBox3.Controls.Add(this.groupBox1); + this.groupBox3.Controls.Add(this.chkDetectManualCharge); + this.groupBox3.Controls.Add(this.chkAGVDirBack); + this.groupBox3.Controls.Add(this.chkFullScreen); + this.groupBox3.Controls.Add(this.nudMusicVol); + this.groupBox3.Controls.Add(this.label22); + this.groupBox3.Controls.Add(this.linkLabel5); + this.groupBox3.Controls.Add(this.linkLabel4); + this.groupBox3.Controls.Add(this.linkLabel3); + this.groupBox3.Controls.Add(this.tbMusic); + this.groupBox3.Controls.Add(this.label16); + this.groupBox3.Controls.Add(this.nudDoorSoundTerm); + this.groupBox3.Controls.Add(this.label3); + this.groupBox3.Controls.Add(this.groupBox4); + this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox3.Location = new System.Drawing.Point(5, 5); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(1239, 583); + this.groupBox3.TabIndex = 32; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "일반 설정"; + // + // propertyGrid1 + // + this.propertyGrid1.Font = new System.Drawing.Font("맑은 고딕", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.propertyGrid1.Location = new System.Drawing.Point(678, 109); + this.propertyGrid1.Name = "propertyGrid1"; + this.propertyGrid1.Size = new System.Drawing.Size(538, 448); + this.propertyGrid1.TabIndex = 11; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.tbMCID); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Location = new System.Drawing.Point(333, 119); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(324, 113); + this.groupBox1.TabIndex = 10; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "EE Monitoring"; + // + // tbMCID + // + this.tbMCID.Location = new System.Drawing.Point(79, 38); + this.tbMCID.Name = "tbMCID"; + this.tbMCID.Size = new System.Drawing.Size(196, 21); + this.tbMCID.TabIndex = 4; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(16, 41); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(36, 12); + this.label4.TabIndex = 6; + this.label4.Text = "MCID"; + // + // chkDetectManualCharge + // + this.chkDetectManualCharge.AutoSize = true; + this.chkDetectManualCharge.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.chkDetectManualCharge.Location = new System.Drawing.Point(678, 72); + this.chkDetectManualCharge.Name = "chkDetectManualCharge"; + this.chkDetectManualCharge.Size = new System.Drawing.Size(235, 31); + this.chkDetectManualCharge.TabIndex = 9; + this.chkDetectManualCharge.Text = "수동 충전 감지"; + this.chkDetectManualCharge.UseVisualStyleBackColor = true; + // + // chkAGVDirBack + // + this.chkAGVDirBack.AutoSize = true; + this.chkAGVDirBack.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.chkAGVDirBack.ForeColor = System.Drawing.Color.Red; + this.chkAGVDirBack.Location = new System.Drawing.Point(27, 72); + this.chkAGVDirBack.Name = "chkAGVDirBack"; + this.chkAGVDirBack.Size = new System.Drawing.Size(619, 31); + this.chkAGVDirBack.TabIndex = 8; + this.chkAGVDirBack.Text = "FVI 이동시 Backward 방향으로 이동 합니다"; + this.chkAGVDirBack.UseVisualStyleBackColor = true; + // + // chkFullScreen + // + this.chkFullScreen.AutoSize = true; + this.chkFullScreen.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.chkFullScreen.Location = new System.Drawing.Point(27, 30); + this.chkFullScreen.Name = "chkFullScreen"; + this.chkFullScreen.Size = new System.Drawing.Size(453, 31); + this.chkFullScreen.TabIndex = 3; + this.chkFullScreen.Text = "프로그램 시작시 전체화면 사용"; + this.chkFullScreen.UseVisualStyleBackColor = true; + // + // nudMusicVol + // + this.nudMusicVol.Font = new System.Drawing.Font("맑은 고딕", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.nudMusicVol.Location = new System.Drawing.Point(179, 309); + this.nudMusicVol.Name = "nudMusicVol"; + this.nudMusicVol.Size = new System.Drawing.Size(102, 35); + this.nudMusicVol.TabIndex = 7; + this.nudMusicVol.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(109, 326); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(57, 12); + this.label22.TabIndex = 6; + this.label22.Text = "음악 볼륨"; + // + // linkLabel5 + // + this.linkLabel5.AutoSize = true; + this.linkLabel5.Location = new System.Drawing.Point(387, 302); + this.linkLabel5.Name = "linkLabel5"; + this.linkLabel5.Size = new System.Drawing.Size(29, 12); + this.linkLabel5.TabIndex = 5; + this.linkLabel5.TabStop = true; + this.linkLabel5.Text = "멈춤"; + this.linkLabel5.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel5_LinkClicked); + // + // linkLabel4 + // + this.linkLabel4.AutoSize = true; + this.linkLabel4.Location = new System.Drawing.Point(387, 282); + this.linkLabel4.Name = "linkLabel4"; + this.linkLabel4.Size = new System.Drawing.Size(29, 12); + this.linkLabel4.TabIndex = 5; + this.linkLabel4.TabStop = true; + this.linkLabel4.Text = "재생"; + this.linkLabel4.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel4_LinkClicked); + // + // linkLabel3 + // + this.linkLabel3.AutoSize = true; + this.linkLabel3.Location = new System.Drawing.Point(43, 292); + this.linkLabel3.Name = "linkLabel3"; + this.linkLabel3.Size = new System.Drawing.Size(65, 12); + this.linkLabel3.TabIndex = 5; + this.linkLabel3.TabStop = true; + this.linkLabel3.Text = "이동시음악"; + this.linkLabel3.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel3_LinkClicked); + // + // tbMusic + // + this.tbMusic.Location = new System.Drawing.Point(114, 282); + this.tbMusic.Name = "tbMusic"; + this.tbMusic.Size = new System.Drawing.Size(267, 21); + this.tbMusic.TabIndex = 4; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(288, 244); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(17, 12); + this.label16.TabIndex = 3; + this.label16.Text = "초"; + // + // nudDoorSoundTerm + // + this.nudDoorSoundTerm.Font = new System.Drawing.Font("맑은 고딕", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.nudDoorSoundTerm.Location = new System.Drawing.Point(181, 227); + this.nudDoorSoundTerm.Name = "nudDoorSoundTerm"; + this.nudDoorSoundTerm.Size = new System.Drawing.Size(102, 35); + this.nudDoorSoundTerm.TabIndex = 2; + this.nudDoorSoundTerm.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(43, 240); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(131, 12); + this.label3.TabIndex = 1; + this.label3.Text = "도어 업/다운 알림 간격"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.cleartime2); + this.groupBox4.Controls.Add(this.cleartime1); + this.groupBox4.Controls.Add(this.chkClear2); + this.groupBox4.Controls.Add(this.chkClear1); + this.groupBox4.Location = new System.Drawing.Point(27, 119); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(236, 88); + this.groupBox4.TabIndex = 0; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Count Reset"; + // + // cleartime2 + // + this.cleartime2.CustomFormat = "HH:mm"; + this.cleartime2.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.cleartime2.Location = new System.Drawing.Point(145, 59); + this.cleartime2.Name = "cleartime2"; + this.cleartime2.Size = new System.Drawing.Size(76, 21); + this.cleartime2.TabIndex = 2; + // + // cleartime1 + // + this.cleartime1.CustomFormat = "HH:mm"; + this.cleartime1.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.cleartime1.Location = new System.Drawing.Point(145, 27); + this.cleartime1.Name = "cleartime1"; + this.cleartime1.Size = new System.Drawing.Size(76, 21); + this.cleartime1.TabIndex = 2; + // + // chkClear2 + // + this.chkClear2.AutoSize = true; + this.chkClear2.Location = new System.Drawing.Point(23, 61); + this.chkClear2.Name = "chkClear2"; + this.chkClear2.Size = new System.Drawing.Size(116, 16); + this.chkClear2.TabIndex = 1; + this.chkClear2.Text = "오후 시간 초기화"; + this.chkClear2.UseVisualStyleBackColor = true; + // + // chkClear1 + // + this.chkClear1.AutoSize = true; + this.chkClear1.Location = new System.Drawing.Point(23, 29); + this.chkClear1.Name = "chkClear1"; + this.chkClear1.Size = new System.Drawing.Size(116, 16); + this.chkClear1.TabIndex = 0; + this.chkClear1.Text = "오전 시간 초기화"; + this.chkClear1.UseVisualStyleBackColor = true; + // + // panel6 + // + this.panel6.Dock = System.Windows.Forms.DockStyle.Left; + this.panel6.Location = new System.Drawing.Point(0, 5); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(5, 583); + this.panel6.TabIndex = 30; + // + // panTopMenu + // + this.panTopMenu.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.panTopMenu.Controls.Add(this.label10); + this.panTopMenu.Controls.Add(this.btClose); + this.panTopMenu.Controls.Add(this.pictureBox1); + this.panTopMenu.Dock = System.Windows.Forms.DockStyle.Top; + this.panTopMenu.Location = new System.Drawing.Point(5, 5); + this.panTopMenu.Name = "panTopMenu"; + this.panTopMenu.Size = new System.Drawing.Size(1270, 50); + this.panTopMenu.TabIndex = 135; + // + // label10 + // + this.label10.Dock = System.Windows.Forms.DockStyle.Left; + this.label10.Font = new System.Drawing.Font("맑은 고딕", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.label10.ForeColor = System.Drawing.Color.LightGray; + this.label10.Location = new System.Drawing.Point(49, 0); + this.label10.Name = "label10"; + this.label10.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.label10.Size = new System.Drawing.Size(236, 50); + this.label10.TabIndex = 8; + this.label10.Text = "환경 설정"; + this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // btClose + // + this.btClose.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btClose.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.btClose.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btClose.BackgroundImage"))); + this.btClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.btClose.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btClose.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.btClose.BorderColorOver = System.Drawing.Color.SkyBlue; + this.btClose.BorderSize = new System.Windows.Forms.Padding(0, 0, 0, 4); + this.btClose.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btClose.Cursor = System.Windows.Forms.Cursors.Hand; + this.btClose.Dock = System.Windows.Forms.DockStyle.Right; + this.btClose.Font = new System.Drawing.Font("맑은 고딕", 12F); + this.btClose.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); + this.btClose.GradientEnable = false; + this.btClose.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btClose.GradientRepeatBG = false; + this.btClose.isButton = true; + this.btClose.Location = new System.Drawing.Point(1220, 0); + this.btClose.Margin = new System.Windows.Forms.Padding(0); + this.btClose.MouseDownColor = System.Drawing.Color.Yellow; + this.btClose.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btClose.msg = null; + this.btClose.Name = "btClose"; + this.btClose.ProgressBorderColor = System.Drawing.Color.Black; + this.btClose.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btClose.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btClose.ProgressEnable = false; + this.btClose.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btClose.ProgressForeColor = System.Drawing.Color.Black; + this.btClose.ProgressMax = 100F; + this.btClose.ProgressMin = 0F; + this.btClose.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btClose.ProgressValue = 0F; + this.btClose.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btClose.Sign = ""; + this.btClose.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btClose.SignColor = System.Drawing.Color.Yellow; + this.btClose.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btClose.Size = new System.Drawing.Size(50, 50); + this.btClose.TabIndex = 7; + this.btClose.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btClose.TextShadow = true; + this.btClose.TextVisible = true; + this.btClose.Click += new System.EventHandler(this.btClose_Click); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left; + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(0, 0); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(49, 50); + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // timer1 + // + this.timer1.Interval = 200; + // + // label8 + // + this.label8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(40)))), ((int)(((byte)(40))))); + this.label8.Dock = System.Windows.Forms.DockStyle.Top; + this.label8.ForeColor = System.Drawing.Color.White; + this.label8.Location = new System.Drawing.Point(5, 55); + this.label8.Name = "label8"; + this.label8.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.label8.Size = new System.Drawing.Size(1270, 23); + this.label8.TabIndex = 136; + this.label8.Text = "label8"; + this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panel2 + // + this.panel2.Controls.Add(this.bt5); + this.panel2.Controls.Add(this.bt4); + this.panel2.Controls.Add(this.bt3); + this.panel2.Controls.Add(this.bt2); + this.panel2.Controls.Add(this.bt1); + this.panel2.Controls.Add(this.bt0); + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(5, 78); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(1270, 64); + this.panel2.TabIndex = 137; + // + // bt5 + // + this.bt5.BackColor = System.Drawing.Color.DimGray; + this.bt5.BackColor2 = System.Drawing.Color.Gray; + this.bt5.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.bt5.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.bt5.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.bt5.BorderSize = new System.Windows.Forms.Padding(2); + this.bt5.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.bt5.Cursor = System.Windows.Forms.Cursors.Hand; + this.bt5.Dock = System.Windows.Forms.DockStyle.Left; + this.bt5.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.bt5.ForeColor = System.Drawing.Color.White; + this.bt5.GradientEnable = true; + this.bt5.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.bt5.GradientRepeatBG = false; + this.bt5.isButton = true; + this.bt5.Location = new System.Drawing.Point(765, 0); + this.bt5.MouseDownColor = System.Drawing.Color.Yellow; + this.bt5.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.bt5.msg = null; + this.bt5.Name = "bt5"; + this.bt5.ProgressBorderColor = System.Drawing.Color.Black; + this.bt5.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.bt5.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.bt5.ProgressEnable = false; + this.bt5.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.bt5.ProgressForeColor = System.Drawing.Color.Black; + this.bt5.ProgressMax = 100F; + this.bt5.ProgressMin = 0F; + this.bt5.ProgressPadding = new System.Windows.Forms.Padding(0); + this.bt5.ProgressValue = 0F; + this.bt5.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.bt5.Sign = ""; + this.bt5.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.bt5.SignColor = System.Drawing.Color.Yellow; + this.bt5.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.bt5.Size = new System.Drawing.Size(153, 64); + this.bt5.TabIndex = 29; + this.bt5.Tag = "5"; + this.bt5.Text = "상세"; + this.bt5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.bt5.TextShadow = true; + this.bt5.TextVisible = true; + this.bt5.Click += new System.EventHandler(this.arLabel1_Click); + // + // bt4 + // + this.bt4.BackColor = System.Drawing.Color.DimGray; + this.bt4.BackColor2 = System.Drawing.Color.Gray; + this.bt4.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.bt4.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.bt4.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.bt4.BorderSize = new System.Windows.Forms.Padding(2); + this.bt4.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.bt4.Cursor = System.Windows.Forms.Cursors.Hand; + this.bt4.Dock = System.Windows.Forms.DockStyle.Left; + this.bt4.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.bt4.ForeColor = System.Drawing.Color.White; + this.bt4.GradientEnable = true; + this.bt4.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.bt4.GradientRepeatBG = false; + this.bt4.isButton = true; + this.bt4.Location = new System.Drawing.Point(612, 0); + this.bt4.MouseDownColor = System.Drawing.Color.Yellow; + this.bt4.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.bt4.msg = null; + this.bt4.Name = "bt4"; + this.bt4.ProgressBorderColor = System.Drawing.Color.Black; + this.bt4.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.bt4.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.bt4.ProgressEnable = false; + this.bt4.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.bt4.ProgressForeColor = System.Drawing.Color.Black; + this.bt4.ProgressMax = 100F; + this.bt4.ProgressMin = 0F; + this.bt4.ProgressPadding = new System.Windows.Forms.Padding(0); + this.bt4.ProgressValue = 0F; + this.bt4.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.bt4.Sign = ""; + this.bt4.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.bt4.SignColor = System.Drawing.Color.Yellow; + this.bt4.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.bt4.Size = new System.Drawing.Size(153, 64); + this.bt4.TabIndex = 28; + this.bt4.Tag = "4"; + this.bt4.Text = "TAG"; + this.bt4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.bt4.TextShadow = true; + this.bt4.TextVisible = true; + this.bt4.Click += new System.EventHandler(this.arLabel1_Click); + // + // bt3 + // + this.bt3.BackColor = System.Drawing.Color.DimGray; + this.bt3.BackColor2 = System.Drawing.Color.Gray; + this.bt3.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.bt3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.bt3.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.bt3.BorderSize = new System.Windows.Forms.Padding(2); + this.bt3.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.bt3.Cursor = System.Windows.Forms.Cursors.Hand; + this.bt3.Dock = System.Windows.Forms.DockStyle.Left; + this.bt3.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.bt3.ForeColor = System.Drawing.Color.White; + this.bt3.GradientEnable = true; + this.bt3.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.bt3.GradientRepeatBG = false; + this.bt3.isButton = true; + this.bt3.Location = new System.Drawing.Point(459, 0); + this.bt3.MouseDownColor = System.Drawing.Color.Yellow; + this.bt3.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.bt3.msg = null; + this.bt3.Name = "bt3"; + this.bt3.ProgressBorderColor = System.Drawing.Color.Black; + this.bt3.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.bt3.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.bt3.ProgressEnable = false; + this.bt3.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.bt3.ProgressForeColor = System.Drawing.Color.Black; + this.bt3.ProgressMax = 100F; + this.bt3.ProgressMin = 0F; + this.bt3.ProgressPadding = new System.Windows.Forms.Padding(0); + this.bt3.ProgressValue = 0F; + this.bt3.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.bt3.Sign = ""; + this.bt3.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.bt3.SignColor = System.Drawing.Color.Yellow; + this.bt3.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.bt3.Size = new System.Drawing.Size(153, 64); + this.bt3.TabIndex = 27; + this.bt3.Tag = "3"; + this.bt3.Text = "충전"; + this.bt3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.bt3.TextShadow = true; + this.bt3.TextVisible = true; + this.bt3.Click += new System.EventHandler(this.arLabel1_Click); + // + // bt2 + // + this.bt2.BackColor = System.Drawing.Color.DimGray; + this.bt2.BackColor2 = System.Drawing.Color.Gray; + this.bt2.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.bt2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.bt2.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.bt2.BorderSize = new System.Windows.Forms.Padding(2); + this.bt2.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.bt2.Cursor = System.Windows.Forms.Cursors.Hand; + this.bt2.Dock = System.Windows.Forms.DockStyle.Left; + this.bt2.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.bt2.ForeColor = System.Drawing.Color.White; + this.bt2.GradientEnable = true; + this.bt2.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.bt2.GradientRepeatBG = false; + this.bt2.isButton = true; + this.bt2.Location = new System.Drawing.Point(306, 0); + this.bt2.MouseDownColor = System.Drawing.Color.Yellow; + this.bt2.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.bt2.msg = null; + this.bt2.Name = "bt2"; + this.bt2.ProgressBorderColor = System.Drawing.Color.Black; + this.bt2.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.bt2.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.bt2.ProgressEnable = false; + this.bt2.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.bt2.ProgressForeColor = System.Drawing.Color.Black; + this.bt2.ProgressMax = 100F; + this.bt2.ProgressMin = 0F; + this.bt2.ProgressPadding = new System.Windows.Forms.Padding(0); + this.bt2.ProgressValue = 0F; + this.bt2.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.bt2.Sign = ""; + this.bt2.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.bt2.SignColor = System.Drawing.Color.Yellow; + this.bt2.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.bt2.Size = new System.Drawing.Size(153, 64); + this.bt2.TabIndex = 26; + this.bt2.Tag = "2"; + this.bt2.Text = "통신"; + this.bt2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.bt2.TextShadow = true; + this.bt2.TextVisible = true; + this.bt2.Click += new System.EventHandler(this.arLabel1_Click); + // + // bt1 + // + this.bt1.BackColor = System.Drawing.Color.DimGray; + this.bt1.BackColor2 = System.Drawing.Color.Gray; + this.bt1.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.bt1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.bt1.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.bt1.BorderSize = new System.Windows.Forms.Padding(2); + this.bt1.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.bt1.Cursor = System.Windows.Forms.Cursors.Hand; + this.bt1.Dock = System.Windows.Forms.DockStyle.Left; + this.bt1.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.bt1.ForeColor = System.Drawing.Color.White; + this.bt1.GradientEnable = true; + this.bt1.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.bt1.GradientRepeatBG = false; + this.bt1.isButton = true; + this.bt1.Location = new System.Drawing.Point(153, 0); + this.bt1.MouseDownColor = System.Drawing.Color.Yellow; + this.bt1.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.bt1.msg = null; + this.bt1.Name = "bt1"; + this.bt1.ProgressBorderColor = System.Drawing.Color.Black; + this.bt1.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.bt1.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.bt1.ProgressEnable = false; + this.bt1.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.bt1.ProgressForeColor = System.Drawing.Color.Black; + this.bt1.ProgressMax = 100F; + this.bt1.ProgressMin = 0F; + this.bt1.ProgressPadding = new System.Windows.Forms.Padding(0); + this.bt1.ProgressValue = 0F; + this.bt1.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.bt1.Sign = ""; + this.bt1.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.bt1.SignColor = System.Drawing.Color.Yellow; + this.bt1.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.bt1.Size = new System.Drawing.Size(153, 64); + this.bt1.TabIndex = 25; + this.bt1.Tag = "1"; + this.bt1.Text = "AGV"; + this.bt1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.bt1.TextShadow = true; + this.bt1.TextVisible = true; + this.bt1.Click += new System.EventHandler(this.arLabel1_Click); + // + // bt0 + // + this.bt0.BackColor = System.Drawing.Color.Lime; + this.bt0.BackColor2 = System.Drawing.Color.Green; + this.bt0.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.bt0.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.bt0.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.bt0.BorderSize = new System.Windows.Forms.Padding(2); + this.bt0.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.bt0.Cursor = System.Windows.Forms.Cursors.Hand; + this.bt0.Dock = System.Windows.Forms.DockStyle.Left; + this.bt0.Font = new System.Drawing.Font("맑은 고딕", 20F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.bt0.ForeColor = System.Drawing.Color.White; + this.bt0.GradientEnable = true; + this.bt0.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.bt0.GradientRepeatBG = false; + this.bt0.isButton = true; + this.bt0.Location = new System.Drawing.Point(0, 0); + this.bt0.MouseDownColor = System.Drawing.Color.Yellow; + this.bt0.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.bt0.msg = null; + this.bt0.Name = "bt0"; + this.bt0.ProgressBorderColor = System.Drawing.Color.Black; + this.bt0.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.bt0.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.bt0.ProgressEnable = false; + this.bt0.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.bt0.ProgressForeColor = System.Drawing.Color.Black; + this.bt0.ProgressMax = 100F; + this.bt0.ProgressMin = 0F; + this.bt0.ProgressPadding = new System.Windows.Forms.Padding(0); + this.bt0.ProgressValue = 0F; + this.bt0.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.bt0.Sign = ""; + this.bt0.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.bt0.SignColor = System.Drawing.Color.Yellow; + this.bt0.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.bt0.Size = new System.Drawing.Size(153, 64); + this.bt0.TabIndex = 24; + this.bt0.Tag = "0"; + this.bt0.Text = "일반설정"; + this.bt0.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.bt0.TextShadow = true; + this.bt0.TextVisible = true; + this.bt0.Click += new System.EventHandler(this.arLabel1_Click); + // + // btSave + // + this.btSave.BackColor = System.Drawing.Color.Gray; + this.btSave.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.btSave.BackgroundImagePadding = new System.Windows.Forms.Padding(0); + this.btSave.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(90)))), ((int)(((byte)(90)))), ((int)(((byte)(90))))); + this.btSave.BorderColorOver = System.Drawing.Color.FromArgb(((int)(((byte)(152)))), ((int)(((byte)(150)))), ((int)(((byte)(152))))); + this.btSave.BorderSize = new System.Windows.Forms.Padding(2); + this.btSave.ColorTheme = arCtl.arLabel.eColorTheme.Custom; + this.btSave.Cursor = System.Windows.Forms.Cursors.Hand; + this.btSave.Dock = System.Windows.Forms.DockStyle.Bottom; + this.btSave.Font = new System.Drawing.Font("궁서체", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); + this.btSave.ForeColor = System.Drawing.Color.White; + this.btSave.GradientEnable = true; + this.btSave.GradientMode = System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal; + this.btSave.GradientRepeatBG = false; + this.btSave.isButton = true; + this.btSave.Location = new System.Drawing.Point(5, 740); + this.btSave.MouseDownColor = System.Drawing.Color.Yellow; + this.btSave.MouseOverColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.btSave.msg = null; + this.btSave.Name = "btSave"; + this.btSave.ProgressBorderColor = System.Drawing.Color.Black; + this.btSave.ProgressColor1 = System.Drawing.Color.LightSkyBlue; + this.btSave.ProgressColor2 = System.Drawing.Color.DeepSkyBlue; + this.btSave.ProgressEnable = false; + this.btSave.ProgressFont = new System.Drawing.Font("Consolas", 10F); + this.btSave.ProgressForeColor = System.Drawing.Color.Black; + this.btSave.ProgressMax = 100F; + this.btSave.ProgressMin = 0F; + this.btSave.ProgressPadding = new System.Windows.Forms.Padding(0); + this.btSave.ProgressValue = 0F; + this.btSave.ShadowColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.btSave.Sign = ""; + this.btSave.SignAlign = System.Drawing.ContentAlignment.BottomRight; + this.btSave.SignColor = System.Drawing.Color.Yellow; + this.btSave.SignFont = new System.Drawing.Font("Consolas", 7F, System.Drawing.FontStyle.Italic); + this.btSave.Size = new System.Drawing.Size(1270, 55); + this.btSave.TabIndex = 8; + this.btSave.Text = "저장"; + this.btSave.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.btSave.TextShadow = true; + this.btSave.TextVisible = true; + this.btSave.Click += new System.EventHandler(this.btSave_Click); + // + // chkClearPos + // + this.chkClearPos.AutoSize = true; + this.chkClearPos.Font = new System.Drawing.Font("궁서체", 20F, System.Drawing.FontStyle.Bold); + this.chkClearPos.Location = new System.Drawing.Point(27, 371); + this.chkClearPos.Name = "chkClearPos"; + this.chkClearPos.Size = new System.Drawing.Size(468, 31); + this.chkClearPos.TabIndex = 12; + this.chkClearPos.Text = "자동모드 해제 시 위치정보 삭제"; + this.chkClearPos.UseVisualStyleBackColor = true; + // + // fSetup + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(15)))), ((int)(((byte)(15)))), ((int)(((byte)(15))))); + this.ClientSize = new System.Drawing.Size(1280, 800); + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.label8); + this.Controls.Add(this.panTopMenu); + this.Controls.Add(this.btSave); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.KeyPreview = true; + this.Name = "fSetup"; + this.Padding = new System.Windows.Forms.Padding(5); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Setup"; + this.Load += new System.EventHandler(this.fSetup_Load); + this.tabControl1.ResumeLayout(false); + this.tabPage6.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage1.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.tabPage2.PerformLayout(); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + this.tabPage5.ResumeLayout(false); + this.tabPage5.PerformLayout(); + this.tabPage4.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nudMusicVol)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nudDoorSoundTerm)).EndInit(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.panTopMenu.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private AGVControl.ValueSelect vcSpeedL; + private AGVControl.ValueSelect vcSpeedM; + private System.Windows.Forms.Label label2; + private arCtl.arLabel btSave; + private arCtl.arLabel btSpeaker; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox tbPortXBE; + private System.Windows.Forms.TextBox tbPortPLC; + private System.Windows.Forms.ComboBox tbBaudXBE; + private System.Windows.Forms.ComboBox tbBaudPLC; + private System.Windows.Forms.Button btSelXbee; + private System.Windows.Forms.Button btSelPlc1; + private System.Windows.Forms.Panel panTopMenu; + private arCtl.arLabel btClose; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label label10; + private AGVControl.ValueSelect valIntervalXBE; + private AGVControl.ValueSelect valueSelect4; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.Label label23; + private AGVControl.ValueSelect vcChargeMaxTime; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Label label1; + private AGVControl.ValueSelect vcChargeRetryTerm; + private System.Windows.Forms.Label label9; + private AGVControl.ValueSelect vcSpeedS; + private System.Windows.Forms.Label label25; + private AGVControl.ValueSelect vcChargeSearchTime; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.ComboBox tbBaudBAT; + private System.Windows.Forms.TextBox tbportBMS; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ComboBox tbBaudAGV; + private System.Windows.Forms.TextBox tbPortAGV; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label28; + private AGVControl.ValueSelect valIntervalBMS; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Button button3; + private AGVControl.ValueSelect vcSpeedH; + private AGVControl.ValueSelect vcSpeedR; + private AGVControl.ValueSelect vcpidPL; + private AGVControl.ValueSelect vcpidPH; + private AGVControl.ValueSelect vcpidPM; + private System.Windows.Forms.Label label15; + private AGVControl.ValueSelect vcpidDL; + private AGVControl.ValueSelect vcpidDH; + private AGVControl.ValueSelect vcpidDM; + private System.Windows.Forms.Label label32; + private AGVControl.ValueSelect vcpidIL; + private AGVControl.ValueSelect vcpidIH; + private AGVControl.ValueSelect vcpidIM; + private System.Windows.Forms.Label label31; + private AGVControl.ValueSelect vcpidDS; + private AGVControl.ValueSelect vcpidPS; + private AGVControl.ValueSelect vcpidIS; + private AGVControl.ValueSelect vcChargeEmergencyLevel; + private arCtl.arLabel btAutoCharge; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.Label label36; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.Label label38; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label label39; + private System.Windows.Forms.Label label41; + private System.Windows.Forms.Label label42; + private System.Windows.Forms.Label label43; + private AGVControl.ValueSelect tbChargerID; + private System.Windows.Forms.TabPage tabPage5; + private AGVControl.ValueSelect vcChargeWaitSec; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Label label44; + private System.Windows.Forms.Label label45; + private System.Windows.Forms.Label label46; + private AGVControl.ValueSelect vcTagF1F2; + private AGVControl.ValueSelect vcTagQCF1; + private AGVControl.ValueSelect vcTagF1A; + private AGVControl.ValueSelect vcTagF1B; + private AGVControl.ValueSelect vcTagQCA; + private AGVControl.ValueSelect vcTagF2A; + private AGVControl.ValueSelect vcTagQCB; + private System.Windows.Forms.Label label49; + private AGVControl.ValueSelect vcTagF2B; + private System.Windows.Forms.Label label47; + private System.Windows.Forms.Label label48; + private AGVControl.ValueSelect vcTagF3A; + private AGVControl.ValueSelect vcTagF3B; + private AGVControl.ValueSelect vcTagF4A; + private System.Windows.Forms.Label label53; + private AGVControl.ValueSelect vcTagF4B; + private System.Windows.Forms.Label label51; + private AGVControl.ValueSelect vcTagF3F4; + private AGVControl.ValueSelect vcTagF2F3; + private System.Windows.Forms.Button button4; + private AGVControl.ValueSelect vcSCK; + private System.Windows.Forms.Label label55; + private AGVControl.ValueSelect vcSSK; + private System.Windows.Forms.Label label56; + private AGVControl.ValueSelect vcSTT; + private System.Windows.Forms.Label label57; + private AGVControl.ValueSelect vcTagNOT; + private AGVControl.ValueSelect vcTagPOT; + private AGVControl.ValueSelect vcChargeStartLevel; + private AGVControl.ValueSelect vcChargeMaxLevel; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.CheckBox chkAGVDirBack; + private System.Windows.Forms.CheckBox chkFullScreen; + private System.Windows.Forms.NumericUpDown nudMusicVol; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.LinkLabel linkLabel5; + private System.Windows.Forms.LinkLabel linkLabel4; + private System.Windows.Forms.LinkLabel linkLabel3; + private System.Windows.Forms.TextBox tbMusic; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.NumericUpDown nudDoorSoundTerm; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.DateTimePicker cleartime2; + private System.Windows.Forms.DateTimePicker cleartime1; + private System.Windows.Forms.CheckBox chkClear2; + private System.Windows.Forms.CheckBox chkClear1; + private arCtl.arLabel btMusic; + private System.Windows.Forms.TabPage tabPage6; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.CheckBox chkDetectManualCharge; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox tbMCID; + private System.Windows.Forms.GroupBox groupBox1; + private AGVControl.ValueSelect vcTagQAA; + private AGVControl.ValueSelect vcTagQAB; + private System.Windows.Forms.Label label17; + private AGVControl.ValueSelect vcTagQAQC; + private System.Windows.Forms.PropertyGrid propertyGrid1; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Panel panel2; + private arCtl.arLabel bt5; + private arCtl.arLabel bt4; + private arCtl.arLabel bt3; + private arCtl.arLabel bt2; + private arCtl.arLabel bt1; + private arCtl.arLabel bt0; + private System.Windows.Forms.Label label11; + private AGVControl.ValueSelect vcSpeedDrive; + private System.Windows.Forms.Label label19; + private AGVControl.ValueSelect vcSAD; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label50; + private System.Windows.Forms.Label label40; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Label label52; + private System.Windows.Forms.TextBox tbagvchannel; + private System.Windows.Forms.TextBox tbagvpanid; + private System.Windows.Forms.TextBox tbagvaddr; + private System.Windows.Forms.Label label54; + private AGVControl.ValueSelect vcTagF5A; + private AGVControl.ValueSelect vcTagF5B; + private AGVControl.ValueSelect vcTagF4F5; + private System.Windows.Forms.Label label58; + private System.Windows.Forms.ComboBox cmbChargerPos; + private System.Windows.Forms.CheckBox chkClearPos; + } +} \ No newline at end of file diff --git a/Cs_HMI/Project/fSetup.cs b/Cs_HMI/Project/fSetup.cs new file mode 100644 index 0000000..0381f58 --- /dev/null +++ b/Cs_HMI/Project/fSetup.cs @@ -0,0 +1,665 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using AR; + + +namespace Project +{ + public partial class fSetup : Form + { + readonly System.Windows.Forms.Timer tmDisplay; + public fSetup() + { + InitializeComponent(); + tmDisplay = new Timer + { + Interval = 200 + }; + tmDisplay.Tick += TmDisplay_Tick; + this.VisibleChanged += FSetup_VisibleChanged; + this.FormClosed += FSetup_FormClosed; + this.KeyDown += (s1, e1) => { if (e1.KeyCode == Keys.Escape) this.Close(); }; + + this.panTopMenu.MouseMove += LbTitle_MouseMove; + this.panTopMenu.MouseUp += LbTitle_MouseUp; + this.panTopMenu.MouseDown += LbTitle_MouseDown; + this.panTopMenu.DoubleClick += LbTitle_DoubleClick; + + this.propertyGrid1.SelectedObject = PUB.setting; + } + + private void FSetup_FormClosed(object sender, FormClosedEventArgs e) + { + this.timer1.Stop(); + this.timer1.Enabled = false; + } + + private void FSetup_VisibleChanged(object sender, EventArgs e) + { + PUB.log.Add("setup screen show : " + this.Visible.ToString()); + if (this.Visible) tmDisplay.Start(); + else tmDisplay.Stop(); + } + + private void fSetup_Load(object sender, EventArgs e) + { + + //통신값 표시 + //tbPortBMS.Text = Pub.setting.Port_BMS; + tbPortPLC.Text = PUB.setting.Port_PLC; + tbPortAGV.Text = PUB.setting.Port_AGV; + tbPortXBE.Text = PUB.setting.Port_XBE; + tbportBMS.Text = PUB.setting.Port_BAT; + + tbBaudPLC.Text = PUB.setting.Baud_PLC.ToString(); + tbBaudAGV.Text = PUB.setting.Baud_AGV.ToString(); + tbBaudXBE.Text = PUB.setting.Baud_XBE.ToString(); + tbBaudBAT.Text = PUB.setting.Baud_BAT.ToString(); + + //valueSelect1.Value = Pub.setting.interval_bms; + valIntervalXBE.Value = PUB.setting.interval_xbe; + vcpidDS.Value = PUB.setting.ZSpeed; + valueSelect4.Value = PUB.setting.interval_iostate; + valIntervalBMS.Value = PUB.setting.interval_bms; + tbChargerID.Value = PUB.setting.ChargerID; + + cmbChargerPos.SelectedIndex = PUB.setting.chargerpos; + + vcSCK.Value = PUB.setting.SCK; + vcSSK.Value = PUB.setting.SSK; + vcSTT.Value = PUB.setting.STT; + vcSAD.Value = PUB.setting.SAD; + + tbagvaddr.Text = PUB.setting.AGV_ADDRESS; + tbagvpanid.Text = PUB.setting.AGV_PANID; + tbagvchannel.Text = PUB.setting.AGV_CHANNEL; + + //속도 저/중/고 + vcSpeedL.Value = PUB.setting.SPD_L; + vcSpeedM.Value = PUB.setting.SPD_M; + vcSpeedH.Value = PUB.setting.SPD_H; + vcSpeedDrive.Value = PUB.setting.SPD_DRIVE; + + //속도 정지/회전 + vcSpeedS.Value = PUB.setting.SPD_S; + vcSpeedR.Value = PUB.setting.SPD_R; + + //PID-P + vcpidPH.Value = PUB.setting.PID_PH; + vcpidPM.Value = PUB.setting.PID_PM; + vcpidPL.Value = PUB.setting.PID_PL; + + //PID-I + vcpidIH.Value = PUB.setting.PID_IH; + vcpidIM.Value = PUB.setting.PID_IM; + vcpidIL.Value = PUB.setting.PID_IL; + + //PID-D + vcpidDH.Value = PUB.setting.PID_DH; + vcpidDM.Value = PUB.setting.PID_DM; + vcpidDL.Value = PUB.setting.PID_DL; + + //정지상수 + vcpidPS.Value = PUB.setting.PID_PS; + vcpidIS.Value = PUB.setting.PID_IS; + vcpidDS.Value = PUB.setting.PID_DS; + + SetColorValue(btSpeaker, PUB.setting.Enable_Speak); + SetColorValue(btAutoCharge, PUB.setting.Enable_AutoCharge); + SetColorValue(btMusic, PUB.setting.Enable_Music); + + nudDoorSoundTerm.Value = PUB.setting.doorSoundTerm; + chkAGVDirBack.Checked = PUB.setting.AGV_Direction_FVI_Backward; + + chkClear1.Checked = PUB.setting.datetime_Check_1; + chkClear2.Checked = PUB.setting.datetime_Check_2; + cleartime1.Value = DateTime.Parse("1982-11-23 " + PUB.setting.datetime_Reset_1 + ":00"); + cleartime2.Value = DateTime.Parse("1982-11-23 " + PUB.setting.datetime_Reset_2 + ":00"); + chkClearPos.Checked = PUB.setting.AutoModeOffAndClearPosition; + + //PLC옵션 + nudMusicVol.Value = (int)(PUB.mplayer.Volume * 100.0); + tbMusic.Text = PUB.setting.musicfile; + this.chkFullScreen.Checked = PUB.setting.FullScreen; + this.chkDetectManualCharge.Checked = PUB.setting.DetectManualCharge; + + //충전 + // chkAutoCharge.Checked = PUB.setting.Enable_AutoCharge; + vcChargeStartLevel.Value = PUB.setting.ChargeStartLevel; + vcChargeMaxLevel.Value = PUB.setting.ChargeMaxLevel; + vcChargeMaxTime.Value = PUB.setting.ChargeMaxTime; + vcChargeRetryTerm.Value = PUB.setting.ChargeRetryTerm; + vcChargeSearchTime.Value = PUB.setting.ChargeSearchTime; + vcChargeEmergencyLevel.Value = PUB.setting.ChargeEmergencyLevel; + vcChargeWaitSec.Value = PUB.setting.ChargetWaitSec; + // chkAutoCharge_CheckedChanged(chkAutoCharge, null); + + //태그 + vcTagPOT.Value = PUB.setting.TAGPOT; + vcTagNOT.Value = PUB.setting.TAGNOT; + + vcTagQAQC.Value = PUB.setting.TAG_QA_QC; + vcTagQCF1.Value = PUB.setting.TAG_QC_F1; + vcTagF1F2.Value = PUB.setting.TAG_F1_F2; + vcTagF2F3.Value = PUB.setting.TAG_F2_F3; + vcTagF3F4.Value = PUB.setting.TAG_F3_F4; + vcTagF4F5.Value = PUB.setting.TAG_F4_F5; + + vcTagQAA.Value = PUB.setting.TAGQAA; + vcTagQCA.Value = PUB.setting.TAGQCA; + vcTagF1A.Value = PUB.setting.TAGF1A; + vcTagF2A.Value = PUB.setting.TAGF2A; + vcTagF3A.Value = PUB.setting.TAGF3A; + vcTagF4A.Value = PUB.setting.TAGF4A; + vcTagF5A.Value = PUB.setting.TAGF5A; + + vcTagQAB.Value = PUB.setting.TAGQAB; + vcTagQCB.Value = PUB.setting.TAGQCB; + vcTagF1B.Value = PUB.setting.TAGF1B; + vcTagF2B.Value = PUB.setting.TAGF2B; + vcTagF3B.Value = PUB.setting.TAGF3B; + vcTagF4B.Value = PUB.setting.TAGF4B; + vcTagF5B.Value = PUB.setting.TAGF5B; + + tbMCID.Text = PUB.setting.MCID; + + timer1.Start(); + } + + + #region "Mouse Form Move" + + private Boolean fMove = false; + private Point MDownPos; + + private void LbTitle_DoubleClick(object sender, EventArgs e) + { + if (this.WindowState == FormWindowState.Maximized) this.WindowState = FormWindowState.Normal; + else this.WindowState = FormWindowState.Maximized; + } + private void LbTitle_MouseMove(object sender, MouseEventArgs e) + { + if (fMove) + { + Point offset = new Point(e.X - MDownPos.X, e.Y - MDownPos.Y); + this.Left += offset.X; + this.Top += offset.Y; + //offset = new Point(0, 0); + } + } + private void LbTitle_MouseUp(object sender, MouseEventArgs e) + { + fMove = false; + } + private void LbTitle_MouseDown(object sender, MouseEventArgs e) + { + MDownPos = new Point(e.X, e.Y); + fMove = true; + } + + #endregion + + + private void btSave_Click(object sender, EventArgs e) + { + if (PUB.CheckPassword() == false) + { + Util.MsgE("암호가 일치하지 않습니다"); + return; + } + + this.Validate(); + propertyGrid1.Invalidate(); + + //통신정보저장 + // Pub.setting.Port_BMS = tbPortBMS.Text; + PUB.setting.Port_XBE = tbPortXBE.Text; + PUB.setting.Port_PLC = tbPortPLC.Text; + PUB.setting.Port_AGV = tbPortAGV.Text; + PUB.setting.Port_BAT = tbportBMS.Text; + + // Pub.setting.Baud_bms = int.Parse(tbBaudBms.Text); + PUB.setting.Baud_XBE = int.Parse(tbBaudXBE.Text); + PUB.setting.Baud_PLC = int.Parse(tbBaudPLC.Text); + PUB.setting.Baud_AGV = int.Parse(tbBaudAGV.Text); + PUB.setting.Baud_BAT = int.Parse(tbBaudBAT.Text); + + PUB.setting.ChargerID = (int)(tbChargerID.Value); + + //Pub.setting.interval_bms = (float)valueSelect1.Value; + PUB.setting.interval_bms = (int)valIntervalBMS.Value; + PUB.setting.interval_xbe = (float)valIntervalXBE.Value; + PUB.setting.ZSpeed = (byte)vcpidDS.Value; + PUB.setting.interval_iostate = (byte)valueSelect4.Value; + PUB.setting.chargerpos = this.cmbChargerPos.SelectedIndex; + PUB.setting.AutoModeOffAndClearPosition = this.chkClearPos.Checked; + //PUB.setting.MotorUpTime = (byte)valueSelect5.Value; + + //AGV정보 저장 + PUB.setting.Enable_Speak = this.btSpeaker.ProgressValue != 0; + PUB.setting.Enable_Music = this.btMusic.ProgressValue != 0; + PUB.setting.Enable_AutoCharge = this.btAutoCharge.ProgressValue != 0; + + //충전 + PUB.setting.ChargeStartLevel = (int)vcChargeStartLevel.Value; + PUB.setting.ChargeMaxLevel = (int)vcChargeMaxLevel.Value; + PUB.setting.ChargeMaxTime = (int)vcChargeMaxTime.Value; + PUB.setting.ChargeRetryTerm = (int)vcChargeRetryTerm.Value; + PUB.setting.ChargeSearchTime = (int)vcChargeSearchTime.Value; + PUB.setting.ChargeEmergencyLevel = (int)vcChargeEmergencyLevel.Value; + PUB.setting.ChargetWaitSec = (int)vcChargeWaitSec.Value; + + PUB.setting.SCK = (int)vcSCK.Value; + PUB.setting.SSK = (int)vcSSK.Value; + PUB.setting.STT = (int)vcSTT.Value; + PUB.setting.SAD = (int)vcSAD.Value; + + //속도 저/중/고 + PUB.setting.SPD_L = (int)vcSpeedL.Value; + PUB.setting.SPD_M = (int)vcSpeedM.Value; + PUB.setting.SPD_H = (int)vcSpeedH.Value; + PUB.setting.SPD_DRIVE = (int)vcSpeedDrive.Value; + + //속도 정지/회전 + PUB.setting.SPD_S = (int)vcSpeedS.Value; + PUB.setting.SPD_R = (int)vcSpeedR.Value; + + //PID-P + PUB.setting.PID_PH = (int)vcpidPH.Value; + PUB.setting.PID_PM = (int)vcpidPM.Value; + PUB.setting.PID_PL = (int)vcpidPL.Value; + + //PID-I ; + PUB.setting.PID_IH = (int)vcpidIH.Value; + PUB.setting.PID_IM = (int)vcpidIM.Value; + PUB.setting.PID_IL = (int)vcpidIL.Value; + + //PID-D ; + PUB.setting.PID_DH = (int)vcpidDH.Value; + PUB.setting.PID_DM = (int)vcpidDM.Value; + PUB.setting.PID_DL = (int)vcpidDL.Value; + + //정지상수 ; + PUB.setting.PID_PS = (int)vcpidPS.Value; + PUB.setting.PID_IS = (int)vcpidIS.Value; + PUB.setting.PID_DS = (int)vcpidDS.Value; + + //시스템옵션 + PUB.setting.ChargeMaxTime = (int)vcChargeMaxTime.Value; + //Pub.setting.ChargeIdleInterval = (int)nudChargeIdleInterval.Value; + PUB.setting.ChargeRetryTerm = (int)vcChargeRetryTerm.Value; + PUB.setting.AGV_Direction_FVI_Backward = chkAGVDirBack.Checked; + + //초기화시간 + PUB.setting.datetime_Check_1 = chkClear1.Checked; + PUB.setting.datetime_Check_2 = chkClear2.Checked; + PUB.setting.datetime_Reset_1 = cleartime1.Value.ToString("HH:mm"); + PUB.setting.datetime_Reset_2 = cleartime2.Value.ToString("HH:mm"); + + + //태그 + PUB.setting.TAGPOT = (int)vcTagPOT.Value; + PUB.setting.TAGNOT = (int)vcTagNOT.Value; + + PUB.setting.TAG_QA_QC = (int)vcTagQAQC.Value; + PUB.setting.TAG_QC_F1 = (int)vcTagQCF1.Value; + PUB.setting.TAG_F1_F2 = (int)vcTagF1F2.Value; + PUB.setting.TAG_F2_F3 = (int)vcTagF2F3.Value; + PUB.setting.TAG_F3_F4 = (int)vcTagF3F4.Value; + PUB.setting.TAG_F4_F5 = (int)vcTagF4F5.Value; + + PUB.setting.TAGQAA = (int)vcTagQAA.Value; + PUB.setting.TAGQCA = (int)vcTagQCA.Value; + PUB.setting.TAGF1A = (int)vcTagF1A.Value; + PUB.setting.TAGF2A = (int)vcTagF2A.Value; + PUB.setting.TAGF3A = (int)vcTagF3A.Value; + PUB.setting.TAGF4A = (int)vcTagF4A.Value; + PUB.setting.TAGF5A = (int)vcTagF5A.Value; + + PUB.setting.TAGQAB = (int)vcTagQAB.Value; + PUB.setting.TAGQCB = (int)vcTagQCB.Value; + PUB.setting.TAGF1B = (int)vcTagF1B.Value; + PUB.setting.TAGF2B = (int)vcTagF2B.Value; + PUB.setting.TAGF3B = (int)vcTagF3B.Value; + PUB.setting.TAGF4B = (int)vcTagF4B.Value; + PUB.setting.TAGF5B = (int)vcTagF5B.Value; + + //PLC옵션 + PUB.setting.musicvol = (int)nudMusicVol.Value; + PUB.setting.ChargeSearchTime = (int)vcChargeSearchTime.Value; + + PUB.setting.doorSoundTerm = (int)nudDoorSoundTerm.Value; + if (PUB.setting.doorSoundTerm < 1) PUB.setting.doorSoundTerm = 15; //기본값 15초 + + ////핀설정 + //var baL = new System.Collections.BitArray(new byte[] { PUB.setting.PinReverse_DI_Low }); + //var baH = new System.Collections.BitArray(new byte[] { PUB.setting.PInReverse_DI_High }); + //baL[0] = chkdi0.Checked; + //baL[1] = chkdi1.Checked; + //baL[2] = chkdi2.Checked; + //baL[3] = chkdi3.Checked; + //baL[4] = chkdi4.Checked; + //baL[5] = chkdi5.Checked; + //baL[6] = chkdi6.Checked; + //baL[7] = chkdi7.Checked; + + //baH[0] = chkdi8.Checked; + //baH[1] = chkdi9.Checked; + //baH[2] = chkdi10.Checked; + //baH[3] = chkdi11.Checked; + //baH[4] = chkdi12.Checked; + //baH[5] = chkdi13.Checked; + //baH[6] = chkdi14.Checked; + //baH[7] = chkdi15.Checked; + + //byte[] dataL = new byte[] { 0 }; + //byte[] dataH = new byte[] { 0 }; + //baL.CopyTo(dataL, 0); + //baH.CopyTo(dataH, 0); + + //PUB.setting.PinReverse_DI_Low = dataL[0]; + //PUB.setting.PInReverse_DI_High = dataH[0]; + PUB.setting.musicfile = tbMusic.Text.Trim(); + PUB.setting.FullScreen = this.chkFullScreen.Checked; + PUB.setting.ChargeEmergencyLevel = (int)this.vcChargeEmergencyLevel.Value; + PUB.setting.ChargeStartLevel = (int)this.vcChargeStartLevel.Value; + PUB.setting.ChargeMaxLevel = (int)this.vcChargeMaxLevel.Value; + + PUB.setting.DetectManualCharge = this.chkDetectManualCharge.Checked; + PUB.setting.MCID = tbMCID.Text.Trim(); + + PUB.setting.Save(); + + PUB.log.AddAT("환경설정:저장완료"); + + + //plc에 정보를 전송하고 그 값의 회신을 체크한다 + DialogResult = DialogResult.OK; + } + + void SetColorValue(arCtl.arLabel ctl, Boolean value) + { + if (value) + { + ctl.BackColor = Color.Green; + ctl.BackColor2 = Color.Lime; + ctl.ProgressValue = 1; + } + else + { + ctl.BackColor = Color.FromArgb(50, 50, 50); + ctl.BackColor2 = Color.Gray; + ctl.ProgressValue = 0; + } + } + + private void TmDisplay_Tick(object sender, EventArgs e) + { + //Pub.log.Add("timer run"); + } + + private void vcChargeLow_ButtonClick(object sender, AGVControl.ValueSelect.ButtonClickEventArgs e) + { + //버튼이클릭되엇다 각 버튼은 tag값으로 처히 + var button = sender as AGVControl.ValueSelect; + var tagStr = button.Tag.ToString(); + PUB.log.Add("Setup:Click:" + tagStr + ":" + e.Button.ToString()); + if (e.Button == MouseButtons.Middle) + { + //중앙부 숫자를 클릭했다 + var f = AR.UTIL.InputBox("input", button.Value.ToString());// new Dialog.fInput(button.Value.ToString()); + if (f.Item1) + { + Console.WriteLine("value change : " + f.Item2);// ; + button.Value = double.Parse(f.Item2); + } + } + } + + + private void vcChargeLow_ValueChanged(object sender, EventArgs e) + { + //버튼이클릭되엇다 각 버튼은 tag값으로 처히 + var button = sender as AGVControl.ValueSelect; + var tagStr = button.Tag.ToString(); + PUB.log.Add("Setup:ValueChange:" + tagStr + ":" + button.Name); + + //if (tagStr == "SH" && PUB.setting.WheelSpeedHigh != button.Value) + // button.BackColor = Color.Tomato; + //else if (tagStr == "SL" && PUB.setting.WheelSpeedLow != button.Value) + // button.BackColor = Color.Tomato; + //else if (tagStr == "SC" && PUB.setting.WheelSpeedCharge != button.Value) + // button.BackColor = Color.Tomato; + ////else if (tagStr == "MT" && Pub.setting.MoveThreshold != button.Value) + //// button.BackColor = Color.Tomato; + //else if (tagStr == "ST" && PUB.setting.MarkSensorThreshold != button.Value) + // button.BackColor = Color.Tomato; + //else if (tagStr == "BL" && PUB.setting.BalanceThreshold != button.Value) + // button.BackColor = Color.Tomato; + //else if (tagStr == "BU" && PUB.setting.BalanceThresholdUp != button.Value) + // button.BackColor = Color.Tomato; + //else button.BackColor = Color.Navy; + + } + + private void btMagnet_Click(object sender, EventArgs e) + { + //버튼이클릭되엇다 각 버튼은 tag값으로 처히 + var button = sender as arCtl.arLabel; + + var tagStr = button.Tag.ToString(); + PUB.log.Add("Setup:ButtonClick:" + tagStr + ":" + button.Name); + + if (button.ProgressValue == 0) + { + //메세지로 사용여부를 확인한다. + var msg = "다음 기능을 사용하시겠습니까?\n"; + if (tagStr == "0") msg += "[음성지원]\n" + + " * 동작 상태를 음성으로 지원 합니다"; + else if (tagStr == "1") msg += "[자동충전]\n" + + " * 자동으로 충전을 진행 합니다\n" + + " * [충전] 탭에서 설정값을 확인할 수 있습니다"; + else if (tagStr == "2") msg += "[배경음악]\n" + + " * 이동시 음악을 플레이 합니다"; + var dlg = Util.MsgQ(msg); + if (dlg == DialogResult.Yes) + { + SetColorValue(button, true); + } + } + else SetColorValue(button, false); + } + + private void btSelXbee_Click(object sender, EventArgs e) + { + //포트를 선택한 후 표시해준다. + var but = sender as Button; + var tagStr = but.Tag.ToString(); + var newPort = Util.SelectSerialPort(); + if (newPort.isEmpty()) return; + + if (tagStr == "XBE") tbPortXBE.Text = newPort; + else if (tagStr == "AGV") tbPortAGV.Text = newPort; + else if (tagStr == "PLC") tbPortPLC.Text = newPort; + else if (tagStr == "BAT") tbportBMS.Text = newPort; + + } + + private void btClose_Click(object sender, EventArgs e) + { + this.Close(); + } + + + private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + using (var od = new OpenFileDialog()) + { + if (tbMusic.Text.isEmpty() == false) + { + var fi = new System.IO.FileInfo(tbMusic.Text); + od.FileName = fi.Name; + od.InitialDirectory = fi.Directory.FullName; + } + + if (od.ShowDialog() == DialogResult.OK) + { + tbMusic.Text = od.FileName; + } + } + + + } + + private void linkLabel4_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (System.IO.File.Exists(tbMusic.Text) == false) + { + Util.MsgE("파일이 없습니다"); + return; + } + try + { + if (PUB.mplayer.HasAudio) PUB.mplayer.Stop(); + PUB.mplayer.Open(new Uri(tbMusic.Text)); + PUB.mplayer.Play(); + PUB.bPlayMusic = true; + } + catch (Exception ex) + { + Util.MsgE("music open error\n\n" + ex.Message); + } + + } + + private void linkLabel5_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + PUB.mplayer.Stop(); + PUB.bPlayMusic = false; + } + + + private void button3_Click(object sender, EventArgs e) + { + if (this.tbPortAGV.Text == "COM21") + { + this.tbPortAGV.Text = "COM11"; + this.tbPortPLC.Text = "COM6"; + this.tbportBMS.Text = "COM15"; + this.tbPortXBE.Text = "COM18"; + } + else + { + this.tbPortAGV.Text = "COM21"; + this.tbPortPLC.Text = "COM31"; + this.tbportBMS.Text = "COM41"; + this.tbPortXBE.Text = "COM51"; + } + + } + + private void valIntervalBMS_ButtonClick(object sender, AGVControl.ValueSelect.ButtonClickEventArgs e) + { + //버튼이클릭되엇다 각 버튼은 tag값으로 처히 + var button = sender as AGVControl.ValueSelect; + var tagStr = button.Tag.ToString(); + PUB.log.Add("Setup:Click:" + tagStr + ":" + e.Button.ToString()); + if (e.Button == MouseButtons.Middle) + { + //중앙부 숫자를 클릭했다 + var f = AR.UTIL.InputBox("input", button.Value.ToString());// new Dialog.fInput(button.Value.ToString()); + if (f.Item1) + { + Console.WriteLine("value change : " + f.Item2); + button.Value = double.Parse(f.Item2); + } + } + } + + private void button4_Click(object sender, EventArgs e) + { + vcTagNOT.Value = 9000; + + vcTagQAQC.Value = 9250; + vcTagQCF1.Value = 9350; + vcTagF1F2.Value = 9450; + vcTagF2F3.Value = 9550; + vcTagF3F4.Value = 9650; + vcTagF4F5.Value = 9750; + + vcTagQAB.Value = 9200; + vcTagQCB.Value = 9300; + vcTagF1B.Value = 9400; + vcTagF2B.Value = 9500; + vcTagF3B.Value = 9600; + vcTagF4B.Value = 9700; + vcTagF5B.Value = 9800; + + vcTagQAA.Value = 9201; + vcTagQCA.Value = 9301; + vcTagF1A.Value = 9401; + vcTagF2A.Value = 9501; + vcTagF3A.Value = 9601; + vcTagF4A.Value = 9701; + vcTagF5A.Value = 9801; + + vcTagPOT.Value = 9900; + } + + private void arLabel1_Click(object sender, EventArgs e) + { + var buts = new arCtl.arLabel[] { bt0, bt1, bt2, bt3, bt4, bt5 }; + foreach (var lb in buts) + { + lb.BackColor = Color.DimGray; + lb.BackColor2 = Color.Gray; + } + var bt = sender as arCtl.arLabel; + bt.BackColor = Color.Lime; + bt.BackColor2 = Color.Green; + var index = int.Parse(bt.Tag.ToString()); + this.tabControl1.SelectedIndex = index; + } + + private void button7_Click(object sender, EventArgs e) + { + var value = tbagvaddr.Text.PadLeft(4, '0'); + if (PUB.AGV.AGVCommand("SAD", value)) + { + PUB.setting.AGV_ADDRESS = value; + PUB.setting.Save(); + } + + } + + private void button5_Click(object sender, EventArgs e) + { + var value = tbagvpanid.Text.PadLeft(4, '0'); + if (PUB.AGV.AGVCommand("SPN", value)) + { + PUB.setting.AGV_PANID = value; + PUB.setting.Save(); + } + + } + + private void button6_Click(object sender, EventArgs e) + { + var value = tbagvchannel.Text.PadLeft(4, '0'); + if (PUB.AGV.AGVCommand("SCH", value)) + { + PUB.setting.AGV_CHANNEL = value; + PUB.setting.Save(); + } + + + } + } +} diff --git a/Cs_HMI/Project/fSetup.resx b/Cs_HMI/Project/fSetup.resx new file mode 100644 index 0000000..d7f6461 --- /dev/null +++ b/Cs_HMI/Project/fSetup.resx @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAsRJREFUWEft + lz9TU0EUxdOovWKv9Golo59AsRMr0ELQRjsHO4n4CWD8A/oNUD9IZpKQxCYVIg1gKTYChejvvDmbbN57 + IS8gY8OZOZPHuefe3b27+xJKpzgKqtXqhdXV1Sv1ev0OHNezNIdPBgw0Cl8xWAv+6cNmo9GYZzKXnXZ8 + NJvNixR+A/ejgQZR3tdwxGWOBlZzgyLbLhq4g77C5xyfD0U/S9uxJ3Cbro253HAg8R4FdqNiX9Em+Txj + SwaKwSm4DkPeLpObsKUYSNDKO4Mz8Lt2u33W4YGQl7ylkA93C3fCe/49JJP4zKGhQf5sqAO3Ct0UjDpw + SRKdeGs5QZECaQ91lkM9FrNoOR8YRjGG074et53O3ETTIXtsKQPF5JHXUmltbe0c2jeomvuHXlEmoHse + ZjtpWYVHYDjhv2FmEtIck0fezhWkkw+siy8tZ0Hwi0076UPHhGbQwwAH8KlDebEnDiXgb92OH443LPdC + e2eD9n7Fcg+IxatMOpGn2d4D9E/2HFQqlfOWu2Dfrtmg9r+wnAHx9IADBxeIzdmnBV613AWD6kslGKYt + 5yLVcjHT9jScE+rfttyFxGCQ2XIu+kygcybyQM6j4GesW5a7+O9bEB9CJvDRcg+IHecQfrYn/xAKBJs2 + FbmGnT3PifVsh19GPxXHW7ecBa2ZdxFxyrIm9i9fRGXLWeg1ieEkXsUbUDX3Wq3WJYfygUm/ZMJslywn + SH/R5CHtocb7UI9OLFjuD4xqd/wraNahoUHu86jOZpEFJOCcjJEQ/xpaVisdHgh5We2HKP9XrVa77nAx + UGCCxHgSG2j307cjhmI+cGHPk8HR7toyHNyJraiYqOukL5YyhadFPVtLrlrEzaFXnob2jYksUmyYn+V7 + TGyh8J4XAcV0RbXSRjRQmoqVB16140KvUgbSv2bjop77vl5PcShKpb/SGsNeH5IytgAAAABJRU5ErkJg + gg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAA5hJREFUaEPt + mvtTElEUx/3v+lea6X9oppnGV5LV+EABUSRG8f3gvaZGagaakuIDFdPR0nykaZqv0/1eASmuAstursbX + +fyye45zvnDv2XN3KMhLq3poefzgke2J/i6BmmPlXwk3rBNt1DHbeydArag5Vv6VcBEB3uW+OwFqzRvR + EnkjWiNvRA0axuxUM9x4I9aJVmGuZow4FjxU5jXS1Nr8jZR4aoT5mjFSNWSh8NoCpZPmjRS59HTB/qC1 + 3Q3htwE0beQ1Gy96Q/3cBMw8dVQJ9wfQ9B4p9dbSwfEhNxJanWUFW4VxN3HrRrrnXaQftHET0AupnpyL + HmHsTdy6kQp/Ay1sfuYmdg/3SddnFMal41aNeJYlKnbXcBNQc8BB9qkuYWw6ZBkxjNqoTDKk8Ixhn868 + EAt7APrCQ9zE2fk5M6UXxmWCLCNogSLtHx2wpWEQ5ogo9lTT0ckxzw1EQ2RiH5AoLhMUNQJV9lupJ+IW + 5iXTOesg07uWWBaRzmci15JPGJsJsowUsSXQNu5O0D7u4d8GNL8RpUq2gUV5ybwcMNPqzhees7G3ReVv + TMK4TJFlpCfiovaZ3gT1Y83UEnTzoqASdy15o6l5cdxLEpV6DLFoosaRTmoL9whjM0WWERGFrmq2Yc94 + Yf2zo9QQtAvjQF2gifyRII89ZTnXjR3ZoJgRI9uoI4sfL4s7O2Wf+PXFFTPTJywG8kcCZA42CeOyQTEj + 7qiPdGwMj8v6vpNaw90pcVhCFraU4sISQ+7fcdmimBGADbyyvc4L3PqxK9zAuPZ17xuPwZT7atCcEiMH + RY10zTnJ4LfzIqFyyfzH3ORm7fW5VBe7S7z9og0n/w+5KGoEYOMeHP/khYZW50ifNMliIvjAHnzQ8ekv + KvHmvsnjKG4k+WwBYZbCTIV7ha6qRGeTZobZiNKSki8XxY0AtOKLi8vTnvPTID8MYQbDUBhXumdNtqhi + BCe5yZUZXjBmKRycdJKRdg6/82uLmytU8Tb90z8bVDHiXPSyA5KZFw1hU+PAFJd+wManA1GuXFQxAtBm + N/e3eeFoszjCQmgEpT62rAQ5uaCakcsHXwcvPlloBGgIopxcUM0IwEEJbTZZmJzjXUxJVDWCV6BS7AQI + Ta9HqHoo+zckmaCqEbTXIqc+8XJN5zXxV6PC2BxR1wjDNtmWeLmGb0gUowSqG/lX5I1ojbwRrfF/GLkX + P+G4Nz+qyUsTKij4DaqNxnRXLBhpAAAAAElFTkSuQmCC + + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/Project/icons8-layers-30.ico b/Cs_HMI/Project/icons8-layers-30.ico new file mode 100644 index 0000000000000000000000000000000000000000..058c52ea4f044ac2256e3bef90867dc0a8bc5d08 GIT binary patch literal 106368 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 literal 0 HcmV?d00001 diff --git a/Cs_HMI/Project/packages.config b/Cs_HMI/Project/packages.config new file mode 100644 index 0000000..5712595 --- /dev/null +++ b/Cs_HMI/Project/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Cs_HMI/StateMachine/DisplayTextHandler.cs b/Cs_HMI/StateMachine/DisplayTextHandler.cs new file mode 100644 index 0000000..79d32a2 --- /dev/null +++ b/Cs_HMI/StateMachine/DisplayTextHandler.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Windows.Forms; + +namespace Project +{ + public partial class fMain + { + delegate void ShowLotTextHandler(string value); + + delegate void UpdateDMTextHandler(string value1); + + void UpdateResultText(string value1) + { + + } + + delegate void UpdateLabelTextHandler(Control ctl, string value); + void UpdateLabelText(Control ctl, string value) + { + if (ctl.InvokeRequired) + { + ctl.BeginInvoke(new UpdateLabelTextHandler(UpdateLabelText), new object[] { ctl, value }); + } + else + { + ctl.Text = value; + } + } + } +} diff --git a/Cs_HMI/StateMachine/EnumStruct.cs b/Cs_HMI/StateMachine/EnumStruct.cs new file mode 100644 index 0000000..baedc6f --- /dev/null +++ b/Cs_HMI/StateMachine/EnumStruct.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class StateMachine + { + public enum eGoDir + { + Up, + Down, + } + public enum EMsgOpt : byte + { + NORMAL, + STEPCHANGE, + ERROR, + } + /// + /// 000~020 : System Define + /// 020~255 : User Define + /// + public enum eSMStep : byte + { + NOTSET = 0, + INIT, + SYNC, + IDLE, + RUN, + FINISH, + PAUSE, + ERROR, + RESET, + EMERGENCY, + CLEAR, + CLOSING, + CLOSEWAIT, + CLOSED, + } + + /// + /// RUN중일 때 사용되는 세부 시퀀스 + /// + public enum ERunStep : byte + { + + /// + /// 자동모드 대기상태 + /// + READY=0, + + /// + /// 홈(QC)로 이동합니다 + /// + GOHOME, + + /// + /// 충전을 해제 함 + /// + CHARGEOFF, + + /// + /// 충전이동 + /// + GOCHARGE, + + + /// + /// 충전중 + /// + CHARGECHECK =50, + + /// + /// 상차이동 + /// + GOUP, + + + /// + /// 하차이동 + /// + GODOWN, + + } + + + } + + +} diff --git a/Cs_HMI/StateMachine/EventArgs.cs b/Cs_HMI/StateMachine/EventArgs.cs new file mode 100644 index 0000000..b70ea06 --- /dev/null +++ b/Cs_HMI/StateMachine/EventArgs.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class StateMachine + { + public class StateMachineMessageEventArgs : EventArgs + { + public string Header { get; set; } + public string Message { get; set; } + public StateMachineMessageEventArgs(string header_, string message_) + { + this.Message = message_; + this.Header = header_; + } + } + public event EventHandler Message; + void RaiseMessage(string header, string msg) + { + if (Message != null) Message(this, new StateMachineMessageEventArgs(header, msg)); + } + + public class StepChangeEventArgs : EventArgs + { + public eSMStep Old { get; set; } + public eSMStep New { get; set; } + public StepChangeEventArgs(eSMStep old_,eSMStep new_) + { + this.Old = old_; + this.New = new_; + } + } + public class RunningEventArgs : EventArgs { + public Boolean isFirst { get; set; } + public eSMStep Step { get; set; } + public TimeSpan StepTime { get; set; } + public object Data { get; set; } + public RunningEventArgs( eSMStep step_, Boolean isfirst_,TimeSpan steptime_,object data = null) + { + this.isFirst = isfirst_; + this.Step = step_; + StepTime = steptime_; + this.Data = data; + } + } + public event EventHandler StepChanged; + public event EventHandler SPS; + public event EventHandler Running; + } + + +} diff --git a/Cs_HMI/StateMachine/Properties/AssemblyInfo.cs b/Cs_HMI/StateMachine/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cf59347 --- /dev/null +++ b/Cs_HMI/StateMachine/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("StateMachine")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("StateMachine")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("bbc9bccf-6262-4355-9cc2-37ff678ac499")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 +// 기본값으로 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/StateMachine/StateMachine.cs b/Cs_HMI/StateMachine/StateMachine.cs new file mode 100644 index 0000000..07beaf2 --- /dev/null +++ b/Cs_HMI/StateMachine/StateMachine.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class StateMachine : IDisposable + { + public DateTime UpdateTime; + public TimeSpan RunSpeed = new TimeSpan(0); + private Boolean bLoop = true; + private DateTime StepStartTime; + private byte _messageOption; + + private System.Threading.Thread worker; + private Boolean firstRun = false; + + public Boolean WaitFirstRun = false; + + + + public StateMachine() + { + WaitFirstRun = false; + UpdateTime = DateTime.Now; + _messageOption = 0xFF; //모든메세지가 오도록 한다. + worker = new System.Threading.Thread(new System.Threading.ThreadStart(Loop)) + { + IsBackground = false + }; + StepStartTime = DateTime.Parse("1982-11-23"); + } + + ~StateMachine() + { + Dispose(false); + } + + #region "Dispose" + + private bool disposed = false; + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!this.disposed) + { + if (disposing) + { + // Dispose managed resources. + } + + Stop(); + // unmanaged resources here. + // If disposing is false, + // only the following code is executed. + disposed = true; + } + } + + #endregion + + public void Stop() + { + bLoop = false; + //if (worker.IsAlive) + // if (worker.Join(1000) == false) + // worker.Abort(); + } + public void Start() + { + if (worker.ThreadState == System.Threading.ThreadState.Stopped) + { + worker = new System.Threading.Thread(new System.Threading.ThreadStart(Loop)) + { + IsBackground = false + }; + } + bLoop = true; + worker.Start(); + } + + private Boolean _isthreadrun; + public Boolean IsThreadRun { get { return _isthreadrun; } } + + void Loop() + { + _isthreadrun = true; + if (GetMsgOpt(EMsgOpt.NORMAL)) RaiseMessage("SM", "Start"); + while (bLoop) + { + RunSpeed = DateTime.Now - UpdateTime; //이전업데이트에서 현재 시간의 오차 한바퀴 시간이 표시됨 + UpdateTime = DateTime.Now; + + //항상 작동하는 경우 + SPS?.Invoke(this, new EventArgs()); + + //작동스텝이 변경되었다면 그것을 알림 처리한다. + if (GetNewStep != Step) + { + if (GetMsgOpt(EMsgOpt.STEPCHANGE)) + RaiseMessage("SM-STEP", string.Format("Step Changed {0} >> {1}", Step, GetNewStep)); + + StepApply(); + firstRun = true; + StepStartTime = DateTime.Now; + } + else + { + //팝업메세지의 종료를 기다리는 식에서 문제가 생긴다 + firstRun = WaitFirstRun; + } + + + //동작중에 발생하는 이벤트 + if (Running != null) + { + try + { + Running(this, new RunningEventArgs(Step, firstRun, StepRunTime)); + } + catch (Exception ex) + { + RaiseMessage("SM-ERROR", ex.Message); + } + } + + System.Threading.Thread.Sleep(1); + } + _isthreadrun = false; + if (GetMsgOpt(EMsgOpt.NORMAL)) RaiseMessage("SM", "Stop"); + } + + + /// + /// 상태머신의 작동상태 + /// + public eSMStep Step { get { return _step; } } + + /// + /// 상태머신값을 숫자로 반환 합니다. (20이하는 시스템상태이고 그 이상은 사용자 상태) + /// + public byte StepValue + { + get + { + return (byte)this._step; + } + } + + /// + /// 현재 진행 스텝을 강제로 변경합니다. + /// 일반적인 상태변화는 setNewStep 을 사용하세요. + /// + /// + public void SetCurrentStep(ERunStep step) + { + RaiseMessage("SM-STEP", string.Format("강제 스텝 변경 {0}->{1}", _runstepo, step)); + _runstepo = step; + _runstepn = step; + } + + public void SetNewStep(eSMStep newstep_, bool force = false) + { + if (Step != newstep_) + { + if(force) + { + RaiseMessage("SM-STEP", string.Format("강제스텝전환 {0} -> {1}", Step, _newstep)); + OldStep = _step; + _step = newstep_; + _newstep = newstep_; + StepChanged?.Invoke(this, new StepChangeEventArgs(OldStep, newstep_)); + } + else + { + if (_newstep != newstep_) + { + //바뀌도록 예약을 한다. + _newstep = newstep_; + if (GetMsgOpt(EMsgOpt.STEPCHANGE)) + RaiseMessage("SM-STEP", string.Format("Step Reserve {0} -> {1}", Step, _newstep)); + } + else + { + //예약은 되어있는데 아직 바뀐것은 아니다. + if (GetMsgOpt(EMsgOpt.STEPCHANGE)) + RaiseMessage("SM-STEP", string.Format("Step Already Reserve {0} -> {1}", Step, _newstep)); + } + } + + } + } + + #region "runstep" + private int _runStepSeq = 0; + public int RunStepSeq { get { return _runStepSeq; } } + + private DateTime runStepStartTime = DateTime.Parse("1982-11-23"); + private ERunStep _runstepn = ERunStep.READY; + private ERunStep _runstepo = ERunStep.READY; + public ERunStep RunStep { get { return _runstepo; } } + public ERunStep RunStepNew { get { return _runstepn; } } + public void SetNewRunStep(ERunStep newStep) + { + if (_runstepn != newStep) + { + // Pub.log.Add(string.Format("set new run step {0}->{1}", _runstepn, newStep)); + _runstepn = newStep; + } + } + public void ApplyRunStep() + { + if (_runstepn != _runstepo) + { + //Pub.log.Add(string.Format("apply new run step {0}->{1}", _runstepo, _runstepn)); + _runStepSeq = 0; + _runstepo = _runstepn; + UpdateRunStepSeq();// runStepStartTime = DateTime.Now; + } + } + public TimeSpan GetRunSteptime { get { return DateTime.Now - runStepStartTime; } } + public void SetStepSeq(byte value) + { + _runStepSeq = value; + if (GetMsgOpt(EMsgOpt.NORMAL)) + { + if (_runStepSeq != value) //변화가잇는겨웅에만 처리 220628 + RaiseMessage("STEPSEQ", string.Format("Step Sequence Jump {0} to {1}", _runStepSeq, value)); + } + + } + public void UpdateRunStepStartTime() + { + runStepStartTime = DateTime.Now; + // Pub.log.Add("Update RunStep Start Time"); + } + public void UpdateRunStepSeq(int incvalue = 1) + { + _runStepSeq += incvalue; + UpdateRunStepStartTime(); + // Pub.log.Add(string.Format("스텝({0}) 시퀀스증가 신규값={1}", runStep, _runStepSeq)); + } + public void ResetRunStepSeq() + { + _runStepSeq = 1; + UpdateRunStepStartTime(); + } + + /// + /// runstep 시퀀스값을 1로 설정하고 시작시간도 업데이트 합니다 + /// 기본 스텝상태를 READY로 변경 합니다 + /// + public void ClearRunStep() + { + _runStepSeq = 1; + runStepStartTime = DateTime.Now; + _runstepn = ERunStep.READY; + _runstepo = ERunStep.READY; + } + #endregion + + + public eSMStep GetNewStep + { + get + { + return _newstep; + } + } + private eSMStep _newstep = eSMStep.NOTSET; + public eSMStep OldStep = eSMStep.NOTSET; //171214 + private eSMStep _step; + + /// + /// newstep 의 값을 step 에 적용합니다. + /// + private void StepApply() + { + var ostep = _step; + OldStep = _step; _step = _newstep; + StepChanged?.Invoke(this, new StepChangeEventArgs(ostep, _step)); + } //171214 + + /// + /// 메세지 출력옵션을 변경 합니다. + /// + /// + /// + public void SetMsgOpt(EMsgOpt opt, Boolean value) + { + byte pos = (byte)opt; + if (value) + _messageOption = (byte)(_messageOption | (1 << pos)); + else + _messageOption = (byte)(_messageOption & ~(1 << pos)); + } + public void SetMegOptOn() { _messageOption = 0xFF; } + public void SetMsgOptOff() { _messageOption = 0; } + public Boolean GetMsgOpt(EMsgOpt opt) + { + byte pos = (byte)opt; + return (_messageOption & (1 << pos)) > 0; + } + public TimeSpan StepRunTime + { + get + { + if (IsThreadRun == false || bLoop == false || StepStartTime.Year == 1982) return new TimeSpan(0); + else return DateTime.Now - StepStartTime; + } + } + + public Boolean bPause = false; + + /// + /// 상태머신이 실제 동작중인지 확인합니다. + /// 검사상태 : Step = Run, IsThreadRun, bPause = false + /// + public Boolean IsRun + { + get + { + if (Step == eSMStep.RUN && _isthreadrun && bPause == false) return true; + else return false; + } + } + } +} diff --git a/Cs_HMI/StateMachine/StateMachine.csproj b/Cs_HMI/StateMachine/StateMachine.csproj new file mode 100644 index 0000000..78843e6 --- /dev/null +++ b/Cs_HMI/StateMachine/StateMachine.csproj @@ -0,0 +1,52 @@ + + + + + Debug + AnyCPU + {BBC9BCCF-6262-4355-9CC2-37FF678AC499} + Library + Properties + StateMachine + StateMachine + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Cs_HMI/StateMachine/_Close.cs b/Cs_HMI/StateMachine/_Close.cs new file mode 100644 index 0000000..3c69eff --- /dev/null +++ b/Cs_HMI/StateMachine/_Close.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class fMain + { + /// + /// 프로그램을 닫을때 1회 실행되는 함수 + /// + private void _Close_Start() + { + if (Pub.plc1 != null) Pub.plc1.Dispose(); + + Pub.log.Add("Program Close"); + Pub.log.Flush(); + Pub.sm.Stop(); + + } + + /// + /// 프로그램종료시 특정상황에 따른 무기한 대기 루틴 이 작업은 close_start 이후에 반복됩니다. + /// 모든 조건이 일치하게되면 closed 상태로 호출되어 프로그램이 종료됩니다. + /// + //private void _Close_Wait() + //{ + // if (!Pub.dio.isRunIOMonitor && !Pub.mot.isRunIOMonitor) + // Pub.sm.setNewStep(eSystemStep.CLOSED); + // else if (!Pub.dio.isDisposed) Pub.dio.Dispose(); + // else if (!Pub.mot.isDisposed) Pub.mot.Dispose(); //181206 + //} + } +} diff --git a/Cs_HMI/StateMachine/_Flag.cs b/Cs_HMI/StateMachine/_Flag.cs new file mode 100644 index 0000000..1fa913e --- /dev/null +++ b/Cs_HMI/StateMachine/_Flag.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace Project +{ + public partial class fMain + { + void gridView2_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e) + { + //메인화면 하단의 플래그 상태창에서 클릭된 경우 + var gv = sender as arFrame.Control.GridView; + //var flagIndex = gv.getNameItem(e.idx); + //if(flagIndex != "") + //{ + // var fidx = int.Parse(flagIndex); + // var flag = (eFlag)fidx; + // var curValue = Pub.flag.get(flag); + // Pub.flag.set(flag, !curValue); + //} + } + + + void flag_ValueChanged(object sender, Device.Flag.ValueEventArgs e) + { + var flag = (eFlag)e.ArrIDX; + if (e.ArrIDX >= FlagMapValue.Length) return; + var gridItemIndex = FlagMapValue[e.ArrIDX]; + Pub.log.Add(string.Format("Flag:{0}({2}) Changed = {1}", flag, e.NewValue,e.ArrIDX)); + if(gridItemIndex != -1) + { + this.IOState.setValue(gridItemIndex, e.NewValue); + this.IOState.Invalidate(); + } + } + + void dio_Message(object sender, arDev.ProPLC.MemoryAccess.MessageEventArgs e) + { + if(e.IsError) + { + Pub.log.Add("ERROR-DIO", e.Message); + } + else Pub.log.Add("DIO", e.Message); + } + + private void Dio_ValueChanged(object sender, arDev.ProPLC.MemoryAccess.IOValueEventArgs e) + { + var diName = (eDIName)e.ArrIDX; + + if(diName == eDIName.MC_START) + { + if(e.NewValue ==true) + { + func_sw_start(); + } + } + else if(diName == eDIName.MC_LOTEND) + { + //lot가 활성화된 경우 + if(e.NewValue == true) + { + + } + + } + //throw new NotImplementedException(); + Console.WriteLine(string.Format("[{1}]{0}=>{2}", diName,e.ArrIDX,e.NewValue)); + } + + void dio_Message2(object sender, arDev.ProPLC.MemoryAccess.MessageEventArgs e) + { + if (e.IsError) + { + Pub.log.Add("ERROR-DIO", e.Message); + } + else Pub.log.Add("DIO", e.Message); + } + + private void Dio_ValueChanged2(object sender, arDev.ProPLC.MemoryAccess.IOValueEventArgs e) + { + var diName = (eDIName)e.ArrIDX; + + if (diName == eDIName.MC_START) + { + if (e.NewValue == true) + { + func_sw_start(); + } + } + else if (diName == eDIName.MC_LOTEND) + { + //lot가 활성화된 경우 + if (e.NewValue == true) + { + + } + + } + //throw new NotImplementedException(); + Console.WriteLine(string.Format("[{1}]{0}=>{2}", diName, e.ArrIDX, e.NewValue)); + } + + } +} diff --git a/Cs_HMI/StateMachine/_Loop.cs b/Cs_HMI/StateMachine/_Loop.cs new file mode 100644 index 0000000..9c40d16 --- /dev/null +++ b/Cs_HMI/StateMachine/_Loop.cs @@ -0,0 +1,323 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using arCtl; +using Euresys.Open_eVision_2_11; +using static Project.StateMachine; + +namespace Project +{ + + public partial class fMain + { + void sm_SPS(object sender, EventArgs e) + { + //always run + _SPS(); + } + + DateTime lastDeleteTime = DateTime.Now; + + enum EScreen + { + Auto=0, + Manual, + IO, + Flag + } + void SetScreen( System.Windows.Forms.Form newscreen) + { + if(this.InvokeRequired) + { + this.BeginInvoke(new Action(() => { + SetScreen(newscreen); + })); + } + else + { + if(panDlg.Controls.Count > 0) + { + var f = panDlg.Controls[0] as System.Windows.Forms.Form; + if (f.GetType() == newscreen.GetType()) return; + } + panDlg.Controls.Clear(); + panDlg.Controls.Add(newscreen); + newscreen.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + newscreen.WindowState = System.Windows.Forms.FormWindowState.Maximized; + newscreen.Show(); + } + } + + + + void sm_Running(object sender, StateMachine.RunningEventArgs e) + { + + //main loop + switch (e.Step) + { + case eSMStep.NOTSET: + Pub.log.Add("S/M Initialize Start"); + Pub.sm.setNewStep(eSMStep.INIT); + break; + + case eSMStep.INIT: //최초실행이다. + if (_SM_RUN_INIT(e.isFirst, Pub.sm.StepRunTime)) + { + //메인화면을 설정한다 + form_auto = new ViewForm.fAuto(); + form_manu = new ViewForm.fManual(); + form_io = new ViewForm.fIO(); + form_flag = new ViewForm.fFlag(); + + form_auto.TopLevel = false; + form_manu.TopLevel = false; + form_io.TopLevel = false; + form_flag.TopLevel = false; + form_auto.Dock = System.Windows.Forms.DockStyle.Fill; + form_manu.Dock = System.Windows.Forms.DockStyle.Fill; + form_io.Dock = System.Windows.Forms.DockStyle.Fill; + form_flag.Dock = System.Windows.Forms.DockStyle.Fill; + + SetScreen(form_auto); + Pub.sm.setNewStep(eSMStep.IDLE); + } + break; + + case eSMStep.IDLE: + + //창을 닫아야하는 상황에는 처리하지 않는다. + if (Pub.popup.needClose) + { + System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다. + Pub.sm.WaitFirstRun = true; + return; + } + else Pub.sm.WaitFirstRun = false; + + + if(e.isFirst) + { + Pub.sm.bPause = false; + Pub.flag.set(eFlag.UserStepCheck, false); + Pub.sm.ClearRunStep(); + // Util_DO.SetMGZMotor(false); + lbMsg.ProgressEnable = false; + // Pub.popup.needClose = true; + } + + //자동소거기능 + if(Pub.setting.AutoDeleteDay > 0) + { + if(Pub.flag.get(eFlag.MINSPACE)==true) + { + var ts = DateTime.Now - lastDeleteTime; + if(ts.TotalSeconds > 1) + { + //파일을 찾아서 소거한다. + if (System.IO.Directory.Exists(Pub.path.FullName)) + DeleteFile(Pub.path.FullName); + + + lastDeleteTime = DateTime.Now; + } + + } + } + break; + + case eSMStep.RUN: + + //창을 닫아야하는 상황에는 처리하지 않는다. + if (Pub.popup.needClose) + { + System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다. + Pub.sm.WaitFirstRun = true; + return; + } + else Pub.sm.WaitFirstRun = false; + + _SM_RUN(e.isFirst, e.StepTime); + break; + + case eSMStep.PAUSE: + case eSMStep.EMERGENCY: + case eSMStep.ERROR: + + + //창을 닫아야하는 상황에는 처리하지 않는다. + if (Pub.popup.needClose) + { + System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다. + Pub.sm.WaitFirstRun = true; + return; + } + else Pub.sm.WaitFirstRun = false; + + if (e.isFirst) + { + + if (Pub.Result.ResultCode != eResult.NoError) + { + //에러메세지가 있는 경우에만 표시함 + if (Pub.Result.ResultMessage != "") + Pub.popup.setMessage(Pub.Result.ResultMessage); + } + if (e.Step == eSMStep.EMERGENCY) Pub.log.AddE("Enter Emergency Step"); + else if (e.Step == eSMStep.PAUSE) Pub.log.AddE("Enter Pause Step : " + Pub.Result.ResultMessage); + else Pub.log.AddE(string.Format("Enter Error Step : {0}", Pub.Result.ResultMessage)); + Pub.sm.bPause = false; + Pub.sm.setNewStep(eSMStep.IDLE); + } + break; + + case eSMStep.RESET: + + //창을 닫아야하는 상황에는 처리하지 않는다. + if (Pub.popup.needClose) + { + System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다. + Pub.sm.WaitFirstRun = true; + return; + } + else Pub.sm.WaitFirstRun = false; + + if (e.isFirst) + { + ClearBarcode(); + Pub.sm.bPause = false; + } + break; + } + } + + void DeleteFile(string path) + { + var basetime = DateTime.Now.AddDays(-1 * Pub.setting.AutoDeleteDay); + var di = new System.IO.DirectoryInfo(path); + if (di.Exists) + { + var dirYear = di.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirYear != null) + { + var dirMon = dirYear.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirMon != null) + { + var dirDay = dirMon.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirDay != null) + { + var curDay = DateTime.Parse(string.Format("{0}-{1}-{2} 00:00:00", dirYear.ToString(), dirMon.ToString(), dirDay.ToString())); + if (curDay < basetime) + { + var dirLot = dirDay.GetDirectories().OrderBy(t => t.Name).FirstOrDefault(); + if (dirLot != null) + { + var delfile = dirLot.GetFiles().FirstOrDefault(); + if (delfile != null) + { + try + { + Pub.log.AddI("Remove Fle : " + delfile.FullName + ",time=" + delfile.LastWriteTime.ToString()); + delfile.Delete(); + } + catch (Exception ex) + { + Pub.log.AddE("deleete error : " + ex.Message); + } + } + else + { + string delpath = dirLot.FullName; + try + { + dirLot.Delete(true); + } + catch (Exception ex) + { + Pub.log.AddE("remove dir" + ex.Message + "," + delpath); + } + + } + } + else + { + //이 폴더아래에 다른 폴더가 하나도 없다 즉 비어 있따. + string delpath = dirDay.FullName; + try + { + dirDay.Delete(true); + } + catch (Exception ex) + { + Pub.log.AddE("remove dir" + ex.Message + "," + delpath); + } + } + } + + } + else + { + //날짜에 해당하는 폴더가 하나도 없다. 월 폴더를 제거한다. + string delpath = dirMon.FullName; + try + { + dirMon.Delete(true); + } + catch (Exception ex) + { + Pub.log.AddE("remove dir" + ex.Message + "," + delpath); + } + } + } + else + { + //이 달에 해당하는 데이터가 없다. 이 년도를 삭제한다. + string delpath = dirYear.FullName; + try + { + dirYear.Delete(true); + } + catch (Exception ex) + { + Pub.log.AddE("remove dir" + ex.Message + "," + delpath); + } + } + } + //년도별폴더목록을 정리함 + //가장작은 년도를 기준으로 파일을 검색해서 1개씩 삭제함 + } + } + + void sm_Message(object sender, StateMachine.StateMachineMessageEventArgs e) + { + //상태머신에서 발생한 메세지 + Pub.log.Add(e.Header, e.Message); + } + + + void sm_StepChanged(object sender, StateMachine.StepChangeEventArgs e) + { + //상태머신의 스텝이 변경될때 발생함 + //Pub.log.Add(string.Format("SM:Step Changed {0} to {1}",e.Old,e.New)); + } + + //void uploadForm_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e) + //{ + // //이벤트 해제 + // if (uploadForm != null) + // uploadForm.FormClosed -= uploadForm_FormClosed; + + // //업로드 창이 닫히면 그 결과를 화면에 표시 해준다. + // //foreach (System.Windows.Forms.ListViewItem lv in uploadForm.listView1.Items) + // //{ + // // string slot = lv.SubItems[0].Text; + // // string wafer = lv.SubItems[2].Text; + // // string state = lv.SubItems[3].Text; + + // //} + //} + } +} diff --git a/Cs_HMI/StateMachine/_TMDisplay.cs b/Cs_HMI/StateMachine/_TMDisplay.cs new file mode 100644 index 0000000..d2c8e9a --- /dev/null +++ b/Cs_HMI/StateMachine/_TMDisplay.cs @@ -0,0 +1,353 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using static Project.StateMachine; + +namespace Project +{ + public partial class fMain + { + private void ColorChangeMotionST(arCtl.arLabel ctl, Color c, Boolean isvalue) + { + if (isvalue) + { + int r = c.R + 100; + int g = c.G + 100; + int b = c.B + 100; + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + if (r < 0) r = 0; + if (g < 0) g = 0; + if (b < 0) b = 0; + ctl.BackColor = Color.FromArgb(r, g, b); + ctl.BackColor2 = c; + } + else + { + ctl.BackColor = Color.FromArgb(100, 100, 100); + ctl.BackColor2 = Color.FromArgb(90, 90, 90); + } + } + + private void BCDHWStatus(Boolean enable, arCtl.arLabel ctl, bool isReady) + { + if (enable == false) + { + ctl.BackColor2 = Color.Gray; + } + else + { + if (isReady) + { + ctl.BackColor2 = Color.SeaGreen; + } + else + { + if (ctl.BackColor2 == Color.Tomato) + { + ctl.BackColor2 = Color.Gray; + } + else + { + ctl.BackColor2 = Color.Tomato; + } + } + } + } + + + void BlinkHwstatus(int row, int col, int value1, int value2) + { + var curValue = HWState.getValue(row, col); + HWState.setValue(row, col, (byte)(curValue == value1 ? value2 : value1)); // + } + + Boolean displayOn = false; + private void tmDisplay_Tick(object sender, EventArgs e) + { + if (displayOn == false) displayOn = true; + else + { + Pub.log.AddAT("Display Timer Overlab");// Console.WriteLine("display overlab"); + return; + } + + if (Pub.sm.Step > eSMStep.INIT && + panTopMenu.Enabled == false) panTopMenu.Enabled = true; + + + //쓰레드로인해서 메인에서 진행하게한다. SPS는 메인쓰레드에서 진행 됨 + //팝을 제거 혹은 표시하는 기능 + if (Pub.popup.needShow) Pub.popup.showMessage(); + else if (Pub.popup.needClose) Pub.popup.Visible = false; // .setVision(false)(); + + lbTime.Text = Pub.sm.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss"); + + //상태 표시 + Update_SSStatus(); + + //H/W 상태표시 + Update_HWStatus(); + + //IO상태(상단줄) 표시 + Update_IOStatus(); + + //display mesasge + UpdateResultMessage(); + + + //메세지창이 깜박거려야하는 상황 체크 + if (lbMsg.Tag != null) + { + var bg1 = lbMsg.BackColor; + var bg2 = lbMsg.BackColor2; + lbMsg.BackColor = bg2; + lbMsg.BackColor2 = bg1; + lbMsg.Invalidate(); + } + + + + + HWState.Invalidate(); + SSInfo.Invalidate(); + IOState.Invalidate(); + + #region retgion"1분 time 루틴" + var ts = DateTime.Now - tm1minute; + if (ts.TotalMinutes >= 1) + { + //리셋카운트 + _AutoResetCount(); + tm1minute = DateTime.Now; + } + #endregion + + #region retgion"5분 time 루틴" + ts = DateTime.Now - tm5minute; + if (ts.TotalMinutes >= 5) + { + //남은디스크확인 + CheckFreeSpace(); + tm5minute = DateTime.Now; + } + #endregion + + //wat.Stop(); + //Console.WriteLine("disp time : " + wat.ElapsedMilliseconds.ToString() + "ms"); + displayOn = false; + } + + void Update_IOStatus() + { + int inputrow = 1; + int inputcol = 0; + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_READY) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_OK) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_ERR) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_COMPLETE) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.VS_LOTEND) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + + var numver_mz = Pub.plc1.getValue(7902); + var numver_sn = Pub.plc1.getValue(7903); + var bin_mz = Convert.ToString(numver_mz, 2).PadLeft(16,'0'); + var bin_sn = Convert.ToString(numver_sn, 2).PadLeft(16, '0'); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + + inputrow = 0; + inputcol = 0; + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.MC_START) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.MC_CONFIRM) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, (ushort)(Pub.plc1.getValue(7900, (int)eDIName.MC_LOTEND) ? 1 : 0)); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + IOState.setTitle(inputrow, inputcol, "--"); IOState.setValue(inputrow, inputcol++, 0); + + //IOState.setTitle(0, inputcol, "DOOR"); IOState.setValue(0, inputcol++, (ushort)(Util_DO.CheckDoorSafty() ? 1 : 2)); + //IOState.setTitle(0, inputcol, "SAFTY"); IOState.setValue(0, inputcol++, (ushort)(Pub.flag.get(eFlag.MGZSafty1) && Pub.flag.get(eFlag.MGZSafty2) ? 1 : 2)); + //IOState.setTitle(0, inputcol, "FULL"); IOState.setValue(0, inputcol++, (ushort)(Util_DO.GetIOInput(eDIName.UD_FULL) ? 2 : 0)); + + //IOState.setTitle(0, inputcol, "A/B\nDETECT"); IOState.setValue(0, inputcol++, (ushort)(Util_DO.GetIOInput(eDIName.AB_DETECT) ? 1 : 0)); + + } + void Update_SSStatus() + { + SSInfo.setTitle(0, 0, Pub.sm.Step.ToString()); + SSInfo.setTitle(1, 0, Pub.sm.runStep.ToString()); + if (Pub.sm.Step == eSMStep.RUN) + SSInfo.setTitle(1, 1, string.Format("{0:N1} sec", Pub.sm.getRunSteptime.TotalSeconds)); + else + SSInfo.setTitle(1, 1, "--"); + + } + void Update_HWStatus() + { + var rownum = 1; + var colIdx = 0; + //if (Pub.light.IsInit == false) BlinkHwstatus(rownum, colIdx++, 3, 4); + //else HWState.setValue(rownum, colIdx++, (byte)(Pub.light.IsInit ? 2 : 3)); // + + if (Pub.plc1.IsValid == false) BlinkHwstatus(rownum, colIdx++, 3, 4); + else HWState.setValue(rownum, colIdx++, (byte)(Pub.plc1.IsValid ? 2 : 3)); //PLC + + if (Pub.Xbee.IsInit == false) BlinkHwstatus(rownum, colIdx++, 3, 4); + else HWState.setValue(rownum, colIdx++, (byte)(Pub.Xbee.IsInit ? 2 : 3)); // + + //if (Pub.camera.IsInit == false) BlinkHwstatus(rownum, colIdx++, 3, 4); + //else HWState.setValue(rownum, colIdx++, (byte)(Pub.camera.IsInit ? 2 : 3)); // + + //if (Pub.bVisionLicense == false) BlinkHwstatus(rownum, colIdx++, 3, 4); + //else HWState.setValue(rownum, colIdx++, (byte)(Pub.bVisionLicense ? 2 : 3)); // + + } + + /// + /// 환경설정에따른 카운트를 리셋처리한다. 171128 + /// + void _AutoResetCount() + { + if (Pub.setting.datetime_Check_1 && Pub.setting.datetime_Reset_1 != "") //오전 + { + try + { + DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + Pub.setting.datetime_Reset_1 + ":00"); + DateTime LastClearTime = Pub.counter.CountReset; + + //현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함 + if (DateTime.Now > SetTime && LastClearTime < SetTime) + { + Pub.log.AddI("Count Reset #1"); + Pub.counter.CountClear(); + } + } + catch { } + } + + if (Pub.setting.datetime_Check_2 && Pub.setting.datetime_Reset_2 != "") //오후 + { + try + { + DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + Pub.setting.datetime_Reset_2 + ":00"); + DateTime LastClearTime = Pub.counter.CountReset; + + //현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함 + if (DateTime.Now > SetTime && LastClearTime < SetTime) + { + Pub.log.AddI("Count Reset #2"); + Pub.counter.CountClear(); + } + } + catch { } + } + } + + DateTime tm1minute = DateTime.Now.AddDays(-1); + DateTime tm5minute = DateTime.Now; + + void UpdateProgressStatus(string title, double value, double max) + { + UpdateProgressStatus((float)value, (float)max, title); + } + + void UpdateProgressStatus(float value, float max, string title) + { + if (lbMsg.ProgressEnable == false) lbMsg.ProgressEnable = true; + if (lbMsg.ProgressMax != max) lbMsg.ProgressMax = max; + if (lbMsg.ProgressValue != value) lbMsg.ProgressValue = value; + if (lbMsg.ProgressForeColor != Color.FromArgb(40, 40, 40)) + lbMsg.ProgressForeColor = Color.FromArgb(40, 40, 40); + if (lbMsg.Text != title) lbMsg.Text = title; + } + + void UpdateStatusMessage(string dispmsg, Color fcolor, Color shadow) + { + UpdateStatusMessage(dispmsg, Color.DimGray, Color.Gray, fcolor, shadow); + } + + void UpdateStatusMessage(string dispmsg, Color bColor, Color bColor2, Color fcolor, Color shadow, Boolean blank = false) + { + + //if (lbMsg.ProgressEnable == true) lbMsg.ProgressEnable = false; + if (dispmsg != lbMsg.Text || lbMsg.ForeColor != fcolor || lbMsg.ShadowColor != shadow || (lbMsg.BackColor != bColor && lbMsg.BackColor2 != bColor)) + { + lbMsg.BackColor = bColor; + lbMsg.BackColor2 = bColor2; + lbMsg.ForeColor = fcolor; + lbMsg.ShadowColor = shadow; + lbMsg.Text = dispmsg; + if (blank) lbMsg.Tag = "BLANK"; + else lbMsg.Tag = null; + } + } + + + void UpdateResultMessage() + { + //모션을 사용한다면 홈 검색여부를 확인한다. + + //var inspresult = ""; + //if (Pub.Result == null || Pub.Result.Result == CResult.eInspectResult.NOTSET) + // inspresult = "--"; + //else if (Pub.Result.Result == CResult.eInspectResult.OK) + // inspresult = "MATCH"; + //else if (Pub.Result.Result == CResult.eInspectResult.NG) + // inspresult = "MISMATCH"; + + + //최우선 점검 사항 표시 + if (Pub.sm.Step > eSMStep.INIT) + { + if (Pub.flag.get(eFlag.DemoRun)) + { + UpdateStatusMessage("DEMO RUN", Color.Gold, Color.Yellow, Color.Black, Color.WhiteSmoke, true); + } + + + else if (Pub.flag.get(eFlag.START) == true) + { + UpdateStatusMessage("매거진투입구 안전센서 감지", Color.Tomato, Color.Black); + } + else if (Pub.Result.Model.Title == "") + { + UpdateStatusMessage("비젼모델 선택이 필요함", Color.Tomato, Color.Black); + } + + if (Pub.sm.Step == eSMStep.IDLE) + { + UpdateStatusMessage("준비완료", Color.Lime, Color.Black); + } + else if (Pub.sm.Step == eSMStep.ERROR) + { + UpdateStatusMessage("오류 발생", Color.Red, Color.Black); + } + else if (Pub.sm.Step == eSMStep.PAUSE) + { + UpdateStatusMessage("정지 됨", Color.Tomato, Color.Black); + } + else if (Pub.sm.Step == eSMStep.FINISH) + UpdateStatusMessage("작업 완료", Color.Lime, Color.Black); + else if (Pub.sm.bPause == true) + { + UpdateStatusMessage("[START]를 누르면 시작 됩니다", Color.Yellow, Color.Black); + } + else if (Pub.flag.get(eFlag.TestRun)) + { + UpdateStatusMessage("TEST RUN", Color.DeepSkyBlue, Color.LightSkyBlue, Color.Blue, Color.WhiteSmoke, true); + } + else + { + + string msg = "진행중"; + UpdateStatusMessage(msg, Color.Lime, Color.Black); + } + } + } + } +} diff --git a/Cs_HMI/SubProject/AGV/Command.cs b/Cs_HMI/SubProject/AGV/Command.cs new file mode 100644 index 0000000..c94ef1c --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Command.cs @@ -0,0 +1,246 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel; +using System.Threading; +using System.Threading.Tasks; +using System.Collections; +using COMM; +using System.Security.Cryptography.X509Certificates; + +namespace arDev +{ + public partial class Narumi : arRS232 + { + + public bool AGVMoveSet(BunkiData opt) + { + return AddCommand(eAgvCmd.MoveSet, opt.ToString()); + } + + public bool AGVMoveManual(ManulOpt opt, Speed spd, Sensor ss) + { + var param = opt.ToString() + spd.ToString()[0] + ((int)ss).ToString(); + return AddCommand(eAgvCmd.ManualMove, param); + } + public bool AGVMoveRun(eRunOpt opt = eRunOpt.NotSet) + { + System.Text.StringBuilder sb = new StringBuilder(); + if (opt == eRunOpt.Backward) sb.Append("B"); + else if (opt == eRunOpt.Forward) sb.Append("F"); + else sb.Append("0"); + sb.Append("000"); + return AddCommand(eAgvCmd.MoveStart, sb.ToString()); + } + + public bool AGVSetSpeed(eSetSpeed item, int speed) + { + string cmd = "SS"; + if (item == eSetSpeed.Rotation) cmd = "SRS"; + else cmd += item.ToString()[0]; + cmd += speed.ToString("0000"); + return AddCommand(cmd); + + } + public bool AGVMoveStop(string Reason, eStopOpt opt = eStopOpt.Stop) + { + System.Text.StringBuilder sb = new StringBuilder(); + if (opt == eStopOpt.MarkStop) sb.Append("MS"); + else if (opt == eStopOpt.MarkRotateLeft) sb.Append("TL"); + else if (opt == eStopOpt.MarkRotateRight) sb.Append("TR"); + else if (opt == eStopOpt.MarkChangeDirection) sb.Append("BS"); + else sb.Append("0S"); + sb.Append("00"); + sb.Append("0000"); //재기동시간 + if (opt == eStopOpt.MarkStop) + VAR.BOOL[eVarBool.NEXTSTOP_MARK] = true; + + //동작중이면 이 멈춤 명령을 기록으로 남긴다 230116 + if (this.system1.agv_run) + RaiseMessage(MessageType.Normal, $"stop command from {Reason}"); + return AddCommand(eAgvCmd.MoveStop, sb.ToString()); + } + public bool AGVCommand(string cmd, string data) + { + return AddCommand(cmd + data); + } + + public bool LiftControl(LiftCommand cmd) + { + return AddCommand(eAgvCmd.LiftControl, cmd.ToString()); + } + public bool AGVCharge(int chargetID, bool on, int waittime = 3) + { + if (on) + return AddCommand(eAgvCmd.ChargeOn, chargetID.ToString("0000")); + else + return AddCommand(eAgvCmd.ChargeOf, chargetID.ToString("0000")); + } + + public bool AGVErrorReset() + { + return AddCommand(eAgvCmd.ErrorReset, "FFFF"); + } + public bool AGVTowerLamp(bool on) + { + return AddCommand(eAgvCmd.TowerLamp, (on ? "I" : "O")); + } + public bool AGVSetAddress(int value) + { + return AddCommand($"SAD{value:0000}"); + } + public bool AGVSetPanID(string value) + { + value = value.PadLeft(4, '0'); + return AddCommand($"SPN{value}"); + } + public bool AGVSetChannel(string value) + { + value = value.PadLeft(4, '0'); + return AddCommand($"SCH{value}"); + } + public bool AGVGateOutTimer(int value) + { + return AddCommand($"SGT{value:0000}"); + } + /// + /// 정지감속주기 및 상수 + /// + /// + public bool AGVSetStopAcc(int interval, int value) + { + var cmds = new string[] { + $"SSK{interval:0000}", + $"SCK{value:0000}" + }; + return AddCommand(cmds); + } + + public bool AGVSetTagReinputTime(int value) + { + return AddCommand($"STT{value:0000}"); + } + public bool AGVSetPID(eSetPIDSpeed speed, int P, int I, int D) + { + var cmd = "S"; + var cmd2 = ""; + if (speed == eSetPIDSpeed.High) cmd2 = "K"; + else if (speed == eSetPIDSpeed.Middle) cmd2 = "M"; + else if (speed == eSetPIDSpeed.Low) cmd2 = "L"; + else if (speed == eSetPIDSpeed.Stop) cmd2 = "S"; + + var cmds = new string[] { + $"{cmd}P{cmd2}{P:0000}", + $"{cmd}I{cmd2}{I:0000}", + $"{cmd}D{cmd2}{D:0000}", + }; + return AddCommand(cmds); + } + protected bool AddCommand(params string[] cmds) + { + bool ret = true; + ACKData = string.Empty; //회신값 제거 + foreach (var cmdline in cmds) + { + var fullcmd = MakeCheckSum(cmdline); + //commandQueue.Enqueue(fullcmd); + if (WriteData(fullcmd) == false) ret = false; + System.Threading.Thread.Sleep(1); + } + return ret; + } + + + protected bool AddCommand(eAgvCmd command, BunkiData param) + { + return AddCommand(command, param.ToString()); + } + + /// + /// CBR커맨드를 사용하여 옵션값을 전송 합니다 + /// 11.분기명령 = CBR + /// + /// + /// + protected bool AddCommand(BunkiData param) + { + return AddCommand(eAgvCmd.MoveSet, param.ToString()); + } + + protected bool AddCommand(eAgvCmd command, string param = "") + { + string cmdString; + bool retval = false; + switch (command) + { + case eAgvCmd.ErrorReset: + cmdString = $"SFR{param}"; + retval = AddCommand(cmdString); + break; + case eAgvCmd.TowerLamp: + cmdString = $"CBZ" + $"0299{param}0000"; + retval = AddCommand(cmdString); + break; + case eAgvCmd.MoveStop: + cmdString = $"CST{param}"; + system1.agv_run_manual = false; + retval = AddCommand(cmdString); + break; + case eAgvCmd.MoveStart: + cmdString = $"CRN{param}"; + retval = AddCommand(cmdString); + break; + + case eAgvCmd.ChargeOf: + cmdString = $"CBT{param}O0003"; ///0003=충전대기시간 + retval = AddCommand(cmdString); + RaiseMessage(arRS232.MessageType.Normal, "충전취소전송"); + break; + case eAgvCmd.ChargeOn: + cmdString = $"CBT{param}I0003"; ///0003=충전대기시간 + retval = AddCommand(cmdString); + RaiseMessage(arRS232.MessageType.Normal, "충전명령전송"); + break; + + case eAgvCmd.GoTurnLeft: + cmdString = $"CTL0000"; + retval = AddCommand(cmdString); + break; + case eAgvCmd.GoTurnRight: + cmdString = $"CTR0000"; + retval = AddCommand(cmdString); + break; + case eAgvCmd.goTurnBack: + cmdString = $"CTB0000"; + retval = AddCommand(cmdString); + break; + case eAgvCmd.CallCancle: + cmdString = $"CCL0{param}010000"; + retval = AddCommand(cmdString); + break; + + + case eAgvCmd.MoveSet: + cmdString = $"CBR{param}"; + retval = AddCommand(cmdString); + break; + case eAgvCmd.ManualMove: + system1.agv_run_manual = true; + cmdString = $"CRT{param}"; + retval = AddCommand(cmdString); + break; + + case eAgvCmd.LiftControl: + cmdString = "CLF" + param.PadRight(6, '0'); + retval = AddCommand(cmdString); + break; + + } + return retval; + } + + } + + +} diff --git a/Cs_HMI/SubProject/AGV/DataEventArgs.cs b/Cs_HMI/SubProject/AGV/DataEventArgs.cs new file mode 100644 index 0000000..2ac94f0 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/DataEventArgs.cs @@ -0,0 +1,19 @@ +using System; + +namespace arDev +{ + public partial class Narumi + { + public class DataEventArgs : EventArgs + { + public DataType DataType { get; set; } + + public DataEventArgs(DataType type) + { + DataType = type; + } + } + } + + +} diff --git a/Cs_HMI/SubProject/AGV/EnumData.cs b/Cs_HMI/SubProject/AGV/EnumData.cs new file mode 100644 index 0000000..4d9dd50 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/EnumData.cs @@ -0,0 +1,213 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace arDev +{ + public partial class Narumi + { + public enum eMoveDir + { + Forward, + Backward, + } + public enum eMoveSpd + { + High, + Middle, + Low, + } + public enum eSetPIDSpeed + { + High, + Middle, + Low, + Stop, + } + public enum eSetSpeed + { + High, + Middle, + Low, + Stop, + Rotation, + } + public enum eBunki + { + Right, + Strate, + Left, + } + + public enum Messagetype + { + Normal, + Error, + Send, + Recv, + } + public enum DataType + { + UNKNOWN, + TAG, + CALL, + STS, + ACK, + NAK, + CCA, + } + public class BunkiData + { + public BunkiData() + { + + } + public BunkiData(char dir, char bunki, char speed) + { + if (dir == 'F') Direction = eMoveDir.Forward; + else if (dir == 'B') Direction = eMoveDir.Backward; + + if (bunki == 'S') Bunki = eBunki.Strate; + else if (bunki == 'L') Bunki = eBunki.Left; + else if (bunki == 'R') Bunki = eBunki.Right; + + if (speed == 'H') this.Speed = eMoveSpd.High; + else if (speed == 'M') this.Speed = eMoveSpd.Middle; + else if (speed == 'L') this.Speed = eMoveSpd.Low; + } + public eMoveDir Direction { get; set; } = eMoveDir.Forward; + public eBunki Bunki { get; set; } = eBunki.Strate; + public eMoveSpd Speed { get; set; } = eMoveSpd.Middle; + public int PBSSensor { get; set; } = 1; + public override string ToString() + { + System.Text.StringBuilder sb = new StringBuilder(); + sb.Append(Direction.ToString()[0]); + sb.Append(Bunki.ToString()[0]); + sb.Append(Speed.ToString()[0]); + sb.Append(PBSSensor.ToString()[0]); + + return sb.ToString(); + } + } + public enum eAgvCmd + { + /// + /// 충전시작 + /// CMD : CBT02{nBatteryNo}I0103 + /// + ChargeOn, + + /// + /// 충전취소 + /// CMD : CBT02{nBatteryNo}O0103 + /// + ChargeOf, + + /// + /// 이동명령(파라미터필요) + /// 이동대상,속도(H,M,L),센서사용여부(1,0) + /// ex) BSLTH0 + /// CMD : CRT{param} + /// + ManualMove, + + /// + /// 기동명령 + /// CMD : CRN0000 + /// + MoveStart, + + /// + /// 분기명령 + /// CMD : CBR{param} + /// + MoveSet, + + /// + /// 정지 명령 + /// CMD : CST0S000000 + /// + MoveStop, + + /// + /// 콜 취소, + /// Param : 번호 char(1) + /// CMD : CCL0{param}010000 + /// + CallCancle, + + /// + /// CMD : CTL0000 + /// + GoTurnLeft, + + /// + /// CMD : CTR0000 + /// + GoTurnRight, + + /// + /// CMD : CTB0000 + /// + goTurnBack, + + /// + /// CMD : CBZ + /// + TowerLamp, + + /// + /// CMD : SFR + /// + ErrorReset, + + /// + /// CMD : CLF + /// + LiftControl, + + /// + /// SS(H/M/L/S) + /// SRS + /// + SetSpeed, + } + public enum eForm + { + DriveControl, + ManualControl, + RouteSelect, + Setting, + ModeChange, + } + public enum eNotify + { + ReadTag, + IpAddresschanged, + NameChanged, + ReadViewStep, + ReadViewCall, + WatchError, + + /// + /// 통신에서받은 AGV의 상태값이며, 속도 진행 방향을 가지고 있음 + /// Dashboardform 하단에 상태 표시 함 + /// + StatusDisplay, + StatusComm, + StatusRiv, + StatusETC, + + ChangeMode, + /// + /// 편집대상경로는 아래 변수에 저장되어잇음 + /// datamanager.sEditrRoute + /// + EditRoute, + } + + + } +} diff --git a/Cs_HMI/SubProject/AGV/NARUMI.csproj b/Cs_HMI/SubProject/AGV/NARUMI.csproj new file mode 100644 index 0000000..4398b20 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/NARUMI.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7} + Library + Properties + arDevice + Narumi + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + + + + + {14e8c9a5-013e-49ba-b435-efefc77dd623} + CommData + + + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/AGV/Narumi.cs b/Cs_HMI/SubProject/AGV/Narumi.cs new file mode 100644 index 0000000..a7604f3 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Narumi.cs @@ -0,0 +1,586 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel; +using System.Threading; +using System.Threading.Tasks; +using System.Collections; +using COMM; +using System.Security.Cryptography.X509Certificates; + +namespace arDev +{ + public partial class Narumi : arRS232 + { + Hashtable SystemCheck, ErrorCheck; + private Queue Errlog; // 에러발생시 코드 임시 저장용(쓰레드 동기화용) + + + public int nBatteryNo { get; set; } = 0; + + + public Narumi() + { + SystemCheck = new Hashtable(); + SystemCheck.Add(15, "100"); + SystemCheck.Add(14, "9"); + SystemCheck.Add(13, "8"); + SystemCheck.Add(12, "53"); + SystemCheck.Add(11, "3"); + //SystemCheck.Add(10, "66"); + //SystemCheck.Add(9, "56"); + SystemCheck.Add(8, "6"); + SystemCheck.Add(7, "5"); + SystemCheck.Add(6, "60"); + SystemCheck.Add(5, "1"); + SystemCheck.Add(4, "2"); + //SystemCheck.Add(3, "65"); + //SystemCheck.Add(2, "55"); + //SystemCheck.Add(1, "11"); + //SystemCheck.Add(0, "22"); + + ErrorCheck = new Hashtable(); + ErrorCheck.Add(15, "17"); + ErrorCheck.Add(14, "15"); + ErrorCheck.Add(13, "18"); + ErrorCheck.Add(12, "19"); + //ErrorCheck.Add(11, "300"); + ErrorCheck.Add(10, "299"); + ErrorCheck.Add(9, "298"); + ErrorCheck.Add(8, "297"); + ErrorCheck.Add(7, "296"); + //ErrorCheck.Add(6,""); + ErrorCheck.Add(5, "12"); + ErrorCheck.Add(4, "13"); + ErrorCheck.Add(3, "14"); + ErrorCheck.Add(2, "16"); + ErrorCheck.Add(1, "11"); + ErrorCheck.Add(0, "10"); + + Errlog = new Queue(); + MinRecvLength = 4; + + COMM.VAR.Init(128); + } + + + + #region "External Events" + + + /// + /// 분석완료된 데이터 이벤트 + /// + public event EventHandler DataReceive; + + + #endregion + + + protected override bool CustomParser(byte[] buf, out byte[] remainBuffer) + { + List remain = new List(); + + //데이터는 총 34byt 이며 , DD~77로 구성됨 + Boolean bComplete = false; + for (int i = 0; i < buf.Length; i++) + { + var incomByte = buf[i]; + if (bComplete == true) + { + remain.Add(incomByte); + } + else + { + if (incomByte == 0x02) + { + findSTX = true; + tempBuffer.Clear(); + tempBuffer.Add(incomByte); + } + else if (incomByte == 0x03) + { + //데이터가 맞게 수신됨 + //tempBuffer.Add(incomByte); + tempBuffer.Add(incomByte); + findSTX = false; + bComplete = true; + } + else + { + tempBuffer.Add(incomByte); + if (tempBuffer.Count == 150) //data overload + { + findSTX = false; + tempBuffer.Clear(); + bComplete = false; + RaiseMessage(MessageType.Error, "Buffer Over"); + } + } + } + } + + remainBuffer = remain.ToArray(); + return bComplete; + } + + public class Dataframe + { + public byte STX { get; private set; } + public byte ETX { get; private set; } + public byte[] Data { get; private set; } + public string DataString { get; private set; } + public byte[] checksum { get; private set; } = new byte[2]; + public bool Valid { get; private set; } = false; + public string Message { get; private set; } = string.Empty; + public byte[] Buffer { get; private set; } + public string Cmd { get; private set; } = string.Empty; + + public bool Parse(byte[] data, int MinRecvLength = 0) + { + if (data == null || data.Any() == false) + { + this.Message = string.Format("수신 데이터가 없습니다"); + return false; + } + else if (data.Length < 5) + { + this.Message = $"데이터의 길이가 5보다 작습니다 길이={data.Length}"; + return false; + } + else if (MinRecvLength > 0 && data.Length < MinRecvLength) + { + this.Message = $"데이터의 길이가 {MinRecvLength}보다 작습니다 길이={data.Length}"; + return false; + } + else if (data[0] != 0x02 || data[data.Length - 1] != 0x03) + { + this.Message = $"STX/ETX Error"; + return false; + } + Buffer = new byte[data.Length]; + Array.Copy(data, Buffer, data.Length); + STX = data[0]; + ETX = data[data.Length - 1]; + Array.Copy(data, data.Length - 3, checksum, 0, 2); + + Data = new byte[data.Length - 4]; + Array.Copy(data, 1, Data, 0, data.Length - 4); + + if (data.Length > 2) Cmd = System.Text.Encoding.Default.GetString(Data, 0, 3); + + this.DataString = System.Text.Encoding.Default.GetString(Data); + + + Valid = true; + return true; + } + public Dataframe(byte[] buffer = null, int minlen = 0) + { + if (buffer != null) Parse(buffer); + } + } + + public override bool ProcessRecvData(byte[] data) + { + //LastReceiveBuffer + var frame = new Dataframe(data, MinRecvLength); + if (frame.Valid == false) + { + RaiseMessage(arRS232.MessageType.Error, frame.Message); + return false; + } + else if (frame.DataString.StartsWith("$") == false && CheckSum(data) == false) + { + RaiseMessage(arRS232.MessageType.Error, "Checksum Error MSG=" + frame.DataString); + return false; + } + + var retval = true; + + /////////////////////////////////////////////////////////////////////////////// + if (frame.Cmd.Equals("ACK") || frame.Cmd.Equals("NAK")) + { // 응답확인값 수신 : Header(ACX), Length(9), CheckSum 확인 + RevACK(frame); + } + /////////////////////////////////////////////////////////////////////////////// + else if (frame.Cmd.Equals("STS")) + { // AGV 상태 정보 : Header(STS), Length(30), CheckSum 확인 + RevSTS(frame); + } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + else if ((frame.Cmd.Equals("TAG") || frame.Cmd.Equals("CAL") || frame.Cmd.Equals("CCA"))) + { // TAG ID 정보 : Header(STX), Length(13), CheckSum 확인 + RevTAG(frame); + } + else if (frame.DataString.StartsWith("$")) + { + // $로 시작되는 AGV 상태 표시 + //var text_Sts_Etc = Encoding.Default.GetString(bRcvData, 3, bRcvData.Length - 2).TrimStart(' '); //20210311 김정만 - SmartX FrameWork 사용 안함으로 주석처리 + //var sMessageOther = Encoding.Default.GetString(bRcvData, 3, bRcvData.Length - 2).TrimStart(' '); + RaiseMessage(arRS232.MessageType.Normal, "$메세지수신:" + frame.DataString); + } + else + { + try + { + DataReceive?.Invoke(this, new DataEventArgs(DataType.UNKNOWN)); + } + catch (Exception ex) + { + RaiseMessage(arRS232.MessageType.Error, ex.Message); + retval = false; + } + } + return retval; + + + } + + #region [수신] ACK(응답확인값) 분석 + + public string ACKData { get; set; } = string.Empty; + public DateTime ACKtime { get; set; } = DateTime.Now; + private void RevACK(Dataframe frame) + { + //ACKSADA7 + var rcvdNow = frame.DataString; + var bRcvData = frame.Buffer; + + ACKData = rcvdNow.Substring(3); + ACKtime = DateTime.Now; + + if (rcvdNow.StartsWith("ACK")) + { + //RaiseMessage("get ack"); + DataReceive?.Invoke(this, new DataEventArgs(DataType.ACK)); + //if (datamanager.commandQueue.Count != 0) + //{ + // byte[] bCmdData = encoding.GetBytes((String)datamanager.commandQueue.Peek()); + // if (bCmdData[1] == bRcvData[4] && bCmdData[2] == bRcvData[5] && bCmdData[3] == bRcvData[6]) //보낸값이 맞는지 확인후 Dequeue + // { + // nSendCount = 0; + // datamanager.commandQueue.Dequeue(); + // sSendCommandString = ""; + // } + //} + } + else if (rcvdNow.StartsWith("NAK")) + { + //RaiseMessage("get nak"); + DataReceive?.Invoke(this, new DataEventArgs(DataType.NAK)); + //nSendCount = 0; //NAK - 재전송이 날아왔을때 nSendCommandCounter 초기화 + } + } + + #endregion + + public SystemFlag0 system0 = new SystemFlag0(); + public SystemFlag1 system1 = new SystemFlag1(); + public ErrorFlag error = new ErrorFlag(); + public AgvData data = new AgvData(); + public Signal signal = new Signal(); + + #region [수신] STS(AGV상태정보) 분석 + public string LastSTS { get; set; } = string.Empty; + private void RevSTS(Dataframe frame) + { + LastSTS = frame.DataString; + string rcvdNow = frame.DataString; + byte[] bRcvData = frame.Buffer; + var encoding = System.Text.Encoding.Default; + try + { + + // AGV 베터리 잔량 표시 flag (4~6) ///////////////////////////////////////////////////////////////////////////////////////////////////////////// + var idx = 3; + var battery = int.Parse(rcvdNow.Substring(idx, 3)) / 10f;// Convert.ToDouble(encoding.GetString(rcvdNow, 3, 3)) / 10; + idx += 3; + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // AGV 장치연결상태 flag (7~10) //////////////////////////////////////////////////////////////////////////////////////////////////////////// + var nDataTemp = Convert.ToInt16(rcvdNow.Substring(idx, 4), 16); + system0.SetValue(nDataTemp); + idx += 4; + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // AGV Sts(현재 상태) flag (11~14) //////////////////////////////////////////////////////////////////////////////////////////////////////////// + nDataTemp = Convert.ToInt16(rcvdNow.Substring(idx, 4), 16); + system1.SetValue(nDataTemp); + idx += 4; + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // AGV Error flag (15~18)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + nDataTemp = Convert.ToInt16(rcvdNow.Substring(idx, 4), 16); + error.SetValue(nDataTemp); + idx += 4; + + + data.Speed = rcvdNow.Substring(idx, 1)[0]; idx += 1; //L,M.H + data.Sts = rcvdNow.Substring(idx, 1)[0]; idx += 1; //S(직진),L(좌분기),R(우분기) + data.Direction = rcvdNow.Substring(idx, 1)[0]; idx += 1; //F,B,L,R + data.guidesensor = int.Parse(rcvdNow.Substring(idx, 1)); idx += 1; //가이드 좌측부터 1~9 + + nDataTemp = Convert.ToByte(rcvdNow.Substring(idx, 2), 16); + signal.SetValue(nDataTemp); + + //data.Sts = encoding.GetString(bRcvData, 19, 3); //20210311 김정만 - SmartX FrameWork 사용 안함으로 주석처리 + + //var Sts_cSpeed = encoding.GetString(bRcvData, 19, 1)[0]; + //var Sts_cDirection = encoding.GetString(bRcvData, 20, 1)[0]; + //var Sts_cFB = encoding.GetString(bRcvData, 21, 1)[0]; + + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////가이드센서 정보 (22)////////////////////////////////////////////////////////////////////////////////////////////////////////// + //var Sts_nGuide = 0; + //if (bRcvData[22] > 47 && bRcvData[22] < 58) { Sts_nGuide = Convert.ToInt32(encoding.GetString(bRcvData, 22, 1)); } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////마크센서 & 포토센서 정보 (23~24)//////////////////////////////////////////////////////////////////////////////////////////////////// + //nDataTemp = Convert.ToInt32(encoding.GetString(bRcvData, 23, 2), 16); + + //data.Sts_bMark1 = Convert.ToBoolean(nDataTemp & 0x4); + //data.Sts_bMark2 = Convert.ToBoolean(nDataTemp & 0x8); + //data.Sts_bCargo = Convert.ToBoolean(nDataTemp & 0x10); + + ////포토센서 + //if (Sts_cFB == 'F') + //{ + // system.Sts_nSenser = Convert.ToInt32(encoding.GetString(bRcvData, 26, 1)); + //} + //else if (Sts_cFB == 'B') + //{ + // system.Sts_nSenser = Convert.ToInt32(encoding.GetString(bRcvData, 27, 1)); + //} + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //AGV 속도/분기/방향 (19~21)////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + DataReceive?.Invoke(this, new DataEventArgs(DataType.STS)); + + } + catch (Exception ex) + { + RaiseMessage(MessageType.Error, $"Parse Error(STS) = {ex.Message}"); + } + } + + #endregion + + + + + + + #region [수신] TAG(태그정보) 분석 + + System.Text.Encoding encoding = System.Text.Encoding.Default; + string old_TagString = string.Empty; + string old_CALString = string.Empty; + string old_CCAString = string.Empty; + private void RevTAG(Dataframe frame) + { + string rcvdNow = frame.DataString; + byte[] bRcvData = frame.Buffer; + if (rcvdNow.StartsWith("TAG")) + { + //221123 chi 숫자로변경 + var tagnostr = rcvdNow.Substring(3); + if (int.TryParse(tagnostr, out int tagnoint)) + { + var Changed = !old_TagString.Equals(tagnostr); + data.TagString = tagnostr; + data.TagNo = tagnoint; + old_TagString = tagnostr; + DataReceive?.Invoke(this, new DataEventArgs(DataType.TAG)); + } + + WriteData(MakeCheckSum("ACKTAG")); + + } + else if (rcvdNow.StartsWith("CAL")) + { + + var tagnostr = encoding.GetString(bRcvData, 4, 4); + if (int.TryParse(tagnostr, out int tagnoint)) + { + var Changed = !old_CALString.Equals(tagnostr); + data.CallString = tagnostr; + data.CallNo = tagnoint; + old_CALString = tagnostr; + if (Changed) DataReceive?.Invoke(this, new DataEventArgs(DataType.CALL)); + } + WriteData(MakeCheckSum("ACKCAL")); + } + else if (rcvdNow.StartsWith("CCA")) //능동형 Call에 의하여 들어 오는 구문 + { + + var tagnostr = encoding.GetString(bRcvData, 4, 4); + if (int.TryParse(tagnostr, out int tagnoint)) + { + var Changed = !old_CCAString.Equals(tagnostr); + data.CCAString = tagnostr; + data.CCANo = tagnoint; + old_CCAString = tagnostr; + if (Changed) DataReceive?.Invoke(this, new DataEventArgs(DataType.CCA)); + } + WriteData(MakeCheckSum("ACKCCA")); + } + } + #endregion + + private string MakeCheckSum(string sCommand) + { + //sCommand = sCommand.ToUpper(); + + List buffer = new List(); + buffer.Add(0x02); + + //byte[] bCommand = System.Text.ASCIIEncoding.ASCII.GetBytes(sCommand); + buffer.AddRange(System.Text.ASCIIEncoding.ASCII.GetBytes(sCommand)); + + //make sum + int nSum = 0; + for (int nCnt = 1; nCnt < buffer.Count; nCnt++) + nSum += buffer[nCnt]; + + string sSum = nSum.ToString("X2").ToUpper();// Convert.ToString(nSum, 16).ToUpper(); + if (sSum.Length < 2) sSum = "0" + sSum; + sSum = sSum.Substring(sSum.Length - 2); + + //if (sSum.Length == 3) + // sSum = sSum.Remove(0, 1); + //else if (sSum.Length == 4) + // sSum = sSum.Remove(0, 2); + + buffer.AddRange(System.Text.ASCIIEncoding.Default.GetBytes(sSum)); + buffer.Add(0x03); + + // byte[] bStxEtx = { 0x02, 0x03 }; + + + + //var orgstr = (System.Text.ASCIIEncoding.ASCII.GetString(bStxEtx, 0, 1) + sCommand + sSum + System.Text.ASCIIEncoding.ASCII.GetString(bStxEtx, 1, 1)); + var newstr = System.Text.Encoding.Default.GetString(buffer.ToArray()); + return newstr; + + } + + ///// + ///// commandQueue에 명령을 추가합니다(체크섬은 자동 추가됨) + ///// + ///// 체크섬을 제외한 평문 + ///// sendlog 에 추가할 경우 true를 입력하세요 + //public void AddCommand(string cmd, bool addlog = true, int Repeat = 1) + //{ + // var fullcmd = MakeCheckSum(cmd); + // for (int i = 0; i < Repeat; i++) + // commandQueue.Enqueue(fullcmd); + // if (addlog) + // { + // Message?.Invoke(this, new MessageEventArgs() + // } + //} + + public enum eStopOpt + { + Stop = 0, + MarkStop, + MarkRotateLeft, + MarkRotateRight, + MarkChangeDirection, + } + public enum eRunOpt + { + NotSet, + Forward, + Backward, + } + + public enum ManulOpt + { + FS, + BS, + RT, + LT, + FL, + FR, + BL, + BR, + } + public enum Sensor + { + PBSOff = 0, + PBSOn, + AllOn, + } + public enum Speed + { + High, + Mid, + Low, + } + public enum LiftCommand + { + /// + /// lift up + /// + UP, + /// + /// lift down + /// + DN, + /// + /// lift 동작 정지 + /// + STP, + /// + /// magnet holder on + /// + ON, + /// + /// magnet holder off + /// + OFF + } + + + private bool CheckSum(byte[] bData) + { + if (bData.Length < 2) // 데이터 길이가 2이하일 경우 비정상 처리 + return false; + + int nSum = 0; + // byte[] bData = encoding.GetBytes(sData); + + for (int nCnt = 1; nCnt < bData.Length - 3; nCnt++) + { + nSum += bData[nCnt]; + } + + + string sSum = Convert.ToString(nSum, 16).ToUpper(); + + string sCSTemp = string.Empty; + + if (sSum.Length == 3) + sCSTemp = sSum.Remove(0, 1); + else if (sSum.Length == 4) + sCSTemp = sSum.Remove(0, 2); + + if (bData[bData.Length - 2] == '*' && bData[bData.Length - 3] == '*') + return true; + + if (sCSTemp[0] == (char)(bData[bData.Length - 3]) && sCSTemp[1] == (char)(bData[bData.Length - 2])) + return true; + else + return false; + } + + } + + +} diff --git a/Cs_HMI/SubProject/AGV/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/AGV/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e23ba39 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("BMS Commnunication Module")] +[assembly: AssemblyDescription("BMS Commnunication Module")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("ATK4")] +[assembly: AssemblyProduct("BMS Commnunication Module")] +[assembly: AssemblyCopyright("Copyright ©ATK4 2020")] +[assembly: AssemblyTrademark("ATK4")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("7a94c30c-6772-4f71-bf9c-111071a1bc70")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 +// 기본값으로 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("20.03.09.0000")] +[assembly: AssemblyFileVersion("20.03.09.0000")] diff --git a/Cs_HMI/SubProject/AGV/Structure/AgvData.cs b/Cs_HMI/SubProject/AGV/Structure/AgvData.cs new file mode 100644 index 0000000..8faa844 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Structure/AgvData.cs @@ -0,0 +1,50 @@ +using System; + +namespace arDev +{ + public partial class Narumi + { + + public class AgvData + { + public char Sts { get; set; } + public char Speed { get; set; } + public char Direction { get; set; } + + public int guidesensor { get; set; } + + + public string TagString { get; set; } = string.Empty; + public int TagNo { get; set; } = -1; + public string CallString { get; set; } = string.Empty; + public int CallNo { get; set; } = -1; + public string CCAString { get; set; } = string.Empty; + public int CCANo { get; set; } = -1; + + + + + public override string ToString() + { + //모든사태값을 탭으로 구분하여 문자를 생성한다 + var sb = new System.Text.StringBuilder(); + + sb.AppendLine($"[Sts] : {Sts}"); + sb.AppendLine($"[Speed] : {Speed}"); + sb.AppendLine($"[Direction] : {Direction}"); + sb.AppendLine($"[guidesensor] : {guidesensor}"); + + sb.AppendLine($"[TagNo] : {TagNo}"); + sb.AppendLine($"[CallNo] : {CallNo}"); + sb.AppendLine($"[CCANo] : {CCANo}"); + + + return sb.ToString(); + } + + + } + } + + +} diff --git a/Cs_HMI/SubProject/AGV/Structure/ErrorFlag.cs b/Cs_HMI/SubProject/AGV/Structure/ErrorFlag.cs new file mode 100644 index 0000000..e8ebb06 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Structure/ErrorFlag.cs @@ -0,0 +1,99 @@ +using System; + +namespace arDev +{ + public partial class Narumi + { + + public class ErrorFlag + { + private COMM.Flag _value { get; set; } = new COMM.Flag(16); + public void SetValue(Int16 value) { this._value.writeValue(value); } + public UInt16 Value + { + get + { + return (UInt16)_value.Value; + } + } + public enum eflag + { + Emergency = 0, + Overcurrent, + Charger_run_error, + Charger_pos_error, + line_out_error = 4, + + /// + /// 기동시 자석 감지 에러 + /// + runerror_by_no_magent_line, + /// + /// 호출제어기 통신 오류 + /// + controller_comm_error = 11, + /// + /// 도착경보기 통신 오류 + /// + arrive_ctl_comm_error, + + /// + /// 자동문제어기 통신 오류 + /// + door_ctl_comm_error, + + /// + /// 자동충전기 통신 오류 + /// + charger_comm_error, + + /// + /// 교차로 제어기 통신 오류 + /// + cross_ctrl_comm_error, + } + + public bool GetValue(eflag idx) + { + return _value.Get((int)idx); + } + public bool GetChanged(eflag idx) + { + return _value.GetChanged((int)idx); + } + + public bool Emergency { get { return GetValue(eflag.Emergency); } } + public bool Overcurrent { get { return GetValue(eflag.Overcurrent); } } + public bool Charger_run_error { get { return GetValue(eflag.Charger_run_error); } } + public bool Charger_pos_error { get { return GetValue(eflag.Charger_pos_error); } } + public bool line_out_error { get { return GetValue(eflag.line_out_error); } } + public bool runerror_by_no_magent_line { get { return GetValue(eflag.runerror_by_no_magent_line); } } + public bool controller_comm_error { get { return GetValue(eflag.controller_comm_error); } } + public bool arrive_ctl_comm_error { get { return GetValue(eflag.arrive_ctl_comm_error); } } + public bool door_ctl_comm_error { get { return GetValue(eflag.door_ctl_comm_error); } } + public bool charger_comm_error { get { return GetValue(eflag.charger_comm_error); } } + public bool cross_ctrl_comm_error { get { return GetValue(eflag.cross_ctrl_comm_error); } } + public override string ToString() + { + //모든사태값을 탭으로 구분하여 문자를 생성한다 + var sb = new System.Text.StringBuilder(); + for (int i = 0; i < 16; i++) + { + var def = Enum.IsDefined(typeof(eflag), i); + if (def) + { + var flag = (eflag)i; + var value = _value.Get(i); + sb.AppendLine($"[{i:00}][{flag}] : {value}"); + } + + + } + return sb.ToString(); + } + } + + } + + +} diff --git a/Cs_HMI/SubProject/AGV/Structure/Signals.cs b/Cs_HMI/SubProject/AGV/Structure/Signals.cs new file mode 100644 index 0000000..42677cb --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Structure/Signals.cs @@ -0,0 +1,72 @@ +using System; + +namespace arDev +{ + public partial class Narumi + { + + public class Signal + { + private COMM.Flag _value { get; set; } = new COMM.Flag(16); + public void SetValue(Int16 value) { this._value.writeValue(value); } + public UInt16 Value + { + get + { + return (UInt16)_value.Value; + } + } + public enum eflag + { + front_gate_out = 0, + rear_sensor_out, + mark_sensor_1, + mark_sensor_2, + front_left_sensor, + front_right_sensor, + front_center_sensor, + charger_align_sensor, + } + + public bool GetValue(eflag idx) + { + return _value.Get((int)idx); + } + public bool GetChanged(eflag idx) + { + return _value.GetChanged((int)idx); + } + + public Boolean front_gate_out { get { return GetValue(eflag.front_gate_out); } } + public Boolean rear_sensor_out { get { return GetValue(eflag.rear_sensor_out); } } + public Boolean mark_sensor_1 { get { return GetValue(eflag.mark_sensor_1); } } + public Boolean mark_sensor_2 { get { return GetValue(eflag.mark_sensor_2); } } + public Boolean mark_sensor { get { return mark_sensor_1 || mark_sensor_2; } } + public Boolean front_left_sensor { get { return GetValue(eflag.front_left_sensor); } } + public Boolean front_right_sensor { get { return GetValue(eflag.front_right_sensor); } } + public Boolean front_center_sensor { get { return GetValue(eflag.front_center_sensor); } } + public Boolean charger_align_sensor { get { return GetValue(eflag.charger_align_sensor); } } + public override string ToString() + { + //모든사태값을 탭으로 구분하여 문자를 생성한다 + var sb = new System.Text.StringBuilder(); + for (int i = 0; i < 16; i++) + { + var def = Enum.IsDefined(typeof(eflag), i); + if(def) + { + var flag = (eflag)i; + var value = _value.Get(i); + sb.AppendLine($"[{i:00}][{flag}] : {value}"); + } + + } + return sb.ToString(); + } + + } + + } + + +} diff --git a/Cs_HMI/SubProject/AGV/Structure/SystemFlag0.cs b/Cs_HMI/SubProject/AGV/Structure/SystemFlag0.cs new file mode 100644 index 0000000..5e3b2ba --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Structure/SystemFlag0.cs @@ -0,0 +1,77 @@ +using System; + +namespace arDev +{ + public partial class Narumi + { + + public class SystemFlag0 + { + private COMM.Flag _value { get; set; } = new COMM.Flag(16); + public void SetValue(Int16 value) { this._value.writeValue(value); } + public UInt16 Value + { + get + { + return (UInt16)_value.Value; + } + } + + public enum eflag + { + Memory_RW_State = 5, + EXT_IO_Conn_State, + RFID_Conn_State, + M5E_Module_Run_State = 8, + Front_Ultrasonic_Conn_State, + Front_Untrasonic_Sensor_State, + Side_Ultrasonic_Conn_State, + Side_Ultrasonic_Sensor_State = 12, + Front_Guide_Sensor_State, + Rear_Guide_Sensor_State, + Battery_Level_Check + } + + public bool GetValue(eflag idx) + { + return _value.Get((int)idx); + } + public bool GetChanged(eflag idx) + { + return _value.GetChanged((int)idx); + } + public bool Memory_RW_State { get { return GetValue(eflag.Memory_RW_State); } } + public bool EXT_IO_Conn_State { get { return GetValue(eflag.EXT_IO_Conn_State); } } + public bool RFID_Conn_State { get { return GetValue(eflag.RFID_Conn_State); } } + public bool M5E_Module_Run_State { get { return GetValue(eflag.M5E_Module_Run_State); } } + public bool Front_Ultrasonic_Conn_State { get { return GetValue(eflag.Front_Ultrasonic_Conn_State); } } + public bool Front_Untrasonic_Sensor_State { get { return GetValue(eflag.Front_Untrasonic_Sensor_State); } } + public bool Side_Ultrasonic_Conn_State { get { return GetValue(eflag.Side_Ultrasonic_Conn_State); } } + public bool Side_Ultrasonic_Sensor_State { get { return GetValue(eflag.Side_Ultrasonic_Sensor_State); } } + public bool Front_Guide_Sensor_State { get { return GetValue(eflag.Front_Guide_Sensor_State); } } + public bool Rear_Guide_Sensor_State { get { return GetValue(eflag.Rear_Guide_Sensor_State); } } + public bool Battery_Level_Check { get { return GetValue(eflag.Battery_Level_Check); } } + + public override string ToString() + { + //모든사태값을 탭으로 구분하여 문자를 생성한다 + var sb = new System.Text.StringBuilder(); + for(int i = 0; i < 16; i++) + { + var def = Enum.IsDefined(typeof(eflag), i); + if (def) + { + var flag = (eflag)i; + var value = _value.Get(i); + sb.AppendLine($"[{i:00}][{flag}] : {value}"); + } + + } + return sb.ToString(); + } + } + + } + + +} diff --git a/Cs_HMI/SubProject/AGV/Structure/SystemFlag1.cs b/Cs_HMI/SubProject/AGV/Structure/SystemFlag1.cs new file mode 100644 index 0000000..2207285 --- /dev/null +++ b/Cs_HMI/SubProject/AGV/Structure/SystemFlag1.cs @@ -0,0 +1,97 @@ +using System; + +namespace arDev +{ + public partial class Narumi + { + + public class SystemFlag1 + { + private COMM.Flag _value { get; set; } = new COMM.Flag(16); + public void SetValue(Int16 value) { this._value.writeValue(value); } + + public UInt16 Value + { + get + { + return (UInt16)_value.Value; + } + } + public enum eflag + { + Side_Detect_Ignore = 3, + Melody_check, + Mark2_check, + Mark1_check, + gateout_check, + Battery_charging = 8, + re_Start, + + /// + /// 전방 감지 무시 + /// + front_detect_ignore, + + /// + /// 전방장애물감지상태 + /// + front_detect_check, + + /// + /// 전방감지 후 정지 상태 + /// + stop_by_front_detect = 12, + /// + /// 교차로 진입 후 정지 상태 + /// + stop_by_cross_in, + agv_stop, + agv_run + } + + public bool GetValue(eflag idx) + { + return _value.Get((int)idx); + } + public bool GetChanged(eflag idx) + { + return _value.GetChanged((int)idx); + } + public bool Side_Detect_Ignore { get { return GetValue(eflag.Side_Detect_Ignore); } } + public bool Melody_check { get { return GetValue(eflag.Melody_check); } } + public bool Mark2_check { get { return GetValue(eflag.Mark2_check); } } + public bool Mark1_check { get { return GetValue(eflag.Mark1_check); } } + public bool gateout_check { get { return GetValue(eflag.gateout_check); } } + public bool Battery_charging { get { return GetValue(eflag.Battery_charging); } } + public bool re_Start { get { return GetValue(eflag.re_Start); } } + public bool front_detect_ignore { get { return GetValue(eflag.front_detect_ignore); } } + public bool front_detect_check { get { return GetValue(eflag.front_detect_check); } } + public bool stop_by_front_detect { get { return GetValue(eflag.stop_by_front_detect); } } + public bool stop_by_cross_in { get { return GetValue(eflag.stop_by_cross_in); } } + public bool agv_stop { get { return GetValue(eflag.agv_stop); } } + public bool agv_run { get { return GetValue(eflag.agv_run); } } + public bool agv_run_manual { get; set; } + public override string ToString() + { + //모든사태값을 탭으로 구분하여 문자를 생성한다 + var sb = new System.Text.StringBuilder(); + for (int i = 0; i < 16; i++) + { + var def = Enum.IsDefined(typeof(eflag), i); + if (def) + { + var flag = (eflag)i; + var value = _value.Get(i); + sb.AppendLine($"[{i:00}][{flag}] : {value}"); + } + + } + return sb.ToString(); + } + + } + + } + + +} diff --git a/Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.Designer.cs b/Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.Designer.cs new file mode 100644 index 0000000..80eb48e --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.Designer.cs @@ -0,0 +1,37 @@ + +namespace AGVControl +{ + partial class BatteryLevelGauge + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.cs b/Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.cs new file mode 100644 index 0000000..e6e371f --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/BatteryLevelGauge.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AGVControl +{ + public partial class BatteryLevelGauge : Control + { + float _vlevel = 50; + public float VLevel { get { return _vlevel; } set { _vlevel = value; } } + public float Volt { get; set; } = 0; + public String sign { get; set; } = "%"; + public float CurA { get; set; } = 0; + public float MaxA { get; set; } = 0; + + bool isopen = false; + public Boolean IsOpen { get { return isopen; } set { isopen = value; this.Invalidate(); } } + + public Color BorderColor { get; set; } = Color.DimGray; + + public BatteryLevelGauge() + { + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + this.Resize += arLabel_Resize; + } + + + protected override void OnPaint(PaintEventArgs pe) + { + pe.Graphics.InterpolationMode = InterpolationMode.High; + pe.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + pe.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + //base.OnPaint(pe); + pe.Graphics.FillRectangle(new SolidBrush(BackColor), DisplayRectangle); + + var r = new RectangleF(this.DisplayRectangle.Left + Padding.Left, + this.DisplayRectangle.Top + Padding.Top, + this.DisplayRectangle.Width - Padding.Left - Padding.Right, + this.DisplayRectangle.Height - Padding.Top - Padding.Bottom); + + pe.Graphics.FillRectangle(new SolidBrush(this.BackColor), r); + + + var w = r.Width * (this.VLevel / 100f); + var lr = new RectangleF(r.Left, r.Top, w, r.Height); + + Color bColor = Color.Red; + if (VLevel > 80) bColor = Color.YellowGreen; + else if (VLevel > 60) bColor = Color.Yellow; + else if (VLevel > 40) bColor = Color.Orange; + else if (VLevel > 20) bColor = Color.Tomato; + else bColor = Color.Red; + pe.Graphics.FillRectangle(new SolidBrush(bColor), lr); + + Color textcolor = this.ForeColor; + if (IsOpen == false) textcolor = Color.Black; + var smg = IsOpen ? $"{ this.VLevel:N0}{ this.sign}" : "연결안됨"; + + pe.Graphics.DrawString(smg, this.Font, new SolidBrush(textcolor), r, + new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }); + + pe.Graphics.DrawRectangle(Pens.Black, r.Left, r.Top, r.Width, r.Height); + + + } + void arLabel_Resize(object sender, EventArgs e) + { + Invalidate(); + } + } +} diff --git a/Cs_HMI/SubProject/AGVControl/GuideSensor.Designer.cs b/Cs_HMI/SubProject/AGVControl/GuideSensor.Designer.cs new file mode 100644 index 0000000..6e879bd --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/GuideSensor.Designer.cs @@ -0,0 +1,37 @@ + +namespace Narumi.UC +{ + partial class GuideSensor + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/AGVControl/GuideSensor.cs b/Cs_HMI/SubProject/AGVControl/GuideSensor.cs new file mode 100644 index 0000000..ad196f6 --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/GuideSensor.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Narumi.UC +{ + public partial class GuideSensor : Control + { + public int SensorValue { get; set; } = 0; + public bool LMark { get; set; } = false; + public bool RMark { get; set; } = false; + + public GuideSensor() + { + InitializeComponent(); + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + this.Resize += arLabel_Resize; + } + void arLabel_Resize(object sender, EventArgs e) + { + Invalidate(); + } + + protected override void OnPaint(PaintEventArgs pe) + { + var boxcount = 11; + + var r = new RectangleF(this.DisplayRectangle.Left + Padding.Left, + this.DisplayRectangle.Top + Padding.Top, + this.DisplayRectangle.Width - Padding.Left - Padding.Right, + this.DisplayRectangle.Height - Padding.Top - Padding.Bottom); + + var term = 3; + var w = ((r.Width -1) - (term * (boxcount - 1))) / boxcount; + var h = r.Height -1; + + pe.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.DisplayRectangle); + //pe.Graphics.DrawRectangle(Pens.Red, r.Left, r.Top, r.Width, r.Height); + + for (int i = 0; i < boxcount; i++) + { + var x = r.Left + i * term + i * w; + var y = r.Top; + var r2 = new RectangleF(x, y, w, h); + + if (this.Enabled == false) + { + pe.Graphics.FillRectangle(Brushes.LightGray, r2); + } + else + { + + if (i == 0) + { + if (LMark) + pe.Graphics.FillRectangle(Brushes.SkyBlue, r2); + else + pe.Graphics.FillRectangle(Brushes.LightGray, r2); + } + else if (i == 9) + { + if (RMark) + pe.Graphics.FillRectangle(Brushes.SkyBlue, r2); + else + pe.Graphics.FillRectangle(Brushes.LightGray, r2); + } + else + { + if (SensorValue == i) + pe.Graphics.FillRectangle(Brushes.Tomato, r2); + else + pe.Graphics.FillRectangle(Brushes.LightGray, r2); + } + + pe.Graphics.DrawRectangle(Pens.DimGray, r2.Left,r2.Top,r2.Width,r2.Height); + + if (i == 0 || i == 10) + { + pe.Graphics.DrawString("M/K", this.Font, + new SolidBrush(this.ForeColor), r2, + new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }); + } + } + + } + } + } +} diff --git a/Cs_HMI/SubProject/AGVControl/MyRadioButton.Designer.cs b/Cs_HMI/SubProject/AGVControl/MyRadioButton.Designer.cs new file mode 100644 index 0000000..74af0ba --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/MyRadioButton.Designer.cs @@ -0,0 +1,37 @@ + +namespace AGVControl +{ + partial class MyRadioButton + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/AGVControl/MyRadioButton.cs b/Cs_HMI/SubProject/AGVControl/MyRadioButton.cs new file mode 100644 index 0000000..8843fe2 --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/MyRadioButton.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AGVControl +{ + public partial class MyRadioButton : RadioButton + { + public int CheckWidth { get; set; } = 30; + public Color CheckOnColor { get; set; } = Color.OrangeRed; + public Color CheckOffColor { get; set; } = Color.DimGray; + public Color Bordercolor { get; set; } = Color.DimGray; + public int BorderSize { get; set; } = 2; + public int BorderRadius { get; set; } = 7; + public MyRadioButton() + { + InitializeComponent(); + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + this.Resize += arLabel_Resize; + } + + protected override void OnPaint(PaintEventArgs pe) + { + pe.Graphics.InterpolationMode = InterpolationMode.High; + pe.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + pe.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + pe.Graphics.Clear(this.BackColor); + + var XPosition = this.DisplayRectangle.Left; + var YPosition = this.DisplayRectangle.Top; + using (GraphicsPath Path = new GraphicsPath()) + { + Path.AddLine(XPosition + BorderRadius, YPosition, XPosition + Width - (BorderRadius * 2), YPosition); + Path.AddArc(XPosition + Width - (BorderRadius * 2), YPosition, BorderRadius * 2, BorderRadius * 2, 270, 90); + Path.AddLine(XPosition + Width, YPosition + BorderRadius, XPosition + Width, YPosition + Height - (BorderRadius * 2)); + Path.AddArc(XPosition + Width - (BorderRadius * 2), YPosition + Height - (BorderRadius * 2), BorderRadius * 2, BorderRadius * 2, 0, 90); + Path.AddLine(XPosition + Width - (BorderRadius * 2), YPosition + Height, XPosition + BorderRadius, YPosition + Height); + Path.AddArc(XPosition, YPosition + Height - (BorderRadius * 2), BorderRadius * 2, BorderRadius * 2, 90, 90); + Path.AddLine(XPosition, YPosition + Height - (BorderRadius * 2), XPosition, YPosition + BorderRadius); + Path.AddArc(XPosition, YPosition, BorderRadius * 2, BorderRadius * 2, 180, 90); + Path.CloseFigure(); + + + + + var r1 = new Rectangle( + DisplayRectangle.Left, DisplayRectangle.Top, + CheckWidth, + DisplayRectangle.Height - 1); + var r2 = new Rectangle(r1.Right + 3, r1.Top, DisplayRectangle.Width - r1.Width - 3 - Padding.Right, r1.Height); + var CC = Checked ? CheckOnColor : CheckOffColor; + pe.Graphics.FillRectangle(new SolidBrush(CC), r1); + StringFormat sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; + if (this.TextAlign == ContentAlignment.MiddleLeft) sf.Alignment = StringAlignment.Near; + else if (this.TextAlign == ContentAlignment.MiddleRight) sf.Alignment = StringAlignment.Far; + pe.Graphics.DrawString(this.Text, this.Font, new SolidBrush(ForeColor), r2, sf); + //pe.Graphics.DrawRectangle(new Pen(this.Bordercolor, this.BorderSize), DisplayRectangle); + this.Region = new System.Drawing.Region(Path); + + + pe.Graphics.DrawPath(new Pen(this.Bordercolor, this.BorderSize), Path); + + + + } + } + void arLabel_Resize(object sender, EventArgs e) + { + Invalidate(); + } + } +} diff --git a/Cs_HMI/SubProject/AGVControl/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/AGVControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..53f3556 --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("AGVControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AGVControl")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("8cb883c0-99c3-4dd4-b017-f9b92010a806")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 +// 기본값으로 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/SubProject/AGVControl/RoundButton.Designer.cs b/Cs_HMI/SubProject/AGVControl/RoundButton.Designer.cs new file mode 100644 index 0000000..7c57131 --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/RoundButton.Designer.cs @@ -0,0 +1,37 @@ + +namespace AGVControl +{ + partial class RoundButton + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/AGVControl/RoundButton.cs b/Cs_HMI/SubProject/AGVControl/RoundButton.cs new file mode 100644 index 0000000..ad8352b --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/RoundButton.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AGVControl +{ + public partial class RoundButton : Button + { + public int CornerRadius { get; set; } = 7; + public RoundButton() + { + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + this.Resize += arLabel_Resize; + } + + protected override void OnPaint(PaintEventArgs pevent) + { + pevent.Graphics.InterpolationMode = InterpolationMode.High; + pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + pevent.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + var XPosition = this.DisplayRectangle.Left; + var YPosition = this.DisplayRectangle.Top; + using (GraphicsPath Path = new GraphicsPath()) + { + Path.AddLine(XPosition + CornerRadius, YPosition, XPosition + Width - (CornerRadius * 2), YPosition); + Path.AddArc(XPosition + Width - (CornerRadius * 2), YPosition, CornerRadius * 2, CornerRadius * 2, 270, 90); + Path.AddLine(XPosition + Width, YPosition + CornerRadius, XPosition + Width, YPosition + Height - (CornerRadius * 2)); + Path.AddArc(XPosition + Width - (CornerRadius * 2), YPosition + Height - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 0, 90); + Path.AddLine(XPosition + Width - (CornerRadius * 2), YPosition + Height, XPosition + CornerRadius, YPosition + Height); + Path.AddArc(XPosition, YPosition + Height - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 90, 90); + Path.AddLine(XPosition, YPosition + Height - (CornerRadius * 2), XPosition, YPosition + CornerRadius); + Path.AddArc(XPosition, YPosition, CornerRadius * 2, CornerRadius * 2, 180, 90); + Path.CloseFigure(); + this.Region = new System.Drawing.Region(Path); + } + base.OnPaint(pevent); + } + + void arLabel_Resize(object sender, EventArgs e) + { + Invalidate(); + } + + } +} diff --git a/Cs_HMI/SubProject/AGVControl/ValueSelect.Designer.cs b/Cs_HMI/SubProject/AGVControl/ValueSelect.Designer.cs new file mode 100644 index 0000000..24f89d2 --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/ValueSelect.Designer.cs @@ -0,0 +1,36 @@ +namespace AGVControl +{ + partial class ValueSelect + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/AGVControl/ValueSelect.cs b/Cs_HMI/SubProject/AGVControl/ValueSelect.cs new file mode 100644 index 0000000..67f6ea2 --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/ValueSelect.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Runtime.Remoting.Messaging; +using System.Text; +using System.Windows.Forms; + +namespace AGVControl +{ + public partial class ValueSelect : Control + { + public ValueSelect() + { + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + this.Resize += arLabel_Resize; + this.MouseClick += ValueSelect_MouseClick; + this.MouseEnter += (s1, e1) => { this.Cursor = Cursors.Hand; }; + this.MouseLeave += (s1, e1) => { this.Cursor = Cursors.Default; }; + } + + private void ValueSelect_MouseClick(object sender, MouseEventArgs e) + { + //마우스클릭 + if (rectLButton.IsEmpty == false && rectLButton.Contains(e.Location)) + { + if (SideButtonClickValue != 0.0) + { + var newvalue = this.Value - SideButtonClickValue; + if (newvalue < MinValue) newvalue = MinValue; + this.Value = newvalue; + } + + if (ButtonClick != null) ButtonClick(this, new ButtonClickEventArgs(MouseButtons.Left)); + } + + + if (rectRButton.IsEmpty == false && rectRButton.Contains(e.Location)) + { + if (SideButtonClickValue != 0.0) + { + var newvalue = this.Value + SideButtonClickValue; + if (newvalue > MaxValue) newvalue = MaxValue; + this.Value = newvalue; + } + + if (ButtonClick != null) ButtonClick(this, new ButtonClickEventArgs(MouseButtons.Right)); + } + + + if (rectCButton.IsEmpty == false && rectCButton.Contains(e.Location)) + if (ButtonClick != null) ButtonClick(this, new ButtonClickEventArgs(MouseButtons.Middle)); + } + + private Rectangle rectLButton; + private Rectangle rectRButton; + private Rectangle rectCButton; + private Boolean bMakeRect = true; + + private double _minvalue = 0.0; + private double _maxvalue = 9999999999.0; + public double MinValue { get { return _minvalue; } set { _minvalue = value; Invalidate(); } } + + public double MaxValue { get { return _maxvalue; } set { _maxvalue = value; Invalidate(); } } + + + + private UInt16 _decimalposition = 0; + private string _buttonwdith = string.Empty; + private double _value = 0; + private Color _border = Color.Lime; + private double buttongabp; + public double SideButtonClickValue { get { return buttongabp; } set { buttongabp = value; Invalidate(); } } + + private Color _backbutton = Color.White; + private Color _sidebutto = Color.Black; + + public Color BackColorButton { get { return _backbutton; } set { _backbutton = value; Invalidate(); } } + public Color ForeColorButton { get { return _sidebutto; } set { _sidebutto = value; Invalidate(); } } + + + + public Color ColorBorder { get { return _border; } set { _border = value; Invalidate(); } } + + public override string Text + { + get => Value.ToString(); + set + { + if (double.TryParse(value, out double dblval) == true) + this.Value = dblval; + } + } + + public double Value + { + get { return _value; } + set + { + if (_value != value) + { + //이 값이 범위를 초과했는지 확인 + if (value < MinValue) + { + _value = MinValue; + //throw new Exception(string.Format("입력값이 컨트롤의 최소값보다 작습니다(입력:{0},최소값:{1})",value,MinValue)); + } + else if (value > MaxValue) + { + _value = MaxValue; + //throw new Exception(string.Format("입력값이 컨트롤의 최대값보다 작습니다(입력:{0},최대값:{1})", value, MaxValue)); + } + else + { + _value = value; + + } + Invalidate(); + if (ValueChanged != null) ValueChanged(this, new EventArgs()); + } + } + } + public UInt16 DecimalPosition { get { return _decimalposition; } set { _decimalposition = value; Invalidate(); } } + public string ButtonWidth { get { return _buttonwdith; } set { _buttonwdith = value; Invalidate(); } } + + private string _nulldisplay = string.Empty; + public string NullDisplay { get { return _nulldisplay; } set { _nulldisplay = value; Invalidate(); } } + + private Font _sidefont; + public Font FontSideButton { get { if (_sidefont == null) return this.Font; else return _sidefont; } set { _sidefont = value; Invalidate(); } } + + void arLabel_Resize(object sender, EventArgs e) + { + this.bMakeRect = true; + Invalidate(); + } + + public class ButtonClickEventArgs : EventArgs + { + public MouseButtons Button; + public ButtonClickEventArgs(MouseButtons button) + { + this.Button = button; + // Console.WriteLine("button clickc : " +button.ToString()); + } + } + + public event EventHandler ButtonClick; + public event EventHandler ValueChanged; + + protected override void OnPaint(PaintEventArgs pe) + { + //base.OnPaint(pe); + if (bMakeRect) MakeRect(); + + + + StringFormat sf = new StringFormat(); + sf.Alignment = StringAlignment.Center; + sf.LineAlignment = StringAlignment.Center; + sf.Trimming = StringTrimming.None; + sf.FormatFlags = StringFormatFlags.NoWrap; + + //좌측버튼표시 + if (rectLButton.IsEmpty == false) + { + pe.Graphics.FillRectangle(new SolidBrush(BackColorButton), rectLButton); + pe.Graphics.DrawString("<<", this.FontSideButton, new SolidBrush(this.ForeColorButton), rectLButton, sf); + } + + if (rectRButton.IsEmpty == false) + { + pe.Graphics.FillRectangle(new SolidBrush(BackColorButton), rectRButton); + pe.Graphics.DrawString(">>", this.FontSideButton, new SolidBrush(this.ForeColorButton), rectRButton, sf); + } + + //값표시 + string valuestr; + if (Value == 0.0 && string.IsNullOrEmpty(NullDisplay) == false) + valuestr = NullDisplay; + else + valuestr = Value.ToString("N" + DecimalPosition.ToString()); + + pe.Graphics.FillRectangle(new SolidBrush(BackColor), rectCButton); + pe.Graphics.DrawString(valuestr, this.Font, new SolidBrush(this.ForeColor), rectCButton, sf); + sf.Dispose(); + + + //테두리표시 + if (rectLButton.IsEmpty == false) + pe.Graphics.DrawRectangle(new Pen(ColorBorder), rectLButton); + if (rectRButton.IsEmpty == false) + pe.Graphics.DrawRectangle(new Pen(ColorBorder), rectRButton); + pe.Graphics.DrawRectangle(new Pen(ColorBorder), rectCButton); + } + + void MakeRect() + { + int bWidth; + if (string.IsNullOrEmpty(ButtonWidth) == false) + { + if (ButtonWidth.EndsWith("%")) + { + if (int.TryParse(ButtonWidth.Substring(0, ButtonWidth.Length - 1), out bWidth) == false) + bWidth = 0; //숫자로 바꾸는거 실패 + else bWidth = (int)(this.DisplayRectangle.Width * (bWidth / 100.0)); + } + else + { + if (int.TryParse(ButtonWidth, out bWidth) == false) + bWidth = 0; + } + } + else bWidth = 0; + + if (bWidth > 0) + { + int buttongap = 1; + //각버튼간 2px 간격을 띄운다. + bWidth = bWidth - buttongap * 2; + rectLButton = new Rectangle( + DisplayRectangle.Left, + DisplayRectangle.Top, + bWidth, + DisplayRectangle.Height - 1); + + rectCButton = new Rectangle( + rectLButton.Right + buttongap, + DisplayRectangle.Top, + DisplayRectangle.Width - rectLButton.Width * 2 - buttongap * 2, + DisplayRectangle.Height - 1); + + rectRButton = new Rectangle( + rectCButton.Right + buttongap, + DisplayRectangle.Top, + bWidth - 1, + DisplayRectangle.Height - 1); + } + else + { + rectLButton = Rectangle.Empty; + rectRButton = Rectangle.Empty; + rectCButton = new Rectangle(DisplayRectangle.Left, + DisplayRectangle.Top, + DisplayRectangle.Width - 1, + DisplayRectangle.Height - 1); + } + bMakeRect = true; + } + } +} diff --git a/Cs_HMI/SubProject/AGVControl/agvControl.csproj b/Cs_HMI/SubProject/AGVControl/agvControl.csproj new file mode 100644 index 0000000..1857bcc --- /dev/null +++ b/Cs_HMI/SubProject/AGVControl/agvControl.csproj @@ -0,0 +1,81 @@ + + + + + Debug + AnyCPU + {8CB883C0-99C3-4DD4-B017-F9B92010A806} + Library + Properties + AGVControl + AGVControl + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + Component + + + BatteryLevelGauge.cs + + + Component + + + GuideSensor.cs + + + Component + + + MyRadioButton.cs + + + + Component + + + RoundButton.cs + + + Component + + + ValueSelect.cs + + + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/CommData/CommData.csproj b/Cs_HMI/SubProject/CommData/CommData.csproj new file mode 100644 index 0000000..2140b9f --- /dev/null +++ b/Cs_HMI/SubProject/CommData/CommData.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623} + Library + Properties + VarData + VarData + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/CommData/Enum.cs b/Cs_HMI/SubProject/CommData/Enum.cs new file mode 100644 index 0000000..295b01a --- /dev/null +++ b/Cs_HMI/SubProject/CommData/Enum.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace COMM +{ + public enum eVarInt32 + { + PickOnCount = 0, + PickOfCount, + LPickOnCount, + SumQty, + ChargeWaitSec, + + } + public enum eVarUInt32 + { + Spare=0, + } + + public enum eVarDBL + { + LeftJogSpeed, + RightJogSpeed, + CurrentLeftJogSpeed, + CurrentRightJogSpeed, + SpeedOffsetCW, + SpeedOffsetCCW, + MaxSpeedCW, + MaxSpeedCCW, + SQLConnection, + } + + public enum eVarByte + { + None = 0, + /// + /// 충전명련전송횟수 + /// + CHARGE_CMDCNT, + ButtonJog, + DataIndex , + } + + public enum eVarBool + { + //comm area start(0~31) + None = 0, + DebugMode, + SQLCONN, + + //plc area start (32~63) + FLAG_STOPZ = 32, + FLAG_SETUP, + FLAG_SYNC, + FLAG_WAIT, + /// + /// 상태머신이 동작중인가 + /// 장비동작은 AGV_RUN 플래그를 확인 하세요. + /// + FLAG_AUTORUN, + FLAG_MANUALRUN, + FLAG_LIMITHIGH, + FLAG_LIMITLOW, + FLAG_POWERLOSS, + + /// + /// AGV 진행방향(UP = backward, DOWN = forward) + /// + AGVDIR_UP, + + /// + /// 마크센서가 감지되면 활성화됨 + /// (알림용으로도 쓰니 삭제 안됨) + /// + MARK_SENSOR, + MARK_SENSOROFF, + FLAG_LEFT_RUN, + FLAG_RIGHT_RUN, + FLAG_RUN_CMD, + FLAG_GO_CHAGER, + FLAG_NEXTSTOP_ALIGN, + NEXTSTOP_MARK, + + /// + /// mark 1 혹은 2 의 값이 들어오면 설정됨 + /// + //SENSOR_MARK, + CHG_POSERR, + FLAG_CHARGEONA, + FLAG_CHARGEONM, + OVERLOAD, + OVERLOADL, + OVERLOADR, + BATTERY_LOW, + BATTERY_HIGH, + MINSPACE, + CHARGE_CMDCNT, + CHARGE_READY, + CHARGE_WAIT, + + AGV_ERROR, + WAIT_COVER_DOWN, + WAIT_COVER_UP, + EMERGENCY, + + ITEMON, + + + /// + /// 충전시작명령을 전송했다 + /// + WAIT_CHARGEACK, + + + //agv area start ( 64 ~ 95) + + + //area start (96~127) + + } + + public enum eVarString + { + + MCStatus, + DataIndex, + StatusMessage, + JOBType, + JOBCustCode, + SWVersion, + ChargeCheckMsg, + } + + public enum eVarTime + { + LastConnTry_PLC, + LastConn_PLC, + LastRecv_PLC, + + LastConnTry_XBE, + LastConn_XBE, + LastRecv_XBE, + + LastConnTry_BAT, + LastConn_BAT, + LastRecv_BAT, + LastSend_CMD, + LastSend_BAT, + + LastConnTry_AGV, + LastConn_AGV, + LastRecv_AGV, + + /// + /// 상태머신이 IDLE 전환시 설정 + /// + IdleStart, + /// + /// 충전시도시 설정 + /// + ChargeTry, + /// + /// 충전시작(확인)시 설정 + /// + ChargeStart, + + /// + /// 충전종료시점 + /// + ChargeEnd, + /// + /// 장비가동중 READY상태 전환시 설정 + /// + ReadyStart, + + MarkSensorOff, + + /// + /// 상태머신이 RUN되는 경우에 설정 + /// 단 세부스텝이 READY 인 경우는 제외 + /// + RunStart, + + SendChargeOff, + ChargeSearch, + + BatWarnTime, + IdleStopTime, + StatusReporttime, + } + + + +} diff --git a/Cs_HMI/SubProject/CommData/Flag.cs b/Cs_HMI/SubProject/CommData/Flag.cs new file mode 100644 index 0000000..360708d --- /dev/null +++ b/Cs_HMI/SubProject/CommData/Flag.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace COMM +{ + public class Flag + { + public Boolean IsInit; //H/W설정이 안된경우에만 FALSE로 한다 + public string errorMessage; + + public int PortCount; + private UInt64 _value; + private UInt64 _changed; + public string[] Name; + + public UInt64 Value { get { return _value; } } + + public event EventHandler ValueChanged; + public class ValueEventArgs : EventArgs + { + private int _arridx; + private Boolean _oldvalue; + private Boolean _newvalue; + + public int ArrIDX { get { return _arridx; } } + public Boolean OldValue { get { return _oldvalue; } } + public Boolean NewValue { get { return _newvalue; } } + + public ValueEventArgs(int arridx, Boolean oldvalue, Boolean newvalue) + { + _arridx = arridx; + _oldvalue = oldvalue; + _newvalue = newvalue; + } + } + + public Flag(int pcnt) + { + if (pcnt > 64) throw new Exception("Max count is 64"); + PortCount = pcnt; + IsInit = true; + errorMessage = string.Empty; + _value = 0; + _changed = 0; + Name = new string[PortCount]; + for (int i = 0; i < Name.Length; i++) + { + Name[i] = string.Empty; + } + } + + public void writeValue(Int16 val) + { + var NewValue = (ulong)val; + _changed = this._value ^ NewValue; + this._value = NewValue; + } + + //private Boolean readValue(ref UInt64 value, int idx) + //{ + // var offset = (UInt64)(1 << idx); + // return ((value & offset) != 0); + //} + + public Boolean Get(int idx) + { + var offset = (UInt64)(1 << idx); + return (_value & offset) != 0; + } + + /// + /// 변경여부를 확인 합니다 + /// + /// + /// + public Boolean GetChanged(int idx) + { + var offset = (UInt64)(1 << idx); + return (this._changed & offset) != 0; + } + + public void Set(int idx, Boolean value) + { + var oldvalue = Get(idx); + + if (value) + { + var offset = (UInt64)(1 << idx); + _value = _value | offset; + } + else + { + var offset = (UInt64)(~(1 << idx)); + _value = _value & offset; + } + + if (oldvalue != value) + { + if (ValueChanged != null) + ValueChanged(this, new ValueEventArgs(idx, oldvalue, value)); + } + } + + + } +} diff --git a/Cs_HMI/SubProject/CommData/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/CommData/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..428bb8c --- /dev/null +++ b/Cs_HMI/SubProject/CommData/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("VarData")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("VarData")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("14e8c9a5-013e-49ba-b435-efefc77dd623")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 +// 기본값으로 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/SubProject/CommData/RS232.cs b/Cs_HMI/SubProject/CommData/RS232.cs new file mode 100644 index 0000000..e3f9c7a --- /dev/null +++ b/Cs_HMI/SubProject/CommData/RS232.cs @@ -0,0 +1,487 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading; + +namespace arDev +{ + public abstract partial class arRS232 : IDisposable + { + protected System.IO.Ports.SerialPort _device; + protected ManualResetEvent _mre; + protected byte[] LastReceiveBuffer = new byte[] { }; + /// + /// 최종 전송 메세지 + /// + public byte[] lastSendBuffer = new byte[] { }; + + protected List tempBuffer = new List(); + protected Boolean findSTX = false; + public string errorMessage { get; set; } + public DateTime LastConnTime { get; set; } + public DateTime LastConnTryTime { get; set; } + public DateTime lastSendTime; + /// + /// 메세지 수신시 사용하는 내부버퍼 + /// + protected List _buffer = new List(); + + + // public byte[] LastRecvData; + public string LastRecvString + { + get + { + if (LastReceiveBuffer == null) return String.Empty; + else return System.Text.Encoding.Default.GetString(LastReceiveBuffer); + } + } + /// + /// 마지막으로 데이터를 받은 시간 + /// + public DateTime lastRecvTime; + + + public int WriteError = 0; + public string WriteErrorMessage = string.Empty; + public int WaitTimeout { get; set; } = 1000; + public int MinRecvLength { get; set; } = 1; + /// + /// 포트이름 + /// + [Description("시리얼 포트 이름")] + [Category("설정"), DisplayName("Port Name")] + public string PortName + { + get + { + if (_device == null) return string.Empty; + else return _device.PortName; + } + set + { + if (this.IsOpen) + { + Message?.Invoke(this, new MessageEventArgs("포트가 열려있어 포트이름을 변경할 수 없습니다", true)); + } + else if (String.IsNullOrEmpty(value) == false) + _device.PortName = value; + else + { + Message?.Invoke(this, new MessageEventArgs("No PortName", true)); + } + } + } + + public int BaudRate + { + get + { + if (_device == null) return 0; + else return _device.BaudRate; + } + set + { + if (this.IsOpen) + { + Message?.Invoke(this, new MessageEventArgs("포트가 열려있어 BaudRate(를) 변경할 수 없습니다", true)); + } + else if (value != 0) + _device.BaudRate = value; + else Message?.Invoke(this, new MessageEventArgs("No baud rate", true)); + } + } + + + public arRS232() + { + _device = new System.IO.Ports.SerialPort(); + this.BaudRate = 9600; + + _device.DataReceived += barcode_DataReceived; + _device.ErrorReceived += this.barcode_ErrorReceived; + _device.WriteTimeout = 5000; + _device.ReadTimeout = 5000; + // _device.DtrEnable = false; + _device.ReadBufferSize = 8192; + _device.WriteBufferSize = 8192; + + errorMessage = string.Empty; + lastRecvTime = DateTime.Parse("1982-11-23"); + LastConnTime = DateTime.Parse("1982-11-23"); + LastConnTryTime = DateTime.Parse("1982-11-23"); + lastRecvTime = DateTime.Parse("1982-11-23"); + this._mre = new ManualResetEvent(true); + } + + ~arRS232() + { + Dispose(false); + } + + + // Flag: Has Dispose already been called? + bool disposed = false; + + // Public implementation of Dispose pattern callable by consumers. + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + // Protected implementation of Dispose pattern. + protected virtual void Dispose(bool disposing) + { + if (disposed) + return; + + if (disposing) + { + // Free any other managed objects here. + // + } + + _device.DataReceived -= barcode_DataReceived; + _device.ErrorReceived -= this.barcode_ErrorReceived; + + // Free any unmanaged objects here. + // + disposed = true; + } + + public Boolean Open() + { + try + { + _device.Open(); + return IsOpen; + } + catch (Exception ex) + { + errorMessage = ex.Message; + Message.Invoke(this, new MessageEventArgs(ex.Message, true)); + return false; + } + } + public string GetHexString(Byte[] input) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + foreach (byte b in input) + sb.Append(" " + b.ToString("X2")); + return sb.ToString(); + } + + /// + /// 포트가 열려있는지 확인 + /// + [Description("현재 시리얼포트가 열려있는지 확인합니다")] + [Category("정보"), DisplayName("Port Open")] + public Boolean IsOpen + { + get + { + if (_device == null) return false; + return _device.IsOpen; + } + } + + public virtual void Close(Boolean PortClose = true) + { + if (_device != null && _device.IsOpen) + { + _device.DiscardInBuffer(); + _device.DiscardOutBuffer(); + if (PortClose) _device.Close(); //dispose에서는 포트를 직접 클리어하지 않게 해뒀다. + } + } + protected Boolean RaiseRecvData() + { + return RaiseRecvData(LastReceiveBuffer.ToArray(), false); + } + /// + /// 수신받은 메세지를 발생 시킵니다 + /// + /// + /// + public virtual Boolean RaiseRecvData(byte[] Data, bool udpatelastbuffer) + { + //181206 - 최종수신 메세지 기록 + lastRecvTime = DateTime.Now; + if (udpatelastbuffer && Data != null) + { + if (LastReceiveBuffer == null || LastReceiveBuffer.Length != Data.Length) + { + LastReceiveBuffer = new byte[Data.Length]; + Array.Copy(Data, LastReceiveBuffer, Data.Length); + } + } + + try + { + Message?.Invoke(this, new MessageEventArgs(Data, true)); //recvmessage + if (ProcessRecvData(Data) == false) + { + //Message?.Invoke(this, new MessageEventArgs(Data, true)); //recvmessage + Message?.Invoke(this, new MessageEventArgs(this.errorMessage, true)); //errormessage + return false; + } + else + { + + return true; + } + } + catch (Exception ex) + { + this.errorMessage = ex.Message; + this.Message?.Invoke(this, new MessageEventArgs(ex.Message, true)); + return false; + } + } + + /// + /// 수신받은 자료를 처리한다 + /// + /// + /// + public abstract bool ProcessRecvData(byte[] data); + + #region "Internal Events" + + void barcode_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e) + { + Message?.Invoke(this, new MessageEventArgs(e.ToString(), true)); + } + + byte[] buffer = new byte[] { }; + void barcode_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) + { + + try + { + int ReadCount = _device.BytesToRead; + + buffer = new byte[ReadCount]; + _device.Read(buffer, 0, buffer.Length); + + System.Text.StringBuilder LogMsg = new StringBuilder(); + + byte[] remainBuffer; + Repeat: + if (CustomParser(buffer, out remainBuffer)) + { + //분석완료이므로 받은 데이터를 버퍼에 기록한다 + if (LastReceiveBuffer == null || (LastReceiveBuffer.Length != tempBuffer.Count)) + Array.Resize(ref LastReceiveBuffer, tempBuffer.Count); + Array.Copy(tempBuffer.ToArray(), LastReceiveBuffer, tempBuffer.Count); + tempBuffer.Clear(); + + //수신메세지발생 + RaiseRecvData(); + if (remainBuffer != null && remainBuffer.Length > 0) + { + //버퍼를 변경해서 다시 전송을 해준다. + Array.Resize(ref buffer, remainBuffer.Length); + Array.Copy(remainBuffer, buffer, remainBuffer.Length); + goto Repeat; //남은 버퍼가 있다면 진행을 해준다. + } + } + + } + catch (Exception ex) + { + if (IsOpen) + { + //_device.DiscardInBuffer(); + //_device.DiscardOutBuffer(); + } + errorMessage = ex.Message; + this.Message?.Invoke(this, new MessageEventArgs(ex.Message, true)); + } + + } + + + #endregion + + #region "External Events" + + + /// + /// 오류 및 기타 일반 메세지 + /// + public event EventHandler Message; + + #endregion + + #region "Event Args" + + /// + /// 데이터를 수신할떄 사용함(RAW 포함) + /// + public class ReceiveDataEventArgs : EventArgs + { + private byte[] _buffer = null; + + /// + /// 바이트배열의 버퍼값 + /// + public byte[] Value { get { return _buffer; } } + + /// + /// 버퍼(바이트배열)의 데이터를 문자로 반환합니다. + /// + public string StrValue + { + get + { + //return string.Empty; + + if (_buffer == null || _buffer.Length < 1) return string.Empty; + else return System.Text.Encoding.Default.GetString(_buffer); + } + } + public ReceiveDataEventArgs(byte[] buffer) + { + _buffer = buffer; + } + } + + /// + /// 메세지를 강제 발생 + /// + /// + /// + protected virtual void RaiseMessage(MessageType mt, string message) + { + this.Message?.Invoke(this, new MessageEventArgs(mt, message)); + } + public enum MessageType + { + Normal, + Error, + Send, + Recv, + } + + public class MessageEventArgs : EventArgs + { + public MessageType MsgType { get; set; } + private string _message = string.Empty; + + /// + /// Recv,Send,Normal,Error 모두 지원 + /// + public string Message { get { return _message; } } + + private byte[] _data = null; + + /// + /// Recv,Send에서만 값이 존재 합니다 + /// + public byte[] Data { get { return _data; } } + public MessageEventArgs(string Message, bool isError = false) + { + if (isError) MsgType = MessageType.Error; + else MsgType = MessageType.Normal; + _message = Message; + } + public MessageEventArgs(MessageType msgtype, string Message) + { + MsgType = msgtype; + _message = Message; + _data = System.Text.Encoding.Default.GetBytes(Message); + } + + public MessageEventArgs(byte[] buffer, bool isRecv = true) + { + if (isRecv) MsgType = MessageType.Recv; + else MsgType = MessageType.Send; + _data = new byte[buffer.Length]; + Array.Copy(buffer, _data, Data.Length); + _message = System.Text.Encoding.Default.GetString(_data); + } + + } + + #endregion + + + + protected abstract bool CustomParser(byte[] buf, out byte[] remainBuffer); + + /// + /// 데이터수신시간이 설정값보다 x 2.5를 초과하면 false 가 반환됨 + /// + public Boolean IsValid + { + get + { + if (IsOpen == false) return false; + if (lastRecvTime.Year == 1982) return false; + var ts = DateTime.Now - lastRecvTime; + if (ts.TotalSeconds > 5) return false; + return true; + } + } + protected bool WriteData(string cmd) + { + return WriteData(System.Text.Encoding.Default.GetBytes(cmd)); + } + /// + /// 포트에 쓰기(barcode_DataReceived 이벤트로 메세지수신) + /// + protected Boolean WriteData(byte[] data) + { + Boolean bRet = false; + + //171205 : 타임아웃시간추가 + if (!_mre.WaitOne(WaitTimeout)) + { + errorMessage = $"WriteData:MRE:WaitOne:TimeOut {WaitTimeout}ms"; + this.Message?.Invoke(this, new MessageEventArgs(errorMessage, true)); + return false; + } + + _mre.Reset(); + + //Array.Resize(ref data, data.Length + 2); + + try + { + lastSendTime = DateTime.Now; + if (lastSendBuffer == null) lastSendBuffer = new byte[data.Length]; //171113 + else Array.Resize(ref lastSendBuffer, data.Length); + Array.Copy(data, lastSendBuffer, data.Length); + + for (int i = 0; i < data.Length; i++) + _device.Write(data, i, 1); + + //_device.Write(data, 0, data.Length); + + //171113 + this.Message?.Invoke(this, new MessageEventArgs(data, false)); + + bRet = true; + WriteError = 0; + WriteErrorMessage = string.Empty; + } + catch (Exception ex) + { + // this.isinit = false; + this.Message?.Invoke(this, new MessageEventArgs(ex.Message, true)); + bRet = false; + WriteError += 1; //연속쓰기오류횟수 + WriteErrorMessage = ex.Message; + } + finally + { + _mre.Set(); + } + return bRet; + } + } +} diff --git a/Cs_HMI/SubProject/CommData/Var.cs b/Cs_HMI/SubProject/CommData/Var.cs new file mode 100644 index 0000000..92f638a --- /dev/null +++ b/Cs_HMI/SubProject/CommData/Var.cs @@ -0,0 +1,340 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace COMM +{ + public abstract class VarData : INotifyPropertyChanged + { + protected T[] _values; + protected T defaultvalue; + protected string[] _code; + protected string[] _desc; + + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged(string name) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); + } + + public T this[int idx] + { + get { return Get(idx); } + set { Set(idx, value); } + } + + public string StrType + { + get + { + return typeof(T).ToString(); + } + } + public VarData(int capa, T defvalue = default(T)) + { + _values = new T[capa]; + _code = new string[capa]; + _desc = new string[capa]; + + defaultvalue = defvalue; + Clear(); + + if (typeof(T) == typeof(UInt16)) SupportAdd = true; + else if (typeof(T) == typeof(UInt32)) SupportAdd = true; + else if (typeof(T) == typeof(Int16)) SupportAdd = true; + else if (typeof(T) == typeof(Int32)) SupportAdd = true; + else if (typeof(T) == typeof(Int64)) SupportAdd = true; + else if (typeof(T) == typeof(UInt64)) SupportAdd = true; + else if (typeof(T) == typeof(byte)) SupportAdd = true; + else if (typeof(T) == typeof(double)) SupportAdd = true; + else if (typeof(T) == typeof(Single)) SupportAdd = true; + else if (typeof(T) == typeof(string)) SupportAdd = false; + else if (typeof(T) == typeof(bool)) SupportAdd = false; + else if (typeof(T) == typeof(DateTime)) SupportAdd = false; + else throw new Exception($"Support Data Type : {typeof(T)}"); + } + + public virtual void Set(int idx, T value) + { + var changed = _values[idx].Equals(value); + _values[idx] = value; + if (changed) OnPropertyChanged($"{idx}|{value}"); //idx값을 알림한다 + } + public virtual T Get(int idx) + { + return _values[idx]; + } + + public virtual void Clear(T value) + { + for (int i = 0; i < _values.Length; i++) + _values[i] = value; + } + public virtual void Clear() + { + Clear(defaultvalue); + } + public void Clear(int idx) + { + _values[idx] = defaultvalue; + } + public Tuple GetCodeDesc(int idx) + { + return new Tuple(_code[idx], _desc[idx]); + } + public virtual bool SupportAdd { get; private set; } + } + + public abstract class VarDataNumber : VarData + { + public VarDataNumber(int capa) : base(capa) { } + + public abstract void Add(T value); + public abstract void Add(int idx, T value); + } + + public class VarDataI32 : VarDataNumber + { + public VarDataI32(int capa) : base(capa) { } + + public override void Add(Int32 value) + { + for (int i = 0; i < _values.Length; i++) + _values[i] += value; + } + + public override void Add(int idx, Int32 value) + { + _values[idx] += value; + } + public void Add(eVarInt32 idx, Int32 value = 1) + { + Add((int)idx, value); + } + public void Clear(eVarInt32 idx) + { + Clear((int)idx); + } + public Int32 this[eVarInt32 idx] + { + get { return Get((int)idx); } + set { Set((int)idx, value); } + } + + } + public class VarDataDBL : VarDataNumber + { + public VarDataDBL(int capa) : base(capa) { } + + public override void Add(double value) + { + for (int i = 0; i < _values.Length; i++) + _values[i] += value; + } + + public override void Add(int idx, double value) + { + _values[idx] += value; + } + public void Add(eVarDBL idx, double value = 1) + { + Add((int)idx, value); + } + public void Clear(eVarDBL idx) + { + Clear((int)idx); + } + public double this[eVarDBL idx] + { + get { return Get((int)idx); } + set { Set((int)idx, value); } + } + } + public class VarDataUI32 : VarDataNumber + { + public VarDataUI32(int capa) : base(capa) { } + + public override void Add(UInt32 value) + { + for (int i = 0; i < _values.Length; i++) + _values[i] += value; + } + + public override void Add(int idx, UInt32 value) + { + _values[idx] += value; + } + public void Add(eVarUInt32 idx, UInt32 value = 1) + { + Add((int)idx, value); + } + public void Clear(eVarUInt32 idx) + { + Clear((int)idx); + } + public UInt32 this[eVarUInt32 idx] + { + get { return Get((int)idx); } + set { Set((int)idx, value); } + } + } + + public class VarDataByte : VarDataNumber + { + public VarDataByte(int capa) : base(capa) { } + + public override void Add(byte value) + { + for (int i = 0; i < _values.Length; i++) + _values[i] += value; + } + public override void Add(int idx, byte value) + { + _values[idx] += value; + } + public void Add(eVarByte idx, byte value) + { + Add((int)idx, value); + } + public byte this[eVarByte idx] + { + get + { + return Get((int)idx); + } + set + { + Set((int)idx, value); + } + } + } + + public class VarDataBool : VarData + { + public VarDataBool(int capa) : base(capa) { } + + public bool this[eVarBool idx] + { + get + { + return Get(idx); + } + set + { + Set(idx, value); + } + } + public bool Get(eVarBool idx) + { + return Get((int)idx); + } + public void Set(eVarBool idx, bool value) + { + Set((int)idx, value); + } + } + + public class VarDataStr : VarData + { + public VarDataStr(int capa) : base(capa, string.Empty) { } + public string Get(eVarString idx) + { + return Get((int)idx); + } + public void Set(eVarString idx, string value) + { + Set((int)idx, value); + } + public string this[eVarString idx] + { + get { return Get(idx); } + set { Set(idx, value); } + } + } + public class VarDataDateTime : VarData + { + public VarDataDateTime(int capa) : base(capa, new DateTime(1982, 11, 23)) { } + + public DateTime this[eVarTime idx] + { + get + { + return Get((int)idx); + } + set + { + Set(idx, value); + } + } + + public TimeSpan RUN(int idx) + { + return DateTime.Now - _values[idx]; + } + public TimeSpan RUN(eVarTime idx) + { + return RUN((int)idx); + } + [Browsable(false)] + public void Add(int idx, TimeSpan value) + { + _values[idx] += value; + } + + public void Add(eVarTime idx, TimeSpan value) + { + Add((int)idx, value); + } + /// + /// 지정된 시간으로 업데이트 합니다 + /// + /// + /// + public void Set(eVarTime idx, DateTime value) + { + Set((int)idx, value); + } + /// + /// 현재시간으로 업데이트 합니다 + /// + /// + public void Set(eVarTime idx) + { + Set(idx, DateTime.Now); + } + public bool IsSet(eVarTime idx) + { + return this[idx].Year != 1982; + } + } + //공용변수(시간) + public static class VAR + { + public static VarDataBool BOOL; + public static VarDataByte BYTE; + public static VarDataStr STR; + public static VarDataDateTime TIME; + public static VarDataI32 I32; + public static VarDataUI32 U32; + public static VarDataDBL DBL; + + public static bool isInit { get; private set; } = false; + + public static void Init(int varlen) + { + if (isInit) return; //already init + //가변 데이트타임변수 + BOOL = new VarDataBool(varlen); + BYTE = new VarDataByte(varlen); + STR = new VarDataStr(varlen); + TIME = new VarDataDateTime(varlen); + I32 = new VarDataI32(varlen); + U32 = new VarDataUI32(varlen); + DBL = new VarDataDBL(varlen); + isInit = true; + } + } +} diff --git a/Cs_HMI/SubProject/GitUpdate.bat b/Cs_HMI/SubProject/GitUpdate.bat new file mode 100644 index 0000000..f750ddd --- /dev/null +++ b/Cs_HMI/SubProject/GitUpdate.bat @@ -0,0 +1,5 @@ +@echo off +echo Git AutoUpdate +echo tindevil@nate.com +for /d %%i in (*) do echo Enterinng "%i" | cd "%i" | git.exe pull --progress -v --no-rebase "origin" master | cd .. +@pause \ No newline at end of file diff --git a/Cs_HMI/SubProject/MSSQLCommand/MSSQLCommand.csproj b/Cs_HMI/SubProject/MSSQLCommand/MSSQLCommand.csproj new file mode 100644 index 0000000..d05c1f0 --- /dev/null +++ b/Cs_HMI/SubProject/MSSQLCommand/MSSQLCommand.csproj @@ -0,0 +1,47 @@ + + + + + Debug + AnyCPU + {AAF68D20-4590-4AB0-BB91-E0DD04C91DEC} + Library + Properties + MSSQLCommand + MSSQLCommand + v4.0 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/MSSQLCommand/Monitor.cs b/Cs_HMI/SubProject/MSSQLCommand/Monitor.cs new file mode 100644 index 0000000..e224b6c --- /dev/null +++ b/Cs_HMI/SubProject/MSSQLCommand/Monitor.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MSSQLCommand +{ + public class Monitor + { + /// + /// Connection String + /// + public string CS { get; private set; } + + private int + public Monitor(string ip, string id, string pass, string db) + { + //ConnectionString = $"Data Source =10.131.15.18;Initial Catalog=EE;Persist Security Info=True;User ID=eeuser;Password=Amkor123!"; + CS = $"Data Source={ip};Initial Catalog={db};Persist Security Info=True;User ID={id};Password={pass}"; + } + + } +} diff --git a/Cs_HMI/SubProject/MSSQLCommand/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/MSSQLCommand/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..040a91a --- /dev/null +++ b/Cs_HMI/SubProject/MSSQLCommand/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("MSSQLCommand")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MSSQLCommand")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("aaf68d20-4590-4ab0-bb91-e0dd04c91dec")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 +// 기본값으로 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/SubProject/Patch/App.config b/Cs_HMI/SubProject/Patch/App.config new file mode 100644 index 0000000..5ffd8f8 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/Cs_HMI/SubProject/Patch/Form1.Designer.cs b/Cs_HMI/SubProject/Patch/Form1.Designer.cs new file mode 100644 index 0000000..86e4ce0 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Form1.Designer.cs @@ -0,0 +1,63 @@ +namespace Patch +{ + partial class Form1 + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.SuspendLayout(); + // + // progressBar1 + // + this.progressBar1.Dock = System.Windows.Forms.DockStyle.Fill; + this.progressBar1.Location = new System.Drawing.Point(0, 0); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(481, 68); + this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; + this.progressBar1.TabIndex = 1; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(481, 68); + this.Controls.Add(this.progressBar1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Form1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.ProgressBar progressBar1; + } +} + diff --git a/Cs_HMI/SubProject/Patch/Form1.cs b/Cs_HMI/SubProject/Patch/Form1.cs new file mode 100644 index 0000000..27ce6ad --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Form1.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Patch +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + this.Text = "Software Patch"; + this.Show(); + + Application.DoEvents(); + + //현재폴더에서 _patch 폴더 찾는다 + Boolean runClient = true; + var srcpath = new System.IO.DirectoryInfo ( System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "_patch")); + if (srcpath.Exists == true) + { + //기존 프로그램 종료될떄까지 기다린다 + this.Text = "기존 프로그램 종료 대기"; + Application.DoEvents(); + bool closeok = true; + System.Diagnostics.Stopwatch wat = new System.Diagnostics.Stopwatch(); + wat.Restart(); + while (CheckExistProcess("Amkor") == true) + { + Application.DoEvents(); + System.Threading.Thread.Sleep(10); + if(wat.ElapsedMilliseconds >= 10000) + { + MessageBox.Show("기존프로그램이 종료되지 않았습니다", "패치실패", MessageBoxButtons.OK, MessageBoxIcon.Error); + closeok = false; + break; + } + } + + if (CheckExistProcess("Amkor") == false) + { + + //버젼체크하고 파일 복사해준다 + var files = srcpath.GetFiles(); + this.progressBar1.Maximum = files.Length; + this.progressBar1.Value = 0; + this.progressBar1.Style = ProgressBarStyle.Continuous; + + var myPath = new System.IO.DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); + + try + { + foreach (var file in files) + { + this.Text = "패치파일 : " + file.Name; + Application.DoEvents(); + + file.CopyTo(System.IO.Path.Combine(file.Directory.Parent.FullName, file.Name), true); // System.IO.File.Copy(file, myPath.FullName, true); + this.progressBar1.Value += 1; + System.Threading.Thread.Sleep(100); + } + + //패치파일을 삭제한다 + srcpath.Delete(true); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + else runClient = false; + } + + //클라이언트실행 + if(runClient==true) + { + var file_run = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Amkor.exe"); + RunProcess(file_run); + } + + //프로그래램 종료 + this.Close(); + } + + public Boolean CheckExistProcess(string ProcessName) + { + foreach (var prc in System.Diagnostics.Process.GetProcesses()) + { + if (prc.ProcessName.StartsWith("svchost")) continue; + if (prc.ProcessName.ToUpper() == ProcessName.ToUpper()) return true; + } + return false; + } + + public Boolean RunProcess(string file, string arg = "") + { + var fi = new System.IO.FileInfo(file); + if (!fi.Exists) + { + //Pub.log.AddE("Run Error : " + file); + return false; + } + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(file); + si.Arguments = arg; + prc.StartInfo = si; + prc.Start(); + return true; + } + + } +} diff --git a/Cs_HMI/SubProject/Patch/Form1.resx b/Cs_HMI/SubProject/Patch/Form1.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/Patch/Program.cs b/Cs_HMI/SubProject/Patch/Program.cs new file mode 100644 index 0000000..30927a1 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Patch +{ + static class Program + { + /// + /// 해당 애플리케이션의 주 진입점입니다. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/Cs_HMI/SubProject/Patch/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/Patch/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1321da1 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("Patch")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Patch")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("37dc0bae-50bf-41e4-baab-b0e211467ad1")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 +// 기본값으로 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/SubProject/Patch/Properties/Resources.Designer.cs b/Cs_HMI/SubProject/Patch/Properties/Resources.Designer.cs new file mode 100644 index 0000000..df0a58a --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Patch.Properties { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Patch.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Cs_HMI/SubProject/Patch/Properties/Resources.resx b/Cs_HMI/SubProject/Patch/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/Patch/Properties/Settings.Designer.cs b/Cs_HMI/SubProject/Patch/Properties/Settings.Designer.cs new file mode 100644 index 0000000..28633b4 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Patch.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Cs_HMI/SubProject/Patch/Properties/Settings.settings b/Cs_HMI/SubProject/Patch/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Cs_HMI/SubProject/Patch/SWPatch.csproj b/Cs_HMI/SubProject/Patch/SWPatch.csproj new file mode 100644 index 0000000..0a88855 --- /dev/null +++ b/Cs_HMI/SubProject/Patch/SWPatch.csproj @@ -0,0 +1,84 @@ + + + + + Debug + AnyCPU + {37DC0BAE-50BF-41E4-BAAB-B0E211467AD1} + WinExe + Patch + SWPatch + v4.8 + 512 + true + + + + x86 + true + full + false + ..\..\..\..\..\..\Amkor\AGV3\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs b/Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs new file mode 100644 index 0000000..6dfda17 --- /dev/null +++ b/Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace arDev.Arduino +{ + public enum IODirection + { + Input = 0, + Output + } + + public enum MessageType + { + Normal = 0, + SendData, + ReceiveData, + Message, + RxIOData, + RxSetData, + } + +} diff --git a/Cs_HMI/SubProject/ProPLC/Arduino/EventsIO.cs b/Cs_HMI/SubProject/ProPLC/Arduino/EventsIO.cs new file mode 100644 index 0000000..51b572d --- /dev/null +++ b/Cs_HMI/SubProject/ProPLC/Arduino/EventsIO.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace arDev.Arduino +{ + public partial class DIO + { + /// + /// Digital Input/Output Changed + /// + public event EventHandler ValueChanged; + public event EventHandler FlagChanged; + + /// + /// 마그넷 센서의 값이 변경되었을때 발생 함 + /// + public event EventHandler PositionChanged; + + ///// + ///// Digital Input/Output Message + ///// + //public event EventHandler Message; + + public class FlagValueEventArgs : EventArgs + { + private int _arridx; + private Boolean _oldvalue; + private Boolean _newvalue; + + public int ArrIDX { get { return _arridx; } } + public Boolean OldValue { get { return _oldvalue; } } + public Boolean NewValue { get { return _newvalue; } } + + public FlagValueEventArgs( int ArrIDX, Boolean oldvalue, Boolean newvalue) + { + _arridx = ArrIDX; + _oldvalue = oldvalue; + _newvalue = newvalue; + } + } + + public class IOValueEventArgs : EventArgs + { + private int _arridx; + private Boolean _oldvalue; + private Boolean _newvalue; + private IODirection _dir; + + public int ArrIDX { get { return _arridx; } } + public Boolean OldValue { get { return _oldvalue; } } + public Boolean NewValue { get { return _newvalue; } } + public IODirection Direction { get { return _dir; } } + + public IOValueEventArgs(IODirection dir, int ArrIDX, Boolean oldvalue, Boolean newvalue) + { + _arridx = ArrIDX; + _oldvalue = oldvalue; + _newvalue = newvalue; + _dir = dir; + } + } + + //public class MessageEventArgs : EventArgs + //{ + // private Boolean _isError = false; + // public Boolean IsError { get { return _isError; } } + // private string _message = string.Empty; + // public string Message { get { return _message; } } + // private Arduino.MessageType _mtype; + // public Arduino.MessageType MessageType { get { return _mtype; } } + // public MessageEventArgs(Arduino.MessageType mType, string Message, Boolean isError) + // { + // _isError = isError; + // _message = Message; + // this._mtype = mType; + // } + //} + + } +} diff --git a/Cs_HMI/SubProject/ProPLC/Arduino/MemoryAccess.cs b/Cs_HMI/SubProject/ProPLC/Arduino/MemoryAccess.cs new file mode 100644 index 0000000..1ba4a7d --- /dev/null +++ b/Cs_HMI/SubProject/ProPLC/Arduino/MemoryAccess.cs @@ -0,0 +1,556 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.ComponentModel; +using System.Reflection; +using System.Runtime; +using System.Runtime.InteropServices; +using System.Collections.Concurrent; + +namespace arDev.Arduino +{ + public partial class DIO : arRS232 + { + protected object lockobj = new object(); + public struct SetupInfo + { + public byte ioInterval; + public byte ResetCount; + public byte SpeedH; + public byte SpeedL; + public byte SpeedZ; + public byte pindirRevDILow; + public byte pindirRevDIHigh; + public byte UpTime; + public byte BalanceThd; + public byte MarkThd; + public byte SpeedC; + public byte BalanceThdUp; + + public Boolean IsValid; + public void Clear() + { + pindirRevDIHigh = 0; + pindirRevDILow = 0; + ioInterval = 0; + ResetCount = 0; + SpeedH = 0; + SpeedL = 0; + SpeedC = 0; + BalanceThd = 0; + BalanceThd = 0; + UpTime = 0; + MarkThd = 0; + SpeedZ = 0; + IsValid = false; + } + } + + public SetupInfo setupInfo; + private Boolean STX11 = false; + private Boolean STX21 = false; + //private Boolean ETX11 = false; + // private byte[] buffer1; + // readonly List Tempbuffer1 = new List(); + readonly ManualResetEvent mre = new ManualResetEvent(true); + // protected string errorMessage = string.Empty; + // readonly System.IO.Ports.SerialPort dev = null; + private byte LEN1 = 0; + //private byte CHK1 = 0; + //private int bufferCount1 = 0; + + public DateTime ConnTryTime = DateTime.Now.AddDays(-1); + protected DateTime[] SetFlagTime = new DateTime[32]; + readonly Boolean[] Flag = new bool[32]; + readonly Boolean[] DIValue = new bool[16]; + readonly Boolean[] DOValue = new bool[16]; + public UInt16[] AIValue = new ushort[3]; + public byte[] AOValue = new byte[3]; + public string ioBinStr = string.Empty; + public string SetupStr = string.Empty; + public byte RunTime = 0; + + public byte[] MAG_VALUE = new byte[2]; + public byte[] SV_SPEED = new byte[2]; + public Boolean isDisposed = false; //dispose가 호출되었는가? + + public string LastMessage { get; set; } + public DateTime LastMessageTime { get; set; } + + + /// + /// 생성자 + /// + public DIO() + { + //설정의 값 + setupInfo = new SetupInfo(); + setupInfo.Clear(); + + SV_SPEED[0] = 0; + SV_SPEED[1] = 0; + + //마그넷 센서(0~100) + MAG_VALUE[0] = 50; + MAG_VALUE[1] = 50; + + lastRecvTime = DateTime.Parse("1982-11-23"); + + for (int i = 0; i < Flag.Length; i++) + Flag[i] = false; + for (int i = 0; i < DIValue.Length; i++) + DIValue[i] = false; + for (int i = 0; i < DOValue.Length; i++) + DOValue[i] = false; + for (int i = 0; i < AIValue.Length; i++) + AIValue[i] = 0; + for (int i = 0; i < AOValue.Length; i++) + AOValue[i] = 0; + for (int i = 0; i < SetFlagTime.Length; i++) + SetFlagTime[i] = DateTime.Parse("1982-11-23"); + + } + + protected override bool CustomParser(byte[] buf, out byte[] remainBuffer) + { + List remain = new List(); + + + Boolean bComplete = false; + for (int i = 0; i < buf.Length; i++) + { + var incomByte = buf[i]; + if (bComplete == true) + { + remain.Add(incomByte); + } + else + { + if (STX11 == false) + { + if (incomByte != '@') + { + STX21 = false; + // ETX11 = false; + continue; + } + else + { + STX11 = true; + tempBuffer.Clear(); + tempBuffer.Add(incomByte); + } + } + else if (STX21 == false) + { + if (tempBuffer.Count != 1 || tempBuffer.Count < 1 || tempBuffer[0] != '@' || incomByte != '@') + { + STX11 = false; + //ETX11 = false; + continue; + } + else + { + STX21 = true; + tempBuffer.Add(incomByte); + } + } + else + { + tempBuffer.Add(incomByte); + + //여기서부터는무조건 누적한다. + if (tempBuffer.Count == 3) + { + if (tempBuffer[0] != '@' || tempBuffer[1] != '@') + { + STX11 = false; + STX21 = false; + // ETX11 = false; + LEN1 = 0; + tempBuffer.Clear(); + } + else LEN1 = incomByte; //데이터 길이가온다 + } + //else if (Tempbuffer1.Count == LEN1 + 5) //ETX1 + //{ + // if (incomingByte != 0x0D) + // { + // //ETX가 와야하는데 다른데이터가 왔다 + // STX11 = false; + // STX21 = false; + // // ETX11 = false; + + // var str = System.Text.Encoding.Default.GetString(Tempbuffer1.ToArray()); + // RaiseMessage(MessageType.ReceiveData, "에러 모두 파기 : " + str, true); + + // Tempbuffer1.Clear(); + // } + //} + else if (tempBuffer.Count == LEN1 + 6) + { + //전체길이를 만족햇다. + if (incomByte != 0x0A) + { + //ETX가 와야하는데 다른데이터가 왔다 + STX11 = false; + STX21 = false; + // ETX11 = false; + //var str = System.Text.Encoding.Default.GetString(Tempbuffer1.ToArray()); + RaiseMessage(MessageType.Error, "에러 모두 파기 : ETX 값 오류"); + tempBuffer.Clear(); + } + else if (tempBuffer[tempBuffer.Count - 2] != 0x0D) + { + //ETX가 와야하는데 다른데이터가 왔다 + STX11 = false; + STX21 = false; + // ETX11 = false; + //var str = System.Text.Encoding.Default.GetString(Tempbuffer1.()); + RaiseMessage(MessageType.Error, "에러 모두 파기 : ETX 값 오류"); + tempBuffer.Clear(); + } + else + { + STX11 = false; + STX21 = false; + // ETX11 = false; + //if (LastReceiveBuffer == null) LastReceiveBuffer = new byte[tempBuffer.Count]; + //else if (LastReceiveBuffer.Length != tempBuffer.Count) Array.Resize(ref LastReceiveBuffer, Tempbuffer1.Count); + //tempBuffer.CopyTo(LastReceiveBuffer)tempBuffer + //tempBuffer.Clear(); + bComplete = true; + } + } + } + } + + + + } + + remainBuffer = remain.ToArray(); + return bComplete; + } + + + bool Checksum(byte[] buffer, int datalength) + { + //체크섬필요 221118 + if (buffer[buffer.Length-3] == '*') + { + return true; + } + byte checksum = 0; + for (int i = 3; i < datalength + 3; i++) + { + checksum = (byte)(checksum ^ buffer[i]); + } + return checksum == buffer[buffer.Length - 3]; + } + + public override bool ProcessRecvData(byte[] data) + { + var hexString = GetHexString(data);//.gethe + var len = data[2]; + if (len + 6 != data.Length) + { + RaiseMessage(MessageType.Error, string.Format("길이오류 예상:{0},수신:{1},{2}", len + 5, data.Length, hexString)); + } + else if (data[0] != 0x40 || data[1] != 0x40 || data[data.Length - 2] != 0x0D || data[data.Length - 1] != 0x0A) + { + RaiseMessage(MessageType.Error, string.Format("헤더 오류 : {0}", hexString)); + } + else if (Checksum(data, len) == false) //체크섬 221118 + { + RaiseMessage(MessageType.Error, string.Format("체크섬 오류 : {0}", hexString)); + } + else + { + //RaiseMessage(MessageType.ReceiveData, hexString); + lastRecvTime = DateTime.Now; + var cmd = data[3]; + if (cmd == 'I') //IOData + { + if (len != 10) + RaiseMessage(MessageType.Error, "IO수신길이오류:" + DateTime.Now.ToString("mm:ss.fff") + " 수신 : " + hexString); + else Parse_IOData(data); + } + else if (cmd == 'T') + { + // Boolean errorMessage = buffer[4] == 1; + var message = System.Text.Encoding.Default.GetString(data, 5, len - 2);//데이터타입과 에러여부 제거 + LastMessage = message; + LastMessageTime = DateTime.Now; + RaiseMessage(MessageType.Normal, message); + } + else if (cmd == 'S') //setup 정보 200310 (홈) + { + if (len != 13) + RaiseMessage(MessageType.Error, "SETUP수신길이오류:" + DateTime.Now.ToString("mm:ss.fff") + " 수신 : " + hexString); + else Parse_SetupData(data); + } + else + { + RaiseMessage(MessageType.Normal, "Unknown:" + hexString + "\n" + "Data=" + System.Text.Encoding.Default.GetString(data)); + } + } + return true; + } + + + + + void Parse_IOData(byte[] buffer) + { + var IOData = BitConverter.ToUInt32(buffer, 4); + + //var newMagF = BitConverter.ToUInt16(buffer, 8); + //va1r newMagB = BitConverter.ToUInt16(buffer, 10); + //var newAlign = BitConverter.ToUInt16(buffer, 12); + //if (newMagF != AIValue[0] || newMagB != AIValue[1]) + //{ + // AIValue[0] = newMagF;// BitConverter.ToUInt16(buffer, 8); //마그넷센서 F + // AIValue[1] = newMagB; //BitConverter.ToUInt16(buffer, 10); //마그넷센서 B + // PositionChanged?.Invoke(this, null); + //} + //AIValue[2] = newAlign; + //AOValue[0] = buffer[14]; //왼쪽바퀴 속도 + //AOValue[1] = buffer[15]; //오른쪽바퀴 속도 + //AOValue[2] = buffer[16]; //Z축 속도 + //SV_SPEED[0] = buffer[21]; //왼쪽바퀴의 설정속도 + //SV_SPEED[1] = buffer[22]; //오른쪽바퀴의 설정속도 + //MAG_VALUE[0] = buffer[23]; //magnet front + //MAG_VALUE[1] = buffer[24]; //magnet rear + RunTime = buffer[12]; + + //플래그값 확인 + byte[] buf_flag = new byte[4]; + Array.Copy(buffer, 8, buf_flag, 0, 4); + var baF = new System.Collections.BitArray(buf_flag); + for (int i = 0; i < 32; i++) + { + Boolean val = baF[i]; + + //입력 + if (this.Flag[i] != val) + { + Flag[i] = val; + + //변경이벤트 생성 + FlagChanged?.Invoke(this, new FlagValueEventArgs(i, !val, val)); + } + } + + //IO값 확인 + byte[] buf_iodata = new byte[4]; + Array.Copy(buffer, 4, buf_iodata, 0, 4); + var ba = new System.Collections.BitArray(buf_iodata); + for (int i = 0; i < 32; i++) + { + Boolean val = ba[i]; + if (i >= 16) + { + //출력 + if (DOValue[i - 16] != val) + { + DOValue[i - 16] = val; + + //변경이벤트 생성 + ValueChanged?.Invoke(this, new IOValueEventArgs(IODirection.Output, i - 16, !val, val)); + } + } + else + { + //입력 + if (DIValue[i] != val) + { + DIValue[i] = val; + + //변경이벤트 생성 + ValueChanged?.Invoke(this, new IOValueEventArgs(IODirection.Input, i, !val, val)); + } + } + } + + ioBinStr = Convert.ToString(IOData, 2).PadLeft(32, '0'); + //string msg = string.Format(DateTime.Now.ToString("mm:ss.fff") + " IO:{0},AN={1:0000},{2:0000},FG={3},AO={4},{5}", + // binstr, An1, An2, FGData, Ao11, Ao12); + } + void Parse_SetupData(byte[] buffer) + { + setupInfo.ioInterval = buffer[4]; + setupInfo.ResetCount = buffer[5]; + setupInfo.SpeedH = buffer[6]; + setupInfo.SpeedL = buffer[7]; + setupInfo.SpeedZ = buffer[8]; + setupInfo.pindirRevDIHigh = buffer[9]; + setupInfo.pindirRevDILow = buffer[10]; + setupInfo.UpTime = buffer[11]; + setupInfo.BalanceThd = buffer[12]; + setupInfo.MarkThd = buffer[13]; + setupInfo.SpeedC = buffer[14]; + setupInfo.BalanceThdUp = buffer[15]; + + SetupStr = string.Format("I:{0},R={1},H={2},L={3},Z={4},UP={5},BL={6},MK={7},SPD_C={8},BLUP={9}", + setupInfo.ioInterval, + setupInfo.ResetCount, + setupInfo.SpeedH, + setupInfo.SpeedL, + setupInfo.SpeedZ, + setupInfo.UpTime, + setupInfo.BalanceThd, + setupInfo.MarkThd, + setupInfo.SpeedC, + setupInfo.BalanceThdUp); + } + + public byte MakeChecksum(byte[] buffer) + { + //return 0; + byte chk = 0; + foreach (var b in buffer) + chk = (byte)(chk ^ b); + return chk; + } + + + + + #region "Method" + + protected Boolean Sendcommand(byte cmd, byte p1, byte p2) + { + //이번호의 상태를 on/off 해줘야함 + List buffer = new List + { + cmd, //command + p1, + p2 + }; + + byte dataLen = (byte)buffer.Count; //데이터길이 + byte checksum = MakeChecksum(buffer.ToArray()); + + buffer.Insert(0, (byte)'@'); //stx + buffer.Insert(1, (byte)'@'); //stx + buffer.Insert(2, dataLen); + buffer.Add(checksum); //길이를 제외한 실제 데이터 영역만 체크섬 + buffer.Add(0x0D); //etx + buffer.Add(0x0A); //etx + + return WriteData(buffer.ToArray()); + } + + + + + /// + /// 이벤트를 강제 생성합니다.(내부변수값도 변경됩니다) + /// + /// + /// + /// + public void RaiseEvent(IODirection dir, int idx, Boolean value) + { + if (ValueChanged != null) + { + if (!mre.WaitOne(100)) + { + RaiseMessage( MessageType.Error, "RaiseEvent WaitOne Timeout"); + return; + } + + mre.Reset(); + + bool curValue; + if (dir == IODirection.Input) + { + curValue = DIValue[idx]; + DIValue[idx] = value; + } + else + { + curValue = DOValue[idx]; + DOValue[idx] = value; + } + + try + { + //이벤트를 할당한곳에서 오류가 나면 이곳에서 에러가 잡힌다. + ValueChanged(this, new IOValueEventArgs(dir, idx, curValue, value)); + } + catch (Exception ex) + { + RaiseMessage(MessageType.Error, ex.Message); + } + finally + { + mre.Set(); + } + } + } + + //public Boolean GetFlag(byte idx) + //{ + // return Flag[idx]; + //} + + public Boolean GetValueI(byte idx) + { + if (idx < DIValue.Length) return DIValue[idx]; + else return false; + } + + public Boolean GetValueO(byte idx) + { + if (idx < DOValue.Length) return DOValue[idx]; + else return false; + } + + + //public Boolean SetValueI(int idx,Boolean value) + //{ + // if (idx < DIValue.Length) + // { + // DIValue[idx] = value; + // return true; + // } + // else return false; + //} + + public Boolean SetValue(byte idx, Boolean value) + { + byte SET_PINMODE = 3; + if (value == true) return Sendcommand(SET_PINMODE, idx, 1); + else return Sendcommand(SET_PINMODE, idx, 0); + } + + + public Boolean SetToggle(byte idx) + { + var curbalue = GetValueO(idx); + return SetValue(idx, !curbalue); + } + + + + public string GetErrorMessage() + { + return errorMessage; + } + + + + + #endregion + + + + + + + } +} diff --git a/Cs_HMI/SubProject/ProPLC/FakePLC.cs b/Cs_HMI/SubProject/ProPLC/FakePLC.cs new file mode 100644 index 0000000..eb98a61 --- /dev/null +++ b/Cs_HMI/SubProject/ProPLC/FakePLC.cs @@ -0,0 +1,387 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using arDev.Arduino; +using COMM; + +namespace arDev +{ + public class FakePLC : arDev.Arduino.DIO + { + + private System.Threading.Thread thPLC; + public bool Shutdown { get; set; } = false; + + public FakePLC() + { + COMM.VAR.Init(128); + } + + ~FakePLC() + { + + System.Threading.Tasks.Task.Run(() => + { + //쓰레드가 살아잇다면 대기한다 + if (thPLC != null && thPLC.IsAlive) + { + System.Threading.Thread.Sleep(100); + } + + this.Close(); + }); + } + + + private object lockobjdata = new object(); + public enum eEEPAddress + { + EEP_IOINTERVAL = 0, + EEP_RESETCOUNT, + EEP_DIREVH, + EEP_DIREVL, + EEP_OPTION, + EEP_UPTIME, + }; + + public enum eCommand : byte + { + LOAD = 0, //EEPROM 불러오기 + SAVE, //EEPROM 저장 + RESET, //초기화 + PINGCHK, + SET_PINMODE, //PINMODE 설정 + SET_DOUTPUT, //디지털출력설정(포트번호,값[1,0]) + SET_AOUTPUT, //아날로그출력설정(포트GET_SETTING = 50, //셋팅값 요청 + SET_FLAG, + SET_EEPROM, + SET_MANUALSPEED, + GET_SETTING = 50, + GUIDE_MOT = 90, //가이드커버(양쪽) 0=멈춤,1=UP,2=DN 아스키코드표 90=Z + SET_EEP_DIREV, + }; + + + //public enum MotorType + //{ + // Left = 0, + // Right + //} + //public enum Direction + //{ + // CW = 0, + // CCW, + //} + //public enum RunType + //{ + // Stop = 0, + // Up, + // Dn + //} + + public enum DIName + { + PINI_EMG = 0, + PINI_BTN_1, + PINI_BTN_2, + PINI_BTN_3, + PINI_BTN_4, + PINI_OVERLOADL, + PINI_OVERLOADR, + PINI_EMPTY_07, + PINI_EMPTY_08, + PINI_BTN_ZUP, + PINI_BTN_ZDN, + PINI_LIMIT_LU, + PINI_LIMIT_LD, + PINI_LIMIT_RU, + PINI_LIMIT_RD, + PINI_STOP, + } + public enum DIPin + { + PINI_EMG = 30, + PINI_BTN_1, + PINI_BTN_2, + PINI_BTN_3, + PINI_BTN_4, + PINI_OVERLOADL, + PINI_OVERLOADR, + PINI_EMPTY_07, + PINI_EMPTY_08, + PINI_BTN_ZUP, + PINI_BTN_ZDN, + PINI_LIMIT_LU, + PINI_LIMIT_LD, + PINI_LIMIT_RU, + PINI_LIMIT_RD, + PINI_STOP, + + } + + public enum DOName + { + PINO_GUIDEMOTOR_LDIR, + PINO_GUIDEMOTOR_LRUN, + PINO_GUIDEMOTOR_RDIR, + PINO_GUIDEMOTOR_RRUN, + PINO_EMPTY_04, + PINO_EMPTY_05, + PINO_EMPTY_06, + PINO_EMPTY_07, + } + public enum DOPin + { + PINO_GUIDEMOTOR_LDIR = 22, + PINO_GUIDEMOTOR_LRUN, + PINO_GUIDEMOTOR_RDIR, + PINO_GUIDEMOTOR_RRUN, + PINO_EMPTY_04, + PINO_EMPTY_05, + PINO_EMPTY_06, + PINO_EMPTY_07, + } + + public enum Rundirection : byte + { + Stop = 0, + Forward, + Backward, + Left, + Right, + EStop, + } + + public enum ZMotDirection + { + Stop = 0, + Up, + Down + } + + + private bool Sendcommand(eCommand cmd, char p1, char p2) + { + return Sendcommand(cmd, (byte)p1, (byte)p2); + } + private bool Sendcommand(eCommand cmd, char p1, byte p2 = 0) + { + return Sendcommand(cmd, (byte)p1, p2); + } + private bool Sendcommand(eCommand cmd, byte p1 = 0, byte p2 = 0) + { + if (cmd != eCommand.PINGCHK) + { + if (cmd == eCommand.SET_FLAG) + { + //플래그값은 공용변수로 변경 + var idx = (eVarBool)p1; + VAR.BOOL[idx] = p2 != 0; + RaiseMessage(MessageType.Send, string.Format("PLC CMD:{0} [{1}]=>{2}", cmd, (eVarBool)p1, p2)); + } + else + RaiseMessage(MessageType.Send, string.Format("PLC CMD:{0}, P1:{1}, P2:{2}", cmd, p1, p2)); + } + return Sendcommand((byte)cmd, p1, p2); + } + + public Boolean GetValueI(DIName idx) + { + return GetValueI((byte)idx); + } + public Boolean GetValueO(DOName idx) + { + return GetValueO((byte)idx); + } + public Boolean GetFlag(int flag) + { + return COMM.VAR.BOOL[flag]; + } + + public Boolean GetFlag(COMM.eVarBool flag) + { + return COMM.VAR.BOOL[(int)flag]; + } + + public Boolean SetFlag(byte idx, Boolean value) + { + + SetFlagTime[(int)idx] = DateTime.Now; //플래그기록을 시도한 시간 + + if (value == true) + return Sendcommand(eCommand.SET_FLAG, idx, 1); + else + return Sendcommand(eCommand.SET_FLAG, idx, 0); + } + + //public Boolean SetOpt_AD4Invert(Boolean value) + //{ + // var idx = (byte)PLCFlag.FLAG_ENABLE_AD4INVERT; + // SetFlagTime[idx] = DateTime.Now; //플래그기록을 시도한 시간 + + // if (value == true) + // return Sendcommand(eCommand.SET_FLAG, idx, 1); + // else + // return Sendcommand(eCommand.SET_FLAG, idx, 0); + //} + //public Boolean SetLog_SpeedControl(Boolean value) + //{ + // var idx = (byte)PLCFlag.FLAG_ENABLE_LOG_SPEED; + // SetFlagTime[idx] = DateTime.Now; //플래그기록을 시도한 시간 + + // if (value == true) + // return Sendcommand(eCommand.SET_FLAG, idx, 1); + // else + // return Sendcommand(eCommand.SET_FLAG, idx, 0); + //} + + + + public Boolean SetFlag(eVarBool flag, Boolean value) + { + VAR.BOOL[flag] = value; + return true; + } + + public Boolean SetEEP(eEEPAddress address, byte value) + { + RaiseMessage(MessageType.Normal, string.Format("[M] Set EEP Rom Addr={0},Val={1}", address, value)); + return Sendcommand(eCommand.SET_EEPROM, (byte)address, value); + } + + public Boolean SetOutput(byte pinNO, Boolean Value) + { + if (Value == true) return Sendcommand(eCommand.SET_DOUTPUT, pinNO, 1); + else return Sendcommand(eCommand.SET_DOUTPUT, pinNO, 0); + } + + public byte ApplySpeedH = 0; + public byte ApplySpeedL = 0; + public byte ApplySpeedC = 0; + public byte ApplySpeedZ = 0; + + public DateTime SaveTime = DateTime.Parse("1982-11-23"); + + + public Boolean SetPinReverse(byte High, byte Low) + { + RaiseMessage(MessageType.Normal, + string.Format("Pin Reverse H={0},L={1}", High, Low) + ); + + bool b1 = Sendcommand(eCommand.SET_EEPROM, (byte)eEEPAddress.EEP_DIREVH, High); + bool b2 = Sendcommand(eCommand.SET_EEPROM, (byte)eEEPAddress.EEP_DIREVL, Low); + return b1 && b2; + } + public Boolean SetMotorUpTime(byte value) + { + RaiseMessage(MessageType.Normal, + string.Format("Motor Up Time Value={0}", value) + ); + + bool b1 = Sendcommand(eCommand.SET_EEPROM, (byte)eEEPAddress.EEP_UPTIME, value); + return b1; + } + + public Boolean SaveEEPROM() + { + RaiseMessage(MessageType.Normal, + string.Format("Save EEPROM") + ); + + bool b1 = Sendcommand(eCommand.SAVE, 0); + return b1; + } + public Boolean LoadEEPROM() + { + RaiseMessage(MessageType.Normal, + string.Format("Load EEPROM") + ); + + bool b1 = Sendcommand(eCommand.LOAD, 0); + return b1; + } + + //public double ManualSpeed = 0.0; + //public bool SetManualSpeed(double Percvalue) + //{ + // var Speed = (byte)((Percvalue / 100.0) * 255.0); + // ManualSpeed = Percvalue; + // // datamanager.COMCONTROLLER.Speak($"{Percvalue} 퍼센트 설정"); + // RaiseMessage(MessageType.Normal, + // string.Format("Convert Speed Hold {0}%->{1}", Percvalue, Speed), + // false); + + // return Sendcommand(eCommand.SET_MANUALSPEED, Speed); + //} + + public DateTime LastPingTime = DateTime.Parse("1982-11-23"); + + + public bool SendPing() + { + LastPingTime = DateTime.Now; + return Sendcommand(eCommand.PINGCHK, 0, 0); + } + + + + + + public bool ZMot(ZMotDirection dir) + { + if (dir == ZMotDirection.Up) + return Sendcommand(eCommand.GUIDE_MOT, 'A', 'P'); //up + else if (dir == ZMotDirection.Down) + return Sendcommand(eCommand.GUIDE_MOT, 'A', 'N'); //down + else if (dir == ZMotDirection.Stop) + return Sendcommand(eCommand.GUIDE_MOT, 'A', 'S'); //stop + else return false; + } + public bool ZMot_Left(ZMotDirection dir) + { + if (dir == ZMotDirection.Up) + return Sendcommand(eCommand.GUIDE_MOT, 'L', 'P'); //up + else if (dir == ZMotDirection.Down) + return Sendcommand(eCommand.GUIDE_MOT, 'L', 'N'); //down + else if (dir == ZMotDirection.Stop) + return Sendcommand(eCommand.GUIDE_MOT, 'L', 'S'); //stop + else return false; + + } + public bool ZMot_Right(ZMotDirection dir) + { + if (dir == ZMotDirection.Up) + return Sendcommand(eCommand.GUIDE_MOT, 'R', 'P'); //up + else if (dir == ZMotDirection.Down) + return Sendcommand(eCommand.GUIDE_MOT, 'R', 'N'); //down + else if (dir == ZMotDirection.Stop) + return Sendcommand(eCommand.GUIDE_MOT, 'R', 'S'); //stop + else return false; + } + + /// + /// 오버로드 또는 L이 활성화되되면 True를 반환함 + /// + /// + public Boolean IsOverLoad() + { + if (GetValueI(DIName.PINI_OVERLOADL) || GetValueI(DIName.PINI_OVERLOADR)) return true; + else return false; + } + public Boolean IsLimitUp() + { + if (GetValueI(DIName.PINI_LIMIT_LU) || GetValueI(DIName.PINI_LIMIT_RU)) return true; + else return false; + } + public Boolean IsLimitDn() + { + if (GetValueI(DIName.PINI_LIMIT_LD) || GetValueI(DIName.PINI_LIMIT_RD)) return true; + else return false; + } + + } +} diff --git a/Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj b/Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj new file mode 100644 index 0000000..8c8f3d9 --- /dev/null +++ b/Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {476C8E64-7B6B-4554-ACA2-04302715750F} + Library + Properties + Device + Device_PLC + v4.8 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + {14e8c9a5-013e-49ba-b435-efefc77dd623} + CommData + + + + \ No newline at end of file diff --git a/Cs_HMI/SubProject/ProPLC/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/ProPLC/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..64e7d13 --- /dev/null +++ b/Cs_HMI/SubProject/ProPLC/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("Device_PLC")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Device_PLC")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("476c8e64-7b6b-4554-aca2-04302715750f")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 +// 기본값으로 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/SubProject/arFrameControl/GridView/ColorListItem.cs b/Cs_HMI/SubProject/arFrameControl/GridView/ColorListItem.cs new file mode 100644 index 0000000..08251be --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/GridView/ColorListItem.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace arFrame.Control +{ + [TypeConverterAttribute(typeof(ExpandableObjectConverter))] + public class ColorListItem + { + public System.Drawing.Color BackColor1 { get; set; } + public System.Drawing.Color BackColor2 { get; set; } + public string Remark { get; set; } + + public ColorListItem() + { + BackColor1 = System.Drawing.Color.Transparent; + BackColor2 = System.Drawing.Color.Transparent; + Remark = string.Empty; + } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/GridView/GridItem.cs b/Cs_HMI/SubProject/arFrameControl/GridView/GridItem.cs new file mode 100644 index 0000000..cc6d377 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/GridView/GridItem.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace arFrame.Control +{ + [TypeConverterAttribute(typeof(ExpandableObjectConverter))] + public class GridViewItem + { + public int row { get; private set; } + public int col { get; private set; } + + public int idx { get; private set; } + [Category("arFrame"), DisplayName("Tag")] + public string Tag { get; set; } + [Category("arFrame"), DisplayName("글자 정렬 방식")] + public System.Drawing.ContentAlignment TextAlign { get; set; } + [Category("arFrame"), DisplayName("글자 여백")] + public System.Windows.Forms.Padding Padding { get; set; } + [Category("arFrame"), DisplayName("메뉴 사용여부"), Description("활성화시 메뉴의 클릭이벤트가 발생하지 않습니다")] + public Boolean Enable { get; set; } + + public System.Drawing.Color BackColor1 { get; set; } + public System.Drawing.Color BackColor2 { get; set; } + + public Boolean Dirty { get; set; } + + public System.Drawing.RectangleF rect { get; set; } + + [Category("arFrame"), DisplayName("번호")] + public int No { get; set; } + + public GridViewItem(int idx_,int _r,int _c) + { + this.row = _r; + this.col = _c; + BackColor1 = System.Drawing.Color.Transparent; + BackColor2 = System.Drawing.Color.Transparent; + rect = System.Drawing.RectangleF.Empty; + Enable = true; + this.idx = idx_; + TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + Padding = new System.Windows.Forms.Padding(0, 0, 0, 0); + No = 0; + this.Dirty = true; + } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/GridView/GridView.Designer.cs b/Cs_HMI/SubProject/arFrameControl/GridView/GridView.Designer.cs new file mode 100644 index 0000000..2a9a87e --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/GridView/GridView.Designer.cs @@ -0,0 +1,36 @@ +namespace arFrame.Control +{ + partial class GridView + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/GridView/GridView.cs b/Cs_HMI/SubProject/arFrameControl/GridView/GridView.cs new file mode 100644 index 0000000..26be37a --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/GridView/GridView.cs @@ -0,0 +1,624 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace arFrame.Control +{ + public partial class GridView : System.Windows.Forms.Control + { + private int bordersize = 0; + private int menubordersize = 1; + private int menugap = 5; + private System.Windows.Forms.Padding padding = new Padding(3, 3, 3, 3); + private System.Drawing.Color backcolor = System.Drawing.Color.White; + private System.Drawing.Color bordercolor = System.Drawing.Color.Black; + private Boolean textattachtoimage = true; + private Boolean _showIndexString = true; + + private System.Drawing.Color _shadowColor = System.Drawing.Color.Transparent; + private System.Drawing.Color foreColorPin = System.Drawing.Color.WhiteSmoke; + private System.Drawing.Font fontPin = new Font("Consolas", 8, FontStyle.Bold); + + private Point _matrixsize = new Point(8, 2); + public Point MatrixSize { get { return _matrixsize; } set { _matrixsize = value; ResetArray(); RemakeChartRect(); } } + + [Browsable(false)] + public int ColumnCount { get { return _matrixsize.X; } } + [Browsable(false)] + public int RowCount { get { return _matrixsize.Y; } } + public int ItemCount { get { return ColumnCount * RowCount; } } + + private GridViewItem[] Items; + + private UInt16[] _values; + private string[] _titles; + private string[] _tags; + private string[] _names; + private ColorListItem[] _colorlist; + public ColorListItem[] ColorList { get { return _colorlist; } set { _colorlist = value; this.Invalidate(); } } + + public string[] Names { get { return _names; } set { _names = value; Invalidate(); } } + public string[] Titles { get { return _titles; } set { _titles = value; Invalidate(); } } + public UInt16[] Values { get { return _values; } set { _values = value; Invalidate(); } } + public string[] Tags { get { return _tags; } set { _tags = value; } } + + private bool _showdebuginfo = false; + public Boolean showDebugInfo { get { return _showdebuginfo; } set { _showdebuginfo = value; Invalidate(); } } + + public void setNames(string[] value) + { + _names = value; + } + + public void setTitle(string[] value) + { + List titlerows = new List(); + List tagrows = new List(); + + for (int i = 0; i < value.Length; i++) + { + var r = (int)(Math.Floor((double)(i / ColumnCount))); + var c = i % ColumnCount; + + if (titlerows.Count < r + 1) titlerows.Add(string.Empty); + if (tagrows.Count < r + 1) tagrows.Add(string.Empty); + + var prestr = titlerows[r]; + if (prestr != "") prestr += "|"; + titlerows[r] = prestr + value[i]; + + var prestr_t = tagrows[r]; + if (prestr_t != "") prestr_t += "|"; + tagrows[r] = prestr_t + ""; + + if (i < itemCount) this.Items[i].Enable = true; + } + this._titles = titlerows.ToArray(); + this._tags = tagrows.ToArray(); + } + + public Boolean setTitle(int row, int col, string value, string itemtag = "") + { + if (_titles == null) _titles = new string[0]; + if (_tags == null) _tags = new string[0]; + + if ( row >= _titles.Length) Array.Resize(ref _titles, row + 1); + if( row >= _tags.Length) Array.Resize(ref _tags, row+1); + + if (_titles[row] == null) _titles[row] = string.Empty; + if (_tags[row] == null) _tags[row] = string.Empty; + + var linebuf = _titles[row].Split('|'); + var linebuf_t = _tags[row].Split('|'); + + if (col >= linebuf.Length) Array.Resize(ref linebuf, col + 1); + if (col >= linebuf_t.Length) Array.Resize(ref linebuf_t, col + 1); + + linebuf[col] = value; + linebuf_t[col] = itemtag; + + _titles[row] = string.Join("|", linebuf); + _tags[row] = string.Join("|", linebuf_t); + return true; + //var idx = row * this.ColumnCount + col; + //return setTitle(idx, value); + } + public Boolean setTitle(int idx, string value) + { + if (idx < ColumnCount) return setTitle(0, idx, value); + else + { + //줄값이 필요하다 + var row = (int)(Math.Floor((double)(idx / ColumnCount))); + var col = idx % ColumnCount; + return setTitle(row, col, value); + } + } + + + public void setValue(bool[] value) + { + var v = new UInt16[value.Length]; + for (int i = 0; i < value.Length; i++) + v[i] = (UInt16)(value[i] ? 1 : 0); + _values = v; + } + public void setValue(UInt16[] value) + { + _values = value; + } + public Boolean setValue(int idx, ushort value) + { + if (this._values == null) _values = new ushort[idx + 1]; + if (idx >= this._values.Length) Array.Resize(ref _values, idx + 1); + this._values[idx] = value; + return true; + } + public Boolean setTag(string[] value) + { + this._tags = value; + return true; + } + public Boolean setTag(int idx, string value) + { + if (this._tags == null) Tags = new string[idx + 1]; + if (idx >= this.Tags.Length) Array.Resize(ref _tags, idx + 1); + this._tags[idx] = value; + return true; + } + public void ClearValue(ushort defaultValue = 0) + { + if (_values != null) + for(int i = 0; i < _values.Length;i++) + _values[i] = defaultValue; + } + public void ClearTitle(string defaultValue = "") + { + if (_values != null) + for (int i = 0; i < _titles.Length; i++) + _titles[i] = defaultValue; + } + public void ClearTag(string defaultValue = "") + { + if (_tags != null) + for (int i = 0; i < _tags.Length; i++) + _tags[i] = defaultValue; + } + public void setValue(ushort value) + { + for(int i = 0; i < _values.Length;i++) + this._values[i] = value; + } + public void setItemEnable(int idx, bool value) + { + if (idx >= _values.Length || idx >= this.Items.Length) return; + this.Items[idx].Enable = value; + } + + /// + /// 지정된 컬러태그값을 입력한다. + /// + /// + /// + /// + public Boolean setValue(int idx, string tagString) + { + //동일태그값을 찾는다 + if (idx >= _values.Length) return false; + + int value = -1; + for (int i = 0; i < ColorList.Length; i++) + if (ColorList[i].Remark.ToLower() == tagString.ToLower()) + { + value = i; + break; + } + + if (value != -1) + { + this._values[idx] = (ushort)value; + this.Items[idx].Enable = true; + return true; + } + else return false; + + + } + public Boolean setValue(int idx, bool value) + { + return setValue(idx, (ushort)(value ? 1 : 0)); + } + public Boolean setValue(int row, int col, ushort value) + { + var idx = row * this.ColumnCount + col; + return setValue(idx, value); + } + public Boolean setValue(int row, int col, int value) + { + var idx = row * this.ColumnCount + col; + return setValue(idx, (ushort)value); + } + public Boolean setValueToggle(int row, int col, ushort value1,ushort value2) + { + var idx = row * this.ColumnCount + col; + if(getValue(idx) == value1) return setValue(idx, value2); + else return setValue(idx, value1); + } + public Boolean setValue(int row, int col, bool value) + { + var idx = row * this.ColumnCount + col; + return setValue(idx, (ushort)(value ? 1 : 0)); + } + public Boolean setValue(int row, int col, string value) + { + var idx = row * this.ColumnCount + col; + return setValue(idx, value); + } + + public ushort getValue(int idx) + { + if (idx >= _values.Length) return 0; + return _values[idx]; + } + public ushort getValue(int row, int col) + { + var idx = row * this.ColumnCount + col; + return getValue(idx); + } + + [Category("arFrame")] + public bool ShowIndexString { get { return _showIndexString; } set { _showIndexString = value; Invalidate(); } } + + [Category("arFrame"), DisplayName("테두리 굵기")] + public int BorderSize { get { return bordersize; } set { this.bordersize = value; Invalidate(); } } + [Category("arFrame"), DisplayName("메뉴 테두리 굵기")] + public int MenuBorderSize { get { return menubordersize; } set { this.menubordersize = value; Invalidate(); } } + [Category("arFrame"), DisplayName("메뉴 간격")] + public int MenuGap { get { return menugap; } set { this.menugap = value; RemakeChartRect(); Invalidate(); } } + [Category("arFrame"), DisplayName("글자를 이미지 다음에 표시"), Description("이미지가 있는 경우 해당 이미지 옆에 글자를 붙입니다")] + public Boolean TextAttachToImage { get { return textattachtoimage; } set { this.textattachtoimage = value; Invalidate(); } } + + [Category("arFrame"), DisplayName("색상-테두리")] + public System.Drawing.Color BorderColor { get { return bordercolor; } set { this.bordercolor = value; Invalidate(); } } + [Category("arFrame"), DisplayName("내부 여백")] + public new System.Windows.Forms.Padding Padding { get { return padding; } set { this.padding = value; RemakeChartRect(); Invalidate(); } } + + [Category("arFrame"), DisplayName("색상-전체배경색")] + public override System.Drawing.Color BackColor { get { return backcolor; } set { this.backcolor = value; Invalidate(); } } + + [Category("arFrame"), DisplayName("색상-글자(그림자)")] + public System.Drawing.Color ShadowColor { get { return _shadowColor; } set { _shadowColor = value; this.Invalidate(); } } + + [Category("arFrame"), DisplayName("색상-글자")] + public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } } + + [Category("arFrame"), DisplayName("색상-글자(번호)")] + public Color ForeColorPin { get { return foreColorPin; } set { foreColorPin = value; } } + + [Category("arFrame"), DisplayName("글꼴-번호")] + public Font FontPin { get { return fontPin; } set { fontPin = value; Invalidate(); } } + [Category("arFrame"), DisplayName("글꼴-항목")] + public override Font Font { get { return base.Font; } set { base.Font = value; Invalidate(); } } + + private int mouseOverItemIndex = -1; + public GridView() + { + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + //값과 이름은 외부의 값을 사용한다 + ResetArray(); + + if (MinimumSize.Width == 0 || MinimumSize.Height == 0) + MinimumSize = new Size(100, 50); + } + + + void ResetArray() + { + if (this._values != null) Array.Resize(ref this._values, itemCount);// = new UInt16[itemCount]; + // if (this._titles != null) Array.Resize(ref this._titles, itemCount);// + // if (this._names != null) Array.Resize(ref this._names, itemCount);// + } + + int itemCount { get { return ColumnCount * RowCount; } } + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + RemakeChartRect(); + } + + public event EventHandler ItemClick; + public class ItemClickEventArgs : EventArgs + { + public int idx { get; set; } + public GridViewItem Item { get; set; } + public ItemClickEventArgs(int idx_, GridViewItem item) + { + this.Item = item; + this.idx = idx_; + } + } + + protected override void OnMouseClick(MouseEventArgs e) + { + //마우스클릭시 해당 버튼을 찾아서 반환한다. + if (Items == null || Items.Length < 1) return; + for (int i = 0; i < Items.Length; i++) + { + var rect = Items[i].rect;//[i]; + if (rect.Contains(e.Location)) + { + var menu = Items[i]; + + //미사용개체는 이벤트를 아에 발생하지 않는다 + if (menu.Enable == true && ItemClick != null) + ItemClick(this, new ItemClickEventArgs(i, menu)); + break; + } + } + } + + protected override void OnMouseLeave(EventArgs e) + { + this.mouseOverItemIndex = -1; + this.Invalidate(); + } + protected override void OnMouseMove(MouseEventArgs e) + { + if (Items == null || Items.Length < 1) + { + this.mouseOverItemIndex = -1; + return; + } + + for (int i = 0; i < Items.Length; i++) + { + var rect = Items[i].rect;// rects[i]; + if (rect.Contains(e.Location)) + { + if (i != mouseOverItemIndex) + { + mouseOverItemIndex = i; + this.Invalidate(); + } + + break; + } + } + } + public void setItemTextAlign(int row, int col, System.Drawing.ContentAlignment TextAlign) + { + var item = this.Items.Where(t => t.row == row && t.col == col).FirstOrDefault(); + if (item != null) item.TextAlign = TextAlign; + } + public void setItemTextAlign(System.Drawing.ContentAlignment TextAlign) + { + foreach (var item in this.Items) + item.TextAlign = TextAlign; + } + + protected override void OnPaint(PaintEventArgs pe) + { + //배경그리기 + //using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(DisplayRectangle, BackColor, BackColor2On, System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + pe.Graphics.FillRectangle(new SolidBrush(BackColor), DisplayRectangle); + + if (Items == null) + { + pe.Graphics.DrawString("no items", this.Font, Brushes.Red, 100, 100); + return; + } + + var items = Items.OrderBy(t => t.No); + foreach (var menu in items) + { + drawItem(menu.idx, pe.Graphics); + } + + //테두리 그리기 + if (BorderSize > 0) + { + pe.Graphics.DrawRectangle(new Pen(this.BorderColor, BorderSize), + this.DisplayRectangle.Left, + this.DisplayRectangle.Top, + this.DisplayRectangle.Width - 1, + this.DisplayRectangle.Height - 1); + } + } + + public void drawItem(int itemIndex, Graphics g = null) + { + if (g == null) g = this.CreateGraphics(); + var menu = this.Items[itemIndex]; + + if (menu.rect == RectangleF.Empty) return; + + var rect = menu.rect;// rects[i]; + + var diplayText = string.Empty; + + //타이틀이 줄번호별로 처리됨 + if (_titles != null && menu.row < _titles.Length && _titles[menu.row] != null ) + { + var linebif = _titles[menu.row].Split('|'); + if (menu.col < linebif.Length) + diplayText = linebif[menu.col]; + } + + UInt16 Value = 0; + if (_values != null && menu.idx < _values.Length) Value = _values[menu.idx]; + + //배경이 투명이 아니라면 그린다. + var bgColor1 = Color.FromArgb(30, 30, 30);// BackColor1Off; + var bgColor2 = Color.FromArgb(30, 30, 30);// BackColor2Off; + + //해당 값에 따른 컬러값을 읽는다. + if (ColorList != null && Value < ColorList.Length) + { + bgColor1 = this.ColorList[Value].BackColor1; + bgColor2 = this.ColorList[Value].BackColor2; + } + + using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, bgColor1, bgColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + g.FillRectangle(sb, rect); + + // if (mouseOverItemIndex == menu.idx) + // this.Cursor = Cursors.Hand; + // else + // this.Cursor = Cursors.Arrow; + + //테두리를 그리는 속성과 트기가 설정된 경우에만 표시 + //if (mouseOverItemIndex == i) + // { + // pe.Graphics.DrawRectangle(new Pen(Color.DeepSkyBlue), rect.Left, rect.Top, rect.Width, rect.Height); + //} + //else + { + if (MenuBorderSize > 0) + { + using (var p = new Pen(BorderColor, MenuBorderSize)) + g.DrawRectangle(p, rect.Left, rect.Top, rect.Width, rect.Height); + } + } + + //인덱스번호 출력 + if (ShowIndexString && _names != null && menu.idx < _names.Length) + { + //표시글자 + var idxstr = string.Format("[{0}] {1}", menu.idx, _names[menu.idx]); + + //그림자 추가 + if (ShadowColor != System.Drawing.Color.Transparent) + g.DrawString(idxstr, FontPin, new SolidBrush(ShadowColor), menu.rect.Left + 4, menu.rect.Top + 4); + + //일반글자표시 + g.DrawString(idxstr, FontPin, new SolidBrush(this.ForeColorPin), menu.rect.Left + 3, menu.rect.Top + 3); + } + + if (diplayText != "") + { + using (StringFormat sf = new StringFormat(StringFormatFlags.NoClip)) + { + //글자를 텍스트 이후에 붙이는 거라면? + if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.BottomLeft || + menu.TextAlign == ContentAlignment.BottomRight) sf.LineAlignment = StringAlignment.Far; + else if (menu.TextAlign == ContentAlignment.MiddleCenter || menu.TextAlign == ContentAlignment.MiddleLeft || + menu.TextAlign == ContentAlignment.MiddleRight) sf.LineAlignment = StringAlignment.Center; + else if (menu.TextAlign == ContentAlignment.TopCenter || menu.TextAlign == ContentAlignment.TopLeft || + menu.TextAlign == ContentAlignment.TopRight) sf.LineAlignment = StringAlignment.Near; + + if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.MiddleCenter || + menu.TextAlign == ContentAlignment.TopCenter) sf.Alignment = StringAlignment.Center; + else if (menu.TextAlign == ContentAlignment.BottomLeft || menu.TextAlign == ContentAlignment.MiddleLeft || + menu.TextAlign == ContentAlignment.TopLeft) sf.Alignment = StringAlignment.Near; + else if (menu.TextAlign == ContentAlignment.BottomRight || menu.TextAlign == ContentAlignment.MiddleRight || + menu.TextAlign == ContentAlignment.TopRight) sf.Alignment = StringAlignment.Far; + + //그림자 추가 + if (ShadowColor != System.Drawing.Color.Transparent) + g.DrawString(diplayText, this.Font, new SolidBrush(ShadowColor), + new RectangleF((float)(rect.Left + 1f), (float)(rect.Top + 1f), (float)rect.Width, (float)rect.Height), sf); + + g.DrawString(diplayText, this.Font, new SolidBrush(ForeColor), rect, sf); + } + } + + if (showDebugInfo) + { + g.DrawString(Value.ToString(), this.fontPin, Brushes.SkyBlue, rect.Left, rect.Top); + } + + } + + /// + /// arFrame 전용 속성값을 복사 합니다 + /// + /// + public void copyTo(GridView ctl) + { + ctl.backcolor = this.backcolor; + ctl.menugap = this.menugap; + ctl.Items = this.Items; + ctl.menubordersize = this.menubordersize; + ctl.padding = this.padding; + ctl.ForeColor = this.ForeColor; + ctl.Font = this.Font; + ctl.TextAttachToImage = this.TextAttachToImage; + ctl.bordercolor = this.bordercolor; + ctl.bordersize = this.bordersize; + } + + public void RemakeChartRect() + { + if (DisplayRectangle == Rectangle.Empty) return; + + double x = 0; + double y = 0; + double w = DisplayRectangle.Width / (ColumnCount * 1.0); + double h = DisplayRectangle.Height / (RowCount * 1.0); + + if (this.Items == null || itemCount != this.Items.Length) + { + //아이템갯수가 달라졌으므로 다시 갱신해야함 + GridViewItem[] item = new GridViewItem[RowCount * ColumnCount]; + for (int r = 0; r < RowCount; r++) + { + for (int c = 0; c < ColumnCount; c++) + { + int idx = r * ColumnCount + c; + item[idx] = new GridViewItem(idx, r, c); + item[idx].Enable = false; + item[idx].Padding = new Padding(0, 0, 0, 0); + item[idx].TextAlign = ContentAlignment.MiddleCenter; + x = (c * w); + y = (r * h); + item[idx].rect = new RectangleF((float)x, (float)y, (float)w, (float)h); + } + } + + this.Items = item; + } + else + { + //아이템의 갯수는 같으므로 좌표값만 변경해준다. + for (int r = 0; r < RowCount; r++) + { + for (int c = 0; c < ColumnCount; c++) + { + int idx = r * ColumnCount + c; + var item = Items[idx]; + x = (c * w); + y = (r * h); + item.Dirty = true; + item.rect = new RectangleF((float)x, (float)y, (float)w, (float)h); + } + } + } + this.Invalidate(); + + //int i = 0; + //var menuList = this.Items.OrderBy(t => t.No).ToArray(); + //foreach (var menu in menuList) + //{ + // int x, y, w, h; + // // var menu = menus[i]; + + // var mWidth = menuwidth; + // if (menu.MenuWidth > 0) mWidth = menu.MenuWidth; + + // w = mWidth; + // h = DisplayRectangle.Height - Padding.Top - Padding.Bottom; + + // if (menu.isRightMenu) + // { + // x = DisplayRectangle.Right - Padding.Right - (rightAcc) - (MenuGap * rightIdx); + // y = DisplayRectangle.Top + Padding.Top; + // rightAcc += 0;// = 0;// x; + // rightIdx += 1; + // } + // else + // { + // x = DisplayRectangle.Left + Padding.Left + leftAcc + (MenuGap * leftIdx); + // y = DisplayRectangle.Top + Padding.Top; + // leftAcc += mWidth; + // leftIdx += 1; + // } + // rects[i] = new Rectangle(x, y, w, h); + // i += 1; + //} + } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.Designer.cs b/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.Designer.cs new file mode 100644 index 0000000..a535234 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.Designer.cs @@ -0,0 +1,36 @@ +namespace arFrame.Control +{ + partial class MenuControl + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.cs b/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.cs new file mode 100644 index 0000000..c089624 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.cs @@ -0,0 +1,676 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Xml; + +namespace arFrame.Control +{ + + public partial class MenuControl : System.Windows.Forms.Control + { + private int bordersize = 0; + private int menubordersize = 1; + private int menuwidth = 100; + private int menugap = 5; + private System.Windows.Forms.Padding padding = new Padding(3, 3, 3, 3); + private System.Drawing.Color backcolor = System.Drawing.Color.White; + private System.Drawing.Color backcolor2 = System.Drawing.Color.Gainsboro; + private System.Drawing.Color bordercolor = System.Drawing.Color.Black; + private Boolean enablemenubakcolor = false; + private Boolean enablemenuborder = false; + private Boolean textattachtoimage = true; + + [Category("arFrame"), DisplayName("메뉴")] + public MenuItem[] menus { get; set; } + + private Rectangle[] rects = null; + + [Category("arFrame"), DisplayName("테두리 굵기")] + public int BorderSize { get { return bordersize; } set { this.bordersize = value; Invalidate(); } } + [Category("arFrame"), DisplayName("메뉴 테두리 굵기")] + public int MenuBorderSize { get { return menubordersize; } set { this.menubordersize = value; Invalidate(); } } + [Category("arFrame"), DisplayName("메뉴 너비")] + public int MenuWidth { get { return menuwidth; } set { this.menuwidth = value; RemakeChartRect(); Invalidate(); } } + [Category("arFrame"), DisplayName("메뉴 간격")] + public int MenuGap { get { return menugap; } set { this.menugap = value; RemakeChartRect(); Invalidate(); } } + [Category("arFrame"), DisplayName("기능-메뉴별 배경색")] + public Boolean EnableMenuBackColor { get { return enablemenubakcolor; } set { this.enablemenubakcolor = value; Invalidate(); } } + [Category("arFrame"), DisplayName("기능-메뉴별 테두리")] + public Boolean EnableMenuBorder { get { return enablemenuborder; } set { this.enablemenuborder = value; Invalidate(); } } + [Category("arFrame"), DisplayName("글자를 이미지 다음에 표시"), Description("이미지가 있는 경우 해당 이미지 옆에 글자를 붙입니다")] + public Boolean TextAttachToImage { get { return textattachtoimage; } set { this.textattachtoimage = value; Invalidate(); } } + [Category("arFrame"), DisplayName("이미지 표시 여백(좌,상)")] + public System.Drawing.Point ImagePadding { get; set; } + [Category("arFrame"), DisplayName("이미지 표시 크기(너비,높이)")] + public System.Drawing.Size ImageSize { get; set; } + [Category("arFrame"), DisplayName("색상-테두리")] + public System.Drawing.Color BorderColor { get { return bordercolor; } set { this.bordercolor = value; Invalidate(); } } + [Category("arFrame"), DisplayName("내부 여백")] + public new System.Windows.Forms.Padding Padding { get { return padding; } set { this.padding = value; RemakeChartRect(); Invalidate(); } } + [Category("arFrame"), DisplayName("색상-배경1")] + public override System.Drawing.Color BackColor { get { return backcolor; } set { this.backcolor = value; Invalidate(); } } + [Category("arFrame"), DisplayName("색상-배경2")] + public System.Drawing.Color BackColor2 { get { return backcolor2; } set { this.backcolor2 = value; Invalidate(); } } + [Category("arFrame"), DisplayName("색상-글자")] + public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } } + + private int mouseOverItemIndex = -1; + public MenuControl() + { + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + + + ImagePadding = new System.Drawing.Point(0, 0); + ImageSize = new System.Drawing.Size(24, 24); + + + if (MinimumSize.Width == 0 || MinimumSize.Height == 0) + MinimumSize = new Size(100, 50); + + } + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + RemakeChartRect(); + } + + + public event EventHandler ItemClick; + public class MenuEventArgs : EventArgs + { + public string Command { get; set; } + public int idx { get; set; } + public MenuEventArgs(string cmd_, int idx_) + { + this.Command = cmd_; + this.idx = idx_; + } + } + + protected override void OnMouseClick(MouseEventArgs e) + { + // if(DesignMode) + // { + // if(e.Button == System.Windows.Forms.MouseButtons.Right) + // { + // System.Windows.Forms.MessageBox.Show("Sdf"); + + // } + // } + // else + { + //마우스클릭시 해당 버튼을 찾아서 반환한다. + if (menus == null || menus.Length < 1) return; + for (int i = 0; i < menus.Length; i++) + { + var rect = rects[i]; + if (rect.Contains(e.Location)) + { + var menu = menus[i]; + + //미사용개체는 이벤트를 아에 발생하지 않는다 + if (menu.Enable == true && ItemClick != null) + ItemClick(this, new MenuEventArgs(menu.Command, i)); + break; + } + } + } + + } + protected override void OnMouseLeave(EventArgs e) + { + this.mouseOverItemIndex = -1; + this.Invalidate(); + } + protected override void OnMouseMove(MouseEventArgs e) + { + if (menus == null || menus.Length < 1) + { + this.mouseOverItemIndex = -1; + return; + } + for (int i = 0; i < menus.Length; i++) + { + var rect = rects[i]; + if (rect.Contains(e.Location)) + { + if (i != mouseOverItemIndex) + { + mouseOverItemIndex = i; + this.Invalidate(); + } + + break; + } + } + } + + protected override void OnPaint(PaintEventArgs pe) + { + + + // if(DesignMode) + // { + // pe.Graphics.FillRectangle(Brushes.Red, this.DisplayRectangle); + // } + //else + { + //배경그리기 + using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(DisplayRectangle, BackColor, BackColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + pe.Graphics.FillRectangle(sb, DisplayRectangle); + } + + //테두리 그리기 + if (BorderSize > 0) + { + pe.Graphics.DrawRectangle(new Pen(this.BorderColor, BorderSize), + this.DisplayRectangle.Left, + this.DisplayRectangle.Top, + this.DisplayRectangle.Width - 1, + this.DisplayRectangle.Height - 1); + } + + //커서모양 + if (mouseOverItemIndex == -1) this.Cursor = Cursors.Arrow; + else this.Cursor = Cursors.Hand; + + if (rects == null) RemakeChartRect(); + if (rects != null && rects.Length > 0) + { + StringFormat sf = new StringFormat(StringFormatFlags.NoClip); + var items = menus.OrderBy(t => t.No); + int i = 0; + foreach (var menu in items) + { + var rect = rects[i]; + + //배경이 투명이 아니라면 그린다. + if (mouseOverItemIndex == i) + { + //마우스오버된놈이다. + using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, Color.FromArgb(100, Color.LightSkyBlue), Color.FromArgb(100, Color.DeepSkyBlue), System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + pe.Graphics.FillRectangle(sb, rect); + } + else + { + if (this.enablemenubakcolor == true && menu.BackColor != System.Drawing.Color.Transparent && menu.BackColor2 != System.Drawing.Color.Transparent) + { + using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, menu.BackColor, menu.BackColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + pe.Graphics.FillRectangle(sb, rect); + } + + } + + //이미지표시 + int ix, iy, iw, ih; + ix = iy = iw = ih = 0; + if (menu.Image != null) + { + ix = rect.Left; + iy = rect.Top; + iw = ImageSize.Width; + ih = ImageSize.Height; + + if (menu.ImageAlign == ContentAlignment.BottomCenter || menu.ImageAlign == ContentAlignment.BottomLeft || + menu.ImageAlign == ContentAlignment.BottomRight) iy += DisplayRectangle.Bottom - ih; + else if (menu.ImageAlign == ContentAlignment.MiddleCenter || menu.ImageAlign == ContentAlignment.MiddleLeft || + menu.ImageAlign == ContentAlignment.MiddleRight) iy += (int)(DisplayRectangle.Top + ((rect.Height - ih) / 2.0)); + else if (menu.ImageAlign == ContentAlignment.TopCenter || menu.ImageAlign == ContentAlignment.TopLeft || + menu.ImageAlign == ContentAlignment.TopRight) iy += DisplayRectangle.Top; + + if (menu.ImageAlign == ContentAlignment.BottomCenter || menu.ImageAlign == ContentAlignment.MiddleCenter || + menu.ImageAlign == ContentAlignment.TopCenter) ix += (int)(DisplayRectangle.Left + ((rect.Width - iw) / 2.0)); + else if (menu.ImageAlign == ContentAlignment.BottomLeft || menu.ImageAlign == ContentAlignment.MiddleLeft || + menu.ImageAlign == ContentAlignment.TopLeft) ix += DisplayRectangle.Left; + else if (menu.ImageAlign == ContentAlignment.BottomRight || menu.ImageAlign == ContentAlignment.MiddleRight || + menu.ImageAlign == ContentAlignment.TopRight) ix += DisplayRectangle.Right - iw; + + if (menu.ImagePadding.X != 0 || menu.ImagePadding.Y != 0) + { + ix += menu.ImagePadding.X; + iy += menu.ImagePadding.Y; + } + else + { + ix += ImagePadding.X; + iy += ImagePadding.Y; + } + if (menu.ImageSize.Width != 0 && menu.ImageSize.Height != 0) + { + iw = menu.ImageSize.Width; + ih = menu.ImageSize.Height; + } + + pe.Graphics.DrawImage(menu.Image, + new Rectangle(ix, iy, iw, ih)); + } + + //테두리를 그리는 속성과 트기가 설정된 경우에만 표시 + if (mouseOverItemIndex == i) + { + pe.Graphics.DrawRectangle(new Pen(Color.DeepSkyBlue), rect); + } + else + { + if (EnableMenuBorder && MenuBorderSize > 0) + { + using (var p = new Pen(menu.BorderColor, MenuBorderSize)) + pe.Graphics.DrawRectangle(p, rect); + } + } + + + //글자를 텍스트 이후에 붙이는 거라면? + if (menu.Image != null && TextAttachToImage) + { + var fsize = pe.Graphics.MeasureString(menu.Text, this.Font); + pe.Graphics.DrawString(menu.Text, this.Font, new SolidBrush(menu.ForeColor), + (float)(ix + iw + 1), + (float)(iy + ((ih - fsize.Height) / 2.0))); + } + else + { + if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.BottomLeft || + menu.TextAlign == ContentAlignment.BottomRight) sf.LineAlignment = StringAlignment.Far; + else if (menu.TextAlign == ContentAlignment.MiddleCenter || menu.TextAlign == ContentAlignment.MiddleLeft || + menu.TextAlign == ContentAlignment.MiddleRight) sf.LineAlignment = StringAlignment.Center; + else if (menu.TextAlign == ContentAlignment.TopCenter || menu.TextAlign == ContentAlignment.TopLeft || + menu.TextAlign == ContentAlignment.TopRight) sf.LineAlignment = StringAlignment.Near; + + if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.MiddleCenter || + menu.TextAlign == ContentAlignment.TopCenter) sf.Alignment = StringAlignment.Center; + else if (menu.TextAlign == ContentAlignment.BottomLeft || menu.TextAlign == ContentAlignment.MiddleLeft || + menu.TextAlign == ContentAlignment.TopLeft) sf.Alignment = StringAlignment.Near; + else if (menu.TextAlign == ContentAlignment.BottomRight || menu.TextAlign == ContentAlignment.MiddleRight || + menu.TextAlign == ContentAlignment.TopRight) sf.Alignment = StringAlignment.Far; + + pe.Graphics.DrawString(menu.Text, this.Font, new SolidBrush(menu.ForeColor), rect, sf); + } + i += 1; + } + sf.Dispose(); + } + //if(DesignMode) + //{ + // pe.Graphics.DrawString("deisgn", this.Font, Brushes.Red, 1, 1); + //} + } + + /// + /// arFrame 전용 속성값을 복사 합니다 + /// + /// + public void copyTo(MenuControl ctl) + { + ctl.backcolor = this.backcolor; + ctl.backcolor2 = this.BackColor2; + ctl.MenuWidth = this.menuwidth; + ctl.menugap = this.menugap; + ctl.menus = this.menus; + ctl.menubordersize = this.menubordersize; + ctl.padding = this.padding; + ctl.ForeColor = this.ForeColor; + ctl.Font = this.Font; + ctl.EnableMenuBackColor = this.EnableMenuBackColor; + ctl.EnableMenuBorder = this.EnableMenuBorder; + ctl.ImagePadding = this.ImagePadding; + ctl.ImageSize = this.ImageSize; + ctl.TextAttachToImage = this.TextAttachToImage; + ctl.bordercolor = this.bordercolor; + ctl.bordersize = this.bordersize; + } + + public void Save(string File) + { + //xml로 데이터를 저장자 + System.Text.StringBuilder NewXml = new System.Text.StringBuilder(); + NewXml.AppendLine(""); + NewXml.AppendLine(" "); + NewXml.AppendLine(""); + + if (System.IO.File.Exists(File)) System.IO.File.Delete(File); + System.IO.File.WriteAllText(File, NewXml.ToString().Replace('\'', '\"'), System.Text.Encoding.UTF8); + var vDocu = new XmlDocument(); + vDocu.Load(File); + //var nsmgr = new XmlNamespaceManager(new System.Xml.NameTable()); + //nsmgr.AddNamespace("x", "http://tindevil.com"); + var Root = vDocu.DocumentElement; + + //저장하려는 속성목록을 먼저 생성한다 + //미사용 목록이 너무 많아서 그렇게 함 + foreach (var m in this.GetType().GetMethods()) + { + var mName = m.Name.ToLower(); + if (mName.StartsWith("get_") == false || mName == "get_menus") continue; + + var pt = this.GetType().GetProperty(m.Name.Substring(4)); + if (pt != null) + { + var categoryName = GetCategoryName(pt); + if (categoryName.ToLower() != "arframe") continue; + + //자료형에따라서 그값을 변경한다 + var value = m.Invoke(this, null); + var newNode = vDocu.CreateElement(pt.Name);// m.Name.Substring(4)); + newNode.InnerText = getValueString(m, value); + Root.AppendChild(newNode); + } + } + + + foreach (var item in this.menus.OrderBy(t => t.No)) + { + var node = vDocu.CreateElement("Item"); + var attNo = vDocu.CreateAttribute("No"); + attNo.Value = item.No.ToString(); + node.Attributes.Append(attNo); + + foreach (var m in item.GetType().GetMethods()) + { + var mName = m.Name.ToLower(); + if (mName.StartsWith("get_") == false || mName == "get_no") continue; + + var value = m.Invoke(item, null); + var sNode = vDocu.CreateElement(m.Name.Substring(4)); + sNode.InnerText = getValueString(m, value); + node.AppendChild(sNode); + } + Root.AppendChild(node); + } + vDocu.Save(File); + } + + public void Load(string File) + { + if (System.IO.File.Exists(File) == false) return; + + List NewMenu = new List(); + var vDocu = new XmlDocument(); + vDocu.Load(File); + var Root = vDocu.DocumentElement; //루트요소(Tindevil) + + + + //저장하려는 속성목록을 먼저 생성한다 + //미사용 목록이 너무 많아서 그렇게 함 + foreach (var m in this.GetType().GetMethods()) + { + var mName = m.Name.ToLower(); + if (mName.StartsWith("get_") == false || mName == "get_menus") continue; + + var methodName = m.Name.Substring(4); + var pt = this.GetType().GetProperty(methodName); + if (pt != null) + { + var categoryName = GetCategoryName(pt); + if (categoryName.ToLower() != "arframe") continue; + + //SEt명령이 있어야 사용이 가능하다 + var setMethod = this.GetType().GetMethod("set_" + methodName); + if (setMethod == null) continue; + + //값을 읽어온다 + var Node = Root.SelectSingleNode(methodName); + if (Node != null) + { + var strValue = Node.InnerText; + var value = getValueFromString(m.ReturnType, strValue); // setValueString(m.ReturnType, setMethod, strValue); + setMethod.Invoke(this, new object[] { value }); + } + } + } + + + //foreach (var item in this.menus.OrderBy(t => t.No)) + //{ + // var node = vDocu.CreateElement("Item"); + // var attNo = vDocu.CreateAttribute("No"); + // attNo.Value = item.No.ToString(); + // node.Attributes.Append(attNo); + + // foreach (var m in item.GetType().GetMethods()) + // { + // var mName = m.Name.ToLower(); + // if (mName.StartsWith("get_") == false || mName == "get_no") continue; + + // var value = m.Invoke(item, null); + // var sNode = vDocu.CreateElement(m.Name.Substring(4)); + // sNode.InnerText = getValueString(m, value); + // node.AppendChild(sNode); + // } + // Root.AppendChild(node); + //} + } + + + private string getValueString(System.Reflection.MethodInfo m, object value) + { + var strValue = ""; + string valuetype = m.ReturnType.Name.ToLower(); + if (m.ReturnType == typeof(System.Drawing.Color)) + strValue = ((System.Drawing.Color)value).ToArgb().ToString(); + else if (m.ReturnType == typeof(System.Drawing.Rectangle)) + { + var rect = (System.Drawing.Rectangle)value; + strValue = string.Format("{0};{1};{2};{3}", rect.Left, rect.Top, rect.Width, rect.Height); + } + else if (m.ReturnType == typeof(System.Drawing.RectangleF)) + { + var rectf = (System.Drawing.RectangleF)value; + strValue = string.Format("{0};{1};{2};{3}", rectf.Left, rectf.Top, rectf.Width, rectf.Height); + } + else if (m.ReturnType == typeof(Boolean)) + { + strValue = ((Boolean)value) ? "1" : "0"; + } + else if (m.ReturnType == typeof(System.Drawing.Point)) + { + var pt1 = (Point)value; + strValue = string.Format("{0};{1}", pt1.X, pt1.Y); + } + else if (m.ReturnType == typeof(System.Drawing.PointF)) + { + var ptf = (PointF)value; + strValue = string.Format("{0};{1}", ptf.X, ptf.Y); + } + else if (m.ReturnType == typeof(System.Drawing.Size)) + { + var sz = (Size)value; + strValue = string.Format("{0};{1}", sz.Width, sz.Height); + } + else if (m.ReturnType == typeof(System.Drawing.SizeF)) + { + var szf = (SizeF)value; + strValue = string.Format("{0};{1}", szf.Width, szf.Height); + } + else if (m.ReturnType == typeof(System.Drawing.Bitmap)) + { + var bitmap = (Bitmap)value; + + // Convert the image to byte[] + System.IO.MemoryStream stream = new System.IO.MemoryStream(); + bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); + byte[] imageBytes = stream.ToArray(); + strValue = Convert.ToBase64String(imageBytes); + } + else if (m.ReturnType == typeof(System.Windows.Forms.Padding)) + { + var pd = (System.Windows.Forms.Padding)value; + strValue = string.Format("{0};{1};{2};{3}", pd.Left, pd.Top, pd.Right, pd.Bottom); + } + else + strValue = value.ToString(); + return strValue; + } + + + private object getValueFromString(Type ReturnType, string strValue) + { + + + if (ReturnType == typeof(System.Drawing.Color)) + { + var cint = int.Parse(strValue); + return System.Drawing.Color.FromArgb(cint); + } + else if (ReturnType == typeof(System.Drawing.Rectangle)) + { + var buf = strValue.Split(';'); + var x = int.Parse(buf[0]); + var y = int.Parse(buf[1]); + var w = int.Parse(buf[2]); + var h = int.Parse(buf[3]); + return new Rectangle(x, y, w, h); + } + else if (ReturnType == typeof(System.Drawing.RectangleF)) + { + var buf = strValue.Split(';'); + var x = float.Parse(buf[0]); + var y = float.Parse(buf[1]); + var w = float.Parse(buf[2]); + var h = float.Parse(buf[3]); + return new RectangleF(x, y, w, h); + } + else if (ReturnType == typeof(Boolean)) + { + return strValue == "1"; + } + else if (ReturnType == typeof(System.Drawing.Point)) + { + var buf = strValue.Split(';'); + var x = int.Parse(buf[0]); + var y = int.Parse(buf[1]); + return new Point(x, y); + } + else if (ReturnType == typeof(System.Drawing.PointF)) + { + var buf = strValue.Split(';'); + var x = float.Parse(buf[0]); + var y = float.Parse(buf[1]); + return new PointF(x, y); + } + else if (ReturnType == typeof(System.Drawing.Size)) + { + var buf = strValue.Split(';'); + var x = int.Parse(buf[0]); + var y = int.Parse(buf[1]); + return new Size(x, y); + } + else if (ReturnType == typeof(System.Drawing.SizeF)) + { + var buf = strValue.Split(';'); + var x = float.Parse(buf[0]); + var y = float.Parse(buf[1]); + return new SizeF(x, y); + } + else if (ReturnType == typeof(System.Drawing.Bitmap)) + { + //문자을을 바이트로 전환다 + byte[] imageBytes = Convert.FromBase64String(strValue); + + Bitmap retval = null; + using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageBytes)) + retval = new Bitmap(stream); + return retval; + } + else if (ReturnType == typeof(System.Windows.Forms.Padding)) + { + var buf = strValue.Split(';'); + var x = int.Parse(buf[0]); + var y = int.Parse(buf[1]); + var w = int.Parse(buf[2]); + var h = int.Parse(buf[3]); + return new Padding(x, y, w, h); + } + else if (ReturnType == typeof(Int16)) return Int16.Parse(strValue); + else if (ReturnType == typeof(Int32)) return Int32.Parse(strValue); + else if (ReturnType == typeof(Int64)) return Int64.Parse(strValue); + else if (ReturnType == typeof(UInt16)) return UInt16.Parse(strValue); + else if (ReturnType == typeof(UInt32)) return UInt32.Parse(strValue); + else + return strValue; + } + + + + public string GetCategoryName(System.Reflection.PropertyInfo m) + { + var displayName = m + .GetCustomAttributes(typeof(CategoryAttribute), true) + .FirstOrDefault() as CategoryAttribute; + + if (displayName != null) + return displayName.Category; + + return ""; + } + public string GetDisplayName(System.Reflection.MethodInfo m) + { + var displayName = m + .GetCustomAttributes(typeof(DisplayNameAttribute), true) + .FirstOrDefault() as DisplayNameAttribute; + + if (displayName != null) + return displayName.DisplayName; + + return ""; + } + + public void RemakeChartRect() + { + if (rects != null) rects = null; + if (menus == null || menus.Length < 1) return; + + rects = new Rectangle[menus.Length]; + int leftIdx = 0; + int rightIdx = 0; + int leftAcc = 0; + int rightAcc = 0; + + + int i = 0; + var menuList = this.menus.OrderBy(t => t.No).ToArray(); + foreach (var menu in menuList) + { + int x, y, w, h; + // var menu = menus[i]; + + var mWidth = menuwidth; + if (menu.MenuWidth > 0) mWidth = menu.MenuWidth; + + w = mWidth; + h = DisplayRectangle.Height - Padding.Top - Padding.Bottom; + + if (menu.isRightMenu) + { + x = DisplayRectangle.Right - Padding.Right - (rightAcc) - (MenuGap * rightIdx); + y = DisplayRectangle.Top + Padding.Top; + rightAcc += 0;// = 0;// x; + rightIdx += 1; + } + else + { + x = DisplayRectangle.Left + Padding.Left + leftAcc + (MenuGap * leftIdx); + y = DisplayRectangle.Top + Padding.Top; + leftAcc += mWidth; + leftIdx += 1; + } + rects[i] = new Rectangle(x, y, w, h); + i += 1; + } + } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuItem.cs b/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuItem.cs new file mode 100644 index 0000000..87347bc --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuItem.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace arFrame.Control +{ + [TypeConverterAttribute(typeof(ExpandableObjectConverter))] + public class MenuItem + { + [Category("arFrame"),DisplayName("메뉴이름")] + public string Text { get; set; } + [Category("arFrame"), DisplayName("색상-테두리"), Description("메뉴속성의 테두리 기능이 켜져야 합니다")] + public System.Drawing.Color BorderColor { get; set; } + [Category("arFrame"),DisplayName("색상-배경1"),Description("메뉴속성의 배경 기능이 켜져야 합니다")] + public System.Drawing.Color BackColor { get; set; } + [Category("arFrame"), DisplayName("색상-배경2"), Description("메뉴속성의 배경 기능이 켜져야 합니다")] + public System.Drawing.Color BackColor2 { get; set; } + [Category("arFrame"),DisplayName("색상-글자")] + public System.Drawing.Color ForeColor { get; set; } + [Category("arFrame"),DisplayName("메뉴 구분자로 사용합니다")] + public Boolean isSeparate { get; set; } + [Category("arFrame"),DisplayName("오른쪽 붙임")] + public Boolean isRightMenu { get; set; } + [Category("arFrame"),DisplayName("실행 명령")] + public string Command { get; set; } + [Category("arFrame"),DisplayName("아이콘 이미지")] + public System.Drawing.Bitmap Image { get; set; } + [Category("arFrame"),DisplayName("글자 정렬 방식")] + public System.Drawing.ContentAlignment TextAlign { get; set; } + [Category("arFrame"),DisplayName("이미지 정렬 방식")] + public System.Drawing.ContentAlignment ImageAlign { get; set; } + [Category("arFrame"),DisplayName("글자 여백")] + public System.Windows.Forms.Padding Padding { get; set; } + [Category("arFrame"),DisplayName("메뉴 사용여부"),Description("활성화시 메뉴의 클릭이벤트가 발생하지 않습니다")] + public Boolean Enable { get; set; } + [Category("arFrame"),DisplayName("이미지 표시 여백(좌,상)")] + public System.Drawing.Point ImagePadding { get; set; } + [Category("arFrame"),DisplayName("이미지 표시 크기(너비,높이)")] + public System.Drawing.Size ImageSize { get; set; } + [Category("arFrame"),DisplayName("메뉴 간격")] + public int MenuWidth { get; set; } + + [Category("arFrame"),DisplayName("번호")] + public int No { get; set; } + + public MenuItem() + { + Enable = true; + BorderColor = System.Drawing.Color.FromArgb(20, 20, 20); + BackColor = System.Drawing.Color.DimGray; + BackColor2 = System.Drawing.Color.FromArgb(100, 100, 100); + ForeColor = System.Drawing.Color.Black; + Text = "Menu"; + isRightMenu = false; + Command = string.Empty; + Image = null; + isSeparate = false; + TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + Padding = new System.Windows.Forms.Padding(0, 0, 0, 0); + ImagePadding = new System.Drawing.Point(0, 0); + ImageSize = new System.Drawing.Size(0, 0); + MenuWidth = 0; + No = 0; + } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotCommandButton.Designer.cs b/Cs_HMI/SubProject/arFrameControl/MotCommandButton.Designer.cs new file mode 100644 index 0000000..953c119 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotCommandButton.Designer.cs @@ -0,0 +1,36 @@ +namespace arFrame.Control +{ + partial class MotCommandButton + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotCommandButton.cs b/Cs_HMI/SubProject/arFrameControl/MotCommandButton.cs new file mode 100644 index 0000000..b305825 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotCommandButton.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace arFrame.Control +{ + public partial class MotCommandButton : Button + { + public enum eCommand + { + AbsoluteMove = 0, + RelativeMove , + AcceptPosition + } + public MotCommandButton() + { + InitializeComponent(); + motCommand = eCommand.AbsoluteMove; + motValueControl = null; + motAccControl = null; + motSpdControl = null; + } + public MotValueNumericUpDown motValueControl { get; set; } + public MotValueNumericUpDown motAccControl { get; set; } + public MotValueNumericUpDown motSpdControl { get; set; } + public eCommand motCommand { get; set; } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.Designer.cs b/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.Designer.cs new file mode 100644 index 0000000..15ccadf --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.Designer.cs @@ -0,0 +1,36 @@ +namespace arFrame.Control +{ + partial class MotLinkLabel + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.cs b/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.cs new file mode 100644 index 0000000..c20b6ad --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace arFrame.Control +{ + public partial class MotLinkLabel : System.Windows.Forms.LinkLabel + { + public MotLinkLabel() + { + InitializeComponent(); + this.LinkColor = Color.Chartreuse; + } + public MotValueNumericUpDown motValueControl { get; set; } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.Designer.cs b/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.Designer.cs new file mode 100644 index 0000000..1541105 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.Designer.cs @@ -0,0 +1,36 @@ +namespace arFrame.Control +{ + partial class MotValueNumericUpDown + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.cs b/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.cs new file mode 100644 index 0000000..c13ca3d --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace arFrame.Control +{ + public partial class MotValueNumericUpDown : NumericUpDown + { + public MotValueNumericUpDown() + { + InitializeComponent(); + MotionIndex = -1; + } + public int MotionIndex { get; set; } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotionView/MotITem.cs b/Cs_HMI/SubProject/arFrameControl/MotionView/MotITem.cs new file mode 100644 index 0000000..24f74fa --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotionView/MotITem.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace arFrame.Control +{ + [TypeConverterAttribute(typeof(ExpandableObjectConverter))] + public class MotITem + { + public int idx { get; private set; } + [Category("arFrame"), DisplayName("Tag")] + public string Tag { get; set; } + [Category("arFrame"), DisplayName("글자 정렬 방식")] + public System.Drawing.ContentAlignment TextAlign { get; set; } + [Category("arFrame"), DisplayName("글자 여백")] + public System.Windows.Forms.Padding Padding { get; set; } + [Category("arFrame"), DisplayName("메뉴 사용여부"), Description("활성화시 메뉴의 클릭이벤트가 발생하지 않습니다")] + public Boolean Enable { get; set; } + public string Text { get; set; } + + public Boolean Dirty { get; set; } + + public System.Drawing.Rectangle[] subRect = null; + + //모션 상태값 + public Boolean[] State; + public double Position { get; set; } + public double PositionCmd { get; set; } + public System.Drawing.Color PositionColor { get; set; } + + public System.Drawing.RectangleF rect { get; set; } + + [Category("arFrame"), DisplayName("번호")] + public int No { get; set; } + + public MotITem(int idx_) + { + this.Dirty = true; + PositionColor = System.Drawing.Color.White; + subRect = new System.Drawing.Rectangle[6]; + rect = System.Drawing.RectangleF.Empty; + Enable = true; + this.idx = idx_; + TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + Padding = new System.Windows.Forms.Padding(0, 0, 0, 0); + No = 0; + this.Text = string.Empty; + this.Enable = true; + this.State = new bool[] { false,false,false,false,false,false}; + Position = 0; + PositionCmd = 0; + } + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.Designer.cs b/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.Designer.cs new file mode 100644 index 0000000..be4639e --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.Designer.cs @@ -0,0 +1,36 @@ +namespace arFrame.Control +{ + partial class MotionDisplay + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 구성 요소 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.cs b/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.cs new file mode 100644 index 0000000..c770c5a --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.cs @@ -0,0 +1,306 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace arFrame.Control +{ + public partial class MotionDisplay : System.Windows.Forms.Control + { + private Color[] colorB1 = new Color[] { + Color.MediumSeaGreen, + Color.DeepSkyBlue, + Color.Tomato, + Color.Purple, + Color.Tomato, + Color.FromArgb(40,40,40) + }; + private Color[] colorB2 = new Color[] { + Color.SeaGreen, + Color.SteelBlue, + Color.Red, + Color.Indigo, + Color.Red, + Color.FromArgb(30,30,30) + }; + + private StringFormat sf = new StringFormat(); + private string[] IndiName = new string[] { "INP","ORG","LIM","HST","ALM","" }; + public MotITem[] Items; + private int _colcount = 3; + private int _rowcount = 2; + private Color _bordercolor = Color.Black; + private Color _gridcolor = Color.FromArgb(50, 50, 50); + private int _bordersize = 1; + private Padding _padding; + private string _postionformat = ""; + private int _headerHeight = 16; + private Font _headerfont = new Font("Consolas",7f); + + + private int itemCount { get { return _colcount * _rowcount; } } + + public new Font Font { get { return base.Font; } set { base.Font = value; this.Invalidate(); } } + public Font HeaderFont { get { return _headerfont; } set { _headerfont = value; this.Invalidate(); } } + public int HeaderHeight { get { return _headerHeight; } set { _headerHeight = value; RemakeChartRect(); this.Invalidate(); } } + public new Padding Padding { get { if (_padding == null) return Padding.Empty; else return _padding; } set { _padding = value; RemakeChartRect(); Invalidate(); } } + public int ColumnCount { get { return _colcount; } set { _colcount = value; ResetArray(); RemakeChartRect(); } } + public int RowCount { get { return _rowcount; } set { _rowcount = value; ResetArray(); RemakeChartRect(); } } + public int BorderSize { get { return _bordersize; } set { _bordersize = value; Invalidate(); } } + public Color BorderColor { get { return _bordercolor; } set { _bordercolor = value; Invalidate(); } } + public string PositionDisplayFormat { get { return _postionformat; } set { _postionformat = value; Invalidate(); } } + public Color GridColor { get { return _gridcolor; } set { _gridcolor = value; Invalidate(); } } + + public new Boolean Enabled { get { return base.Enabled; } set { base.Enabled = value; Invalidate(); } } + + public MotionDisplay() + { + InitializeComponent(); + + // Set Optimized Double Buffer to reduce flickering + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + + // Redraw when resized + this.SetStyle(ControlStyles.ResizeRedraw, true); + sf.LineAlignment = StringAlignment.Center; + sf.Alignment = StringAlignment.Center; + + + //값과 이름은 외부의 값을 사용한다 + ResetArray(); + + if (MinimumSize.Width == 0 || MinimumSize.Height == 0) + MinimumSize = new Size(100, 50); + } + + void ResetArray() + { + + } + + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + RemakeChartRect(); + } + + public void RemakeChartRect() + { + if (DisplayRectangle == Rectangle.Empty) return; + + var baseRect = new Rectangle( + DisplayRectangle.Left + _padding.Left, + DisplayRectangle.Top + _padding.Top, + DisplayRectangle.Width - _padding.Left - _padding.Right, + DisplayRectangle.Height - _padding.Top - _padding.Bottom); + + double x = 0; + double y = 0; + double w = baseRect.Width / (_colcount * 1.0); + double h = baseRect.Height / (_rowcount * 1.0); + + if (this.Items == null || itemCount != this.Items.Length) + { + //아이템갯수가 달라졌으므로 다시 갱신해야함 + var item = new MotITem[RowCount * ColumnCount]; + for (int r = 0; r < RowCount; r++) + { + for (int c = 0; c < ColumnCount; c++) + { + int idx = r * ColumnCount + c; + item[idx] = new MotITem(idx); + item[idx].Enable = false; + item[idx].Padding = new Padding(0, 0, 0, 0); + item[idx].TextAlign = ContentAlignment.MiddleCenter; + x = baseRect.Left + (c * w); + y = baseRect.Top + (r * h); + item[idx].rect = new RectangleF((float)x, (float)y, (float)w, (float)h); + item[idx].Dirty = true; + } + } + + this.Items = item; + } + else + { + //아이템의 갯수는 같으므로 좌표값만 변경해준다. + for (int r = 0; r < RowCount; r++) + { + for (int c = 0; c < ColumnCount; c++) + { + int idx = r * ColumnCount + c; + var item = Items[idx]; + x = (c * w); + y = (r * h); + item.rect = new RectangleF((float)x, (float)y, (float)w, (float)h); + item.Dirty = true; + } + } + } + this.Invalidate(); + + } + + protected override void OnPaint(PaintEventArgs pe) + { + //배경그리기 + //using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(DisplayRectangle, BackColor, BackColor2On, System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + pe.Graphics.FillRectangle(new SolidBrush(this.BackColor), DisplayRectangle); + + if (Items == null) + { + pe.Graphics.DrawString("no items", this.Font, Brushes.Red, 100, 100); + return; + } + + var items = Items.OrderBy(t => t.No); + foreach (var menu in items) + { + drawItem(menu.idx, pe.Graphics); + } + + //테두리 그리기 + if (BorderSize > 0) + { + pe.Graphics.DrawRectangle(new Pen(this.BorderColor, BorderSize), + this.DisplayRectangle.Left, + this.DisplayRectangle.Top, + this.DisplayRectangle.Width - 1, + this.DisplayRectangle.Height - 1); + } + } + + private void drawItem(int itemIndex, Graphics g = null) + { + if (g == null) g = this.CreateGraphics(); + var item = this.Items[itemIndex]; + + // g.DrawString("rect null", this.Font, Brushes.White, 100, 100); + + if (item.rect == RectangleF.Empty) return; + + var rect = item.rect;// rects[i]; + + var diplayText = item.Text; + + //byte Value = 0; + + //배경이 투명이 아니라면 그린다. + //var bgColor1 = Color.DarkBlue; //BackColor1Off; + //var bgColor2 = Color.Blue;// BackColor2Off; + + //if (Value != 0 && item.Enable != false) + //{ + // //bgColor1 = Value == 1 ? BackColor1On : BackColor1Err; + // //bgColor2 = Value == 1 ? BackColor2On : BackColor2Err; + //} + + //using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, bgColor1, bgColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + // g.FillRectangle(sb, rect); + + // if (mouseOverItemIndex == menu.idx) + // this.Cursor = Cursors.Hand; + // else + // this.Cursor = Cursors.Arrow; + + //테두리를 그리는 속성과 트기가 설정된 경우에만 표시 + //if (mouseOverItemIndex == i) + // { + // pe.Graphics.DrawRectangle(new Pen(Color.DeepSkyBlue), rect.Left, rect.Top, rect.Width, rect.Height); + //} + //else + { + // using (var p = new Pen(BorderColor, 1)) + // g.DrawRectangle(p, rect.Left, rect.Top, rect.Width, rect.Height); + } + + //총 5개의 인디게이터와 하단에 위치값을 표시하는 영역이 있따. + //줄 영역은 50%비율로 처리함 + if(item.Dirty) + { + //각 영역을 다시 그려줘야한다. + var indiWidth = rect.Width / 5.0; + // var indiHeight = rect.Height / 2.0; + for (int c = 0; c < 5; c++) + { + item.subRect[c] = new Rectangle((int)(c * indiWidth + item.rect.Left), (int)(item.rect.Top), (int)indiWidth, (int)HeaderHeight); + } + item.Dirty = false; + + //위치값을 나타내는 영역 + item.subRect[5] = new Rectangle((int)item.rect.Left, (int)(item.rect.Top + HeaderHeight), (int)rect.Width, (int)rect.Height - HeaderHeight ); + + } + + for(int i = 0 ; i < item.subRect.Length;i++) + { + var B1 = colorB1[i]; + var B2 = colorB2[i]; + + if (i < (item.subRect.Length - 1)) //상태표시칸은 현재 값에 따라서 색상을 달리한다 + { + if ( this.Enabled == false || (item.State[i] == false && DesignMode == false)) + { + B1 = Color.FromArgb(20,20,20); + B2 = Color.FromArgb(50,50,50); + } + } + + var rt = item.subRect[i]; + using (var br = new System.Drawing.Drawing2D.LinearGradientBrush(rt, B1, B2, System.Drawing.Drawing2D.LinearGradientMode.Vertical)) + g.FillRectangle(br, rt); + + // g.DrawRectangle(Pens.Yellow, rt); + if (i < (item.subRect.Length-1)) + { + sf.Alignment = StringAlignment.Center; + sf.LineAlignment = StringAlignment.Center; + g.DrawString(IndiName[i], HeaderFont, Brushes.White, rt, sf); + } + else + { + sf.LineAlignment = StringAlignment.Center; + sf.Alignment = StringAlignment.Far; + g.DrawString(item.Position.ToString(PositionDisplayFormat) + " [" + item.PositionCmd.ToString(PositionDisplayFormat) + "] ", + this.Font, + new SolidBrush(item.PositionColor), + rt, + sf); + } + } + + //테두리선은 우측만 처리한다 + for (int i = 0; i < item.subRect.Length ; i++) + { + var rt = item.subRect[i]; + var x1 = rt.Right; + var y1 = rt.Top; + var x2 = rt.Right; + var y2 = rt.Bottom; + g.DrawLine(new Pen(GridColor), x1, y1, x2, y2); + } + var posRect = item.subRect[item.subRect.Length - 1]; + g.DrawLine(new Pen(Color.Black,1), posRect.Left, posRect.Top, posRect.Right, posRect.Top); + + + //인덱스번호 출력 + if (diplayText != "") + { + g.DrawString(string.Format("[{0}] {1}", item.idx, diplayText), + this.Font, new SolidBrush(this.ForeColor), + item.rect.Left + 3, item.rect.Top + 3); + } + + + + } + + } +} diff --git a/Cs_HMI/SubProject/arFrameControl/Properties/AssemblyInfo.cs b/Cs_HMI/SubProject/arFrameControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a63a2d8 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다. +// 어셈블리와 관련된 정보를 수정하려면 +// 이 특성 값을 변경하십시오. +[assembly: AssemblyTitle("arFrameControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("arFrameControl")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("9fa3ef10-3c75-40a2-b3e6-a37900b26d0e")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 버전이 자동으로 +// 지정되도록 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/SubProject/arFrameControl/arFrameControl.csproj b/Cs_HMI/SubProject/arFrameControl/arFrameControl.csproj new file mode 100644 index 0000000..1ff2b94 --- /dev/null +++ b/Cs_HMI/SubProject/arFrameControl/arFrameControl.csproj @@ -0,0 +1,103 @@ + + + + + Debug + AnyCPU + {A16C9667-5241-4313-888E-548375F85D29} + Library + Properties + arFrame.Control + arFrameControl + v4.8 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + Component + + + MotCommandButton.cs + + + + Component + + + GridView.cs + + + Component + + + MenuControl.cs + + + + + Component + + + MotionDisplay.cs + + + Component + + + MotLinkLabel.cs + + + Component + + + MotValueNumericUpDown.cs + + + + + + {f31c242c-1b15-4518-9733-48558499fe4b} + arControl + + + + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs b/Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs new file mode 100644 index 0000000..9f11f63 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Form1.Designer.cs @@ -0,0 +1,166 @@ +namespace Test_BMS +{ + partial class Form1 + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.logTextBox1 = new arCtl.LogTextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(27, 35); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(131, 20); + this.comboBox1.TabIndex = 0; + this.comboBox1.Text = "com15"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(301, 35); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(108, 20); + this.button1.TabIndex = 1; + this.button1.Text = "connect"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(415, 34); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(106, 20); + this.button2.TabIndex = 1; + this.button2.Text = "close"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // comboBox2 + // + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Items.AddRange(new object[] { + "9600", + "12800", + "25600", + "250000"}); + this.comboBox2.Location = new System.Drawing.Point(164, 35); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(131, 20); + this.comboBox2.TabIndex = 2; + this.comboBox2.Text = "9600"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(27, 13); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(26, 12); + this.label1.TabIndex = 3; + this.label1.Text = "port"; + this.label1.Click += new System.EventHandler(this.label1_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(162, 13); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(33, 12); + this.label2.TabIndex = 3; + this.label2.Text = "baud"; + // + // logTextBox1 + // + this.logTextBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24))))); + this.logTextBox1.ColorList = new arCtl.sLogMessageColor[0]; + this.logTextBox1.DateFormat = "yy-MM-dd HH:mm:ss"; + this.logTextBox1.DefaultColor = System.Drawing.Color.LightGray; + this.logTextBox1.EnableDisplayTimer = true; + this.logTextBox1.EnableGubunColor = true; + this.logTextBox1.Font = new System.Drawing.Font("Consolas", 9F); + this.logTextBox1.ListFormat = "[{0}] {1}"; + this.logTextBox1.Location = new System.Drawing.Point(27, 87); + this.logTextBox1.MaxListCount = ((ushort)(200)); + this.logTextBox1.MaxTextLength = ((uint)(4000u)); + this.logTextBox1.MessageInterval = 50; + this.logTextBox1.Name = "logTextBox1"; + this.logTextBox1.Size = new System.Drawing.Size(494, 351); + this.logTextBox1.TabIndex = 4; + this.logTextBox1.Text = ""; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(301, 61); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(220, 20); + this.button3.TabIndex = 5; + this.button3.Text = "send query"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(574, 450); + this.Controls.Add(this.button3); + this.Controls.Add(this.logTextBox1); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.comboBox2); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.comboBox1); + this.Name = "Form1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private arCtl.LogTextBox logTextBox1; + private System.Windows.Forms.Button button3; + } +} + diff --git a/Cs_HMI/TestProject/Test_BMS/Form1.cs b/Cs_HMI/TestProject/Test_BMS/Form1.cs new file mode 100644 index 0000000..e6a6518 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Form1.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Test_BMS +{ + public partial class Form1 : Form + { + arDev.BMS bms; + public Form1() + { + InitializeComponent(); + bms = new arDev.BMS(); + bms.BMSDataReceive += Bms_BMSDataReceive; + bms.Message += Bms_Message; + } + + private void Bms_Message(object sender, arDev.arRS232.MessageEventArgs e) + { + var sb = new System.Text.StringBuilder(); + if (e.Data != null) + { + foreach (var b in e.Data) + sb.Append(" " + b.ToString("X2")); + } + else sb.Append(e.Message); + addmsg($"{e.MsgType}:{sb}"); + } + + private void Bms_BMSDataReceive(object sender, EventArgs e) + { + //최종 데이터가 수신되는 경우 + string msg = $"{bms.Current_Volt}v,{bms.Current_Level}%,{bms.Current_Amp}/{bms.Current_MaxAmp}"; + addmsg("Recv:" + msg); + } + + + void addmsg(string m) + { + if (logTextBox1.InvokeRequired) + { + logTextBox1.BeginInvoke(new Action(() => { + logTextBox1.AddMsg(m); + })); + } + else + { + logTextBox1.AddMsg(m); + } + } + + private void Bms_RxData(object sender, arDev.BMS.ReceiveDataEventArgs e) + { + addmsg("Rx:" + e.StrValue); + } + + private void Form1_Load(object sender, EventArgs e) + { + this.comboBox1.Items.Clear(); + foreach (var port in System.IO.Ports.SerialPort.GetPortNames()) + this.comboBox1.Items.Add(port); + } + + private void button1_Click(object sender, EventArgs e) + { + bms.BaudRate = int.Parse(this.comboBox2.Text); + bms.PortName = comboBox1.Text; + bms.Open(); + addmsg($"open:{bms.IsOpen}"); + } + + private void button2_Click(object sender, EventArgs e) + { + bms.Close(); + } + + private void button3_Click(object sender, EventArgs e) + { + bms.SendQuery(); + } + + private void label1_Click(object sender, EventArgs e) + { + comboBox1.Text = "COM41"; + } + } +} diff --git a/Cs_HMI/TestProject/Test_BMS/Form1.resx b/Cs_HMI/TestProject/Test_BMS/Form1.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_BMS/Program.cs b/Cs_HMI/TestProject/Test_BMS/Program.cs new file mode 100644 index 0000000..868a592 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace Test_BMS +{ + static class Program + { + /// + /// 해당 응용 프로그램의 주 진입점입니다. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/Cs_HMI/TestProject/Test_BMS/Properties/AssemblyInfo.cs b/Cs_HMI/TestProject/Test_BMS/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0d1b439 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("BMS Commnunication Module Test")] +[assembly: AssemblyDescription("BMS Commnunication Module Test")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("BMS Commnunication Module Test")] +[assembly: AssemblyProduct("BMS Test Software")] +[assembly: AssemblyCopyright("Copyright ©ATK4 2020")] +[assembly: AssemblyTrademark("ATK4")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("ce3fff9f-6aca-44bd-b64a-33ff4ad5e82e")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 +// 지정되도록 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("20.03.09.0")] +[assembly: AssemblyFileVersion("20.03.09.0")] diff --git a/Cs_HMI/TestProject/Test_BMS/Properties/Resources.Designer.cs b/Cs_HMI/TestProject/Test_BMS/Properties/Resources.Designer.cs new file mode 100644 index 0000000..888e033 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Test_BMS.Properties { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Test_BMS.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_BMS/Properties/Resources.resx b/Cs_HMI/TestProject/Test_BMS/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_BMS/Properties/Settings.Designer.cs b/Cs_HMI/TestProject/Test_BMS/Properties/Settings.Designer.cs new file mode 100644 index 0000000..03db24a --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Test_BMS.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_BMS/Properties/Settings.settings b/Cs_HMI/TestProject/Test_BMS/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Cs_HMI/TestProject/Test_BMS/Sample.txt b/Cs_HMI/TestProject/Test_BMS/Sample.txt new file mode 100644 index 0000000..5c46548 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Sample.txt @@ -0,0 +1,8 @@ +[22-12-27 14:32:49] open:True +[22-12-27 14:32:49] Send: DD A5 03 00 FF FD 77 0D +[22-12-27 14:32:50] Send: DD A5 03 00 FF FD 77 0D +[22-12-27 14:32:50] Recv:26.61v,81.4% +[22-12-27 14:32:50] Recv: DD 03 00 1B 0A 65 00 00 21 63 29 04 00 00 2C 92 00 00 00 00 00 00 28 51 03 08 02 0B 69 0B 66 FC 9C 77 +[22-12-27 14:32:50] Send: DD A5 03 00 FF FD 77 0D +[22-12-27 14:32:51] Recv:26.61v,81.4% +[22-12-27 14:32:51] Recv: DD 03 00 1B 0A 65 00 00 21 63 29 04 00 00 2C 92 00 00 00 00 00 00 28 51 03 08 02 0B 69 0B 66 FC 9C 77 diff --git a/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj b/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj new file mode 100644 index 0000000..9bfe482 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj @@ -0,0 +1,103 @@ + + + + + Debug + AnyCPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E} + WinExe + Test_BMS + Test_BMS + v4.8 + 512 + true + + + + x86 + true + full + false + ..\..\..\..\..\..\..\..\Amkor\AGV2\Test\BMS\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\DLL\arControl.Net4.dll + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {7a94c30c-6772-4f71-bf9c-0df071a1bc70} + BMS + + + {14e8c9a5-013e-49ba-b435-efefc77dd623} + CommData + + + + + + + + xcopy "$(TargetDir)*.exe" "\\192.168.1.80\Amkor\AGV2\Test\BMS" /Y +xcopy "$(TargetDir)*.dll" "\\192.168.1.80\Amkor\AGV2\Test\BMS" /Y + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_BMS/app.config b/Cs_HMI/TestProject/Test_BMS/app.config new file mode 100644 index 0000000..2c0f559 --- /dev/null +++ b/Cs_HMI/TestProject/Test_BMS/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Cs_HMI/TestProject/Test_NLRF100/Form1.Designer.cs b/Cs_HMI/TestProject/Test_NLRF100/Form1.Designer.cs new file mode 100644 index 0000000..c726f10 --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Form1.Designer.cs @@ -0,0 +1,222 @@ +namespace Test_NLRF100 +{ + partial class Form1 + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.radRs232 = new System.Windows.Forms.RadioButton(); + this.radTcp = new System.Windows.Forms.RadioButton(); + this.tbAddr = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.btOpen = new System.Windows.Forms.Button(); + this.logTextBox1 = new arCtl.LogTextBox(); + this.btClose = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // radRs232 + // + this.radRs232.AutoSize = true; + this.radRs232.Location = new System.Drawing.Point(21, 17); + this.radRs232.Name = "radRs232"; + this.radRs232.Size = new System.Drawing.Size(57, 16); + this.radRs232.TabIndex = 0; + this.radRs232.Text = "RS232"; + this.radRs232.UseVisualStyleBackColor = true; + // + // radTcp + // + this.radTcp.AutoSize = true; + this.radTcp.Checked = true; + this.radTcp.Location = new System.Drawing.Point(21, 39); + this.radTcp.Name = "radTcp"; + this.radTcp.Size = new System.Drawing.Size(65, 16); + this.radTcp.TabIndex = 0; + this.radTcp.TabStop = true; + this.radTcp.Text = "TCP/IP"; + this.radTcp.UseVisualStyleBackColor = true; + // + // tbAddr + // + this.tbAddr.Location = new System.Drawing.Point(93, 34); + this.tbAddr.Name = "tbAddr"; + this.tbAddr.Size = new System.Drawing.Size(135, 21); + this.tbAddr.TabIndex = 1; + this.tbAddr.Text = "192.168.1.10"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(91, 17); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(88, 12); + this.label1.TabIndex = 2; + this.label1.Text = "Port / Address"; + // + // btOpen + // + this.btOpen.Location = new System.Drawing.Point(250, 14); + this.btOpen.Name = "btOpen"; + this.btOpen.Size = new System.Drawing.Size(90, 40); + this.btOpen.TabIndex = 3; + this.btOpen.Text = "Open"; + this.btOpen.UseVisualStyleBackColor = true; + this.btOpen.Click += new System.EventHandler(this.btOpen_Click); + // + // logTextBox1 + // + this.logTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.logTextBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24))))); + this.logTextBox1.ColorList = new arCtl.sLogMessageColor[0]; + this.logTextBox1.DateFormat = "yy-MM-dd HH:mm:ss"; + this.logTextBox1.DefaultColor = System.Drawing.Color.LightGray; + this.logTextBox1.EnableDisplayTimer = false; + this.logTextBox1.EnableGubunColor = true; + this.logTextBox1.Font = new System.Drawing.Font("Consolas", 9F); + this.logTextBox1.ListFormat = "[{0}] {1}"; + this.logTextBox1.Location = new System.Drawing.Point(17, 66); + this.logTextBox1.MaxListCount = ((ushort)(200)); + this.logTextBox1.MaxTextLength = ((uint)(4000u)); + this.logTextBox1.MessageInterval = 50; + this.logTextBox1.Name = "logTextBox1"; + this.logTextBox1.Size = new System.Drawing.Size(419, 331); + this.logTextBox1.TabIndex = 4; + this.logTextBox1.Text = ""; + // + // btClose + // + this.btClose.Location = new System.Drawing.Point(346, 14); + this.btClose.Name = "btClose"; + this.btClose.Size = new System.Drawing.Size(90, 40); + this.btClose.TabIndex = 5; + this.btClose.Text = "Close"; + this.btClose.UseVisualStyleBackColor = true; + this.btClose.Click += new System.EventHandler(this.btClose_Click); + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.button1.Enabled = false; + this.button1.Location = new System.Drawing.Point(20, 403); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(90, 40); + this.button1.TabIndex = 6; + this.button1.Text = "Read"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.button2.Enabled = false; + this.button2.Location = new System.Drawing.Point(116, 403); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(90, 40); + this.button2.TabIndex = 7; + this.button2.Text = "Stop"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button3 + // + this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.button3.Enabled = false; + this.button3.Location = new System.Drawing.Point(212, 403); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(90, 40); + this.button3.TabIndex = 8; + this.button3.Text = "Help"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button4 + // + this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button4.Enabled = false; + this.button4.Location = new System.Drawing.Point(337, 403); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(90, 40); + this.button4.TabIndex = 9; + this.button4.Text = "Ping"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // timer1 + // + this.timer1.Interval = 200; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(449, 450); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.btClose); + this.Controls.Add(this.logTextBox1); + this.Controls.Add(this.btOpen); + this.Controls.Add(this.label1); + this.Controls.Add(this.tbAddr); + this.Controls.Add(this.radTcp); + this.Controls.Add(this.radRs232); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Form1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RadioButton radRs232; + private System.Windows.Forms.RadioButton radTcp; + private System.Windows.Forms.TextBox tbAddr; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btOpen; + private arCtl.LogTextBox logTextBox1; + private System.Windows.Forms.Button btClose; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Timer timer1; + } +} + diff --git a/Cs_HMI/TestProject/Test_NLRF100/Form1.cs b/Cs_HMI/TestProject/Test_NLRF100/Form1.cs new file mode 100644 index 0000000..3676065 --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Form1.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Test_NLRF100 +{ + public partial class Form1 : Form + { + arDev.NLRF100.Device dev; + public Form1() + { + InitializeComponent(); + dev = new arDev.NLRF100.Device(); + dev.Message += Dev_Message; + dev.ReceiveData += Dev_ReceiveData; + } + + private void Dev_ReceiveData(object sender, arDev.NLRF100.Device.ReceviceDataEventArgs e) + { + //데이터를 읽었을때 + logTextBox1.AddMsg("수신", string.Format("\n안테나={0},값={1}",e.Antena,e.DataString)); + } + + private void Dev_Message(object sender, arDev.NLRF100.Device.MessageEventArgs e) + { + if (e.isError) logTextBox1.AddMsg("ERROR", "\n"+e.Message); + else logTextBox1.AddMsg("\n"+e.Message); + } + + private void btOpen_Click(object sender, EventArgs e) + { + if (dev != null && dev.bInit && dev.IsOpen) + { + dev.Close(); + } + + if (tbAddr.Text == "") + { + Util.MsgE("포트/HostIP 를 입력하세요"); + return; + } + + if (radRs232.Checked) dev.init(arDev.NLRF100.eConnType.RS232, tbAddr.Text); + else dev.init(arDev.NLRF100.eConnType.SOCKET, tbAddr.Text); + + if (dev.IsOpen == false) + { + logTextBox1.AddMsg("ERROR", "접속실패"); + + } + else + { + logTextBox1.AddMsg("접속성공"); + + } + + timer1.Start(); + } + + private void Form1_Load(object sender, EventArgs e) + { + + } + + private void btClose_Click(object sender, EventArgs e) + { + if (dev != null && dev.IsOpen) + { + dev.Close(); + this.logTextBox1.AddMsg("접속 종료"); + + + timer1.Stop(); + } + } + + private void button1_Click(object sender, EventArgs e) + { + //read + dev.Start(); + } + + private void button2_Click(object sender, EventArgs e) + { + //stop + dev.Stop(); + } + + private void button3_Click(object sender, EventArgs e) + { + //help + dev.Help(); + } + + private void button4_Click(object sender, EventArgs e) + { + //ping + dev.Ping(); + } + + private void timer1_Tick(object sender, EventArgs e) + { + this.Text = "접속상태:" + dev.IsOpen.ToString(); + if(dev.IsOpen) + { + button1.Enabled = true; + button2.Enabled = true; + button3.Enabled = true; + button4.Enabled = true; + } else + { + button1.Enabled = false; + button2.Enabled = false; + button3.Enabled = false; + button4.Enabled = false; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_NLRF100/Form1.resx b/Cs_HMI/TestProject/Test_NLRF100/Form1.resx new file mode 100644 index 0000000..aac33d5 --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_NLRF100/Program.cs b/Cs_HMI/TestProject/Test_NLRF100/Program.cs new file mode 100644 index 0000000..b47751c --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace Test_NLRF100 +{ + static class Program + { + /// + /// 해당 응용 프로그램의 주 진입점입니다. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/Cs_HMI/TestProject/Test_NLRF100/Properties/AssemblyInfo.cs b/Cs_HMI/TestProject/Test_NLRF100/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f1da5a4 --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("Test_NLRF100")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Test_NLRF100")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("2cdad6d3-2d25-4604-a46c-edec0eb308d8")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 +// 지정되도록 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.Designer.cs b/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.Designer.cs new file mode 100644 index 0000000..040712a --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Test_NLRF100.Properties +{ + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 + // ResGen을 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Test_NLRF100.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.resx b/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.Designer.cs b/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.Designer.cs new file mode 100644 index 0000000..8206ddc --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Test_NLRF100.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.settings b/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj b/Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj new file mode 100644 index 0000000..c86e10b --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj @@ -0,0 +1,83 @@ + + + + + Debug + AnyCPU + {2CDAD6D3-2D25-4604-A46C-EDEC0EB308D8} + WinExe + Test_NLRF100 + Test_NLRF100 + v4.0 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\Sub\arCtl\obj\Debug\arControl.Net4.dll + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_NLRF100/Util.cs b/Cs_HMI/TestProject/Test_NLRF100/Util.cs new file mode 100644 index 0000000..9df6ad4 --- /dev/null +++ b/Cs_HMI/TestProject/Test_NLRF100/Util.cs @@ -0,0 +1,407 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Management; +using System.Net; +using System.Text; +using System.Windows.Forms; + +namespace Test_NLRF100 +{ + public static class Util + { + #region "MessageBox" + public static void MsgI(string m, Boolean legacy = true) + { + //if(legacy) + { + MessageBox.Show(m, "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + } + public static void MsgE(string m, Boolean legacy = false) + { + //if(legacy) + { + MessageBox.Show(m, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + public static DialogResult MsgQ(string m, Boolean legacy = false, string btOK = "확인",string btCancel = "아니오") + { + //if(legacy) + { + DialogResult dlg = MessageBox.Show(m, "확인", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + return dlg; + } + + } + + #endregion + + public static string SelectSerialPort() + { + var f = new System.Windows.Forms.Form(); + f.WindowState = System.Windows.Forms.FormWindowState.Normal; + f.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + f.Size = new System.Drawing.Size(800, 400); + f.MaximizeBox = false; + f.MinimizeBox = false; + f.Text = "Select Port"; + f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + var lst = new System.Windows.Forms.ListBox(); + lst.Font = new System.Drawing.Font("Consolas", 15, System.Drawing.FontStyle.Bold); + lst.Dock = System.Windows.Forms.DockStyle.Fill; + lst.DoubleClick += (s1, e1) => + { + if (lst.SelectedItem != null) f.DialogResult = System.Windows.Forms.DialogResult.OK; + }; + using (var searcher = new ManagementObjectSearcher("SELECT * FROM WIN32_SerialPort")) + { + var portnames = System.IO.Ports.SerialPort.GetPortNames().OrderBy(t => t); + var ports = searcher.Get().Cast().ToList(); + foreach (var port in portnames) + { + var desc = ""; + var portInfo = ports.Where(t => t["DeviceId"].ToString() == port).FirstOrDefault(); + if (portInfo != null) desc = portInfo["Caption"].ToString(); + lst.Items.Add(string.Format("{0} - {1}", port, desc)); + } + } + f.Controls.Add(lst); + if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + var name = lst.SelectedItem.ToString().Split('-'); + return name[0].Trim(); + } + else return string.Empty; + } + + public static void ScreenCaptrue(int _BitmapWidth, int _BitmapHeight, Point ptSouce) + { + try + { + Bitmap bitmap = new Bitmap(_BitmapWidth, _BitmapHeight); + Graphics _graphic = Graphics.FromImage(bitmap); + + _graphic.CopyFromScreen(ptSouce, new Point(0, 0), new Size(_BitmapWidth, _BitmapHeight)); + + string savefile = System.IO.Path.Combine(Util.CurrentPath, "ScreenShot", DateTime.Now.ToString("yyyyMMddHHmmss") + ".png"); + System.IO.FileInfo grpath = new FileInfo(savefile); + if (!grpath.Directory.Exists) grpath.Directory.Create(); + + bitmap.Save(grpath.FullName, System.Drawing.Imaging.ImageFormat.Png); + Util.MsgI("화면 캡쳐 성공\n" + + "위치:" + grpath.Directory.FullName +"\n" + + "파일명: " + grpath.Name); + } + catch (Exception ex) + { + Util.MsgE("화면 캡쳐 실패\n" + ex.Message); + } + } + + + public static void SaveBugReport(string content, string subdirName = "BugReport") + { + try + { + var path = CurrentPath + subdirName; + if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); + var file = path + "\\" + DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + ".txt"; + System.IO.File.WriteAllText(file, content, System.Text.Encoding.UTF8); + } + catch + { + //nothing + } + } + + public static void CopyData(System.Data.DataRow drSrc, System.Data.DataRow drDes) + { + if (drDes == null || drSrc == null) return; + foreach (System.Data.DataColumn col in drSrc.Table.Columns) + { + if (col.ColumnName.ToUpper() == "IDX") continue; + drDes[col.ColumnName] = drSrc[col.ColumnName]; + } + + } + + /// + /// 현재실행중인폴더를 반환합니다. + /// + public static string CurrentPath + { + get + { + return AppDomain.CurrentDomain.BaseDirectory; + } + } + /// + /// 콤마와 줄바꿈등을 제거합니다. + /// + /// + public static string ToCSVString(string src) + { + string retval = src.Replace("\r", "").Replace("\n", "").Replace(",", ""); + return retval; + } + + public static Boolean RunProcess(string file, string arg = "") + { + var fi = new System.IO.FileInfo(file); + if (!fi.Exists) + { + // Pub.log.AddE("Run Error : " + file); + return false; + } + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(file); + si.Arguments = arg; + prc.StartInfo = si; + prc.Start(); + return true; + } + + #region "convert" + public static string RectToStr(Rectangle rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string RectToStr(RectangleF rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string PointToStr(Point pt) + { + return string.Format("{0};{1}", pt.X, pt.Y); + } + public static string PointToStr(PointF pt) + { + return string.Format("{0};{1}", pt.X, pt.Y); + } + + #endregion + + #region "NIC" + + /// + /// 지정된 nic카드가 현재 목록에 존재하는지 확인한다. + /// + /// + public static Boolean ExistNIC(string NICName) + { + if (string.IsNullOrEmpty(NICName)) return false; + foreach (string NetName in NICCardList()) + { + if (NetName.ToLower() == NICName.ToLower()) + { + return true; + } + } + return false; + } + + /// + /// Ehternet Card 를 사용안함으로 설정합니다.(관리자권한필요) + /// + /// + public static Boolean NICDisable(string NICName) + { + //해당 nic 가 현재 목록에 존재하는지 확인한다. + + string cmd = "interface set interface " + NICName + " disable"; + Process prc = new Process(); + ProcessStartInfo si = new ProcessStartInfo("netsh", cmd); + si.WindowStyle = ProcessWindowStyle.Hidden; + prc.StartInfo = si; + prc.Start(); + + ////목록에서 사라질때까지 기다린다. + DateTime SD = DateTime.Now; + Boolean timeout = false; + while ((true)) + { + + bool FindNetwork = false; + foreach (string NetName in NICCardList()) + { + if (NetName == NICName.ToLower()) + { + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + + if (!FindNetwork) + break; // TODO: might not be correct. Was : Exit While + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + timeout = true; + break; // TODO: might not be correct. Was : Exit While + } + } + return !timeout; + } + + public static List NICCardList() + { + List Retval = new List(); + foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + if (Net.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) + { + Retval.Add(Net.Name.ToUpper()); + } + } + return Retval; + } + + /// + /// 이더넷카드를 사용함으로 설정합니다. + /// + /// + public static Boolean NICEnable(string NICName) + { + string cmd = "interface set interface " + NICName + " enable"; + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("netsh", cmd); + si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; + prc.StartInfo = si; + prc.Start(); + + + ////목록에생길떄까지 대기 + DateTime SD = DateTime.Now; + while ((true)) + { + + bool FindNetwork = false; + foreach (string NetName in NICCardList()) + { + if (NetName.ToLower() == NICName.ToLower()) + { + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + + if (FindNetwork) + break; // TODO: might not be correct. Was : Exit While + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + return false; + } + } + + ////결이 완료될떄까지 기다린다. + SD = DateTime.Now; + while ((true)) + { + + bool FindNetwork = false; + foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + if (Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.GigabitEthernet && + Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) continue; + if (Net.Name.ToLower() == NICName.ToLower()) + { + //string data = Net.GetIPProperties().GatewayAddresses[0].ToString(); + + if (Net.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) + { + + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + } + if (FindNetwork) + return true; + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + return false; + } + } + + } + + #endregion + + public static void RunExplorer(string arg) + { + System.Diagnostics.ProcessStartInfo si = new ProcessStartInfo("explorer"); + si.Arguments = arg; + System.Diagnostics.Process.Start(si); + } + + #region "watchdog" + public static void WatchDog_Run() + { + System.IO.FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "WatchCat.exe"); + if (!fi.Exists) return; + var Exist = CheckExistProcess("watchcat"); + if (Exist) return; + RunProcess(fi.FullName); + } + + public static Boolean CheckExistProcess(string ProcessName) + { + foreach (var prc in System.Diagnostics.Process.GetProcesses()) + { + if (prc.ProcessName.StartsWith("svchost")) continue; + if (prc.ProcessName.ToUpper() == ProcessName.ToUpper()) return true; + } + return false; + } + #endregion + + #region "web function" + /// + /// URL로부터 문자열을 수신합니다. + /// + /// + /// + /// + public static string GetStrfromurl(string url, out Boolean isError) + { + isError = false; + string result = ""; + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); + request.Timeout = 60000; + request.ReadWriteTimeout = 60000; + + request.MaximumAutomaticRedirections = 4; + request.MaximumResponseHeadersLength = 4; + request.Credentials = CredentialCache.DefaultCredentials; + var response = request.GetResponse() as HttpWebResponse; + var txtReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); + result = txtReader.ReadToEnd(); + } + catch (Exception ex) + { + isError = true; + result = ex.Message.ToString(); + } + return result; + } + + #endregion + + } +} diff --git a/Cs_HMI/TestProject/Test_Narumi/Form1.Designer.cs b/Cs_HMI/TestProject/Test_Narumi/Form1.Designer.cs new file mode 100644 index 0000000..ed19445 --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Form1.Designer.cs @@ -0,0 +1,536 @@ +namespace Test_BMS +{ + partial class Form1 + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.logTextBox1 = new arCtl.LogTextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.button13 = new System.Windows.Forms.Button(); + this.button14 = new System.Windows.Forms.Button(); + this.button15 = new System.Windows.Forms.Button(); + this.button16 = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.rt0 = new System.Windows.Forms.RichTextBox(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.rt1 = new System.Windows.Forms.RichTextBox(); + this.rt2 = new System.Windows.Forms.RichTextBox(); + this.rt3 = new System.Windows.Forms.RichTextBox(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.logTextBox2 = new arCtl.LogTextBox(); + this.button17 = new System.Windows.Forms.Button(); + this.button18 = new System.Windows.Forms.Button(); + this.button19 = new System.Windows.Forms.Button(); + this.tableLayoutPanel1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.SuspendLayout(); + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(46, 10); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(100, 20); + this.comboBox1.TabIndex = 0; + this.comboBox1.Text = "COM21"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(289, 10); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(108, 20); + this.button1.TabIndex = 1; + this.button1.Text = "connect"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(403, 10); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(106, 20); + this.button2.TabIndex = 1; + this.button2.Text = "close"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // comboBox2 + // + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Items.AddRange(new object[] { + "9600", + "12800", + "25600", + "250000"}); + this.comboBox2.Location = new System.Drawing.Point(188, 10); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(95, 20); + this.comboBox2.TabIndex = 2; + this.comboBox2.Text = "57600"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(15, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(26, 12); + this.label1.TabIndex = 3; + this.label1.Text = "port"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(150, 14); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(33, 12); + this.label2.TabIndex = 3; + this.label2.Text = "baud"; + // + // logTextBox1 + // + this.logTextBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24))))); + this.logTextBox1.ColorList = new arCtl.sLogMessageColor[0]; + this.logTextBox1.DateFormat = "ss.fff"; + this.logTextBox1.DefaultColor = System.Drawing.Color.LightGray; + this.logTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.logTextBox1.EnableDisplayTimer = true; + this.logTextBox1.EnableGubunColor = true; + this.logTextBox1.Font = new System.Drawing.Font("Consolas", 9F); + this.logTextBox1.ListFormat = "[{0}] {1}"; + this.logTextBox1.Location = new System.Drawing.Point(3, 3); + this.logTextBox1.MaxListCount = ((ushort)(200)); + this.logTextBox1.MaxTextLength = ((uint)(4000u)); + this.logTextBox1.MessageInterval = 50; + this.logTextBox1.Name = "logTextBox1"; + this.logTextBox1.Size = new System.Drawing.Size(335, 494); + this.logTextBox1.TabIndex = 4; + this.logTextBox1.Text = ""; + // + // button3 + // + this.button3.Dock = System.Windows.Forms.DockStyle.Fill; + this.button3.Location = new System.Drawing.Point(3, 3); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(130, 49); + this.button3.TabIndex = 5; + this.button3.Text = "forward"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button4 + // + this.button4.Dock = System.Windows.Forms.DockStyle.Fill; + this.button4.Location = new System.Drawing.Point(3, 58); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(130, 49); + this.button4.TabIndex = 6; + this.button4.Text = "backward"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // button5 + // + this.button5.Dock = System.Windows.Forms.DockStyle.Fill; + this.button5.Location = new System.Drawing.Point(139, 3); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(130, 49); + this.button5.TabIndex = 7; + this.button5.Text = "stop"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // button6 + // + this.button6.Dock = System.Windows.Forms.DockStyle.Fill; + this.button6.Location = new System.Drawing.Point(275, 3); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(130, 49); + this.button6.TabIndex = 8; + this.button6.Text = "set f"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button7 + // + this.button7.Dock = System.Windows.Forms.DockStyle.Fill; + this.button7.Location = new System.Drawing.Point(139, 58); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(130, 49); + this.button7.TabIndex = 9; + this.button7.Text = "mark stop"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // button8 + // + this.button8.Dock = System.Windows.Forms.DockStyle.Fill; + this.button8.Location = new System.Drawing.Point(275, 58); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(130, 49); + this.button8.TabIndex = 10; + this.button8.Text = "Run"; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.button8_Click); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 5; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0005F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0005F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.0005F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 19.9985F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20F)); + this.tableLayoutPanel1.Controls.Add(this.button6, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.button4, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.button7, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.button3, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.button5, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.button8, 2, 1); + this.tableLayoutPanel1.Controls.Add(this.button9, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.button10, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.button11, 2, 2); + this.tableLayoutPanel1.Controls.Add(this.button12, 3, 2); + this.tableLayoutPanel1.Controls.Add(this.button13, 3, 1); + this.tableLayoutPanel1.Controls.Add(this.button14, 3, 0); + this.tableLayoutPanel1.Controls.Add(this.button15, 4, 0); + this.tableLayoutPanel1.Controls.Add(this.button16, 4, 1); + this.tableLayoutPanel1.Controls.Add(this.button17, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.button18, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.button19, 2, 3); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 37); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.00062F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.00062F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.00062F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 24.99813F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(683, 222); + this.tableLayoutPanel1.TabIndex = 11; + // + // button9 + // + this.button9.Dock = System.Windows.Forms.DockStyle.Fill; + this.button9.Location = new System.Drawing.Point(3, 113); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(130, 49); + this.button9.TabIndex = 11; + this.button9.Text = "충전시작"; + this.button9.UseVisualStyleBackColor = true; + this.button9.Click += new System.EventHandler(this.button9_Click); + // + // button10 + // + this.button10.Dock = System.Windows.Forms.DockStyle.Fill; + this.button10.Location = new System.Drawing.Point(139, 113); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(130, 49); + this.button10.TabIndex = 12; + this.button10.Text = "충전종료"; + this.button10.UseVisualStyleBackColor = true; + this.button10.Click += new System.EventHandler(this.button10_Click); + // + // button11 + // + this.button11.Dock = System.Windows.Forms.DockStyle.Fill; + this.button11.Location = new System.Drawing.Point(275, 113); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(130, 49); + this.button11.TabIndex = 12; + this.button11.Text = "도착알림(ON)"; + this.button11.UseVisualStyleBackColor = true; + this.button11.Click += new System.EventHandler(this.button11_Click); + // + // button12 + // + this.button12.Dock = System.Windows.Forms.DockStyle.Fill; + this.button12.Location = new System.Drawing.Point(411, 113); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(130, 49); + this.button12.TabIndex = 13; + this.button12.Text = "도착알림(OFF)"; + this.button12.UseVisualStyleBackColor = true; + this.button12.Click += new System.EventHandler(this.button12_Click); + // + // button13 + // + this.button13.Dock = System.Windows.Forms.DockStyle.Fill; + this.button13.Location = new System.Drawing.Point(411, 58); + this.button13.Name = "button13"; + this.button13.Size = new System.Drawing.Size(130, 49); + this.button13.TabIndex = 14; + this.button13.Text = "ERR-RESET"; + this.button13.UseVisualStyleBackColor = true; + this.button13.Click += new System.EventHandler(this.button13_Click); + // + // button14 + // + this.button14.Dock = System.Windows.Forms.DockStyle.Fill; + this.button14.Location = new System.Drawing.Point(411, 3); + this.button14.Name = "button14"; + this.button14.Size = new System.Drawing.Size(130, 49); + this.button14.TabIndex = 15; + this.button14.Text = "set b"; + this.button14.UseVisualStyleBackColor = true; + this.button14.Click += new System.EventHandler(this.button14_Click); + // + // button15 + // + this.button15.Dock = System.Windows.Forms.DockStyle.Fill; + this.button15.Location = new System.Drawing.Point(547, 3); + this.button15.Name = "button15"; + this.button15.Size = new System.Drawing.Size(133, 49); + this.button15.TabIndex = 16; + this.button15.Text = "manual f"; + this.button15.UseVisualStyleBackColor = true; + this.button15.Click += new System.EventHandler(this.button15_Click); + // + // button16 + // + this.button16.Dock = System.Windows.Forms.DockStyle.Fill; + this.button16.Location = new System.Drawing.Point(547, 58); + this.button16.Name = "button16"; + this.button16.Size = new System.Drawing.Size(133, 49); + this.button16.TabIndex = 16; + this.button16.Text = "manual b"; + this.button16.UseVisualStyleBackColor = true; + this.button16.Click += new System.EventHandler(this.button16_Click); + // + // panel1 + // + this.panel1.Controls.Add(this.comboBox1); + this.panel1.Controls.Add(this.button1); + this.panel1.Controls.Add(this.button2); + this.panel1.Controls.Add(this.label2); + this.panel1.Controls.Add(this.comboBox2); + this.panel1.Controls.Add(this.label1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(1264, 37); + this.panel1.TabIndex = 12; + // + // rt0 + // + this.rt0.Dock = System.Windows.Forms.DockStyle.Fill; + this.rt0.Location = new System.Drawing.Point(3, 3); + this.rt0.Name = "rt0"; + this.rt0.Size = new System.Drawing.Size(284, 292); + this.rt0.TabIndex = 13; + this.rt0.Text = ""; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 2; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Controls.Add(this.rt0, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.rt1, 1, 0); + this.tableLayoutPanel2.Controls.Add(this.rt2, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.rt3, 1, 1); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Right; + this.tableLayoutPanel2.Location = new System.Drawing.Point(683, 37); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 41.27424F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 58.72576F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(581, 722); + this.tableLayoutPanel2.TabIndex = 14; + // + // rt1 + // + this.rt1.Dock = System.Windows.Forms.DockStyle.Fill; + this.rt1.Location = new System.Drawing.Point(293, 3); + this.rt1.Name = "rt1"; + this.rt1.Size = new System.Drawing.Size(285, 292); + this.rt1.TabIndex = 13; + this.rt1.Text = ""; + // + // rt2 + // + this.rt2.Dock = System.Windows.Forms.DockStyle.Fill; + this.rt2.Location = new System.Drawing.Point(3, 301); + this.rt2.Name = "rt2"; + this.rt2.Size = new System.Drawing.Size(284, 418); + this.rt2.TabIndex = 13; + this.rt2.Text = ""; + // + // rt3 + // + this.rt3.Dock = System.Windows.Forms.DockStyle.Fill; + this.rt3.Location = new System.Drawing.Point(293, 301); + this.rt3.Name = "rt3"; + this.rt3.Size = new System.Drawing.Size(285, 418); + this.rt3.TabIndex = 13; + this.rt3.Text = ""; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Controls.Add(this.logTextBox1, 0, 0); + this.tableLayoutPanel3.Controls.Add(this.logTextBox2, 1, 0); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 259); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 1; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(683, 500); + this.tableLayoutPanel3.TabIndex = 15; + // + // logTextBox2 + // + this.logTextBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24))))); + this.logTextBox2.ColorList = new arCtl.sLogMessageColor[0]; + this.logTextBox2.DateFormat = "ss.fff"; + this.logTextBox2.DefaultColor = System.Drawing.Color.LightGray; + this.logTextBox2.Dock = System.Windows.Forms.DockStyle.Fill; + this.logTextBox2.EnableDisplayTimer = true; + this.logTextBox2.EnableGubunColor = true; + this.logTextBox2.Font = new System.Drawing.Font("Consolas", 9F); + this.logTextBox2.ListFormat = "[{0}] {1}"; + this.logTextBox2.Location = new System.Drawing.Point(344, 3); + this.logTextBox2.MaxListCount = ((ushort)(200)); + this.logTextBox2.MaxTextLength = ((uint)(4000u)); + this.logTextBox2.MessageInterval = 50; + this.logTextBox2.Name = "logTextBox2"; + this.logTextBox2.Size = new System.Drawing.Size(336, 494); + this.logTextBox2.TabIndex = 4; + this.logTextBox2.Text = ""; + // + // button17 + // + this.button17.Dock = System.Windows.Forms.DockStyle.Fill; + this.button17.Location = new System.Drawing.Point(3, 168); + this.button17.Name = "button17"; + this.button17.Size = new System.Drawing.Size(130, 51); + this.button17.TabIndex = 17; + this.button17.Text = "Speed L"; + this.button17.UseVisualStyleBackColor = true; + this.button17.Click += new System.EventHandler(this.button17_Click); + // + // button18 + // + this.button18.Dock = System.Windows.Forms.DockStyle.Fill; + this.button18.Location = new System.Drawing.Point(139, 168); + this.button18.Name = "button18"; + this.button18.Size = new System.Drawing.Size(130, 51); + this.button18.TabIndex = 17; + this.button18.Text = "Speed M"; + this.button18.UseVisualStyleBackColor = true; + this.button18.Click += new System.EventHandler(this.button18_Click); + // + // button19 + // + this.button19.Dock = System.Windows.Forms.DockStyle.Fill; + this.button19.Location = new System.Drawing.Point(275, 168); + this.button19.Name = "button19"; + this.button19.Size = new System.Drawing.Size(130, 51); + this.button19.TabIndex = 17; + this.button19.Text = "Speed H"; + this.button19.UseVisualStyleBackColor = true; + this.button19.Click += new System.EventHandler(this.button19_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1264, 759); + this.Controls.Add(this.tableLayoutPanel3); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.tableLayoutPanel2); + this.Controls.Add(this.panel1); + this.Name = "Form1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.tableLayoutPanel1.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private arCtl.LogTextBox logTextBox1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button12; + private System.Windows.Forms.Button button13; + private System.Windows.Forms.RichTextBox rt0; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.RichTextBox rt1; + private System.Windows.Forms.RichTextBox rt2; + private System.Windows.Forms.RichTextBox rt3; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private arCtl.LogTextBox logTextBox2; + private System.Windows.Forms.Button button14; + private System.Windows.Forms.Button button15; + private System.Windows.Forms.Button button16; + private System.Windows.Forms.Button button17; + private System.Windows.Forms.Button button18; + private System.Windows.Forms.Button button19; + } +} + diff --git a/Cs_HMI/TestProject/Test_Narumi/Form1.cs b/Cs_HMI/TestProject/Test_Narumi/Form1.cs new file mode 100644 index 0000000..d67d7ea --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Form1.cs @@ -0,0 +1,218 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Test_BMS +{ + public partial class Form1 : Form + { + arDev.Narumi dev; + arUtil.Log log1 = new arUtil.Log(); + arUtil.Log log2 = new arUtil.Log(); + public Form1() + { + InitializeComponent(); + dev = new arDev.Narumi(); + dev.DataReceive += Dev_DataReceive; + dev.Message += Dev_Message; + log1.FileNameFormat = "{yyyyMMdd}_COM"; + log2.FileNameFormat = "{yyyyMMdd}_STS"; + this.FormClosed += Form1_FormClosed; + } + + private void Form1_FormClosed(object sender, FormClosedEventArgs e) + { + log1.Flush(); + log2.Flush(); + } + + private void Dev_Message(object sender, arDev.arRS232.MessageEventArgs e) + { + addmsg(e.MsgType.ToString(), e.Message);// $"{e.MsgType}:{e.Message}"); + } + + private void Dev_DataReceive(object sender, arDev.Narumi.DataEventArgs e) + { + //throw new NotImplementedException(); + updatestatue(); + } + + void updatestatue() + { + if (this.rt0.InvokeRequired) + { + this.Invoke(new MethodInvoker(updatestatue)); + return; + } + + this.rt0.Text = $"system0-{dev.system0.Value:X2}\n" + dev.system0.ToString(); + this.rt1.Text = $"system1-{dev.system1.Value:X2}\n" + dev.system1.ToString(); + this.rt2.Text = $"error-{dev.error.Value:X2}\n" + dev.error.ToString(); + this.rt3.Text = $"iosignal-{dev.signal.Value:X2}\n" + dev.signal.ToString() + "data\n" + dev.data.ToString(); + //this.rt4.Text = "data\n" + dev.data.ToString(); + + + } + + private void Form1_Load(object sender, EventArgs e) + { + this.comboBox1.Items.Clear(); + foreach (var port in System.IO.Ports.SerialPort.GetPortNames()) + this.comboBox1.Items.Add(port); + } + + void addmsg(string grp,string m) + { + if(m.Contains("STS")) + { + log2.Add(grp, m); + if (logTextBox2.InvokeRequired) + { + logTextBox2.BeginInvoke(new Action(() => + { + logTextBox2.AddMsg(m); + })); + } + else + { + logTextBox2.AddMsg(m); + } + } + else + { + log1.Add(grp, m); + if (logTextBox1.InvokeRequired) + { + logTextBox1.BeginInvoke(new Action(() => + { + logTextBox1.AddMsg(m); + })); + } + else + { + logTextBox1.AddMsg(m); + } + } + + } + + + + + private void button1_Click(object sender, EventArgs e) + { + dev.BaudRate = int.Parse(this.comboBox2.Text); + dev.PortName = comboBox1.Text; + dev.Open(); + addmsg("conn",$"open:{dev.IsOpen}"); + } + + private void button2_Click(object sender, EventArgs e) + { + dev.Close(); + } + + + + private void button6_Click(object sender, EventArgs e) + { + dev.AGVMoveSet(new arDev.Narumi.BunkiData + { + Bunki = arDev.Narumi.eBunki.Strate, + Direction = arDev.Narumi.eMoveDir.Forward, + PBSSensor = 1, + Speed = arDev.Narumi.eMoveSpd.Low, + }); + } + + private void button5_Click(object sender, EventArgs e) + { + dev.AGVMoveStop("form1-button5", arDev.Narumi.eStopOpt.Stop); + } + + private void button7_Click(object sender, EventArgs e) + { + dev.AGVMoveStop("form1-button7",arDev.Narumi.eStopOpt.MarkStop); + } + + private void button4_Click(object sender, EventArgs e) + { + dev.AGVMoveRun(arDev.Narumi.eRunOpt.Backward); + } + private void button3_Click(object sender, EventArgs e) + { + dev.AGVMoveRun(arDev.Narumi.eRunOpt.Forward); + } + + private void button8_Click(object sender, EventArgs e) + { + dev.AGVMoveRun(); + } + + private void button9_Click(object sender, EventArgs e) + { + dev.AGVCharge(30, true); + } + + private void button10_Click(object sender, EventArgs e) + { + dev.AGVCharge(30, false); + } + + private void button11_Click(object sender, EventArgs e) + { + dev.AGVTowerLamp(true); + } + + private void button12_Click(object sender, EventArgs e) + { + dev.AGVTowerLamp(false); + } + + private void button13_Click(object sender, EventArgs e) + { + dev.AGVErrorReset(); + } + + private void button14_Click(object sender, EventArgs e) + { + dev.AGVMoveSet(new arDev.Narumi.BunkiData + { + Bunki = arDev.Narumi.eBunki.Strate, + Direction = arDev.Narumi.eMoveDir.Backward, + PBSSensor = 1, + Speed = arDev.Narumi.eMoveSpd.Low, + }); + } + + private void button15_Click(object sender, EventArgs e) + { + dev.AGVMoveManual(arDev.Narumi.ManulOpt.FS, arDev.Narumi.Speed.Low, arDev.Narumi.Sensor.AllOn); + } + + private void button16_Click(object sender, EventArgs e) + { + dev.AGVMoveManual(arDev.Narumi.ManulOpt.BS, arDev.Narumi.Speed.Low, arDev.Narumi.Sensor.AllOn); + } + + private void button17_Click(object sender, EventArgs e) + { + dev.AGVMoveSet(new arDev.Narumi.BunkiData(dev.data.Direction, dev.data.Sts, 'L')); + } + + private void button18_Click(object sender, EventArgs e) + { + dev.AGVMoveSet(new arDev.Narumi.BunkiData(dev.data.Direction, dev.data.Sts, 'M')); + } + + private void button19_Click(object sender, EventArgs e) + { + dev.AGVMoveSet(new arDev.Narumi.BunkiData(dev.data.Direction, dev.data.Sts, 'H')); + } + } +} diff --git a/Cs_HMI/TestProject/Test_Narumi/Form1.resx b/Cs_HMI/TestProject/Test_Narumi/Form1.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_Narumi/Program.cs b/Cs_HMI/TestProject/Test_Narumi/Program.cs new file mode 100644 index 0000000..868a592 --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace Test_BMS +{ + static class Program + { + /// + /// 해당 응용 프로그램의 주 진입점입니다. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/Cs_HMI/TestProject/Test_Narumi/Properties/AssemblyInfo.cs b/Cs_HMI/TestProject/Test_Narumi/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2800cf9 --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("BMS Commnunication Module Test")] +[assembly: AssemblyDescription("BMS Commnunication Module Test")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("BMS Commnunication Module Test")] +[assembly: AssemblyProduct("BMS Test Software")] +[assembly: AssemblyCopyright("Copyright ©ATK4 2020")] +[assembly: AssemblyTrademark("ATK4")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("ce3fff9f-6aca-1234-b64a-33ff4ad5e82e")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 +// 지정되도록 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("20.03.09.0")] +[assembly: AssemblyFileVersion("20.03.09.0")] diff --git a/Cs_HMI/TestProject/Test_Narumi/Properties/Resources.Designer.cs b/Cs_HMI/TestProject/Test_Narumi/Properties/Resources.Designer.cs new file mode 100644 index 0000000..1b46bdf --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Test_Narumi.Properties { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Test_Narumi.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_Narumi/Properties/Resources.resx b/Cs_HMI/TestProject/Test_Narumi/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_Narumi/Properties/Settings.Designer.cs b/Cs_HMI/TestProject/Test_Narumi/Properties/Settings.Designer.cs new file mode 100644 index 0000000..78f82ca --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Test_Narumi.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_Narumi/Properties/Settings.settings b/Cs_HMI/TestProject/Test_Narumi/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Cs_HMI/TestProject/Test_Narumi/Sample.txt b/Cs_HMI/TestProject/Test_Narumi/Sample.txt new file mode 100644 index 0000000..a950cfe --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Sample.txt @@ -0,0 +1,14 @@ +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 +02 53 54 53 32 35 38 46 46 46 46 34 30 30 30 30 30 30 30 4C 53 46 30 30 30 30 30 30 33 41 03 \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj b/Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj new file mode 100644 index 0000000..9c42ed6 --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj @@ -0,0 +1,102 @@ + + + + + Debug + AnyCPU + {EB77976F-4DE4-46A5-8B25-D07226204C32} + WinExe + Test_Narumi + Test_Narumi + v4.8 + 512 + true + + + + AnyCPU + true + full + false + ..\..\..\..\..\..\..\..\Amkor\AGV2\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\Sub\arCtl\obj\Debug\arControl.Net4.dll + + + ..\..\DLL\ArLog.Net4.dll + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {8bae0eac-3d25-402f-9a65-2ba1ecfe28b7} + NARUMI + + + {14e8c9a5-013e-49ba-b435-efefc77dd623} + CommData + + + + + + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_Narumi/app.config b/Cs_HMI/TestProject/Test_Narumi/app.config new file mode 100644 index 0000000..2c0f559 --- /dev/null +++ b/Cs_HMI/TestProject/Test_Narumi/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Cs_HMI/TestProject/Test_ProPLC/Form1.Designer.cs b/Cs_HMI/TestProject/Test_ProPLC/Form1.Designer.cs new file mode 100644 index 0000000..04552c1 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Form1.Designer.cs @@ -0,0 +1,577 @@ +namespace Test_ProPLC +{ + partial class Form1 + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + arFrame.Control.ColorListItem colorListItem1 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem2 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem3 = new arFrame.Control.ColorListItem(); + arFrame.Control.ColorListItem colorListItem4 = new arFrame.Control.ColorListItem(); + this.serialPort1 = new System.IO.Ports.SerialPort(this.components); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.textbox1 = new System.Windows.Forms.ComboBox(); + this.textbox2 = new System.Windows.Forms.ComboBox(); + this.gv1 = new arFrame.Control.GridView(); + this.gv2 = new arFrame.Control.GridView(); + this.logSub = new arCtl.LogTextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.logMain = new arCtl.LogTextBox(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.button13 = new System.Windows.Forms.Button(); + this.button14 = new System.Windows.Forms.Button(); + this.button15 = new System.Windows.Forms.Button(); + this.button16 = new System.Windows.Forms.Button(); + this.button17 = new System.Windows.Forms.Button(); + this.button18 = new System.Windows.Forms.Button(); + this.button19 = new System.Windows.Forms.Button(); + this.button20 = new System.Windows.Forms.Button(); + this.button21 = new System.Windows.Forms.Button(); + this.button22 = new System.Windows.Forms.Button(); + this.button23 = new System.Windows.Forms.Button(); + this.button24 = new System.Windows.Forms.Button(); + this.button35 = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(9, 10); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(108, 36); + this.button1.TabIndex = 0; + this.button1.Text = "Conn"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(9, 333); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(108, 36); + this.button2.TabIndex = 4; + this.button2.Text = "Conn"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(123, 10); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(843, 21); + this.textBox3.TabIndex = 6; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(123, 333); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(843, 21); + this.textBox4.TabIndex = 7; + // + // textbox1 + // + this.textbox1.FormattingEnabled = true; + this.textbox1.Location = new System.Drawing.Point(9, 52); + this.textbox1.Name = "textbox1"; + this.textbox1.Size = new System.Drawing.Size(108, 20); + this.textbox1.TabIndex = 8; + // + // textbox2 + // + this.textbox2.FormattingEnabled = true; + this.textbox2.Location = new System.Drawing.Point(9, 375); + this.textbox2.Name = "textbox2"; + this.textbox2.Size = new System.Drawing.Size(108, 20); + this.textbox2.TabIndex = 9; + this.textbox2.Text = "COM31"; + // + // gv1 + // + this.gv1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.gv1.BorderSize = 1; + colorListItem1.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30))))); + colorListItem1.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + colorListItem1.Remark = ""; + colorListItem2.BackColor1 = System.Drawing.Color.Orange; + colorListItem2.BackColor2 = System.Drawing.Color.DarkOrange; + colorListItem2.Remark = ""; + this.gv1.ColorList = new arFrame.Control.ColorListItem[] { + colorListItem1, + colorListItem2}; + this.gv1.Cursor = System.Windows.Forms.Cursors.Arrow; + this.gv1.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.gv1.FontPin = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold); + this.gv1.ForeColor = System.Drawing.Color.White; + this.gv1.ForeColorPin = System.Drawing.Color.WhiteSmoke; + this.gv1.Location = new System.Drawing.Point(123, 37); + this.gv1.MatrixSize = new System.Drawing.Point(8, 4); + this.gv1.MenuBorderSize = 1; + this.gv1.MenuGap = 5; + this.gv1.MinimumSize = new System.Drawing.Size(100, 50); + this.gv1.Name = "gv1"; + this.gv1.Names = null; + this.gv1.ShadowColor = System.Drawing.Color.Black; + this.gv1.showDebugInfo = false; + this.gv1.ShowIndexString = true; + this.gv1.Size = new System.Drawing.Size(592, 169); + this.gv1.TabIndex = 10; + this.gv1.Tags = null; + this.gv1.Text = "gridView1"; + this.gv1.TextAttachToImage = true; + this.gv1.Titles = null; + this.gv1.Values = null; + this.gv1.ItemClick += new System.EventHandler(this.gv1_ItemClick); + // + // gv2 + // + this.gv2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(100)))), ((int)(((byte)(100))))); + this.gv2.BorderSize = 1; + colorListItem3.BackColor1 = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30))))); + colorListItem3.BackColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + colorListItem3.Remark = ""; + colorListItem4.BackColor1 = System.Drawing.Color.Orange; + colorListItem4.BackColor2 = System.Drawing.Color.DarkOrange; + colorListItem4.Remark = ""; + this.gv2.ColorList = new arFrame.Control.ColorListItem[] { + colorListItem3, + colorListItem4}; + this.gv2.Cursor = System.Windows.Forms.Cursors.Arrow; + this.gv2.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.gv2.FontPin = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold); + this.gv2.ForeColor = System.Drawing.Color.White; + this.gv2.ForeColorPin = System.Drawing.Color.WhiteSmoke; + this.gv2.Location = new System.Drawing.Point(123, 360); + this.gv2.MatrixSize = new System.Drawing.Point(8, 4); + this.gv2.MenuBorderSize = 1; + this.gv2.MenuGap = 5; + this.gv2.MinimumSize = new System.Drawing.Size(100, 50); + this.gv2.Name = "gv2"; + this.gv2.Names = null; + this.gv2.ShadowColor = System.Drawing.Color.Black; + this.gv2.showDebugInfo = false; + this.gv2.ShowIndexString = true; + this.gv2.Size = new System.Drawing.Size(592, 169); + this.gv2.TabIndex = 11; + this.gv2.Tags = null; + this.gv2.Text = "gridView1"; + this.gv2.TextAttachToImage = true; + this.gv2.Titles = null; + this.gv2.Values = null; + this.gv2.ItemClick += new System.EventHandler(this.gv2_ItemClick); + // + // logSub + // + this.logSub.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24))))); + this.logSub.ColorList = new arCtl.sLogMessageColor[0]; + this.logSub.DateFormat = "yy-MM-dd HH:mm:ss"; + this.logSub.DefaultColor = System.Drawing.Color.LightGray; + this.logSub.EnableDisplayTimer = true; + this.logSub.EnableGubunColor = true; + this.logSub.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.logSub.ListFormat = "[{0}] {1}"; + this.logSub.Location = new System.Drawing.Point(123, 535); + this.logSub.MaxListCount = ((ushort)(200)); + this.logSub.MaxTextLength = ((uint)(4000u)); + this.logSub.MessageInterval = 50; + this.logSub.Name = "logSub"; + this.logSub.Size = new System.Drawing.Size(592, 132); + this.logSub.TabIndex = 12; + this.logSub.Text = ""; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(721, 360); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(152, 36); + this.button3.TabIndex = 13; + this.button3.Text = "Z-UP"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(721, 402); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(152, 36); + this.button4.TabIndex = 14; + this.button4.Text = "Z-STOP"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(721, 444); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(152, 36); + this.button5.TabIndex = 15; + this.button5.Text = "Z-DN"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // logMain + // + this.logMain.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(24)))), ((int)(((byte)(24)))), ((int)(((byte)(24))))); + this.logMain.ColorList = new arCtl.sLogMessageColor[0]; + this.logMain.DateFormat = "yy-MM-dd HH:mm:ss"; + this.logMain.DefaultColor = System.Drawing.Color.LightGray; + this.logMain.EnableDisplayTimer = true; + this.logMain.EnableGubunColor = true; + this.logMain.Font = new System.Drawing.Font("맑은 고딕", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.logMain.ListFormat = "[{0}] {1}"; + this.logMain.Location = new System.Drawing.Point(123, 212); + this.logMain.MaxListCount = ((ushort)(200)); + this.logMain.MaxTextLength = ((uint)(4000u)); + this.logMain.MessageInterval = 50; + this.logMain.Name = "logMain"; + this.logMain.Size = new System.Drawing.Size(592, 115); + this.logMain.TabIndex = 16; + this.logMain.Text = ""; + // + // button6 + // + this.button6.BackColor = System.Drawing.Color.Tomato; + this.button6.ForeColor = System.Drawing.Color.White; + this.button6.Location = new System.Drawing.Point(721, 79); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(73, 36); + this.button6.TabIndex = 19; + this.button6.Text = "L_STOP"; + this.button6.UseVisualStyleBackColor = false; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(721, 121); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(73, 36); + this.button7.TabIndex = 18; + this.button7.Text = "L-DN"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(721, 37); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(73, 36); + this.button8.TabIndex = 17; + this.button8.Text = "L-UP"; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.button8_Click); + // + // button9 + // + this.button9.BackColor = System.Drawing.Color.Tomato; + this.button9.ForeColor = System.Drawing.Color.White; + this.button9.Location = new System.Drawing.Point(800, 78); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(73, 36); + this.button9.TabIndex = 22; + this.button9.Text = "R-STOP"; + this.button9.UseVisualStyleBackColor = false; + this.button9.Click += new System.EventHandler(this.button9_Click); + // + // button10 + // + this.button10.Location = new System.Drawing.Point(800, 120); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(73, 36); + this.button10.TabIndex = 21; + this.button10.Text = "R-DN"; + this.button10.UseVisualStyleBackColor = true; + this.button10.Click += new System.EventHandler(this.button10_Click); + // + // button11 + // + this.button11.Location = new System.Drawing.Point(800, 36); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(73, 36); + this.button11.TabIndex = 20; + this.button11.Text = "R-UP"; + this.button11.UseVisualStyleBackColor = true; + this.button11.Click += new System.EventHandler(this.button11_Click); + // + // button12 + // + this.button12.BackColor = System.Drawing.Color.White; + this.button12.ForeColor = System.Drawing.Color.Black; + this.button12.Location = new System.Drawing.Point(721, 205); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(152, 36); + this.button12.TabIndex = 25; + this.button12.Text = "STOP"; + this.button12.UseVisualStyleBackColor = false; + this.button12.Click += new System.EventHandler(this.button12_Click); + // + // button13 + // + this.button13.BackColor = System.Drawing.Color.White; + this.button13.Location = new System.Drawing.Point(721, 247); + this.button13.Name = "button13"; + this.button13.Size = new System.Drawing.Size(152, 36); + this.button13.TabIndex = 24; + this.button13.Text = "BACK"; + this.button13.UseVisualStyleBackColor = false; + this.button13.Click += new System.EventHandler(this.button13_Click); + // + // button14 + // + this.button14.BackColor = System.Drawing.Color.White; + this.button14.Location = new System.Drawing.Point(721, 163); + this.button14.Name = "button14"; + this.button14.Size = new System.Drawing.Size(152, 36); + this.button14.TabIndex = 23; + this.button14.Text = "GO"; + this.button14.UseVisualStyleBackColor = false; + this.button14.Click += new System.EventHandler(this.button14_Click); + // + // button15 + // + this.button15.Location = new System.Drawing.Point(879, 67); + this.button15.Name = "button15"; + this.button15.Size = new System.Drawing.Size(87, 24); + this.button15.TabIndex = 26; + this.button15.Text = "10"; + this.button15.UseVisualStyleBackColor = true; + this.button15.Click += new System.EventHandler(this.button15_Click); + // + // button16 + // + this.button16.Location = new System.Drawing.Point(879, 91); + this.button16.Name = "button16"; + this.button16.Size = new System.Drawing.Size(87, 24); + this.button16.TabIndex = 27; + this.button16.Text = "20"; + this.button16.UseVisualStyleBackColor = true; + this.button16.Click += new System.EventHandler(this.button15_Click); + // + // button17 + // + this.button17.Location = new System.Drawing.Point(879, 139); + this.button17.Name = "button17"; + this.button17.Size = new System.Drawing.Size(87, 24); + this.button17.TabIndex = 29; + this.button17.Text = "40"; + this.button17.UseVisualStyleBackColor = true; + this.button17.Click += new System.EventHandler(this.button15_Click); + // + // button18 + // + this.button18.Location = new System.Drawing.Point(879, 115); + this.button18.Name = "button18"; + this.button18.Size = new System.Drawing.Size(87, 24); + this.button18.TabIndex = 28; + this.button18.Text = "30"; + this.button18.UseVisualStyleBackColor = true; + this.button18.Click += new System.EventHandler(this.button15_Click); + // + // button19 + // + this.button19.Location = new System.Drawing.Point(879, 235); + this.button19.Name = "button19"; + this.button19.Size = new System.Drawing.Size(87, 24); + this.button19.TabIndex = 33; + this.button19.Text = "80"; + this.button19.UseVisualStyleBackColor = true; + this.button19.Click += new System.EventHandler(this.button15_Click); + // + // button20 + // + this.button20.Location = new System.Drawing.Point(879, 211); + this.button20.Name = "button20"; + this.button20.Size = new System.Drawing.Size(87, 24); + this.button20.TabIndex = 32; + this.button20.Text = "70"; + this.button20.UseVisualStyleBackColor = true; + this.button20.Click += new System.EventHandler(this.button15_Click); + // + // button21 + // + this.button21.Location = new System.Drawing.Point(879, 187); + this.button21.Name = "button21"; + this.button21.Size = new System.Drawing.Size(87, 24); + this.button21.TabIndex = 31; + this.button21.Text = "60"; + this.button21.UseVisualStyleBackColor = true; + this.button21.Click += new System.EventHandler(this.button15_Click); + // + // button22 + // + this.button22.Location = new System.Drawing.Point(879, 163); + this.button22.Name = "button22"; + this.button22.Size = new System.Drawing.Size(87, 24); + this.button22.TabIndex = 30; + this.button22.Text = "50"; + this.button22.UseVisualStyleBackColor = true; + this.button22.Click += new System.EventHandler(this.button15_Click); + // + // button23 + // + this.button23.Location = new System.Drawing.Point(879, 283); + this.button23.Name = "button23"; + this.button23.Size = new System.Drawing.Size(87, 24); + this.button23.TabIndex = 35; + this.button23.Text = "100"; + this.button23.UseVisualStyleBackColor = true; + this.button23.Click += new System.EventHandler(this.button15_Click); + // + // button24 + // + this.button24.Location = new System.Drawing.Point(879, 259); + this.button24.Name = "button24"; + this.button24.Size = new System.Drawing.Size(87, 24); + this.button24.TabIndex = 34; + this.button24.Text = "90"; + this.button24.UseVisualStyleBackColor = true; + this.button24.Click += new System.EventHandler(this.button15_Click); + // + // button35 + // + this.button35.Location = new System.Drawing.Point(879, 42); + this.button35.Name = "button35"; + this.button35.Size = new System.Drawing.Size(87, 24); + this.button35.TabIndex = 46; + this.button35.Text = "0"; + this.button35.UseVisualStyleBackColor = true; + this.button35.Click += new System.EventHandler(this.button15_Click); + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(9, 401); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(108, 20); + this.comboBox1.TabIndex = 47; + this.comboBox1.Text = "57600"; + // + // timer1 + // + this.timer1.Interval = 250; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick_1); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(974, 677); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.button35); + this.Controls.Add(this.button23); + this.Controls.Add(this.button24); + this.Controls.Add(this.button19); + this.Controls.Add(this.button20); + this.Controls.Add(this.button21); + this.Controls.Add(this.button22); + this.Controls.Add(this.button17); + this.Controls.Add(this.button18); + this.Controls.Add(this.button16); + this.Controls.Add(this.button15); + this.Controls.Add(this.button12); + this.Controls.Add(this.button13); + this.Controls.Add(this.button14); + this.Controls.Add(this.button9); + this.Controls.Add(this.button10); + this.Controls.Add(this.button11); + this.Controls.Add(this.button6); + this.Controls.Add(this.button7); + this.Controls.Add(this.button8); + this.Controls.Add(this.logMain); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.logSub); + this.Controls.Add(this.gv2); + this.Controls.Add(this.gv1); + this.Controls.Add(this.textbox2); + this.Controls.Add(this.textbox1); + this.Controls.Add(this.textBox4); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Name = "Form1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.IO.Ports.SerialPort serialPort1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.ComboBox textbox1; + private System.Windows.Forms.ComboBox textbox2; + private arFrame.Control.GridView gv1; + private arFrame.Control.GridView gv2; + private arCtl.LogTextBox logSub; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private arCtl.LogTextBox logMain; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button12; + private System.Windows.Forms.Button button13; + private System.Windows.Forms.Button button14; + private System.Windows.Forms.Button button15; + private System.Windows.Forms.Button button16; + private System.Windows.Forms.Button button17; + private System.Windows.Forms.Button button18; + private System.Windows.Forms.Button button19; + private System.Windows.Forms.Button button20; + private System.Windows.Forms.Button button21; + private System.Windows.Forms.Button button22; + private System.Windows.Forms.Button button23; + private System.Windows.Forms.Button button24; + private System.Windows.Forms.Button button35; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Timer timer1; + } +} + diff --git a/Cs_HMI/TestProject/Test_ProPLC/Form1.cs b/Cs_HMI/TestProject/Test_ProPLC/Form1.cs new file mode 100644 index 0000000..3638c70 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Form1.cs @@ -0,0 +1,659 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Test_ProPLC +{ + public partial class Form1 : Form + { + arDev.FakePLC dev2; + public Form1() + { + InitializeComponent(); + this.serialPort1.DataReceived += SerialPort1_DataReceived; + dev2 = new arDev.FakePLC(); + this.dev2.ValueChanged += Dev2_ValueChanged; + this.dev2.Message += Dev2_Message; + this.FormClosed += Form1_FormClosed; + } + + private void Form1_FormClosed(object sender, FormClosedEventArgs e) + { + timer1.Stop(); + } + + private void Dev2_ValueChanged(object sender, arDev.Arduino.DIO.IOValueEventArgs e) + { + addMsg2($"val({e.ArrIDX}) -> {e.NewValue}"); + + } + + byte[] buffer1; + List Tempbuffer1 = new List(); + byte[] buffer2; + List Tempbuffer2 = new List(); + + + Boolean STX11 = false; + Boolean STX21 = false; + Boolean ETX11 = false; + + Boolean STX12 = false; + Boolean STX22 = false; + Boolean ETX12 = false; + + + //MAIN PLC + byte[] DIpinList1 = new byte[] { 22, 23, 24, 25, 26, 27, 28, 29, 41 }; + string[] DIpinName1 = new string[] { "EMERGENCTY", "OVR_L", "LIDAR_STOP", "LIDAR_SLOW", "OVR_R", "MARK", "GATEOUT_B", "GATEOUT_F", "ALIGN" }; + + byte[] DOpinList1 = new byte[] { 33, 34, 35, 36, 37, 43, 44, 39, 40 }; + string[] DopinName1 = new string[] { "MOT_POWER_GUIDE", "MOT_POWER_L", "MOT_POWER_R", "LIDAR_DIR", "CHARGE_ON", "MOT_DIR_L", "MOT_RUN_L", "MOT_DIR_R", "MOT_RUN_R" }; + + + // SUB PLC + byte[] DIpinList2 = new byte[] { 22, 23, 24, 25, 41, 42, 43, 45, 38 }; + string[] DIpinName2 = new string[] { "BTN_GUIDE_UP", "BTN_GUIDE_DN", "BTN_QA1", "BTN_QC", "LIM_HIGH_R", "LIM_LOW_R", "LIM_HIGH_L", "BTN_PACK", "LIM_LOW_L" }; + + + byte[] DOpinList2 = new byte[] { 30, 31, 32, 33 }; + string[] DopinName2 = new string[] { "GMOT_INT", "GMOT_DIR", "GMOT_RUN", "GMOT_STA" }; + + + byte LEN1 = 0; + byte CHK1 = 0; + int bufferCount1 = 0; + + byte LEN2 = 0; + byte CHK2 = 0; + int bufferCount2 = 0; + private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) + { + bufferCount1 = this.serialPort1.BytesToRead; + byte[] rxBuffer = new byte[bufferCount1]; + serialPort1.Read(rxBuffer, 0, bufferCount1); + foreach (byte incomingByte in rxBuffer) + { + if (STX11 == false) + { + if (incomingByte != '@') + { + STX21 = false; + ETX11 = false; + continue; + } + else + { + STX11 = true; + Tempbuffer1.Add(incomingByte); + } + } + else if (STX21 == false) + { + if (Tempbuffer1.Count != 1 || Tempbuffer1.Count < 1 || Tempbuffer1[0] != '@' || incomingByte != '@') + { + STX11 = false; + ETX11 = false; + continue; + } + else + { + STX21 = true; + Tempbuffer1.Add(incomingByte); + } + } + else + { + Tempbuffer1.Add(incomingByte); + + //여기서부터는무조건 누적한다. + if (Tempbuffer1.Count == 3) + { + if (Tempbuffer1[0] != 0x40 || Tempbuffer1[1] != '@') + { + STX11 = false; + STX21 = false; + ETX11 = false; + LEN1 = 0; + Tempbuffer1.Clear(); + } + else LEN1 = incomingByte; //데이터 길이가온다 + } + else if (Tempbuffer1.Count == LEN1 + 2 + 1 + 1) //체크섬이 왔다 + { + CHK1 = incomingByte; + } + else if (Tempbuffer1.Count == LEN1 + 2 + 1 + 1 + 1) //ETX1 + { + if (incomingByte != 0x0D) + { + //ETX가 와야하는데 다른데이터가 왔다 + STX11 = false; + STX21 = false; + ETX11 = false; + Console.WriteLine("에러 모두 파기"); + Tempbuffer1.Clear(); + } + } + else if (Tempbuffer1.Count == LEN1 + 2 + 1 + 1 + 1 + 1) + { + //전체길이를 만족햇다. + if (incomingByte != 0x0A) + { + //ETX가 와야하는데 다른데이터가 왔다 + STX11 = false; + STX21 = false; + ETX11 = false; + Console.WriteLine("에러 모두 파기"); + Tempbuffer1.Clear(); + } + else + { + STX11 = false; + STX21 = false; + ETX11 = false; + if (buffer1 == null) buffer1 = new byte[Tempbuffer1.Count]; + else if (buffer1.Length != Tempbuffer1.Count) Array.Resize(ref buffer1, Tempbuffer1.Count); + Tempbuffer1.CopyTo(buffer1); + Tempbuffer1.Clear(); + parser(buffer1, tbMsg1, 0); + } + } + } + + + } + } + private void Dev2_Message(object sender, arDev.arRS232.MessageEventArgs e) + { + addMsg2($"{e.Message}"); + } + + + delegate void DisplayMessage(string message); + + void parser(byte[] buffer, Action func, int type) + { + // DisplayMessage messageTarget; + + var hexString = buffer.GetHexString(); + var len = buffer[2]; + if (len + 6 != buffer.Length) + { + + func(string.Format("길이오류 예상:{0},수신:{1},{2}", len + 5, buffer.Length, hexString)); + } + else if (buffer[0] != 0x40 || buffer[1] != 0x40 || buffer[buffer.Length - 2] != 0x0D || buffer[buffer.Length - 1] != 0x0A) + { + func(string.Format("헤더 오류 : {0}", hexString)); + } + else + { + + var cmd = buffer[3]; + if (cmd == 'I') //IOData + { + if (len != 15) + { + func("IO수신길이오류:" + DateTime.Now.ToString("mm:ss.fff") + " 수신 : " + hexString); + } + else + { + var IOData = BitConverter.ToUInt32(buffer, 4); + var An1 = BitConverter.ToUInt16(buffer, 8); + var An2 = BitConverter.ToUInt16(buffer, 10); + var Ao11 = buffer[12]; + var Ao12 = buffer[13]; + var FGData = BitConverter.ToInt32(buffer, 14); + + byte[] buf_iodata = new byte[4]; + Array.Copy(buffer, 4, buf_iodata, 0, 4); + + var ba = new System.Collections.BitArray(buf_iodata); + for (int i = 0; i < 32; i++) + { + Boolean val = ba[i]; + if (val) + { + + } + if (type == 0) this.gv1.setValue(i, val); + else this.gv2.setValue(i, val); + } + + + var binstr = Convert.ToString(IOData, 2).PadLeft(32, '0'); + string msg = string.Format(DateTime.Now.ToString("mm:ss.fff") + " IO:{0},AN={1:0000},{2:0000},FG={3},AO={4},{5}", + binstr, An1, An2, FGData, Ao11, Ao12); + func(msg); + + if (type == 0) gv1.Invalidate(); + else gv2.Invalidate(); + + } + } + else if (cmd == 'T') + { + Boolean errorMessage = buffer[4] == 1; + var message = System.Text.Encoding.Default.GetString(buffer, 5, len - 2);//데이터타입과 에러여부 제거 + if (type == 0) + addMsg1("Rx : " + hexString + ", 메세지: " + message); + else + addMsg2("Rx : " + hexString + ", 메세지: " + message); + } + else + { + if (type == 0) + addMsg1(DateTime.Now.ToString("mm:ss.fff") + " 수신 : " + hexString + "\n" + "Data=" + System.Text.Encoding.Default.GetString(buffer)); + else + addMsg2(DateTime.Now.ToString("mm:ss.fff") + " 수신 : " + hexString + "\n" + "Data=" + System.Text.Encoding.Default.GetString(buffer)); + + //func(); + } + + + + } + //Console.WriteLine("Rx : " + hexString); + } + void tbMsg1(string m) + { + if (textBox3.InvokeRequired) + { + textBox3.BeginInvoke(new Action(() => + { + textBox3.Text = (m + "\n"); + // textBox3.ScrollToCaret(); + })); + } + else + { + textBox3.Text = (m + "\n"); + //textBox3.ScrollToCaret(); + + } + } + void tbMsg2(string m) + { + if (textBox4.InvokeRequired) + { + textBox4.BeginInvoke(new Action(() => + { + textBox4.Text = (m + "\n"); + // richTextBox2.ScrollToCaret(); + })); + } + else + { + textBox4.Text = (m + "\n"); + //richTextBox2.ScrollToCaret(); + + } + } + + private void button1_Click(object sender, EventArgs e) + { + if (this.dev2.IsOpen) + { + this.serialPort1.Close(); + this.button1.BackColor = SystemColors.Control; + } + else + { + if (textbox1.Text.isEmpty()) return; + this.serialPort1.PortName = textbox1.Text; + this.serialPort1.BaudRate = 250000; + this.serialPort1.Open(); + button1.BackColor = Color.Lime; + } + } + + + private void timer1_Tick(object sender, EventArgs e) + { + this.Text = bufferCount1.ToString() + "/" + bufferCount2.ToString(); + } + + private void button2_Click(object sender, EventArgs e) + { + if (textbox2.Text.isEmpty()) return; + if (this.dev2.IsOpen) + { + this.dev2.Close(); + this.button2.BackColor = SystemColors.Control; + } + else + { + this.dev2.PortName = textbox2.Text; + this.dev2.BaudRate = int.Parse(comboBox1.Text); + this.dev2.Open(); + button2.BackColor = Color.Lime; + // timer1.Start(); + } + addMsg2($"open:{this.dev2.IsOpen}"); + + + } + + private void Form1_Load(object sender, EventArgs e) + { + textbox1.Items.Clear(); + textbox2.Items.Clear(); + foreach (var port in System.IO.Ports.SerialPort.GetPortNames()) + { + textbox1.Items.Add(port); + textbox2.Items.Add(port); + } + // textbox1.Text = "COM15"; + // textbox2.Text = "COM16"; + + List values = new List(); + for (int i = 0; i < 32; i++) + values.Add(false); + + this.gv1.setValue(values.ToArray()); + this.gv2.setValue(values.ToArray()); + + //그리드뷰 값초기화 + for (int i = 0; i < 32; i++) + { + string pinName = i.ToString(); + + + if (i < 16 && i < DIpinName1.Length) + pinName = string.Format("[{0}:{2}] {1}", i, DIpinName1[i], DIpinList1[i]); + else if (i >= 16 && (i - 16) < DopinName1.Length) + pinName = string.Format("[{0}:{2}] {1}", i, DopinName1[i - 16], DOpinList1[i - 16]); + + + + this.gv1.setTitle(i, pinName); + this.gv1.setValue(i, 0); + } + + for (int i = 0; i < 32; i++) + { + string pinName = i.ToString(); + + if (i < 16) + { + var pin = (arDev.FakePLC.DIName)i; + pinName = $"[{i}] {pin}"; + } + else + { + var pin = (arDev.FakePLC.DOName)(i-16); + pinName = $"[{i}] {pin}"; + } + + this.gv2.setTitle(i, pinName); + this.gv2.setValue(i, 0); + } + timer1.Start(); + + } + + private void gv1_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e) + { + //sub item click + if (e.idx < 16) + { + Util.MsgE("입력은 상태를 변경할 수 없습니다"); + } + else + { + //이 인덱스에 해당하는 포트번호를 가져왕야함 + + var dataIndex = e.idx - 16; + if (dataIndex >= 0) + { + var pinNo = DOpinList1[e.idx - 16]; + var curVal = gv1.getValue(e.idx); + byte newval = (byte)(curVal == 0 ? 1 : 0); + + Sendcommand1(eCommand1.SET_DOUTPUT, pinNo, newval); + } + else Util.MsgE("해당 주소는 허용되지 않습니다."); + } + } + + byte makeChecksum(byte[] buffer) + { + //return 0; + byte chk = 0; + foreach (var b in buffer) + chk = (byte)(chk ^ b); + return chk; + } + + enum eCommand1 : byte + { + LOAD = 0, //EEPROM 불러오기 + SAVE, //EEPROM 저장 + RESET, //초기화 + SET_PINMODE, //PINMODE 설정 + SET_DOUTPUT, //디지털출력설정(포트번호,값[1,0]) + SET_AOUTPUT, //아날로그출력설정(포트GET_SETTING = 50, 포트번호,값(0~255) + GET_SETTING = 50, //셋팅값 요청 + + MOT = 100, //p1(0=left,1=right), p2(0=stop,1=pos run,2=neg run) + MOVE_GO, + MOVE_BACK, + MOVE_LEFT, + MOVE_RIGHT, + MOVE_STOP + } + + + enum eCommand2 : byte + { + LOAD = 0, //EEPROM 불러오기 + SAVE, //EEPROM 저장 + RESET, //초기화 + SET_PINMODE, //PINMODE 설정 + SET_DOUTPUT, //디지털출력설정(포트번호,값[1,0]) + SET_AOUTPUT, //아날로그출력설정(포트번호,값[0~255]) + GET_SETTING = 50, //셋팅값 요청 + GUIDE_MOT, + SET_GUIDE_SPD = 100,//가이드커버(양쪽) 속도 설정(0~255) + } + void addMsg1(string m) + { + if (logMain.InvokeRequired) + { + logMain.BeginInvoke(new Action(() => + { + if (m.IndexOf('\n') != -1) m = m.Replace("\r", "").Replace("\n", ""); + logMain.AddMsg(m); + })); + } + else + { + if (m.IndexOf('\n') != -1) m = m.Replace("\r", "").Replace("\n", ""); + logMain.AddMsg(m); + + } + + } + void addMsg2(string m) + { + if (logSub.InvokeRequired) + { + logSub.BeginInvoke(new Action(() => + { + if (m.IndexOf('\n') != -1) m = m.Replace("\r", "").Replace("\n", ""); + logSub.AddMsg(m); + + })); + } + else + { + if (m.IndexOf('\n') != -1) m = m.Replace("\r", "").Replace("\n", ""); + logSub.AddMsg(m); + } + + } + private void gv2_ItemClick(object sender, arFrame.Control.GridView.ItemClickEventArgs e) + { + //sub item click + if (e.idx < 16) + { + Util.MsgE("입력은 상태를 변경할 수 없습니다"); + } + else + { + //이 인덱스에 해당하는 포트번호를 가져왕야함 + + var dataIndex = e.idx - 16; + if (dataIndex >= 0) + { + var pinNo = DOpinList2[e.idx - 16]; + var curVal = gv2.getValue(e.idx); + byte newval = (byte)(curVal == 0 ? 1 : 0); + + // Sendcommand2(eCommand2.SET_DOUTPUT, pinNo, newval); + } + else Util.MsgE("해당 주소는 허용되지 않습니다."); + + } + } + + + void Sendcommand1(eCommand1 cmd, byte p1, byte p2) + { + + //이번호의 상태를 on/off 해줘야함 + List buffer = new List(); + + buffer.Add((byte)cmd); //command + buffer.Add(p1); + buffer.Add(p2); + + byte dataLen = (byte)buffer.Count; //데이터길이 + byte checksum = makeChecksum(buffer.ToArray()); + + buffer.Insert(0, (byte)'@'); //stx + buffer.Insert(1, (byte)'@'); //stx + buffer.Insert(2, dataLen); + buffer.Add(checksum); //길이를 제외한 실제 데이터 영역만 체크섬 + buffer.Add(0x0D); //etx + buffer.Add(0x0A); //etx + + addMsg1("Tx Buffer : " + buffer.ToArray().GetHexString()); + + if (this.serialPort1.IsOpen) + serialPort1.Write(buffer.ToArray(), 0, buffer.Count); + else + addMsg1("포트(2)가 열리지 않았습니다"); + } + private void button3_Click(object sender, EventArgs e) + { + //-zup + dev2.ZMot(arDev.FakePLC.ZMotDirection.Up); + } + + private void button4_Click(object sender, EventArgs e) + { + //z-stop + dev2.ZMot(arDev.FakePLC.ZMotDirection.Stop); + } + + private void button5_Click(object sender, EventArgs e) + { + //z-down + dev2.ZMot(arDev.FakePLC.ZMotDirection.Down); + } + + private void button8_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOT, 0, 1); + } + + private void button6_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOT, 0, 0); + } + + private void button7_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOT, 0, 2); + } + + private void button10_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOT, 1, 2); + } + + private void button9_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOT, 1, 0); + } + + private void button11_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOT, 1, 1); + } + + private void button14_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOVE_GO, 0, 0); + } + + private void button12_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOVE_STOP, 0, 0); + } + + private void button13_Click(object sender, EventArgs e) + { + Sendcommand1(eCommand1.MOVE_BACK, 0, 0); + } + + private void button15_Click(object sender, EventArgs e) + { + //지정된 %의 값을 전송한다 + var but = sender as Button; + var percValue = byte.Parse(but.Text.ToString()); + var realValue = (percValue / 100.0) * 255.0; + + Sendcommand1(eCommand1.SET_AOUTPUT, 11, (byte)realValue); + Sendcommand1(eCommand1.SET_AOUTPUT, 12, (byte)realValue); + } + + private void button34_Click(object sender, EventArgs e) + { + //지정된 %의 값을 전송한다 + var but = sender as Button; + var percValue = byte.Parse(but.Text.ToString()); + var realValue = (percValue / 100.0) * 255.0; + + // Sendcommand2(eCommand2.SET_AOUTPUT, 11, (byte)realValue); //Z축 모터는 동일하게 사용한다 + } + + private void timer1_Tick_1(object sender, EventArgs e) + { + timer1.Stop(); + if (dev2 != null && dev2.IsOpen) + { + for(byte i = 0; i < 32;i++) + { + bool v = false; + + if (i < 16) v = dev2.GetValueI(i); + else v = dev2.GetValueO((byte)(i-16)); + + this.gv2.setValue(i, v); + } + this.gv2.Invalidate(); + } + + + timer1.Start(); + } + } +} diff --git a/Cs_HMI/TestProject/Test_ProPLC/Form1.resx b/Cs_HMI/TestProject/Test_ProPLC/Form1.resx new file mode 100644 index 0000000..c1be622 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Form1.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 95, 17 + + + 205, 17 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_ProPLC/MethodExtentions.cs b/Cs_HMI/TestProject/Test_ProPLC/MethodExtentions.cs new file mode 100644 index 0000000..04381bd --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/MethodExtentions.cs @@ -0,0 +1,216 @@ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Test_ProPLC +{ + /// + /// generic method Extension + /// + public static class MethodExtensions + { + public static string ToString(this System.Drawing.Rectangle rect) + { + return string.Format("X={0},Y={1},W={2},H={3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string ToString(this System.Drawing.RectangleF rect) + { + return string.Format("X={0},Y={1},W={2},H={3}", rect.X, rect.Y, rect.Width, rect.Height); + } + + //public static void SetBGColor(this System.Windows.Forms.Label ctl,System.Drawing.Color color1) + //{ + // ctl.BackColor = System.Drawing.Color.Red; + //} + + /// + /// 0101이 반복되는 문자열 형태로 전환합니다. + /// + /// + /// + public static string BitString(this System.Collections.BitArray arr) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + for (int i = arr.Length; i > 0; i--) + sb.Append(arr[i - 1] ? "1" : "0"); + return sb.ToString(); + } + + /// + /// int 값으로 변환합니다. + /// + /// + /// + public static int ValueI(this System.Collections.BitArray arr) + { + byte[] buf = new byte[4]; + arr.CopyTo(buf, 0); + return BitConverter.ToInt32(buf, 0); + } + + /// + /// 숫자인지 검사합니다. + /// + /// + /// + public static bool IsNumeric(this string input) + { + double data; + return double.TryParse(input, out data); + //return Regex.IsMatch(input, @"^\d+$"); + } + + /// + /// isnullorempty 를 수행합니다. + /// + /// + /// + public static Boolean isEmpty(this string input) + { + return string.IsNullOrEmpty(input); + } + + /// + /// default 인코딩을 사용하여 문자열로 반환합니다. + /// + /// + /// + public static string GetString(this Byte[] input) + { + return System.Text.Encoding.Default.GetString(input); + } + + /// + /// 16진수 문자열 형태로 반환합니다. + /// + /// + /// + public static string GetHexString(this Byte[] input) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + foreach (byte b in input) + sb.Append(" " + b.ToString("X2")); + return sb.ToString(); + } + + public static string Base64Encode(this string src) + { + string base64enc = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(src)); + return base64enc; + } + public static string Base64Decode(this string src) + { + var base64dec = Convert.FromBase64String(src); + return System.Text.Encoding.UTF8.GetString(base64dec); + } + public static string UrlPathEncode(this string src) + { + string data = System.Web.HttpUtility.UrlPathEncode(src); + return data; + } + public static string UrlEncode(this string src) + { + string data = System.Web.HttpUtility.UrlEncode(src, System.Text.Encoding.UTF8); + return data; + } + public static string UrlDecode(this string src) + { + string data = System.Web.HttpUtility.UrlDecode(src, System.Text.Encoding.UTF8); + return data; + } + public static string toSizeStr(this Size rect) + { + return string.Format("{0};{1}", rect.Width, rect.Height); + } + public static string toPointStr(this PointF rect) + { + return string.Format("{0};{1}", rect.X, rect.Y); + } + public static string toPointStr(this Point rect) + { + return string.Format("{0};{1}", rect.X, rect.Y); + } + public static string toRectStr(this Rectangle rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Top, rect.Width, rect.Height); + } + public static string toRectStr(this RectangleF rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Top, rect.Width, rect.Height); + } + public static RectangleF toRectF(this string str) + { + var buffer = str.Split(';'); + if (buffer.Length != 4) return RectangleF.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new RectangleF(float.Parse(buffer[0]), float.Parse(buffer[1]), float.Parse(buffer[2]), float.Parse(buffer[3])); + } + public static Rectangle toRect(this string str) + { + var buffer = str.Split(';'); + if (buffer.Length != 4) return Rectangle.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new Rectangle(int.Parse(buffer[0]), int.Parse(buffer[1]), int.Parse(buffer[2]), int.Parse(buffer[3])); + } + public static Point toPoint(this string str) + { + str = str.Replace(",", ";").Replace("*", ";").Replace("x", ";").Replace(":", ";"); + + var buffer = str.Split(';'); + if (buffer.Length != 2) return Point.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new Point(int.Parse(buffer[0]), int.Parse(buffer[1])); + } + public static Size toSize(this string str) + { + str = str.Replace(",", ";").Replace("*", ";").Replace("x", ";").Replace(":", ";"); + + var buffer = str.Split(';'); + if (buffer.Length != 2) return Size.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new Size(int.Parse(buffer[0]), int.Parse(buffer[1])); + } + public static PointF toPointF(this string str) + { + str = str.Replace(",", ";").Replace("*", ";").Replace("x", ";").Replace(":", ";"); + + var buffer = str.Split(';'); + if (buffer.Length != 2) return PointF.Empty; + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] == "") buffer[i] = "0"; + return new PointF(float.Parse(buffer[0]), float.Parse(buffer[1])); + } + public static Rectangle Fix(this Rectangle rect, Size imgsize) + { + //영역보정 + if (rect.Left < 1) rect.X = 1; + if (rect.Top < 1) rect.Y = 1; + if (rect.Right > imgsize.Width) rect.Width = imgsize.Width - rect.Left - 1; + if (rect.Bottom > imgsize.Height) rect.Height = imgsize.Height - rect.Top - 1; + if (rect.Width < 2 || rect.Height < 2) rect = Rectangle.Empty; + return rect; + } + public static RectangleF FixRoi(this RectangleF rect, Size imgsize) + { + //영역보정 + if (rect.Left < 1) rect.X = 1; + if (rect.Top < 1) rect.Y = 1; + if (rect.Right > imgsize.Width) rect.Width = imgsize.Width - rect.Left - 1; + if (rect.Bottom > imgsize.Height) rect.Height = imgsize.Height - rect.Top - 1; + if (rect.Width < 2 || rect.Height < 2) rect = Rectangle.Empty; + return rect; + } + + } +} + diff --git a/Cs_HMI/TestProject/Test_ProPLC/Program.cs b/Cs_HMI/TestProject/Test_ProPLC/Program.cs new file mode 100644 index 0000000..c08bf88 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace Test_ProPLC +{ + static class Program + { + /// + /// 해당 응용 프로그램의 주 진입점입니다. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/Cs_HMI/TestProject/Test_ProPLC/Properties/AssemblyInfo.cs b/Cs_HMI/TestProject/Test_ProPLC/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..53eb983 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("Test_ProPLC")] +[assembly: AssemblyDescription("Test_ProPLC")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("ATKEE1")] +[assembly: AssemblyProduct("Test_ProPLC")] +[assembly: AssemblyCopyright("Copyright ©ATK4 2020")] +[assembly: AssemblyTrademark("ATK4")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. +[assembly: Guid("9c027bf1-289f-4cc8-83f0-cb2b975c39c2")] + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 +// 지정되도록 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("20.03.05.1100")] +[assembly: AssemblyFileVersion("20.03.05.1100")] diff --git a/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.Designer.cs b/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3a74d7e --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Test_ProPLC.Properties { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Test_ProPLC.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.resx b/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.Designer.cs b/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.Designer.cs new file mode 100644 index 0000000..8508b90 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace Test_ProPLC.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.settings b/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj b/Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj new file mode 100644 index 0000000..0763fac --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj @@ -0,0 +1,104 @@ + + + + + Debug + AnyCPU + {9C027BF1-289F-4CC8-83F0-CB2B975C39C2} + WinExe + Test_ProPLC + Test_ProPLC + v4.8 + 512 + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\Sub\arCtl\bin\debug\arControl.Net4.dll + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {a16c9667-5241-4313-888e-548375f85d29} + arFrameControl + + + {14e8c9a5-013e-49ba-b435-efefc77dd623} + CommData + + + {476c8e64-7b6b-4554-aca2-04302715750f} + PLC.Net45 + + + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_ProPLC/Util.cs b/Cs_HMI/TestProject/Test_ProPLC/Util.cs new file mode 100644 index 0000000..af46d94 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/Util.cs @@ -0,0 +1,461 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Management; +using System.Net; +using System.Text; +using System.Windows.Forms; + +namespace Test_ProPLC +{ + public static class Util + { + #region "MessageBox" + public static void MsgI(string m, Boolean legacy = false) + { + //if(legacy) + //{ + MessageBox.Show(m, "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); + //} + + } + public static void MsgE(string m, Boolean legacy = false) + { + //if(legacy) + //{ + MessageBox.Show(m, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error); + //} + //else + //{ + // var f = new fMessageWindow("오류 알림\n" + m); + // f.SetWindowColor(fMessageWindow.EWinColor.Error); + // f.btNo.Visible = false; + // f.btYes.Text = "확인"; + // f.EnableUserClose = true; + // f.DialogMode = true; + // f.ShowDialog(); + //} + } + public static DialogResult MsgQ(string m, Boolean legacy = false, string btOK = "확인",string btCancel = "아니오") + { + //if(legacy) + { + DialogResult dlg = MessageBox.Show(m, "확인", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + return dlg; + } + //else + //{ + // var f = new fMessageWindow("선택 알림\n" + m); + // f.SetWindowColor(fMessageWindow.EWinColor.Attention); + // f.EnableUserClose = true; + // f.DialogMode = true; + // f.btNo.Text = btCancel; + // f.btYes.Text = btOK; + // var dlg = f.ShowDialog(); + // return dlg; + //} + } + + #endregion + + public static string SelectSerialPort() + { + var f = new System.Windows.Forms.Form(); + f.WindowState = System.Windows.Forms.FormWindowState.Normal; + f.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + f.Size = new System.Drawing.Size(800, 400); + f.MaximizeBox = false; + f.MinimizeBox = false; + f.Text = "Select Port"; + f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + var lst = new System.Windows.Forms.ListBox(); + lst.Font = new System.Drawing.Font("Consolas", 15, System.Drawing.FontStyle.Bold); + lst.Dock = System.Windows.Forms.DockStyle.Fill; + lst.DoubleClick += (s1, e1) => + { + if (lst.SelectedItem != null) f.DialogResult = System.Windows.Forms.DialogResult.OK; + }; + using (var searcher = new ManagementObjectSearcher("SELECT * FROM WIN32_SerialPort")) + { + var portnames = System.IO.Ports.SerialPort.GetPortNames().OrderBy(t => t); + var ports = searcher.Get().Cast().ToList(); + foreach (var port in portnames) + { + var desc = ""; + var portInfo = ports.Where(t => t["DeviceId"].ToString() == port).FirstOrDefault(); + if (portInfo != null) desc = portInfo["Caption"].ToString(); + lst.Items.Add(string.Format("{0} - {1}", port, desc)); + } + } + f.Controls.Add(lst); + if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + var name = lst.SelectedItem.ToString().Split('-'); + return name[0].Trim(); + } + else return string.Empty; + } + + public static void ScreenCaptrue(int _BitmapWidth, int _BitmapHeight, Point ptSouce) + { + try + { + Bitmap bitmap = new Bitmap(_BitmapWidth, _BitmapHeight); + Graphics _graphic = Graphics.FromImage(bitmap); + + _graphic.CopyFromScreen(ptSouce, new Point(0, 0), new Size(_BitmapWidth, _BitmapHeight)); + + string savefile = System.IO.Path.Combine(Util.CurrentPath, "ScreenShot", DateTime.Now.ToString("yyyyMMddHHmmss") + ".png"); + System.IO.FileInfo grpath = new FileInfo(savefile); + if (!grpath.Directory.Exists) grpath.Directory.Create(); + + bitmap.Save(grpath.FullName, System.Drawing.Imaging.ImageFormat.Png); + Util.MsgI("화면 캡쳐 성공\n" + + "위치:" + grpath.Directory.FullName +"\n" + + "파일명: " + grpath.Name); + } + catch (Exception ex) + { + Util.MsgE("화면 캡쳐 실패\n" + ex.Message); + } + } + + + public static void SaveBugReport(string content, string subdirName = "BugReport") + { + try + { + var path = CurrentPath + subdirName; + if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); + var file = path + "\\" + DateTime.Now.ToString("yyyyMMdd_HHmmss_fff") + ".txt"; + System.IO.File.WriteAllText(file, content, System.Text.Encoding.UTF8); + } + catch + { + //nothing + } + } + + public static void CopyData(System.Data.DataRow drSrc, System.Data.DataRow drDes) + { + if (drDes == null || drSrc == null) return; + foreach (System.Data.DataColumn col in drSrc.Table.Columns) + { + if (col.ColumnName.ToUpper() == "IDX") continue; + drDes[col.ColumnName] = drSrc[col.ColumnName]; + } + + } + + /// + /// 현재실행중인폴더를 반환합니다. + /// + public static string CurrentPath + { + get + { + return AppDomain.CurrentDomain.BaseDirectory; + } + } + /// + /// 콤마와 줄바꿈등을 제거합니다. + /// + /// + public static string ToCSVString(string src) + { + string retval = src.Replace("\r", "").Replace("\n", "").Replace(",", ""); + return retval; + } + + public static Boolean RunProcess(string file, string arg = "") + { + var fi = new System.IO.FileInfo(file); + if (!fi.Exists) + { + // Pub.log.AddE("Run Error : " + file); + return false; + } + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(file); + si.Arguments = arg; + prc.StartInfo = si; + prc.Start(); + return true; + } + + #region "convert" + public static string RectToStr(Rectangle rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string RectToStr(RectangleF rect) + { + return string.Format("{0};{1};{2};{3}", rect.X, rect.Y, rect.Width, rect.Height); + } + public static string PointToStr(Point pt) + { + return string.Format("{0};{1}", pt.X, pt.Y); + } + public static string PointToStr(PointF pt) + { + return string.Format("{0};{1}", pt.X, pt.Y); + } + public static Rectangle StrToRect(string str) + { + if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.Rectangle( + int.Parse(roibuf1[0]), + int.Parse(roibuf1[1]), + int.Parse(roibuf1[2]), + int.Parse(roibuf1[3])); + } + public static RectangleF StrToRectF(string str) + { + if (str.isEmpty() || str.Split(';').Length != 4) str = "0;0;0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.RectangleF( + float.Parse(roibuf1[0]), + float.Parse(roibuf1[1]), + float.Parse(roibuf1[2]), + float.Parse(roibuf1[3])); + } + public static Point StrToPoint(string str) + { + if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.Point( + int.Parse(roibuf1[0]), + int.Parse(roibuf1[1])); + } + public static PointF StrToPointF(string str) + { + if (str.isEmpty() || str.Split(';').Length != 2) str = "0;0"; + var roibuf1 = str.Split(';'); + return new System.Drawing.PointF( + float.Parse(roibuf1[0]), + float.Parse(roibuf1[1])); + } + #endregion + + #region "NIC" + + /// + /// 지정된 nic카드가 현재 목록에 존재하는지 확인한다. + /// + /// + public static Boolean ExistNIC(string NICName) + { + if (string.IsNullOrEmpty(NICName)) return false; + foreach (string NetName in NICCardList()) + { + if (NetName.ToLower() == NICName.ToLower()) + { + return true; + } + } + return false; + } + + /// + /// Ehternet Card 를 사용안함으로 설정합니다.(관리자권한필요) + /// + /// + public static Boolean NICDisable(string NICName) + { + //해당 nic 가 현재 목록에 존재하는지 확인한다. + + string cmd = "interface set interface " + NICName + " disable"; + Process prc = new Process(); + ProcessStartInfo si = new ProcessStartInfo("netsh", cmd); + si.WindowStyle = ProcessWindowStyle.Hidden; + prc.StartInfo = si; + prc.Start(); + + ////목록에서 사라질때까지 기다린다. + DateTime SD = DateTime.Now; + Boolean timeout = false; + while ((true)) + { + + bool FindNetwork = false; + foreach (string NetName in NICCardList()) + { + if (NetName == NICName.ToLower()) + { + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + + if (!FindNetwork) + break; // TODO: might not be correct. Was : Exit While + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + timeout = true; + break; // TODO: might not be correct. Was : Exit While + } + } + return !timeout; + } + + public static List NICCardList() + { + List Retval = new List(); + foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + if (Net.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) + { + Retval.Add(Net.Name.ToUpper()); + } + } + return Retval; + } + + /// + /// 이더넷카드를 사용함으로 설정합니다. + /// + /// + public static Boolean NICEnable(string NICName) + { + string cmd = "interface set interface " + NICName + " enable"; + System.Diagnostics.Process prc = new System.Diagnostics.Process(); + System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("netsh", cmd); + si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; + prc.StartInfo = si; + prc.Start(); + + + ////목록에생길떄까지 대기 + DateTime SD = DateTime.Now; + while ((true)) + { + + bool FindNetwork = false; + foreach (string NetName in NICCardList()) + { + if (NetName.ToLower() == NICName.ToLower()) + { + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + + if (FindNetwork) + break; // TODO: might not be correct. Was : Exit While + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + return false; + } + } + + ////결이 완료될떄까지 기다린다. + SD = DateTime.Now; + while ((true)) + { + + bool FindNetwork = false; + foreach (System.Net.NetworkInformation.NetworkInterface Net in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()) + { + if (Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.GigabitEthernet && + Net.NetworkInterfaceType != System.Net.NetworkInformation.NetworkInterfaceType.Ethernet) continue; + if (Net.Name.ToLower() == NICName.ToLower()) + { + //string data = Net.GetIPProperties().GatewayAddresses[0].ToString(); + + if (Net.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) + { + + FindNetwork = true; + break; // TODO: might not be correct. Was : Exit For + } + } + } + if (FindNetwork) + return true; + + System.Threading.Thread.Sleep(1000); + TimeSpan ts = DateTime.Now - SD; + if (ts.TotalSeconds > 10) + { + return false; + } + } + + } + + #endregion + + public static void RunExplorer(string arg) + { + System.Diagnostics.ProcessStartInfo si = new ProcessStartInfo("explorer"); + si.Arguments = arg; + System.Diagnostics.Process.Start(si); + } + + #region "watchdog" + public static void WatchDog_Run() + { + System.IO.FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "WatchCat.exe"); + if (!fi.Exists) return; + var Exist = CheckExistProcess("watchcat"); + if (Exist) return; + RunProcess(fi.FullName); + } + + public static Boolean CheckExistProcess(string ProcessName) + { + foreach (var prc in System.Diagnostics.Process.GetProcesses()) + { + if (prc.ProcessName.StartsWith("svchost")) continue; + if (prc.ProcessName.ToUpper() == ProcessName.ToUpper()) return true; + } + return false; + } + #endregion + + #region "web function" + /// + /// URL로부터 문자열을 수신합니다. + /// + /// + /// + /// + public static string GetStrfromurl(string url, out Boolean isError) + { + isError = false; + string result = ""; + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); + request.Timeout = 60000; + request.ReadWriteTimeout = 60000; + + request.MaximumAutomaticRedirections = 4; + request.MaximumResponseHeadersLength = 4; + request.Credentials = CredentialCache.DefaultCredentials; + var response = request.GetResponse() as HttpWebResponse; + var txtReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); + result = txtReader.ReadToEnd(); + } + catch (Exception ex) + { + isError = true; + result = ex.Message.ToString(); + } + return result; + } + + #endregion + + } +} diff --git a/Cs_HMI/TestProject/Test_ProPLC/app.config b/Cs_HMI/TestProject/Test_ProPLC/app.config new file mode 100644 index 0000000..2c0f559 --- /dev/null +++ b/Cs_HMI/TestProject/Test_ProPLC/app.config @@ -0,0 +1,3 @@ + + + diff --git a/xbee_LineA_CallButton_P(45A5),C(17),B(9600).xpro b/xbee_LineA_CallButton_P(45A5),C(17),B(9600).xpro new file mode 100644 index 0000000000000000000000000000000000000000..aff5114985562b3e43e5ab3d0c9963c2f4598bba GIT binary patch literal 286999 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%0ABfYJ7QntQO|bRBS#nnv;4v_@$zsaOg#n@ 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 $ntc<2AE^KsI5B?X+F` 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 literal 0 HcmV?d00001 diff --git a/xbee_LineA_innotech_AGV_P(45A6),C(17),B(57600).xpro b/xbee_LineA_innotech_AGV_P(45A6),C(17),B(57600).xpro new file mode 100644 index 0000000000000000000000000000000000000000..13a9d917c50f9362a43d65d7eb74d2781f20f2d7 GIT binary patch literal 286988 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 $ntc<2AE^KsI5B?X+F`Sw`98aIP+;&6=Uk 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 VZ3M)BVu62qINuWMH-Ue9`!DmnI6nXY literal 0 HcmV?d00001

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 z zmqsnE*i*``;OxDK)MzG*m{(+rxT#?ZYGW?*%O{1JdH>z3#Qt-5YOdafOk96S2qcx= zMdHHYRWhs1m^Eei1b>l&sfw3^Fr?9HM^w)pD*CiZbl3fSu!2SzD-hxRLL7;{H)AG)hHIIh~pYp!;xFP4}Sy_3OZtDWe(XL@}O{(gM z9`S8vquA{>q+vy*-NNv!Ah}Rj=aUAdL+8>4vU3uGzT>hlBX#Ii05>jik0ijA@G*EM z;*Y)DEG!@Cmr!w`#4$i8&Ri9lIJG>Njq6`4=y&6cB3LcHX-R4-bYj%;&bJxb>-3Iv z`<3@$Y16NAt2zc+=2#Tp$QqR;{?}!qw5T-xzM;{QUxhKr-gYyZ#9c^EEPgwwNdJ-< z{sryoQF}7X{$f)anc^v}1Tr6>PWY4DNR;6|_h9|XqFCPy-F7+Z=rrIZ*O|+rLp27T zG6US{{fehy@xtm*KQ*ZqMsNbd^)@9ol@rH4$h}ONJL{8vr;S!q5`o>Yr5ihq3rN4{ zeQe|9bZ`ZGb_{Q^?x&J|Y3SvNF-tdDvh{K`(5H5>B1vsqzYq=%^jCDGOl&Cy!SMJ} zIMO`e{ylCJ`~Y0G#Jx{t@0JaMu_&mW@OdSE=!!g5WKfZSulV`C6tYahsjkhVynAqK z+F)vAbQb1k8uddkf3p}8R}@gB|BhbqH{Ri6lMMbbF1Z($`Ptuk(SFiZ6as-DqSn`z zs;s>|V_LK;w7S6hU{!32eGn8H?A$dgl$5=W%Ol)9wJTs+&c=(qT0|w!782#1fI7iX z$i(x@n_pdEBmUFK!>}@C(ikB9ADkbF#_u~DSN9>J(cAk|Dm6#Af!3I7sBp`jh&!>{ zb>WJ&YKX%(632`rLR`v&|1{JtMP6(T5Kp}umLp0rqPd1D>R{=6t~;2Z+1Vy>yCF7I zo?hVswI`t-S{f}4`msC4b##fh;5QL@49yQS{AqpPlvf+ywcF#cD_K9VI*mhF z{x%V`D6p5vwO7pho+%_2JjC7eqk{mdF#07iFyZ=u&gx@{HW1}`2Ms2Eqdd_B(QeC< z4OWNZhq!93Gb85IY8;~?ik59100t>I0$eyVUlp#EE5!Z!^;S$F;u0T!3g;VqT z?Ca&17bRi6%I&#uLUqWuOr|_7#Y)E;cbh~P1El)fjF`YoTWw6H$z}drpk3{TYjJH- zhJGWA(N`%kC=9d0nC2JpXD9F{NaHQC`3j0ufboZ5O{0iV z$7y8sJ1Nqk!lZP~u{QH7MGe7fvG5h9-j?3Ku6WFJbVCTdl^XS9qSr?9WtepsT!cUh zB9ZO%RG7lHWd4z{Gc?3!qb|3I)kr2L53QsHnN(B&MXEtb?5gST?J~w2(f4x zxx}#5av$okS0xc-@aYEMa#Zk$&4WVu`Pl;i;^+RFXFl$8Fq zsRI>_u3yz#K#r@C%~5FG2JLO!~d~Tlr@@6*$44*9?mV$0ssU5P~)1W@#HPG@BH4rw#L1R_xGjeY3Jw)Xhnb zO4}W5^871d2`fqrJ$W#GDPKQzVh^R$32@doc0*?Q-poTN&WsjWbwNz1##MTYU;R=x0Pz5x8Q6_0S~H`dwIXM*z%ubojF;zr{DbYvwU|W z*l1$DV_mnRWQm1sNaDz@SUB)tzMtL00JcipA^=D7Cx6`2v}4Jj!hKXq0$xVkn;dTi z0~Az?o}VfG89cr(m=fe)r*5=(gC(_h%K_Ozpa)e0X0%&FX2qiFEb$BBlMvf4O3d5( z6kh4SC6@F28fmZ7rF0QeUd@Q3`jWtgKMf)T-;ZYv?dWGapLM5d@*q#Z24K1FvS zhq1CoOkD3%7qi!Aq6-y8LNDnfv8q>b{tZ?nlgCU4>K8u~AGxXt<<|;TCnms;2uH0Jr*t$p3$pGDN3r6%Z+-p zlk@}u2bp861Ir*%AD(>Z=ULn})0c*#l;cfV8{C(jx!+ab8J`92xUwhO@1xpCM)3lY zIkf4BF*u+5{;<_0AjH~WJ7D7!mbeJgw#LDCOG_p2*ircY{1ISfT+TOb-4vst!H;56 zA&A|nGxm?pqxq>-$OqEKYSL>P^B>ni>o>b8ItEYRNydVda!UKsS`nf9j-^MUU)VtN zrSKiiipDa&)HRLsWciVLpNdZY+OdtQQ|OzGFh~l$>89m5D|ZX3Y6U^VW4-}PkfFr> z6W+#BfXMq+qa=p7pofw`-W6&1|97aXyv_`KN06L0-o9@VwMK>~z5zP^2TvVlX!m@I zkp4u=Ft`|2GdwfODD#$quRV^^fuTRg7FWK_!&L#I)bCGJU1Owwjpf#rV(wvddjLgt zn1XG964i$rK5#Pb;VUbn`*Ri$wQWm#MN8Epc~_fV;DV9WTLRE98&2gO*Jeh0VZ+#C zV`Z^t6z!x6P-PHHJ6=IJA}r;^$Q>HrtJ^pNb1e8o^KWDQ>9@&F^QOu#ol=K_obNxu zHa@tdS}(_Vt)t{w<;w0vb;l*@+&<&_0dqz(0jPA zf)p~g>A{S(uzlcfqZ(EDrN&1I0tJdO)yJ+uBWwvC>NIt3)n&)@AyO$dB*IxEio2Us z4*x#KT*`Sc?FOvbJ<(ScXB%t$z4y~UR%OW+EfQwZ?ijt3cg4fiw!kKq#EFU9zYqmQoU84`&otf?l6;8(X zJ|U5pV}(#I$TIJ=xDoTwO}N)VcCPu+-QQX-0hE~XRTlg&O_z<%RC>S1XbC#P{tb~2 zA=sDi-_FMG?r@8hjz)CZn7pc~+igoahowJzK(;_9?amjraE#V7xynM*D0n_Wyw~1U zt11I5YZYnrh2Ev^CTlH*C$cc1GkH}u^iShgQ4t?vQZ^j6P1Ek7M_lrf0Gzb7Z<3Z& zcoy+yTlEM{Lf2z`((&bO*k1vS}m#Ab;d*}XTcG*xgG4?Ythz~7Ps ztFDMtmkwY5L;O2oshUxk1~C_KRxv&&K$ zA_>H>mKzuM&V_hqPjA$~)f&YKaOoM(5xx``e$~3>aLcAk*{n9g?H#`ZHm**7(<3CR z(=A_PAFwe{mc1UvLBSEZMx)%Ma4^fOc@o06&WOyO$9ABgj#~0P3n$n$9|6pC>g5D3 z8Jgobk~}X$#}qXSv#sEoOS2`Dx-S>l2O{>OS;LwG)x3F24bBw9mg=7e5wl$s+WPV^ zvKb|?CkQW8Zlc70IbS!5V>W1TUY_>kAtm}bOlKL&jjtetf z*C7m;>2I^!S|fV?o3F;o9SE0knV;?D5@gT}NOn0fJc6T1g#|2!LfJ406de}ojS zUsc|{pLSIl7F?p$U9bJIBo(C3c{DN61GftAEw52@hKsqk6QjC3Bl>;OrQHMrI&w|1 z8ciMYe8B{fR1`2a)~<5{=sG%why?i?kYNR)<&d1Ok2-*Nj}}*Cjt*gqWa~Wf)l}8R z9M6T~&Tby13K}+?0r2Ve^>fz_`u4co^bgxI8VxF@oMW&L2I(}aWhE**V;{#+ZKL+4 zRudB8&$PGu=tI4YXv}d}U#*TfGcD@L8U}^vF{Zp)?{6{2nDrB zn<9;b)Aan2dpcaA31I(NWd}rT8@TtwKTT0-88t9ixTG()y)$$g5-EDEq&}cJju!4s z;XAZ;!A*MSG<)AOZ@00l?+rotb|e0;{E`vxQUcE$B zM;w(T6kzjY0)8>TV#VNy>U{=uUz}}1oqBEq^;>%m+WLTby!xfTZuVgmEN(rpKO~&V z25_)W+WnfG?|?yqccPPif7{-}Su$Jeda`rSxTrL*vB&c8kGuGG1CS$$><8&d4%>&f zGkeJMcDQ0w&~%FA!Ro3;tEeGM-9Q6?CB{`pCtd%HAZ2al(SQ2jZ&tC;3gH;PD@lSP zXR6T+EGPBf_UiKr2azqVXfdNdz)G6)-+&zz3PMhPflhYKt6K!HS#)!utkw`lbHi>l z4jeB~3zFQT_XaMa_Y*t(bbK|{aTeP5c}U-9`GY7!I*GVBNC-2-)2O++SP|6(j)A1; z-vA~GIrYc){aF2Dw}K(GvGo%tOsbqbwB4Gse1)go)R(29X%?gj0@l@l&^;R%WJ}G7 zdAMe?RFH>9s~=x8P$Rl8(b4aBq>CeBl~}A!u(%uGL@#=|&_HAc<-p>SS+m}ENgZE7 zcqN$T3#p_YpebGnuCh;p;fuO?9Q~3?Aywnx|%n5R<(eBPVOMcdkhiofB6ASD%R)6itYT%H*L#04te>GIm<_Ozcx?dIikp zx^Wv#9Ff=|5xBNnxE|i5V;pKp*T=u*=sPoc*hdOELeSh}rwOtB**f0TmlA7NputV&h`z%;;=^d9~-%Os^2=I+H3@BE87L@TKnQ1=N49 zFSlH9#1bA1+qmQ*+*`DCeJ14{CyHvTISQyf)~ts zX}<@;)Tmu8H*1Ut91rEZx>i4{)I%@{9qu2|AMi^2;v^d1)VKENu}w4YA16Q69oeMH z#w?f6yUfLkuwGp2NG&lnRPHrw*$!j&GjeHZ5n#0nFh**f1#HQ~v;@M+vcK0e;?6%9 z@jZVzS4A%c1kYf`*a;=bhgoN8L1hB~uT0nl7jymEbM(XI;VX^C3KZfw{(^)?AzP(( zI_JeLovM<<@QF={Xdw+dutEnPdCAV+&tIMVY#BV|o#j}529g$W@y0UO zdbj$)%mzf(Zjq~wZP0@+NF`IMEZ)WDgv0UmlR|tJ7S6xU^z32dK7+C6BX-^S(}rm^ zLgx$UbmyfPz=GY%$doUIk~ofjtp33(f((LiTjGB0)t*tiIaar(d_Bnui_uWVOIOlnQnV1R}ylEol%k;$A-SM&5WrYD6y-!WNkyl|mo< ztoz3bXEwgw3(VfWr1$dUHvkuyJxc74vs8~|S^91dbo=cqq5bsFAnOCdOXSHx_hJDG z3{~YqPlTsIRwhmjY`!>-@TP4Zet&J$HR|%gn?(P{kSHUioUA7?xq3eeqQ{R_Wg_OiR=3IvqXz@A>0-f1ff83V>o zw27Jlw#|2!p?>i5bK*34=ps*t1o|bGl}6Nb8@y4-5%Rq#djRG)ki`ec|0dux9vsMA zxtBS5k|}l*{;wo2Ei+<9Gw;|#_LeP&jp|3OVH!i9?E1d^)s$9Ng{JT1z1$jroQ(2JXu={-!=yGbC&Cf*MEwC2s(!= zk8}^ysw~$;E=cDbpbQV*5!s&yzl6>*o5?H`=T~?gT7)H~{mq zRu3;BewOTDh~m`cAlqKbX`7znd@6mLoX&RvKW4I><+C~GhLeAf$TuiKSEM;nG1v&D zUL)eoIu;odRhVB&y9OYV*86IsxQJ{qjV&olHaRlf*2bS9*EgNdj#lZ_CzLtIQ}0GH-CQs3qbV0_EH_E zF7Zx5>4g83Vk$E@Z-RnjQ7?0}Lk?B3v#L7@{0vtLsy05d5-s3{8)_?#X(65BqZFJO z8#)(LFK+BJdl~07g_jDkR6?P^pp8J;JuS5Uvg8VmYmC^|A0ZKgJY>~0$FR%ze7 zyC70(ZPP!v73r}cHK^}_)hMFvydq7JnM8l(mxe`>sfc_*s802qjWtVowy@EXV0F}E zBYFxt|8dVk_j~PItEt~Nn`gJw6}XqCI>YToC!@Qs6ebBfwr^;!$A)ShG$!|XQ<>!q zAjV+Q!O+kTc*)x`29}7@E=8yU3FhFCQVBX>T0V7&X98lk1!jS1Tt{e7wj+|HSd07pPeoa-h#-$ca?qv4)&TalRQG3N)PdJ5!K+dQ=j;1ZmrB^Mrwf@ z)-2aEdT{k#jYom%$h_QKGqXLp-w=1bKxkq)h^VZ*C*|qyDn8Q@so;5A^kiOD$fq8s zl^p@XR^UV0*_S&UZ+hhU+ll2F{R~PUVup7hjkvQ28##urCpSUf9k06AVvRm|G@c%^ zi$~jJ>?#%W(EmJRS{wUE(`3OqeME%mE(=3lKLFBVNJ;eBtsoFnEDDFk;+5fa{Y|OU zBo7LiZ>mRP+`l9dU^Q4#ny?v*U~O^k>vo-n(w{1D&7A-jY4g0A9x?P-&L!z)7v$mU zeK_L?uRK5PFAp8Ada~tWoQ^Yrb1C$rcL1FfnKsqVgXu215HeK3Gzcbye>o>kXwEniBW}bv2(L*uXwg?qbx&d}IZ)XS za%^9w`VLJL0R)d1OVpspB%HeqQvU9qE0#M75)vA+mZ{mEUBe6|nGjn5dA3!?)`V_o zb;QZV?Lx(k&Epw@_TUA?;2$4`z5IxHiU3G3oJXZ$6gkPQ`%dN&S}aO*zfQ0!po{;o zmdxsiFF28rjH~|2OFGu1KtbB#*XkGf*P>{!!mV%$KQ8_IK4>5_XEG6%iV&ii#FlmRZHGxZ{S;$i21gy-WasJ&^^k@` zB7%Ed0q@#<8klOndPJ-!+T82sm>&oW1wudHoAJq~h%$!wqARa3uyfox+Hz&a z^Ml3=GH^3)e{p5BIaSvMN3kXizTtBEozt``#3fJsWJA$(pzXMn)of4B-T_ObMc>4HHJ{XUm z_7;!~#w(DDeWA=?@FqZu??v%7x>8LPp{9M(7mH&0iv9|jYc7*`@o};&vK@*S zMvP64V)8A|sisA?A*w25$Nli_u^-nK^nTa}*{yF5anN4ZnDX^g5aACYw0Ej15?_>p zC@?|LVlLs5L1yvqh%bk%E!3vyNCGZkBqyDP+S^k_ zVNVQkE&=P?q|rq)+?f;mAA0jlD<=f#OMt(O_hRgW>r5htJ4fqTW77shIW+~Y_uG5% z1(q~bz4|3zC!qeW)}v;Sg@bzUgsNjuY8dMR_r^Yhn~K0iXP3DjBt3!$*Tck8?zjZr z9v%p5B*Xk17YU|b-m?KT^hXa95QEw8P;e~g#Z zlk4@4e>jRcd7B8dFZ}8e?QrdVXjX@wn>;O-K%%Irt#Ic&=<8LAd*f?=@osZ5Jav&5AxiWKu&0rl=$TvG6EXGMDIqX~sz%_^npE>a|s0YEXj*~ykJd1os zJkLz;@}!8JGSZkM*5FPO*zY}AZ6C%33cR9|@*HWi>shJ(ZowRuMc_pG+qsg>9*!6Z zxVU17U^tg>GMTMDp5fAs!P**Pw@7e1q&m8%dinjx|C;+G*ak3KY$1ud($R8dhSq&^ zqbQCFShG!{ur?gUT=G-Qa~WmHnKgz3JTK*p>viAF3Q+$&lOWNtmBHgorskC!?dWc1 zkT?jA=z2@ZIGlMx*!V0Ue^b+IE7t%h z`_VxDWEBVWVq2z>R|_4q!N$=fCNQKFAnA_dI+rhgK^vne0n`Ygp;W{G5%ALUCUNz= z|1FP2$#Cv^%Q^Vc&#Aw3lUr@C!hy6_^0is2M6y8#g@t-6#kL}vADysvaPOk8yC7X( zO#MQQ03tbmC6NQSl^*IFDhFQOP772SD5}{j^)-dB^~^|Z8NVqP$Ra2rQP(IZcac_D z*w@XRZhw#2g=`f9FA(q5XAo%C69v^LRHl+mH>-}U@ErvaoEEAnzh;MISg`%S(uCPR zV&4J`+z#b2$V9UbZM!%TeV=v?exB?~EDMAq7P#Cd9CO&%H@CjF(#X9ryh1)q*m4!R z2-f?(6szaeKFnMzV<*Wf!Vw}VC`IC)66i3oOBmy^Pc0zwNuLzWJM}j3YtPk<-{hP~ z(lhwqFsd{AxuBub^R7|ctMGud1%f|^q4hxSbAL!y1x*tvv*EIL?E}%t*4Hcf#CrB< zq;akkc*Heo`*Km^J~p*@mT`xmN8Z6oB}LWcztdQcuY3?NXH4#Oc~Gj%iw8lk z;sNe^H9+-;@;X~n0-*+&+{npUQiu5BzAGQ8o^>TgRp?VhRN&~>zzp7_j5}HOs7(CGYYBz-W zG!22YD+96-A z9fwGf$P=KW+t`mWOpZ@a2zMVWy;|@%q@XnyY%*tyL|i>dcH_ZZyqm3G%P)@3UMLzC)OXa7Z&=?V2RIS|y&PwTdZ`l$94 z$vup3hN!Mwo! zl(1ZDk;BL5O>{n^+el-kE~7{L?%Y{43_aiwL@N{Ph90EHOYUcK(Lmm7!vUJD4m2=5 z>=`;Julx5U)`l(eEfGkjfIc6goT{aKiSuWtd;HB>ae$8LQ~uK2y0|a}H*yD*NxiDh zx*s@W)*=chEVLTGTXO9dEiF)VBZ6^cH&+Xarxep%%MQ+Nx+WS;0@R!z1lM_pnE{$$#x2Q)y{Yb@aB|sttt>K zW`7gA*;yKtygUnV%zxHrOa?Jf2sxkfFI3txb$`5(8c-;7mS0z~FkiQqyj5GAHp}%5 zzFlS6lrAvYRKxJ_)wVG24AYamid6goGlELbI>Ggs#+!=C?=lqbbPi*1cesF?j2Tu~ z@I8nSI~z1)Q-sRAKs#NDQ96wX?zIuh>9tW+*AamsKkbMv#&s09ZDT})+qKBsx8t8L zmI8b&`f08+Px$O#&hx2r2OAS5h6=ncvI^Qw1~bzkp6Y@Sh`5tRU$5Rcl8OKa_mDx+ zM7LDGR)?TDie(-H*EPGIds}bEtqIztJ_E>gYg8tfm`_JTAE$7R#~o+m*!*4BpNyZf z+2|E7j96^P3ExH=so{e$>5-!jNwAGpzHoqj+}(BdXRtR(-!0e&i#`*%+&kPV97fD(;oReqp(6F(3m-@ zDW!Wcl3CYqZ9A`ISH&^@ZLt(k$u~JEF9Cw(L4|TYO3F*Q9P*Kx=!>62MH7O+QB2N+ zL3njHwbsZ_gyZXwoo$G962a%6x0n!AJyZ!a)C26xhjyH`qxasp^{r# z<&>$iJjYhp@t~|7V7<|A9coe^G>kG^j4Gj>z{RfJ-rgAb1a_z@Lu$1@ov&zHMVYH< z91HdNE9VqeQq^Prv~jwv$InjGOvy#mbYg(&1c^p^%LEFawV2>2A6@colYV#gScAtv z`*-K!{R$ZNI&XGjzCrw`-%|c!QlBK=y(Lj8I_kQ~XP4HSm-vr8{X!&L_jye{YDiV> zf;%R*?*W)^HT4;PWI+r^+72(4d>lb=y~EM0>D=M1dfwZTUp*ufSGkQ> zglffo`!QUZM$G%!|LY}h^j1fo9)`MdDB8E!88*DGbzUc!nLg;Lxa1Eo=+1m(hNuOndkzSu>Tzr48tlH9m&KP^sT5))N#uuRxj8vDZ;XyzR%DFjr*tM@nVR`yq(kRY2FgDms z)KVwKEY-bBZqXXZmpnV}vD@YlqSR#6IEAIWD^SzJqVB@MR;|ZaEW*7Q|5<3ZruKZv zjF2meWi9cT;MvVlo>Ij%e*D$*aj0|`EKhF36e9l6r|-ihc13+mdobT4vrZTRY=N1m z)nBTehK!;B*0hzPb(jznIb%=hMzWxuq#63TBttDnb5Fsff*+y-EfqdCT{b%M8`Xuo z{jj8JC%ih}4bdn*VxlO+Ys>4|1mt)73oMaoq3TVh{m0pImTM=hc>ZZ zuMD~>3V@QC%pk5&0#_jJBK3fpKk0fio&nQbeCasBcTU+X2UOl2y8SA>M19d^QzQ-N zIa}gPxYI$~SZJb^Q!RX7v7YCPfxA`2g0`N9Mn`&n6#K19;%xZFb=ng#rq=x1MkEJR zg*6Q035Q6bE8nhsvh-xXgvLVj9v0?T`^3N&26y~ZxtP_`{LVlDeU>U>a}?~(e!vkQr3*rSC*THO-8 zIDQNnC^7Tg#C86Qk`k}Z=peqhDh|NdcKPXMVvPe3uu{v)7QvUGwFub4^W@nozVf!e z)h&dRTawKWI9}iPCIzh^JFi&-sIFGGd=^wKCzGpUk&}dP6)XIV>~e7jFvk9~`@Xx* z>_UVIH;=|7qqwEK=_j~BUe9iSB*DJKq+}guZZz-PFOi6>MhwwSbe|-}QLRxSm3_C+ z43TSWh%j3;E}mlSsWE)(p?6U`wCbz$<-M(@wXUj*zl55@)%l%wVoly|yuPLcMabVX zqHEMZMXz0GV3Ul`DP$<=d%l?`r)U8g*kmMPZh7r(J3AP9I2yySbSO4KC|>5O3(ERQ zgpYthueB%3#`OGD{!SOUq6-gt#v5)mJ}B1f9s48D(%{p_)so|@_RJ830v=^81-z>` zs>)Bhhl^N~N(5lr`|IC)u%0K}OnlBW)n!hhV-Pv&`t5o!C15`_Xdy=w2Yj0Qfvqaq zot65-Y2PN?L5Se=+;Y%Fasfz}ulXy+Oz()(pshD=(RLxX^~th0=t(`kW#2%Q(kkD$ zThJGABQZsWkn3`hVGc1mSRoTn%sT!WnvOLuiImD!(Df&`aBoxDJvAzAdz{6I?qUYBI?*ru1PmkIh z^6VHeb^~DBdy&4~MpKF%zi_0 zX>2QKKm)6!NRs5eYtqaA)iP>-kSOzzvFqqZHB(st%ar@=bM;RuB5)Og?tZp6w){x^ zU1*!rJUA~O&-VUhyg<%{1*guc+jmfLy>u^T)94vQ(mc&}r>T4dKrDfhoX*<&FLKY0 zc9iB1Zd%1Q>1ha>=S63}8Md;cW+uRXp(f;3#Sybf3I29qB5qNl&ZNBx%KBbw)GkiP zk;3_>=oxc3@TtjN@-8PM($wgX_<~OtiqrTgs%>(gmrXWRTKAXSchZER6|EPa$0zVM8&cxQ zK&jC8e8UagQZQ6W+;{V07c1+9e_&dZ)dQ6D#iz@yXo(JfKKRYBfHca|H*aIN8e|7j zLM*_UyrFj$)%83`jx&+e+;%P6JA3NY)xKqmhuo0EMo>WAwqqd+IGu<&6+iJ~ejsvV za|?6I=Jyo(iCUol*=-t{|f(N*i0F%)R@vYBcuA%p$C*Nc47fo)CtJmpgCXlv zO_P#iZ)miI!l2k6rz)^J)V;^lXY}^9~uspfKB~> zdA^e{YeUDa0D%#HYCxx}DrZn*vJDF2D{C0X(}WW8T?AAjeH-lq_g*QyDr9DBRFl<^ z(J)_rwdJ9%~L}f*O1y!XYf|Pm2yyx72zwZWSi8RF1j~2rM ziD=2vqc7YEcc%;4PC!n7MavO(z`P%q8Sn{66eUfa3QyOMy*}*vTp73(V|GzfDI)VJ z(-lNtvf}1t-rAX05AGpfnuCeAKS<+^)HOs8V4XV##1s5gf?_KXw3nocyhNk6^x-`R#gbz#X| zlE5%&h(eD33MIjRPM}23hsET#lXv8l11~Y76EQ6`+oCj921(}*D*6?fe&Af-rqxBZ zvlc;lu`VQ7=}-v4>hrcHX>Bu-`g4q8%RXbMcI)JXW$mM9D}S>us5Z6SFF?`yUQ67y z!XCMe;pE0N^15D9-(WO_!ygNm;HBCEM&xY$%>7U;E9i@3t?MVy9Y^T_D~=#xX>dkZ zMTWM5Nw;Yb_ zLTN{6CI2(^{VXaeXxjnwA&c`4|B&cETuzzxUK;=b?itY$Me`E9Nll0sgAP25bwkil zq#bY5D6n~lLfUdsR#Wu76dmzFv7RH!KGoJ|;E-kT#4V!bi3emrMov&Vj1oB!Q#6FKSE& zY}KF1c?QN}2ptnIOkT(n5^r>l*nH?JbWrDH+xi~6|c(8U#=W?k6Hyvy{hOLv4py?lD9eW)GtHbgp$Xzi%!`zX(=Lug&DW_rrc&EunElpiQWR z=W?(K@ww9N$nomcIh0hBPA^HXKN)RD1+*GIs}J-uYwFr?mA;?nZMhn#wY)|#Y|!{WxXu%G4WomZ8LgY9BgXb5O-VPy2#%)C5yy` zbJ_e}>*Rl=22siN|AULi>fkX>2*fZPsi7Dc|K3yMNTs0J^hM~f9GrusTf-lW2Muc3 zH1cc62d|n?skHI)g>?2-ye_XK1ty$4l(i?;MU}^d zo_1+vBP+>Cx(6%=z7q1`Cgg=MX=QnG0Ld(Ub&Q}ub?tdH={_kt^wv);R@NzZa5KgX zQy@Su@6_ytiP+c^WduJ;<&ojJp|75Vw-&g?KL8NUPvU$>R*OSy-)Oj_H44{*AQmoO>MWVr&GaTS2JKNl}^S-`L0LY(9!s5VO-XULrA$WX&=th_EQsGU$w2;>?6BchMm zkm$Zhm|?Rh1Lcq#nd*TvojHGt{0HSD2%_KH2#B$u6Q@a@N}x01X1x&_ZIyuNdP9-z zW60n4lw#CE3MbISH6Z^UbB-#HaHg>dPA$#xB3tSmdM*A0=4jt3NuIxNS@lQ?oqq(m zD|pmdh4EUG+%OCS!(W8FN)tAf(hj+Y=hC=7Q0qvwpzvORGE-H@~!ai-!9rN)313) zM7aS=ha?F5hP<)3nw*-KV81swY=z0$CT)paFE_&v@p6?~-7XDY%P*5|XWjwE;)r{o z299g|`0adG1r6T7yF}f}JYfTfd65jr+Qgas6hizqV7aQt1 zo|!v6wPI{K3R~0&eyWbK*nr4{>DLv|NzQDL0+xoRI8N>0>l@D7pd5wVEcBeGfNiR* z1uVmya9SUht3bQ8XgPHq&z=)#7xDduVJjW3haT*lY@Cm78V7y(@?u!Xoh ziZ;Ce_-fg+tOw&AG7*U-$&)%asM(Ys-8=6Ht!-byC4JvFB)}6@5J~kQbf|O&h!~ol z=SXNtmoV&SUSNsKO+6O)BZ3N&pA@m$*5L&E9JWDI=Jrh?`u+m zhP|Hd+ZO+qibfYa6iyu3rl42GT7-D9*&pgOdIuAPHzjW#;rj%8t#wHYV-^&LC*8QA zLwTLG39(aL+l_YJlR~VLW3+^`vi_UX7Kj0&Q|&_fK)fxzRc+`5kAqk<{JLNRo>{d) zS?2Eg%2jW|bMU<@c&ST%1G-c8*Wa_>`uL%Ii(73f{wWdG>uvT)TP-z*lQNivY0e9H z-=Kn!GL28;f$vI3n8b{aR6BUABIRm`IrVZt5EJ3Ldr@FQ&2pW^$b*j<7g_yPl zfd@9x6AJ*PH;@G|9@fM;modd1r%A_pR#VyMGo(J>eUT4P!Fs^GS9?fzE!H6J{M0ys zOBxFp)Sk7jMT)zCt>3Z8m^ddX{CiHbCUW4Ck(L{KO|FPRO~SPN#M~7nk{0EiXu;=Q z|5ZlP+Ly8`GT<5V?k{-#HyvY|b-U>a*y*A~w;1xr-kt6HYWz$yKOfx@e0Klm2f}7% zUUfZ39mjkiV;xPHHiskPF-kE>RGs5R5pk-z+Au44mRkw6cYKsIi69@;?GJexS#J;{ zJ@MXiBvy!!h9)8B<2FC?zUS>$MUM(vXK6#fb9J>%NDs~Ic+*Kzlc*c8`Oy6RE7GY9 zOMFWYziw}c-QQ9_{^>_J3S4SrAb&6Ymu4fZ?vOU{g;xzO!+JZvStPc#STtHxpEX-M z(xSuNoO2Q*)5?%EI}zPbZZnEHSURr_u=^sRNSp^OCV}D_Ux+N`@@v3iiAxIZK3!EsSAoY^kXkqebOR^&YJs^|Uzs8$ifUF_^D` z^N}N3RpZ~ffK2Tu=9z^G^C$Su$OQ6UJA&a7d;u)tKqpWQI`BVX`?e%6vyD335GrmI zWAN+vgFw#ffN`ywIhQv|H26feX6GSXT|oVxWW1?KTeD}-K`sM?Ixv}&tzD$VSEarn zBC5|4GZ=mg9Y%V3<_f3|zuFk|txIu^O2mlCFD}5E`82NTNYYJL?>1&fy~(B1x1DEL zd9&kJE%j$K&9z>m_WG_vtrw5lJ&alOE42rey#g?66P)TPOfl*k$X&c^BHB=pfCR;m z@5a_A8t={f4QIEK@$vb1UR8qs3?|xGfUY!91<*;0KjpP6z70MHZbp}KeF1I&>RIBD z=%zXKOM2n5?3N|VM-J1`&o;iT`}VHhr@tcqD-~6W-mMVXt(~&oneO?XG=TLFDjE%= z7=yyHffX+R+d~5vyFYIH=2gcDzPy~D`4V}{j+A9_(;#oxvECF9B&`Sv3#2MXsY?t~ zo~Fw;N!pr0H(CHh0Y?`gn9kUZj5~$UG91GePA-YtI5*pu4a$c==5aHz$HJz9yN6Qc zt83nG_Z<{AeUeYJO@I&jmXPB+H2aroIKkdQU(0*yp$y}}zifl77j_R&n}7v|K5LyP zlQe{%-R5`S-b{e0Ee-Og?E`XwVezg+ps4$EKd2!2=)!i5KQ0tHy~Uywe1*&dYspA+ zle1jVTO+bx$s-bZFknVLQvZT$xHRNBmJKDuaO*vROho4wy!dmhdIb%a5`I-NJcYp` zSlY&{N;OmI6HFl2-Eg%)(HY?tw@rV?*fS&SEfe$5@$diDvz+~JxJJc`8lGr|V7Pr>Z?#^p)YAxe#r$r{Q_eBDy_Ky9YxY_P{5|yJgOJ*!OJq@_O<;zT2`f+J zmJpgRr|?L0+xx+~Cv*$O4VIAtL3X7oS;2sxe#joAa8E))A2q4Y&miL2O5*0jLa^2LnIP(s6fblDd6`bR^e3-SqiG zZea(*Vm{Li>s-)Q0RGR6NhdS_;F6}!l1G^8m|n2xOxu>C8A`f~id8nFgE#+QD4=Je z$HIgBx7j)8h^<;XT(uz+|6vB|3i`)6b_DaK6%Nxk1*Q?kv0TAJ^EL9dH) zk-`HNO*Vj_@+p9Lw>1uNL^TMCb%tc8qJ*fwRvpn{|HYN-ETJ(h0kutXS>4_M0zl=gh?drqws z6>p6bjqSifSET3ck4y3E+^szZJITS;yNmfmJgMwQMeT)TYt6yuq$P_tZQNL44WcK} z&3*2#-&LSk?()(;N}j3g-Rx>Q;UxlQHJ79gj#hJ}N33wz*(@?$X|@phX_Zj#zgnWJ zmwEL8k4ksXc>a)}qMc4qA6!LumU3wM1Mo^=CL@qXutD~@+-$j%Cb;T_#uUu8s{wUepOK$R z{(u9d#UM7IkC27l43K&)4f>5SizLuHb*fe)vEwGA^tGs3NO-Q#VFP41nn-^g z`?cr6_{r>{taXg(f?{;QCngyroUYloiT)l@$S}5$r?zR9rJ*3<-CI|N%KUo_;gIBj?0Jhr*d(U3%z8yuR|HkpyAk3k%{2zeI_1FCt6 z{EKfi+l2HbUlKICAM0*`017wPAOzuEY@TQyEB{mh;E@mJ12_Cr)VVJ0cibTNN5(1? zu6T`4aW=)`{tAW>U*H?<(55MznF>qT(!O|$7SD8syz%&l3PI!lJ2cb-%^)mx90r3@InF=%HV z=c64EuB)>@YR6ya;vs&Mq`zg#O_3JN12n|)@MZBlCnaXFi6ii9dmYq_`qX z24yCw@`0B_{PFE=dN?YLDUq0~GK1t1+Yy4p}?AMusKGhpZ55ggpXiW+mtjifXnNN=>};o#jKHxP=k7`;9}4P_78l2J%Uk;d13G~puw<&T;VS=C7npvzGzY2_rD03xMYrB%2w5{pqHbyU7p7UMo({;0S;WOjkKO!dKkGWuGoNkRE0Ax&dY&AvW=F$cQ_@jV{j67EOzsicRAXkq#|l}-DqxPRm*1j~BNJT5GEZWN z);9$1(z(@r?K1_IXb>7!ZN3yHvKUsimO4$6D4jrorx@wl0UdKfY#=S-hustr9H&G@ z@296xpRXcz#6cQs0)I9)4cf#H^C614O{YUM9-O8C*;#i}5dD+9r!{fW3oj6cK?x4z zD+2D}=?Hb;LR0uD7n<4lt`TFc)s-Ahd$6n7tPa*;>~VOO&paoVseDduNA?mN+Hria z)vWtWw6kih%k!erT##dmKIz*52~cRQo#WRmzqOTwkd%7SN7-{pP)No$`Z=VdIEBkv zA&&ye*mFk*iLerJjqg)g!%HBjKzU0~$#1$fQ2U;3gEHu;pupHdi47v=X)RdhQ)6^l zb^-=O7<;I;GOv4C&w-s>-5O0=db6;cx>6FYcYfQT8zpHF-7ef34$7zKS;+2C%mc4b zj5C@vx}_==JiO1XX>{L?$~rT4uR3cdmGb3d7}gt#WMH0}K!XP&E4?ix@-#S=+D#?{ zC-NDw%a1!4JQO#u$S>|^_HFgr0Lppn93$U(6_^zE-zkv>9d&m+kset0%s0q`DI8#Y zGd==~prvMwE0;Jus0mqy%|%VXUmIS~0+vdiyW6;nIU{(Fm(HK45={04V9rMcV(7@E za@gUIf3bD(nLEPYeSL|6UvgGnna+#&kuTCud$t?5rsETSZup=E$fP49QsPC2#&(zK zAiaW7B@$^@2-v*HvtiQRahkNdYqQ~NC$+D=UX2jgl9PI24n4bswsCN3CxnG}F4;a{ z%Cdm5L7wLUoPiKFBl03xFj>q={!azEQK0$tFAE2a%-oy^p;`aW-rjaa7k@H*c4&I3;aK`JxpSE%vE^SMXI zi4R{0w_1ZW&s_J)##Ef1Ur$b3egSb!_nI5ZJsw>^-4GJIYjK%njvfB2a3AaeKmdK~?0!zCv(2Xr+$muVkx7{&6LzMOMzq@6Wtj2`FjOQdMEsRJiB&AE))M z#9vI^*WzYhI$bid(_s#4BpS}-Qel@NQXRY|*Yt{@7>e=K+1WCJ-tiCUGRCL2Lr>tu zrQ2^oQm3rM7(|mtjB~aX$3;aAAbN+iqr01e7%Dz zHpojNx<S{(KZRjV~@j!GT|3lvlmme&I?@)@JqpkG${b zqklo*=k%ZlnlKKbqPTidxwY3*En8Y#i04@uFsGpbamI^WWEl=EgCE0$JV(yMLs)k} zB?{N*VB&?(T-h9YxX2+bUeUhJDXK%+cFf8$9~<#?aigZ5#VoR zs=dB>+W`|)@i+kobV66;yBN}dqIi?DsROknY6e(^DCMgiWnNrM0C9vv_G$Bc4@;-mHALwI9Ln3XZ9`uxONO$210P*v8YXHw@c_nm9(yXOjX1Uf74_{9vw( ziLgeLuErB8q7ZGi;5b~S#HPgnFDrA25NW>m*&mjb_j{NfKp;XkbwU}qGC2-sj(^Xi z*M`-9>R}-6WTkdYyJEZ=01_#@XB?01hz#Fo;_u`V5V#kC3l_AO2p<)Ydq&gcAUIy4 z61#}QSUgp~JmJ5V@Aw#7fhRm#$C!h_cVxYriVGcqT#}H6adCBnnap(u1PEMMk+{KP zNC&cHMe;IX=pb`ZROgVg2wTynx>@SQe8HiwT` zY@`gLV~tY;D&V^!u=d{kD`W>qEh}siJY?;xRX)>bUTzVP2}SER3Cmowk_8aAHcChq zoN~H?W>VEJ?Z|%@ZOyoW1o~!;E7XMY^#gj)FRL{TN>IX(C1pd6p~10l>s`TBd4 zC@*DP)fY`nxM*LSAL3|TPmTI+_r%auJGmL|mUpf4CZ*6<80A3$yk(#}jk}I! zR$9L=nLTZ(Hk5xJ1s_mAEAKD;S(p>U!L(t+&Mo7n)=}6L;V4YYOXd^KMqc|91>=E- zgYf0*inRH(#8%^ddLsebLt3jRZZk&c^5#f_is~yXIU+49!HXVRC`iZ-mwYFGWb?Ky zKLCeYmdFGFQeO5p5DwpudGu4&cHZD*@DGt>?mVZjvTOKds>T1G1~ZzDC9yDVr5t2w zzimg9Pm&O=clU-paO5*?0&k2?I)u^i{T>nVuS2V{$+_F}I?h!O#Ir?VwXO-H@6phU zMgW^|5c?iY2sPw|p<7ziR#i%rr+81bjd=j$FZkyv0_~Un5T!<#ky^&%^wzCyAYnoV zZj*yPYVCI%hA?E%k$V1DBw!agTem02EhchOk?p%`?e~RB$Af<~PKyx{Pu*sy;HyCJ8Nb)GWsQ z{4J*Ir3Hq@npULC{MOUUB|KIZCZ)N@E!Y?T+dDqlGba;Pb%ba}f51Jon`Y2F@+27G;GM@=E0j1vau)C@qVX9NT0`StJ5@SeCYJ#(x2KGzJ<9}8{8vwQU*m*0BbCif zH-1}d6_n#=(5e@(ojGYEdr->pdtz{mRYTU0^K(1E(sBnTr|<^dGx%=3PlwiO&4&=# z+O{rGYRwcq! zaxRFVB`oC{uMcl62@^Cc%5;@SD_++QPpy7M9sqKb|2<(iq-4PBIF-WS=eGE497z7> zEnx)9Gr9uenc!PD9Vp9*_ELJbWm&0B2*5t}_IInJSuLXpeGc8gWlNmJIdQqmszcZj zi{i=B=5G-A-#?#6YZ+nqa>&XQqsDmxZy>%qdX&ZBqlRD*`u!nR|Him?{zzd+1mL+X z%eOTE&e^*b5MHFTw*~`=m6(Oe*eP(DW)k3e@cln2TZmYvKOQDUSy}Ty2+uWa*gRD}R5Mz^wh1s2iOvNh=7{1f znVp_Q;Oj+K8`pNbQj$cFn`s}$Hp_z-I*#qS>0?i*Gxo$bkm1m=BsX*uV;c4jxXpeR z1e>7(-&{O+n_%&o^NCj8Cj|1-&Fd0Lj_Y#0mYH)HAHx-mQSJUQvSTG)`17yX8mnp5 zn?hLbx*e|%W+!OOJ%YH~fTKNIV%uH3Mk2&bR~UX=2vMeYI0I?Ri_#PBJBkto5nyW% zNKSwj$xA}SEDnRTLmT{MQ5XZ7=t<0chP^BP1mEjmOTUlGs&LkPuX1TXY0tPGND-Tk zx~s62ZAr*f1=D3U8R6MTl0!PSH5@y09TNqXImZA;K)AmEztWIFoZ=4kKHJiJh=}J1 zNHZ~bE3H0D?8$>|LJ-YQh2V5vlu)(up(|jG){RT>he|+wUl4_2g8GUMGR1)xs>1Dff(MO(ZV(m0P9ndh7*$mDU!Rz(LwWZXJ-(ST&LHX$-HU1Ni%=XC25 z@fo7=P{s0MU5)VcygrfYjER*U=LU4Rm`i}(q4UW2fZqp{t(1BMs|oMsMyY;ct*_fn5W|T! zOYKZ|Fk)L>vLI*fDg#5xStr7&IglGUHWEN&out$Pf=`CxC1C)Gxx`4O|p(*kcZo1v5_Z=CU5!kU#JTU;P4hM*lv@f6Nauox&)@WoqZMK+5 zk0I*D<`%OuBUA3NLJ1oK-@152ggR^?k^?TB|HaXs!;Y)Hyj4<9R~AoPXSs!e%r@-x z$SAn2gjO|#loTh67+=eTMB2BOt>Czg-cL&!J-ZQpm%{S3!%V~0c5(#ZP3!o}G=fMH zB&y;bJt_6MugM0iN>8^BSlqH>FL`^n)pX%LGF8$S zZTT$ZMChD(_kCH}O~C=wBGfK6I+O|-FLc?e$-_MUG4)|jMqaAjpM7+%{4jKoJ7|87 z;cmN+&xy4d8Kd@2k!05aEkZ*^AzFUKQX^7I;b{4BNBUmaHXnWMXkU-(Dotwdy*2j2 z<-7!E3FPFnRp4z)Xah%%bXd>svM5=myFG;Z`A~aU)=BroXC(7Edp&$$1+sx%3TUun|)L zJj+|nU>ja+C3IK%XFkNv&|~!8j6c!FS$VsO1SDX7RT;HqsMveLBnj+NzIua6tM^r9 zMU}Yf?0wAg{~nR(4?3t_)f)BtAK^#3_d-CfYI#RTj?okY-|7M0$t*+iYPGmkL|&ev z>Wu7m%G<=&`1WZhB0{3aKe6ITTZ!@G3n+ zX**gPcDdeM<#a8?XnmH{RgV!dF^kS$6xCefLaGB;ffOqli^jzdcrp_7$CR^kZN@1N=pK7dQcs{51d<%H9^Vd7)f zeoYA>lS&QAu+6zEI>80n__xG3DeD6v@yeyKaVW=Jw?zE#VZse^Kurw76%t#`P21eq zufJ4VgWSa@m6n!NE%~&Ru$R*t7Df9tK6F=v)Rsk{qea5kLIYbdV zOE;JHtIB2qw2=)joJ9041!;Ng57JU@wHX6(lXk``t9ZzEk+Nol;k&{HtE za}@}@;3SVGPGv6+xRD%?3jFIt@=Q{d*skCoOq&jsv3`s01SA%%=uI&jM8y0eqRxyl zfYFZv!$XoIri!Odb*{wQ$@t(SD(P@UNuxGA(QKc_B3tV@WuObBrWF2eY)sAnHEh}# zm^lh<)ix>!K8rOmiTs!=L~{a(8$jDhD$jU=qQMV!86T98emTQiyf zL}}e*f2gJ|@rDfZMeA{sw?<)FOJl=;o)f)DLfChTrTFX!bvJUzIvobwHJFxnwf`>2 zk*u}^a2pwS%DA~Eu!Ni1hSU%KlK|s%KuTlgZGhAdkdS5tMs6bn*HcjGi2dy?)k&I; zRoYGALFshj4q)5meDWrvPZ`13Ye)>~4T7v>Ekl2talS*80B z8du}tjVpJ!L2BYInbDG4a2fW9R8Ls+YwN4tGdgaYt&<^{9BD+|bsN)@CK-JkSq=tT za$v})u2E-I1h<@78$sxXr4Or7<4b0L{5mEd2N~#eUW>zd36v%mbxakn;E#6lvv=E6 z3I@J=#V*7%HO)JIZ+Zv}7&Q1v+!@2WJjEsiRm8K0n6eYAcKF*7p1T8y+FYukm9@CU zH)8oLBp|nbHzW2>{bMxcBr6!paf3XibpDT+v9j`ei@`R>x&|6Qz*QdzQQD*AFZ7SEV8NtB>e1AQD7{GZHVW?#>b z&O)Kz9OV(bnrwt2Rr>ox8AA8RRT~SL5OA3k%h6l>wp?d3d=!vfLgC_S=KW#{lXlK*;v|L9PgCid-NwtYYSL}Rk&82S~`Rc@Kz1~AJ3M6CHnpa z4;^CyKVK;$m-0PVeL60M#i6`tzC9eO^R{Z%c8<@GSrXwkqVb}O_c%Z!8sASVR#@=Y z1Nh}y!PbzpJ0Ulk9vnStXpC_O+&WXJkAPz?X{5E%F54^Iv&G&=p>^9#%&9@R@BtZFHqp*Nl{{EU0*G?=TJR5- zgO=<^D)EZc(reki)kx!(S9ERGu0Ce{lZh6%#;+4D))*uqK6!-t)-m_f6-7<_)_og- zHCrkXke7Zv?{^=dB2MLzY{d|KZxw_TCoby<8d4uOZtMO=|FN?BTkMfK1q+_c`wH_R z#K6h6$*at-Bb3h-x4~v3oL{(66!agR((`}##QDq6(I(u}=Sx7O_!`T-p~SL^^4G=o z3{J8lOTJEL&8&7)1yXXu&&`R_&8!(T@5d{LiRQV*tor;OK_vSHdTh4~N-=Kr9Q<(c zH}MxZC*8HqQucrWqzBx~4VBrQ)2!`w?cbhsJRH}tBm_uIVA`cTws2SpmKW2@3&V1( zkbq0P4ST-rQJ8r~U0E5?|Bl+@h(5NB&vi9zVV<|ZPc%PAF{$jbDvN6jh}ikk<-J-< zqKG(vur4@h%}-!5>|oC+s_^WSM_;zmJc2*+WNX)Hy$e5=UQhLW4<03l@#_1wmnDfo zQ{@53FP5N50$%eYSmrLVFV}qQfls4KX#Kp82XQJ7TmR5tiX}${JIl0{MCqid&BcfZ z5tUIF;;gK54%Fb8+(PRpVj!z2-0JGNf(X;sKq4dVQ9$Z6IxY67OhY@ytQbFFJLHlY zh{;aK%Giz78t5=~4qC*^vt*nhxY%^s(vBs@%4l-ZZZ^8v3%XtWlGxZVJ=UlYP%2IU zS^s54u***AEihh1GKd~3yoXEGsYyTWic-I|_J79Zf90b@|D>7DEFfGyEV@@nmIgt^ z5!@^?n3 z@QL7-_Q}{nZ2;+^#${$D>v7P+^vjM*?(^pkScN*7K)`%AFp$ zqAU9K4qdN5Jjj6S0|xg1-stiAooF%0bu~FR#_m9BbSQ0pJ=F5qD)>JEF~PsQQt}oN z%6$$~U02Wx>jcz0FaJo;GWqW^=Xp49Sf1yx#}yKPu22w>rcMs1{r@Wk4r!G$YF*Og zn|v^Dll;lB#S9yo{s?^VGKbd<0V3T_e1uNEA7PJeWk;`y&|gw4X?hQdAS1)RqgxDB zkqLo-z#b)6Bn@ErGX87{5bIfI=K?lov23}V6%FUD5*LN4aY2=SvExkENeRG_@1a>S zVz2aLWS|Ychci4?_!(l7v!ZKN>AM^^&rHg}Le6O9y%iiiQqI(+P_c zaZ0+!?_meCZ|Gd-=eXbQ5ZM?rJ2uj~zGS!rCB4xoYZp6mWMBT4Fp-+)yHN7wm2%^uZ;K^5H7N!6Do{H3jOX0C`>fBfZ*m=JVNq0-Y zT$Q5y9)d%d;E7v5D-poEiV7~shBRu;Dl8giS4o?SR5^EJI!N-v&RAyNXAJsa&q}{$ zMQh9npAeBjrrK>P1u8p;EV4)-i$GUZ8@kfmDq(lPpo7~fj3piGgyW7K0`qk4HKmU~x$`>N!%MxelMddH=QI3a%5aiQ`?`23Nr0 z<8qmn2n}rPZ8QS^JG+#uR#`k67b7j1?6XwT^q88Z>VM{gX-FHVKPkBb5q_K=t(>UZ zg=KVTnDb#2@gR>k4m_t#*+dEw)ybqH>l6>54Z7JXRY0rK9w`r7TIY*m_eUg7Ssf~? zTr69R?=*G7r2lq~pzO}Ua7`0s5xcPk4JG3-GB9csGASmnGPK-ik>-E#T<#Ky^x0w0 z7fe42Zl4zC{(e(P?8<6QaOLn4T~3r8VqgfK@e=|UHb#tS_5txn0HQM`yLlB>&fiF_ zE0$=o!XqXC+L2V8WsZ7q)&6?H$dgeSn?}rbuuQ)-+cKGmwMpa z1v8eR?U#rAT=w4~3P5yt&>$u;e?VQSTqV2LSd}6HD#^^SaIEvFwXTNSbi0P(SHot| z^PND)+b?}|V!47QxkO(m(^YIp;BB{YTOq zY`Ukb(CY|M4WedFaFP?tEP!eLZ>1Ge8(=A*u{ONSC6C?4Iz6{b$V~VWay;gJU2E+?#_iQeYCugwq*DPXMy=L-1X8_hfxw0wIS&>%C7u}x8$?RGn7>ka| zNjY81jqM>;41gMT-t^{D4Ir2heU^frv*8=f@#DR*n&mt*0`8@d8Dkh?`JsciK%(V$ zr)W+1@J2rw0DQi3kA&Oc)xgQ^ZGU!e_|v@$3(rm9%iC0Jx)5K}Y`2s9qkNGC6Wd?# z2HqE?BCBSZyzIS}x7~_a??kjy>PLd3GhTpR3(eNfov7S65WB7LoTQ(KMlIQhi1p5# z93SQF!d{0v)K%*@6)MQRYh=LJS1Fc*BwD`#_WFfDSTAk9R)ifv>~fS3v}3 z83NFXk$AU5Zm+XX6^i|i;iI#0NaMw060MJYZY|C1xpS;%983Uwr=!;~p%0a!{vLe9 zrxm)j8gJD-wT5gX^(z99F8i4Ip$u5M`O8 zcWuNWOf{TgD*h$l7I7Yee zv@JS#H;9%+ykiU}$#82G@|FlGYah^Vq3a|Pf}uRbUZkZQ&S$S41gyEuU%vpBs40Rc zCMlQT=eIUwzKWPHrSSa}sP(-SddKC-$7x1kQ5m3=?eHh{cDX^WSb|}=hW0he;GOG} zLcx(`R5mJ_)rOH(uS{0>fbmP?rB)ZBNtG{IWon|5}38^{D3NyTjF;8K4$ca57? zU64}ik(U4cZ)0Z}97+$+))Q)kr$fw_U{$w!bGE{jtELe;YuZNZK!J0C-i=+PFF0+pNMlC+K;BpUA-yBtIuX^Ta9 z2*z`6G(bSd*+92T$+u;+DUOdSl1(*8&UfBP;+I8XH z=UN1Bp78c3w-NN|4y9^OOqg+m-d#{^J9o(Xnk$k17VzjOS}|zTV9eXp9!5XH674Eb zQ7CG|o8uZ0d|!6~ggkz}?X+-+mCw5)jf6Ze`E4q*4sVG>w+gYp;q(@v^uCumCOe+P zjP%&^Q!#TkrG*KaF6Z%}cce($NSnP4JTJ-0EjVxKe$o12YmHbeG;|SE0W-BgmgEY03@3lHSN`ATnEa$6 zEGx?TB~dh>$-SAS3%G(ndXYAeOGvtec$=pG1u#)aY&47=M+wfZs)w0||9Qgu9Xj4q z&soyWA#dJz?&!&|3uc=7{Y`G$-I`cLf$=mahRl^6#U~47tkYc2ElAFvq;}Jd+ZK8- z%M{zNrf?+eteUbT$8#KglQo^ zDly)TNS!S{#f6Q^Vvn~zY|zNeCF{H!n){~p$0EgvVYC{xO&^6_RbNDw6!34?8Ap^J zD%}76gcWjRbi3xb_hyP%SCZnB|Nb;c)Z%bVhgPr&Zqau*ceu2g|GIFBa<1Z35=dzh z^1az@X4hRl1p6F+*(~wwRULyy(2xq3QYN<_Y)-?z*RR?w7ri_r%qP3JK#X$dWMR#k zD^AvL0V>0SS|`$U#Gq6@mKD{ZjX&jFs@ZPJ>k!AUt;Q3a4;Ks&Z8R;|YRDH*<4%REdr z;V6AV1Gm3+Wp{DtR40gQ? zAi0zxDX!b0Y^zmTp@F;(nc|%L;nn{<;Sd*1MH_rceCD@WYRlYd^w>MJc#<8B_OFl0 zz;a&?Vw5w2aMCFa4R2IQ=;YeJa2}0*?)jkB7nf_?NNkW z3BC#M=u~rUS!gYB2|Fz$H75z1qpbLcf@q&kvwR|o;bLb)&l(}|(9=VFK8v*O0G1(7 z|01mA*CoyrG)WANwJSy-djHXqT{bT{r;LNaX$R=aRg>)2I;0r&=kg%N)KS2Ip9R@uKQ4!g)@gJJ)wNpDXW@Rywons>#Yt|~hIEumKs}_e$ar%wD z3R{O*m7PCN90egHVk4oCNm6ecgQ~iyhjXd!ZN?;ls_vYH!z5#f7x<>9qwCxya+>cQ zhrZ8ItZLm?EaVt!YnI3*P0Ujg60OcpvAo25B{z-T}WmW!ZMA@?5 z9UfGpKec9)Q?sVZn&Putu*YjRXY1wEi$Ig0or8CV3f!3%-d)d)y|@mPhVxGgQ!;NA z7L?$2Uu#dUNONR7R7*(E?UfN+3``sm?C)4@Wd^;)Ywk^}oAXlWvNQrv$n#E;AU>J+ zw+A4Slx>Mc8}603?7$j3&4}pS zx%ebI?M{JXqzvGsx$Waj5hfX+L}xslZ|7id?3fTVlsuA&CjifdWu+zPYTza0OqNGNz|h zouGE?X17;?Qrh2OPt_hxz)h%{;_|>Ga4~MwF=tU`Az;!3DH+9L#`VmVr2evVgTPOs zIpe+j^W7N{aNtRBAmW1po}XN9wO}R1stWs zl_BY1z7w^PTsaiPE=&D95vFWaWVm&I;0L{$2yo;2h{w>vMosyz8ZU#WP_)!V5VC8< zAn!&I4yIfXj#Jrqxbz1nw3pV#Xyh)sanNob3p8yTj25o23A!*wEjog}i>j543l-co zqA8$#3j{fze;rJbfx)$wv&m{ zh)ZI|y<3VJ@~u7Fb<=glF^&T~{9f4vh0avP&_E0pTc_C%XsGyYbc5pmi zRDM071}S%AkGWA>5zDsJ_OX8uGb9pLidJ%w{%##vU_d+3UO&qFVt`8s)V8Rp*P)|6 z9e(WrW1Ln|$(kT(n+$n6=oL8$hJ-AJTw-CMj~ykWdgLv|JcdTiJfrX1uO70*0}7p+ zJ?IlKslW3C*WE7Lqet zt6U+DO~a<#_{U{IR(N=nm>gBD$re>fG{Q$Xk zT*A#2VS@K*I_5&mSduvlm(eDhd-?KOsFXK_t2bh<_m3pa8W&x`W()rE)SZT2PWAI0 zK}bp+Q`@_U*)2tBww7>(#iq)MY`U4Y6;*%a$+AMXj>WAUx60!G1igkHp;6CvQs7*lR}d@_`scZZ{7|t7 zcWYa$XJY_8PqJKhK>loekJ?egmcpN$PHn8%_mqpj@d41i-vP25O_Cy(6Yr=+%YliK zE5^1H+`f|xpj`b;joN9?nKvOfC%O8P%CZ&JyxXA*SlVrcQMnJrS_lphf3W?v{li+U zHoN(y4fm1^bpA||J!b&+q&UhQTOI)oaDJyMuf6w&W0R# z^a>0Zx@mu6@2h+=!{j`>yAHYTC}G+(P@GZG=sPqO+s_CW_TPTNZ-lJ-ah@Npz+D{8_Vz=;J&$Ub0 z;e5A`K~yk&A_D1QsjOPas!H-;W`W)x8L49|bfnmA)gZ$xq6@Oo!UwYt))FZg#KY^%xDFRVD_up@K@`iScgurWyu%PYQu&=tIRmlJwso3xYa4{k?=+NyyHYEa zO-oLDRRd=k!}MlF1;Bd;xOsAuhUnI5`BaS`JcIspVBOG#)wYT5iERM0xHPP!!lm$t zZboOjIcP}*D+)vFzUBE?74USPX+hIcn6V)D-AQ68}~6#eT7eYwj{y)xUU25XbOj#dVcS`7a7DIFfp=)4qf}LvLAKz#rsF-4|k99=q zSk!G39kYAS$k+ruqRiiT11qUAVp(l}l5m^eCq4iI8y$1R$C_RKp3RU1u6F@v|F`uDR(%(M*l#g|lu~)J z-(%*%)nauQWvx!^Y^C3QMg*SuaJferBnUI|-AtRh#50@Upx=YJt_(qvdzNF<4xO0k z^JecBsr5MfhpRtLbv&Z(o7aX@^WSq8Gm^sV; zX^Q)lwbw(r{@1a373aXmNGYinIukYBV_R|qg1H+D+w&i*S5{ak>C_ZoK$pb_$ic@A z3M?GNY@lh2TPWWp2}S(_axVcFBlzzsx6B-C2o|?#6DM{tBjgj^)Q%Hyt}(mSg)+U?E{>sTh_`lU0W{KORvGGt|8Mp)wi?Jt(Dlf* zojN_s?ec_g`RXtqIVjk+WIk3uopg!bNQBq34xi;~>*7A-qK(NtIeE*&@4fP@|D6dZ@4F-Uu(=0zM+=f*+&YH$eGj#S^gpAHl|-FR;PkNV%wt^U9=` zQ2Gh%I7YE)vq(+o1+8}E|QOluF%fPJj80;^nKsh|64OEM-_)O zWo~Hd7&8}z+2S`3;W-1ot|V?SdH?*P*nF0HJ2RT(VK2qp102&+tphjK2`s~NIZ(2r zZucO;30KVkGyAie~w&N##$+)PLRa5q)Qms z#~pREu*FE6n!Y_39k>jDRZ#B>V95+;=_5ggI?pwghLlu8s?(I(O;EsZ@?Rz3VnA_v zobO?xYh;Yk?f_(LsbvZTp?s>E@&7!*8~~~iWm4)uyMkQZPy<7>{p3Fv-*H||bzZr( zvB8Wj4uQ=eT&?MCzd%|)d(`zGy$CX7q&DHXcmw|}H+2ATk*QYhL?vEgA{MS8<9PN& zlG!gb?4EtbjtMH|asJ}%`&?JF8MH%1uz7J>DCj9`m}8gyWx|9jxmtwwP$*ge4J!e&NP>=GRE7JHNrDWifrtqKh&b+3!ezp{o{xMtnnyYB zk1KUSx|PAGns3~}=)%?dWkm{-eX~&NP&F;t%0nGE@^N>PuQP{kNyxrbW0;m7|8W(H zk{opxud9U)iKki!1Ymb=x>BoG5C!6#ARp0P(3MiQus4GH)T(v0aQ4WtKXO+!f2*`E zTo|C)7(0&Q1)QM^^Hi7mG*4zIVRv5V{rzZE50M|?{&nFa|L?3|#BtJcufO~;!LZwQ zY_7SJMX=uTjth^eX`h*~j6b*`~3qCKA zxz)s3PB^LX6l~r3In0l~s@AHg-=er`TVu*^KB50?I4NzUybRZ(B9g~LcPU&Rqn_W- z1%?KyxD1yi0;Mc-RnkS6Kq^IL+emXN_yxY3L-k#eG^lvGPZ_-5*1dSgR}in z{GG}BaQ|A9e9HEfGw}9+%8jiO^MytarK?!RrRL@2@~J5a_e*^ZiTgd-_~|L`Dl3vT*8$r5-Qs}e{g7u$rwJX+!_RTpE58E)e_zG zDPa#C3wK;iVbI_Y3VQB%#a`Y_AmD1HAob}-g+8b4UZMFxi-11+8I)8--vuRdn~m~z zJXa%od_FO*x5WS22~eKs6d50{f~4v7-l6`P|4@T>ynvvt{VoFxkl_u3-G-a|KDwJ4 zywWy@6WK_d%RU&>RUvo-b+;(Xj=@3-HMNV#s-6bS9?P&+!}x)}DJ5+E=L!2+Sw+yy z?-htDFfX>uAjtSsJ^& znsc4tWzM;A)`X#@cc^EQxX>+Y2H<- z=IsG{!qhaa@$i%x_kWfG!M_2&x^3*D?Ddm^30^JDhnR*=P*f~wLote0tahh6!Wh0S zWmt2Mg$&p#P2%~c`@#NSkqtSJPfi&pq>}C;SNGZEp0>zE|9rA;PLqKV8VDVi!Sid9 z{Tb0(OJi_=C>q7&%RD!UKs4!d?tZWB6b25HM3s^jq7qo=$tIcXW`lnsw{ojB;ZOLF zB!`s0_ZnbECUj$`?R-8R+@weDC1=wwNWP1#6mAn9!sI~i#xuSr`lA)C&hCj`;NzU^ zW}qPM57*FbZ;wr~cy+R33H7)`+e*ivM5(HSSmB=!18Rc8vp2G!>(|~XRrZ2RPQQ+{ zmtXfS=9v6Vj;x3cjqKhoc7*EomXE2$jX}mhf&3*)$hcYP&O+Qn(-w2hVxccMo{z1j zR1uN#>xnM$ic1B*4(QU<=N+_rJ~_aL_tVM8cY9lhjk=sy1MlNN2=65|TobK{Nxm7? z`+LD|bs#jg7bySub!j94&n0ecPDe-MU)NFyWpUp}PWfZQLfa#WeK1|)*xR!e!V4gK z!EumUrqUiWX;TwdwYDQ=XWzn%t$krvSo>3Bh1=yvlp{_T|Izi|vN2uopsIIGwo7fz|QP`PZzw zW4wE)XV~b}tAN`Qk`E9r%Kcou;4q9vjibHhQPRcyM{D_Nw%B1P+C;fEM$WR=!(kkw zRfS-|^1fm+KOwel0ElzH3ui5*J&RKTTnclonXdla4}73^}QYlzMq?Y$-u>mqPO z#Ci!`ngXw$W^`L>&UoStW1=>|RpOc}vaKh~tSHp09)QFV%yfuoil2JdfP+v6W$4#U zN2fW9-;wZ%>4*N%#u&0V^tqsGkG%BCtK&erWjH}?jr$E-D%c7u>CkZv9!@kA-94<4qc2LCj9XM(x$QdP@=PUR91|3k7tExd0dBHS+$bd??}Fb zV~wb2S-*j|^@L$zXKaVk7#^e+-jl49Wli&z8OYpolK#kOgU`0G^`U?L6llJa{A}+Jb73?t9kOyS&0Q@SLnX| zz~dv?f`Ta8Z^q%ni}~~}9XaTNss8I&D7t)$38`1i9^ao@O>(S^1u#%zKYDiG$gcb8 zN3X111^`u9)t=t@d%IdPXB~cEG7kYFWQ@Uv+pyA>65sm%E`iLrOg;?fLCnh~EiDgv zn;y6=te8~0Sg5KXXOnYTWyJKmFJbOy5k|_CRke2bSd{p60$Htn{tjldA3SBnS9b?H z3}IG6{abHKAIa2lC?1|TMVWrD3{-nEZWP*j=*-(+s3)rL_T33a1f8jFABGX4h=Adt zdh8A>X~k}OIAtWmtNh?s0G;(*t{A5lR|ph*R0*1yEFOK*Ez41$KVAc}|P z7FmCsL=iPD)V}65%!J+-{U>B;N%>jF$MeBDPN4r3G*LJ3+regW{w?CpB$Xys3*Xus z@J-^{?k1Gw>fQ%sQ>uxtO*%C>8-p4on8r1HFSE^Arw5x^jAg&V7-GBXz(oifoFJ!2 zDjW}NzqpzmzR5+(t04UzB3BtX^A1VZa}ouX`Yb;8*e^s+c!r_ocm?jrCdU>Z<%xC?Z{g2= zCk)r_>1B<-?phnHbnI@M$5%yhZfomE@Yx^AIhUPx&NqAmc7Gd83Z^V&eh38=TsoLc z^hKLaZGT{{`l3YviKak#vHoxP$uC)6eA&^CFSjwh3R}Cn7hxmB~f0$o-8k zlwJo&cP}O}!P1XMQS*^UW93!=85b7=2R^j>$w^y;MYg_ zv4I2ZX`7>sgBsY(34)??XBNx~$QC8DM8sygJOYgptHg8xPD$l({{@&|m!c^I4K%EH zVOkS>$?lM#W=wmKYz~?Wj9h#Pq(g1()aH$ zsNy+Ztk9WX)#mO}AMI3x+yp@Xo3qwuO~a9339Td-row$K4JU9%1uhGX&22UJEm)}Q z9NX%K8^tH@sJa3wdR8xaUo_*C zW66lDPacM!UdyR}qO(E#Wj1ijz;bcA=iNipXr%+5d<_!|X?^1>>%a1)e$|8Nf~yKm zO~V?|HYmje_~u$iWjtT3mBvUK-SY&+s)@S`HgRi+OFnm>gv+KB?R+%lMyv|>tKx{8 zY&P6yo1U)R&j^6woZfIoI$`-$pn^CT-B6d@0U(~I#pZYi0IKV=7;;V(B?Gdre-EEP z4XbbOp%Ps}7cxQPx(x5V+y1a|kkdXH?iA=7k`?sy+OpOe2fKQhf{4Rc@_C)%4w=Dp zZJt;wo)Cl<+NlcJeC+L8YeqH+2D^Hw8@*8n63X-Xh*%+qR(+)Azzvhn`ikSP4(ETT z)sQdnZ&BLnM@z_*Q$@PI2cWhy0xk;Fp~m!xZJxc!S!<56%I{NcLfPAU_*vU$RmMCW z;Z0Vlcs#+4hq}c+B=MZbl?H)HeR?geqwMQSPLWKK@^#JNKk`Ye&$`OKpPT7TzBCjl@!G!}pNDqD01P%(gLF!I zBXRkKAnlgNqZ{q1zuM1J$n~iIL)$NVgMSm9@aI?GHy0*J3qLlqQ{|fyTWWB!nO1N19v>Ykm6+3qiB**XYPOQp|eurKPJN7 zi*=N(J|Ygq)P;iz^a-B{&0S3I>uoO-w=g<`;N%{|3q$33_cf@LFAh6teva56`G01; zrBco_L4lSzmP%aUjcB1R`%P9$V>py|lRsHdVFQg^6T~Eu))rBaI^l5@QA@4m@}<&t zWmu?#rha7=vZz0{$MPb#Jr5(V2jP1Ke&4;b%S{cskD(mP)PZK@;z*p0pPoN(Y_B?V z7W}F!;$?H--dr5Eg851ynBHr#^@EyZEQsPkBWhzZ-hO>(*kL?p3lN`$mF4ZskM@L6``q}&EU7ztz^%P=$Mk(4l05iJcq(_v$99MvW(?8l64!>hSkb6Q2?;~(jLlS zGckh%ZV<*RNuP`U0*;IWOs#4Y4>+1lXx@LAywlfAB8{}nG0@G_ZOr|$h(Txb#)cs_ z8b)Gl>-rU0i1KCbFMP1g%$ME?)g0q$b0mDJ71vc*li00C$0poGL#F!q=^Bzqna`7G zwXR~Adj+#@;?>_}K-STHW!wjVHO`y+cG}*47T(O^nPg?Y8WpumLA>x!k1(Ph+N*XO zT0PNyUJ-9c&wu3p8B|i=8taqy(@SG^gWYfOKAnCnJia6L_ykD7PGTiA*P3u3A^3N38>BDHWONvq-6j4 zO4Bj;@;7Y`u*10|^=6BL>q^X@M+7MrD0S4fs+UyKJ8623zz`SQI5^F7T>A@;PMh7h zz$Ypq)BpyXA~lLMD*0o;%poL+R-0OQrkS)u$80XxAEjTESMiwpfL`K%aXnR<6;pR4A@y#!rX1!x>3@}O5)o_X|Ib+8FA z8^V~kTEX87WqJa%;^{n#NH`Q$jf^-s}*nF!W0(sKJ;nnI$j)jFGV0<30gfc`S41T`mDk&8r|bg^%U0*M)|K$LBX7;vl>P_i}XJvC!3tazCU z2Tho@69xuh_~i}!TIw`G*VfEk-vgH zn`KSuo*)Pf{8$#WNU~A9g3MsKA`ID8WK@p^K!;!?_i7RwZ@xR8Pv3>=0{?FQq~|sn z&A;+%YF{RxhGc2lL-3yXo5C0u?3J{wyT}!D2j{OLeS0+T)eXunCoMHMJ1bt`3d%97 zb8#VAP`AY>@lgah(W#$2gV_=41GAG^vW|_jg8Po4l6V#-ZWz@SsEaA7+uv@H{zrhedx4a%fFE6M zC%EH6bt}PCCJp>JWA81@AnhFuVEFjTPOX&I5tMzO3)05g8o*=WpK7s$^NAv#($oA} z&AqYuI^6T&mmQBLNJ@pu*K+9vU{ScqUl`N?^XbQYG>KWIko^NYhvKpU3e`9CD0{Jp z4TU@BIr7>-_+__WnW*y@o6&P)GYgSu8-&sG&HVEV5jkco08aQ6NDnrw#KqSNH-m}E zeeA9=?B0!g4d9f7p)412vylQ03fHEc?To#FfwU8jGpyvMTE4BM^9v#D#>(>=0Pn7?Fmf7iZ6X3aNoaA zs26qsac$RJUZ`zFnchM`*jm4NbQ7Q{vg;uJ4q(xn%fYTD0L=VdPI%!*vX=+DF3lnz z4g`m2sQV2T8ef?j(S|GSK`0l0cEJ%TcvhI0fV8E#lfrHpq%5cpj4?=+V}erzAfh9e z&{fQ|P+|$0DWT)A-qUaW``AfN|L|eO-G?g%3*%lrGQRpFs!1QS$k7VR9=j!<2pu(~ zkpYhB-tx?^V;Yq`vY?v$*IfNUM>JOXr5lym#b1pNb@auaR&v2F)80dnR14u&9G{~d zcDI3iWAw}|g-hJpvH0Pxzg*UR%~&E}`)?i_RSDN4sV2A!4x1Br z#XMSYsOHbrFbgJF2HTXRj(W!Prd;lsGbcdn2j)P%QOayCrbu@`rK%PFrPZ6q_AirdgxprZIl zgoVQi4(H{)F`={At<5Fn{pCT0XjR zjd%hhS}hPPSX1dO$Ly3=-{2H9nwUxtwh5`wWn4E-Esz5z%Z=#nJhw)u4NpCixT0FX zwM^x`5po~-23Fl5qTLkiA=+|G4D9Rdm`~;3TF**ag zo9lA#U%Niisz~OPwfT;u>gu^8E8(;Ex0cD`OIx>Cd`a5RiaofmT2uZBz;meS^I=cGxxHMrmR6-}$3{2Vr zMfDP?S|K8}9oJLPsSDFw~0Y>hzKv}@|T(jFN``#A*}7zF|g@5})VBW{K=*8|Re<;WcDQ?%H! zxM5NO`W?86@Zi(DL`;ftBBa#=Jw8TTm$O@yV7DHgw4O5QpWbwetF-S`(k-pIoZ0zW zWu21=WpCAk-kLLMx*@Tg(qWIge?up{kJEhgO2Ggk?m{-}#MOl{&nI&K_0d*APELuw zB$))6?)|WJFJf#ADRNLb8_eUFpVpr;3=l-cy`y;=x5Wy{`avu#frc{GMYyzTw3sUQ zH*dN#xJe}uEoPMbKc9r>1H)me!Qa02N6XB}QZ6&#k z=U@g8V*RojxjgJ8%Xe=U0z^4n{%ZKreen_X!ZGLG?e+xftHWzLVop3m;_CeF#zz8g zaqFXOu~9d!abJc`c}zUEe`Q;ByF<~T6wL}m_}&lBc2M&}TjzC?z1r#ycVNt|DbR3Q*5pcA*tS^SYW7q6>Ggu9d;d`i{~MS)Ao8zn%{~*(jo{~1+0|?IocA_p}qX>BfG>r;m^5*M6nj}QIPnw5%`$dDj5-Bc+}jjux2CQ(r91#6@Jv^s zBJf4e0WX^RvHW|OmyYZKtA7Znj!JQetE(wmx_cjXigdn_^v6S=P7}bij!atZz4RMq zn&pckj`vwTkZV3AYJ7-PopJ0$=U13CZ4XUb6}t>A3c!^j4qt;#_D}IH$%1v{2@xSadII0V#+_qjb$h>oC?J1|_A-Vi^d8!0t{(5GI z+<Z{%eIS}@xy_Pda$VIM+aoaIs;E??~Y>{{7B zJc~Y^Moh@6LI~7A^4v$VvQaF3{Tj+bWI0aR^4lUJb(jUq0WS-?Scgxq?6*)+aOX-|0!5%Oo)k`>N8gh~iBhtjy)A5C=Q;me4ndjX+{fA-O z#fYG&Q^|4yj60#S`2pfO0D$pr*?B1efRg${RNKH&RN=-F3;|UUpMlP6=ovJ#-}nkp z#jw}?z#=KpD}40AZ~vc)dwXgZ4bKgsn2+az}vO9ajlqd z{HLJ7`QeOehPNX823sMw+W*H1lra)>ytjVgtW2Yw49slz$3EAcBzg(b%#ib*+Uj)JHG#|^@|)j0ZZ6G!(8O_((pK& z!PAT|F_Em+efLH_AX*E0SNbJcbSmUrsZiS3|@$3ZmUCXMeB zjRKul(>+JnBdw5krnhgAko+l>>)ts3IGPP>G`E57Ju)6kS{Likw6t{W?!?JX7vC%W z`5Y)pLxh%QnIN5#@lhu5M6V~sU%em$-|U?HVvuu_+v{||r%a7Kya#ZUTq;^(i3%P} zTDY~s;Kj$kl#q)Z`9s~+xmlncIeJkreWIQ;2qK6VEL~yM%C|mNUIO?S1Sq$1%h7kV zABVgU22mcp!L;Uo5nKc@xPd-lWrY)^O|$bHTk1Uhvygwk^oldyl4qWc z#x80j<>&8`k+Yylk}mn#2hW^d&zw%a`G%KD#}gmhkq#z!%C8DRfb*0m64TJ&MKaL% z>qwgEI|U!Jx%};!m}Bx~eJ0(`E8QY%NeXfA*P9SNZ<5r{fwIsYmhlY^UCjsN3GgL-uC3U%F#w~LXKwWy&uk`au`{y zwj)r7l-RLyBbWi&dnD9oDWrU`+OsETAJ(M2ma^#9QQ=D zZCG+?(uz~DSwRIlAy8#BL=bQYEtS(--yT9#s|A`e&V%_Pf`_Zjt`c2L)}+R>@zE2rlgE3 zUnHXuYm0{%#GOsvQ-KbfwazXHBh(v-#xFmw8lEDxF<^a8l?9E98+$rLMgPY&rG7&-H_sAt(t|V{j8>MO5W4lw z-7}-mmzfz*H63k@K0T~~*J^4)c3#vFK;mN0m()F6&8wTh6D)qvWye*!8|&?Z4$C5! z|1~T_y7J4L!oV~WF5KSFu@e`T|KtIT8r+cv7kGkX=zqX6Dx=QnuToU8ALDJ_yJdewV4;HXqJ-x8Y_<%mG7@JeFN33?GE&GSyar+TJ9!_xHL^js$Aw2hTB-b zB~u0fts>BNIiR0CoI^R~2?SxCZIY6Q*9>1(_UL&Gb5$O;`0=9H2YE*M@n}(LEvT=- zz10O_PF4VfSLC8{hA?=gvI0v2%v}mG0<~S-gGDf$Y@J>-mW~k&MTF2X6$8d2I z8le*=3Geg|%P;U4W9${g*b4|;eDye(__5Vje8j(=PL!T=4w*neWp9J|O!&PEAJi0q zs=lXf?yH9EU*vP-vXY_Xm}0Pt(~aP8R*Zm_Ak%ZAQVxNVFOjc(I) z43sOl_Q|8x@=e+~8V*gI^ypv1erglis?dLe{?Rzt&rD`)m#KDP&0Fr+3%<#8n5IYB zR4XBKtT2Z5XSiCa<62h_*NTg!r(tM-Vg*OP+zwX5@?^8?4zO4pq{%4`ePqk5-Z?-7Occ?;Vmiba-Z_%3 zB_dc=UJnwR2|gcY-L8zCgRZI`O_S|?*RDD3O9&%VlcXMnq9Bi7MXw}vUK`s03lqxf z`*Lb3%3PnCX@G1onb5XSiuA9=6I5`OTuG8s@XnxmVP5UXCBI3A`WpoH|hy*f^JO=x#K7L<`A2q(zPKq3$)LqOn^s~e;t8<6D# zd`e)o9v-5jTFwa{#oq`9gORSkPeo?u_aHxwm*q)(W(vXX41*vQYP$IGqg7ED`&U!x zy_tcMFk!HfS9e-jz>6TA&v;xFZ({Ezw09*^RiIk3$HuLvp;Oq#7isZRi`OO>b`};TzNtQmo^@pzjSnuJDyB0!t)V z(~ERvxnlVm;|1ze8EPY9S9B;LTTc1)FXLXb4nap4IbXlEfWs&JyQN?MIEdlQ_X$5; zYDuY8e2H3Xw^&QF9b*O9^vDFDq>rD zq!%xfTjdW8sB$9R4(ubrCS?IXg|%@k85sr9E4jWe;*#b1F@551mPLt+6sDDz3~yx} z!e0|fX7I+Q8gbZ9{{&*rxTjPHq$y@RLu`gM2Q#oK%$^saQ0kMxI^sGXR#g@xEiP4Rl_5^;WyO43l<0 z@Kk;kZB#w!*SlG!b4ymty)|CDEl_g%8$18#W2%2}akm*rbZbhXJn^vu-@P2gld6Dlp z200X}@t%FpJ%eWQM>kk5CeC{Db0>gF+*cS*C@NF430-?-s=>@1gwquigi2|ktK2Yt zX}Mh2Q9tj=*xO0oH=z5Z$ig{YUpNUfCSoz|#E3sq#`oBQP3H|bdw_7o?1nq2HN=7W zy8QsgTov4uncwPuj<26!~k zW#jAxMf({#^toE0Bj)I3XN{LLCYYfkh~ojEDV}eHhX9X66r{RXy(!&f57=wle0}UR z6WQMM*!7{UtSxaB#K!vqKH0{p%_X$jVIm!<;Ri66AzQ}S*D9zTRq-wzu!XpDq|ChX z4HQYvPSWJager#>6~bn}YN|C+SmLz+rDQBVu>7 z-F?;OZDU!|q9Es_I7fsyJD}-e{0J`I8!@w+u3BZ*D@7)I=OtYj-`!>ZQO}Ez`QQz5 zTM?V-5p~KJYtgVtW>K;iW4dl;b5#}W3#JdImEVSCW|xBiyRo=0<7cZtdob^0)yBRo*TXP@4BNul}8j1iFB-po% zjmT162jB9M4tp=N?6=(#KB_1M_yyUcHo9RjXtpl@%%J_C(#BYzj1tf1e{pU`Az_k~ zd?2x2NO4Wl$kpm5ZKptwE!JTk$cv1^EGn(fE1uOX6rNQ;0HQ&@T8IKyJi;CErI|&l zi7~XgJT!tKW*z6t7d9KzyV+YGN)k$AsMI4jDTny4tL#`1{iy6u^0LV%4Fr@So=|YA zbHwJRw#?7_#BmQo7aS7gz1E?Xl~NvF84+IwYcn^+F{{iDikt6@rRirSP-hORPwA#y zt)G#cKKbGS&!E+rykj*!x(RWN{q1^9Z)K^H2*8D{M*1ZZo@%8dC3eY4-CG`@KQ?VX zDrCzF;>_e;NTY;E`84fcAqXhjjP-qkfH62?2%jF*aCiaQ4B^1r9*RXku_`Lc<4|3V zbKH*#hS(3DZ}!l?%CTsfBJMVKw50aC@IrEI@A2{RXD&Z}j3TK8RB;x=trRt`Ymh(7 zbi>G%?k~Oacm+j1@=Q`%ZG=g@vT7r(IG+L9PExlA&Ye8T5%y6K;)`bXXvk4j-*d3( z4$^|51jSV!KhR#S9T)=mXT=ToXCp8#>fH_nTMk+b?Z`Z;x4-24x{i^4nkH?OU(?De z%2Lk>7x`(B+YxgCsA>qp^?GnxSNHRj3jAPo5W+D9;{aD!8FbRA$E9m&4I7`&=fN6N z^wYupfHzq&#!*|vtJqj ze+q%}7|rilApv8RLj0$HgM^R$s8bGR*sR{8PKzJd3HbM%Ja{7&Fb{2oIqmolYo%GC z!is@&K>NV8R}LtDjM{y*3{^Xi$&4y+flp0Bz0AS|et`{Zx;QVMJw=r?7cEJ#y<2xF zANZd#c$U7;Xk$AFa`8|~o}?qt&;&i)8Rp#0wj>g{%FoLQx5bOz>1l zbJia;yC^jsAju-@BeJ7(He`-3fG3JX7;_t_n$Y_~($8>e6?ED&vto)XD|@AL23gI>{80A5Xf4 z7?3tyotM6b6AQvRKA5=nVfQ_JKX9{r z*mMDsTkBqjf=hS~=UzazR139`R9lvIDFdPyZi<&#`ivk(H@LW9^Zf*bu zq5*yW4fyonW-lk>*~R&rn^+)7+G5-Mv|9zg-3hg=UAD%?@qgMJ^V#oC zJ(1Q@2VB1z&vdMp$y^8oXc_ZP6YQb4g-z}kAnUJr;1TYSBkY69+Rr^0_}6WRcY?$L zl-?3b5qT+7TKO4^PpY@zp>2|fUyC-JO~g`DSaO(}0fVH8m~aTDL6I`yu5>&QubmCvp16Dj|N=liG@Vamzy8{D92%3xuz}Fn|&gnf*~JKnRgt z^KJXCz@V;@ZKv(xt%oAdD7q`~8fHxshe%zjsziZ}4!y`-PERj_MipCY{t+RN=1(Yf zIDS)43`LgAziAT}HK3_#*Rd^E(@D>;#l@@smq1R#y8#$s>F3Ks`I3oeJS%m_KE>8! zn1gp+vG$|Tm2=1eA|pEfP>)({f6??@TdDrl z&v|#?#VSfi*U#+44S-elzj_NI_;zzEkiZ~XSeZh6=&4`>;Qk!KAHk1uUq(OHU8VE8 za{kpzLp5$LZHULJ$cAdo$-&<75*&WGF$rwrr^?2c7Qz--OD&gx=;mKnw1B!O>aTQv z6Qs=ZCh9I&gd>!C?(eENh9CB@YQpWIzuWMp6c=iU9_!>{(_g+A2^tWb!$f((PK%^d#b7sHC4h;@fsd>oR2&cpTU1shw5?LL77mMI*;Scnl`7Ii2bl8i%2Q zwrToZBwHKofX2i2qI|9J2vql+aAbjBQGeHxA5;lawaO_t<%oHWJH)49^9i57v}l_~cI~-W;hf(d2_D{zhVi9-!Fl zxtywAyPfkmNlvy$)$raY{vr(!HT#B$5sYiWB6AkuF!~(G=+twe_f(*pln1%aSlZp^fs#~pl9J(KIz zX$k3@-*M=z4ZQg-5hMRAi^8ZY*@d$=jn^ym8sLk$sD>1@Zd1hV@3>Nhz;F_$jMr-$ zJkhZUJQwAXUZ}HkoYShss`R`5MCY948HJ(v__*K;dJ(nu4!u>bLMmJJA|4h5;!aN@K_|udt40D6hVb~FpOBJ>DR9BNU zKQLkcM{B_u{IkG3!x{m4^8uIN$(iM;%(Hh1b>I#IWon^`_qQzrSd-N6>C*7|qsq03 zD%O=6Q;UyjQ8{hUZ289{j8WhLn7nd~Sj?P^*soW#2G2AQhbw>735=0M_=j(^H&B=AL8>hW!i_Z;tyYqSqo*(&f+ytuMxAj1aWH>blwgLwZg;PaSNguLezf!sObCR zsS17yZJ1q`S6+vH6~cg{K^GrwYt0tcc_f6u8Wn5m0hn{Q`fFLal-l8XdHE{9>;BER z{9!TuN(z7scv45)(7c6y>9gcI})8G^OI$$8wH zThkae=3}m3p1p{Hpr`uR2B{{C{}OXO&|NKqYUI5!0dD_YmP5rGA?i&3sA+u6lvUu8 zAw8;MYgmw9P+)4#C2c+Rof~b&M*#DRKC?Gc%d45y(R>CBX=gzwu?riSo`UC?Olqlh zK|agrFVjN5tX* zx2wGh{QC;mPTat1ffY#fyCz+wgS*t?>a>SA-3bt3;53H|UM$89YI4?n{2e>uqP-dA zQ9rC|q?{*v0K@&x9Re+a`B${V=Ai#x`;H#4Hcg#73`}P0*cX_aVlf;hb&+7^{r|Fc z@3Pl|PSn-|VPyD;3p>5yA2Uq9!6h98@8`b*?hZ$r2JFpSx55YE$9VDX=LSrJSgF~T zIt?_ayC_nSk7(Y!C*Eii85de$S$?Wz;Vk6YmcCLSC{-%H*?V|xZ}-_3p5o;&uxMKJ zK+|=4_WvohuU7G>Zc2Z~)s!QapKNaEpu(H-EsPzwBc2-8@h;E_X~F}1$e?CCu3 z!`o#H;$4S(hx6bdx36G~0K%0y=i~EN&|HCsGxb()?S zoC`qS7WhvY8Lbnk!IcCa5=K^a)gLjzG0VmZNqQ7eEt8^5 z$~Q}jLdh2I;!ds&6Fo|&J1z%5H^+sL%k~Br4B7rIF{+gcN$lqWz5W`Pl`R<;-a7u= zhOG0q(!ZfqQ-j@Q#?PGBCVR=o|37AS6a=-; zIJTMRyR|!YUPq2!1g5M<39lum42+}{X~tuAB-OE)z-@uBO&;#R>fH;!U~W8S=+eZyo_e)jrtQT2o|;OMP($R#^{C2pPM5oTs-skyG9pXP zsT07qyZ(*2B3E$iRUF?0=j*j@LTmhzs8&s2*3=|(7IW5_{!fpauzDi^XArle=|T;! zmeYz2-fsjvlspfGj?fZXC^$&J>H_`bF!A~p^qNShBb4PO3V`5Z*&m_5vdeIja;8-F zikvFvZ7^n>0y6TQ>&|dW1dBPea*+Q%dUsZR{guFfF~Wh0dbl5tX1YeePA=Qn8j4zh z2i0J;(0;hAWSe_^vI)2JUAnL$xdt(Z-)?9{hs~z=oMPV zL_$^K``KvLoNOF22d?Lmik+9>^W3LydwE18Oq;;ber7X9pZhEl>I^dzX)Ou|6UKD} z@0ygbFgBsS7G`U|`X@vkn_>oXV*1*F!&vLFyF?0D7X^A_M*fYAv#X7$KKF`xHDvo2 z-0;9$AZ(x!YJ}C<7xSQLX69DrZRQ$K5E}+lGzjvOjhNi^7s(g&8z)_P)P8}o>F zs$u|yO}@j(^zsM>98PxXoV10ES>3fA)M%ZG2-1kDLJ#1qvB;tzeZ(FuJ^4I~yiF;@ zHSv^72X8UFC7L*!WDX!fmp0HCbSERv9m&_uSA(PBqqtSGPy29Ibl^Bts*mB7RNp2( zcCGB-ay%NfKz5KlAtD-(Vy#S{oz%(x0>PLt0}Myd3aPT;0A25+`s3+ED%~Z$_!%Qe z^1b6W&Y3*x#eYF~am#iovf8hIYjixB@aeX;wr2{EIC=Fd;*YZ@kQ~~g2z&aB za(n|?G)3d27eHN~)MefP&oy^C9_MM3U_P9$QG4%f9*zu0%~C#upwy(ik=T}X%=sL& z=@VSn86E+?@HGL0(5GE$0#=0b{@}pz0M3J2gjDY8{5B3bO*yd1fjP`i8Vi#(+$lI@ zd|K3v?@*IyZ14*>O!+P9IZj+R|JD@j(=|d~!bjLu1hyy|#g;!bfaubJNA&fCp-Npz-Jtyc0I#zNdcOt?ydCKI zCrb7z*9G)w`eCfJ_CfXS2mT|?vg|r!r8xuVHcq_)4zQ`SENwaY6|%d4)=f#7Lae+_ zI+5|FVR7t=8`!7h+01|(M;I0!m1fUcvBeW-61US83V@~U_6DlL297sR1W6#i*wPMA z=N9XC@RSf+f5;ih|7@CL9}4{v?Pi4w-7x^nm&q^8r0oY%UP*<6M&^+j0mx3uqoej+ zue!k_{~2M;P}_7*A- zE*g5re|$D|h}XK!vS(re?dgPOVTq~Yz*Jhtsl?G&k>c)lE+~oFO&;kK6h)>)(nD_Y z0y;JBg61ff*>$#{MMRAn&h2;j6;eR#5yS-tg-RgMH zv4k!8>U5 zWB5e2Y{zKmBbQQ#1k$jiub=Xq9{Mim31RbJcTabk%UJYTfT(u3tLyXp9*ip01?w)D zP`M*ns#=d=SG{FYSTSe;=s%jgE{$QJ5*qA>_uVruvc23_38)XMYrv}RS3`vbEHkRM zb(aVxts3}uJbv+>`~nh`yZOx!D*_(tRPR#Fv?@7~zLDSyA08LS0$E`ly!o6@P<^TU zZHC~8q>)v)8*eSF`Mtp%>s-eyEC-By;p;uNWr5B4ylY{I9i(vs*_yYW_i0xDoam1Q zxT0w#W5FPeiLfMO@|nF^;%#?|Nx)&h=NG4F(9ryP3&%!krRo~L3?UJ7TfxNenE<+2 zHF|H2K#-x`RwFAsTuA!%7l7T=;R&tqpwd?OnI?I8gb_@1C_~N?!d~;}XuYv*2PI9? zl7VG%C7DLF)GFG!dQ7=jFXHWGu_$ic`4jTPQFVNmXLa*lcP{29W~M^go~`SC8<*~# z`D%c?+$!Zc@IP_)vw%=wO!RZLJkv+S=q4uv=#Ro8!d7u>Tb3G;f`z6tKs@IGm*aSb zky9r3ZxibMfzleO2V(RZCWh+(x!DzDhJv}?8d8t7AdffnF%SOvw#{Z|Cyss(0C3Z3 z=ut)~O9X!nnl6=Ua{Q`H1$QwfM^X6xJkhjrt*RVR`9u5nicRYRyc2p zKJHTDWjRuvr`OuN`-qYJK_E(^36GaPHb{AukMzmpQwRi|O>GD2K}x!bxr)N-jraTJ zju+@u#SkBsc?`Zl2Ybm-y>`;noAzqY&vTEsSlj*_<{~$Qg`kEeCrgQ{D}(K3TTQml zvc|vcScp-D5;bQ99uToSihxq4R9h?bLkVhsj=^Fj4Ro$yk z8I+;@w=R&XH_wOb`UTfNq_)`|D`C%KSC1*YNMAu!;OT&2KXNso2%g|!r<8t7(cxl4 z7SM4iWD;G+e9u#Ul6frqvYp3TA7RHXqFj#okP*XBij~<9?t`D`L!_j>MXAsM*cO@MM8|BaU7TL^@{9kbs@c|Bo5qQkkdTaZ_;QXM7d1l z4TjyP67;LE>?b}6i@n%zI?d6Z1_B+W7Ep-nkJ;jE6P9R9H#L+b9P*5nmvP zT?a->_2YS^ZkZx=L_NDA_&k@gk5&&e-udYVTVgg;;21|i^e^Ycr~zx5T+12)2Sb0t z`l}xE*8@k!8&Tamcxc3TU3){q%Ty*O-71BSe0V)}ln06xF;n3$P=ex9*Yt2fKQ&*a)O|?C|DrIR0Nk0HqTzwI<_H3B$Wzie$$8!mP_y7 z8N1y`O_8Kdxdg%gqTIZA5)^q2XRy+R(jmJ+&Tqwmc>pa36i^-Sw=kB1A}Q0p%-0pI zQFWiY7Mbvc?UE2-ScDe2@#>b9T$w-%!DBbwR7(#aG;0Kcv8Aw$61e{Nz7)pFNUg-{ z990D?>0Le{qFz_Az^Y(Lisgr`1_Bh27e(uDA3#Dv>ok8%Hf@pU_t!(2vBcGYzyt_2 zLxhO@V*w|f%0;mrcyz+<)sN`g$f;Xg+qzwQ@ZEKnB|%EFin&k(R;fO~j1sJO{L1&f z{{Iv3g|X>CNg)nv=8UT~03$ppP0{D8Nawtg!ZwC|_IYY}&D|A@#WX%Vw?WW0zJJ*A;$Sz8~T!lEFD>fHRhan&2$P#0Ncx zMFK%;Bt2G_Upp2c0^j_deqc8kX<$gZsHQuk=^KLuCsE{^sHXrcrDM@ODFf%7n6X^t zZF68Jf&py+yGsw8+<}=!p+M}l_mRn^uhgM$u^aA(DSU*4Z&4J0jlX;#k7okiQwGAj z{+~Y}lX#6R<%(i(1H<6DW>@(!h3sQ*V z`{{*@xI$P|P5)pu;5QGKPm$?sVNe7{`UZ+pUh4hGYB8;HSqkvd{()jgKON+R{`Ab# z4q9Kyu(7Uzs%nkP`TCA!;KQNjgIxj@I0F|U9^*GJ@Y7SKWDh2e={FQQl=HIUp4=Du zCh^v8LkE;^N+Cd8sEP!P#zR<~x_sk5BVO{dRlR3|2f?eC3{}`Gl%cK`_ddy5$wqmF zU>>><5M5qTPnG5h#NhF!uE|>PhBvr^Mk~*Vebu5Mb6}N6YFQR;y=ZlccR*6?Jybt4Usjb*gQU7*tn6vK3!#Lx0UG(Zae9ecAkT}YGZ_A$)wn9e zh%G*%MKTt-XST`zkmAh0x(Xn(^b@ig_Pv~V-to~)bqQfT*q^WShT+5)t3_O~CGcDv zF?zQOO^#t8p$B|&pjDFUhk)~zv+$Mw=YwKy~a46BnQCv^Ug_eN7+)5`OL0Twdj zOGMNJFT1PHs&vGpvSpY3)JO^D@kQ5mgDu=^4olTW>xUv92IndjJy|YBj}radq&dN# zhnQXcG-AxsZ~5`NUW*m5Bbt-A*1k8ooeH?~>M%Ms`#JF+qvRMkf=nE4?*FqQU*nX7 zg#xUdSg|$o{-HJ!uK3jyub^K?rMS>&K<=&QTAJL=xw}DdjaKW<0lyK^_X;2r3|Tpq zU`{0sO9`t?)X-XC$K6xRgs^_@p&Tl9e6Iq^gPG5Vo|fFz84AwSQu~aVAQc(|&ybbV zyl)o`95clnI;dyuu!H&aFz6~W%iB(UO%6Fh|AZjWK-5i^N}7aB7tVS@HZb8%0Ci49 z0J`5x03n6fX*BA<(My*dCh#odgNq?AGP1OTff<3<9uAaF^4v*|nziU6Q-SK0&_tQE((E+YdiHtvjMYH`z*yck zTr?S6?qp-ltM>iCp^9v-ghA63g42MB1jF(P%5#ss8u-t`B%f-k9k_4N;*fXihdIXc z+hrF}KeYGI;I+7J>jqkz0)_;2{xLB_-w)k+HCE5MqNS|Bk7-jhAu-GqSuszb&PGu; zr&V*!8g#Fr0k!aQZ!vuag&xOx{+k+Y4wwk2RVo}pbXL`am4LC}A(ZK2KC5oEHcA0Q1-IYT;=dD8t#`us`^@A-#Zyab#kytJ0R`Hhv{ zAj6rHNipAB{HB<)ESD#~2{HrvG zc8nxQykY_3VF@_<$Mt3F4UzHIXZ%vB_Ci1x2^P*5T*^5V+c@)k!U`PUfA7O1yqu<{`;nHXS%udI2WN zV?IcKM-gVr)ZL=dWX|cXM7LI_91wuj;YcE;aZ13^X8=aME_JtA_ZE2iJB6RSfmCUL z^!*$U%t!zUK=!{C0NuXPE7T!cqfIL#a%=iKUFKkFsJrS)ZWN;LwHD#^!<}!KJ+ZS`dbj3ieh&|{ea;(;5q3`}9tTHj9Umg|T znR+1*=`k{W5${|3%_G$0CzV!rzqAgGUF}!G_W%Lu%l(t{( z?{5RGAFFhcWPbs2f=w&aA8Li=(s`Of5RDr-c!{5(ykbA*glv%Bt2c74lyP1SS9eO{ z_AP~u400u$<`{|T>hKHDSmA|8>#`*|uI*@EwsH9^p6~pauRZH8JWqVSvp9WYuKne? z!F~HV3b9SIi!a^6Eta}9^~t%Fhp!TJ_Q&-}%o7~!w4Kqm5m4I0CYU{wb+#&I1R}8G zWQE@i!{mi~qnp1QJ)+5F*hf(=CUB<|PpV99-?|LZtE9{tBSi@)Gw?H7f2xT5`HuM?Mlj^P3Uz*!7@qBwDyR%a^;y=hxNbGg1P9ZF zWoMLzf51e(uEXR?l~gz?E=TtwCRhJkbzrF;sz&+zXchyXEz?+@isEq7jU9H6K~p8R zRd+Zk8R>=BF{W!kBdgU}AqYvPzH`TvKXCKwcE74VA-9v~PmlNkS!0WBKe&P;Oa(e! zJg71I{2gp@YniPIo5B+ELE!10K{WLK%P#DYrr7nhSbf7{68R{|jpkLw4tvaKo}v2} zAMP#K=G{U{mlzg~D;8$rcU^J)Mw0DmpvAz40KMoZRjL3y(P#y46bb^)8I>N2g)UOo zuucs()rKRPX0XIn%7tcZ&x6e(dkt?Pa#L1A6q_j{cMvNW7X8sjZ*t9c%>Z>b!6lCQ`kfaB+ zZlOTvhieo_7nWOEh5!&Z3jr&u#D{|;_uD;i8&G%X{STpYz64!Q5}v1Jt$JE1HOf~6 z2n8>^aM;IXkscPRi$NpvwA&O=PEc9u;k z0giYGG{~*18MQ(XP2>f-*&Hb4&ni=!*Rg{KMXw`(0&=<@7+FP!tDsG97Pe3($=Vgf z*xCxttx_fGC4+RKYfS#bs1LLwtj}zSiucnyD?vYgF0Hj6b*r~{w7xF9 z6`D0%^A5oVABk_^m=f{G{tu2gYcbIO@_^_SVCCFVMr6ag`n^O6c@In{=6uac{|uT}tHyp%!a)aqzr^3rc*xM@f=r!w&MuB%X}~kdTLe-B>2YtfL8dyLiH;omA2Hm(S-lp;RLO_b(!<0CKO!! zh8)c9JP;2{S&sThq-$t)c6sC$_&EKJ=U-bLpkRW4i+UTh&k%PjPA(&~x1Hro69>aihL%g z+FkUP*|_LBel+%hmmrz1==m-JN7CYc1E?@Z&vpcgsIp60+A6(XiS#%Fz(LR7`c}S` z+JS*Zq*^>D6f6`6BUP);`tKlF! z1!=jg0>8>TBNBzblXj3P%Wns_ zZsKf~x@5328v6E?_StFum#n3q)-u(3^#zcF^gjEeXb{aEi4X=_n%3|;yoOo;>?#YL znABsS$7mc$AZIBx5Z@PI#F6Kuf8>Z&0#S}2hm33nXmLLgNDR56r4&kK+w2(+ytKA5 zGN>2|Apq;Zc+~_ypdakJt?0hT{rFfC`b2za)BRdv$aEk<1R9Is-Hm?FCh{C}8um&6 zeXF&f;b(GqpY+o~1QlHB2uh9pmYd5~Q9nlgUQ9h_m7zEuh-Jk)N94&+Hd;42E><%j zGQ zRtT`*f$xKB`@Rqm4>XCcd`$g%&!suEK$yJw8t}$RL$XtT{}za0R4xVd`f?b}QDN?fNw;kG0>EJe+U_?_+YQ6XVL=EO;YVn8xB++d293Az zLuuXtWf08)ZlKg14c*1+ssUMpo5XeuX*o@)c{XbMBOxT!EKJnXsB)M`{rev+3%YWU z6ct!4BHE&Np7%p>NjXzzE!`RY4_A##5?dSn)FeVeo-jf5BS)Ij5P-hiXaluIsYdGB zT6qm^wj?S{yGh|i+@q`@#C+vx!ytmcDrB6`7uXAb3}^-3h4yY>oWBg7XT#rSS$Q3P zFu#bse_C)tcALL`<8UfxL#VdMgM6d9$BqoP7T2NEClaR*vD|aeia(_wdS7g zdqCY3q?JcAP|7r&-Qlla?iF6V9O+~%V6f_(RWBqF9M33|@#u}S1x~R#NIiOiH*i{N z#SDLr&H+VZpR9_HxeM4W{Gi1PzaoQCW&L8(;(4#zP?Lb!uh3*pDu_pbrxZrpCu2H! z*)=JF^A+^DpUdiN58$i8G9%A5is>ueX0n*lw+MIBPZ@|@5&w8$QpZK|tmC0P2Z$VI z^pvapU`xdi+gALO&)7xjMoF`xZnY=%`Rs76(!hhYtshi!86HqdhN>Mzc(X+^Z}M#7 z)ZqA~MHulFFno(bPUpt6#hJ=}OG!CGg40y{>@NSwy5z4Mr?78NpZOXwaNgrN7Td(1 zuU;r~${{Y;y7ofw(a9|7(Ue1)f#}+b23ps<{BTUC%XVx}E)uZIsUI)L)9ONa=BDiz zaFAzM^;7O@nAFU0L*p~`gsO5y+w=7gnt%cAwNXy!Nk|sP7WVmVrH0EXM{)@|l!GvM_`}dRj5EHFjK@ zo8S&*1!}vr$~eeLKCRXdKov-ou4`gklNXV|EJE9!9(a1OhvIctz8Rpl4>X}XIoMBc zK(Dsd(O8@l^CF8^eylTneTf2qk%}`V``p=hH|d?=I0CDAF@ohOWcH*D-fgCs`+>Gp zR~pjIv0zaWn}{ARgqoihwP2iDPC7L0-IT)pnP1D!ad+z=&SJ?-Tx3_K1KUdM3frvH_{K2PFXnZp(tVS~FG7uwbH5Qt2yerLD#! zoefX>1?j&GG%uMH+{G zINg9kd#A6~RIO~-dPh^=oRJe~!I>p^yiD_AocDw5E8Qd7K*8Y-aPfg}iCM#qO6<7{O%D?sw@e{Pvdl^RHK2zmTcQB|BS*E_GJi;%my zQp!NJSzLntueBTXTb{=*?&i1t7x)l(8cHmMIomIs=SW2$)Infz=Yzk?P{Y3nwALWdMM>ZqhG}pLtD|wf0CDsxMxPM zDx~glvWkDs$brfb7b%Nu^6TS8#`j-pxKM6;9N@STxnTTp+YOw^^@Wj23%$Pm!mO~M zQ){jU=mbd~a0`uWrsibv7iXGhZaMy(&3o_ZEqx&bqwN;Vz?Uiu0@r4|?#}p`>-#}| z-E5)xkG+v471YSR_6_%^->Ha1L=h@|CvuqmlV0#a5RlL<{Jy4;!cI^o8peHWJw%}F ze(z=Hy5`GDX)$l1DviKB>%E9tI?x|#a|a`BjTTS|M>*!kp4>OABTQT9ROP1CtRBTj|;evH0X~6wOVu_?-gJ% z?hODoJD5@MKq)1CI{-^hB8gCsN-zau=Q*X;(E=B(X^&uldX}e7OFi_QSa$D8q3BYA zYYR|k-~-CXa2eX~@982!Q=UD86cr2gbLWLV1`rwpiWX&?e^2|j{4Z&``@My{-Bl~X^7 zbi2sy4RT>i96&PJJoetSR4eb-YQ(e6XvvSsmFD1cRP2wY(0rjMjG^H}Kq~%`oPeY) z*z@huPg-P$^M5Qsjk>|(8-E^IU&o;FE5Ys@pxR zELzed$iO?E->S|dGP9-Y@IB9NDCgIS!4hrK`@I;w?B;$sPy3zaUf3u4URc$_vQ+W_ z0qBkB;e-a~^bdL-#;_odSI1VR*Bdn4_YgRP*V6nGZflq?eK2kZ9~!+}CsLZsAm23v zR^zPj(ZucjVo&$Hi{d&%y5^TxK_9I(Ei?fCJNW;rgFG>~7yq?Yw5p!nIPVCJ?zuE% zzTT;j%blMvP>4&crIg6OG`;tEPREp8o*Vb}G{b56XOBdw@1rm*zm!uMV^>SISv%aD zWax~yw?-X~_Frx!-U9r^Ac)RdB9ff#KxU#@gxMp zC?#V&Gq*TRP3^SUTn*Hj*_g;%c_NeG-1$I?pZ6seIWX30JpaW7X2R0|!(yBdvuGF7 zv=ZEgnML!GhVtO>k>{(oj97{)69!+TBAzL`iRJ{_)dH!RDlPA(2Hm*i=CE5P-H}I@ z<`-&FDHZ*&;?U4mZm9K}WY=CJPjwxe2Qs)nBVn5 zqzo6Yw@7mA_1FaYV7GytI7p03y_x5XwHA9RXnZQ*{Ugy=D)+RS3uS1nUZXcB-5kqn z4+xX1rmE&f2ZTDLu{}SM^zy25VFkDgWXOB~k^X5yFfJC<2e*jl-}k~={?qt(qOd@e za28JiQw{!Pz2Zcd5o8<<$uobKBmTv+ybK^gvxyG;+qb`H`vuo`kARE6?fP4aPkc^ylm zcB!`wG4#Ci;^y}4sA(@cG4F=Tb7r<01`&gA}M75!Q(W;vYpZyQhaPYBuPgh&-83k zS|TQPi*ny})kq@^nt)1o9@Q%AM*D#41e$^wb<7jZcntS}&=2)O8Sw~q#^_I(EAHh8 zIHWe!?N>rMPm`43T15$IU`Y zm7X>e5GO(*Z3!R6%L0+wav4>Ph{aG=fP(8GNCXeYzais}T^+5IM~JMwVtNeq2Ks7$qW2 zFzS`7#?G)6%?xdM%5BiztZUcM(s~rp%tEMEzK)fGl-Y3|_Ms{AXG4bB)BaPjPWs0C zI{E5WezGZ`X{3(=wo&1MyxEikvTptvq`MMn(xzMOi&%nM4NL-p&G?e8ewE1J?cJOG zf!rn0jg~I!>7Y-`>2HVP(}cfjRF1_R06R0(HP zvF&SlftKXt%XjZe#Sl^fEKlSBQ{KB;dbdTZ%pW!=oGX_GQOi%wj1EfOJjx>Yt@T+z zA@~QAcB;8T)i5IZeOOVstow3PnJeOX9;cdHH^-n`N*2I*{k0_!vlVwMeSm+g{{6Z2 zg8Wet1f1?z8mr*;8={BFz1N2`9@_Lz9IeDO6Hrss4+j3fIn?@wC&Q zn)fUi@C!>39Agl3j*!HGYb8X#`cZhX27fW*F_egxX&c|v;X1dko?Ag&)P_2NC;Z{_ z>j;gVS{$ctGUD|1QSo~U;uU4;WzE)b>9mvZnjVZU&>=$OFyR1FH0y(za!W70+UMnG z(*=}W1;w;Ia9e^$TfSBg{jB&$ezFx=zr6nxk zsZ2Zj`WYPgAQ!3Rj?=8K@r+Z?%`G^)Z)cE}$R($6rDr|`lwIP)rk%v3&Fg^Ew#D?F zb3)!8RPNTLZGVYtwEH>{e4?9mvFy_O;mXsWKc?BX-eo(1dnbzIYL%7uORHRJKzWeQ zK#HhchF2|)3&EG*Q)CxjnH7;(dlz942*+)rq{AIHGZFQ!4Ly!vbeb!$oLvboE9(k{ zD6%waEml=7!5x*$cPR27K-ejk>QP}Cve4OuyDJn!nIih3JE?eh>5bin0vw;TOJOGh ztYZzohm;=)KL>?cE}wDlL(M6CXeO%6o(8)LBC^x5IV_E|hLwO|?oQFkFU);0SQ7#~ zjOuC6B%vX50?^ax(X~{U#e3mIDu1Ip1^$ zXGgE5{Exr2^zer-_V0@e&)$1?(d`YS{*jTKGNuuZ((U}Z3&sT+M|M5zrN^1Tu}+2J zfAT2wVyg*Eo)5W2kS|b?ec5_x1t&?bGm**V9eaI?i|N=8xAi(OSDKV?q9Ba@i6up6 z+3H~iO;4{?qlgrcYv*x0EzFyCH#ET&6s-cBV{oPkWKrJ#uz>%^lwG(cb`at$XkDm; zj=6JX#xk;im<|L-$7<1rN!#Bakb=Qx?VPAn2k*jEGtT<`X?+PYp?QF0nsVA|^AYC~tR(nIW|Yi1nW z3~%2`ndi(5)_=HMl<(())s)0}E~!gFCoq)R8#J)n0{A)~)A@!_?u)s(vw0*6i8E2c zw>1dqTTv|5qY(8SLF5c#nlU3qnLl?Rqc5f`X$>N4cnJK$s)--(X3RqzAGw@koesGs zqqg6t>y3?hd#(-@bm5u&5#&jLJOA-9Lv4?rwKWeaZM<^~l=z-OA217jM&W;5Jj_(7 zpi1&vLac*@8K~!b^i*6qmf@~OKImhhWnC!O`#X946qZj$NsN%=p{kD5O98kqfQ%B| zBP(D2DdYMzePB0*5z8PSL7N(NwU!CH$J(-Gq&7}bD@jt7(ZBOKnUX8aMVClaVFg7; zMJCpr=Zt7BSD#ZKqWtp(b_cDcvL@@L>PB9*MyzR)u0SI(~zyAu?^*gEWO#I$Iq;Y2GSVfJ~{H-z=*+OXmvZB#^ z{JF(W+974Dt(B6>tU&?JL4ybwNE5S;U@16Mjggeo!ODs^4jZol#p>6k=euXaazt6X zSl_U-v9uv?eh`#5%wXN<6SfKz+U20 z(DMguy2Olt&?OCm7?lEe_wu>d2YH|nBqi$aJk2dpgwHW04kdsky`D>MU##WO4u|T9 z^3>5Ko%?@z>aT85+s6-9UsFXq9Jhh z%4ov6orV>xU?yn$y)FzBlqggd1&m+~S7Q*nS^x~ws7H3V{s`ZvWW`8jd}&@R*fC=? zD5GI}*$bScV&!cwST~jac}2@>2v@#rGQo*05Mt}JOx7K!5u*tEVSk2<-KzrD~$EpGz?C61?XALC2ka{yw$&W{p(UmSFkexdJPNpj!Z zSuBt-aTA0au(;_x>#FQqP`IRDAqby+w9FQZIGpTcLRmrmGHl@Do6QhsY<>XMs>yO^ zu3Ljq@!&vY^Bgu%HZj#7ad^_7QI<6uGM$@assh6jJ9}7*fR8S`nI&NVCyGxg6teiK zlFUk3*Zbnp6K|I`b6I-K2HK?ufN7aDusMee`D>oY`Q}zWrPI0xFq%lY*Hy0?|6*MM$ zzWip~$(faL+DN3$!TI7!-GfZ1bIzN@{y`kH<-o|C}>~n1lRmGVD92U_4ub zkzR*vGAZ&+V@(eZ&vJ=U*ZGh^9L9+Yyrls@L*%F(`ACAQn7?hykIb+^#fu>ru@NAs zCdmm6DM>{j6+aLO?HwLMJQWWY9?QxUFEtP*U1=HqUk{pjw|LjBwu>Y5W7J zzj1!JwKA-zTQz?N3F3qCxXOu4AZ0D{hyV*`&J6=j@+TMZGo+E8?#rJ!>_zwXzc2(G z3Ju@jQ3ppzMT7aRve&*K;RR@|=*?psDe`6cukjXbX@C#MPHIQc$UvMpNRaawZ4UB2 zl;~7Pm&+;AWqs1Yv}W_iy_-RJ5zX|I&0_bu;$7k+zmq4v?u~pTFc^QoYb7|aR@lKx zL59nTn&}t`x}V)cPZuUrXmYP+7~i9vGQg5w z>sJodqi{)mniy>r-{*uP9kB?r(_-U$LeBRCe4I@yWkNiqs0)cC~Lg^0qfM0~enJ3~^DwW{{5T>sUbW4bFKL3xz6HnqCZ5wIM$9bD7l6}R1;jz~ zXojUo@QGI}2L$Nt>Bo8?s)e0jrXVsxcs24J@jHU!9a?3ocv2<7OHhP$nLC`c#;-Vh z*BF$Uib8@9RUi#z8Xzob_jDw{N=UL~W#*oE==(@ln`A7V66VQ_AIgb>pKWHJ%R7|j z0*7$iOmJ>?5@G1M-QUu;pXt$KF5W)d0wMQ4V`^sVEaa$6Hn>BsY?5xZ8|at?QLfs; zE*f;PH=j4R*VVw^-|2v@$q@@_(lF?E5B~Jg=pdI!&NXMpv=Qtz`W7j`#{n|-BApcD z0>qny)A$cVTZ#n?7ABxQA25Kl+2}!0|8$+H&SyvjvT(GW0l-vkvlrl*<9V;;Lll^Z zndE+rvI0)*f)k@lM(Yo_^W{-B3=^$kvlLiF`6(urktLb>W&#QaF&(bY2|7_=cpNir zx4IKiu;p#X7d^SGM*n^TOLVvoqdZ!RS6 zeN5`!(}vt2vbPFR`>TpE?Wah9@LR8?l-8k${ekT;8Tdlg;)bPqiAAqLOQSJ4d1k1q zOrxbFR-Qy& z@-t2y4dzG2rEPWvLyX7Vk^|U>;QHz0O=M3A^e2oe$BGRM3?DZ6XQC)m#jI0yx82O) z*0m&79eDkSA7LE-Qz8wqN9-jB=;{Kw`@bX7?+0NA*dbt>JyY;j-n(jD$f@P6@|6$4 zIEoN9@IqIT6Xy%xF17|kBrfsWBMjlS#lG0p=P>O+56IkL{*|D;N3=qh_CMLVMAVze!|XCwYN)ye0WOi@vn>CEzr(+j;#~br-)jG0V2FyFG`926gk&DHljp?KmlcosRI|vzJqaLi+`|Gdsg>{BaRUwOWzLz ztsNSsm*SOR69OrSIjE12oA08t=M3MK742>E6e`-KLE|I30dYml%mU>Y5<18XyO)zf_K2r$PX za0k;oI&Jxu1V9zoUqihLe+t55zpgl9Q}D*2;m9ED34sF>Hg0?ONBe%c-_P z)&>Y2me6FC#L0O&;s8F0g8o}-phMZmMYf7HZbA{W<>7~0r_+6!&|dU_mAh1lpV&0r zpk&Gt74Z>E)A&dxT1EPBrkpeONNYcF$Kvk!jIv9*S1^4Vy8FxJ3FMJeRhR->f!V9( z1(mh2Yg_8P!_d}AkX@xZr_DB)R>FC(d{hAPRkI->=4#AOaH46IqvA4@8>;2Es%;=l z-T)qcAi-+$H8K9PB}x^GQ3*@CTFH@A7C7E_c%Y{4n#y=!7%sD}|3*>v4SO?8->Wtf zArLu+Pl63kiILVT70qnOXUU>aasj=bKId|N^SU)f82;WMj=jJE3V6WghHXM=%)B(A zcpda3nIa&L;ns+X9J&@dq19M6s`e+v|9x0R@e$ zU8jw0=v9hqR-HN%#Y1$q1Q-1Gc)F)!9TVXbdpN5oEaedbT0QO`9pHZy%{*MTqb3(X zNv7qv6FrVI&@Q6#npbfCL$;WkpF?0;BY|E;#A(!ira|`wrgA=|YhvKp@+ng1Pp6>= zmsuphYz4+jtobq;f(12bo&0VvEdGU-Mf7_lprsq|H%OWGP*eLn8-=mm%_?{GJtdw3 zIZSxWQb3RA^d5^{lQ9PF%S0?jJ}#@>thvfUOuQnM>azn7F`AAQUPT&-(yFdvC(?Yf zk;om@rG?buK~3vq%u+mQA!NTH1!OCy7ru%yQBKQ5JuqF+Go5b!5W+>2BS_jjNHAP( z+N)v|=x4ZU%YCotZK_^am3YeLGe1OxLd8wA{cR-Y^6W=^&FKs)yvrGMg0f{75`bDP zU%qpvtatj1%RSbi-E>!{ij=-}7qdL0cF&7rLxgiI8dRJ$@Sw%ppm-d3I^!xoSoM|uo`}oY)v_&;eyQpf(!Uov+qyC z4hZ|YkzN4Yj6IR@Zz^LqI~GQ@`3MoiF4GH<6&$XVph)k0v9^v%KvGQAZ;U1Q9O@~mrl};M#i<#V z8V!d6Ay5-;?9Ce0e?R3nLPB&qeY&2c@tX0@O;UJb5s?Gr|9@MlwB=u!=E(;d-Vqy% zJp3}N;wwRm9U5brjsa9nYuDUOg@K8&fU1La$ZNZPIcTSghe73wn%E!QK41~LY65kI zq39w@0LskceC0#66X^cvmzxZ=fOYm>T=8Ck(}I zTd5y3B6LzCKe}Yc`S80b-V)X2G+lp{0F-K89ed+`SOzU(4NRq06t)^LeE;9I3n1|V zK?%VEYxpOwrKEHC_ESh0P$^szbHQ8AUEwRofw3e4=>-=au;%TcdI6Jbw2BaAv=(^7 zHZh7i;FVEFML%7xeQYWt#+5q`a&FWY=h2>|bJ>V%VQc^aVWVOpsgKqRL`bZ4$z%7k z_%5JH-rgD9{;9eK)lRNY|{NzI{Kfug!Clr=sNHBTGOqIedkfL<#ecbPD1d!X=frPHJGu-9H& z2%y4r;@OU#*ff{#wbcWM8j&Xl%Y7)S#5gPuM12ckg|9|A@OP?lSw*jb6mx2Of* z3GXa`2l9p=Bedl)!s9Sn3Ah{L3fyfg3$@^3vAbw#w)#Gcpf>j5)AN7X1<4YY!T46S zpR)x$?u3ub<~BUs^sXwVa2WZhjiDKVfJ99~ zo+M0dN54H^6cHm`9*xQCddG^C_`IIE3HnXC>^^fYuE;Qz(ZEcQx2E?06K|>~k_<-C zv1Xe*lYrVIc8TzUe2o}KE;DiA{a0f}&v()PM%lCTw6Lw7#`~ELLy$*A!D-9w!Ql%1 z*18?95N`G+!Y{k;?yl*0)5%J3FSNTNj0gZ2`)|+gXkV=Qi#cIKA7I8x z;=`NJ&u3zCFRofr`j97WprCczbcyXY!;A#oGUM6lSU#aFAx^pn$aejrbzYS~rM-%M zwJ%e}#P;Yx?)a5&pIWR4iK*9Jpmvx3-uI*k;Z~!B&4?a`-29 z10^Lt<+{o{x+r?>&hjIcjgnSRPr#12yBDKOfE^pzD*3lSm2=&WH|gBW-!#bJ8tD!> z@q6kdNL!5iWr@(mC3JMQK3OVidbR4P)~CP9_wk(I6|o4D3+)F`Kg(9DcBB`2A~{lHVATqN{2h z@a-AYc76RX;~Qy-1&V>S@d_`4iZta|g(C3y9PBD1x3$X1zIfb2js>HMK?8NR8ajld zHl!$z)|V=%8((Iq%sa4eK%6Znz}Ib-<2xbk)9F-%3D&b2r(zmTo?4Lp;Y@HD1J|r* z5a|_Iag{s*TasG37>O67#g?LreC{*%x20zqp?l8~H=ecVk;#$aZMrRUlp+*oee0gM%~*mdeE3;np#S3dHc9FfT##SUJlg6s1qmbDaA$s&Mb zz01$zGi;R$0oyp_sF*|pgODw1@Ec{J+LlDAa;SHYOv_Y*JcV4=go4%b2J3?Xx~0h= z$ywQP#jWzu>!jXwg9>5AqzB5}Lzk#NKxE;Exo4O+XsZf>KLHAwZ`D*wPd(BwX$BB- z*EEEpen9=R92t8{ozdX9czMc3j;i>4^{?fT5Mkh|?stuaYgjswl0wCEj_g^7At_{~08E0fDAy%-EF%e1VZ! z{`v^AXx#sn@y_Pan}x=v;uf+$ld^;~_RYG%t&v?m zcdTDHgR1c&A*r=ABGx**64F{4h48`*TtGe)tZX3@5IP1M%%sw=Uy7gB0+8a^UAKiuGaOM5#{C3kO8 zPQ-x&osu8UjCtJ?VkMq_aJ)n=k3fJk}^~^wmL;BoWn_(hInR-{Ptd5mPc~_qeV@q&Pu2J*mCNs2bRR&k;gV^(w zwI)K`9OX9-vFk2n$<8_$yM)P}htl)nK_wXua)?JR6cRjWE@EMqbjJX>7Si{TWnWQB6zthDej+-)%C={(8veB3KHC^8Z zL>QjI7qUs)Z0P+kU94-2NfUI_jwg=hG?%|I)k`b?jhCwXnm&ej(YNB}m3O$V#~tYd zC(eU9m)I7~wK%54f*D)XtHI)bx5|yrSDC}suDLT*ZI+L!T?h%e)9+6KA4LBB+MES? z$SZ}WiI8qd_ipqy1R1rS*UZIAM!A!ON=XVL0lQJF4i!wDcuwDEe@w<>H;!D^a+z zR9!b?#o!NNmORF6O88DKK(TFgOBB`(aG> z3cjjkckH@R>Tf`@pM|{ug9$fd@Xz0E-~ijbL`#Zv{bhK_4O^zr+DpLEU7W*HsKh zd%8r`j6siM_TgNL>Yd;-$i4xbNyIRi=j+0@9{}4%tER@O#EGDA?>7=7PE1RUl;{t` zI!py<*=&+w3ssE`H@MVW#@92IWE_keu89oL|AjfAKsmdD;o3l@ny@Bn7gPA=yz(Ha z(Y>KCNy{@O8h0R>S($)k?S6Md$dv%)8rB#e$BLym0u{Vy)dv=3q!zPZ+6@HZ{@~KX z)vxYrV==u4I|gnYZz4DfS1q_1-&`WyA#|NMQ^PsyA98lV;6DEMkAS+uY2~zfwPt~o z;1nk3nHL+Q(*Mq<3Z}a3vUr|Q^?KiMAa(8e3SJ>5B8Iy|WB+!Ty+*kCfM%M8v)U!9 zTE0G9$mHfdk43cLzja@_Zp}-@o%kqiXDRN||UaD5n?sKf!t zgk0~t{SG9UW^wGE&?IQgW5v}G6Zdko>dy}jK%-RVj_(;fT$=5U!eF;bFcaS-Ytu01 zpN3eh&UvZ?YO#|y4*MUY1O`h#2oAsb^hWxGPBydao$hBK+q+s)@FO3w#L;?%7#3*p z7>-Lmn&^1s?lVek`lq{V^hyZuSH=VF^6FsSoDKa2M1YCiNSMt&9=ap;3Wt-(8DFuQ zlES@33`@8=N71vUYt0@q`=dCo1seFY+6z`ozzoFAEHdB+x%}HflO0>2HzFF*E`8xC zFpOR#q%LtOa;qPfnQUl6L*Z6D(y#$w$XoZNQ?2T<8G9WvoXBJVR&vz3&*2XR+Aq@a zek=IY1e2W^N1IxV4;T_}8FmI-@2|~xS$0o4{W1RDH<%##^LHv<0tePk7RGusfm*bOtC-dSY`OoCGCzU1FO71QmnI?_&~xF15G!))WsW`#}C{y_)$8wV= zF5Fwm0zh}oBF-X9lX`HgtjFE$bg0$o>nNpmdP4|j{gzSj7r-fQ%yGhAU#RM*(Lo|Th9Uo4Oo~<^bm?8iUf;PbZ9J{w zQfsq5P@taX{Z5LD?X9iiMEmy`GY*h4*rr9>xNoIA!|$rQ^`d9`#l3Ie@dW2x_%*r~ z%+vwCflPDY-Id$pn9JOAm z0$J%P5t56f1ClH|n+mAVO58!+cmU44FY7{%hxT%D^r$~^cOYg+X+UPc`P`gO#n~UE zfuWAezn2dV3e?)a1M7h%`BCt# z3AqAy=6mIi@eu$crbS9iQoXAS=Lt$gnAQ04G80=eA!#EI9t z0k4ypL`P5Jl9#WIS?QFd-PyH(wo!#=%Ej@ZNN-iZ+07XI;M(G$ufC=m-;EWSG^Yr+ z8zASfGcu(&riF;)33+`t9B?ZubOGh@*oM)&;gRTcF*_TN6ip(!ueNVYL0A@;H14jO zcl3QpB1_X1R8Er%B8SnIH8-+Q;X)6DJtQab#x2UyS5wjBl*tI_$eAH$chfh|EKc4R z|5I0K2ezKh4vot+64GY1paD;?!^XDmA4-z{uCcdg;v7xwnsrY^px3*=;|mZ`w}3$^C)ZAF-jD6`k{E_1K$FC zvvFuaCs6mEa#nzR1PC)XNvSf>DeYl+KWVv12JzF|nm{^;zweYF4j0zhm;gA*C6B)s zx{YkPd(D;2P|WX{bF1!-UqxST$qYama*-5?T0W8JX9_bRBL|y!sxgO1A}U?3-O{qX zGV)wld*D^JZWf>zHpKN$XqTQ@pb-n_mCn$jOyzHyxH36{!|3I5n%$ljDSGJ?i1!nt z?;x&b;XyHDe-=5K7E$4u*B^xcthzSlsM^|K8)C(_qvDtaKk1U2O+TFi*<9oAy7Wg0r22j+!=woZGsu7 ziG}+!77$5EihTLYvLN}*4c+*H0SHORLa*wIf9Z>}x28zSTCD0o(~TNM8W5A8fgX|- zHtA9MQJu6755n4rK5PqZ!lSZJ?++E`iCJ1SHUlu;pl#aukdHP@yy_9+xicZA z>Yc7+E9Ry{oZHbxhf=s|fp?AC(L>bzWitSyz(IcbmWBin2XsJz-4jKIofCoWf3^3$ zm~h6@$4KI-o2cQ}))52O`aYgdE`*0)OG*_>avPMu+2`0J zNw5gF=wi#zO;KTaGjx*>^ z&8Sk5T8anGtM^fVnl(4rHa)7;&X$_Tom7Y!qwA3OSuwY)GM78b+{m^w9LK=wTHXBg zlwRnxh^O09+}NYH!IPN}oBSepmA(1lZh>^5n=y2I<--8*`)-=A0A;|wt7_j0jO#ypKE;W;d4NVSjVqp5z>>a3Ov1=t-GDi zCZi1ecHC{yPH0`zc75jZBS9f04kY37Zpi+ZY#4m1ivG%Rz;GULdy?N4lT?q0hv4nm zbs{OqPM&zhUzQs?-j`|)ehqfl()0u+pzh-=2^O>MW2neJ1u{t7S{$nF2>6CuJ>9;X zyl5N7lt++5I@m;uQ406U!|WNo84^{II;5H5{-u^u-~&MYBTgWnhDwtHGq~Loh1+gQ zrB_HQB#16>zu64veA)7l2_lE)TgMUHHdZ>sO1^P0?;Ry+Yf${`2s69Sf$OyA47jcU zEcv%|j9E>uz{Mz>ftsDIbj9307%M}1 zT*(&MX&d*fuYvc*P8I{X+^OU1Ofnw}l@A}VC+t=shH~q9@Md~wnd!&3a3A*Ag;eEv zPrSU+619F*{CNWCv@P{alDkOu0@EWcD#ckj_1m8sag{gjn|b5czpaTeP(8RbuB4QO zwUI&OH-qMrZCnK-a-ywq6IjJhp_uAztiIBpy+N^F8>Y@x;HszvXeh6A8zx$UHoMI1 zMD`U`9P>yQ%Ta42$&EV}VD9I~-qe|Dr4b95J$tB)a2baAlE88h5T8(-xZQ27oUj=I>k61nixz^|MO+cNTIE<>*O zaZqViWYa)?gL+afJQALpK9>IW=1gnHA+>GD?HK3s39>oQvu7PLU2SW^95X`^}0ug~fBjs>>W65(JU3_`}` zEu6E6sn1>ISFnwfKjel%KbP=s}Y#1&YsKF51j+;DbcMXRE_diA`H}g7cvxRa<-w6(=Ma2 zAW#?HQyf*|A?EnB-o!#8yS?2yt;rYFUU<+*3zO8BFm%TPLF)Z8jo=CT^t2DQw3cQk zv1f^XIflg6@S)2J-ty_R9SvPTCwabtNFEgAp4oq!9>_TF9PBP1yZi%*#zXqiCFKsK zcq(liPT)gkHe8NPxVPq!q_Xfc|97guepQOZe1@FE@8KhMXIr=SCGy%li3uIzj9URO zzhsgOafQiI8=M5x0^Knds4)$@Q{VU30w%$JGX){TL1tPe-QdAE!DuFpnS0(|c`^v}Hj`F(*&cv>#0$AbH4Rxbk=Il#vG}BvQp}Uhi&xU^L>uhnqh2e4vv}y#n z*mN4_jmTPSp-}Pk8p(ZqBokcGe-4vT`+z6~x`%+gHne%+-vUxOT|!HWDqom3(r=YA ztr|qkHsM7{UB*&mU2LPdH9Y`&v!O*?-S>ryrer=dr-7o-5-@DjA~5U~!4l@|jgy3N zW;Bx~Q)uV1AA2-UgWt`Gk=WTl!*f72IDhl{HV|yCqA-`8PbaA4M>X=y{)LVHui@zE zaR|U>P?PZ!%N8WQ7F1T2S2uGPi;TJ(l?&yie=w@9?ZTR_7j8)q*T22Cq5lhlitjDEl|6oHdtJQlNxLL zWwetaRJ{Zb4+=ao!J&6aBjWjmT|P2EQJ1-GK+d|`@=ngI zA?RrFdklVcr6ycbu;1VWO(nlC(hvWk%%L#HZE%Eu@?Lh*4gTmWZ>pW#-^CMW8TRgi zmFOpw{b+W&&&UodHm7@ZK_KIarW&*Tt0N8sms8I~Brib{fm5WZWW~H;9aE@X6E8+B z6Ad}lJW25`KwOEqpKErg#xUV%k$0gaXDFHF%vG|e9Ya2)VOh9F@qGA$B5uVzE$6o0 zd0qfQ5;-ll=gTJXeA7=K6W3}YrtsgX);13N71aLq=#5jie2E5%s-xc3HI+D^SJ+*R zuS~9_7}!Z~G&r)l*h5e6K73!hvgT*X0O)q8=&MSGSP!XSmK$C7$~%?cd#co1s2nIm zQ!3Ol$nxF7moOf9U6h5z><$!s#&YA(- zr(zOgD#i!6P%C^LY*#)3+%PG37*_&9#X0*02izi92t~%+$Y;yx8KCLSY^M3lz6Y>X z0x$zIC#}pYL6O3el@Z2OHv*^xPRZA)urizC@li5s%N7*<789%n6uiOS z)kJ(J3%LA92Qbn@##^(KDwV@Xd7Z9DZTxcyk}mw9V772XRd@TDc#4Y+G7+a;qzYoB ze-Kt~OWaLpf_ju6-poON9|0NxC-hC`Qqh=W6^C!2B$=96GY)d#5#zf3>7_MXq$+cZ zntv8F-*|l|DyNiYbU{6Y`)3;}wK2jFjA)3{SjT3W3gR6GhN1e5nDV=)OIE%u3{m|a zw-Bs!*$904ZKb7@S^;lJwT+IV$QMqgu{>_{#*-5 zF3MyF*(vm9cjOQBVltWd{HE>d^r~?$ur`rf1FmMM2uXy)*f&h7N-E4KUtY&uUW$#T z+M~HLu>C+UOl`8k<_-a}ApfJ{KLHOLZ2Hecnj_;5*2{(Ef))q1Nz&Q{YS11J%1|Vm z(z^OD`2zk+PzldARl|QIU3eMpy!cqxx*n3W)*T&+fclkB)EyGe$i(F(C@3?k4m)TH zN+8UnOP0NH3JiN$LYCHUTVT_%xR8!HhQB1NzfK#3?&T1VnrPQAq~|}ax(8Z9-tIFr zQ|t$!)XH0+VHq+ivQtAt%bfAy$UTMv_btY>t-uBn+lng6DQcHOQ`onlRNa(KzngMP zM6itqTB-pJ&yC+{^u&)H$IQtJ(n-QmIlfNer?Em7Ee7*k+3Taf*=6rNLUqUkQ%XYCcl5egXeo+I)jtzmZUzoe z!17<1s(tH#L^{bVFAASm-9QegSwPc3r7=r4iGXNZ8yQO*C@K}+>1iUieCtF@GgB8? z#A*(3%l!z!e0$qEQ$RM-T%Ngc!L_dXnbx?K97M$Yf{`$`#t#Vx5IlH$hYAIh&T*6( z5gO@-SE4@7s4CyYMN3G(rHnha2MXu3JZ=SXOmXk5XkeW+zHY;}mRO6=SF7r8TpngL z&dAv`EAiVVJqg$+%tOD+^ItcaD_jSRYF-i8kbJ}7E&UYaxm^K{fu|DffZKy;GPv;g z=ewukLvG?@IZ$LWez6|%N0`{bVb=IPu|K5RSZ?JfbW08e zwQ9U2=a|GnSjiz%`nezYSdUu}&n6U0guqLO0NA~%if*AkV;$Kkq@hDq z>3zL?W#T;{Z{0D|i=?mfMB%nL1>l-sZN*Y%82f&?R~h02YspFAi)%nnne_xjVOFIu zrl6I9M7a&o39U(p;YI++a3Ztm+Hzn5Kf=x0aLWNh)l7Z~eQ10%oOEGxD9SncC z<4o@N-W=?zYkQ)gxDS=Ve*|%=w0_syY64OV639~>2mW|JOEJ&J>olq3JdR}3GLov* zU*Q5R*tuwE^ZLe=KmB;DNusO=@?U%y+*MQ}76oOVTk+R}yDrV`<%7=i7?`DV%hjDT z{9M~9FLwBR_6OG~#|KHlTrW&k22#L_tsGa5O=4ms_&nFMiP39RJKN4nbjKj9U!Duw zNY$sURP^IQVk#fS>-f47z~T~~D)xEfa2D|%?}=#VbxJvpL=Ip0^C-nW$~{ErKO9Em zY#6f+WgNqKP6APVn1tcf-BYB-ZiZ$6E#fwo`R-p8$=@n!%r)W*bp#vUzAi z(FC&mj!V}7Z>fM?t2-S;T+7w5qE^F0AlsCQM#Y<>cKyukuJDaIU;x23F)W;t9sIK> zd58+^%f*KBv(+PP){x76yBdB#ss^_41D#W zXeg`@xuTt<*m&@gvG~``x)Iv(GO@~q40z|hj7sXz%T~7-?wPj?c|Y$EKcHEdMz#Cq zBugOj8$Cv4h8M**CD%-Gk9YHcL0NY_JYNfx=X?UY&=37>`r1}>SU@h+$wN%)fiw2o zXAkt0k`Y+_>e~-Yhr~q?(jg*`7S4z)Qg3^dY&+EQ;ql{vy|PH#sXhVsmCtZ;$k*D@ zq@9Kkv|8t>d$))B+x}LlW>z)KD4fEoiD<}bU1`vMVmW?t^;^n{PI)xmsOvKkK~=7* z_GE-#vA!8dYP8mi|DlaR9B^LVP(+~YiA=0(S)<94D8Z2==0^5X)Q8aELqFqe6C-Qo z>I^yB6=<6s>8U+PLTSOAPWRnQ7ijJTB9O0 zys%tlfGO32(lWkbheuUHD zU&4DqG_UqNIz+Lwr=!h(k2#QAF^$BaireD3ls{{gFX8JZK4~*`?iJOKUQNsW1bMGt zG+^5dz>uFjQ3wHtC-aeuOK2F`E&Zzt_}j0{H;UwGKPkKph8mj9L9wHNk>{&4+z)Si zwW@$m!L%G1^eopH7%**>Xh%;gmzgxkvJ5>;Aw>4j0X4Cap{&mkUsEZ7io69?h%a*| zU_7~Ma+@}@nRd6*y=8QlD-*ooMd8O+*3XP}xv}BPq{Kyb`g;_OKvt~xF$-`&BnpPj zXPaA0;#4v&{&&K9ctn9S)`#HIgkRkagF|6PrCg1K z@c&|AsIS$uObq8fT!zqwUqE!MuVn;YK!UD+UvhE!yxS^sz0JVPEy*vdekt_Bbgw;u_5&v1H1uU}u<@*D7MVYFgX zEJCn&ynEkx|F+F@6)ESbx-hYSqOslgf@st)Kg2=Z2@!{QQ=@KU%Rq1rgZ27303FQ# ztouq4;yx?@>2HS6wPY*bYvz-cW_z-qf+vl|sc*irxBpkN9KFGu28OXv9|0S5?^Bj* z|MQd0k@K%_^fOyhJP0kjd|a;uDV{KbnMn!mh!v|oPxS)4tyPBznK_piGmV1pGo2ifP#_~BVT6Z9bWW=xZyaV)8sBL@jIQQd5HfsIr8m#kw)J^Hfs)C zS_k3Bs!x*wgpU2Nvg%-BOMvnj!NT`G+}AD0&bnwCs{a*&&O-FP5$`fMMDup8CgC zO(}zFqxu*F#j>E_eas?~lVQ-`EJBX9vex~uS+MG>-VJIEnQvj(`ft2$kIQ_x&O1PI zjH5y_2o!+1%8Asa(q`JzXNMUsbfb$Pb`n`V2u_JyI>2#Aeqkl#@l8?dP4czK=_2k< zTYGUV34Uj_pA#^zLy>Za(&k&(7}Zgn2*3MK)~l;XV9a#W8AZ5Mw{xbpnR=%7 zM}Fc)Tp=)VBj`>%kx4>V%eokiTXvpu$Ep~#Rdi{t#>bkLjmi(2F^-w;!A%!R3({X| z;@Zn6pOnSfeFO9bBh9m74>C(m!m{&mZ*t|AL z=4o1$O|u22r>lj^`|N=MB(kg+ggEMxdu@&3UQgV>kZm^RG4n965Ou^OC4qEGqf;K} zBE{)bMpqYS2T3Fzy8AC#;Z*l9suwWNmPdx^6<|J(f5%Xb#G^_u4!;~lhAB-2mW+M_;$seYVHRsYDiR>ssy(mA> z1n=DZtfy|V<*1*IOm+~^KV zbz9F0!6JptXav@SR#cj_FGuiHp4J}9vy?T6>2zdJW0Cz*CfW{biqd;^-X}C9-Tizz z4G(8$F`8MZvRZ0Nj>?2p$Lxq~$dV8Sb*E&NaOY}m630At8$mohe1VM1txDfJ!cNgm zV+^~`1tcARV+y@XudT3zV~_MCn6kobhUz&)aCSUdB2Kvg@N#w$(JT}K+t7|HbU-!J zA^w0tkFz8#+{Ytq1<4zWzSGjD$H2P$dpldV_I`BuTfVQ)xGJX`xGagkg9@LmFF}a zofaoxJ(xr1TxM*JEa7lGI~!815N=Z%&*YQ44y5wG7isLguE*W|m1u_SJqvR_5M z)RE=@^e!x3)W|jRrDh0be1s(zjw!Xa-43#MCD#gQu6gY1Gd@N+nJ4J^A2>lj#l!*g zM%m(g^PYKkUu;<^O`ioMYxFr|!ACZ@To7o@9k3;De$ow< zF;l$_q(E*jx1YQRGfg+);diHm>yR}nf)jPwF%0s7Kh;nHAt&6p2FarJ=t12Xrit-r znb{ug>bbuY8g{gBir`xzAodw`K@PK{{C~eScQutR_OwbkxA{t06C@}9z zkIPfC44zzexL5e~zT9|e@k$Q`Gf?{Y^oOWqr$omA(ld=6v=(j^S8w~)w;mivO#`sS z*t~z*KRS@rNKEXc+2@{!(u65|`zpqs{Keg?rdFE7G_1LwWIHe47qK<{-wkYB2mCuS*nt}C zbM%g+Hl7fpJwsCWP>SgTksri_>k&)ZQp6Iyf0&|GkGnwC>7GzzvgM^dB^1Y70F=2V zfB8jY#%y1P;xT78zKZiTLsjjPS`-fuC~kW|shta9@{9IU&Qv`--7hN|N!wAXRCY%NC^N?SSR3f7@}&QWx=3JzOg4t4$2_0}@|rrM{4-6yy! zFZ(!*#!hr~4^Q)@mPg1YEa2DPtSvwX;dwZC!kqf+w)+)>KG9MO5^WkO@9QuF{v=6UP~ z;lBlaxL;9@auv1Jn#Z|(%7pI~G^yG9<9Zye{SFQ>FhzorZ%BT$4Y5TyO_Sq#%b`Am zpGoiYbwGE&OwB^}#~UiT9~H?3cQW^v!$+N&ew z%de;eifu;QpdpeGr04hMXWV5iEj<&FSS+S?mSyWXnTzfF=L$73%-u_Zec)csX2V{t zYHS8$-n8h9x{P-as6gVBcXWchfNm~99YQETbRm^?WdB#1H}w9jUqZmNF*iVwu+_U9 zbAl3rlyCRmJ18q6CALWIC}Zc^BS@GleCMr)+*T{?Qm-|^TYyX_-?tb>{5tL@xp>W9}Ws-6v@Y| zwAbvPL!31G>npeXB4n5A{%vy-w^PJU{%U>Y*GI3_*@{sI8iy#yyc#_8++;-!if%bk z6z)paX&3J%!yp(Q6Xv1?tlTgn^CKb-WWC%iLo(Q(0sOYu6`0Y(5-77FM)cF%DK!8; zd%2<_k&XLWd@J_mD!bEMTC}-hX)~^vH%c3krS?~W22j?MR1fYVY59U&&pSE`?9i`o zxXc2?p(~D^`;OLWvMRYF+JPR>C0`ZS9Yf?iTNa7KPY_e_)|^!ejM0cki?0mVwD9MO+Hc&kyj&sVdiG;)S6-V$}0EL zQY~zUvw@F5-Ip(ieKkEdfd$tE{LbdEDhwL=qURG|_=jJgLQxvb)*i8PFU|zFWJ95< z(b_|vwOet8V(Pwyw;tZ+72V|h<h8ja+gLm$CE9zDGB7HjoMbD+Ck5a0M#n@;n!>*OAH>w)RfT&;RG5DO zg!lDYwg6M{*e@!cmI=v|{}NQ9z6t@O7%LPa&6=~@dQofi-mXm1)B}_HwUqZYzoZNF zj#JQ9HCyI{ANu9&aGp604ag9%xy>a7^6ibh`8ZQ`>C9l&eXt8ST55DlqJmRkgZG~k z;CVDu_EZ>?aoxaS&UPo>KB-!lYiW1uFgg+KIbyII=VD!x5cYM8!O=OdR+Ko_?i~323U9wh z8^vhOKu`4(v-bMDBBos@scMO$;Q4Xs>jnKs=1L8Vgtz$0H!#9!Q?H?TJR<=KhO^k=wpRffOICk4u;o&=sSD10AU_v6zh*a}Oo`)O-t~E4u8#r^M6fnUwUv495 z20yb_=lQI{88vPD#}r@A_9l!w!$jP#$ME-?qo^RSZ&bqvRd-;lGvDV43I_eu!X6lO zLaM@eb7RT13^YBcZvrX{Tmtw2chxy>h zfSGsnp>Cna5TII4Ch8HO^J}8d#LpS9r@Z{e=s zRo43o)5k&~OAMKGO{(nTe!8p4@Mg+~-8h=Dh?zKN#)VO{)+l;F@%cJyp>8w#tOp(X zeZ7&TA-95frG;pi`pVvq5R&%;Yn;TolawB08L!_3D+(hS+*$r^%s?kTfz4t}c$8Mg zO%zmB9?bL~b~Ph~9?9=yDI2J}yn#^9KDR=a$1MVa)>+$l>~sVwm;d1#n2=?;Rp&LZ zSLF_g?ouuq#Lu#{CTi3FT617wlRwSPl+pWZLGV3m4K#y{R_LWXQ0dHfPX6JNbQk|VgR%xS17t9QaNVft&Di_|$k*ObCauWNLDtJjDuO4JJ z)sGRE{W+8GK!#eSyZmYyesI!lS2h4s88>c-k0ddKpD@%tdAas$nR{t zI=9UH-z{5VJHZM|Dz*roN{axQXl;(d2bmFOlsWw{>Ef@SjY(4r^Lh`tP_uY8z~aw9 z7boK7k{GrNO`gShkBJie;Tw{&?}b_YcK*9fuanMjKIv!rqm%TVAFahmUcDw^!|#y@9~HFnRKH?4f?K@htsKy-Pbvw0%*}gnYGX?C8^MvH=wVuWKB&zZpz+G zrcqv7R#`KuA$0dU{rI%34^BjP>Ar<9OT;M>w9tYCj#j{GtlKoAIo4K_S|*5e4v7dT zxrq;%gSg&>_X#h!$qFa)PW_Ih<4+1f1R7d_3fM&zu`Q@}jy(PKU|?hNTxF`d`1O>1Z4!S}MiG-B~1|;wz_WdI-87Qw`$rhG-j~V5UpcCv-ZP@Cu zsWc?znACu3*$2P;?G}vmi^8G8G9|8wl=~8WA~^TSZDzHAzp&;QtQ5Bu``{Wb>~-2j zBWP@4CEklP29RvyrhN6XIUV8UCHh|AND?=)V<|#Y&WF{@VP8l z*Kj~Jow+6*yJr9QNb^KqjIQ_odV$DlIRw{AVL?@h)eUHXPFR3jTR$uxE(A^syTv^y z^cNugO+e&J9C~Se_a=;RUKixcR8h>x{X~AkD(FLP!2UghX>cnZ{o1q!5d`TTHBIq% zd7PU8g1hLb^+38P1e0iS!4Uzkit;&k{5h_cx4|q>*n?51*E``NyybGoKbbAaL?;gQ zx$}8F;y}!qXBs&%?a5E?MVW9i9$9Z!ux{ozhM_?WK1s#WN+WJNXY&o1uuN|-aGYm=s+#wM;=WoXXxJe(61cK zZHKW%{3ntwgrmR-sa6UmdeVT4C$xAxxPm_(6_QrEX*9vtu-|~1thQW!x25Z{QpvgC4CzU8yrjJfcq|QGo!hsmDgM|RV1Je}Ngd5b8xvR^-mgcsz2V-y1H9A=R!yksT-+(l+ ztN?h2Yq(hlfF>#&V+3hNz&Yj7QT?t(CNvXSt_i>`yBL6LZ4V`mx@Tw*@cQlHhQdqa zwPKk67x_;qpK1cRiuEi;+jCSA0=Wb6YfJoWpaR#$8deg;kK4dbbB!LmqS^Gx)&vPK zcs6o=U50n3IoxcSl@1dwWV_+{MrV}obob{wfQ%$fuJ3QM>KXyU6)a}=7?i%Qbec(x!E5}cU#~-zvHC6Ix7QEl zv!4GwW?`Muk{bZSGk6HnUP!+X$W_#nd$`sCz52ReA|mpEy(J764y;f<}h{LtebaZ6h@4p!*Ce!BjZ zk!xA312U7l!1_!XAv#<^MpW8gVzH_65*l|H3qljLWpus@1N(0Q{Vbwpuo~ke2t5Gy)&x*|6h!`GPQ%pPy35ljn&Iet_xRT1%TObPs%MFn(0X+O9e1 zT=u{zjn}Z@wC%46?yNAuW;_VYsghzeFE_3$a9-U;nF%sEUy_{C#Zyuyx>0G42;!WV zbR!c6wIbjKqcXO(fD!Lcy#nJqQ(1v>2goM#yJ&tbv74*$mnt>Hj@3j;iVxCcn$kvQ zyXO7VHu^td7`Ky`0MBH$Vy}N+!uP?nvc|4XeW=($Qk*@$@JSM(87FG2C%;x^8;~4Q z-{1$H3`w)Kx^`lwl`8^BcvBjw<_C*-vxROcxPi$ENDwb8#&Fq@%{#2rkwSL#5Ze76&LQi@IlotKz}V%=R~i{Z4r(-tOYP#Ih%#w!`5z9rwMwAZR5V?7N|#@6L@WQ0Unu zroAP>P2i-iB#rY5NMMQ54bSsPeDER{-X0VX)P*Qc7Yi7!-Q&ir$TlxeWkfoaDz~V* zbK@DfejtxRcIjm&B_>0vU`1eA^x^1rrCZ#k`g!eo8KN0++BLq^Ad=YSACx*|gA7fq zVp^WZ6*Al-OcSLGttzGRO=O3 z(!(`e=ye=kW3D++kIQWj&}wU5Vh^m_iNRaYZP|^FHk1AksR2*=w!S+eKQ`OF{yW-| zj=Ik$ZwcD4l%TN(Zg=61q>_L%3_-5t88p5_?#9`p#0HcIJca?m!u{Rw+q(0S&?5)C zf3^v+FHF)faISt;L0MJh(2(WSpcKZ6ER_b@CfiFM;o%cFAm!ymQX)(rQ;Cm*%z&AN zy751f*kqPY;jaXCTK>c#b77JYHL`rGbkxi=nkZk*mdCGT3f z*L!7XapLT%5?*}Vy4wSZydoy1jdya*O4Ov)gpchWXTnt!6ZYml7d<@A$#ID`lkNjbXU3AUWG|iomJ!ok%zee9kf# ztn%*d3Su@8sKGMn+trE*Jft{`|21&{W%HM z@@E&BVfUT&=Trl$k3&P-anEMZrVhM#Ay#P3Jq@PXSa`_Muvu#mz*oZRYqmi#R;oH^ zyZgU#(>tvcc8FP*fI$486A34VwCuo(`3`ig?Tqx5)B(tMB_d&pv~T81f0gVi@iBf3 zBnN_1;I)~yYvPR?SPX5ACLn=B#Ib5B!4oj`?L3MT_mbm<6<~%so_7wO>?aRm@hPimHk9dYetfs1M#Im(bXLDdA%H%XMwp0L7c(F;*7nEg`TJ`Hbi*J z1I*JuY&I6A4cXy79qb*5w%wiaV%Ued_7z1ijO+rCHfU;2FUAweyD$Vz(!R6xSSHEOq{YqjbDl2 z{yf4@i+;W0j?!VSw3+nJ?+Wa*_f13yFvV%AC2h^2kkR2avJl7=#(=fc00hTkZ7&N_ zJH5Gi$Cv2Jk(Dv34jho-lwXrn?{L0aw^+8=1fXwdhG`|{R$`)>(%;eSRuCH?9+?mo=(;^c~?pGhf34@YJr4FQE&ZI zBkK#4yjgaA6^^PmY^I|)M`rdmT$TT#4J5eTQE6x$W(eJ-|JZv-L@-r9xFBw;aCjSc zb873Q!b2p1ayjJ&?D=9^yEO6EKewWHeVlk|93Kw<9*{F`so`{~*6rBhK^k0s zy^47I^_xuf6_dh9_dK$WO|Q)7sT`SKrEIc|S@PfVMVVO-H#XxaZ6Oil7tJ^oj;0}?LD8M^TT7e$3 z$2gX)97C$AJ_ej9?5ab#Z$cv^xIa1o8Gtj_MB?g&lgcOW$rb0U&cWdaj9%b(eKwlP z?H|8!_4bO1%s_L<`22*pa zXS}tA6S+G}c@{mg_JyIaB&u7I)RP$#Mg2k{*5UZ4?jh;kOX}G}QbA7nesWMdf(bTg zeQ8XyTt0&53zTR4=Hb4OX@40iK^9HQ3jA;xFHxfZ24@vw5EY>DM3!5Jz|^5HRLQjp zd-Jp^i9oS1*@Q))RmLPJYbbu|`nbA&7nM4r&;e;m3R-Sw@#GtorSXmb?mt{RaX^5O z9Ypp{%R{?g9(=2=anvUs9*R7y2E0aP-VjHeBq(3(0eC4C5fB~ew{Ed`fita&WNV1oC2*Vo@aTQr1;luniJ{a+6 zZk34*N+16~gR*qgnRs(RXv~XZAds@na(p>OS(%*&DQZTYhxLCw@KV1aaq|A|%Owf? z>Zw*t!>AMtX>6an@AnSTR2@Ltf)FSbjjS-3pC`%rLYFhhxzcs1h>k$phGpQK@;fxj zNI7Oj>LBe?`h@q9fzRES#-U6vr%YttWq#>V#&SefvOy%*cC1ctop_yE@B-J_F%j}# zH0&1enu+Fq0@$zp#&4Fskwd#IQyQTP)u5K}H?l&Fk<-D8Mcq1BF-1dT=+t4{egAiz z+!Qjx?9tN1^AfN>l7$(xMjB@=txELmeprg5TB2~5>|BV)=?AFPLar z_w_TDS57LJl$pHWD<1raXXO72m**E*am5HBTSj|rGC($WrSTjoVwBo`qJm%$$?Lho z8q%=6Pd84EW*C2eYdhE2__qb$jHK+yWPgR?auFQ637nof;jIUXc$4eZ${!vo!qYiI z9-E4n3(FFa1_yoJ&^fdLs*BL}`vN2VAl@{gI!p%u+uvMPcPzgxe%v`30)$hD*HTq0T=<>-xhQj_srv@%c{ur_ab-5+8t*#4CZuY|}yi518?u7MyKI_!P5T^)B)nlU~+x$(QAwzWF%*??;6b$MaFR9g2nn`av_V|SqoPlL- zv6_Ap{rw_Awk0Jog=2NS4vH&(#bX*A4A1rMH9~Rw#;SI#2da1SY*e!o#$*D?wosi9 z&$qt`SfRV8NLedu6;*S1ixZu%1&kks?tSt8S28=0@NQ>4hT2f2o^B6ejsg`b2lim# z;UBf0D=kVo4n;(J`S;GaXYVP)u)C}@`kmsh?ol|y^C#&$%W1NB@E<9c94`uXchS?s zrk|&3d9qm{bsN1I;Xh52`fTB1uJ(iah`#oN)mT7I#MF|`)ae%?{N2SZtRD=E@$wDI zY{1&2vpmQNQUR%2X0)&MaN5O#Qs4W`VFB0%4bwz2w|_%}K*QHyo32JhPfq=vC#e2t z37l=}!#HU)XmzsiXx`tQweSwBom`MJyv~ z^Uf@%#|I0^t;-piPX_S(P9n{dS<+fjY(EfL@aq4$-!FS|hSq}dJtZ#z`*+zg_nHPm zQ%@WecxN##EalvlwlN3B%0D0tfr90W;-?0`Ln3*~KOk0TnaV$qR6@On@@9h5)CehP zl9pxcRd%{gs-MtHk4CujF}z24b8WpyULofp+h?mo2lhHc+R;eVIG<@d4yasJbsLtU_BTh75y5d`E#@)ofLMuN;h7J_%Mb6pSzR$ z{xW$Q0774^%1Aj!`kA1cVyd!z>qT{2q;BS*2yNF%?(o+MJCfg5NzDpfPR*a|K(n(u zXvA8>M49lbn3nuBb7l!3oY~EAvx;_)0MmA}7lfS5&MGjX+c*2|ICuM0l}_$m^j9n} zGD6q4Mxi07Xj*>9nK^lwNM&P*u%7EF;orZ%N4ze#v$uFiE+Y4l(z>&d z>Oatiy9YTb54={aq@YhK3I8snA;#MxkKa6ClZ?0M*FZyrd8iK+6i5FuDB^3-$ak${hPnRZl_rN*bI8L#Z}G^bXtPP@$ zVJbrIw&uN~yX(17^^yz)p*D$DFEdQSKjIMWaUUFSU90qaFbrcEXsnW}R@;&Ug(|z& zz=wybKc)e%QyBw=@#6v>ZB^g<&h5;Di@lr7pnBpYL%=r45}tjpeAt^Yz(R&bT+fzzRQgE@)n)76WAd(43k(K+hA*B243)i3UURYu`tgyUgjgh%XG9ID}AM9cy zeMbFGcrkSgqQT@*FXefzI?V`N!KY8nX|{FBqyvlrArPb$mL+&T&!gL?wwht*Esf3so={;QG%;Ri&c zmFx02;#E#S@>|9DpK)evygfy{_>8#g@F*<>DfgJDvG9 z9USAGBo@szc$Afu+SHTr%HcL^&DCb-L)D3~1EJ!Hv{Vk4bYcfzk~l@AS|sYMOK2fK zEzLug;IwA0It0!&s!WnXC!z{sEXYEg3|U5>~EtXWIzO(8Jl(JSwGRULPS; zgvj+lCVTFQy>hP36UmCyaE+*89^U1`MV?3(yO(Lb4Qj|7?WYgM3%8fqhJQ94UZ}Sf zCK-tvPl(2fw!>ppLMo!&Rn)Wme2!O~AQp7(ZV{jn(b->W%019D1)_{%5M=fGWo# zDlm4fF2gLsCg|@Vuj%)?kUkuE3$@Po@p9okkh`b!fvw5T%fs&rT{}%dz@0-hBj(~Y zp!|t+sJrlQ7&)ZL(a;eMaxUQ?Y)z5F&cdyw=}n8~8ywVUh^5>xA0+ztbc7%y*fU4l zdTBIPfQb1hvzCM%SY#dpLcMH=D}x(z6@2%&36VXyqC%vC*Uu|bEpM+Y={P-dpKpr! z)-o{owm;TcqB7`)_a-}z`%x)?i>AQ$8wYkF+2bz@ShkB^)b(24@!?RBMP`TDo!sn| zh;|yyW&MN~PxpHn%&|M9ux}Lgc$1f0X3*GB&*rI#Xf+oPL;f}YXi^8|Z6dw9=XD9W zH+T46@Q1!9n?NzV(RDQ>x}9*kpkX*AyCIP|CUhkPub~OA@MlojJajFv{Wokx+wNJa zTEfLmzXhKr0!;dd%6j3{du-;t^n=XK$8FwLT)^9zqVsd44i{j~Q5*fS5WD_U?4 za?nS<@|pX1uXhKCPcG@UCO;5aJr;3fdpla5 zrEZs3l=vcinLDpYxGdlpoDoEXsSGL0oWWLKg0A7;NA}Jv`)9W&%Z<*n>yGE0AwfQt z+sWbbjrv1`GW+m_h7Yc>>!Q9Md5l$!yZwj_qiE$*RNP`qKp{Y-y;5loWng>6!NgZ3 z!=sz&2RNAdA_N2IdP9N(X0Lirj1N`vXl3vPDxP>RC$^?nZW!xbIf`K#ly1e-#WSKp z!ZV954z7b$^lf9VBQELY$4@{%-ii$kPC+x&;OkE1yGWXHMCgfz-e)Kis zqw=(3uIk*`h$m!|5G^qeoe|+h7Y521OI7s-&O}eTaa*r_b8MfcUiRr4({NBw8RH7f z&VV}1**T#H)(j7A312{21KX><(Vscp#GFB@8RvZ&5BvIR-mPEeqy>B!^Pt;%n*d-_ z5ow6X-XaX1e}WqLH%rhy+eI^_9U8xASbBGvdHKG<6S#?~F=wkz%3A5LoW;)&E%g?1 zxq?3Klsx`z@_CkZ(%hs6)4|Nr=DU2dM6z7-)Pr;4(Mjlm0{xRC;|Ia`!|CrM5 zq{*P^C~@ufhEEdbG>oe442LuPP`?ap$AKS>Oj)+<>;B}$VhLHY-P&j1U(0)a@d{@$ zb6N1IN7-3#Lae<<^mI1MT*#qs0IyBjL6M&sRS}go0MSMAtr{y$KYRfczm+JEIVDpy zxP4CQvg@VmOBRAQCcf3+-4}L{I#AaVHQmG?m>!d~Kqe!IP-dA@{ewB%xs$K zMs0w6?&Ngpfa4(OAhA|k8CX6#6RTK??*67;5`NF9r@U%fj;)U|o}t0rtvx`|CyLYa z6nK1}_iU?xx=7@xP{?_jrm6x9DG6Eu>!S?CvzXX`{_I`3ys;zJv>}chNhejoSU)<3I?`_JKP%K#b*t=$qoS6A32 zyp0T*?qUd#o60$L%8fx3TJ#HP6;jp!h}it(TkjY$ugB~Ih@GZ=t1J|ca0plSI^nN& z`(y|r^*|h>uhgxpzVZBX6-d*Yt~hT!EHj4rP2s0jTyBDwDn9+EZD81e7d{o{&hL;A zc$8^Ais_XAK3i7!8iCI|7eCfpsGV<&dVB*U>QJV(+8fb7i1!YU z?lNYBSVzkWde~YwD6uN~12UpZyqiDwW~TI&0VU2@*pc;9X41{Hxi3CI13FkkaQ;); z-a@wY12fM}k!-FQ1N-1}RH?i0jVQne9o)F;-c? zUxPh;v+>dHBvIdDbcZzs;EyMM0Bj}cS*j`~rF_)rwLZeXjD)b|^fkRvJvH7KWehaz zdrs5*YW>=$m@2S!^nIg806K>X@I-{F>d&B~!_d9B^9j>|7;uKchPj%UJ7L4d{bIsVp2{kF+SK@s`k zrjO23JJ##Kq=xY^)@=K&a}{r?b6!u*Ix~GB)Df4Qe_2o#vM0Z(E|tgi zct)P>bT7l|Bg(qIzn)w7u*a{w@Kyi|3O?{3zNm4}#^@UOy z-8U9?_`9)0)wyB&(3mJ@ap3u6qya=qXj()_HKOeRr8;K?rg{L-o({)khMu>-=UBPW z3d*>pWDQL!kTC~cOk;*p?zgFcl_;zF88<^#qte&as*nCMybi_`tT?XH@~EL7I@r4v zouMC(EQiymHVGPv7zmVsUry1MllbD#I_3KJL^oKscM!5;(yT?{HRD^j+CQLw6oLI> zFHht~_$FWoboD@eaB;)pmx+PQ--Aetm3Cg*getDIwm<+6II|6Dsc&h9M;uJWVG~ntgSkB|| zo8nL)p4&JX#1C?m+h6vs$YaKKHQ}vk+pL8Wj_doBpkE{REG| zakkgTm#)VQD?i9ZPwV>jtizE^e^7tRWVg!RSA(+=Y-%(1VKhmywDJS01qTIy^n|^8 z&^aglwC);72x6gC%hjxyQrk+X4kkFY?P!HS0<%j-n&|;;eAQSwVZ$}J+}Z-syGri1 z=@Y03vrQLU_R%$F?$fP{h-x4F!-eSX4Ph5co!)zp07X3tu#n`lVK4lXKk+^yA%=1G zR|fT9y-YyWUiuCZAdYgAjg(YA@oy;2-vJi)I__gF9IF^88`?qFL$UHLMbZ?#tW|){ zjLCA*k;KU1EL})&h2#x@7bN=Uq1&?RhTOWF#3j4ce--kAqV@HBt&z%r;BHU$RHc|c z1cxtG--|mc^UtCWLN`>(*Cr7aSp0R2jE-PnOpEQIVak3=vn9&??v^ClG;90J1=IE@ z>42_EJ7Et_B9>5-ufnC!a7y&ojOS~IISt^-_DXUqK?yPtG*om~b=g~7)=--=q>%)419E}NpA{VBTR0|kLQcvtj4enG6@3=? z9!VUkmgo^pGclMvB=6H?!28E3NX-n}YGyNW`f+vYc?)+wDy-|p!Lm@1q`E{CfNxKi z1MwS$RE05)PL}Ty|5htj=yMmlXsp^7w#W}xhBJv$Na(`}wu6HmR7T=YeFDBz_P+LB z^)<%#irhwR$^Ht(+?SdKN#pBOR1nL0m%eSDwMg{EmUu-O;TvROiz%djk-Yc-=ys1r z+xP69Fqwgfr%z(dL@fnpl}#y!0U}rz!H}FA(Y$;|D-Yri!KyjR8^^^6UM(n87OZ%r zUfYu8UQC21ALXQK*A-HObc5kHwfA@W+#Ix`!Q{k<`@7X_sbc+ZTrq*%DHj=|mAa<= znBsQ^J^VJKn*P};kOboU-$a4<9$GiYfKcBcEfl*((oY5LLoA{XQ~~73ZO18S%JEYB zh+Gb^6CN8EiR?XixK^SAJD-qW*PkP( zs60aHmu>Q8csG@uYlpSsS%Be#K~4Po)wD8Nn+toLI6s3N8`EjurC~oa{O7=;7JkEv z(E3KdPFt_KxW`&Qcv)Kb{l@6>%{-~T|@e$kB7K~Ju}bt^n?qD$#3;(3`17xg1b<5TS#Ux zyHVI#xzq^LI@`&MLjtx7gkBUer9lBO09?QjWV=EPJacp6>5n6#xTlTL&JEEIq(_7Z z2jHK+CdlSCqkB)ug8cR9(@Y<)djhr!Nq)>ei+gjnf936h3>KU9II?E(CJt~kH5*0i zTj8PymhdP_L<9}x1ZzQ$!5dSAOo;xzdob8mz3@d}b1z!8_FbP9l7Op5YmQ;!Iqz3$#|$tV_ufOJ2$0JHbF6s-*y8_L_P?=r_u2<~ybA6)9K(#TQ zmryP>?E7?5s4SoQUwI*>XDe&Xzvz1fX3czsskPja6G0f$f)p_+h_m>qt52n7$EZzq zJ+MpR0S^0AIJT5nGxcJ{ofV8%#;IjU{v*VaBe(e=ErQ6Hq?={i{%7`}Ux&XbL`3O? zO7p^#XJk-rAXreW=IrVYQiTaRsVW(Df%C-_4l-{jljylIg{Ok{TsXDDGtKRXryD@3 za<_jb9Oo>)B#4(OwUA*@aDn*ulPW8S|9L5+PJWd6aq^~k&w5$0PGymfgn@$z*#dbw^}kse zGgGm#b3e|ANq=Vr_Kd<^xF-mSJCAGe{hkfvjV^Yop=dT$tigD_=fZE2POH6y@&*jio0cgpGr%DHHXKP2e=wj^v%EE8|>t~D=iKkJ$ z)2hXcxVjeDELF&c7HG#SML=qqDZb?2anQ23`N{RTwZodNt!3SLp1W0A0u0*Rx+h54Oso>a#2oxhC#+e3Mk`&>e^TUKA$!`69J&Q& zDI)0!iyqPes*%Lx4se}X2X7}U4rx6NzV(Kg-WENjj&d@MwUq`ZhLxOtcpK}yeoJn? zQItq8_>~Of^@-~`6!a8$#>}5rB(L(b=q!rvIwuKDdJ=4zko5v24)XJ++FxvDXr~!Z4L0DxLLkW$wTTt}nywlZ3 zm2vKDqNO)_exFz)b=^b_7CJV>yZkW1%lt}G5<9mSp2zhJeUH(;)oAZ(c>6IL%$ES8 z>&HFuN)T|p2K8m8*Zb(It1yLjr$IAhUww8LVp$yrIjdgf2{o;`x{XS1e=}=Gv(#2Lz^(x;{|`6}1iJR&@9ZF=urM(%U7Wvlzxc zZ(B8bQk$}*Z-%L-4CDAr&{gVDyOT{mpv~sMK6pRQWbhHihcJ?>i!W))FkuG!PuHZ3 zsA09Ihm`7?Lza#a2K@}KoTxDbYg4gHhLZHI9_oT0Pzy#!Y6Pm zGi@LlBbNcnADh!J@r58wT997sz0{=&#*zaEkGsAnOswe-Qs!-P7WXv!B}p2I6v_Iz zGBUR_fBk`FMhMqcjN0mkf+KmI{!?fKf7oJ`@#+zQDV9W~V#Fo3A^iR%cRtiPtS&(% zMG5nb_#JGIF^$+C1@qp=NwO0~JNGrYFkXCi`Ot_TD&-FrWaNYXa6O_+A7MPO*=eNI zBI;4pGW&I-Yaa~}`eiTS1N${EM1#iBi=`jZ!wnu^hX16r_mY;(Mmsfbu)2g4S0 z@q;H5IG#t1fnGL~a@xsMzMZHqBu)h7`kd_IfY}sY&YOE&J5a)-d{8vgQqJ6mTWthG zpP&(5&$qwz$pyX1MnH##{Qh9UAN=EWXw<6{HDwv2+#p4p|aanK9ab66>PPI(%O zeOTjL#BR~q@8(KfitWAwtkr-Ki(1nSMhx)oeUYm+;Hi`Gl9JO(_I5bN^M6qCu)7(K zgO^dx)J;*mc7>t@>N~#tA^X3TSo|f%!-z(Bs-%YeZ!YWNB~%uvANRI)F&YBb{jl|2 zIu>Y{GTHaOj5v`!g}Y7xfvUL6yCDQ;X9L~+HFsap$FfOeIaSXpd66Nraq%U5x5%lG zD6hpYvSzua)Ec4Gy7`UJM4@@^3j?y^+81x8pA;fm)n{&IYYDhS-@Txn_s}vvz1=w& z;zbHn)b3JlYJ;fRmcOrx0)iL)Ty&q`Ic~7`iP474kZ2(i(2Ny^!_eEd&(KfP2S^fW zu8U{2ck8#6TZ)RZ^-R2er%mebGJO-Y?c9vYkUFZ8jT>WmM}ID^985k~B>;cLbk2A}l0+Crz;w?3O#INfh6 zB2L=@dkjN?oshXLNWHQz96v5I!hJfGr02zY;uL(+SOf;S zEHbp>URNIC(M26Ssp#z!Xxw0|A(Pvi3@FX22l3Yj4TbJt%xn0x!PV#Cd$3DElA_6S z#k54H_+12UXC;td%apZyRZZB+Vjc)!0^?2e_IDmE9tpu_7M+aj)OKmTWE^sPZ#l@s z+_uy2Cs25 z@L^>kKHNgICf+BeNIL19!-WYV-mWv5eG*}0WRmq(pmxyxwf!u{zhkK$PD$Nj;L!>l zo4pFb?Qw-YuCU!9;qCUlt}hFAzy3EUw79>&w4ID#Lr-6I%Foqj$;YiQKF7S1nVum6 z?orfGhS+&27g99Sd@kHF){GHwQaj*+Z7bNYcK(PGpRw#6 z5d&Qxc`(hS3S4kjlunc*uhB21|e4wJ^ z>-4m&1mkhRg`|{@4`=#RJf8Od!CIV(<%Q4h)7u%p(<32AgKiRSVYdjeZBkc?QpVNd z{d`Au+%{ysDyaG9l4DKIlD61Z-tMx1TJjVrFg{4KA>JI-O(CfTBv+u?6XiW+c}XV8J!!Hrt-# zx7@F$&Pd(f+_)_Zo@w#nP1u!(K|b1p1=_G%RxvM`XLSmwJ?NK=MzVsOeRzQLL2R4r zWhO=ve05i7Dc#^LMEI8q>=f(j;A8U*G*cdmu&ptjux_(8o$aT8LN&g(_;e{J`U~%y z=rAnt0N1?#kh}am2x7)?B~{Jf%o=)fkLiA{<-_5zehP6QBPAJx0ojVxDQx&?J4X#d z%*Q1z z(F9O}tSKAohUzQYV12x9Zr6#>$jj)C2KgR=q)qJ=Ny-6bT%mA|#B=ANsJoH)cBIuj zYHUx0FpE+-4<7%LLMWlG4_{*!Yj%Y5>C)#0y{jVvUZRrFMpIB<+oK9YG2swe|2r&YWUgCwYE!&_SVGr@ghl#ToCYU6OM5s0hx){H z;zKypvczXGbt$S4x?*x*?P%4GOpdju=x@>S5>gW`osIqigFvF-exz@pem1dQmDC$d zpV~Z>UHJ=@|5{~S7WUa1+Ve!N8>P`l*iVbk0Ea;`OO&&kwSYtCHtbBxYE@B^r2IRq zf!RaS>^GUNv$qV@7!M5St+#xIMo`Yp+f!FK8kS2QnXxq|qA4BFr%j>#%uL7EWOrzu zeVe%IV1T+o|8Ds#ecXvXSD2ee{Ci%cuW8 z(!4XXh)@^XU;nXt^m>9w5{--cVad!xYtq}`n68|t9X@yN(I8PyII)4qNf*hQzHK#J{_wD)Df$j^0& zMgAY<06@PCdlGG>wbI7`*_#Er08%2HEOWVElNv^_LVZX^JkAm!Ou(#U# zm3f%_*?Zvh4}7DXr5W{7__N|9ws8J2c>yz_Lr1T-Qx6&r{wAS@E;z?h%W12}89|G{ z8~jM`uFyyzEW&)srEKQ&Gv~Ld7Y|CI1<5I&nnSK9k6l8_XJn(21|3Hhv9hSUV}MNX zmUZ2L(=-(n7;t!3ZrUq>h0Y-&$lZ$@)HAvUz8`aKG~hs8Hz}cn;XLovcbd3$v!|0~ zeDP{@u@+)F4Mnls4yMofiG?~KF4pit4V2|2%1-@$A-g8BG^OQmKis)*O_iw;nImjT zzQcp29}1UpS=`hU_ZTb6x0YEV3M>r1)R_v~p7NJm@p=?6yEu-DRcF+EYd%wk3MRwp zQHkNVB`5Iw>M22TWG&(Hy;0k;i){)Y(9NHd(-QyVJg(|^5Tg_TMYhsp1o!b^#*eXD8Y9pMD!sw&(=bqip^66pINw*Q>9F?>KHk%441>9)Sz% zQ>KPl`~>>%ODZ$BOMvEm z2YASAeCx;>&7FxhY0&|qlzmt%f*z9U!cz#%C9x0kb$?Xp*KjC8(=0Jj1Ps zHrJzN^YLHF!oZ6Bz=O@Z1*&81N3 ztaXh9zpmIed&Z%O%0&Uj{QjW4p_{Zm=^Cc!B zA_>)gF&QR35Q+Ylj+eQ%9}}kW6x{T-GykkuvqB+T4^jjOoiJ2s;bZS-p6e-9T_;0- zM`QhgXl`+HhL$N;GIX}>j9avTz7O$ep0(&C?^upf- zEJV4}X&!n8jMjrEGi#PkGxE&IO+OSKDs80rAtLYqYLY3gIR!?HNVggIA0G= z__KQ|Wl>^t4k_z7eWsQ6^WeiK)=tN@nfdFc#3;p^W%r^bM*v@#X42gh(ui=8fgxMc z8`})@0NStav2;F=!V}{1D!zIBz&GO3VaUa*PO8zhPq){1U zY=EZ`K*urq&jBhSV_A(AbeyO!J;M7t&UCI^N1B|`BPvh}*?yd)qlBZY>?Qw0Y;P)w z(sMfV;JgOTF4tCnrgk!d@{-_O#Px-ugaUv5~oF6$q z$dJfmpnfT&2OZZIHZ()bR|-XVm?s+F%)XRGQneAZU(2H+On(bGF)>-(GDTg4n`Ze; zpg}tvdHDiScVi7Zc80&`T1Dg+|Ci^C3=>hVFa0%bU;T6uSP-vAQhp_09Ge?*p#IXv zmgSgoE&|&*3{E;iw#VZ`6&njBjqLk1Y7vdrIT0gK5#)8xQF1b%n0w zD$RjP+L0&|lW$n8MY3uzMp%L00G{P%;p`PKC{=i4!3}m3Ftrdryx=xWX4=0)*fIy( zinnwBg&mCDNPunSGDwDZrnsYDVz+52)ht!Z)CES{p=Kann27U-+v}*RFc7gHj4tB?Gom1W1l*1($)bl#C3*zqXTvJSx_anM5p~I^e_sCW*@~z$Sn7I;} zoypjR=mxfMT_M}_xMAVi;GX#2!Ds$KEfkaB#YXCFL^Cs_vi-$7%hHT@iY{815ZK6L z0W^WysSm11(A#xwQ7~mai%El4aqi&+tNWsM=EwN+kbSh+rQZXst^MN9Ig))& z5utb#6o}HD!|c^?heggS#`;VFz@E=0A)gdm&<*M-`7jNvHXrIR3&}F z%)AVUC+e}qk@}Gh!U*&Q$Ufy4dh+@SUuL3< zLx9p=!FuIFpUumqf)Ah=4NE|L+i3)Oj_J{_O|X$=_d9bjbC#g)`rbOXq|oq~H8EOz z7QX#dTJDm^{xhGu#&3b77C^7u$v+3jo{bW_EDVtrWn-^#EG3M5r&Y2cGd88~n|O+!rc%?S z*tdi+`m&2d3OWr_33k*P@pryjD5*1?TDKFasIx~#z&3UXB2J98LwYaBjXdlebToMc zXoOwd+8lBoiF-x@sHIrrdtJoW9C3VaJ+4Dy6N<#EfM~sra>;^ z6!Z}!QDt;?CPxeL0Q>BIBMG*(k)h{B+n4^o9ePb1cM~pwc&cKufcky#?fU5cQD?|- zOROs>!2-W<&AAVP4eP2pydtuLMF>T)dtXv}x#CVy?P45Vcx_U-VP}Y3o<9C<+qsJ{-2?jFC>X!-$$nc(pWr+qw&$2e( z-{5(;v&MFXXGm0uZ9>@$?n;tLf25~iH$QQjJk4n(On2yMHM_cK|ZE5 zMQXbPQM?`E`#RTV5A!)4q9QvNxg@{T-<&4on}3*Md7xrVJE*N;G}QhZsR|o z8kWxebv)FgN0+>n`&P1mUnH^yJX+v7zl4MlId&|^Yg}CB9?{HKm=$_rqE)U61mnLa zomHGIebGIBKW94yB<}XjjI&(UN(PXNZfGrcZ&`6k?FCoJgUmTp0Eyl%bhRvz-O-5J zf&w-d*9d1s`iXr5W$KF<8~+dtm|GLutwugWv(=9BGM z+tV0%##r1g3m0R~VO zpTI?E#)9HY?h0f^Lc@Yskl&}f<{ioLSsM2PEfw|eHX`Pz+>soug&F!CGeIW(v&#dh z_jD#I!7qIQd13(Q0kG6B#ieD2M3Yh*r4)2Xnh_wm1juA##BbSAWih<6Cqmz zw;#dCPAS5iIF=LUds&mQU7A5J#&lSS2QCH`&tfI*@0Z?+#^K1dpGcxQ^~we4!(44Y zpiR}_WbHL2l(4XSVJ@H@KhS$}isvH!?*!D&G?%v`!T`CMF647t2DsoS$9jmUc!5J) zN$&7-#qqLvtOeK*7Sqc?+Tr@?phpMh;5Ewc)b?kI|8$>L5SF~t%mZ01+>_#^i!*4| z|1n`>6cOx$pu6I^NyTnVINQW`mj5~Dj$cCTQ%RwmMUkyqqkZe&ZAGBKezvRvq3M1IGQ#iv2y3Z9Oo6)2I;hd0WRk+LseccZe9CWW*!-F5S0_eh*56M9tTgsv z#6&%@uAvs)Wcss;&2B-R+_fEtte)1^EpL=Z^<^Yd5zSuOMlq>hyD$d^<1OS9Ltgcd zR-B4GRJmW^!!}wpg|NLkrOX*gO~5Wz%M_uf(bJKo)|k-2zR`!y!d(7d zbtf-KXcet9vh6l4j@?IWS8J5H%du`m>8daLY3hZW_o$n{=a@{DEvq)!&TdTL0kFs1 zq9JD#u3gx&Xku)P{FiRmta6CU(}yM{r0QOYnUh10+nwwTGr|p_jB1m|vr^TD*|?_{ zsu(@H!qea>6*_W6ck>+Wsc9rB!Mxk=-$m;J_`>{eI5&-*7Daon7~k5NJTLJUE!Z`Rcu9 zo&NZnX=y@Q@f-GSr9eEpKjS*wenh58wjs~uh6cG&r_7y`@?18jHa~SDA3vUl+QqQu z!Wj~n<&+XtJJ~KlD@s!dKMS5m)HMTzB@PFjHad$*OGP|B0@Hf&MKef?qUuqe2Gw?n zOY7_&)7Da?>jr!+&Tq|EZY`}9ST(_*>NC2R^~_$$t-&@*ecjooinY)#$Nz3za@b^%ZvesS7lM>@#jXk%?fA zgee7o*Np|sq9)sPuc-bJjW>fCvsp^$f?AF?^{9bYQMkD<;;Qw`xRa)0lpKeoP7aMK z@HWNt&>C~#=M$O!P|iJsf5~^YX0|ljDM@wQmf%@lsFg)c&gwa@sRE(B5JRydV{9ca zv>5R;1K~~yE;U_xJ53j;R=$2A*1_1AFfF$h73}wifuG*Ha;))D-TIM6Yo@U~3Y((@ z{nGu>A#>73qOoFV3*V%Rm$Gj#L8QrA4Db`iBJDm8VqR&wVzp1rz2@epPCdP-TAcoM zON6O6n^f@6H|Zc9ISI6|Ra)uLRN|{nzHV)Q3|isWbRHLei!XO(y437vHu>P|v7~N` zjedOC-RJ2VQ%Y2D2^w;Atl&-2-(snQ<{UaK*SLwr&LU>_O!EY=#DXr{%Wuyt2VuDm%^SrF}lm;3b&djbK#57cE zv!t6myqHTPsGbE{?=-q`jr_t?Rk+aC=);J>?Z18mm;J+{I-GwXdCVaNIsh zn}yT{?O-OKU=O@@kB07C!|4zFD2gK`has`A&bA`IwIr4sf&v$tvPO)5xOX_WGRD|T zwmng!tl&`XA&cy`mftz2gh!8rk_}t9W)ZCgP!^YA3D)O=D#~KMl%0Acnn?{YdoC79 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