From fb8c48889005d3b4a5a998f9902d2fa6109a3cd2 Mon Sep 17 00:00:00 2001 From: backuppc Date: Tue, 8 Jul 2025 15:05:21 +0900 Subject: [PATCH] cleaning --- Cs_HMI/AGVCSharp.sln | 116 +- Cs_HMI/DLL/CarlosAg.ExcelXmlWriter.dll | Bin 0 -> 110592 bytes Cs_HMI/DLL/arCommUtil.dll | Bin 192512 -> 192512 bytes Cs_HMI/DLL/arControl.Net4.dll | Bin 256512 -> 334848 bytes Cs_HMI/Project/AGV4.csproj | 24 +- Cs_HMI/SubProject/AGV/NARUMI.csproj | 7 +- .../GridView/ColorListItem.cs | 46 +- .../GridView/GridItem.cs | 100 +- .../GridView/GridView.Designer.cs | 72 +- .../GridView/GridView.cs | 1248 ++++++++--------- .../Properties/Resources.Designer.cs | 6 +- .../SubProject/AGVControl/agvControl.csproj | 15 +- Cs_HMI/SubProject/BMS/BMS.cs | 133 +- .../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 | 389 ----- Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj | 59 - .../ProPLC/Properties/AssemblyInfo.cs | 36 - .../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 -- .../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_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 | 96 -- Cs_HMI/TestProject/Test_ProPLC/Util.cs | 461 ------ Cs_HMI/TestProject/Test_ProPLC/app.config | 3 - 57 files changed, 902 insertions(+), 7161 deletions(-) create mode 100644 Cs_HMI/DLL/CarlosAg.ExcelXmlWriter.dll rename Cs_HMI/SubProject/{arFrameControl => AGVControl}/GridView/ColorListItem.cs (96%) rename Cs_HMI/SubProject/{arFrameControl => AGVControl}/GridView/GridItem.cs (97%) rename Cs_HMI/SubProject/{arFrameControl => AGVControl}/GridView/GridView.Designer.cs (96%) rename Cs_HMI/SubProject/{arFrameControl => AGVControl}/GridView/GridView.cs (97%) delete mode 100644 Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs delete mode 100644 Cs_HMI/SubProject/ProPLC/Arduino/EventsIO.cs delete mode 100644 Cs_HMI/SubProject/ProPLC/Arduino/MemoryAccess.cs delete mode 100644 Cs_HMI/SubProject/ProPLC/FakePLC.cs delete mode 100644 Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj delete mode 100644 Cs_HMI/SubProject/ProPLC/Properties/AssemblyInfo.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.Designer.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MenuBar/MenuItem.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotCommandButton.Designer.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotCommandButton.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotLinkLabel.Designer.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotLinkLabel.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.Designer.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotionView/MotITem.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.Designer.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/Properties/AssemblyInfo.cs delete mode 100644 Cs_HMI/SubProject/arFrameControl/arFrameControl.csproj delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Form1.Designer.cs delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Form1.cs delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Form1.resx delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Program.cs delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/AssemblyInfo.cs delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.Designer.cs delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.resx delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.Designer.cs delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.settings delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj delete mode 100644 Cs_HMI/TestProject/Test_NLRF100/Util.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Form1.Designer.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Form1.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Form1.resx delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/MethodExtentions.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Program.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/AssemblyInfo.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.Designer.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.resx delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.Designer.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.settings delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/Util.cs delete mode 100644 Cs_HMI/TestProject/Test_ProPLC/app.config diff --git a/Cs_HMI/AGVCSharp.sln b/Cs_HMI/AGVCSharp.sln index 3403360..c4910f1 100644 --- a/Cs_HMI/AGVCSharp.sln +++ b/Cs_HMI/AGVCSharp.sln @@ -1,41 +1,29 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.9.34714.143 +# Visual Studio Express 15 for Windows Desktop +VisualStudioVersion = 15.0.28307.1000 MinimumVisualStudioVersion = 10.0.40219.1 -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}") = "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}") = "arCommUtil", "SubProject\CommUtil\arCommUtil.csproj", "{14E8C9A5-013E-49BA-B435-FFFFFF7DD623}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ENIGProtocol", "SubProject\EnigProtocol\enigprotocol\ENIGProtocol.csproj", "{BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ENIGProtocol", "SubProject\EnigProtocol\enigprotocol\ENIGProtocol.csproj", "{9365803B-933D-4237-93C7-B502C855A71C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGV4", "Project\AGV4.csproj", "{D6B3880D-7D5C-44E2-B6A5-CF6D881A8A38}" EndProject @@ -49,24 +37,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {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 @@ -91,30 +61,6 @@ Global {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 @@ -151,18 +97,6 @@ Global {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 {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 @@ -199,30 +133,18 @@ Global {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 - {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 - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Debug|x64.ActiveCfg = Debug|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Debug|x64.Build.0 = Debug|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Debug|x86.ActiveCfg = Debug|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Debug|x86.Build.0 = Debug|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Release|Any CPU.Build.0 = Release|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Release|x64.ActiveCfg = Release|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Release|x64.Build.0 = Release|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Release|x86.ActiveCfg = Release|Any CPU - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234}.Release|x86.Build.0 = Release|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Debug|x64.ActiveCfg = Debug|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Debug|x64.Build.0 = Debug|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Debug|x86.ActiveCfg = Debug|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Debug|x86.Build.0 = Debug|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Release|Any CPU.Build.0 = Release|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Release|x64.ActiveCfg = Release|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Release|x64.Build.0 = Release|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Release|x86.ActiveCfg = Release|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Release|x86.Build.0 = Release|Any CPU {D6B3880D-7D5C-44E2-B6A5-CF6D881A8A38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D6B3880D-7D5C-44E2-B6A5-CF6D881A8A38}.Debug|Any CPU.Build.0 = Debug|Any CPU {D6B3880D-7D5C-44E2-B6A5-CF6D881A8A38}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -240,19 +162,13 @@ Global 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} {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} - {14E8C9A5-013E-49BA-B435-FFFFFF7DD623} = {C423C39A-44E7-4F09-B2F7-7943975FF948} - {BCFD982A-C7BF-42EF-B0D3-0648B0EC5234} = {C423C39A-44E7-4F09-B2F7-7943975FF948} + {9365803B-933D-4237-93C7-B502C855A71C} = {C423C39A-44E7-4F09-B2F7-7943975FF948} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B5B1FD72-356F-4840-83E8-B070AC21C8D9} diff --git a/Cs_HMI/DLL/CarlosAg.ExcelXmlWriter.dll b/Cs_HMI/DLL/CarlosAg.ExcelXmlWriter.dll new file mode 100644 index 0000000000000000000000000000000000000000..7760d6d1a54f1558c01b7a6dbe24442e1ed74100 GIT binary patch literal 110592 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 z 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 Z1&&$Zm<5hm;FtxDS>Tuj{{OVV{{eAq^!5M% literal 0 HcmV?d00001 diff --git a/Cs_HMI/DLL/arCommUtil.dll b/Cs_HMI/DLL/arCommUtil.dll index 8d1e3d1da514db530e9b8890dc277be469c76836..74cff2cf717a19004c46b2422769ab95e3e520f0 100644 GIT binary patch delta 39336 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 BEUN$j delta 39167 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%0DnV4##>NXWrR9uEde4~7gm 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

4?hP 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 ZMpeY}pSYAmn=xDPGS44>{{NG}{{aya=aB#a diff --git a/Cs_HMI/Project/AGV4.csproj b/Cs_HMI/Project/AGV4.csproj index 4f340c6..466d5f1 100644 --- a/Cs_HMI/Project/AGV4.csproj +++ b/Cs_HMI/Project/AGV4.csproj @@ -99,6 +99,18 @@ Auto + + False + ..\DLL\arCommUtil.dll + + + False + ..\DLL\arControl.Net4.dll + + + False + ..\DLL\CarlosAg.ExcelXmlWriter.dll + False C:\Program Files (x86)\Microsoft SDKs\Speech\v11.0\Assembly\Microsoft.Speech.dll @@ -520,14 +532,6 @@ {8bae0eac-3d25-402f-9a65-2ba1ecfe28b7} NARUMI - - {f31c242c-1b15-4518-9733-48558499fe4b} - arControl - - - {a16c9667-5241-4313-888e-548375f85d29} - arFrameControl - {7a94c30c-6772-4f71-bf9c-0df071a1bc70} BMS @@ -536,10 +540,6 @@ {14e8c9a5-013e-49ba-b435-efefc77dd623} CommData - - {14e8c9a5-013e-49ba-b435-ffffff7dd623} - arCommUtil - {499d8912-4b96-41e5-a70d-cfe797883d65} ENIGProtocol diff --git a/Cs_HMI/SubProject/AGV/NARUMI.csproj b/Cs_HMI/SubProject/AGV/NARUMI.csproj index fd48fe6..b1b1492 100644 --- a/Cs_HMI/SubProject/AGV/NARUMI.csproj +++ b/Cs_HMI/SubProject/AGV/NARUMI.csproj @@ -34,6 +34,9 @@ false + + ..\..\DLL\arCommUtil.dll + @@ -59,10 +62,6 @@ {14e8c9a5-013e-49ba-b435-efefc77dd623} CommData - - {14e8c9a5-013e-49ba-b435-ffffff7dd623} - arCommUtil - \ No newline at end of file diff --git a/Cs_HMI/SubProject/arFrameControl/GridView/ColorListItem.cs b/Cs_HMI/SubProject/AGVControl/GridView/ColorListItem.cs similarity index 96% rename from Cs_HMI/SubProject/arFrameControl/GridView/ColorListItem.cs rename to Cs_HMI/SubProject/AGVControl/GridView/ColorListItem.cs index 08251be..fd70462 100644 --- a/Cs_HMI/SubProject/arFrameControl/GridView/ColorListItem.cs +++ b/Cs_HMI/SubProject/AGVControl/GridView/ColorListItem.cs @@ -1,23 +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; - } - } -} +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/AGVControl/GridView/GridItem.cs similarity index 97% rename from Cs_HMI/SubProject/arFrameControl/GridView/GridItem.cs rename to Cs_HMI/SubProject/AGVControl/GridView/GridItem.cs index cc6d377..40eddec 100644 --- a/Cs_HMI/SubProject/arFrameControl/GridView/GridItem.cs +++ b/Cs_HMI/SubProject/AGVControl/GridView/GridItem.cs @@ -1,50 +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; - } - } -} +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/AGVControl/GridView/GridView.Designer.cs similarity index 96% rename from Cs_HMI/SubProject/arFrameControl/GridView/GridView.Designer.cs rename to Cs_HMI/SubProject/AGVControl/GridView/GridView.Designer.cs index 2a9a87e..66613cb 100644 --- a/Cs_HMI/SubProject/arFrameControl/GridView/GridView.Designer.cs +++ b/Cs_HMI/SubProject/AGVControl/GridView/GridView.Designer.cs @@ -1,36 +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 - } -} +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/AGVControl/GridView/GridView.cs similarity index 97% rename from Cs_HMI/SubProject/arFrameControl/GridView/GridView.cs rename to Cs_HMI/SubProject/AGVControl/GridView/GridView.cs index 26be37a..0249079 100644 --- a/Cs_HMI/SubProject/arFrameControl/GridView/GridView.cs +++ b/Cs_HMI/SubProject/AGVControl/GridView/GridView.cs @@ -1,624 +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; - //} - } - } -} +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/AGVControl/Properties/Resources.Designer.cs b/Cs_HMI/SubProject/AGVControl/Properties/Resources.Designer.cs index 97968f8..f1f5a9b 100644 --- a/Cs_HMI/SubProject/AGVControl/Properties/Resources.Designer.cs +++ b/Cs_HMI/SubProject/AGVControl/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace AGVControl.Properties { // 클래스에서 자동으로 생성되었습니다. // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [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 { @@ -47,8 +47,8 @@ namespace AGVControl.Properties { } /// - /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 - /// 재정의합니다. + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대한 현재 스레드의 CurrentUICulture + /// 속성을 재정의합니다. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { diff --git a/Cs_HMI/SubProject/AGVControl/agvControl.csproj b/Cs_HMI/SubProject/AGVControl/agvControl.csproj index 8790cfe..90480cc 100644 --- a/Cs_HMI/SubProject/AGVControl/agvControl.csproj +++ b/Cs_HMI/SubProject/AGVControl/agvControl.csproj @@ -34,6 +34,9 @@ false + + ..\..\DLL\arCommUtil.dll + @@ -57,6 +60,14 @@ fPropertyRFIDPoint.cs + + + + Component + + + GridView.cs + @@ -134,10 +145,6 @@ {14e8c9a5-013e-49ba-b435-efefc77dd623} CommData - - {14e8c9a5-013e-49ba-b435-ffffff7dd623} - arCommUtil - diff --git a/Cs_HMI/SubProject/BMS/BMS.cs b/Cs_HMI/SubProject/BMS/BMS.cs index 0ab5815..7bc656e 100644 --- a/Cs_HMI/SubProject/BMS/BMS.cs +++ b/Cs_HMI/SubProject/BMS/BMS.cs @@ -91,7 +91,10 @@ namespace arDev } bool Recv0 = false; + int Recv0Cnt = 0; bool Recv1 = false; + int Recv1Cnt = 0; + public event EventHandler ChargeDetect; public override bool ProcessRecvData(byte[] data) { @@ -110,6 +113,13 @@ namespace arDev } + if (VerifyChecksum(data) == false) + { + RaiseMessage(MessageType.Error, "Checksum error"); + return false; + } + + if (data[1] == 0x03) { return ParseBMSInfo(); @@ -123,6 +133,8 @@ namespace arDev } bool ParseBMSCellVoltage() { + if (UseCmdLogging == true) + RaiseMessage(MessageType.Recv, ByteListToHexString(LastReceiveBuffer.ToList())); //var i = 0; var BatteryCell_Checksum = 0xffff;// - (LastReceiveBuffer[i + 3] + LastReceiveBuffer[i + 4] + LastReceiveBuffer[i + 5] + LastReceiveBuffer[i + 6] + LastReceiveBuffer[i + 7] + LastReceiveBuffer[i + 8] + LastReceiveBuffer[i + 9] + LastReceiveBuffer[i + 10] + LastReceiveBuffer[i + 11] + LastReceiveBuffer[i + 12] + LastReceiveBuffer[i + 13] + LastReceiveBuffer[i + 14] + LastReceiveBuffer[i + 15] + LastReceiveBuffer[i + 16] + LastReceiveBuffer[i + 17] + LastReceiveBuffer[i + 18] + LastReceiveBuffer[i + 19])) + 1; for (int i = 3; i < 20; i++) @@ -170,8 +182,62 @@ namespace arDev } + + + + public static bool VerifyChecksum(byte[] dataBytes) + { + // 길이 바이트 (byte[3]) + byte length = dataBytes[3]; + + if (dataBytes[1] == 0x03) + { + + // 데이터 바이트 (byte[4] ~ byte[30]) + byte[] data = dataBytes.Skip(4).Take(27).ToArray(); + + // 길이와 데이터의 합을 계산 + ushort sum = (ushort)(length + data.Sum(b => b)); + + // 반전시키고 높은 위치부터 낮은 위치로 더한 후 1을 더함 + ushort checksum = (ushort)((~sum + 1) & 0xFFFF); + + // 받은 체크섬 (byte[31] ~ byte[32]) + ushort receivedChecksum = (ushort)((dataBytes[31] << 8) | dataBytes[32]); + + //252 1: 64514 + // 계산된 체크섬과 받은 체크섬을 비교 + return checksum == receivedChecksum; + + } + else if (dataBytes[1] == 0x04) + { + // 데이터 바이트 (byte[4] ~ byte[30]) + byte[] data = dataBytes.Skip(4).Take(16).ToArray(); + + // 길이와 데이터의 합을 계산 + ushort sum = (ushort)(length + data.Sum(b => b)); + + // 반전시키고 높은 위치부터 낮은 위치로 더한 후 1을 더함 + ushort checksum = (ushort)((~sum + 1) & 0xFFFF); + + // 받은 체크섬 (byte[31] ~ byte[32]) + ushort receivedChecksum = (ushort)((dataBytes[20] << 8) | dataBytes[21]); + + //252 1: 64514 + // 계산된 체크섬과 받은 체크섬을 비교 + return checksum == receivedChecksum; + + } + + return false; + } + bool ParseBMSInfo() { + if(UseCmdLogging == true) + RaiseMessage(MessageType.Recv, ByteListToHexString(LastReceiveBuffer.ToList())); + //전압확인 UInt16 batH = (UInt16)LastReceiveBuffer[4]; UInt16 batL = (UInt16)LastReceiveBuffer[5]; @@ -361,6 +427,10 @@ namespace arDev public int QueryIndex { get; set; } = 0; + public int CMDOutCnt { get; set; } = 3; + + public bool UseCmdLogging { get; set; } = false; + /// /// 상태읽기와 전압읽기명령을 반복합니다 /// @@ -375,8 +445,22 @@ namespace arDev Recv1 = false; return true; } + else + { + if (Recv0Cnt > CMDOutCnt) + { + Recv0Cnt = 0; + RaiseMessage(MessageType.Error, "0 명령 Count Out"); + QueryIndex = 1; + Recv1 = false; + return true; + } + else + { + return SendQuery_ReadStatue(); + } - return SendQuery_ReadStatue(); + } } else { @@ -386,29 +470,47 @@ namespace arDev Recv0 = false; return true; } - - return SendQuery_ReadCellvoltage(); + else + { + if (Recv1Cnt > CMDOutCnt) + { + Recv1Cnt = 0; + RaiseMessage(MessageType.Error, "1 명령 Count Out"); + QueryIndex = 0; + Recv0 = false; + return true; + } + else + { + return SendQuery_ReadCellvoltage(); + } + } } } public Boolean SendQuery_ReadStatue() { + Recv0Cnt++; Recv0 = false; var cmd = new List(); - cmd.Add(0xDD); //stx - cmd.Add(0xA5); //read - cmd.Add(0x03); //command + cmd.Add(0xDD); + cmd.Add(0xA5); + cmd.Add(0x03); cmd.Add(0x00); cmd.Add(0xFF); - cmd.Add(0xFD); //checksum1 - cmd.Add(0x77); //checksum2 - cmd.Add(0x0D); //etx + cmd.Add(0xFD); + cmd.Add(0x77); + cmd.Add(0x0D); + if (UseCmdLogging == true) + RaiseMessage(MessageType.Normal, ByteListToHexString(cmd)); + return WriteData(cmd.ToArray()); } public Boolean SendQuery_ReadCellvoltage() { + Recv1Cnt++; Recv1 = false; var cmd = new List(); cmd.Add(0xDD); @@ -419,8 +521,21 @@ namespace arDev cmd.Add(0xFC); cmd.Add(0x77); cmd.Add(0x0D); + if (UseCmdLogging == true) + RaiseMessage(MessageType.Normal, ByteListToHexString(cmd)); return WriteData(cmd.ToArray()); } + + public string ByteListToHexString(List byteList) + { + StringBuilder hex = new StringBuilder(byteList.Count * 2); + foreach (byte b in byteList) + { + hex.AppendFormat("{0:X2} ", b); + } + return hex.ToString(); + } + } } diff --git a/Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs b/Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs deleted file mode 100644 index 6dfda17..0000000 --- a/Cs_HMI/SubProject/ProPLC/Arduino/EnumStruct.cs +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index 51b572d..0000000 --- a/Cs_HMI/SubProject/ProPLC/Arduino/EventsIO.cs +++ /dev/null @@ -1,82 +0,0 @@ -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 deleted file mode 100644 index 1ba4a7d..0000000 --- a/Cs_HMI/SubProject/ProPLC/Arduino/MemoryAccess.cs +++ /dev/null @@ -1,556 +0,0 @@ -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 deleted file mode 100644 index b125593..0000000 --- a/Cs_HMI/SubProject/ProPLC/FakePLC.cs +++ /dev/null @@ -1,389 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using arDev.Arduino; -using COMM; -using AR; - - -namespace arDev -{ - public class FakePLC : arDev.Arduino.DIO - { - - private System.Threading.Thread thPLC; - public bool Shutdown { get; set; } = false; - - public FakePLC() - { - 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 VAR.BOOL[flag]; - } - - public Boolean GetFlag(COMM.eVarBool flag) - { - return 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 deleted file mode 100644 index 8c8f3d9..0000000 --- a/Cs_HMI/SubProject/ProPLC/PLC.Net45.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - 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 deleted file mode 100644 index 64e7d13..0000000 --- a/Cs_HMI/SubProject/ProPLC/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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/MenuBar/MenuControl.Designer.cs b/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.Designer.cs deleted file mode 100644 index a535234..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index c089624..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuControl.cs +++ /dev/null @@ -1,676 +0,0 @@ -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 deleted file mode 100644 index 87347bc..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MenuBar/MenuItem.cs +++ /dev/null @@ -1,69 +0,0 @@ -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 deleted file mode 100644 index 953c119..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotCommandButton.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index b305825..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotCommandButton.cs +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index 15ccadf..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index c20b6ad..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotLinkLabel.cs +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 1541105..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index c13ca3d..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotValueNumericUpDown.cs +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 24f74fa..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotionView/MotITem.cs +++ /dev/null @@ -1,56 +0,0 @@ -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 deleted file mode 100644 index be4639e..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index c770c5a..0000000 --- a/Cs_HMI/SubProject/arFrameControl/MotionView/MotionDisplay.cs +++ /dev/null @@ -1,306 +0,0 @@ -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 deleted file mode 100644 index a63a2d8..0000000 --- a/Cs_HMI/SubProject/arFrameControl/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index 7f2f5e9..0000000 --- a/Cs_HMI/SubProject/arFrameControl/arFrameControl.csproj +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Debug - AnyCPU - {A16C9667-5241-4313-888E-548375F85D29} - Library - Properties - arFrame.Control - arFrameControl - v4.0 - 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_NLRF100/Form1.Designer.cs b/Cs_HMI/TestProject/Test_NLRF100/Form1.Designer.cs deleted file mode 100644 index c726f10..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Form1.Designer.cs +++ /dev/null @@ -1,222 +0,0 @@ -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 deleted file mode 100644 index 3676065..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Form1.cs +++ /dev/null @@ -1,124 +0,0 @@ -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 deleted file mode 100644 index aac33d5..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Form1.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 deleted file mode 100644 index b47751c..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index f1da5a4..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index 040712a..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 이 코드는 도구를 사용하여 생성되었습니다. -// 런타임 버전: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 deleted file mode 100644 index ffecec8..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 deleted file mode 100644 index 8206ddc..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 deleted file mode 100644 index abf36c5..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj b/Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj deleted file mode 100644 index c86e10b..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Test_NLRF100.csproj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - 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 deleted file mode 100644 index 9df6ad4..0000000 --- a/Cs_HMI/TestProject/Test_NLRF100/Util.cs +++ /dev/null @@ -1,407 +0,0 @@ -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_ProPLC/Form1.Designer.cs b/Cs_HMI/TestProject/Test_ProPLC/Form1.Designer.cs deleted file mode 100644 index 04552c1..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Form1.Designer.cs +++ /dev/null @@ -1,577 +0,0 @@ -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 deleted file mode 100644 index 3638c70..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Form1.cs +++ /dev/null @@ -1,659 +0,0 @@ -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 deleted file mode 100644 index c1be622..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Form1.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 deleted file mode 100644 index 04381bd..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/MethodExtentions.cs +++ /dev/null @@ -1,216 +0,0 @@ - -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 deleted file mode 100644 index c08bf88..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 53eb983..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index 3a74d7e..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 이 코드는 도구를 사용하여 생성되었습니다. -// 런타임 버전: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 deleted file mode 100644 index ffecec8..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 deleted file mode 100644 index 8508b90..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 이 코드는 도구를 사용하여 생성되었습니다. -// 런타임 버전: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 deleted file mode 100644 index abf36c5..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj b/Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj deleted file mode 100644 index 812c586..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Test_PLC.csproj +++ /dev/null @@ -1,96 +0,0 @@ - - - - - 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 - - - - - {14e8c9a5-013e-49ba-b435-efefc77dd623} - CommData - - - - \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_ProPLC/Util.cs b/Cs_HMI/TestProject/Test_ProPLC/Util.cs deleted file mode 100644 index af46d94..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/Util.cs +++ /dev/null @@ -1,461 +0,0 @@ -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 deleted file mode 100644 index 2c0f559..0000000 --- a/Cs_HMI/TestProject/Test_ProPLC/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - -