This commit is contained in:
chi
2025-05-26 17:19:36 +09:00
parent 8d0f0f8c8f
commit d6e7c118fb
40 changed files with 1550 additions and 3133 deletions

View File

@@ -10,6 +10,7 @@ using System.Security.Cryptography;
using AR;
using System.IO.Ports;
using System.Security.Cryptography.X509Certificates;
using System.Windows.Forms;
namespace Project.Device
{
@@ -21,6 +22,20 @@ namespace Project.Device
public DateTime LastStatusSendTime = DateTime.Now;
private EEProtocol proto;
public class MessageArgs : EventArgs
{
public bool IsError { get; set; }
public string Message { get; set; }
public MessageArgs(bool iserr,string m)
{
this.IsError = iserr;
this.Message = m;
}
}
public event EventHandler<MessageArgs> MessageReceived;
public event EventHandler<EEProtocol.DataEventArgs> ProtocReceived;
public Xbee()
{
this.DataReceived += Xbee_DataReceived;
@@ -35,7 +50,7 @@ namespace Project.Device
proto.OnMessage -= Proto_OnMessage;
}
/// <summary>
/// 지그비장치에 데이터를 전송합니다
/// </summary>
@@ -78,100 +93,15 @@ namespace Project.Device
var id = e.ReceivedPacket.ID.ToString("X2");
PUB.logxbee.Add("RX", $"{hexstrRaw}\nID:{id},CMD:{cmd},DATA:{hexstr}");
//TODO : 기능 처리필요 (XBee 메세지 데이터처리)
//PUB.CheckManualChargeMode() : 수동충전확인
//VAR.BOOL[eVarBool.FLAG_AUTORUN] : 자동실행
//PUB.Speak("현재 위치는 QA 입니다.") : 음성출력
ProtocReceived?.Invoke(this, e);
//ACS 수신 데이터 처리(타 장비는 확인하지 않는다)
if (e.ReceivedPacket.ID == 0)
{
var data = e.ReceivedPacket.Data;
switch (e.ReceivedPacket.Command)
{
case 1: //Request PATH
var pathID = data[0];
var pathPage = data[1];
//TODO : 요청받은 맵 데이터를 전송해야한다
break;
case 100: //move to tag
var TargetTag = System.Text.Encoding.Default.GetString(data, 0, 6);
//1.현재위치에서 경로계산 하여 경로저장
//2.현재위치를 모를경우 이전 이동 기록을 통해 위치를 추정한다
//3.대상태그에 맞는 전/후진 방향을 결정하여 이동을 수행한다
break;
case 101: //stop
PUB.AGV.AGVMoveStop("xbee");
break;
case 102: //Error Reset
PUB.AGV.AGVErrorReset();
break;
case 103: //charing command (0:off, 1:on)
var CharingCmd = data[0];
//0.자동모드가 아니라면 실행하지 않는다
//1.충전프로세스를 시작한다
//2.1분간 충전진행 신호가 없다면 반대편으로 1TAG이동하여 다시 시도한다
//3.3회 시도 실패시 오류 데이터를 HOST에 전송한다
break;
case 104: //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
arDev.Narumi.ManulOpt opt = arDev.Narumi.ManulOpt.BS;
arDev.Narumi.Speed spd = arDev.Narumi.Speed.Low;
if (Speed == 1) spd = arDev.Narumi.Speed.Mid;
else if (Speed == 2) spd = arDev.Narumi.Speed.High;
//0.자동모드가 아니라면 실행하지 않는다
//1.입력된 파라미터로 AGV를 이동한다
if (Direction == 0) opt = arDev.Narumi.ManulOpt.BS;
else if (Direction == 1) opt = arDev.Narumi.ManulOpt.FS;
else if (Direction == 2) opt = arDev.Narumi.ManulOpt.LT;
else if (Direction == 3) opt = arDev.Narumi.ManulOpt.RT;
PUB.AGV.AGVMoveManual(opt, spd, arDev.Narumi.Sensor.PBSOn);
break;
case 105: //Set MarkStop
var MarkStop = data[0]; //0=off, 1=on
//마크센서에서 멈추게 한다
PUB.AGV.AGVMoveStop("Xbee", arDev.Narumi.eStopOpt.MarkStop);
break;
case 106: //Lift Control
var LiftCommand = data[0]; //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);
break;
case 107: //clear path
//TODO: 현재 설정된 경로삭제기능 필요
break;
case 108: //send path
//TODO : 경로정보를 수신받고 페이지가 1을 초과하면 나머지 페이지정보도 요청할 수 있어야 한다
break;
}
}
}
private void Proto_OnMessage(object sender, EEProtocol.MessageEventArgs e)
{
if (e.IsError) PUB.log.AddE(e.Message);
else PUB.log.Add(e.Message);
MessageReceived?.Invoke(this, new MessageArgs(e.IsError, e.Message));
}
@@ -207,7 +137,7 @@ namespace Project.Device
Send(packet);
}
/// <summary>