diff --git a/ReadMe.MD b/ReadMe.MD index f4df0b8..8433905 100644 --- a/ReadMe.MD +++ b/ReadMe.MD @@ -74,8 +74,8 @@ public enum DeviceAlias : byte [STX][LEN][ID][CMD][DATA][CRC16][ETX] ``` - **STX (Start of Text)**: 0x02 -- **ID (Client ID)**: 데이터 길이 (1바이트) : 디바이스식별코드(=DeviceType) - **LEN (Length)**: 데이터 길이 (1바이트) = {CMD+DATA} +- **ID (Client ID)**: 데이터 길이 (1바이트) : 디바이스식별코드(=DeviceType) - **CMD (Command)**: 명령어 코드 (1바이트) - **DATA**: 명령어에 따른 데이터 (가변 길이) - **CRC16**: 데이터 무결성 검사 (2바이트) @@ -99,27 +99,42 @@ public enum DeviceAlias : byte 3. **AGV** - H -> E | Move : cmd(100) : 대상태그까지 이동(자동이동) - Target[1] = {DeviceType} - - TagID[4] = 0000 - - H -> E | Move : cmd(107) : 대상별칭까지 이동(자동이동) - - Target[1] = {DeviceType} - - TagID[4] = 0000 + - TagID[4] = "0000" + - H -> E | Stop : cmd(101) : 멈춤 - H -> E | Reset : cmd(102) : 오류 소거 - - H -> E | Charge On: cmd(103) : 충전실행(충전기 이동 후 자동 충전 진행) + + - H -> E | SetCurrent : cmd(103) : 현재위치설정 - Target[1] = {DeviceType} - - Action[1] : 0=Charge Off, 1=Charge On + - TagID[4] = "0000" + - H -> E | MoveManual : cmd(104) : 메뉴얼이동 - Target[1] = {DeviceType} - Direction[1] : 0=Backward, 1=Forward, 2=TurnLeft, 3=TurnRight - Speed[1] : 0=Slow, 1=Normal, 2=Fast - - Runtime[1] : 0 second + - H -> E | MarkStop : cmd(105) : 마크센서스톱 - Target[1] = {DeviceType} - + - H -> E | Lift Control : cmd(106) : 리프트제어 - Target[1] = {DeviceType} - Action[1] : 0=STOP, 1=UP, 2=DOWN + - H -> E | Move : cmd(107) : 대상별칭까지 이동(자동이동) + - Target[1] = {DeviceType} + - AliasName[n] = "..... + + - H -> E | MoveAuto : cmd(108) : 자동이동 + - Target[1] = {DeviceType} + - MotDirection[1] : 0=Backward, 1=Forward + - MagnetDirection[1] : 0=Straight,1=Left, 2=Right + - Speed[1] : 0=Slow, 1=Normal, 2=Fast + + - H -> E | Charge On: cmd(109) : 충전실행(충전기 이동 후 자동 충전 진행) + - Target[1] = {DeviceType} + - Action[1] : 0=Charge Off, 1=Charge On + + - E -> H | Move Complete : cmd(1) : 목적지이동완료 후 전송 - TagID[4] : "0000" - E -> H | TagID Received : cmd(2) : 태그값 인식시 전송 diff --git a/enigprotocol/Commands.cs b/enigprotocol/Commands.cs index f342ed3..7233769 100644 --- a/enigprotocol/Commands.cs +++ b/enigprotocol/Commands.cs @@ -11,11 +11,14 @@ namespace ENIGProtocol { Goto = 100, Stop = 101, - Reset, - SetCurrent, - Manual, - MarkStop, - LiftControl + Reset = 102, + SetCurrent = 103, + Manual = 104, + MarkStop = 105, + LiftControl = 106, + GotoAlias = 107, + AutoMove=108, + ChargeControl=109, } /// @@ -26,7 +29,7 @@ namespace ENIGProtocol Error = 1, Arrived = 2, ReadRFID = 3, - Status=9, + Status = 9, } public enum AGVErrorCode : byte @@ -34,5 +37,7 @@ namespace ENIGProtocol PredictFix, TurnTimeout, TurnError, + EmptyNode, + Goto, } } diff --git a/enigprotocol/EEProtocol.cs b/enigprotocol/EEProtocol.cs index b9c1884..f5718a9 100644 --- a/enigprotocol/EEProtocol.cs +++ b/enigprotocol/EEProtocol.cs @@ -178,14 +178,16 @@ namespace ENIG OnDataReceived?.Invoke(this, new DataEventArgs { ReceivedPacket = packet }); return true; } - catch + catch(Exception ex) { + RaiseMessage(ex.Message, true); return false; } } // 데이터 수신 처리 메서드 (시리얼 포트에서 데이터를 받았을 때 호출) private List buffer = new List(); + private int ProtocolParseError = 0; public void ProcessReceivedData(byte[] data) { buffer.AddRange(data); @@ -216,7 +218,12 @@ namespace ENIG byte[] packetData = buffer.Take(expectedLength).ToArray(); buffer.RemoveRange(0, expectedLength); - ParsePacket(packetData); + var parseOK = ParsePacket(packetData); + if(parseOK==false) //분석이 실패되었다면 해당 데이터는 삭제한다. + { + ProtocolParseError += 1; + if (ProtocolParseError > 3) buffer.Clear(); + } else ProtocolParseError = 0; } } } diff --git a/enigprotocol/ENIGProtocol.csproj b/enigprotocol/ENIGProtocol.csproj index ea06232..d49f507 100644 --- a/enigprotocol/ENIGProtocol.csproj +++ b/enigprotocol/ENIGProtocol.csproj @@ -50,6 +50,7 @@ + \ No newline at end of file diff --git a/enigprotocol/ReadMe.MD b/enigprotocol/ReadMe.MD index 7344202..c8bfc87 100644 --- a/enigprotocol/ReadMe.MD +++ b/enigprotocol/ReadMe.MD @@ -56,8 +56,8 @@ public enum DeviceType : byte [STX][LEN][ID][CMD][DATA][CRC16][ETX] ``` - **STX (Start of Text)**: 0x02 +- **LEN (Length)**: 데이터 길이 (1바이트) = {ID+CMD+DATA} - **ID (Client ID)**: 데이터 길이 (1바이트) : 디바이스식별코드(=DeviceType) -- **LEN (Length)**: 데이터 길이 (1바이트) = {CMD+DATA} - **CMD (Command)**: 명령어 코드 (1바이트) - **DATA**: 명령어에 따른 데이터 (가변 길이) - **CRC16**: 데이터 무결성 검사 (2바이트) @@ -81,10 +81,10 @@ public enum DeviceType : byte 3. **AGV** - H -> E | Move : cmd(100) : 대상태그까지 이동(자동이동) - Target[1] = {DeviceType} - - TagID[4] = 0000 + - TagID[4] = "0000" - H -> E | Move : cmd(107) : 대상별칭까지 이동(자동이동) - Target[1] = {DeviceType} - - TagID[4] = 0000 + - AliasName[n] = "....." - H -> E | Stop : cmd(101) : 멈춤 - H -> E | Reset : cmd(102) : 오류 소거 - H -> E | Charge On: cmd(103) : 충전실행(충전기 이동 후 자동 충전 진행) @@ -107,15 +107,16 @@ public enum DeviceType : byte - E -> H | TagID Received : cmd(2) : 태그값 인식시 전송 - TagID[4] : "0000" - - E -> H | Status : cmd(3) - 총 13바이트 + - E -> H | Status : cmd(3) - 총 12바이트 - Mode[1] : 0=manual, 1=auto - RunSt[1] : 0=stop, 1=run, 2=error - - Diection[1] : 0=straight, 1=left, 2=right, 3=markstop + MotDirection[1] : 0:Forward, 1:Backward, 0xFF:unknown + - MagDiection[1] : 0=straight, 1=left, 2=right , 0xFF:unknown - Inposition[1] : 0=off, 1=on : 목적위치에 도달완료 시 설정 이동 이동시 OFF됨 - ChargeSt[1] : 0=off, 1=on - CartSt[1] : 0=off, 1=on, 2=unknown - LiftSt[1] : 0=down , 1=up, 2=unknown - - LastTag[6] : "000000" (ASCII 6바이트) + - LastTag[4] : "0000" (ASCII 4바이트) 4. **Door** - H -> E | cmd(1): 출입문 열기