파일정리

This commit is contained in:
ChiKyun Kim
2026-01-29 14:03:17 +09:00
parent 00cc0ef5b7
commit 58ca67150d
440 changed files with 47236 additions and 99165 deletions

View File

@@ -0,0 +1,352 @@
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.Security.Permissions;
using System.Windows.Forms;
namespace AGVControl.Models
{
//public class CRFIDData
//{
// public UInt16 Value { get; set; }
// public Point Location { get; set; }
// public override string ToString()
// {
// return $"RFID:{Value},P:{Location.X},{Location.Y}";
// }
//}
public class movehistorydata : RFIDPoint
{
public AgvDir Direction { get; set; }
public override string ToString()
{
return $"RFID:{Value},DIR:{Direction},P:{Location.X},{Location.Y}";
}
}
public class AGV
{
/// <summary>
/// RFID 번호
/// </summary>
public RFIDPoint CurrentRFID { get; set; }
/// <summary>
/// 목적지가 셋팅된경우 해당 값
/// </summary>
public RFIDPoint TargetRFID { get; set; }
/// <summary>
/// 배터리잔량(%)
/// </summary>
public float BatteryLevel { get; set; } = 0f;
/// <summary>
/// 배터리온도(board)
/// </summary>
public double BatteryTemp1 { get; set; } = 0;
/// <summary>
/// 배터리온도(cell)
/// </summary>
public double BatteryTemp2 { get; set; } = 0;
/// <summary>
/// AGV Speed
/// </summary>
public AgvSpeed CurrentSpeed { get; set; }
/// <summary>
/// AGV STS
/// </summary>
public AgvSts CurrentSTS { get; set; }
/// <summary>
/// AGV Motor Direction
/// </summary>
public AgvDir Current_Motor_Direction { get; set; }
/// <summary>
/// 현재위치가 수산되면 목적지까지의 방향값이 계산됩니다.
/// </summary>
public AgvDir? TargetDirection { get; set; }
/// <summary>
/// AGV.System1.agv_Run
/// </summary>
public bool IsMoving { get; set; }
/// <summary>
/// AGV.System1.Mark1_Check | Mark2_Check
/// </summary>
public bool IsMarkCheck { get; set; }
/// <summary>
/// 이동대상과 AGV의 머리방향이 일치하는지?
/// </summary>
public bool IsTargetDirectionMatch { get; set; }
/// <summary>
/// 메인경로
/// 경로검색으로 입력된 경로
/// </summary>
public List<RFIDPoint> MainPath { get; set; } = new List<RFIDPoint>();
/// <summary>
/// 메인경로외에 거쳐가는 중간 경로
/// </summary>
public List<RFIDPoint> SubPath { get; set; }
public List<string> PathRFIDs { get; set; }
// 이동 경로 기록을 위한 새로운 속성들
public List<movehistorydata> MovementHistory { get; } = new List<movehistorydata>();
public const int HISTORY_SIZE = 10; // 최근 4개 위치 기록
public AGV()
{
MainPath = new List<RFIDPoint>();
SubPath = new List<RFIDPoint>();
PathRFIDs = new List<string>();
CurrentRFID = new RFIDPoint();
TargetRFID = new RFIDPoint();
TargetDirection = AgvDir.Forward;
// BodyAngle = null;
}
// 이동 경로에 새로운 RFID 추가
public void AddToMovementHistory(UInt16 rfidValue, Point position, AgvDir direction)
{
// 중복 RFID가 연속으로 들어오는 경우 무시
if (MovementHistory.Count > 0 && MovementHistory.Last().Value == rfidValue)
return;
MovementHistory.Add(new movehistorydata { Value = rfidValue, Direction = direction, Location = position });
// 기록 크기 제한
if (MovementHistory.Count > HISTORY_SIZE)
{
MovementHistory.RemoveAt(0);
}
//최초방향과 마지막 방향이 일치하지 않으면 그 이전의 데이터는 삭제한다.
if (MovementHistory.Count > 2 && MovementHistory.First().Direction != MovementHistory.Last().Direction)
{
var lastTwo = MovementHistory.Skip(MovementHistory.Count - 2).Take(2).ToArray(); // [9, 10]
MovementHistory.Clear();
MovementHistory.AddRange(lastTwo);
}
// 위치 업데이트 시 자동으로 히스토리 파일에 저장
SaveHistoryOnUpdate();
}
// 연결 정보 기반 실제 이동 방향 계산
public AgvDir? CalculateActualDirectionByConnection(uint currentRFID, uint previousRFID, List<RFIDConnection> connections)
{
if (connections == null || connections.Count == 0)
return null;
// 이전 RFID에서 현재 RFID로의 연결 확인
var connection = connections.FirstOrDefault(c =>
(c.P1.Value == previousRFID && c.P2.Value == currentRFID) ||
(c.P1.Value == currentRFID && c.P2.Value == previousRFID));
if (connection == null)
return null; // 연결되지 않은 경로
// 연결 방향에 따라 실제 이동 방향 결정
if (connection.P1.Value == previousRFID && connection.P2.Value == currentRFID)
{
return AgvDir.Forward; // Start -> End 방향으로 이동
}
else
{
return AgvDir.Backward; // End -> Start 방향으로 이동
}
}
// 연결 정보 기반 방향 불일치 검증 및 정정
public bool ValidateAndCorrectDirectionByConnection(AgvDir expectedDirection, List<RFIDConnection> connections)
{
if (MovementHistory.Count < 2 || connections == null)
return true; // 검증 불가능한 경우
// 최근 두 RFID 값 가져오기
var recentRFIDs = MovementHistory.Skip(MovementHistory.Count - 2).Take(2).ToList();
if (recentRFIDs.Count < 2)
return true;
var previousRFID = recentRFIDs[0];
var currentRFID = recentRFIDs[1];
var actualDirection = CalculateActualDirectionByConnection(currentRFID.Value, previousRFID.Value, connections);
if (!actualDirection.HasValue)
return true; // 연결 정보로 방향 판단 불가
// 방향이 일치하지 않는 경우
if (actualDirection.Value != expectedDirection)
{
// AGV 모터 방향을 실제 이동 방향으로 정정
//CurrentAGVDirection = actualDirection.Value;
TargetDirection = actualDirection.Value;
return false; // 정정됨을 알림
}
return true; // 방향 일치
}
// RFID 순서 기반 실제 이동 방향 계산 (기존 메서드 - 호환성 유지)
public AgvDir? CalculateActualDirectionByRFID()
{
if (MovementHistory.Count < 2)
return null;
// 최근 두 RFID 값으로부터 실제 이동 방향 계산
var recentRFIDs = MovementHistory.Skip(Math.Max(0, MovementHistory.Count - 2)).Take(2).ToList();
if (recentRFIDs.Count < 2)
return null;
var prevRFID = recentRFIDs[0];
var currentRFID = recentRFIDs[1];
// RFID 값의 증가/감소로 방향 판단
if (currentRFID.Value > prevRFID.Value)
{
return AgvDir.Forward; // RFID 값이 증가하면 전진
}
else if (currentRFID.Value < prevRFID.Value)
{
return AgvDir.Backward; // RFID 값이 감소하면 후진
}
else
{
return null; // 같은 RFID 값이면 방향 판단 불가
}
}
// 위치 히스토리 파일 저장 (최근 3개만 저장)
public void SavePositionHistory(string filePath)
{
try
{
// 최근 3개의 히스토리만 저장
var recentHistory = MovementHistory.Skip(Math.Max(0, MovementHistory.Count - 3)).ToList();
var lines = new List<string>();
lines.Add($"# AGV Position History - {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
lines.Add("# Format: RFID,Direction,X,Y,Timestamp");
foreach (var history in recentHistory)
{
lines.Add($"{history.Value},{history.Direction},{history.Location.X},{history.Location.Y},{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
}
System.IO.File.WriteAllLines(filePath, lines);
}
catch (Exception ex)
{
// 로그 기록 (실제 환경에서는 로깅 시스템 사용)
System.Diagnostics.Debug.WriteLine($"SavePositionHistory Error: {ex.Message}");
}
}
// 위치 히스토리 파일 로드
public bool LoadPositionHistory(string filePath)
{
try
{
if (!System.IO.File.Exists(filePath))
return false;
var lines = System.IO.File.ReadAllLines(filePath);
MovementHistory.Clear();
foreach (var line in lines)
{
// 주석 라인 건너뛰기
if (line.StartsWith("#") || string.IsNullOrWhiteSpace(line))
continue;
var parts = line.Split(',');
if (parts.Length >= 4)
{
if (UInt16.TryParse(parts[0], out UInt16 rfidValue) &&
Enum.TryParse<AgvDir>(parts[1], out AgvDir direction) &&
int.TryParse(parts[2], out int x) &&
int.TryParse(parts[3], out int y))
{
MovementHistory.Add(new movehistorydata
{
Value = rfidValue,
Direction = direction,
Location = new Point(x, y)
});
}
}
}
return MovementHistory.Count > 0;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"LoadPositionHistory Error: {ex.Message}");
return false;
}
}
// 시작 시 위치 히스토리 자동 로드
public void LoadHistoryOnStartup()
{
string historyFilePath = System.IO.Path.Combine(
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
"agv_position_history.dat"
);
LoadPositionHistory(historyFilePath);
}
// 위치 업데이트 시 자동 저장
public void SaveHistoryOnUpdate()
{
string historyFilePath = System.IO.Path.Combine(
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
"agv_position_history.dat"
);
SavePositionHistory(historyFilePath);
}
}
public class PathNode
{
public Point Location { get; set; }
public string RFID { get; set; }
public double G { get; set; } // 시작점에서 현재 노드까지의 비용
public double H { get; set; } // 현재 노드에서 목표점까지의 예상 비용
public double F => G + H; // 총 비용
public PathNode Parent { get; set; }
public PathNode(Point location, string rfid)
{
Location = location;
RFID = rfid;
G = 0;
H = 0;
Parent = null;
}
}
}

View File

@@ -0,0 +1,58 @@
using AGVControl.Models;
using System;
namespace AGVControl
{
public class AGVActionPrediction
{
public AgvDir Direction { get; set; }
public RFIDPoint NextRFID { get; set; }
public string Reason { get; set; }
public AGVActionReasonCode ReasonCode { get; set; }
public AGVMoveState MoveState { get; set; } // RUN 또는 STOP
public AgvSpeed? MoveSpeed { get; set; }
public AgvSts? MoveDiv { get; set; }
public UInt32 Idx { get; set; }
public bool Changed { get; set; }
public DateTime CreateTime { get; set; }
// override object.Equals
public bool Equals(AGVActionPrediction obj)
{
// null 체크
if (obj == null) return false;
// 참조가 같으면 true
if (ReferenceEquals(this, obj)) return true;
// 핵심 속성들만 비교 (Idx, Changed 제외)
if (obj.Direction != this.Direction) return false;
if (obj.ReasonCode != this.ReasonCode) return false;
if (obj.MoveState != this.MoveState) return false;
if (obj.MoveSpeed != this.MoveSpeed) return false;
if (obj.MoveDiv != this.MoveDiv) return false;
// NextRFID 비교 (null 체크 포함)
if (obj.NextRFID == null || this.NextRFID == null)
{
if (obj.NextRFID != this.NextRFID) return false; // 하나만 null이면 false
}
else
{
if (obj.NextRFID.Value != this.NextRFID.Value) return false;
}
// Reason 비교 (null 체크 포함)
if (obj.Reason == null || this.Reason == null)
{
if (obj.Reason != this.Reason) return false; // 하나만 null이면 false
}
else
{
if (obj.Reason != this.Reason) return false;
}
return true;
}
}
}

View File

@@ -0,0 +1,14 @@
using System.Drawing;
using System;
namespace AGVControl.Models
{
public class CustomLine
{
public Point StartPoint { get; set; }
public Point EndPoint { get; set; }
public Color LineColor { get; set; }
public int LineWidth { get; set; }
}
}

View File

@@ -0,0 +1,86 @@
using System.Drawing;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace AGVControl.Models
{
/// <summary>
/// 도로특성정보
/// </summary>
public class RoadInformation
{
/// <summary>
/// 시작지점
/// </summary>
public RFIDPoint P1 { get; set; }
/// <summary>
/// 종료지점
/// </summary>
public RFIDPoint P2 { get; set; }
/// <summary>
/// 도로의 사용여부
/// </summary>
public bool Enable { get; set; }
/// <summary>
/// AGV의 이동방향(리프트방향)
/// 목적지 방향과의 일치를 위해 해당 방향을 설정할 수 있따
/// </summary>
public AgvDir? LiftDirection { get; set; }
/// <summary>
/// AGV이동시 속도 (high, middle, low)
/// </summary>
public AgvSpeed? MoveSpeed { get; set; }
/// <summary>
/// AGV이동시 방향모드(좌분기, 전진, 우분기)
/// </summary>
public AgvSts? MoveDirection { get; set; }
public RoadInformation()
{
P1 = null;
P2 = null;
LiftDirection = null;
MoveSpeed = null;
MoveDirection = null;
Enable = false;
}
/// <summary>
/// 값이 설정되어있는지
/// </summary>
public bool HasValue
{
get
{
if (P1 == null || P2 == null) return false;
if (LiftDirection == null && MoveSpeed == null && MoveDirection == null) return false;
return true;
}
}
}
public class MagnetLine
{
public Point StartPoint { get; set; }
public Point EndPoint { get; set; }
public List<Point> BranchPoints { get; set; }
public Dictionary<Point, BranchDirection> BranchDirections { get; set; }
public MagnetLine()
{
BranchPoints = new List<Point>();
BranchDirections = new Dictionary<Point, BranchDirection>();
}
}
}

View File

@@ -0,0 +1,13 @@
using System.Drawing;
using System;
using System.Collections.Generic;
namespace AGVControl.Models
{
public enum BranchDirection
{
Left,
Straight,
Right
}
}

View File

@@ -0,0 +1,63 @@
using System.Drawing;
using System;
using System.Collections.Generic;
namespace AGVControl.Models
{
public class MapText
{
private bool _dirty = true;
private Point _location;
private string _text;
private Font _font;
public bool Dirty
{
get => _dirty;
set => _dirty = value;
}
public Point Location
{
get => _location;
set
{
if (_location != value)
{
_location = value;
_dirty = true;
}
}
}
public string Text
{
get => _text;
set
{
if (_text != value)
{
_text = value;
_dirty = true;
}
}
}
public Color TextColor { get; set; }
public Color BackgroundColor { get; set; }
public Font Font
{
get => _font;
set
{
if (_font != value)
{
_font = value;
_dirty = true;
}
}
}
public RectangleF Bounds { get; set; }
}
}

View File

@@ -0,0 +1,23 @@
using AGVControl.Models;
using System.Collections.Generic;
using System.Linq;
namespace AGVControl
{
public class PathResult
{
public bool Success
{
get
{
return Path != null && Path.Any();
}
}
public string Message { get; set; }
public List<RFIDPoint> Path { get; set; }
}
}

View File

@@ -0,0 +1,214 @@
using AGVControl.Models;
using AR;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics.Tracing;
namespace AGVControl
{
public class RFIDConnection
{
/// <summary>
/// 시작지점
/// </summary>
public RFIDPoint P1 { get; set; }
/// <summary>
/// 종료지점
/// </summary>
public RFIDPoint P2 { get; set; }
/// <summary>
/// 도로의 사용여부
/// </summary>
public bool EnableP { get; set; }
public bool EnableN { get; set; }
/// <summary>
/// AGV의 이동방향(리프트방향)
/// 목적지 방향과의 일치를 위해 해당 방향을 설정할 수 있따
/// </summary>
public AgvDir? LiftDirectionP { get; set; }
public AgvDir? LiftDirectionN { get; set; }
/// <summary>
/// AGV이동시 속도 (high, middle, low)
/// </summary>
public AgvSpeed? MoveSpeedP { get; set; }
public AgvSpeed? MoveSpeedN { get; set; }
/// <summary>
/// AGV이동시 방향모드(좌분기, 전진, 우분기)
/// </summary>
public AgvSts? MoveDirectionP { get; set; }
public AgvSts? MoveDirectionN { get; set; }
/// <summary>
/// 파일저장 및 불러오기시 사용하는 문자열로 반환
/// </summary>
[Browsable(false)]
public string DataFileString
{
get
{
var str_enbP = EnableP ? "1" : "0";
var str_liftP = "";
if (LiftDirectionP != null) str_liftP = ((int)LiftDirectionP).ToString();
var str_movespeedP = "";
if (MoveSpeedP != null) str_movespeedP = ((int)MoveSpeedP).ToString();
var str_movdirP = "";
if (MoveDirectionP != null) str_movdirP = ((int)MoveDirectionP).ToString();
var str_enbN = EnableP ? "1" : "0";
var str_liftN = "";
if (LiftDirectionN != null) str_liftN = ((int)LiftDirectionN).ToString();
var str_movespeedN = "";
if (MoveSpeedN != null) str_movespeedN = ((int)MoveSpeedN).ToString();
var str_movdirN = "";
if (MoveDirectionN != null) str_movdirN = ((int)MoveDirectionN).ToString();
var PStr= $"{P1.Location.X},{P1.Location.Y},{P2.Location.X},{P2.Location.Y}," + //location
$"{P1.Value},{P2.Value}," + //rfid values
$"{str_enbP};{str_liftP};{str_movespeedP};{str_movdirP}," +
$"{str_enbN};{str_liftN};{str_movespeedN};{str_movdirN}";
return $"{PStr}";
}
set
{
var buf = value.Split(',');
if (buf.Length >= 2)
{
var p1x = int.Parse(buf[0]);
var p1y = int.Parse(buf[1]);
var p2x = int.Parse(buf[2]);
var p2y = int.Parse(buf[3]);
var p1v = ushort.Parse(buf[4]);
var p2v = ushort.Parse(buf[5]);
if (P1 == null) P1 = new RFIDPoint();
P1.Location = new System.Drawing.Point(p1x, p1y);
P1.Value = p1v;
if (P2 == null) P2 = new RFIDPoint();
P2.Location = new System.Drawing.Point(p2x, p2y);
P2.Value = p2v;
if (buf[6].Contains(";")) //양방향 정보
{
var StrP = buf[6].Split(';');
var StrN = buf[7].Split(';');
//Positive
this.EnableP = StrP[0] == "1";
if (StrP[1].isEmpty()) LiftDirectionP = null;
else LiftDirectionP = (AgvDir)int.Parse(StrP[1]);
if (StrP[2].isEmpty()) MoveSpeedP = null;
else MoveSpeedP = (AgvSpeed)int.Parse(StrP[2]);
if (StrP[3].isEmpty()) MoveDirectionP = null;
else MoveDirectionP = (AgvSts)int.Parse(StrP[3]);
//Negative
this.EnableN = StrN[0] == "1";
if (StrN[1].isEmpty()) LiftDirectionN = null;
else LiftDirectionN = (AgvDir)int.Parse(StrN[1]);
if (StrN[2].isEmpty()) MoveSpeedN = null;
else MoveSpeedN = (AgvSpeed)int.Parse(StrN[2]);
if (StrN[3].isEmpty()) MoveDirectionN = null;
else MoveDirectionN = (AgvSts)int.Parse(StrN[3]);
}
else
{
this.EnableP = buf[6] == "1";
if (buf[7].isEmpty()) LiftDirectionP = null;
else LiftDirectionP = (AgvDir)int.Parse(buf[7]);
if (buf[8].isEmpty()) MoveSpeedP = null;
else MoveSpeedP = (AgvSpeed)int.Parse(buf[8]);
if (buf[9].isEmpty()) MoveDirectionP = null;
else MoveDirectionP = (AgvSts)int.Parse(buf[9]);
this.EnableN = this.EnableP;
this.LiftDirectionN = this.LiftDirectionP;
this.MoveSpeedN = this.MoveSpeedP;
this.MoveDirectionN = this.MoveDirectionP;
}
}
}
}
public RFIDConnection(string dataline = "")
{
P1 = null;
P2 = null;
LiftDirectionP = null;
MoveSpeedP = null;
MoveDirectionP = null;
EnableP = false;
LiftDirectionN = null;
MoveSpeedN = null;
MoveDirectionP = null;
EnableP = false;
if (dataline.isEmpty() == false) DataFileString = dataline;
}
/// <summary>
/// 값이 설정되어있는지
/// </summary>
public bool HasValue
{
get
{
if (P1 == null || P2 == null) return false;
if (LiftDirectionP == null && MoveSpeedP == null && MoveDirectionP == null &&
LiftDirectionN == null && MoveSpeedN == null && MoveDirectionN == null) return false;
return true;
}
}
public override bool Equals(object obj)
{
if (obj is RFIDConnection other)
{
return (P1 == other.P1 && P2 == other.P2);
}
return false;
}
public override int GetHashCode()
{
return P1.GetHashCode() ^ P2.GetHashCode();
}
public override string ToString()
{
//연결정보를 확인
return $"{P1.Value} ↔ {P2.Value},ENB:{(EnableP ? "O" : "X")}|{(EnableN ? "O" : "X")}";
}
}
}

View File

@@ -0,0 +1,30 @@
using System.Drawing;
using System;
using System.Collections.Generic;
namespace AGVControl.Models
{
public class RFIDLine
{
public Point StartPoint { get; set; }
public Point EndPoint { get; set; }
public float Distance
{
get {
float dx = StartPoint.X - EndPoint.X;
float dy = StartPoint.Y - EndPoint.Y;
return (float)Math.Sqrt(dx * dx + dy * dy); // double을 float로 명시적 캐스팅
}
}
//public uint StartRFID { get; set; }
//public uint EndRFID { get; set; }
//public bool IsBidirectional { get; set; } = true; // 양방향 이동 가능 여부
//public float Distance { get; set; } // 두 RFID 포인트 사이의 거리
//public List<uint> ConnectedRFIDs { get; set; } = new List<uint>(); // 연결된 모든 RFID 값들
//public Dictionary<uint, uint> NextRFID { get; set; } = new Dictionary<uint, uint>(); // 각 RFID의 다음 RFID
//public Dictionary<uint, uint> PrevRFID { get; set; } = new Dictionary<uint, uint>(); // 각 RFID의 이전 RFID
}
}

View File

@@ -0,0 +1,59 @@
using System.Drawing;
using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace AGVControl.Models
{
public class RFIDPoint
{
public Point Location { get; set; }
public ushort Value { get; set; }
public string NextRFID { get; set; } // 다음 RFID 포인트의 값
public bool IsBidirectional { get; set; } // 양방향 연결 여부
public bool IsRotatable { get; set; } // 회전 가능 여부
public AgvDir? FixedDirection { get; set; } // 고정 방향(없으면 null)
public bool IsTerminal { get; set; } // 종단 여부
public bool NeedTurn { get; set; }
public bool TurnStop { get; set; }
public bool TurnOK { get; set; }
public DateTime TurnStart { get; set; }
public DateTime TurnEnd { get; set; }
[Browsable(false)]
public RectangleF Bounds { get; set; }
public void Clear()
{
this.Location = Point.Empty;
this.Value = 0;
TurnStop = false;
TurnOK = false;
TurnStart = new DateTime(1982, 11, 23);
TurnEnd = new DateTime(1982, 11, 23);
}
public bool IsEmpty
{
get
{
//RFID값이나 위치 값이 없으면 비어있는 것으로 한다.
if (this.Location.IsEmpty) return true;
if ((this.Value < 1)) return true;
return false;
}
}
public RFIDPoint()
{
IsRotatable = false; // 기본값은 회전 불가능
IsBidirectional = true; // 기본값은 양방향
FixedDirection = null;
IsTerminal = false; // 기본값은 종단 아님
Clear();
}
public override string ToString()
{
return $"[RFIDPoint] {Value},P:{Location.X},{Location.Y}";
}
}
}

View File

@@ -0,0 +1,34 @@
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
namespace AGVControl.Models
{
public class ToolBarItem
{
private bool _ishovering = false;
public int Idx { get; set; }
public Rectangle Bounds { get; set; }
public bool isHovering
{
get { return _ishovering; }
set
{
Dirty = _ishovering != value;
_ishovering = value;
}
}
public string Title { get; set; }
public bool Dirty { get; private set; }
public ToolBarItem()
{
Bounds = Rectangle.Empty;
}
}
}

View File

@@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVControl
{
/// <summary>
/// 실제 AGV컨트롤러의 STS값에는 F,B의 값이 들어있고
/// 아래 항목은 해당 문자의 ASCII코드값이다 첫자를 byte로 변경하고 변환하면 된다
/// </summary>
public enum AgvDir : byte
{
Forward = 0x46,
Backward = 0x42,
}
public enum AGVMoveState
{
Stop = 0,
Run
}
/// <summary>
/// 실제 AGV컨트롤러의 STS값에는 H,L,M,S의 값이 들어있고
/// 아래 항목은 해당 문자의 ASCII코드값이다 첫자를 byte로 변경하고 변환하면 된다
/// </summary>
public enum AgvSpeed : byte
{
High = 0x48,
Middle = 0x4D,
Low = 0x4C,
MarkStop = 0x53,
}
/// <summary>
/// STS : S,L,R
/// </summary>
public enum AgvSts : byte
{
Straight = 0x53,
Left = 0x4c,
Right = 0x052,
}
public enum AGVActionReasonCode
{
Unknown = 0,
NoPosition, // 위치 미확정(처음 기동)
NoPath, // 경로 없음 또는 현재 위치 미확정
NotOnPath, // 현재 위치가 경로에 없음
Arrived, // 경로의 마지막 지점(목적지 도달)
Normal, // 정상(다음 RFID 있음)
/// <summary>
/// 방향전환을 위한 턴이다
/// </summary>
NeedTurnMove,
/// <summary>
/// 지정된 RFID위치에서 TURN이 요청되었다
/// </summary>
NeedTurnPoint,
NoTurnPoint,
PathCalcError,
NoDirection,
MoveForTurn,
busy,
WaitForMarkStop,
}
}