..
This commit is contained in:
@@ -12,20 +12,75 @@ using AR;
|
||||
|
||||
namespace arDev
|
||||
{
|
||||
public enum eNarumiTurn
|
||||
{
|
||||
None = 0,
|
||||
LeftIng,
|
||||
Left,
|
||||
RightIng,
|
||||
Right,
|
||||
}
|
||||
public class NarumiTurnInfo
|
||||
{
|
||||
public DateTime Start { get; set; }
|
||||
public DateTime End { get; set; }
|
||||
public TimeSpan Runtime
|
||||
{
|
||||
get
|
||||
{
|
||||
if (End.Year < 2000) return DateTime.Now - Start;
|
||||
if (End < Start) return DateTime.Now - Start;
|
||||
else return End - Start;
|
||||
}
|
||||
}
|
||||
public eNarumiTurn State { get; set; }
|
||||
public NarumiTurnInfo()
|
||||
{
|
||||
Start = new DateTime(1982, 11, 23);
|
||||
End = new DateTime(1982, 11, 23);
|
||||
State = eNarumiTurn.None;
|
||||
}
|
||||
}
|
||||
public class NarumiCommandTime
|
||||
{
|
||||
public DateTime Time { get; set; }
|
||||
public ushort count { get; set; }
|
||||
public NarumiCommandTime(ushort cnt)
|
||||
{
|
||||
Time = DateTime.Now;
|
||||
this.count = cnt;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// error 이상은모두 처리불가한 오류 조건을 의미한다
|
||||
/// </summary>
|
||||
public enum eNarumiCommandResult : byte
|
||||
{
|
||||
Fail = 0,
|
||||
Success = 1,
|
||||
Wait = 2,
|
||||
Error = 100,
|
||||
Timeout,
|
||||
|
||||
}
|
||||
public partial class Narumi
|
||||
{
|
||||
public NarumiTurnInfo TurnInformation { get; set; } = null;
|
||||
Dictionary<string, NarumiCommandTime> SendCommandFailList { get; set; } = new Dictionary<string, NarumiCommandTime>();
|
||||
|
||||
public bool AGVMoveSet(BunkiData opt)
|
||||
public eNarumiCommandResult AGVMoveSet(BunkiData opt)
|
||||
{
|
||||
return AddCommand(eAgvCmd.MoveSet, opt.ToString());
|
||||
var param = opt.ToString();
|
||||
return AddCommand(eAgvCmd.MoveSet, param);
|
||||
}
|
||||
|
||||
public bool AGVMoveManual(ManulOpt opt, Speed spd, Sensor ss)
|
||||
public eNarumiCommandResult AGVMoveManual(ManulOpt opt, Speed spd, Sensor ss)
|
||||
{
|
||||
var param = opt.ToString() + spd.ToString()[0] + ((int)ss).ToString();
|
||||
return AddCommand(eAgvCmd.ManualMove, param);
|
||||
}
|
||||
public bool AGVMoveRun(eRunOpt opt = eRunOpt.NotSet)
|
||||
public eNarumiCommandResult AGVMoveRun(eRunOpt opt = eRunOpt.NotSet)
|
||||
{
|
||||
System.Text.StringBuilder sb = new StringBuilder();
|
||||
if (opt == eRunOpt.Backward) sb.Append("B");
|
||||
@@ -35,7 +90,7 @@ namespace arDev
|
||||
return AddCommand(eAgvCmd.MoveStart, sb.ToString());
|
||||
}
|
||||
|
||||
public bool AGVSetSpeed(eSetSpeed item, int speed)
|
||||
public eNarumiCommandResult AGVSetSpeed(eSetSpeed item, int speed)
|
||||
{
|
||||
string cmd = "SS";
|
||||
if (item == eSetSpeed.Rotation) cmd = "SRS";
|
||||
@@ -43,7 +98,7 @@ namespace arDev
|
||||
cmd += speed.ToString("0000");
|
||||
return AddCommand(cmd);
|
||||
}
|
||||
public bool AGVMoveStop(string Reason, eStopOpt opt = eStopOpt.Stop)
|
||||
public eNarumiCommandResult AGVMoveStop(string Reason, eStopOpt opt = eStopOpt.Stop)
|
||||
{
|
||||
System.Text.StringBuilder sb = new StringBuilder();
|
||||
if (opt == eStopOpt.MarkStop) sb.Append("MS");
|
||||
@@ -53,147 +108,187 @@ namespace arDev
|
||||
else sb.Append("0S");
|
||||
sb.Append("00");
|
||||
sb.Append("0000"); //재기동시간
|
||||
//if (opt == eStopOpt.MarkStop)
|
||||
// VAR.BOOL[eVarBool.NEXTSTOP_MARK] = true;
|
||||
|
||||
//동작중이면 이 멈춤 명령을 기록으로 남긴다 230116
|
||||
if (this.system1.agv_run)
|
||||
RaiseMessage(MessageType.Normal, $"stop command from {Reason}");
|
||||
return AddCommand(eAgvCmd.MoveStop, sb.ToString());
|
||||
var retval = AddCommand(eAgvCmd.MoveStop, sb.ToString());
|
||||
if (retval == eNarumiCommandResult.Success && opt == eStopOpt.MarkStop)
|
||||
VAR.BOOL[eVarBool.NEXTSTOP_MARK] = true;
|
||||
|
||||
return retval;
|
||||
}
|
||||
public bool AGVCommand(string cmd, string data)
|
||||
public eNarumiCommandResult AGVCommand(string cmd, string data)
|
||||
{
|
||||
return AddCommand(cmd + data);
|
||||
}
|
||||
|
||||
public bool LiftControl(LiftCommand cmd)
|
||||
public eNarumiCommandResult LiftControl(LiftCommand cmd)
|
||||
{
|
||||
return AddCommand(eAgvCmd.LiftControl, cmd.ToString());
|
||||
}
|
||||
public bool AGVCharge(int chargetID, bool on, int waittime = 3)
|
||||
public eNarumiCommandResult AGVCharge(int chargetID, bool on, int waittime = 3)
|
||||
{
|
||||
if (on)
|
||||
return AddCommand(eAgvCmd.ChargeOn, chargetID.ToString("0000"));
|
||||
else
|
||||
return AddCommand(eAgvCmd.ChargeOf, chargetID.ToString("0000"));
|
||||
}
|
||||
public bool SetBackturnTime(int time)
|
||||
public eNarumiCommandResult SetBackturnTime(int time)
|
||||
{
|
||||
return AddCommand(eAgvCmd.BackTrunResumeTime, time.ToString("0000"));
|
||||
}
|
||||
public bool SetGateOutOffTime(int time)
|
||||
public eNarumiCommandResult SetGateOutOffTime(int time)
|
||||
{
|
||||
return AddCommand(eAgvCmd.GateoutTime, time.ToString("0000"));
|
||||
}
|
||||
|
||||
public bool TurnGDSCenterScope(UInt16 time)
|
||||
public eNarumiCommandResult TurnGDSCenterScope(UInt16 time)
|
||||
{
|
||||
if (time > 2000) time = 2000;
|
||||
return AddCommand(eAgvCmd.TurnGDSCenterScope, time.ToString("0000"));
|
||||
}
|
||||
public bool AGVMoveLeft180Turn()
|
||||
public eNarumiCommandResult AGVMoveLeft180Turn()
|
||||
{
|
||||
return AddCommand(eAgvCmd.TurnLeft);
|
||||
}
|
||||
public bool AGVMoveRight180Turn()
|
||||
public eNarumiCommandResult AGVMoveRight180Turn()
|
||||
{
|
||||
return AddCommand(eAgvCmd.TurnRight);
|
||||
}
|
||||
public bool AGVMoveBack180Turn(bool leftTurn)
|
||||
public eNarumiCommandResult AGVMoveBack180Turn(bool leftTurn)
|
||||
{
|
||||
var dir = leftTurn ? "L" : "R";
|
||||
return AddCommand(eAgvCmd.BackAndTurn, dir);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public bool AGVErrorReset()
|
||||
public eNarumiCommandResult AGVErrorReset()
|
||||
{
|
||||
return AddCommand(eAgvCmd.ErrorReset, "FFFF");
|
||||
}
|
||||
public bool AGVTowerLamp(bool on)
|
||||
public eNarumiCommandResult AGVTowerLamp(bool on)
|
||||
{
|
||||
return AddCommand(eAgvCmd.TowerLamp, (on ? "I" : "O"));
|
||||
}
|
||||
public bool AGVSetAddress(int value)
|
||||
public eNarumiCommandResult AGVSetAddress(int value)
|
||||
{
|
||||
return AddCommand($"SAD{value:0000}");
|
||||
}
|
||||
public bool AGVSetPanID(string value)
|
||||
public eNarumiCommandResult AGVSetPanID(string value)
|
||||
{
|
||||
value = value.PadLeft(4, '0');
|
||||
return AddCommand($"SPN{value}");
|
||||
}
|
||||
public bool AGVSetChannel(string value)
|
||||
public eNarumiCommandResult AGVSetChannel(string value)
|
||||
{
|
||||
value = value.PadLeft(4, '0');
|
||||
return AddCommand($"SCH{value}");
|
||||
}
|
||||
//public bool AGVGateOutTimer(int value)
|
||||
//{
|
||||
// return AddCommand($"SGT{value:0000}");
|
||||
//}
|
||||
/// <summary>
|
||||
/// 정지감속주기 및 상수
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool AGVSetStopAcc(int interval, int value)
|
||||
{
|
||||
var cmds = new string[] {
|
||||
$"SSK{interval:0000}",
|
||||
$"SCK{value:0000}"
|
||||
};
|
||||
return AddCommand( cmds);
|
||||
}
|
||||
|
||||
public bool AGVSetTagReinputTime(int value)
|
||||
public eNarumiCommandResult AGVSetTagReinputTime(int value)
|
||||
{
|
||||
return AddCommand($"STT{value:0000}");
|
||||
}
|
||||
public bool AGVSetPID(eSetPIDSpeed speed, int P, int I, int D)
|
||||
{
|
||||
var cmd = "S";
|
||||
var cmd2 = "";
|
||||
if (speed == eSetPIDSpeed.High) cmd2 = "K";
|
||||
else if (speed == eSetPIDSpeed.Middle) cmd2 = "M";
|
||||
else if (speed == eSetPIDSpeed.Low) cmd2 = "L";
|
||||
else if (speed == eSetPIDSpeed.Stop) cmd2 = "S";
|
||||
|
||||
var cmds = new string[] {
|
||||
$"{cmd}P{cmd2}{P:0000}",
|
||||
$"{cmd}I{cmd2}{I:0000}",
|
||||
$"{cmd}D{cmd2}{D:0000}",
|
||||
};
|
||||
return AddCommand( cmds);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 전송을시도한 시간
|
||||
/// </summary>
|
||||
//public Dictionary<String,DateTime> LastCommandTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 전송에 성공한 명령시간
|
||||
/// </summary>
|
||||
//public Dictionary<String, DateTime> LastCommandOKTime { get; set; }
|
||||
protected bool AddCommand(params string[] cmds)
|
||||
///// <summary>
|
||||
///// 전송에 성공한 명령시간
|
||||
///// </summary>
|
||||
////public Dictionary<String, DateTime> LastCommandOKTime { get; set; }
|
||||
protected bool SendCommand(string cmdline)
|
||||
{
|
||||
bool ret = true;
|
||||
ACKData = string.Empty; //회신값 제거
|
||||
//LastCommandTime.Add(cmd, DateTime.Now);
|
||||
foreach (var cmdline in cmds)
|
||||
{
|
||||
var fullcmd = MakeCheckSum(cmdline);
|
||||
//commandQueue.Enqueue(fullcmd);
|
||||
if (WriteData(fullcmd) == false) ret = false;
|
||||
//else LastCommandOKTime.Add(cmd, DateTime.Now);
|
||||
System.Threading.Thread.Sleep(1);
|
||||
}
|
||||
ACKData = string.Empty;
|
||||
var fullcmd = MakeCheckSum(cmdline);
|
||||
if (WriteData(fullcmd) == false) ret = false;
|
||||
System.Threading.Thread.Sleep(1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ManualResetEvent mrecmd = new ManualResetEvent(true);
|
||||
public eNarumiCommandResult AddCommand(string cmd, int waitms = 1)
|
||||
{
|
||||
if (mrecmd.WaitOne(waitms) == false)
|
||||
{
|
||||
//다른명령을 처리하는 중이므로 대기상태로 반환한다
|
||||
return eNarumiCommandResult.Wait;
|
||||
}
|
||||
|
||||
protected bool AddCommand(eAgvCmd command, BunkiData param)
|
||||
//다른신호를 처리하지 못하게한다.
|
||||
mrecmd.Reset();
|
||||
|
||||
try
|
||||
{
|
||||
if (SendCommandFailList.ContainsKey(cmd) == false)
|
||||
{
|
||||
//실패기록이 없다
|
||||
var ret = SendCommand(cmd);
|
||||
if (ret == false)
|
||||
{
|
||||
SendCommandFailList.Add(cmd, new NarumiCommandTime(1));
|
||||
return eNarumiCommandResult.Fail;
|
||||
}
|
||||
else return eNarumiCommandResult.Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
//실패기록이 존재한다.
|
||||
//1.동일 명령이 아니면 바로 전송한다
|
||||
var precmd = SendCommandFailList[cmd];
|
||||
|
||||
//동일명령의 실패기록이 존재한다.
|
||||
//2초간의 간격을 둔다
|
||||
var ts = DateTime.Now - precmd.Time;
|
||||
if (ts.TotalSeconds < 2)
|
||||
{
|
||||
precmd.Time = DateTime.Now;
|
||||
SendCommandFailList[cmd] = precmd;
|
||||
return eNarumiCommandResult.Wait; //대기한다
|
||||
}
|
||||
else
|
||||
{
|
||||
//오류가 누적되었다.
|
||||
var ret = SendCommand(cmd);
|
||||
if (ret == false)
|
||||
{
|
||||
precmd.Time = DateTime.Now;
|
||||
precmd.count += 1;
|
||||
SendCommandFailList[cmd] = precmd;
|
||||
|
||||
//5회연속 실패했다면 타임아웃처리한다
|
||||
if (precmd.count > 5)
|
||||
{
|
||||
//타임아웃
|
||||
return eNarumiCommandResult.Timeout;
|
||||
}
|
||||
else
|
||||
{
|
||||
//실패
|
||||
return eNarumiCommandResult.Fail;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//전송이성공했으니 키를 제거한다.
|
||||
SendCommandFailList.Remove(cmd);
|
||||
return eNarumiCommandResult.Success;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"narumi addCommand error : {ex.Message}");
|
||||
return eNarumiCommandResult.Error;
|
||||
}
|
||||
finally
|
||||
{
|
||||
mrecmd.Set();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected eNarumiCommandResult AddCommand(eAgvCmd command, BunkiData param)
|
||||
{
|
||||
return AddCommand(command, param.ToString());
|
||||
}
|
||||
@@ -204,15 +299,15 @@ namespace arDev
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
/// <param name="Repeat"></param>
|
||||
protected bool AddCommand(BunkiData param)
|
||||
protected eNarumiCommandResult AddCommand(BunkiData param)
|
||||
{
|
||||
return AddCommand(eAgvCmd.MoveSet, param.ToString());
|
||||
}
|
||||
|
||||
protected bool AddCommand(eAgvCmd command, string param = "")
|
||||
protected eNarumiCommandResult AddCommand(eAgvCmd command, string param = "")
|
||||
{
|
||||
string cmdString;
|
||||
bool retval = false;
|
||||
eNarumiCommandResult retval = eNarumiCommandResult.Error;
|
||||
switch (command)
|
||||
{
|
||||
case eAgvCmd.ErrorReset:
|
||||
@@ -247,10 +342,24 @@ namespace arDev
|
||||
case eAgvCmd.TurnLeft:
|
||||
cmdString = $"CTL0000";
|
||||
retval = AddCommand(cmdString);
|
||||
if (retval == eNarumiCommandResult.Success)
|
||||
{
|
||||
if (TurnInformation == null) TurnInformation = new NarumiTurnInfo();
|
||||
TurnInformation.Start = DateTime.Now;
|
||||
TurnInformation.End = new DateTime(1982, 11, 23);
|
||||
TurnInformation.State = eNarumiTurn.LeftIng;
|
||||
}
|
||||
break;
|
||||
case eAgvCmd.TurnRight:
|
||||
cmdString = $"CTR0000";
|
||||
retval = AddCommand(cmdString);
|
||||
if (retval == eNarumiCommandResult.Success)
|
||||
{
|
||||
if (TurnInformation == null) TurnInformation = new NarumiTurnInfo();
|
||||
TurnInformation.Start = DateTime.Now;
|
||||
TurnInformation.End = new DateTime(1982, 11, 23);
|
||||
TurnInformation.State = eNarumiTurn.RightIng;
|
||||
}
|
||||
break;
|
||||
case eAgvCmd.BackAndTurn:
|
||||
if (param.isEmpty()) param = "L";
|
||||
|
||||
Reference in New Issue
Block a user