diff --git a/Cs_HMI/AGVCSharp.sln b/Cs_HMI/AGVCSharp.sln index 3df5ef1..249c9b9 100644 --- a/Cs_HMI/AGVCSharp.sln +++ b/Cs_HMI/AGVCSharp.sln @@ -5,14 +5,10 @@ VisualStudioVersion = 15.0.36324.19 MinimumVisualStudioVersion = 10.0.40219.1 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}") = "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_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}" @@ -21,8 +17,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NARUMI", "SubProject\AGV\NA 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}") = "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}" @@ -44,10 +38,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGVMapEditor", "AGVLogic\AG EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGVSimulator", "AGVLogic\AGVSimulator\AGVSimulator.csproj", "{B2C3D4E5-0000-0000-0000-000000000000}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Port", "TestProject\Test_Port\Test_Port.csproj", "{CCFA2CE7-A539-4ADC-B803-F759284C3463}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_ACS", "TestProject\Test_ACS\Test_ACS.csproj", "{A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -82,18 +72,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 - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x64.ActiveCfg = Debug|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x64.Build.0 = Debug|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x86.ActiveCfg = Debug|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Debug|x86.Build.0 = Debug|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|Any CPU.Build.0 = Release|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x64.ActiveCfg = Release|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x64.Build.0 = Release|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x86.ActiveCfg = Release|Any CPU - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|x86.Build.0 = Release|Any CPU {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.Build.0 = Debug|Any CPU {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -142,18 +120,6 @@ Global {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x64.Build.0 = Release|Any CPU {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.ActiveCfg = Release|Any CPU {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|x86.Build.0 = Release|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x64.ActiveCfg = Debug|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x64.Build.0 = Debug|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x86.ActiveCfg = Debug|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|x86.Build.0 = Debug|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|Any CPU.Build.0 = Release|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x64.ActiveCfg = Release|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x64.Build.0 = Release|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x86.ActiveCfg = Release|Any CPU - {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|x86.Build.0 = Release|Any CPU {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 @@ -214,47 +180,19 @@ Global {B2C3D4E5-0000-0000-0000-000000000000}.Release|x64.Build.0 = Release|Any CPU {B2C3D4E5-0000-0000-0000-000000000000}.Release|x86.ActiveCfg = Release|Any CPU {B2C3D4E5-0000-0000-0000-000000000000}.Release|x86.Build.0 = Release|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|x64.ActiveCfg = Debug|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|x64.Build.0 = Debug|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|x86.ActiveCfg = Debug|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|x86.Build.0 = Debug|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|Any CPU.Build.0 = Release|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|x64.ActiveCfg = Release|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|x64.Build.0 = Release|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|x86.ActiveCfg = Release|Any CPU - {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|x86.Build.0 = Release|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x64.ActiveCfg = Debug|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x64.Build.0 = Debug|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x86.ActiveCfg = Debug|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|x86.Build.0 = Debug|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.Build.0 = Release|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x64.ActiveCfg = Release|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x64.Build.0 = Release|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x86.ActiveCfg = Release|Any CPU - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {8CB883C0-99C3-4DD4-B017-F9B92010A806} = {C423C39A-44E7-4F09-B2F7-7943975FF948} - {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} {7A94C30C-6772-4F71-BF9C-0DF071A1BC70} = {C423C39A-44E7-4F09-B2F7-7943975FF948} {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7} = {C423C39A-44E7-4F09-B2F7-7943975FF948} {14E8C9A5-013E-49BA-B435-EFEFC77DD623} = {C423C39A-44E7-4F09-B2F7-7943975FF948} - {EB77976F-4DE4-46A5-8B25-D07226204C32} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} {9365803B-933D-4237-93C7-B502C855A71C} = {C423C39A-44E7-4F09-B2F7-7943975FF948} {C5F7A8B2-8D3E-4A1B-9C6E-7F4D5E2A9B1C} = {E5C75D32-5AD6-44DD-8F27-E32023206EBB} {A1B2C3D4-E5F6-7890-ABCD-EF1234567890} = {E5C75D32-5AD6-44DD-8F27-E32023206EBB} {B2C3D4E5-0000-0000-0000-000000000000} = {E5C75D32-5AD6-44DD-8F27-E32023206EBB} - {CCFA2CE7-A539-4ADC-B803-F759284C3463} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} - {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D} = {7AF32085-E7A6-4D06-BA6E-C6B1EBAEA99A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B5B1FD72-356F-4840-83E8-B070AC21C8D9} diff --git a/Cs_HMI/Project/Device/Xbee.cs b/Cs_HMI/Project/Device/Xbee.cs index fab85f2..fb68f33 100644 --- a/Cs_HMI/Project/Device/Xbee.cs +++ b/Cs_HMI/Project/Device/Xbee.cs @@ -173,7 +173,7 @@ namespace Project.Device */ try { - byte[] data = new byte[13]; // 총 13바이트 데이터 + byte[] data = new byte[12]; // 총 12바이트 데이터 // Mode data[0] = (byte)(VAR.BOOL[eVarBool.FLAG_AUTORUN] ? 1 : 0); @@ -186,47 +186,56 @@ namespace Project.Device else data[1] = 0; // stop - // Direction - if (PUB.AGV.system1.stop_by_front_detect) - data[2] = 3; // markstop - else if (VAR.BOOL[eVarBool.FLAG_LEFT_RUN]) - data[2] = 1; // left - else if (VAR.BOOL[eVarBool.FLAG_RIGHT_RUN]) - data[2] = 2; // right + // Motor Direction + if (PUB.AGV.data.Direction == 'F') + data[2] = 0; + else if (PUB.AGV.data.Direction == 'B') + data[2] = 1; else - data[2] = 0; // straight + data[2] = 0xff; //unknown + + // Magnet Direction + if (PUB.AGV.data.Sts == 'L') + data[3] = 1; // left + else if (PUB.AGV.data.Sts == 'R') + data[3] = 2; // right + else if (PUB.AGV.data.Sts == 'S') + data[3] = 0; // straight + else + data[3] = 0xFF; //unknown // Inposition - data[3] = (byte)(PUB.AGV.system1.agv_stop ? 1 : 0); + data[4] = (byte)(PUB.AGV.system1.agv_stop ? 1 : 0); // ChargeSt - data[4] = (byte)((VAR.BOOL[eVarBool.FLAG_CHARGEONA] || VAR.BOOL[eVarBool.FLAG_CHARGEONM]) ? 1 : 0); + data[5] = (byte)((VAR.BOOL[eVarBool.FLAG_CHARGEONA] || VAR.BOOL[eVarBool.FLAG_CHARGEONM]) ? 1 : 0); // CartSt if (PUB.AGV.signal.cart_detect1 && PUB.AGV.signal.cart_detect2) - data[5] = 1; // 센서두개가 모두 감지되는 경우 + data[6] = 1; // 센서두개가 모두 감지되는 경우 else if (PUB.AGV.signal.cart_detect1 == false && PUB.AGV.signal.cart_detect2 == false) - data[5] = 0; // 센서두개가 모두 감지되지 않는 경우 + data[6] = 0; // 센서두개가 모두 감지되지 않는 경우 else - data[5] = 2; // 센서하나만 감지되는 경우 + data[6] = 2; // 센서하나만 감지되는 경우 // LiftSt if (PUB.AGV.signal.lift_up) - data[6] = 1; // 위로 올라가는 경우 + data[7] = 1; // 위로 올라가는 경우 else if (PUB.AGV.signal.lift_down) - data[6] = 0; // 아래로 내려가는 경우 + data[7] = 0; // 아래로 내려가는 경우 else - data[6] = 2; // unknown (기본값) + data[7] = 2; // unknown (기본값) // LastTag - string lastTag = PUB.AGV.data.TagNo.ToString("000000") ?? "000000"; - byte[] tagBytes = Encoding.ASCII.GetBytes(lastTag.PadRight(6, '0')); - Array.Copy(tagBytes, 0, data, 7, 6); + string lastTag = PUB.AGV.data.TagNo.ToString("0000") ?? "0000"; + byte[] tagBytes = Encoding.ASCII.GetBytes(lastTag.PadRight(4, '0')); + Array.Copy(tagBytes, 0, data, 8, lastTag.Length); // 데이터 전송 var cmd = (byte)ENIGProtocol.AGVCommandEH.Status; var packet = proto.CreatePacket(PUB.setting.XBE_ID, cmd, data); - Send(packet); + if (Send(packet)) + PUB.logxbee.AddI($"Send status {packet.Length} {packet.HexString()}"); LastStatusSendTime = DateTime.Now; } catch (Exception ex) diff --git a/Cs_HMI/Project/StateMachine/_AGV.cs b/Cs_HMI/Project/StateMachine/_AGV.cs index f93f65d..94b5bad 100644 --- a/Cs_HMI/Project/StateMachine/_AGV.cs +++ b/Cs_HMI/Project/StateMachine/_AGV.cs @@ -195,7 +195,7 @@ namespace Project //모터방향 확인해서 UI와 AGV클래스에 적용한다 var MotDireciton = PUB.AGV.data.Direction == 'B' ? AGVNavigationCore.Models.AgvDirection.Backward : AGVNavigationCore.Models.AgvDirection.Forward; PUB._virtualAGV.SetPosition(CurrentNode, MotDireciton); - PUB._mapCanvas.SetAGVPosition("AGV", CurrentNode, MotDireciton); + PUB._mapCanvas.SetAGVPosition(PUB.setting.MCID, CurrentNode, MotDireciton); } break; case arDev.Narumi.DataType.ACK: diff --git a/Cs_HMI/Project/StateMachine/_Xbee.cs b/Cs_HMI/Project/StateMachine/_Xbee.cs index 8e33027..b4601d5 100644 --- a/Cs_HMI/Project/StateMachine/_Xbee.cs +++ b/Cs_HMI/Project/StateMachine/_Xbee.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; +using AGVNavigationCore.Models; +using AGVNavigationCore.Utils; using AR; using arDev; using COMM; @@ -22,82 +24,88 @@ namespace Project //ACS 수신 데이터 처리(타 장비는 확인하지 않는다) if (e.ReceivedPacket.ID == 0) { + var logPrefix = "ACS"; var data = e.ReceivedPacket.Data; - var dataStr = System.Text.Encoding.Default.GetString(data); var cmd = (ENIGProtocol.AGVCommandHE)e.ReceivedPacket.Command; - var TargetID = 0; - if (dataStr.Length >= 2) - { - //대상디바이스 - TargetID = Convert.ToByte(dataStr.Substring(0, 2), 16); - - //데이터영역을 다시 설정 - if (dataStr.Length > 2) dataStr = dataStr.Substring(2); - else dataStr = string.Empty; - } - else + if (data.Length < 1) { PUB.log.Add($"ACS 데이터에서 TARGET ID가 없습니다(data : first byte)"); + return; } + //대상디바이스 + var TargetID = data[0]; - if (PUB.setting.XBE_ID != TargetID) - return; + //해당 패킷의 대상이 나라면 처리한다. + if (PUB.setting.XBE_ID != TargetID) return; switch (cmd) { case ENIGProtocol.AGVCommandHE.SetCurrent: //Set Current Position - if (dataStr.Length == 6) + if (data.Length > 4) { - var targID = dataStr.Substring(0, 2); - var targstr = dataStr.Substring(2); - - if (byte.TryParse(targID, out byte tID)) + var currTag = System.Text.Encoding.Default.GetString(data, 1, data.Length - 1); + var node = PUB._mapNodes.FirstOrDefault(t => t.RfidId == currTag); + if (node == null) { - if (PUB.setting.XBE_ID == tID) - { - if (ushort.TryParse(targstr, out ushort tagno)) - { - //if (PUB.mapctl.SetCurrentPosition(tagno) == true) - //{ - // PUB.log.AddI($"Set Position:{tagno}"); - //} - //else PUB.log.AddE($"Position Set Error:{tagno}"); - } - else PUB.log.AddE($"Position Param(tagstr) Error:{dataStr}"); - } - else PUB.log.AddI($"Another Target {tID}:{PUB.setting.XBE_ID}"); + PUB.log.AddE($"[{logPrefix}-SetCurrent] 노드정보를 찾을 수 없습니다 RFID:{currTag}"); + PUB.XBE.SendError(ENIGProtocol.AGVErrorCode.EmptyNode, $"{currTag}"); + return; } - else PUB.log.AddE($"Position Param(targetid) Error:{dataStr}"); + PUB._mapCanvas.SetAGVPosition(PUB.setting.MCID, node, PUB._virtualAGV.CurrentDirection); } - else PUB.log.AddE($"Position Param Error:{dataStr}"); - + else PUB.log.AddE($"[{logPrefix}-SetCurrent] TagString Lenght Errorr:{data.Length}"); break; + case ENIGProtocol.AGVCommandHE.Goto: //move to tag - if (uint.TryParse(dataStr, out uint tagno2)) + if (data.Length > 4) { - //var currPos = PUB.mapctl.Manager.agv.CurrentRFID;///.AGVMoveToRFID(; - //if (PUB.mapctl.SetTargetPosition(tagno2)) - // PUB.log.AddI($"New Target {tagno2}"); - //else - // PUB.log.AddE($"Path Error {tagno2}"); + var currTag = System.Text.Encoding.Default.GetString(data, 1, data.Length - 1); + var targetNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId == currTag); + if (targetNode == null) + { + PUB.log.AddE($"[{logPrefix}-Goto] 노드정보를 찾을 수 없습니다 RFID:{currTag}"); + PUB.XBE.SendError(ENIGProtocol.AGVErrorCode.EmptyNode, $"{currTag}"); + return; + } + + var startNode = PUB._mapNodes.FirstOrDefault(t => t.RfidId == PUB._virtualAGV.CurrentNodeId); + if (startNode == null) + { + PUB.log.AddE($"[{logPrefix}-Goto] 노드정보를 찾을 수 없습니다 RFID:{PUB._virtualAGV.CurrentNodeId}"); + PUB.XBE.SendError(ENIGProtocol.AGVErrorCode.EmptyNode, $"{PUB._virtualAGV.CurrentNodeId}"); + return; + } + + var rltGoto = CalcPath(startNode, targetNode); + if (rltGoto.result == false) + { + PUB.log.AddE($"[{logPrefix}-Goto] {rltGoto.message}"); + PUB.XBE.SendError(ENIGProtocol.AGVErrorCode.Goto, rltGoto.message); + return; + } + + //Move to + PUB.log.Add($"[{logPrefix}-Goto] {startNode.RfidId} -> {targetNode.RfidId}"); } - else PUB.log.AddE($"Path Param Error :{dataStr}"); + else PUB.log.AddE($"[{logPrefix}-Goto] TagString Lenght Errorr:{data.Length}"); break; + case ENIGProtocol.AGVCommandHE.Stop: //stop + PUB.log.Add($"[{logPrefix}-Stop]"); PUB.AGV.AGVMoveStop("xbee"); break; case ENIGProtocol.AGVCommandHE.Reset: //Error Reset + PUB.log.Add($"[{logPrefix}-Reset]"); PUB.AGV.AGVErrorReset(); break; case ENIGProtocol.AGVCommandHE.Manual: //Manual Move (Direction, speed, runtime) - var Direction = data[0]; //0=back, 1=forward, 2=left, 3=right - var Speed = data[1]; //0=slow, 1=normal, 2=fast - var Runtime = data[2]; // running seconds + var Direction = data[1]; //0=back, 1=forward, 2=left, 3=right + var Speed = data[2]; //0=slow, 1=normal, 2=fast arDev.Narumi.ManulOpt opt = arDev.Narumi.ManulOpt.BS; arDev.Narumi.Speed spd = arDev.Narumi.Speed.Low; @@ -111,27 +119,63 @@ namespace Project else if (Direction == 2) opt = arDev.Narumi.ManulOpt.LT; else if (Direction == 3) opt = arDev.Narumi.ManulOpt.RT; + PUB.log.Add($"[{logPrefix}-Manual] DIR:{opt},SPD:{spd}"); PUB.AGV.AGVMoveManual(opt, spd, arDev.Narumi.Sensor.PBSOn); break; - case ENIGProtocol.AGVCommandHE.MarkStop: //Set MarkStop - var MarkStop = data[0]; //0=off, 1=on + case ENIGProtocol.AGVCommandHE.AutoMove: + var MotDirection = data[1]; //0=back, 1=forward + var MagDirection = data[2]; //0=straight, 1=left, 2=right + var AutSpeed = data[3]; //0=slow, 1=normal, 2=fast + + var bunkidata = new arDev.Narumi.BunkiData(); + + //speed; + if (AutSpeed == 1) bunkidata.Speed = arDev.Narumi.eMoveSpd.Middle; + else if (AutSpeed == 2) bunkidata.Speed = arDev.Narumi.eMoveSpd.High; + else bunkidata.Speed = arDev.Narumi.eMoveSpd.Low; + + //motor direction + if (MotDirection == 0) bunkidata.Direction = arDev.Narumi.eMoveDir.Backward; + else bunkidata.Direction = arDev.Narumi.eMoveDir.Forward; + + if (MagDirection == 2) bunkidata.Bunki = arDev.Narumi.eBunki.Right; + else if (MagDirection == 1) bunkidata.Bunki = arDev.Narumi.eBunki.Left; + else bunkidata.Bunki = arDev.Narumi.eBunki.Strate; + + PUB.log.Add($"[{logPrefix}-AutoMove] DIR:{bunkidata.Direction}-{bunkidata.Bunki},SPD:{bunkidata.Speed}"); + PUB.AGV.AGVMoveSet(bunkidata); + PUB.AGV.AGVMoveRun(); + break; + + case ENIGProtocol.AGVCommandHE.MarkStop: //Set MarkStop //마크센서에서 멈추게 한다 + PUB.log.Add($"[{logPrefix}-MarkStop]"); PUB.AGV.AGVMoveStop("Xbee", arDev.Narumi.eStopOpt.MarkStop); break; + case ENIGProtocol.AGVCommandHE.LiftControl: //Lift Control - var LiftCommand = data[0]; //0=stop, 1=up, 2=down + var LiftCommand = data[1]; //0=stop, 1=up, 2=down + arDev.Narumi.LiftCommand LCmd = arDev.Narumi.LiftCommand.STP; if (LiftCommand == 1) LCmd = arDev.Narumi.LiftCommand.UP; else if (LiftCommand == 2) LCmd = arDev.Narumi.LiftCommand.DN; - - //리프트제어 - PUB.AGV.LiftControl(LCmd); + + PUB.log.Add($"[{logPrefix}-LiftControl] {LCmd}"); + PUB.AGV.LiftControl(LCmd); //리프트제어 break; + case ENIGProtocol.AGVCommandHE.ChargeControl: //충전을 제어한다 + var chargeAction = data[1] == 1; //0= off, 1=on - - + //충전시퀀스가 진행되지 않았다면 진행한다 + if(PUB.sm.RunStep == StateMachine.ERunStep.GOCHARGE && PUB.sm.RunStepNew != StateMachine.ERunStep.GOCHARGE) + { + PUB.sm.SetNewRunStep(StateMachine.ERunStep.GOCHARGE); + PUB.log.AddI($"충전을 시작합니다"); + } + break; + } } } @@ -142,6 +186,60 @@ namespace Project else PUB.log.Add(e.Message); } + AGVNavigationCore.PathFinding.Planning.AGVPathfinder _advancedPathfinder = null; + (bool result, string message) CalcPath(MapNode startNode, MapNode targetNode) + { + var _mapNodes = PUB._mapNodes; + // 시작 RFID가 없으면 AGV 현재 위치로 설정 + if (startNode == null || targetNode == null) + return (false, "시작 RFID와 목표 RFID를 선택해주세요."); + + //경로계산기확인 + if (_advancedPathfinder == null) + _advancedPathfinder = new AGVNavigationCore.PathFinding.Planning.AGVPathfinder(_mapNodes); + + // 현재 AGV 방향 가져오기 + var selectedAGV = PUB._virtualAGV; + var currentDirection = selectedAGV.CurrentDirection; + + // AGV의 이전 위치에서 가장 가까운 노드 찾기 + var prevNode = selectedAGV.PrevNode; + var prevDir = selectedAGV.PrevDirection; + + // 고급 경로 계획 사용 (노드 객체 직접 전달) + var advancedResult = _advancedPathfinder.FindPath(startNode, targetNode, prevNode, prevDir, currentDirection); + + var _simulatorCanvas = PUB._mapCanvas; + + _simulatorCanvas.FitToNodes(); + if (advancedResult.Success) + { + // 도킹 검증이 없는 경우 추가 검증 수행 + if (advancedResult.DockingValidation == null || !advancedResult.DockingValidation.IsValidationRequired) + advancedResult.DockingValidation = DockingValidator.ValidateDockingDirection(advancedResult, _mapNodes); + + _simulatorCanvas.CurrentPath = advancedResult; + //_pathLengthLabel.Text = $"경로 길이: {advancedResult.TotalDistance:F1}"; + //_statusLabel.Text = $"경로 계산 완료 ({advancedResult.CalculationTimeMs}ms)"; + + // 🔥 VirtualAGV에도 경로 설정 (Predict()가 동작하려면 필요) + selectedAGV.SetPath(advancedResult); + + // 도킹 검증 결과 확인 및 UI 표시 + //CheckAndDisplayDockingValidation(advancedResult); + + // 고급 경로 디버깅 정보 표시 + //UpdateAdvancedPathDebugInfo(advancedResult); + return (true, string.Empty); + } + else + { + // 경로 실패시 디버깅 정보 초기화 + //_pathDebugLabel.Text = $"경로: 실패 - {advancedResult.ErrorMessage}"; + return (false, $"경로를 찾을 수 없습니다:\n{advancedResult.ErrorMessage}"); + } + } + } } diff --git a/Cs_HMI/SubProject/EnigProtocol b/Cs_HMI/SubProject/EnigProtocol index 6c8ed6d..4f360f3 160000 --- a/Cs_HMI/SubProject/EnigProtocol +++ b/Cs_HMI/SubProject/EnigProtocol @@ -1 +1 @@ -Subproject commit 6c8ed6d2f23ac3fc9ffc68738e42e28400d4df7e +Subproject commit 4f360f33a7abbd77c517ca2492ccbde53e687099 diff --git a/Cs_HMI/TestProject/Test.sln b/Cs_HMI/TestProject/Test.sln new file mode 100644 index 0000000..f257d59 --- /dev/null +++ b/Cs_HMI/TestProject/Test.sln @@ -0,0 +1,75 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 15 for Windows Desktop +VisualStudioVersion = 15.0.36324.19 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_ACS", "Test_ACS\Test_ACS.csproj", "{A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_BMS", "Test_BMS\Test_BMS.csproj", "{CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Narumi", "Test_Narumi\Test_Narumi.csproj", "{EB77976F-4DE4-46A5-8B25-D07226204C32}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Port", "Test_Port\Test_Port.csproj", "{CCFA2CE7-A539-4ADC-B803-F759284C3463}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{530A4517-6210-422B-8CB4-B7D194EE70BE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BMS", "..\SubProject\BMS\BMS.csproj", "{7A94C30C-6772-4F71-BF9C-0DF071A1BC70}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommData", "..\SubProject\CommData\CommData.csproj", "{14E8C9A5-013E-49BA-B435-EFEFC77DD623}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ENIGProtocol", "..\SubProject\EnigProtocol\enigprotocol\ENIGProtocol.csproj", "{9365803B-933D-4237-93C7-B502C855A71C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NARUMI", "..\SubProject\AGV\NARUMI.csproj", "{8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.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}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE3FFF9F-6ACA-44BD-B64A-33FF4AD5E82E}.Release|Any CPU.Build.0 = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB77976F-4DE4-46A5-8B25-D07226204C32}.Release|Any CPU.Build.0 = Release|Any CPU + {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCFA2CE7-A539-4ADC-B803-F759284C3463}.Release|Any CPU.Build.0 = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70}.Release|Any CPU.Build.0 = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14E8C9A5-013E-49BA-B435-EFEFC77DD623}.Release|Any CPU.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}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9365803B-933D-4237-93C7-B502C855A71C}.Release|Any CPU.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}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {7A94C30C-6772-4F71-BF9C-0DF071A1BC70} = {530A4517-6210-422B-8CB4-B7D194EE70BE} + {14E8C9A5-013E-49BA-B435-EFEFC77DD623} = {530A4517-6210-422B-8CB4-B7D194EE70BE} + {9365803B-933D-4237-93C7-B502C855A71C} = {530A4517-6210-422B-8CB4-B7D194EE70BE} + {8BAE0EAC-3D25-402F-9A65-2BA1ECFE28B7} = {530A4517-6210-422B-8CB4-B7D194EE70BE} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E9528217-EC4E-4991-B3C9-AE371EDFA28F} + EndGlobalSection +EndGlobal diff --git a/Cs_HMI/TestProject/Test_ACS/MainForm.Designer.cs b/Cs_HMI/TestProject/Test_ACS/MainForm.Designer.cs index 5e4ac2d..10095fa 100644 --- a/Cs_HMI/TestProject/Test_ACS/MainForm.Designer.cs +++ b/Cs_HMI/TestProject/Test_ACS/MainForm.Designer.cs @@ -17,6 +17,7 @@ namespace Test_ACS private void InitializeComponent() { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.grpConnection = new System.Windows.Forms.GroupBox(); this.btnRefresh = new System.Windows.Forms.Button(); this.btnConnect = new System.Windows.Forms.Button(); @@ -33,13 +34,12 @@ namespace Test_ACS this.btnLiftDown = new System.Windows.Forms.Button(); this.btnLiftUp = new System.Windows.Forms.Button(); this.grpManual = new System.Windows.Forms.GroupBox(); - this.btnManual = new System.Windows.Forms.Button(); + this.btMMove = new System.Windows.Forms.Button(); this.numRuntime = new System.Windows.Forms.NumericUpDown(); this.lblRuntime = new System.Windows.Forms.Label(); this.cmbSpeed = new System.Windows.Forms.ComboBox(); this.lblSpeed = new System.Windows.Forms.Label(); this.cmbDirection = new System.Windows.Forms.ComboBox(); - this.lblDirection = new System.Windows.Forms.Label(); this.chkMarkStop = new System.Windows.Forms.CheckBox(); this.btnMarkStop = new System.Windows.Forms.Button(); this.btnReset = new System.Windows.Forms.Button(); @@ -49,16 +49,21 @@ namespace Test_ACS this.btnSetCurrent = new System.Windows.Forms.Button(); this.txtAlias = new System.Windows.Forms.TextBox(); this.lblAlias = new System.Windows.Forms.Label(); - this.txtRFID = new System.Windows.Forms.TextBox(); + this.txtRFID = new System.Windows.Forms.NumericUpDown(); this.lblRFID = new System.Windows.Forms.Label(); + this.lblDirection = new System.Windows.Forms.Label(); this.grpLogs = new System.Windows.Forms.GroupBox(); this.tabLogs = new System.Windows.Forms.TabControl(); this.tabRX = new System.Windows.Forms.TabPage(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.txtRxLog = new System.Windows.Forms.TextBox(); - this.tabTX = new System.Windows.Forms.TabPage(); this.txtTxLog = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); this.tabInfo = new System.Windows.Forms.TabPage(); this.txtInfoLog = new System.Windows.Forms.TextBox(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.grpAGVStatus = new System.Windows.Forms.GroupBox(); this.lblLastTagValue = new System.Windows.Forms.Label(); this.lblLastTag = new System.Windows.Forms.Label(); @@ -75,18 +80,29 @@ namespace Test_ACS this.lblRunSt = new System.Windows.Forms.Label(); this.lblModeValue = new System.Windows.Forms.Label(); this.lblMode = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btAMove = new System.Windows.Forms.Button(); + this.cmbAutoSpeed = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbMotDirection = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.cmbMagDirection = new System.Windows.Forms.ComboBox(); this.grpConnection.SuspendLayout(); this.grpAGV.SuspendLayout(); this.grpCommands.SuspendLayout(); this.grpLift.SuspendLayout(); this.grpManual.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numRuntime)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtRFID)).BeginInit(); this.grpLogs.SuspendLayout(); this.tabLogs.SuspendLayout(); this.tabRX.SuspendLayout(); - this.tabTX.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); this.tabInfo.SuspendLayout(); + this.tabPage1.SuspendLayout(); this.grpAGVStatus.SuspendLayout(); + this.groupBox1.SuspendLayout(); this.SuspendLayout(); // // grpConnection @@ -199,7 +215,7 @@ namespace Test_ACS // // grpCommands // - this.grpCommands.Controls.Add(this.grpLift); + this.grpCommands.Controls.Add(this.groupBox1); this.grpCommands.Controls.Add(this.grpManual); this.grpCommands.Controls.Add(this.chkMarkStop); this.grpCommands.Controls.Add(this.btnMarkStop); @@ -224,18 +240,18 @@ namespace Test_ACS this.grpLift.Controls.Add(this.btnLiftStop); this.grpLift.Controls.Add(this.btnLiftDown); this.grpLift.Controls.Add(this.btnLiftUp); - this.grpLift.Location = new System.Drawing.Point(240, 202); + this.grpLift.Location = new System.Drawing.Point(298, 456); this.grpLift.Name = "grpLift"; - this.grpLift.Size = new System.Drawing.Size(210, 100); + this.grpLift.Size = new System.Drawing.Size(180, 120); this.grpLift.TabIndex = 9; this.grpLift.TabStop = false; this.grpLift.Text = "리프트 제어"; // // btnLiftStop // - this.btnLiftStop.Location = new System.Drawing.Point(135, 20); + this.btnLiftStop.Location = new System.Drawing.Point(121, 20); this.btnLiftStop.Name = "btnLiftStop"; - this.btnLiftStop.Size = new System.Drawing.Size(60, 70); + this.btnLiftStop.Size = new System.Drawing.Size(48, 90); this.btnLiftStop.TabIndex = 2; this.btnLiftStop.Text = "정지"; this.btnLiftStop.UseVisualStyleBackColor = true; @@ -243,9 +259,9 @@ namespace Test_ACS // // btnLiftDown // - this.btnLiftDown.Location = new System.Drawing.Point(70, 20); + this.btnLiftDown.Location = new System.Drawing.Point(65, 20); this.btnLiftDown.Name = "btnLiftDown"; - this.btnLiftDown.Size = new System.Drawing.Size(60, 70); + this.btnLiftDown.Size = new System.Drawing.Size(48, 90); this.btnLiftDown.TabIndex = 1; this.btnLiftDown.Text = "하강"; this.btnLiftDown.UseVisualStyleBackColor = true; @@ -253,9 +269,9 @@ namespace Test_ACS // // btnLiftUp // - this.btnLiftUp.Location = new System.Drawing.Point(5, 20); + this.btnLiftUp.Location = new System.Drawing.Point(9, 20); this.btnLiftUp.Name = "btnLiftUp"; - this.btnLiftUp.Size = new System.Drawing.Size(60, 70); + this.btnLiftUp.Size = new System.Drawing.Size(48, 90); this.btnLiftUp.TabIndex = 0; this.btnLiftUp.Text = "상승"; this.btnLiftUp.UseVisualStyleBackColor = true; @@ -263,7 +279,7 @@ namespace Test_ACS // // grpManual // - this.grpManual.Controls.Add(this.btnManual); + this.grpManual.Controls.Add(this.btMMove); this.grpManual.Controls.Add(this.numRuntime); this.grpManual.Controls.Add(this.lblRuntime); this.grpManual.Controls.Add(this.cmbSpeed); @@ -274,17 +290,17 @@ namespace Test_ACS this.grpManual.Size = new System.Drawing.Size(215, 100); this.grpManual.TabIndex = 8; this.grpManual.TabStop = false; - this.grpManual.Text = "수동 제어"; + this.grpManual.Text = "수동 이동"; // - // btnManual + // btMMove // - this.btnManual.Location = new System.Drawing.Point(136, 16); - this.btnManual.Name = "btnManual"; - this.btnManual.Size = new System.Drawing.Size(73, 74); - this.btnManual.TabIndex = 6; - this.btnManual.Text = "수동\r\n이동\r\n실행"; - this.btnManual.UseVisualStyleBackColor = true; - this.btnManual.Click += new System.EventHandler(this.btnManual_Click); + this.btMMove.Location = new System.Drawing.Point(136, 16); + this.btMMove.Name = "btMMove"; + this.btMMove.Size = new System.Drawing.Size(73, 74); + this.btMMove.TabIndex = 6; + this.btMMove.Text = "실행"; + this.btMMove.UseVisualStyleBackColor = true; + this.btMMove.Click += new System.EventHandler(this.btnManual_Click); // // numRuntime // @@ -297,6 +313,7 @@ namespace Test_ACS this.numRuntime.Name = "numRuntime"; this.numRuntime.Size = new System.Drawing.Size(70, 21); this.numRuntime.TabIndex = 5; + this.numRuntime.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; this.numRuntime.Value = new decimal(new int[] { 5, 0, @@ -348,15 +365,6 @@ namespace Test_ACS this.cmbDirection.Size = new System.Drawing.Size(70, 20); this.cmbDirection.TabIndex = 1; // - // lblDirection - // - this.lblDirection.AutoSize = true; - this.lblDirection.Location = new System.Drawing.Point(10, 48); - this.lblDirection.Name = "lblDirection"; - this.lblDirection.Size = new System.Drawing.Size(33, 12); - this.lblDirection.TabIndex = 4; - this.lblDirection.Text = "방향:"; - // // chkMarkStop // this.chkMarkStop.AutoSize = true; @@ -451,11 +459,20 @@ namespace Test_ACS // this.txtRFID.Font = new System.Drawing.Font("Consolas", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.txtRFID.Location = new System.Drawing.Point(85, 25); + this.txtRFID.Maximum = new decimal(new int[] { + 999999, + 0, + 0, + 0}); this.txtRFID.Name = "txtRFID"; this.txtRFID.Size = new System.Drawing.Size(195, 26); this.txtRFID.TabIndex = 1; - this.txtRFID.Text = "0001"; this.txtRFID.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.txtRFID.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); this.txtRFID.TextChanged += new System.EventHandler(this.txtRFID_TextChanged); // // lblRFID @@ -467,6 +484,15 @@ namespace Test_ACS this.lblRFID.TabIndex = 0; this.lblRFID.Text = "RFID 번호:"; // + // lblDirection + // + this.lblDirection.AutoSize = true; + this.lblDirection.Location = new System.Drawing.Point(10, 48); + this.lblDirection.Name = "lblDirection"; + this.lblDirection.Size = new System.Drawing.Size(33, 12); + this.lblDirection.TabIndex = 4; + this.lblDirection.Text = "방향:"; + // // grpLogs // this.grpLogs.Controls.Add(this.tabLogs); @@ -480,8 +506,8 @@ namespace Test_ACS // tabLogs // this.tabLogs.Controls.Add(this.tabRX); - this.tabLogs.Controls.Add(this.tabTX); this.tabLogs.Controls.Add(this.tabInfo); + this.tabLogs.Controls.Add(this.tabPage1); this.tabLogs.Dock = System.Windows.Forms.DockStyle.Fill; this.tabLogs.Location = new System.Drawing.Point(3, 17); this.tabLogs.Name = "tabLogs"; @@ -491,56 +517,85 @@ namespace Test_ACS // // tabRX // - this.tabRX.Controls.Add(this.txtRxLog); + this.tabRX.Controls.Add(this.tableLayoutPanel1); this.tabRX.Location = new System.Drawing.Point(4, 22); this.tabRX.Name = "tabRX"; this.tabRX.Padding = new System.Windows.Forms.Padding(3); this.tabRX.Size = new System.Drawing.Size(506, 518); this.tabRX.TabIndex = 1; - this.tabRX.Text = "수신 (RX)"; + this.tabRX.Text = "패킷"; this.tabRX.UseVisualStyleBackColor = true; // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.txtRxLog, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.txtTxLog, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(500, 512); + this.tableLayoutPanel1.TabIndex = 1; + // // txtRxLog // this.txtRxLog.Dock = System.Windows.Forms.DockStyle.Fill; this.txtRxLog.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.txtRxLog.Location = new System.Drawing.Point(3, 3); + this.txtRxLog.Location = new System.Drawing.Point(3, 279); this.txtRxLog.Multiline = true; this.txtRxLog.Name = "txtRxLog"; this.txtRxLog.ReadOnly = true; this.txtRxLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtRxLog.Size = new System.Drawing.Size(500, 512); + this.txtRxLog.Size = new System.Drawing.Size(494, 230); this.txtRxLog.TabIndex = 0; - // - // tabTX - // - this.tabTX.Controls.Add(this.txtTxLog); - this.tabTX.Location = new System.Drawing.Point(4, 22); - this.tabTX.Name = "tabTX"; - this.tabTX.Padding = new System.Windows.Forms.Padding(3); - this.tabTX.Size = new System.Drawing.Size(506, 469); - this.tabTX.TabIndex = 0; - this.tabTX.Text = "송신 (TX)"; - this.tabTX.UseVisualStyleBackColor = true; + this.txtRxLog.Text = "1"; // // txtTxLog // this.txtTxLog.Dock = System.Windows.Forms.DockStyle.Fill; this.txtTxLog.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.txtTxLog.Location = new System.Drawing.Point(3, 3); + this.txtTxLog.Location = new System.Drawing.Point(3, 23); this.txtTxLog.Multiline = true; this.txtTxLog.Name = "txtTxLog"; this.txtTxLog.ReadOnly = true; this.txtTxLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtTxLog.Size = new System.Drawing.Size(500, 463); + this.txtTxLog.Size = new System.Drawing.Size(494, 230); this.txtTxLog.TabIndex = 0; // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Fill; + this.label1.Location = new System.Drawing.Point(3, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(494, 20); + this.label1.TabIndex = 1; + this.label1.Text = "Tx"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label2 + // + this.label2.Dock = System.Windows.Forms.DockStyle.Fill; + this.label2.Location = new System.Drawing.Point(3, 256); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(494, 20); + this.label2.TabIndex = 1; + this.label2.Text = "Rx"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // // tabInfo // this.tabInfo.Controls.Add(this.txtInfoLog); this.tabInfo.Location = new System.Drawing.Point(4, 22); this.tabInfo.Name = "tabInfo"; - this.tabInfo.Size = new System.Drawing.Size(506, 469); + this.tabInfo.Size = new System.Drawing.Size(506, 518); this.tabInfo.TabIndex = 2; this.tabInfo.Text = "정보"; this.tabInfo.UseVisualStyleBackColor = true; @@ -554,9 +609,31 @@ namespace Test_ACS this.txtInfoLog.Name = "txtInfoLog"; this.txtInfoLog.ReadOnly = true; this.txtInfoLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtInfoLog.Size = new System.Drawing.Size(506, 469); + this.txtInfoLog.Size = new System.Drawing.Size(506, 518); this.txtInfoLog.TabIndex = 0; // + // tabPage1 + // + this.tabPage1.Controls.Add(this.richTextBox1); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Size = new System.Drawing.Size(506, 518); + this.tabPage1.TabIndex = 3; + this.tabPage1.Text = "프레임구조"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // richTextBox1 + // + this.richTextBox1.BackColor = System.Drawing.Color.WhiteSmoke; + this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.richTextBox1.Location = new System.Drawing.Point(0, 0); + this.richTextBox1.Margin = new System.Windows.Forms.Padding(10); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.Size = new System.Drawing.Size(506, 518); + this.richTextBox1.TabIndex = 0; + this.richTextBox1.Text = resources.GetString("richTextBox1.Text"); + // // grpAGVStatus // this.grpAGVStatus.Controls.Add(this.lblLastTagValue); @@ -577,7 +654,7 @@ namespace Test_ACS this.grpAGVStatus.Controls.Add(this.lblMode); this.grpAGVStatus.Location = new System.Drawing.Point(12, 456); this.grpAGVStatus.Name = "grpAGVStatus"; - this.grpAGVStatus.Size = new System.Drawing.Size(466, 120); + this.grpAGVStatus.Size = new System.Drawing.Size(280, 120); this.grpAGVStatus.TabIndex = 4; this.grpAGVStatus.TabStop = false; this.grpAGVStatus.Text = "AGV 상태"; @@ -586,7 +663,7 @@ namespace Test_ACS // this.lblLastTagValue.AutoSize = true; this.lblLastTagValue.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Bold); - this.lblLastTagValue.Location = new System.Drawing.Point(310, 98); + this.lblLastTagValue.Location = new System.Drawing.Point(221, 98); this.lblLastTagValue.Name = "lblLastTagValue"; this.lblLastTagValue.Size = new System.Drawing.Size(14, 14); this.lblLastTagValue.TabIndex = 15; @@ -595,7 +672,7 @@ namespace Test_ACS // lblLastTag // this.lblLastTag.AutoSize = true; - this.lblLastTag.Location = new System.Drawing.Point(240, 98); + this.lblLastTag.Location = new System.Drawing.Point(151, 98); this.lblLastTag.Name = "lblLastTag"; this.lblLastTag.Size = new System.Drawing.Size(57, 12); this.lblLastTag.TabIndex = 14; @@ -624,7 +701,7 @@ namespace Test_ACS // this.lblCartStValue.AutoSize = true; this.lblCartStValue.Font = new System.Drawing.Font("굴림", 9F, System.Drawing.FontStyle.Bold); - this.lblCartStValue.Location = new System.Drawing.Point(310, 73); + this.lblCartStValue.Location = new System.Drawing.Point(221, 73); this.lblCartStValue.Name = "lblCartStValue"; this.lblCartStValue.Size = new System.Drawing.Size(12, 12); this.lblCartStValue.TabIndex = 11; @@ -633,7 +710,7 @@ namespace Test_ACS // lblCartSt // this.lblCartSt.AutoSize = true; - this.lblCartSt.Location = new System.Drawing.Point(240, 73); + this.lblCartSt.Location = new System.Drawing.Point(151, 73); this.lblCartSt.Name = "lblCartSt"; this.lblCartSt.Size = new System.Drawing.Size(33, 12); this.lblCartSt.TabIndex = 10; @@ -662,7 +739,7 @@ namespace Test_ACS // this.lblInpositionValue.AutoSize = true; this.lblInpositionValue.Font = new System.Drawing.Font("굴림", 9F, System.Drawing.FontStyle.Bold); - this.lblInpositionValue.Location = new System.Drawing.Point(310, 48); + this.lblInpositionValue.Location = new System.Drawing.Point(221, 48); this.lblInpositionValue.Name = "lblInpositionValue"; this.lblInpositionValue.Size = new System.Drawing.Size(12, 12); this.lblInpositionValue.TabIndex = 7; @@ -671,7 +748,7 @@ namespace Test_ACS // lblInposition // this.lblInposition.AutoSize = true; - this.lblInposition.Location = new System.Drawing.Point(240, 48); + this.lblInposition.Location = new System.Drawing.Point(151, 48); this.lblInposition.Name = "lblInposition"; this.lblInposition.Size = new System.Drawing.Size(57, 12); this.lblInposition.TabIndex = 6; @@ -691,7 +768,7 @@ namespace Test_ACS // this.lblRunStValue.AutoSize = true; this.lblRunStValue.Font = new System.Drawing.Font("굴림", 9F, System.Drawing.FontStyle.Bold); - this.lblRunStValue.Location = new System.Drawing.Point(310, 23); + this.lblRunStValue.Location = new System.Drawing.Point(221, 23); this.lblRunStValue.Name = "lblRunStValue"; this.lblRunStValue.Size = new System.Drawing.Size(12, 12); this.lblRunStValue.TabIndex = 3; @@ -700,7 +777,7 @@ namespace Test_ACS // lblRunSt // this.lblRunSt.AutoSize = true; - this.lblRunSt.Location = new System.Drawing.Point(240, 23); + this.lblRunSt.Location = new System.Drawing.Point(151, 23); this.lblRunSt.Name = "lblRunSt"; this.lblRunSt.Size = new System.Drawing.Size(57, 12); this.lblRunSt.TabIndex = 2; @@ -725,11 +802,103 @@ namespace Test_ACS this.lblMode.TabIndex = 0; this.lblMode.Text = "모드:"; // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.cmbMagDirection); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.btAMove); + this.groupBox1.Controls.Add(this.cmbAutoSpeed); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.cmbMotDirection); + this.groupBox1.Location = new System.Drawing.Point(240, 202); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(215, 100); + this.groupBox1.TabIndex = 8; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "자동 이동"; + // + // btAMove + // + this.btAMove.Location = new System.Drawing.Point(128, 16); + this.btAMove.Name = "btAMove"; + this.btAMove.Size = new System.Drawing.Size(81, 74); + this.btAMove.TabIndex = 6; + this.btAMove.Text = "이동"; + this.btAMove.UseVisualStyleBackColor = true; + this.btAMove.Click += new System.EventHandler(this.btAMove_Click); + // + // cmbAutoSpeed + // + this.cmbAutoSpeed.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbAutoSpeed.FormattingEnabled = true; + this.cmbAutoSpeed.Items.AddRange(new object[] { + "느림", + "보통", + "빠름"}); + this.cmbAutoSpeed.Location = new System.Drawing.Point(52, 69); + this.cmbAutoSpeed.Name = "cmbAutoSpeed"; + this.cmbAutoSpeed.Size = new System.Drawing.Size(70, 20); + this.cmbAutoSpeed.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(14, 73); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(29, 12); + this.label4.TabIndex = 2; + this.label4.Text = "속도"; + // + // cmbMotDirection + // + this.cmbMotDirection.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbMotDirection.FormattingEnabled = true; + this.cmbMotDirection.Items.AddRange(new object[] { + "후진", + "전진"}); + this.cmbMotDirection.Location = new System.Drawing.Point(52, 16); + this.cmbMotDirection.Name = "cmbMotDirection"; + this.cmbMotDirection.Size = new System.Drawing.Size(70, 20); + this.cmbMotDirection.TabIndex = 1; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(13, 21); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(29, 12); + this.label5.TabIndex = 7; + this.label5.Text = "모터"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(13, 47); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(29, 12); + this.label3.TabIndex = 9; + this.label3.Text = "방향"; + // + // cmbMagDirection + // + this.cmbMagDirection.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbMagDirection.FormattingEnabled = true; + this.cmbMagDirection.Items.AddRange(new object[] { + "직진", + "좌", + "우"}); + this.cmbMagDirection.Location = new System.Drawing.Point(52, 42); + this.cmbMagDirection.Name = "cmbMagDirection"; + this.cmbMagDirection.Size = new System.Drawing.Size(70, 20); + this.cmbMagDirection.TabIndex = 8; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1016, 588); + this.Controls.Add(this.grpLift); this.Controls.Add(this.grpAGVStatus); this.Controls.Add(this.grpLogs); this.Controls.Add(this.grpCommands); @@ -750,16 +919,19 @@ namespace Test_ACS this.grpManual.ResumeLayout(false); this.grpManual.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numRuntime)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtRFID)).EndInit(); this.grpLogs.ResumeLayout(false); this.tabLogs.ResumeLayout(false); this.tabRX.ResumeLayout(false); - this.tabRX.PerformLayout(); - this.tabTX.ResumeLayout(false); - this.tabTX.PerformLayout(); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); this.tabInfo.ResumeLayout(false); this.tabInfo.PerformLayout(); + this.tabPage1.ResumeLayout(false); this.grpAGVStatus.ResumeLayout(false); this.grpAGVStatus.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); this.ResumeLayout(false); } @@ -777,7 +949,7 @@ namespace Test_ACS private System.Windows.Forms.RadioButton rbAGV1; private System.Windows.Forms.GroupBox grpCommands; private System.Windows.Forms.Button btnSetCurrent; - private System.Windows.Forms.TextBox txtRFID; + private System.Windows.Forms.NumericUpDown txtRFID; private System.Windows.Forms.Label lblRFID; private System.Windows.Forms.Button btnGoto; private System.Windows.Forms.Button btnStop; @@ -785,7 +957,7 @@ namespace Test_ACS private System.Windows.Forms.Button btnMarkStop; private System.Windows.Forms.CheckBox chkMarkStop; private System.Windows.Forms.GroupBox grpManual; - private System.Windows.Forms.Button btnManual; + private System.Windows.Forms.Button btMMove; private System.Windows.Forms.NumericUpDown numRuntime; private System.Windows.Forms.Label lblRuntime; private System.Windows.Forms.ComboBox cmbSpeed; @@ -797,7 +969,6 @@ namespace Test_ACS private System.Windows.Forms.Button btnLiftUp; private System.Windows.Forms.GroupBox grpLogs; private System.Windows.Forms.TabControl tabLogs; - private System.Windows.Forms.TabPage tabTX; private System.Windows.Forms.TextBox txtTxLog; private System.Windows.Forms.TabPage tabRX; private System.Windows.Forms.TextBox txtRxLog; @@ -824,5 +995,18 @@ namespace Test_ACS private System.Windows.Forms.Label lblRunSt; private System.Windows.Forms.Label lblModeValue; private System.Windows.Forms.Label lblMode; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btAMove; + private System.Windows.Forms.ComboBox cmbAutoSpeed; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbMotDirection; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox cmbMagDirection; } } diff --git a/Cs_HMI/TestProject/Test_ACS/MainForm.cs b/Cs_HMI/TestProject/Test_ACS/MainForm.cs index fcf365a..67b8239 100644 --- a/Cs_HMI/TestProject/Test_ACS/MainForm.cs +++ b/Cs_HMI/TestProject/Test_ACS/MainForm.cs @@ -31,6 +31,11 @@ namespace Test_ACS // Speed combobox default if (cmbSpeed.Items.Count > 0) cmbSpeed.SelectedIndex = 1; // 보통 + + cmbMotDirection.SelectedIndex = 0; + cmbMagDirection.SelectedIndex = 0; + cmbAutoSpeed.SelectedIndex = 0; + } private void InitializeProtocol() @@ -61,9 +66,14 @@ namespace Test_ACS AddLog($"RX: {hexstrRaw}\nID:{id}, CMD:{cmd}, DATA:{hexstr}", LogType.RX); // AGV 상태 수신 처리 (cmd = 3) - if (e.ReceivedPacket.Command == (byte)ENIGProtocol.AGVCommandEH.Status) + var device = e.ReceivedPacket.ID; + var command = (ENIGProtocol.AGVCommandEH)e.ReceivedPacket.Command; + + switch (command) { - UpdateAGVStatus(e.ReceivedPacket.Data); + case AGVCommandEH.Status: + UpdateAGVStatus(e.ReceivedPacket.Data); + break; } } @@ -220,18 +230,21 @@ namespace Test_ACS private void btnSetCurrent_Click(object sender, EventArgs e) { // SetCurrent: data = TargetID(2 hex) + RFID(4 hex) - var rfid = txtRFID.Text.PadLeft(4, '0'); var targetID = selectedAGV.ToString("X2"); - var dataStr = targetID + rfid; + var rfidBytes = Encoding.ASCII.GetBytes(txtRFID.Text.PadLeft(4, '0')); + var rfidHex = string.Join("", rfidBytes.Select(b => b.ToString("X2"))); + var dataStr = targetID + rfidHex; SendCommand(AGVCommandHE.SetCurrent, dataStr); } private void btnGoto_Click(object sender, EventArgs e) { // Goto: data = TargetID(2 hex) + RFID(4 hex) - var rfid = txtRFID.Text.PadLeft(4, '0'); + var targetID = selectedAGV.ToString("X2"); - var dataStr = targetID + rfid; + var rfidBytes = Encoding.ASCII.GetBytes(txtRFID.Text.PadLeft(4, '0')); + var rfidHex = string.Join("", rfidBytes.Select(b => b.ToString("X2"))); + var dataStr = targetID + rfidHex; SendCommand(AGVCommandHE.Goto, dataStr); } @@ -334,7 +347,22 @@ namespace Test_ACS serialPort.Write(packet, 0, packet.Length); var hexString = string.Join(" ", packet.Select(b => b.ToString("X2"))); - AddLog($"TX: {hexString}\nCMD: {command} ({(byte)command:X2}), DATA: {dataHexString}", LogType.TX); + + //정보를 조금더 추출한다. + var Sender = packet[2]; + + if (Sender == 0x00) + { + var Receiver = packet[4]; + var strdata = System.Text.Encoding.Default.GetString(dataBytes, 1, dataBytes.Length - 1);// (dataHexString.Substring(2), 16); + + AddLog($"{hexString}|{command}({(byte)command:X2}) From:{Sender} To:{Receiver} => {dataHexString} STR:{strdata}", LogType.TX); + } + else + { + AddLog($"{hexString}|{command}({(byte)command:X2}) From:{Sender} => {dataHexString}", LogType.TX); + } + } catch (Exception ex) { @@ -344,7 +372,7 @@ namespace Test_ACS private void UpdateAGVStatus(byte[] data) { - if (data.Length < 13) + if (data.Length < 12) { AddLog($"AGV 상태 데이터 길이 오류: {data.Length} bytes", LogType.Error); return; @@ -383,36 +411,47 @@ namespace Test_ACS break; } - // Direction[1]: 0=straight, 1=left, 2=right, 3=markstop + // Mot Direction[1]: 0=forward, 1:backward switch (data[2]) { case 0: - lblDirectionValue.Text = "직진"; + lblDirectionValue.Text = "전진"; break; case 1: - lblDirectionValue.Text = "좌회전"; - break; - case 2: - lblDirectionValue.Text = "우회전"; - break; - case 3: - lblDirectionValue.Text = "마크정지"; + lblDirectionValue.Text = "후진"; break; default: - lblDirectionValue.Text = "알 수 없음"; + lblDirectionValue.Text = "??"; + break; + } + + // Direction[1]: 0=straight, 1=left, 2=right, 3=markstop + switch (data[3]) + { + case 0: + lblDirectionValue.Text += "/직진"; + break; + case 1: + lblDirectionValue.Text += "/좌회전"; + break; + case 2: + lblDirectionValue.Text += "/우회전"; + break; + default: + lblDirectionValue.Text += "/??"; break; } // Inposition[1]: 0=off, 1=on - lblInpositionValue.Text = data[3] == 0 ? "OFF" : "ON"; - lblInpositionValue.ForeColor = data[3] == 0 ? Color.Gray : Color.Green; + lblInpositionValue.Text = data[4] == 0 ? "OFF" : "ON"; + lblInpositionValue.ForeColor = data[4] == 0 ? Color.Gray : Color.Green; // ChargeSt[1]: 0=off, 1=on - lblChargeStValue.Text = data[4] == 0 ? "OFF" : "ON"; - lblChargeStValue.ForeColor = data[4] == 0 ? Color.Gray : Color.Orange; + lblChargeStValue.Text = data[5] == 0 ? "OFF" : "ON"; + lblChargeStValue.ForeColor = data[5] == 0 ? Color.Gray : Color.Orange; // CartSt[1]: 0=off, 1=on, 2=unknown - switch (data[5]) + switch (data[6]) { case 0: lblCartStValue.Text = "없음"; @@ -422,18 +461,14 @@ namespace Test_ACS lblCartStValue.Text = "있음"; lblCartStValue.ForeColor = Color.Green; break; - case 2: - lblCartStValue.Text = "알 수 없음"; - lblCartStValue.ForeColor = Color.Orange; - break; default: - lblCartStValue.Text = "오류"; + lblCartStValue.Text = "??"; lblCartStValue.ForeColor = Color.Red; break; } // LiftSt[1]: 0=down, 1=up, 2=unknown - switch (data[6]) + switch (data[7]) { case 0: lblLiftStValue.Text = "하강"; @@ -443,18 +478,13 @@ namespace Test_ACS lblLiftStValue.Text = "상승"; lblLiftStValue.ForeColor = Color.Green; break; - case 2: - lblLiftStValue.Text = "알 수 없음"; - lblLiftStValue.ForeColor = Color.Orange; - break; default: - lblLiftStValue.Text = "오류"; + lblLiftStValue.Text = "??"; lblLiftStValue.ForeColor = Color.Red; break; } - // LastTag[6]: "000000" - string lastTag = Encoding.ASCII.GetString(data, 7, 6); + string lastTag = Encoding.ASCII.GetString(data, 8, 4); lblLastTagValue.Text = lastTag; lblLastTagValue.ForeColor = Color.Black; } @@ -511,5 +541,18 @@ namespace Test_ACS } base.OnFormClosing(e); } + + private void btAMove_Click(object sender, EventArgs e) + { + // Manual: data = TargetID(2 hex) + Direction(1 byte) + Speed(1 byte) + Runtime(1 byte) + var targetID = selectedAGV.ToString("X2"); + var Motdirection = (byte)cmbMotDirection.SelectedIndex; + var Magdirection = (byte)cmbMagDirection.SelectedIndex; + var speed = (byte)cmbAutoSpeed.SelectedIndex; + + var dataBytes = new byte[] { Motdirection, Magdirection, speed }; + var dataStr = targetID + string.Join("", dataBytes.Select(b => b.ToString("X2"))); + SendCommand(AGVCommandHE.AutoMove, dataStr); + } } } diff --git a/Cs_HMI/TestProject/Test_ACS/MainForm.resx b/Cs_HMI/TestProject/Test_ACS/MainForm.resx index d58980a..3e15e69 100644 --- a/Cs_HMI/TestProject/Test_ACS/MainForm.resx +++ b/Cs_HMI/TestProject/Test_ACS/MainForm.resx @@ -117,4 +117,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ### 기본 패킷 구조 +``` +[STX][LEN][ID][CMD][DATA][CRC16][ETX] +``` +- **STX (Start of Text)**: 0x02 +- **LEN (Length)**: 데이터 길이 (1바이트) = {ID+CMD+DATA} +- **ID (Client ID)**: 데이터 길이 (1바이트) : 디바이스식별코드(=DeviceType) +- **CMD (Command)**: 명령어 코드 (1바이트) +- **DATA**: 명령어에 따른 데이터 (가변 길이) +- **CRC16**: 데이터 무결성 검사 (2바이트) +- **ETX (End of Text)**: 0x03 + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_ACS/Test_ACS.csproj b/Cs_HMI/TestProject/Test_ACS/Test_ACS.csproj index 5323343..0f1b015 100644 --- a/Cs_HMI/TestProject/Test_ACS/Test_ACS.csproj +++ b/Cs_HMI/TestProject/Test_ACS/Test_ACS.csproj @@ -18,7 +18,7 @@ true full false - ..\..\..\..\..\..\Amkor\AGV4\ + ..\..\..\..\..\..\Amkor\AGV4\Test\ DEBUG;TRACE prompt 4 @@ -36,7 +36,7 @@ - ..\..\SubProject\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + ..\..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll @@ -77,6 +77,7 @@ Resources.Designer.cs + SettingsSingleFileGenerator Settings.Designer.cs diff --git a/Cs_HMI/TestProject/Test_ACS/packages.config b/Cs_HMI/TestProject/Test_ACS/packages.config index efd7b64..8f8cd00 100644 --- a/Cs_HMI/TestProject/Test_ACS/packages.config +++ b/Cs_HMI/TestProject/Test_ACS/packages.config @@ -1,4 +1,4 @@ - + - - + + \ No newline at end of file diff --git a/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj b/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj index d2ef170..4e4c7e4 100644 --- a/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj +++ b/Cs_HMI/TestProject/Test_BMS/Test_BMS.csproj @@ -18,7 +18,7 @@ true full false - ..\..\..\..\..\..\Amkor\AGV4\ + ..\..\..\..\..\..\Amkor\AGV4\Test\ DEBUG;TRACE prompt 4 diff --git a/Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj b/Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj index 4af921b..6dfd60d 100644 --- a/Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj +++ b/Cs_HMI/TestProject/Test_Narumi/Test_Narumi.csproj @@ -18,7 +18,7 @@ true full false - ..\..\..\..\..\..\Amkor\AGV4\ + ..\..\..\..\..\..\Amkor\AGV4\Test\ DEBUG;TRACE prompt 4 diff --git a/Cs_HMI/TestProject/Test_Port/Test_Port.csproj b/Cs_HMI/TestProject/Test_Port/Test_Port.csproj index f32cbcb..50162e0 100644 --- a/Cs_HMI/TestProject/Test_Port/Test_Port.csproj +++ b/Cs_HMI/TestProject/Test_Port/Test_Port.csproj @@ -18,7 +18,7 @@ true full false - ..\..\..\..\..\..\Amkor\AGV4\ + ..\..\..\..\..\..\Amkor\AGV4\Test\ DEBUG;TRACE prompt 4