Commit 8cdab11f 张东亮

云仓上料机构满时,将点料机满料送到分盘线。避免点料机拥堵

1 个父辈 ebb0ddf4
正在显示 46 个修改的文件 包含 734 行增加1878 行删除
...@@ -50,6 +50,21 @@ ...@@ -50,6 +50,21 @@
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/> <conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout> </layout>
</appender> </appender>
<appender name="RunLog" type="log4net.Appender.RollingFileAppender">
<file value="logs/runLog/RunLog.json"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="10" />
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m%n"/>
</layout>
</appender>
<logger name="RunLog">
<level value="debug"/>
<appender-ref ref="RunLog"/>
</logger>
<logger name="MiR_API"> <logger name="MiR_API">
<level value="Error"/> <level value="Error"/>
<appender-ref ref="MiR_API"/> <appender-ref ref="MiR_API"/>
......
...@@ -57,13 +57,13 @@ namespace AGVControl ...@@ -57,13 +57,13 @@ namespace AGVControl
CommonVar.agvInfo[i].StateKanban.Init(); CommonVar.agvInfo[i].StateKanban.Init();
} }
for (int i = 0; i < CommonVar.nodeInfo.Count; i++) for (int i = 0; i < NodeManager.nodeInfo.Count; i++)
{ {
n = DgvNode.Rows.Add(CommonVar.nodeInfo[i].ToRow()); n = DgvNode.Rows.Add(NodeManager.nodeInfo[i].ToRow());
DgvNode.Rows[n].HeaderCell.Value = (n + 1).ToString(); DgvNode.Rows[n].HeaderCell.Value = (n + 1).ToString();
if (i % 2 == 0) if (i % 2 == 0)
DgvNode.Rows[n].DefaultCellStyle.BackColor = Color.LightBlue; DgvNode.Rows[n].DefaultCellStyle.BackColor = Color.LightBlue;
if (!CommonVar.nodeInfo[i].Online) if (!NodeManager.nodeInfo[i].Online)
DgvNode.Rows[n].DefaultCellStyle.ForeColor = Color.Red; DgvNode.Rows[n].DefaultCellStyle.ForeColor = Color.Red;
} }
} }
...@@ -72,9 +72,9 @@ namespace AGVControl ...@@ -72,9 +72,9 @@ namespace AGVControl
{ {
Invoke(new Action(() => Invoke(new Action(() =>
{ {
for (int i=0;i<CommonVar.nodeInfo.Count;i++) for (int i=0;i<NodeManager.nodeInfo.Count;i++)
{ {
DgvNode.Rows[i].SetValues(CommonVar.nodeInfo[i].ToRow()); DgvNode.Rows[i].SetValues(NodeManager.nodeInfo[i].ToRow());
} }
DgvNode.Refresh(); DgvNode.Refresh();
})); }));
...@@ -85,8 +85,8 @@ namespace AGVControl ...@@ -85,8 +85,8 @@ namespace AGVControl
{ {
Invoke(new Action(() => Invoke(new Action(() =>
{ {
for (int i = 0; i < CommonVar.nodeInfo.Count; i++) for (int i = 0; i < NodeManager.nodeInfo.Count; i++)
DgvNode.Rows[nodeIndex].DefaultCellStyle.ForeColor = CommonVar.nodeInfo[nodeIndex].Online ? Color.Black : Color.Red; DgvNode.Rows[i].DefaultCellStyle.ForeColor = NodeManager.nodeInfo[i].Online ? Color.Black : Color.Red;
DgvNode.Refresh(); DgvNode.Refresh();
})); }));
System.GC.Collect(); System.GC.Collect();
...@@ -164,10 +164,10 @@ namespace AGVControl ...@@ -164,10 +164,10 @@ namespace AGVControl
if (e.ColumnIndex == DgvNode.Columns.Count - 1) //调用 if (e.ColumnIndex == DgvNode.Columns.Count - 1) //调用
{ {
CommonVar.nodeInfo[e.RowIndex].IsUse = !CommonVar.nodeInfo[e.RowIndex].IsUse; NodeManager.nodeInfo[e.RowIndex].IsUse = !NodeManager.nodeInfo[e.RowIndex].IsUse;
DgvNode.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = CommonVar.nodeInfo[e.RowIndex].IsUse.ToString(); DgvNode.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = NodeManager.nodeInfo[e.RowIndex].IsUse.ToString();
CommonVar.WriteIni(CommonVar.nodeInfo[e.RowIndex].Name, SettingString.IsUse, CommonVar.nodeInfo[e.RowIndex].IsUse.ToString()); CommonVar.WriteIni(NodeManager.nodeInfo[e.RowIndex].Name, SettingString.IsUse, NodeManager.nodeInfo[e.RowIndex].IsUse.ToString());
DgvNode.Rows[e.RowIndex].SetValues(CommonVar.nodeInfo[e.RowIndex].ToRow()); DgvNode.Rows[e.RowIndex].SetValues(NodeManager.nodeInfo[e.RowIndex].ToRow());
} }
} }
...@@ -189,6 +189,14 @@ namespace AGVControl ...@@ -189,6 +189,14 @@ namespace AGVControl
lblStandy3.Text = "待机位3:" + CommonVar.Standby.Station[2]; lblStandy3.Text = "待机位3:" + CommonVar.Standby.Station[2];
lblStandy4.Text = "待机位4:" + CommonVar.Standby.Station[3]; lblStandy4.Text = "待机位4:" + CommonVar.Standby.Station[3];
})); }));
Invoke(new Action(() =>
{
for (int i = 0; i < NodeManager.nodeInfo.Count; i++)
{
DgvNode.Rows[i].SetValues(NodeManager.nodeInfo[i].ToRow());
}
DgvNode.Refresh();
}));
Application.DoEvents(); Application.DoEvents();
InShhow = false; InShhow = false;
} }
......
...@@ -49,7 +49,8 @@ namespace AGVControl ...@@ -49,7 +49,8 @@ namespace AGVControl
//添加Init任务 //添加Init任务
Agv.AssignTask(SettingString.Init); Agv.AssignTask(SettingString.Init);
} }
if (Agv.TaskQueue.Count > 0)
Agv.TaskQueue.TryDequeue(out string qq);
CommonVar.Standby.DelOccupyInfo(Agv.Name); CommonVar.Standby.DelOccupyInfo(Agv.Name);
CommonVar.Charge.DelOccupyInfo(Agv.Name); CommonVar.Charge.DelOccupyInfo(Agv.Name);
......
...@@ -99,7 +99,7 @@ namespace AGVControl ...@@ -99,7 +99,7 @@ namespace AGVControl
CommonVar.showNameMissionName.Add(temp[1], temp[0]); CommonVar.showNameMissionName.Add(temp[1], temp[0]);
} }
CommonVar.nodeInfo = new List<ClientNode>(); NodeManager.nodeInfo = new List<ClientNode>();
path = CommonVar.CONFIG_PATH + SettingString.FileName_AgvProductionLine; path = CommonVar.CONFIG_PATH + SettingString.FileName_AgvProductionLine;
line = System.IO.File.ReadAllLines(path, Encoding.GetEncoding("gb2312")); line = System.IO.File.ReadAllLines(path, Encoding.GetEncoding("gb2312"));
for (int i = 1; i < line.Length; i++) for (int i = 1; i < line.Length; i++)
...@@ -107,7 +107,7 @@ namespace AGVControl ...@@ -107,7 +107,7 @@ namespace AGVControl
temp = line[i].Split(','); temp = line[i].Split(',');
if (temp.Length != 3) continue; if (temp.Length != 3) continue;
Boolean.TryParse(CommonVar.ReadIni(temp[0], SettingString.IsUse), out bool isUse); Boolean.TryParse(CommonVar.ReadIni(temp[0], SettingString.IsUse), out bool isUse);
CommonVar.nodeInfo.Add(new ClientNode(temp[0], temp[1],temp[2], isUse)); NodeManager.nodeInfo.Add(new ClientNode(temp[0], temp[1],temp[2], isUse));
} }
//加载任务类型 //加载任务类型
......
文件属性发生变化
...@@ -117,7 +117,7 @@ ...@@ -117,7 +117,7 @@
// lblTask // lblTask
// //
this.lblTask.Dock = System.Windows.Forms.DockStyle.Left; this.lblTask.Dock = System.Windows.Forms.DockStyle.Left;
this.lblTask.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.lblTask.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblTask.Image = global::AGV_UI.Properties.Resources.task; this.lblTask.Image = global::AGV_UI.Properties.Resources.task;
this.lblTask.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; this.lblTask.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.lblTask.Location = new System.Drawing.Point(0, 0); this.lblTask.Location = new System.Drawing.Point(0, 0);
......
文件属性发生变化
文件属性发生变化
文件属性发生变化
文件属性发生变化
文件属性发生变化
文件属性发生变化
文件属性发生变化
文件属性发生变化
文件属性发生变化
...@@ -418,7 +418,7 @@ namespace DeviceLibrary ...@@ -418,7 +418,7 @@ namespace DeviceLibrary
} }
// //
/// <summary> /// <summary>
/// 解码 AB 91 123 34 78 97 109 101 34 58 34 BA AB 91 123 34 78 97 109 101 34 58 34 BA /// 解码
/// </summary> /// </summary>
/// <param name="buff"></param> /// <param name="buff"></param>
/// <returns></returns> /// <returns></returns>
...@@ -462,19 +462,19 @@ namespace DeviceLibrary ...@@ -462,19 +462,19 @@ namespace DeviceLibrary
private void UpdateNode(ClientNode node) private void UpdateNode(ClientNode node)
{ {
int idx = CommonVar.nodeInfo.FindIndex(s => s.Name == node.Name); int idx = NodeManager.FindNode(node.Name);
if (idx == -1) if (idx == -1)
{ {
log.Error(node.Name + " 不存在"); log.Error(node.Name + " 不存在");
return; return;
} }
if (!CommonVar.nodeInfo[idx].Online) if (!NodeManager.nodeInfo[idx].Online)
{ {
CommonVar.nodeInfo[idx].Online = true; NodeManager.nodeInfo[idx].Online = true;
NodeOnline?.Invoke(idx); NodeOnline?.Invoke(idx);
} }
if (CommonVar.nodeInfo[idx].CheckNodeStateChanged(node)) if (NodeManager.nodeInfo[idx].CheckNodeStateChanged(node))
{ {
log.Info("节点状态更新 " + node.StatetText()); log.Info("节点状态更新 " + node.StatetText());
NodeChanged?.Invoke(idx); NodeChanged?.Invoke(idx);
...@@ -489,9 +489,9 @@ namespace DeviceLibrary ...@@ -489,9 +489,9 @@ namespace DeviceLibrary
for (int i = 0; i < client.nodeName.Count; i++) for (int i = 0; i < client.nodeName.Count; i++)
{ {
int idx = CommonVar.nodeInfo.FindIndex(s => s.Name == client.nodeName[i]); int idx = NodeManager.FindNode(client.nodeName[i]);
if (idx == -1) continue; if (idx == -1) continue;
CommonVar.nodeInfo[idx].Offline(); NodeManager.nodeInfo[idx].Offline();
NodeOnline?.Invoke(idx); NodeOnline?.Invoke(idx);
} }
client.nodeName.Clear(); client.nodeName.Clear();
......
...@@ -15,6 +15,7 @@ namespace DeviceLibrary ...@@ -15,6 +15,7 @@ namespace DeviceLibrary
public Dictionary<string, string> Station; public Dictionary<string, string> Station;
public const string AutoCharge1 = "AutoCharge1"; public const string AutoCharge1 = "AutoCharge1";
public const string AutoCharge2 = "AutoCharge2"; public const string AutoCharge2 = "AutoCharge2";
public const string AutoCharge3 = "AutoCharge3";
/// <summary> /// <summary>
/// 充电最大电量,小于该值或大于等待指定时间去充电 /// 充电最大电量,小于该值或大于等待指定时间去充电
/// </summary> /// </summary>
...@@ -29,6 +30,7 @@ namespace DeviceLibrary ...@@ -29,6 +30,7 @@ namespace DeviceLibrary
Station = new Dictionary<string, string>(); Station = new Dictionary<string, string>();
Station.Add(AutoCharge1, ""); Station.Add(AutoCharge1, "");
Station.Add(AutoCharge2, ""); Station.Add(AutoCharge2, "");
Station.Add(AutoCharge3, "");
string s = AppConfigHelper.GetValue(SettingString.ChargeThreshold); string s = AppConfigHelper.GetValue(SettingString.ChargeThreshold);
string[] arr = s.Split(','); string[] arr = s.Split(',');
BatteryMin = Convert.ToInt32(arr[0]); BatteryMin = Convert.ToInt32(arr[0]);
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets; using System.Net.Sockets;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
...@@ -14,10 +15,6 @@ namespace DeviceLibrary ...@@ -14,10 +15,6 @@ namespace DeviceLibrary
public static class CommonVar public static class CommonVar
{ {
/// <summary> /// <summary>
/// 节点信息
/// </summary>
public static List<ClientNode> nodeInfo;
/// <summary>
/// 任务类型 /// 任务类型
/// </summary> /// </summary>
public static List<JobType> jobTypeInfo; public static List<JobType> jobTypeInfo;
...@@ -35,55 +32,46 @@ namespace DeviceLibrary ...@@ -35,55 +32,46 @@ namespace DeviceLibrary
public static Charge Charge; public static Charge Charge;
public static Standby Standby; public static Standby Standby;
public static string ReadIni(string section, string key) #region 任务日志
{ static log4net.ILog runLog = log4net.LogManager.GetLogger("RunLog");
return IniFileHelper.ReadValue(section, key, CONFIG_PATH + SettingString.FileName_tempData); static Dictionary<string, RunInfo> runInfoMap = new Dictionary<string, RunInfo>();
}
public static void WriteIni(string section, string key, string value) public static void RunLogInfo(RunInfo info)
{
IniFileHelper.WriteValue(section, key, value, CONFIG_PATH + SettingString.FileName_tempData);
}
public static bool GetNodeNameByAliceName(string aliceName, out string nodeName)
{ {
nodeName = ""; if (runInfoMap == null)
int id = nodeInfo.FindIndex(s => s.AliceName.Equals(aliceName)); return;
if (id > -1) if (runInfoMap.Keys.Contains(info.AGVNum))
{ {
nodeName = nodeInfo[id].Name; if (!runInfoMap[info.AGVNum].Equals(info))
return true; {
runLog.Info(info.ToString());
}
} }
else else
{ {
return false; runInfoMap.Add(info.AGVNum, info);
runLog.Info(info.ToString());
} }
} }
public static bool GetLineNameByNodeName(string nodeName, out string lineName) public static void ErrorLogRecord(ErrorInfo errorInfo)
{ {
lineName = ""; runLog.Info(errorInfo.ToString());
int id = nodeInfo.FindIndex(s => s.Name.Equals(nodeName));
if (id > -1)
{
lineName = nodeInfo[id].LineName;
return true;
}
else
{
return false;
}
} }
/// <summary> #endregion
/// 查找节点是否存在以及是否调用
/// </summary> public static string ReadIni(string section, string key)
/// <param name="nodeName">节点名称</param> {
/// <returns></returns> return IniFileHelper.ReadValue(section, key, CONFIG_PATH + SettingString.FileName_tempData);
public static int FindNode(string nodeName) }
public static void WriteIni(string section, string key, string value)
{ {
int idx = nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.IsUse); IniFileHelper.WriteValue(section, key, value, CONFIG_PATH + SettingString.FileName_tempData);
return idx;
} }
/// <summary> /// <summary>
/// 移动到节点位置 /// 移动到节点位置
/// </summary> /// </summary>
...@@ -96,13 +84,13 @@ namespace DeviceLibrary ...@@ -96,13 +84,13 @@ namespace DeviceLibrary
//清除目的地 //清除目的地
agv.Place = ""; agv.Place = "";
//执行下一个任务 //执行下一个任务
int i = FindNode(nodeName); int i = NodeManager.FindNode(nodeName);
bool rtn = agv.AssignTask(SettingString.Move + nodeName); bool rtn = agv.AssignTask(SettingString.Move + nodeName);
if (rtn) if (rtn)
{ {
agv.Place = nodeName; agv.Place = nodeName;
if (i > -1) if (i > -1)
log = string.Format("{0} {1} To Node {2} {3}", agv.Name, SettingString.Move, nodeName,nodeInfo[i].GetState().ToString()); log = string.Format("{0} {1} To Node {2} {3}", agv.Name, SettingString.Move, nodeName, NodeManager.GetState(i).ToString());
else else
log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Move, nodeName); log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Move, nodeName);
LogUtil.info(log); LogUtil.info(log);
...@@ -234,6 +222,141 @@ namespace DeviceLibrary ...@@ -234,6 +222,141 @@ namespace DeviceLibrary
} }
} }
public class RunInfo
{
/// <summary>
/// AGV编号
/// </summary>
public string AGVNum { get; set; } = "";
/// <summary>
/// 任务名称
/// </summary>
public string TaskName { get; set; } = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; set; } = "";
/// <summary>
/// 任务步骤
/// </summary>
public string TaskStep { get; set; } = "";
/// <summary>
/// 任务内容
/// </summary>
public string MissionInfo { get; set; } = "";
/// <summary>
/// 开始时间
/// </summary>
public string DateTime { get; set; } = "";
/// <summary>
/// 结束时间
/// </summary>
public string EndDateTime { get; set; } = "";
/// <summary>
/// 任务运行时长
/// </summary>
public string TaskRunTime { get; set; } = "";
/// <summary>
/// 类型
/// </summary>
public string Type { get; set; } = "Task";
public RunInfo(string AGVNum, string taskName, string targetPlace, string taskStep, string missionInfo, DateTime startTime)
{
//开始时间 2006-01-02 15:04:05
DateTime = startTime.ToString("yyyy-MM-dd HH:mm:ss");
EndDateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
this.AGVNum = AGVNum;
MissionInfo = missionInfo;
TaskName = taskName;
TaskRunTime = (System.DateTime.Now - startTime).TotalMinutes.ToString("f2");
TargetPlace = targetPlace;
TaskStep = taskStep;
}
public RunInfo() { }
public override bool Equals(object obj)
{
if (obj is RunInfo)
{
RunInfo info = (RunInfo)obj;
if (this.MissionInfo.Equals(info.MissionInfo))
return true;
this.MissionInfo = info.MissionInfo;
}
return false;
}
public override string ToString()
{
return JsonHelper.SerializeObject(this);
}
}
public class ErrorInfo
{
/// <summary>
/// AGV编号
/// </summary>
public string AGVNum
{
get { return agvname; }
set
{
agvname = value.PadLeft(4, '0');
}
}
private string agvname = "";
/// <summary>
/// 开始时间
/// </summary>
public string DateTime { get; set; } = "";
/// <summary>
/// 结束时间
/// </summary>
public string EndDateTime { get; set; } = "";
/// <summary>
/// 异常信息
/// </summary>
public string ErrorMsg { get; set; } = "";
public string ErrorLastTime { get; set; } = "";
/// <summary>
/// 任务名称
/// </summary>
public string TaskName { get; set; } = "";
/// <summary>
/// AGV的当前任务
/// </summary>
public string AGVMissionName { get; set; } = "";
public string MissionInfo { get; set; } = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; set; } = "";
/// <summary>
/// 类型
/// </summary>
public string Type { get; set; } = "Error";
public ErrorInfo(Agv_Info agv)
{
DateTime = agv.errStartTime.ToString("yyyy-MM-dd HH:mm:ss");
AGVNum = agv.Name;
EndDateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ErrorMsg = agv.ErrorMsg;
ErrorLastTime = (System.DateTime.Now - agv.errStartTime).TotalMinutes.ToString("f2");
if (agv.CurJob != null)
{
TaskName = agv.CurJob.JobName;
MissionInfo = agv.CurJob.runInfo;
}
AGVMissionName = agv.CurTaskName;
TargetPlace = agv.Place;
}
public override string ToString()
{
return JsonHelper.SerializeObject(this);
}
}
public static class Window_API public static class Window_API
{ {
......
文件属性发生变化
...@@ -23,7 +23,7 @@ namespace DeviceLibrary ...@@ -23,7 +23,7 @@ namespace DeviceLibrary
/// <summary> /// <summary>
/// 限制区域 /// 限制区域
/// </summary> /// </summary>
public ScopeLimit limitArea; public ScopeLimit limitArea;
public Control() public Control()
{ {
...@@ -85,13 +85,34 @@ namespace DeviceLibrary ...@@ -85,13 +85,34 @@ namespace DeviceLibrary
{ {
if (!CheckOnline(i)) continue; if (!CheckOnline(i)) continue;
bool change = false; bool change = false;
if (!CommonVar.agvInfo[i].AllocatingTask && CommonVar.agvInfo[i].IsUse && CommonVar.agvInfo[i].CurJob != null && CommonVar.agvInfo[i].CurTaskID.Equals(-1))
{
if (!MiR_API.Get_Fleet_Mission_Info(CommonVar.agvInfo[i]))
{
CommonVar.agvInfo[i].CurJob.ResendTask(CommonVar.agvInfo[i]);
LogUtil.info($"{CommonVar.agvInfo[i].Name}:Task=-1处理,Fleet无任务,重发任务:{CommonVar.agvInfo[i].CurTaskName}");
}
else
{
LogUtil.info($"{CommonVar.agvInfo[i].Name}:Task=-1处理,Fleet有任务,手动赋值FleetTaskID={CommonVar.agvInfo[i].CurTaskID}");
}
}
MiR_API.Get_Task_State(CommonVar.agvInfo[i], out string stateStr); MiR_API.Get_Task_State(CommonVar.agvInfo[i], out string stateStr);
Thread.Sleep(50); Thread.Sleep(50);
//获取AGV状态 //获取AGV状态
rtn = MiR_API.Get_State(CommonVar.agvInfo[i], out eAGVState stateID, out string stateText, out int battery, out string mission_text, out Agv_Info.AgvPosition position); rtn = MiR_API.Get_State(CommonVar.agvInfo[i], out eAGVState stateID, out string stateText, out int battery, out string mission_text, out Agv_Info.AgvPosition position);
Thread.Sleep(50); Thread.Sleep(50);
change = CommonVar.agvInfo[i].SetState(stateID, stateStr, battery, mission_text, position); change = CommonVar.agvInfo[i].SetState(stateID, stateStr, battery, mission_text, position);
if(CommonVar.agvInfo[i].TaskQueue.Count>0 && CommonVar.agvInfo[i].CurTaskID.Equals(-1))
{
if(CommonVar.agvInfo[i].IsCon)
{
if (CommonVar.agvInfo[i].TaskQueue.TryDequeue(out string taskname))
{
CommonVar.agvInfo[i].AssignTask(taskname);
}
}
}
//更新状态stateID.Equals(eAGVState.Executing) //更新状态stateID.Equals(eAGVState.Executing)
if (change) if (change)
{ {
......
...@@ -50,22 +50,18 @@ ...@@ -50,22 +50,18 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AGVManager.cs" /> <Compile Include="manager\APIManager.cs" />
<Compile Include="AgvServer.cs" /> <Compile Include="AgvServer.cs" />
<Compile Include="bean\Agv_Info.cs" /> <Compile Include="bean\Agv_Info.cs" />
<Compile Include="bean\Job.cs" /> <Compile Include="bean\Job.cs" />
<Compile Include="bean\JobParam.cs" />
<Compile Include="bean\JobStep.cs" /> <Compile Include="bean\JobStep.cs" />
<Compile Include="bean\JobType.cs" /> <Compile Include="bean\JobType.cs" />
<Compile Include="bean\jobType\ChargeJobType.cs" /> <Compile Include="bean\jobType\ChargeJobType.cs" />
<Compile Include="bean\jobType\PackingJobType.cs" />
<Compile Include="bean\jobType\ReelStringJobType.cs" /> <Compile Include="bean\jobType\ReelStringJobType.cs" />
<Compile Include="bean\jobType\ReturnJobType.cs" /> <Compile Include="bean\jobType\ReturnJobType.cs" />
<Compile Include="bean\job\ChargeJob.cs" /> <Compile Include="bean\job\ChargeJob.cs" />
<Compile Include="bean\job\EnterLeaveShelfJob.cs" />
<Compile Include="bean\job\GetShelfJob.cs" /> <Compile Include="bean\job\GetShelfJob.cs" />
<Compile Include="bean\job\PackingJob_GetShelf.cs" />
<Compile Include="bean\job\PackingJob_SendShelf.cs" />
<Compile Include="bean\job\PackingJob_TransferShelf.cs" />
<Compile Include="bean\job\RecycleEmptyShelf.cs" /> <Compile Include="bean\job\RecycleEmptyShelf.cs" />
<Compile Include="bean\job\SendShelfJob.cs" /> <Compile Include="bean\job\SendShelfJob.cs" />
<Compile Include="bean\job\StandyJob.cs" /> <Compile Include="bean\job\StandyJob.cs" />
...@@ -76,6 +72,7 @@ ...@@ -76,6 +72,7 @@
<Compile Include="Control.cs" /> <Compile Include="Control.cs" />
<Compile Include="DisplayBoard.cs" /> <Compile Include="DisplayBoard.cs" />
<Compile Include="bean\MiR_API.cs" /> <Compile Include="bean\MiR_API.cs" />
<Compile Include="manager\NodeManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ScopeLimit.cs" /> <Compile Include="ScopeLimit.cs" />
<Compile Include="Standby.cs" /> <Compile Include="Standby.cs" />
......
...@@ -40,7 +40,7 @@ namespace DeviceLibrary ...@@ -40,7 +40,7 @@ namespace DeviceLibrary
{ {
if (MsgList != null && MsgList.Count > 0) if (MsgList != null && MsgList.Count > 0)
{ {
AGVManager.updateDeviceAlarmMsg(MsgList); APIManager.updateDeviceAlarmMsg(MsgList);
ClearAlram(); ClearAlram();
} }
......
...@@ -36,9 +36,9 @@ namespace DeviceLibrary ...@@ -36,9 +36,9 @@ namespace DeviceLibrary
"10.85.199.114" "10.85.199.114"
}); });
this.positions = positions; this.positions = positions;
threadPoll = new Thread(ScopeDetecting); //threadPoll = new Thread(ScopeDetecting);
threadPoll.IsBackground = true; //threadPoll.IsBackground = true;
threadPoll.Start(); //threadPoll.Start();
} }
private void ScopeDetecting() private void ScopeDetecting()
{ {
......
文件属性发生变化
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Common; using Common;
...@@ -130,21 +131,37 @@ namespace DeviceLibrary ...@@ -130,21 +131,37 @@ namespace DeviceLibrary
public Job CurJob { get; set; } public Job CurJob { get; set; }
/// <summary> /// <summary>
/// 当前任务的ID号 /// 当前AGV任务的ID号
/// </summary> /// </summary>
public int CurTaskID { get; set; } = -1; public long CurTaskID { get; set; } = -1;
/// <summary>
/// 任务时间戳
/// </summary>
public string TimeStamp { get; set; } = "";
/// <summary>
/// 正在分配任务
/// </summary>
public bool AllocatingTask = false;
public string CurTaskState { get; set; } = ""; public string CurTaskState { get; set; } = "";
/// <summary> /// <summary>
/// 当前任务名称 /// 当前AGV任务名称
/// </summary> /// </summary>
public string CurTaskName { get; set; } public string CurTaskName { get; set; } = "";
/// <summary> /// <summary>
/// 当前任务的GUID /// 当前SGV任务的GUID
/// </summary> /// </summary>
public string CurTaskGUID { get; set; } public string CurTaskGUID { get; set; }
/// <summary> /// <summary>
/// 错误消息
/// </summary>
public string ErrorMsg { get; set; } = "";
public string ErrorLastTime { get; set; } = "";
/// <summary>
/// 任务期间是否有错误
/// </summary>
public bool HasError { get; set; } = false;
/// <summary>
/// 看板信息 /// 看板信息
/// </summary> /// </summary>
private DisplayBoard displayBoard; private DisplayBoard displayBoard;
...@@ -185,8 +202,8 @@ namespace DeviceLibrary ...@@ -185,8 +202,8 @@ namespace DeviceLibrary
Msg = ""; Msg = "";
Position = new Agv_Info.AgvPosition(); Position = new Agv_Info.AgvPosition();
displayBoard = new DisplayBoard(); displayBoard = new DisplayBoard();
RunInfos = new List<string>() { "状态","目的地", "RFID", "负载", "运行模式","任务信息", "AGV运行信息" }; RunInfos = new List<string>() { "状态", "目的地", "RFID", "负载", "运行模式", "任务信息", "AGV运行信息" };
TaskQueue = new ConcurrentQueue<string>();
StateKanban = new AGV_UI.Status(name, RunInfos); StateKanban = new AGV_UI.Status(name, RunInfos);
} }
public List<string> RunInfos; public List<string> RunInfos;
...@@ -197,6 +214,8 @@ namespace DeviceLibrary ...@@ -197,6 +214,8 @@ namespace DeviceLibrary
int OfflineLastTimeSeconds = 30; int OfflineLastTimeSeconds = 30;
DateTime standStartTime = DateTime.MaxValue; DateTime standStartTime = DateTime.MaxValue;
DateTime offlineStartTime = DateTime.MaxValue; DateTime offlineStartTime = DateTime.MaxValue;
DateTime agvErrorStartTime = DateTime.MaxValue;
bool errorState = false;
/// <summary> /// <summary>
/// 设置状态 /// 设置状态
/// </summary> /// </summary>
...@@ -241,7 +260,7 @@ namespace DeviceLibrary ...@@ -241,7 +260,7 @@ namespace DeviceLibrary
if (!StateID.Equals(stateID) || !CurTaskState.Equals(stateText) || !Battery.Equals(battery) if (!StateID.Equals(stateID) || !CurTaskState.Equals(stateText) || !Battery.Equals(battery)
|| !MissionText.Equals(missionText) || !IsExistShelf.Equals(preShelfState)) || !MissionText.Equals(missionText) || !IsExistShelf.Equals(preShelfState))
isChange = true; isChange = true;
if(!StateID.Equals(stateID)) if (!StateID.Equals(stateID))
{ {
StateID = stateID; StateID = stateID;
StateKanban.ShowInfo("状态", stateID.ToString()); StateKanban.ShowInfo("状态", stateID.ToString());
...@@ -259,15 +278,15 @@ namespace DeviceLibrary ...@@ -259,15 +278,15 @@ namespace DeviceLibrary
StateKanban.SetBattery(battery); StateKanban.SetBattery(battery);
} }
//"目的地", "RFID", "负载", "运行模式","任务信息", "AGV运行信息" //"目的地", "RFID", "负载", "运行模式","任务信息", "AGV运行信息"
if (CommonVar.nodeInfo != null && CommonVar.nodeInfo.Count != 0) if (NodeManager.nodeInfo != null && NodeManager.nodeInfo.Count != 0)
{ {
ClientNode node = CommonVar.nodeInfo.Find(ss => ss.Name == Place); ClientNode node = NodeManager.nodeInfo.Find(ss => ss.Name == Place);
if (node != null) if (node != null)
PlaceAliceName = node.AliceName; PlaceAliceName = node.AliceName;
else else
PlaceAliceName = Place; PlaceAliceName = Place;
} }
StateKanban.ShowInfo("目的地", PlaceAliceName); StateKanban.ShowInfo("目的地", PlaceAliceName);
StateKanban.ShowInfo("RFID", RFID); StateKanban.ShowInfo("RFID", RFID);
if (!IsExistShelf.Equals(preShelfState)) if (!IsExistShelf.Equals(preShelfState))
...@@ -282,7 +301,7 @@ namespace DeviceLibrary ...@@ -282,7 +301,7 @@ namespace DeviceLibrary
MissionText = missionText; MissionText = missionText;
StateKanban.ShowInfo("AGV运行信息", missionText); StateKanban.ShowInfo("AGV运行信息", missionText);
} }
CheckErrorState();
CheckOfflineTimeOut(); CheckOfflineTimeOut();
CheckStandTimeOut(position); CheckStandTimeOut(position);
UpdateDisplayBoard(); UpdateDisplayBoard();
...@@ -299,33 +318,65 @@ namespace DeviceLibrary ...@@ -299,33 +318,65 @@ namespace DeviceLibrary
{ {
displayBoard.Add(name, "Agv." + Name + "." + key, value, type); displayBoard.Add(name, "Agv." + Name + "." + key, value, type);
} }
public void SetErrorMsg(string msg, string lastTime)
{
if (ErrorMsg.Equals(""))
{
ErrorMsg = msg;
ErrorLastTime = lastTime;
errStartTime = DateTime.Now;
}
}
public void ClearErrorMsg()
{
ErrorLastTime = "";
ErrorMsg = "";
}
public DateTime errStartTime=DateTime.Now;
private void UpdateDisplayBoard() private void UpdateDisplayBoard()
{ {
bool isAlarm = false; bool isAlarm = false;
try try
{ {
int nodeIdx = CommonVar.FindNode(SettingString.D24_Out); int nodeIdx = NodeManager.FindNode(SettingString.D24_Out);
if (nodeIdx > -1) if (nodeIdx > -1)
displayBoard.Add("退料线出口状态", "doubleLine.ReturnLine", CommonVar.nodeInfo[nodeIdx].GetState().ToString(), 1); displayBoard.Add("退料线出口状态", "doubleLine.ReturnLine", NodeManager.nodeInfo[nodeIdx].GetState().ToString(), 1);
if (offlineTimeOut) if (offlineTimeOut)
{ {
isAlarm = true; isAlarm = true;
SetErrorMsg("在" + PlaceAliceName + "离线", (DateTime.Now - offlineStartTime).TotalMinutes.ToString("f2"));
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "离线" + (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2") + "秒"); displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "离线" + (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2") + "秒");
} }
else if (standTimeOut) else if (standTimeOut)
{ {
isAlarm = true; isAlarm = true;
SetErrorMsg("在" + PlaceAliceName + "停留超时", (DateTime.Now - standStartTime).TotalMinutes.ToString("f2"));
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "停留超时" + (DateTime.Now - standStartTime).TotalMinutes.ToString("f2") + "分钟"); displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "停留超时" + (DateTime.Now - standStartTime).TotalMinutes.ToString("f2") + "分钟");
} }
else if (StateID.Equals(eAGVState.Error) || StateID.Equals(eAGVState.EmergencyStop) || StateID.Equals(eAGVState.Pause)) else if (errorState)//StateID.Equals(eAGVState.Error) || StateID.Equals(eAGVState.EmergencyStop) || StateID.Equals(eAGVState.Pause)
{ {
isAlarm = true; isAlarm = true;
SetErrorMsg("状态:" + StateID.ToString(), (DateTime.Now - agvErrorStartTime).TotalMinutes.ToString("f2"));
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "状态:" + StateID.ToString()); displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "状态:" + StateID.ToString());
} }
else if (HasError)
{
isAlarm = true;
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", Msg);
}
if (!isAlarm) if (!isAlarm)
{ {
if(!ErrorMsg.Equals(""))//异常消除后正常,打印异常
{
CommonVar.ErrorLogRecord(new ErrorInfo(this));
ClearErrorMsg();
}
if (!Msg.Equals("")) if (!Msg.Equals(""))
{
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", Msg, 1); displayBoard.Add(Name, "lineAgv." + Name + ".Msg", Msg, 1);
}
else else
{ {
if ((Place.Contains(SettingString.AutoCharge) || Place.Contains(SettingString.Standby))) if ((Place.Contains(SettingString.AutoCharge) || Place.Contains(SettingString.Standby)))
...@@ -333,9 +384,8 @@ namespace DeviceLibrary ...@@ -333,9 +384,8 @@ namespace DeviceLibrary
displayBoard.Add(Name, "lineAgv." + Name + ".Place", Place, 1); displayBoard.Add(Name, "lineAgv." + Name + ".Place", Place, 1);
} }
} }
} }
displayBoard.UpdateAlarmMsg(); displayBoard.UpdateAlarmMsg();
} }
catch (Exception ex) catch (Exception ex)
...@@ -343,6 +393,7 @@ namespace DeviceLibrary ...@@ -343,6 +393,7 @@ namespace DeviceLibrary
LogUtil.error(Name + "上报小车信息失败" + ex.Message + ex.StackTrace); LogUtil.error(Name + "上报小车信息失败" + ex.Message + ex.StackTrace);
} }
} }
/// <summary> /// <summary>
/// 检查小车是否离线超时 /// 检查小车是否离线超时
/// </summary> /// </summary>
...@@ -364,7 +415,31 @@ namespace DeviceLibrary ...@@ -364,7 +415,31 @@ namespace DeviceLibrary
offlineTimeOut = false; offlineTimeOut = false;
if ((DateTime.Now - offlineStartTime).TotalSeconds > OfflineLastTimeSeconds) if ((DateTime.Now - offlineStartTime).TotalSeconds > OfflineLastTimeSeconds)
//LogUtil.error(string.Format("{0} 在{1}离线{2}秒", Name, PlaceAliceName, (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2"))); //LogUtil.error(string.Format("{0} 在{1}离线{2}秒", Name, PlaceAliceName, (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2")));
offlineStartTime = DateTime.Now; offlineStartTime = DateTime.Now;
}
}
/// <summary>
/// 检查小车是否报错
/// </summary>
/// <returns></returns>
private void CheckErrorState()
{
if (StateID.Equals(eAGVState.Error) || StateID.Equals(eAGVState.EmergencyStop) || StateID.Equals(eAGVState.Pause))
{
//满足条件,计算持续时间
if (agvErrorStartTime == DateTime.MaxValue)
{
agvErrorStartTime = DateTime.Now;
}
TimeSpan lastTimeSpan = DateTime.Now - agvErrorStartTime;
errorState = (lastTimeSpan.TotalSeconds >= OfflineLastTimeSeconds);
}
else
{
errorState = false;
if ((DateTime.Now - agvErrorStartTime).TotalSeconds > OfflineLastTimeSeconds)
agvErrorStartTime = DateTime.Now;
} }
} }
/// <summary> /// <summary>
...@@ -406,42 +481,17 @@ namespace DeviceLibrary ...@@ -406,42 +481,17 @@ namespace DeviceLibrary
} }
Position = position; Position = position;
} }
/// <summary>
public string[] ToRow() /// 任务队列
{ /// </summary>
//AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存 public ConcurrentQueue<string> TaskQueue;
List<string> s = new List<string>();
s.Add(Name);
s.Add(IP);
s.Add(StateID.ToString());
s.Add(CurTaskID.ToString());
s.Add(CurTaskName);
s.Add(CurTaskState);
//s.Add(Msg);
// s.Add(MissionText);
if (CommonVar.nodeInfo != null && CommonVar.nodeInfo.Count != 0)
{
ClientNode node = CommonVar.nodeInfo.Find(ss => ss.Name == Place);
if (node != null)
PlaceAliceName = node.AliceName;
else
PlaceAliceName = Place;
}
s.Add(PlaceAliceName);
s.Add(IsExistShelf ? "满载" : "空载");
s.Add(IsCon ? "在线" : "离线");
s.Add(Battery + "%");
s.Add(IsUse ? "是" : "否");
return s.ToArray();
}
/// <summary> /// <summary>
/// 给小车分配任务 /// 给小车分配任务
/// </summary> /// </summary>
public bool AssignTask(string taskName) public bool AssignTask(string taskName)
{ {
bool rtn=false; bool rtn = false;
DeleteAllTask();
if (Use_Fleet) if (Use_Fleet)
{ {
rtn = MiR_API.Add_Mission_Fleet(this, CommonVar.agvMission[taskName]); rtn = MiR_API.Add_Mission_Fleet(this, CommonVar.agvMission[taskName]);
...@@ -456,9 +506,10 @@ namespace DeviceLibrary ...@@ -456,9 +506,10 @@ namespace DeviceLibrary
} }
else else
{ {
TaskQueue.Enqueue(taskName);
LogUtil.info(string.Format("{0} 分配{1}任务失败", Name, taskName)); LogUtil.info(string.Format("{0} 分配{1}任务失败", Name, taskName));
} }
StateKanban.SetCurTask(CommonVar.showNameMissionName[taskName]); StateKanban.SetCurTask(CommonVar.showNameMissionName[taskName]+"\r\n"+CurTaskID);
MiR_API.State_Ready(this); MiR_API.State_Ready(this);
return rtn; return rtn;
} }
...@@ -470,7 +521,8 @@ namespace DeviceLibrary ...@@ -470,7 +521,8 @@ namespace DeviceLibrary
{ {
if (Use_Fleet) if (Use_Fleet)
{ {
MiR_API.Del_Mission_Fleet(this, id); //MiR_API.Del_Mission_Fleet(this, id);
MiR_API.Del_Mission(this);
} }
else else
{ {
......
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
public abstract class Job public abstract class Job
...@@ -12,13 +14,13 @@ namespace DeviceLibrary ...@@ -12,13 +14,13 @@ namespace DeviceLibrary
/// 运行信息 /// 运行信息
/// </summary> /// </summary>
public abstract string RunInfo { get; } public abstract string RunInfo { get; }
public string runInfo = "";
/// <summary> /// <summary>
/// 根据任务状态继续执行任务 /// 根据任务状态继续执行任务
/// </summary> /// </summary>
public abstract Job Execute(Agv_Info agv); public abstract Job Execute(Agv_Info agv);
public int CurTaskID { get; set; } = -1; public long CurTaskID { get; set; } = -1;
/// <summary> /// <summary>
/// 当前的任务名称(与任务GUID对应) /// 当前的任务名称(与任务GUID对应)
/// </summary> /// </summary>
...@@ -27,7 +29,19 @@ namespace DeviceLibrary ...@@ -27,7 +29,19 @@ namespace DeviceLibrary
/// 当前任务的执行状态 /// 当前任务的执行状态
/// </summary> /// </summary>
public string CurTaskState { get; set; } = "Wait"; public string CurTaskState { get; set; } = "Wait";
/// <summary>
/// Job开始时间
/// </summary>
public DateTime StartJobTime { get; set; } = DateTime.Now;
/// <summary>
/// Job名称
/// </summary>
public string JobName { get; set; } = "";
protected void RecordRunLog(Agv_Info agv,string JobStep,string runInfo,string targetPlace)
{
CommonVar.RunLogInfo(new RunInfo(agv.Name.PadLeft(4, '0'), JobName, targetPlace, JobStep, runInfo, StartJobTime));
}
/// <summary> /// <summary>
/// 更新任务信息 /// 更新任务信息
/// </summary> /// </summary>
...@@ -40,6 +54,8 @@ namespace DeviceLibrary ...@@ -40,6 +54,8 @@ namespace DeviceLibrary
//CurTaskState = SettingString.Wait; //CurTaskState = SettingString.Wait;
CurTaskState = CommonVar.GetTakJobState(agv); CurTaskState = CommonVar.GetTakJobState(agv);
} }
/// <summary> /// <summary>
/// 任务重发 /// 任务重发
/// </summary> /// </summary>
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class JobParam
{
}
}
...@@ -23,14 +23,14 @@ namespace DeviceLibrary ...@@ -23,14 +23,14 @@ namespace DeviceLibrary
//不为空,且与上一个消息不一样才打印 //不为空,且与上一个消息不一样才打印
if (!value.Equals(msg)) if (!value.Equals(msg))
{ {
LogUtil.info(value); // LogUtil.info(value);
} }
} }
msg = value; msg = value;
} }
} }
private DateTime startTime = DateTime.Now; public DateTime startTime = DateTime.Now;
public JobStep(T initStep) public JobStep(T initStep)
{ {
...@@ -54,13 +54,11 @@ namespace DeviceLibrary ...@@ -54,13 +54,11 @@ namespace DeviceLibrary
/// </summary> /// </summary>
/// <param name="timeOutMilliseconds"></param> /// <param name="timeOutMilliseconds"></param>
/// <returns></returns> /// <returns></returns>
public bool IsTimeOut(int timeOutMilliseconds,out double timeOutValue) public bool IsTimeOut(int timeOutMilliseconds,out TimeSpan span)
{ {
timeOutValue = 0; span = DateTime.Now - startTime;
TimeSpan span = DateTime.Now - startTime;
if (span.TotalMilliseconds > timeOutMilliseconds) if (span.TotalMilliseconds > timeOutMilliseconds)
{ {
timeOutValue = span.TotalSeconds;
return true; return true;
} }
return false; return false;
......
...@@ -237,68 +237,170 @@ namespace DeviceLibrary ...@@ -237,68 +237,170 @@ namespace DeviceLibrary
return false; return false;
} }
} }
/// <summary>
/// 添加任务到FLEET任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission_id"></param>
/// <returns></returns>
public static bool Add_Mission_Fleet(Agv_Info info, string mission_id, bool isRemovePreMission = true) public static bool Add_Mission_Fleet(Agv_Info info, string mission_id, bool isRemovePreMission = true)
{ {
try try
{ {
info.AllocatingTask = true;
info.CurTaskID = -1; info.CurTaskID = -1;
info.CurTaskGUID = ""; info.TimeStamp = "";
info.CurTaskState = SettingString.Wait; info.CurTaskGUID = mission_id;
var key = CommonVar.agvMission.Where(qq => qq.Value == mission_id).Select(qq => qq.Key); var key = CommonVar.agvMission.Where(qq => qq.Value == mission_id).Select(qq => qq.Key);
info.CurTaskName = key.ToList()[0]; info.CurTaskName = key.ToList()[0];
info.CurTaskState = SettingString.Wait;
//防止上一个任务已执行但返回失败时,删除任务 //防止上一个任务已执行但返回失败时,删除任务
Del_Mission(info); Del_Mission(info);
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 8, 0, 0)); // 当地时区
long timeStamp = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒数
info.TimeStamp = timeStamp.ToString();
string ip = AppConfigHelper.GetValue(SettingString.FLEET); string ip = AppConfigHelper.GetValue(SettingString.FLEET);
string url = "http://" + ip + "/api/v2.0.0/mission_scheduler"; string url = "http://" + ip + "/api/v2.0.0/mission_scheduler";
string body = "{\"mission_id\":\"" + mission_id + "\",\"robot_id\":" + info.Fleet_IP + "}"; //string body = "{\"mission_id\":\"" + mission_id + "\",\"robot_id\":" + info.ID + "}";
string body = "{\"mission_id\":\"" + mission_id + "\",\"robot_id\":" + info.Fleet_IP + ",\"description\":\"" + $"{info.CurTaskName}-{info.TimeStamp}-{info.Fleet_IP}" + "\"}";
string json = HttpPost(url, info.IP, info.Authorization, body); string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false; if (string.IsNullOrWhiteSpace(json))
{
info.AllocatingTask = false;
return false;
}
JavaScriptSerializer serializer = new JavaScriptSerializer(); JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json); Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) if (dic == null)
{ {
info.AllocatingTask = false;
return false; return false;
} }
//log.Info("URL: " + url + "\n" + "Return: " + json);
log.Info("URL: " + url + "\n" + "Return: " + json);
string s = dic["mission_id"].ToString(); string s = dic["mission_id"].ToString();
string id = dic["id"].ToString(); string id = dic["id"].ToString();
if (s == mission_id) if (s == mission_id)
{ {
try try
{ {
info.CurTaskID = Convert.ToInt32(id); info.CurTaskID = Convert.ToInt64(id);
info.CurTaskGUID = mission_id;
log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, key.ToList()[0])); log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, key.ToList()[0]));
} }
catch catch
{ {
log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, mission_id)); log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, mission_id));
info.CurTaskName = "";
} }
info.AllocatingTask = false;
return true; return true;
} }
else else
{
info.AllocatingTask = false;
return false; return false;
}
} }
catch (Exception ex) catch (Exception ex)
{ {
log.Error("Add_Mission_Fleet", ex); log.Error("Add_Mission_Fleet", ex);
info.AllocatingTask = false;
return false; return false;
} }
} }
/// <summary>
/// 添加任务到FLEET任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission_id"></param>
/// <returns></returns>
//public static bool Add_Mission_Fleet(Agv_Info info, string mission_id, bool isRemovePreMission = true)
//{
// try
// {
// info.CurTaskID = -1;
// info.CurTaskGUID = "";
// info.CurTaskState = SettingString.Wait;
// var key = CommonVar.agvMission.Where(qq => qq.Value == mission_id).Select(qq => qq.Key);
// info.CurTaskName = key.ToList()[0];
// //防止上一个任务已执行但返回失败时,删除任务
// Del_Mission(info);
// string ip = AppConfigHelper.GetValue(SettingString.FLEET);
// string url = "http://" + ip + "/api/v2.0.0/mission_scheduler";
// string body = "{\"mission_id\":\"" + mission_id + "\",\"robot_id\":" + info.Fleet_IP + "}";
// string json = HttpPost(url, info.IP, info.Authorization, body);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
// if (dic == null)
// {
// return false;
// }
// log.Info("URL: " + url + "\n" + "Return: " + json);
// string s = dic["mission_id"].ToString();
// string id = dic["id"].ToString();
// if (s == mission_id)
// {
// try
// {
// info.CurTaskID = Convert.ToInt32(id);
// info.CurTaskGUID = mission_id;
// log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, key.ToList()[0]));
// }
// catch
// {
// log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, mission_id));
// info.CurTaskName = "";
// }
// return true;
// }
// else
// return false;
// }
// catch (Exception ex)
// {
// log.Error("Add_Mission_Fleet", ex);
// return false;
// }
//}
/// <summary> /// <summary>
/// 获取Fleet任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission"></param>
/// <returns></returns>
public static bool Get_Fleet_Mission_Info(Agv_Info info)
{
try
{
string ip = AppConfigHelper.GetValue(SettingString.FLEET);
string url = "http://" + ip + "/api/v2.0.0/mission_scheduler/search";
string body = "{\"filters\" : [{\"fieldname\": \"description\", \"operator\": \"LIKE\", \"value\": \"" + info.CurTaskName + "-" + info.TimeStamp + "-" + info.Fleet_IP + "\"}]}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] obj = (object[])serializer.DeserializeObject(json);
if (obj == null) return false;
Dictionary<string, object> dic;
if (obj.Length > 0)
{
dic = (Dictionary<string, object>)obj[0];
info.CurTaskID = long.Parse(dic["id"].ToString());
if (info.CurTaskID == -1)
return false;
if (info.CurJob != null)
info.CurJob.CurTaskID = info.CurTaskID;
return true;
}
return false;
}
catch (Exception ex)
{
log.Error("Get_Mission_Queue", ex);
return false;
}
}
/// <summary>
/// 获取所有任务列表 /// 获取所有任务列表
/// </summary> /// </summary>
/// <param name="info"></param> /// <param name="info"></param>
...@@ -720,8 +822,7 @@ namespace DeviceLibrary ...@@ -720,8 +822,7 @@ namespace DeviceLibrary
string s = response.Content; string s = response.Content;
s = s.Replace("\n", ""); s = s.Replace("\n", "");
s = s.Replace(" ", ""); s = s.Replace(" ", "");
if (IsDebug) log.Info(string.Format("HttpPost URL: {0}; Body: {1} Return: {2} [StatusCode={3},ResponseStatus={4},]", url, body, s, response.StatusCode, response.ResponseStatus));
log.Debug(string.Format("HttpPost URL: {0}; Body: {1} Return: {2}", url, body, s));
return s; return s;
} }
......
文件属性发生变化
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -14,24 +15,21 @@ namespace DeviceLibrary ...@@ -14,24 +15,21 @@ namespace DeviceLibrary
public ChargeJob(string agvPlae) public ChargeJob(string agvPlae)
{ {
this.agvPlace = agvPlae; this.agvPlace = agvPlae;
StartJobTime = DateTime.Now;
} }
/// <summary> /// <summary>
/// 接收任务时,agv的位置 /// 接收任务时,agv的位置
/// </summary> /// </summary>
private string agvPlace = ""; private string agvPlace = "";
private string runInfo = "";
/// <summary> /// <summary>
/// 运行信息 /// 运行信息
/// </summary> /// </summary>
public override string RunInfo public override string RunInfo
{ {
get { return string.Format("充电任务:{0}", runInfo); } get { return string.Format("{0}", runInfo); }
} }
private JobStep<CHARGE_STEP> curJobStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);
private JobStep<CHARGE_STEP> ChargeStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);
/// <summary> /// <summary>
/// 空车返回执行 /// 空车返回执行
...@@ -39,19 +37,21 @@ namespace DeviceLibrary ...@@ -39,19 +37,21 @@ namespace DeviceLibrary
/// <param name="agv"></param> /// <param name="agv"></param>
public override Job Execute(Agv_Info agv) public override Job Execute(Agv_Info agv)
{ {
string msg = agv.Name + " "; string msg = "";
bool rtn = false; bool rtn = false;
agv.Msg = RunInfo; agv.Msg = runInfo;
JobName = "充电任务";
StartJobTime = curJobStep.startTime;
CurTaskState = CommonVar.GetTakJobState(agv); CurTaskState = CommonVar.GetTakJobState(agv);
if (ChargeStep.IsStep(CHARGE_STEP.NONE)) if (curJobStep.IsStep(CHARGE_STEP.NONE))
{ {
agv.HasError = false;
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_3D_DOOR); curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_3D_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "回到充电位,先到3D门"; runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "回到充电位,先到3D门";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
CommonVar.DoorMission(agv, SettingString.DoorCToD); CommonVar.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
...@@ -63,21 +63,22 @@ namespace DeviceLibrary ...@@ -63,21 +63,22 @@ namespace DeviceLibrary
{ {
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],由于充电桩有小车,从当前位置" + agvPlace + "回到待机位"; runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],由于充电桩有小车,从当前位置" + agvPlace + "回到待机位";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new StandyJob(agv.Place); return new StandyJob(agv.Place);
} }
else else
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "去到充电位"; runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "去到充电位";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_3D_DOOR)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_3D_DOOR))
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
...@@ -85,7 +86,8 @@ namespace DeviceLibrary ...@@ -85,7 +86,8 @@ namespace DeviceLibrary
{ {
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "去到待机位"; runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "去到待机位";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new StandyJob(agv.Place); return new StandyJob(agv.Place);
} }
else else
...@@ -94,40 +96,42 @@ namespace DeviceLibrary ...@@ -94,40 +96,42 @@ namespace DeviceLibrary
{ {
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],充电桩有小车,从当前位置" + agvPlace + "回到待机位"; runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],充电桩有小车,从当前位置" + agvPlace + "回到待机位";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new StandyJob(agv.Place); return new StandyJob(agv.Place);
} }
else else
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION); curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "去到充电位"; runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "去到充电位";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
} }
} }
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
{ {
if (CommonVar.CheckTaskFinished(agv, CurTaskName)) if (CommonVar.CheckTaskFinished(agv, CurTaskName))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK); RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "充电任务分配完成,去充电且等待任务"; runInfo = "充电任务分配完成,去充电且等待任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
} }
} }
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK)) else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
{ {
if (agv.Battery > CommonVar.Charge.BatteryMax) if (agv.Battery > CommonVar.Charge.BatteryMax)
{ {
runInfo = "充电完成,回待机位"; runInfo = "充电完成,回待机位";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
CommonVar.Charge.DelOccupyInfoByAGV(agv); CommonVar.Charge.DelOccupyInfoByAGV(agv);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return new StandyJob(agv.Place); return new StandyJob(agv.Place);
} }
else if(agv.Battery > CommonVar.Charge.BatteryMin) else if(agv.Battery > CommonVar.Charge.BatteryMin)
...@@ -137,14 +141,15 @@ namespace DeviceLibrary ...@@ -137,14 +141,15 @@ namespace DeviceLibrary
{ {
runInfo = "在充电位检测到任务,电量[" + agv.Battery + " %]大于最小电量[" + CommonVar.Charge.BatteryMin + " %],可执行任务"; runInfo = "在充电位检测到任务,电量[" + agv.Battery + " %]大于最小电量[" + CommonVar.Charge.BatteryMin + " %],可执行任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; curJobStep.Msg = msg;
CommonVar.Charge.DelOccupyInfoByAGV(agv); CommonVar.Charge.DelOccupyInfoByAGV(agv);
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
} }
} }
else if (ChargeStep.IsStep(CHARGE_STEP.END)) else if (curJobStep.IsStep(CHARGE_STEP.END))
{ {
} }
return this; return this;
......
using System.Threading.Tasks;
namespace DeviceLibrary
{
/// <summary>
/// 小车进出料类型
/// </summary>
public enum eEnterLeaveType
{
/// <summary>
/// 小车进料
/// </summary>
Enter,
/// <summary>
/// 小车出料
/// </summary>
Leave,
}
/// <summary>
/// 进出料任务
/// </summary>
public class EnterLeaveShelfJob : Job
{
/// <summary>
/// 进出料任务
/// </summary>
/// <param name="curNode">位置点</param>
/// <param name="rfid">RFID</param>
public EnterLeaveShelfJob(ClientNode curNode, eEnterLeaveType type,string rfid="")
{
CurNode = curNode;
RFID = rfid;
ActionType = type;
runInfo = type.Equals(eEnterLeaveType.Enter) ? "小车进料任务:" : "小车出料任务:" +curNode.AliceName+" ";
}
/// <summary>
/// 位置点信息
/// </summary>
public ClientNode CurNode { get; set; }
public string RFID { get; set; }
/// <summary>
/// 动作类型
/// </summary>
public eEnterLeaveType ActionType { get; set; }
private string runInfo;
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get { return runInfo; }
}
private JobStep<ENTER_LEAVE_SHELF_STEP> EnterLeaveShelfStep = new JobStep<ENTER_LEAVE_SHELF_STEP>(ENTER_LEAVE_SHELF_STEP.NONE);
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name+ " ";
bool rtn = false;
agv.Msg = runInfo;
if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.NONE))
{
if (ActionType.Equals(eEnterLeaveType.Leave))
{
EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE);
runInfo += "小车链条运行";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
rtn = agv.AssignTask(Common.SettingString.Leave);
UpdateJobTaskInfo(agv);
}
else if(ActionType.Equals(eEnterLeaveType.Enter))
{
EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE);
runInfo +="小车链条运行";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
rtn = agv.AssignTask(Common.SettingString.Enter);
UpdateJobTaskInfo(agv);
}
}
else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE))
{
CurTaskState = CommonVar.GetTakJobState(agv);
if (CommonVar.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{
//EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.END);
runInfo+= "料架/料串进入完成 [" + RFID + "]";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
agv.RFID = "";
// return new EmptyAGVBackJob(LineName);
}
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
{
runInfo= "料架离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo;
//EnterLeaveShelfStep.Msg = msg;
}
}
else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE))
{
CurTaskState = CommonVar.GetTakJobState(agv);
if (CommonVar.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState))
{
//EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.END);
runInfo = "料架/料串出去完成 [" + RFID + "]";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
//return new EmptyShelfBackJob(LineName,eShelfType.BigShelf);
}
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
{
//链条停止
runInfo= "料架进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
//msg += runInfo;
//EnterLeaveShelfStep.Msg = msg;
}
}
else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.END))
{
}
return this;
}
}
/// <summary>
/// AGV进出料
/// </summary>
public enum ENTER_LEAVE_SHELF_STEP
{
/// <summary>
///
/// </summary>
NONE,
/// <summary>
/// 等待料架离开产线
/// </summary>
WAIT__SHELF_OUT_LINE,
/// <summary>
/// 等待料架进入产线
/// </summary>
WAIT__SHELF_IN_LINE,
/// <summary>
/// 进入/离开完成
/// </summary>
END
}
}
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -20,6 +21,8 @@ namespace DeviceLibrary ...@@ -20,6 +21,8 @@ namespace DeviceLibrary
TargetPlace = tarPlace; TargetPlace = tarPlace;
this.isFullShelf = fullShelf; this.isFullShelf = fullShelf;
this.RFID = RFID; this.RFID = RFID;
StartJobTime = DateTime.Now;
JobName = string.Format("取料串任务");
} }
...@@ -35,7 +38,6 @@ namespace DeviceLibrary ...@@ -35,7 +38,6 @@ namespace DeviceLibrary
/// 目的地 /// 目的地
/// </summary> /// </summary>
public string TargetPlace { get; private set; } public string TargetPlace { get; private set; }
private string runInfo = "";
private string RFID = ""; private string RFID = "";
/// <summary> /// <summary>
/// 运行信息 /// 运行信息
...@@ -44,19 +46,19 @@ namespace DeviceLibrary ...@@ -44,19 +46,19 @@ namespace DeviceLibrary
{ {
get get
{ {
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace)); int t1 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = ""; string from = "";
if (t1 > -1) if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName; from = NodeManager.nodeInfo[t1].AliceName;
else else
from = agvPlace; from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace)); int t2 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = ""; string to = "";
if (t2 > -1) if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName; to = NodeManager.nodeInfo[t2].AliceName;
else else
to = TargetPlace; to = TargetPlace;
return string.Format("取{5}料串任务[RFID={4}]: {0}[目的地={1}][任务名称={2}][任务状态={3}]", runInfo, to, CurTaskName, CurTaskState, RFID, isFullShelf ? "满" : "空"); return string.Format("取{0}料串任务:{1}[目的地={2}][RFID={3}][任务名称={4}][任务状态={5}]", isFullShelf ? "满" : "空", runInfo, to, RFID,CurTaskName, CurTaskState);
} }
} }
...@@ -64,19 +66,19 @@ namespace DeviceLibrary ...@@ -64,19 +66,19 @@ namespace DeviceLibrary
private string GetShowInfo() private string GetShowInfo()
{ {
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace)); int t1 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = ""; string from = "";
if (t1 > -1) if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName; from = NodeManager.nodeInfo[t1].AliceName;
else else
from = agvPlace; from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace)); int t2 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = ""; string to = "";
if (t2 > -1) if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName; to = NodeManager.nodeInfo[t2].AliceName;
else else
to = TargetPlace; to = TargetPlace;
return string.Format("取料串任务: {0} [{1}->{2}]", runInfo, from, to); ; return string.Format("{0} [{1}->{2}]", runInfo, from, to); ;
} }
/// <summary> /// <summary>
/// 任务执行 /// 任务执行
...@@ -86,12 +88,13 @@ namespace DeviceLibrary ...@@ -86,12 +88,13 @@ namespace DeviceLibrary
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = GetShowInfo(); agv.Msg = GetShowInfo();
agv.RFID = RFID; agv.RFID = RFID;
StartJobTime = curJobStep.startTime;
CurTaskState = CommonVar.GetTakJobState(agv); CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE)) if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{ {
agv.HasError = false;
if ((agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge)) && !TargetPlace.StartsWith(SettingString.C4_Name_Prefix))//D D if ((agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge)) && !TargetPlace.StartsWith(SettingString.C4_Name_Prefix))//D D
{ {
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE); curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE);
...@@ -134,6 +137,7 @@ namespace DeviceLibrary ...@@ -134,6 +137,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE); curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE);
runInfo = "到达3D门,去料架处" + TargetPlace; runInfo = "到达3D门,去料架处" + TargetPlace;
msg += runInfo; msg += runInfo;
...@@ -147,6 +151,7 @@ namespace DeviceLibrary ...@@ -147,6 +151,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorDToC, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorDToC, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE); curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE);
runInfo = "到达3C门,去料架处" + TargetPlace; runInfo = "到达3C门,去料架处" + TargetPlace;
msg += runInfo; msg += runInfo;
...@@ -160,6 +165,7 @@ namespace DeviceLibrary ...@@ -160,6 +165,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE); curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = "到达料架处" + TargetPlace + ",并向线体发送出料请求"; runInfo = "到达料架处" + TargetPlace + ",并向线体发送出料请求";
msg += runInfo; msg += runInfo;
...@@ -171,7 +177,7 @@ namespace DeviceLibrary ...@@ -171,7 +177,7 @@ namespace DeviceLibrary
} }
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE)) else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE))
{ {
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));//&& s.StateEquals(eNodeStatus.MayLeave) int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));//&& s.StateEquals(eNodeStatus.MayLeave)
if (i > -1) if (i > -1)
{ {
curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV); curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV);
...@@ -180,18 +186,19 @@ namespace DeviceLibrary ...@@ -180,18 +186,19 @@ namespace DeviceLibrary
curJobStep.Msg = msg; curJobStep.Msg = msg;
if (IsPlace(SettingString.A1) || IsPlace(SettingString.A7))//两位置出的架子需判断类型 if (IsPlace(SettingString.A1) || IsPlace(SettingString.A7))//两位置出的架子需判断类型
{ {
RFID = CommonVar.nodeInfo[i].RFID; RFID = NodeManager.nodeInfo[i].RFID;
} }
rtn = agv.AssignTask(Common.SettingString.Enter); rtn = agv.AssignTask(Common.SettingString.Enter);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
if (curJobStep.IsTimeOut(15000, out double timeOutTime)) if (curJobStep.IsTimeOut(15000, out TimeSpan timeSpan))
{ {
if (TargetPlace.Equals(SettingString.D3) || TargetPlace.Equals(SettingString.D4)) if (TargetPlace.Equals(SettingString.D3) || TargetPlace.Equals(SettingString.D4))
{ {
runInfo = string.Format("线体[{0}]允许出料信号[{1}]超时{2}秒,该处料串可能被手动干预,回待机位", TargetPlace, eNodeStatus.MayLeave, timeOutTime.ToString("f2")); runInfo = string.Format("线体[{0}]允许出料信号[{1}]超时{2}秒,该处料串可能被手动干预,回待机位", TargetPlace, eNodeStatus.MayLeave, timeSpan.TotalMinutes.ToString("f2"));
msg += string.Format("线体[{0}]允许出料信号[{1}]超时15S,该处料串可能被手动干预,回待机位", TargetPlace, eNodeStatus.MayLeave); msg += string.Format("线体[{0}]允许出料信号[{1}]超时15S,该处料串可能被手动干预,回待机位", TargetPlace, eNodeStatus.MayLeave);
curJobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
return new ChargeJob(TargetPlace); return new ChargeJob(TargetPlace);
} }
//else //else
...@@ -209,43 +216,48 @@ namespace DeviceLibrary ...@@ -209,43 +216,48 @@ namespace DeviceLibrary
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState)) if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{ {
CommonVar.server.CloseDoor(TargetPlace); CommonVar.server.CloseDoor(TargetPlace);
if (IsPlace(SettingString.A1) || IsPlace(SettingString.A7))//两位置出的架子需判断类型 //if (IsPlace(SettingString.A1) || IsPlace(SettingString.A7))//两位置出的架子需判断类型
{ //{
string tarNodeName1 = TargetPlace.Equals(SettingString.A1) ? SettingString.A2 : SettingString.A8; // string tarNodeName1 = TargetPlace.Equals(SettingString.A1) ? SettingString.A2 : SettingString.A8;
if (RFID.StartsWith(SettingString.Packing_RFID_Prefix) || RFID.StartsWith("0"))//料串任务接到包装料架,任务取消 // if (RFID.StartsWith(SettingString.Packing_RFID_Prefix) || RFID.StartsWith("0"))//料串任务接到包装料架,任务取消
{ // {
runInfo = "料架进入小车完成,由于该小车任务为料串任务,将该料架送回" + tarNodeName1; // runInfo = "料架进入小车完成,由于该小车任务为料串任务,将该料架送回" + tarNodeName1;
msg += runInfo; // msg += runInfo;
curJobStep.Msg = msg; // curJobStep.Msg = msg;
return new SendShelfJob(TargetPlace, tarNodeName1, RFID); // RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
} // return new SendShelfJob(TargetPlace, tarNodeName1, RFID);
} // }
//}
if (FindShelfTarget(agv, out string tarNodeName)) if (FindShelfTarget(agv, out string tarNodeName))
{ {
runInfo = "料串进入小车完成,任务结束"; runInfo = "料串进入小车完成,任务结束";
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
agv.HasError = false;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
return new SendShelfJob(TargetPlace, tarNodeName, RFID); return new SendShelfJob(TargetPlace, tarNodeName, RFID);
} }
else else
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P6_WAIT_REACH_STANDBY); curJobStep.ToNextStep(EXECUTE_STEP.P6_WAIT_REACH_STANDBY);
runInfo = "料串进入小车完成,当前无节点需要料串,去待机位"; runInfo = "料串进入小车完成,当前无节点需要料串,去待机位";
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
agv.HasError = false;
CommonVar.MoveToNode(agv, SettingString.Standby); CommonVar.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv); UpdateJobTaskInfo(agv);
} }
} }
else if (curJobStep.IsTimeOut(60000, out double timeOutTime)) else if (curJobStep.IsTimeOut(60000, out TimeSpan timeSpan))
{ {
runInfo = string.Format("线体[{0}]出料超时{1}秒,请检查出料情况", TargetPlace, timeOutTime.ToString("f2")); runInfo = string.Format("线体[{0}]出料超时,请检查出料情况", TargetPlace);
msg += string.Format("线体[{0}]出料超时,请检查出料情况", TargetPlace); msg += string.Format("线体[{0}]出料超时,请检查出料情况", TargetPlace);
curJobStep.Msg = msg; curJobStep.Msg = msg;
//去待机位 agv.HasError = true;
agv.SetErrorMsg($"线体[{TargetPlace}]出料超时,请检查出料情况",timeSpan.TotalMinutes.ToString("f2"));
} }
} }
//else if (curJobStep.IsStep(EXECUTE_STEP.P7_WAIT_REACH_4D_DOOR)) //else if (curJobStep.IsStep(EXECUTE_STEP.P7_WAIT_REACH_4D_DOOR))
...@@ -273,6 +285,7 @@ namespace DeviceLibrary ...@@ -273,6 +285,7 @@ namespace DeviceLibrary
runInfo = "搜索到料串目的地,任务结束"; runInfo = "搜索到料串目的地,任务结束";
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
return new SendShelfJob(SettingString.Standby, tarNodeName, RFID); return new SendShelfJob(SettingString.Standby, tarNodeName, RFID);
} }
...@@ -280,6 +293,7 @@ namespace DeviceLibrary ...@@ -280,6 +293,7 @@ namespace DeviceLibrary
} }
else if (curJobStep.IsStep(EXECUTE_STEP.P8_END)) else if (curJobStep.IsStep(EXECUTE_STEP.P8_END))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
return null; return null;
} }
return this; return this;
...@@ -397,6 +411,11 @@ namespace DeviceLibrary ...@@ -397,6 +411,11 @@ namespace DeviceLibrary
tarPlace = SettingString.T1_1; tarPlace = SettingString.T1_1;
return true; return true;
} }
if (ReelStringJobType.FindNeedEnterMission(currentAgv, SettingString.A8))
{
tarPlace = SettingString.A8;
return true;
}
} }
//退料线 //退料线
...@@ -431,6 +450,11 @@ namespace DeviceLibrary ...@@ -431,6 +450,11 @@ namespace DeviceLibrary
tarPlace = SettingString.T4_1; tarPlace = SettingString.T4_1;
return true; return true;
} }
//if (ReelStringJobType.FindNeedEnterMission(currentAgv, SettingString.T4_1, ClientLevel.Middle, true))
//{
// tarPlace = SettingString.T4_1;
// return true;
//}
//检查点料机D1是否需要空料串 //检查点料机D1是否需要空料串
if (ReelStringJobType.FindNeedEnterMission(currentAgv, SettingString.D1)) if (ReelStringJobType.FindNeedEnterMission(currentAgv, SettingString.D1))
{ {
......

using Common;
namespace DeviceLibrary
{
/// <summary>
/// 包装仓任务:取包装料架
/// </summary>
public class PackingJob_GetShelf : Job
{
/// <summary>
/// 接料架:空料架目的为出库;满料架目的为入库
/// </summary>
/// <param name="agvPlae">agv当前位置</param>
/// <param name="tarPlace">目的地</param>
/// <param name="mark">标志:出库任务则显示mark;入库任务显示Mark=InStore</param>
public PackingJob_GetShelf(string agvPlae, string tarPlace, string mark)
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
this.mark = mark;
if (PackingJobType.IsInStoreMark(mark))
{
}
else
{
//修改mark状态
PackingJobType.ChangeMarkState(mark, eMarkState.Assigned);
}
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
string RFID = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
/// <summary>
/// 标记
/// </summary>
public string mark = "";
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("取包装料架任务:{0} [Mark={2}][目的地={1}][任务名称={3}][任务状态={4}]", runInfo,to, mark, CurTaskName, CurTaskState);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
/// <summary>
/// 包装仓任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_SHELF_PLACE);
runInfo = "待机位/充电位收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
curJobStep.ToNextStep(EXECUTE_STEP.P1_1_WAIT_REACH_4D_DOOR);
runInfo = "4C车间收到任务,先到4D门";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_SHELF_PLACE);
runInfo = "默认位置收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P1_1_WAIT_REACH_4D_DOOR))
{
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_SHELF_PLACE);
runInfo = "到达4D门,去包装料架处" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_SHELF_PLACE))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
if (PackingJobType.IsInStoreMark(mark))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = "到达包装料架处" + TargetPlace + ",并向线体发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, "");
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE);
runInfo = "到达包装料架处" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE))
{
if (PackingJobType.CheckNodeMark(mark))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = "当前任务" + mark + "确认存在,并向线体" + TargetPlace + "发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, "");
}
else//
{
PackingJobType.DelMark(mark);
int nodeId = PackingJobType.CheckOutStroePackingJob();
if (nodeId == -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P12_END);
runInfo = "当前任务" + mark + "不存在,且无其他包装任务";
msg += runInfo;
curJobStep.Msg = msg;
}
else if (nodeId > -1)
{
mark = CommonVar.nodeInfo[nodeId].Mark;
//修改mark状态
PackingJobType.ChangeMarkState(mark, eMarkState.Assigned);
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = "切换任务为" + mark + ",并向线体" + TargetPlace + "发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, "");
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV);
runInfo = "线体" + TargetPlace + "允许出料,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
RFID = CommonVar.nodeInfo[i].RFID;
rtn = agv.AssignTask(SettingString.Enter);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
if (PackingJobType.IsInStoreMark(mark))
{
if (RFID.StartsWith(SettingString.ReelString_RFID_Prefix) || RFID.StartsWith("0"))
{
runInfo = "料串进入小车完成,由于当前任务是料架任务,将该料串送回,修改mark状态"+ mark+"="+eMarkState.None.ToString();
msg += runInfo;
curJobStep.Msg = msg;
//return new PackingJob_SendShelf(TargetPlace, SettingString.A2, mark, RFID);
PackingJobType.ChangeMarkState(mark, eMarkState.None);
return new SendShelfJob(TargetPlace, SettingString.A2, RFID);
}
}
if (FindPackingPlace(agv, out string packingPlace, out string rfid))
{
runInfo = "包装料架进入小车完成";
msg += runInfo;
curJobStep.Msg = msg;
return new PackingJob_SendShelf(TargetPlace, packingPlace, mark, rfid);
}
else
{
runInfo = "包装料架进入小车完成,包装仓无剩余任务," + packingPlace + "回收该料架";
msg += runInfo;
curJobStep.Msg = msg;
return new RecycleEmptyShelf(agvPlace, packingPlace, true, ShelfType.PackingShelf);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P12_END))
{
return null;
}
return this;
}
/// <summary>
/// 查找包装仓目的地
/// </summary>
/// <param name="agv"></param>
/// <param name="packPlace"></param>
/// <returns></returns>
private bool FindPackingPlace(Agv_Info agv, out string packPlace, out string rfid)
{
if (mark.Equals(SettingString.InStore_Mark))
{
packPlace = SettingString.A2;//
rfid = "A#";
int i = CommonVar.nodeInfo.FindIndex(s => s.Mark.Equals("0") && s.StateEquals(eNodeStatus.NeedEnter) && s.IsUse);
if (i > -1)
{
packPlace = CommonVar.nodeInfo[i].Name;
LogUtil.info(string.Format("{0} 查找包装仓目的地{1}[Mark={2}][Marks={3}]", agv.Name, packPlace, mark, PackingJobType.GetMarks()));
return true;
}
else
{
PackingJobType.DelMark(mark);
//int nodeIdx = PackingJobType.CheckOutStroePackingJob();
//if (nodeIdx > -1)
//{
// string _mark = CommonVar.nodeInfo[nodeIdx].Mark;
// //PackingJobType.ChangeMarkState(_mark, eMarkState.Executing);
// packPlace = CommonVar.nodeInfo[nodeIdx].Name;
// rfid = CommonVar.nodeInfo[nodeIdx].RFID;
// CommonVar.log.Info(string.Format("{0} 找不到Mark={1}任务,切换为包装仓{2}的Mark={3}的任务[Marks={4}]", agv.Name, mark, packPlace, _mark, PackingJobType.GetMarks()));
// mark = _mark;
// return true;
//}
}
}
else
{
packPlace = SettingString.A3;//默认为回收料架处
rfid = "00";
int i = CommonVar.nodeInfo.FindIndex(s => s.Mark.Equals(mark) && s.StateEquals(eNodeStatus.NeedEnter) && s.IsUse);
if (i > -1)
{
packPlace = CommonVar.nodeInfo[i].Name;
LogUtil.info(string.Format("{0} 查找包装仓目的地{1}[Mark={2}][Marks={3}]", agv.Name, packPlace, mark, PackingJobType.GetMarks()));
return true;
}
else
{
PackingJobType.DelMark(mark);
int nodeIdx = PackingJobType.CheckOutStroePackingJob();
if (nodeIdx > -1)
{
string _mark = CommonVar.nodeInfo[nodeIdx].Mark;
//PackingJobType.ChangeMarkState(_mark, eMarkState.Executing);
packPlace = CommonVar.nodeInfo[nodeIdx].Name;
LogUtil.info(string.Format("{0} 找不到Mark={1}任务,切换为包装仓{2}的Mark={3}的任务[Marks={4}]", agv.Name, mark, packPlace, _mark, PackingJobType.GetMarks()));
mark = _mark;
return true;
}
}
}
LogUtil.info(string.Format("{0} 找不到Mark={1}任务及其他包装任务,将该料架送往回收处。[{2}]", agv.Name, mark, PackingJobType.GetMarks()));
return false;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达4D
/// </summary>
P1_1_WAIT_REACH_4D_DOOR,
/// <summary>
/// 等待到达包装料架处
/// </summary>
P2_WAIT_REACH_PACKING_SHELF_PLACE,
/// <summary>
/// 确认包装仓是否有该任务,防止该任务被手动出掉
/// </summary>
P3_CHECK_PACKING_STATION_STATE,
/// <summary>
/// 等待线体回复
/// </summary>
P4_WAIT_LINE_RESPONSE,
/// <summary>
/// 等待料架进入AGV
/// </summary>
P5_WAIT_SHELF_IN_AGV,
/// <summary>
/// 等待到达包装仓
/// </summary>
P6_WAIT_REACH_PACKING_STATION,
/// <summary>
/// 到达包装仓,再次确认是否有任务,防止该任务被手动出掉
/// </summary>
P7_CHECK_PACKING_STATION_STATE,
/// <summary>
/// 等待包装仓回复
/// </summary>
P8_WAIT_PACKING_STATION_RESPONSE,
/// <summary>
/// 等待AGV停靠完成
/// </summary>
P9_WAIT_AGV_DOCK_FINISH,
/// <summary>
/// 等待料架进入包装仓
/// </summary>
P10_WAIT_SHELF_IN_STATION,
/// <summary>
/// 等待到达空料架回收处
/// </summary>
P11_WAIT_REACH_RECYCLE_STATION,
/// <summary>
/// 任务结束
/// </summary>
P12_END
}
}
}
using Common;
namespace DeviceLibrary
{
/// <summary>
/// 包装仓任务:将包装料架送往包装仓
/// </summary>
public class PackingJob_SendShelf : Job
{
/// <summary>
/// 将包装料架送往包装仓
/// </summary>
/// <param name="agvPlae">agv当前位置</param>
/// <param name="tarPlace">目的地</param>
/// <param name="mark">标志:出库任务则显示mark;入库任务显示Mark=InStore</param>
public PackingJob_SendShelf(string agvPlae, string tarPlace, string mark,string RFID= "")
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
this.mark = mark;
this.RFID = RFID;
if (PackingJobType.IsInStoreMark(mark))
{
}
else
{
//修改mark状态
PackingJobType.ChangeMarkState(mark, eMarkState.Executing);
}
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
private string RFID = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
/// <summary>
/// 标记
/// </summary>
public string mark = "";
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("送包装料架任务:{0} [RFID={5}][Mark={2}][目的地={1}][任务名称={3}][任务状态={4}]", runInfo, to, mark,CurTaskName,CurTaskState,RFID);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
/// <summary>
/// 任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION);
runInfo = "收到任务,向包装仓" + TargetPlace + "运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
if (PackingJobType.IsInStoreMark(mark))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE);
runInfo = "到达包装仓" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE))
{
if (PackingJobType.CheckNodeMark(mark, TargetPlace))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
else
{
if (PackingJobType.IsInStoreMark(mark))
{
runInfo = "包装仓" + TargetPlace + "无入库任务,回收该料架";
msg += runInfo;
curJobStep.Msg = msg;
return new SendShelfJob(TargetPlace,SettingString.A2,RFID);
}
else
{
runInfo = "包装仓" + TargetPlace + "无任务,回收该料架";
msg += runInfo;
curJobStep.Msg = msg;
return new RecycleEmptyShelf(agvPlace, "", true, ShelfType.PackingShelf);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayEnter));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH);
runInfo = "收到线体对接请求,开始停靠";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.DockToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
{
runInfo = string.Format("线体[{0}]允许对接信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]允许对接信号[{1}]超时", TargetPlace, eNodeStatus.MayEnter);
curJobStep.Msg = msg;
curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH))
{
if (CommonVar.CheckTaskDockFinished(agv, TargetPlace, CurTaskState))
{
CommonVar.server.Ready(TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_STATION);
runInfo = "停靠包装仓完成,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Leave);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_STATION))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishEnter));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P7_END);
runInfo = "包装料架进入包装仓"+TargetPlace+"完成";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P7_END))
{
//Job job = CommonVar.control.GetJob(agv);
//if (job != null)
//{
// runInfo = "送料架任务完成,检测到任务,开始执行";
// msg += runInfo;
// curJobStep.Msg = msg;
// return job;
//}
return null;
}
return this;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达包装仓
/// </summary>
P2_WAIT_REACH_PACKING_STATION,
/// <summary>
/// 到达包装仓,再次确认是否有任务,防止该任务被手动出掉
/// </summary>
P3_CHECK_PACKING_STATION_STATE,
/// <summary>
/// 等待包装仓回复
/// </summary>
P4_WAIT_PACKING_STATION_RESPONSE,
/// <summary>
/// 等待AGV停靠完成
/// </summary>
P5_WAIT_AGV_DOCK_FINISH,
/// <summary>
/// 等待料架进入包装仓
/// </summary>
P6_WAIT_SHELF_IN_STATION,
/// <summary>
/// 任务结束
/// </summary>
P7_END
}
}
}
using Common;
using System.Collections.Generic;
using System.Threading;
namespace DeviceLibrary
{
/// <summary>
/// 包装仓任务:在包装仓间转移包装料架,
/// </summary>
public class PackingJob_TransferShelf : Job
{
/// <summary>
/// 包装仓任务
/// </summary>
/// <param name="agvPlae">小车当前位置</param>
public PackingJob_TransferShelf(string agvPlae, string tarPlace, string RFID, string mark)
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
this.mark = mark;
this.RFID = RFID;
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
/// <summary>
/// 料架RFID
/// </summary>
public string RFID = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
/// <summary>
/// 标记
/// </summary>
public string mark = "";
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("包装料架转移任务:{0} [RFID={1}][Mark={2}][目的地={3}][任务名称={4}][任务状态={5}]", runInfo, RFID, mark,to,CurTaskName,CurTaskState);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
/// <summary>
/// 任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
agv.RFID = RFID;
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION);
runInfo = "收到任务,向包装仓" + TargetPlace + "运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE);
runInfo = "到达包装仓" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE))
{
if (PackingJobType.IsInStoreMark(mark))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
else
{
if (PackingJobType.CheckNodeMark(mark, TargetPlace))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P15_END);
runInfo = "包装仓" + TargetPlace + "无任务,任务结束";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayLeave));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH);
runInfo = "收到线体对接请求,开始停靠";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.DockToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
//else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
//{
// runInfo = string.Format("线体[{0}]允许对接信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayLeave, timeOutTime.ToString("f2"));
// msg += string.Format("线体[{0}]允许对接信号[{1}]超时", TargetPlace, eNodeStatus.MayLeave);
// curJobStep.Msg = msg;
//}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH))
{
if (CommonVar.CheckTaskDockFinished(agv, TargetPlace, CurTaskState))
{
CommonVar.server.Ready(TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_AGV);
runInfo = "停靠包装仓完成,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Enter);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_AGV))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishLeave));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P7_FIND_LEFT_TASK);
runInfo = "包装料架进入小车完成";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P7_FIND_LEFT_TASK))
{
if(PackingJobType.IsInStoreMark(mark))//入库任务
{
if(CheckShelfLockInfo(agv,out string nodeName,out string lockedNodeNames))
{
if(nodeName.Equals(""))//有锁定节点,但目前忙碌,无法入料,去待机位
{
curJobStep.ToNextStep(EXECUTE_STEP.P14_WAIT_REACH_STANDBY);
runInfo = "入库任务Mark=" + mark + "有剩余任务,但包装仓忙碌,去待机位";
msg += runInfo+";锁定的节点:"+ lockedNodeNames;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = SettingString.Standby;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else//有锁定节点
{
curJobStep.ToNextStep(EXECUTE_STEP.P8_TRANSFER_SHELF);
runInfo = "入库任务Mark=" + mark + "存在剩余任务,到下一包装仓执行任务";
msg += runInfo;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = nodeName;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else//无锁定节点,去A2
{
curJobStep.ToNextStep(EXECUTE_STEP.P12_SEND_FULL_SHELF);
TargetPlace = SettingString.A2;
agvPlace = agv.Place;
runInfo = "入库任务Mark=" + mark + "完成, 去" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
PackingJobType.DelMark(mark);
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else
{
if (FindNextTask(agv, out int nodeIdx))
{
if (nodeIdx > -1)//该mark还有剩余任务
{
curJobStep.ToNextStep(EXECUTE_STEP.P8_TRANSFER_SHELF);
runInfo = "任务Mark=" + mark + "到下一包装仓执行任务";
msg += runInfo;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = CommonVar.nodeInfo[nodeIdx].Name;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else //pack任务还有剩余,但目前包装仓还未生成任务,去待机位
{
curJobStep.ToNextStep(EXECUTE_STEP.P14_WAIT_REACH_STANDBY);
runInfo = "任务Mark=" + mark + "有剩余任务,但包装仓还未生成,去待机位";
msg += runInfo;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = SettingString.Standby;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else//出库任务完成
{
string name;
string[] ss = mark.Split(',');
switch (ss[1])
{
case "urgent": name = SettingString.A8; break; //紧急
case "cut": name = SettingString.A8; break; //分盘
case "pack": name = SettingString.A3; break; //包装
default: name = SettingString.A8; break;
}
curJobStep.ToNextStep(EXECUTE_STEP.P12_SEND_FULL_SHELF);
TargetPlace = name;
agvPlace = agv.Place;
runInfo = "任务Mark=" + mark + "出库完成, 去" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
PackingJobType.DelMark(mark);
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P8_TRANSFER_SHELF))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P9_WAIT_LINE_RESPONSE);
runInfo = "到达包装仓,发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P9_WAIT_LINE_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayEnter));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P10_WAIT_AGV_DOCK_FINISH);
runInfo = "收到线体对接请求,开始停靠";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.DockToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
{
runInfo = string.Format("线体[{0}]允许对接信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]允许对接信号[{1}]超时", TargetPlace, eNodeStatus.MayEnter);
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P10_WAIT_AGV_DOCK_FINISH))
{
if (CommonVar.CheckTaskDockFinished(agv, TargetPlace, CurTaskState))
{
CommonVar.server.Ready(TargetPlace, RFID);
curJobStep.ToNextStep(EXECUTE_STEP.P11_WAIT_SHELF_IN_LINE);
runInfo = "停靠包装仓完成,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Leave);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P11_WAIT_SHELF_IN_LINE))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishEnter));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P15_END);
runInfo = "包装料架进入" + TargetPlace + "完成,任务结束";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P12_SEND_FULL_SHELF))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P13_WAIT_TARGET_RESPONSE);
runInfo = "到达目的地" + TargetPlace + ",并发送准备信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, RFID);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P13_WAIT_TARGET_RESPONSE))
{
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayEnter));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P11_WAIT_SHELF_IN_LINE);
runInfo = "收到线体入料请求,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Leave);
UpdateJobTaskInfo(agv);
}
//else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
//{
// runInfo = string.Format("线体[{0}]允许入料信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
// msg += string.Format("线体[{0}]允许入料信号[{1}]超时", TargetPlace, eNodeStatus.MayEnter);
// curJobStep.Msg = msg;
//}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P14_WAIT_REACH_STANDBY))
{
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
{
if (FindNextTask(agv, out int nodeIdx))
{
if (nodeIdx > -1)//该mark还有剩余任务
{
curJobStep.ToNextStep(EXECUTE_STEP.P8_TRANSFER_SHELF);
runInfo = "任务Mark=" + mark + "到下一包装仓执行任务";
msg += runInfo;
curJobStep.Msg = msg;
TargetPlace = CommonVar.nodeInfo[nodeIdx].Name;
agvPlace = agv.Place;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P15_END))
{
agv.RFID = "";
return null;
//Job job = CommonVar.control.GetJob(agv);
//if (job != null)
//{
// runInfo = "包装仓转移料架任务完成,检测到任务,开始执行";
// msg += runInfo;
// curJobStep.Msg = msg;
// return job;
//}
}
return this;
}
/// <summary>
/// 根据mark查找下一个任务
/// </summary>
/// <returns></returns>
private bool FindNextTask(Agv_Info agv, out int nodeIdx)
{
//寻找下一个任务点
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter) && s.Mark == mark && s.AgvName == "" && s.IsUse);
if (nodeIdx > -1)
return true;
else
{
if (!mark.Split(',')[1].Equals("pack"))
{
string log = " [Mark=" + mark + "] 出库任务完成";
LogUtil.info(log);
return false;
}
bool rtn = AGVManager.LeaveCheck(agv, out int taskCount);
Thread.Sleep(1000);
if (!rtn)//出库任务还未完成
{
string log = agv.Name + " [Mark=" + mark + "] 出库任务未完成,[taskCount=" + taskCount.ToString() + "]";
LogUtil.info(log);
return true;
}
else
{
string log = agv.Name + " [Mark=" + mark + "] [taskCount = " + taskCount.ToString() + "] 出库任务完成";
LogUtil.info(log);
return false;
}
}
}
private bool CheckShelfLockInfo(Agv_Info agv, out string nodeName,out string lockedNodeNames)
{
List<string> shelfLockedNodeNames = new List<string>();
nodeName = "";
lockedNodeNames = "";
//获取料架锁定信息
AGVManager.GetShelfLockInfo(TargetPlace, RFID, shelfLockedNodeNames);
Thread.Sleep(1000);
if (shelfLockedNodeNames != null && shelfLockedNodeNames.Count > 0)
{
foreach (string item in shelfLockedNodeNames)
{
int nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name == item && s.StateEquals(eNodeStatus.NeedEnter) && s.Mark.Equals("") && (s.AgvName == "" || s.AgvName == agv.Name) && s.IsUse);
if (nodeIdx > -1)
{
nodeName = item;
shelfLockedNodeNames.Remove(item);
return true;
}
}
lockedNodeNames = string.Join(";", shelfLockedNodeNames);
return true;
}
return false;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达包装仓
/// </summary>
P2_WAIT_REACH_PACKING_STATION,
/// <summary>
/// 到达包装仓
/// </summary>
P3_CHECK_PACKING_STATION_STATE,
/// <summary>
/// 等待包装仓回复
/// </summary>
P4_WAIT_PACKING_STATION_RESPONSE,
/// <summary>
/// 等待AGV停靠完成
/// </summary>
P5_WAIT_AGV_DOCK_FINISH,
/// <summary>
/// 等待料架进入AGV
/// </summary>
P6_WAIT_SHELF_IN_AGV,
/// <summary>
/// 查询剩余任务
/// </summary>
P7_FIND_LEFT_TASK,
/// <summary>
/// 转移料架
/// </summary>
P8_TRANSFER_SHELF,
/// <summary>
/// 等待线体回复
/// </summary>
P9_WAIT_LINE_RESPONSE,
/// <summary>
/// 等待AGV停靠完成
/// </summary>
P10_WAIT_AGV_DOCK_FINISH,
/// <summary>
/// 等待料架进入线体
/// </summary>
P11_WAIT_SHELF_IN_LINE,
/// <summary>
/// 运送满料架
/// </summary>
P12_SEND_FULL_SHELF,
/// <summary>
/// 等待满料目的地回复
/// </summary>
P13_WAIT_TARGET_RESPONSE,
/// <summary>
/// 等待到达待机位
/// </summary>
P14_WAIT_REACH_STANDBY,
/// <summary>
/// 任务结束
/// </summary>
P15_END
}
}
}
 
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -32,6 +33,8 @@ namespace DeviceLibrary ...@@ -32,6 +33,8 @@ namespace DeviceLibrary
TargetPlace = tarPlace; TargetPlace = tarPlace;
shelfType = type; shelfType = type;
this.hasLoad = hasLoad; this.hasLoad = hasLoad;
JobName = "回收空料架任务";
StartJobTime = DateTime.Now;
} }
/// <summary> /// <summary>
/// 车上有负载 /// 车上有负载
...@@ -53,7 +56,6 @@ namespace DeviceLibrary ...@@ -53,7 +56,6 @@ namespace DeviceLibrary
/// 回收料架处 /// 回收料架处
/// </summary> /// </summary>
public string RecycleStation = ""; public string RecycleStation = "";
private string runInfo = "";
/// <summary> /// <summary>
/// 运行信息 /// 运行信息
/// </summary> /// </summary>
...@@ -61,16 +63,16 @@ namespace DeviceLibrary ...@@ -61,16 +63,16 @@ namespace DeviceLibrary
{ {
get get
{ {
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace)); int t1 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = ""; string from = "";
if (t1 > -1) if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName; from = NodeManager.nodeInfo[t1].AliceName;
else else
from = agvPlace; from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace)); int t2 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = ""; string to = "";
if (t2 > -1) if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName; to = NodeManager.nodeInfo[t2].AliceName;
else else
to = TargetPlace; to = TargetPlace;
return string.Format("回收空料架任务:{0} [ShelfType={1}][任务名称={2}][任务状态={3}]", runInfo, shelfType.ToString(),CurTaskName,CurTaskState); return string.Format("回收空料架任务:{0} [ShelfType={1}][任务名称={2}][任务状态={3}]", runInfo, shelfType.ToString(),CurTaskName,CurTaskState);
...@@ -88,11 +90,12 @@ namespace DeviceLibrary ...@@ -88,11 +90,12 @@ namespace DeviceLibrary
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = runInfo;
StartJobTime = curJobStep.startTime;
CurTaskState = CommonVar.GetTakJobState(agv); CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.R1_NONE)) if (curJobStep.IsStep(EXECUTE_STEP.R1_NONE))
{ {
if(hasLoad) agv.HasError = false;
if (hasLoad)
{ {
if (FindRecycleStation()) if (FindRecycleStation())
{ {
...@@ -141,6 +144,7 @@ namespace DeviceLibrary ...@@ -141,6 +144,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE); curJobStep.ToNextStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE);
runInfo = "到达空料架处"+TargetPlace+",向线体发送出料请求"; runInfo = "到达空料架处"+TargetPlace+",向线体发送出料请求";
msg += runInfo; msg += runInfo;
...@@ -150,7 +154,7 @@ namespace DeviceLibrary ...@@ -150,7 +154,7 @@ namespace DeviceLibrary
} }
else if (curJobStep.IsStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE)) else if (curJobStep.IsStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE))
{ {
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayLeave)); //int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayLeave));
//if (i > -1) //if (i > -1)
{ {
curJobStep.ToNextStep(EXECUTE_STEP.R4_WAIT_SHELF_IN_AGV); curJobStep.ToNextStep(EXECUTE_STEP.R4_WAIT_SHELF_IN_AGV);
...@@ -171,6 +175,7 @@ namespace DeviceLibrary ...@@ -171,6 +175,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState)) if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
CommonVar.server.CloseDoor(TargetPlace); CommonVar.server.CloseDoor(TargetPlace);
if (FindRecycleStation()) if (FindRecycleStation())
{ {
...@@ -197,6 +202,7 @@ namespace DeviceLibrary ...@@ -197,6 +202,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, RecycleStation, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, RecycleStation, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE); curJobStep.ToNextStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE);
runInfo = "到达"+TargetPlace+",发送入料请求"; runInfo = "到达"+TargetPlace+",发送入料请求";
msg += runInfo; msg += runInfo;
...@@ -206,7 +212,7 @@ namespace DeviceLibrary ...@@ -206,7 +212,7 @@ namespace DeviceLibrary
} }
else if (curJobStep.IsStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE)) else if (curJobStep.IsStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE))
{ {
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.MayEnter)); //int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.MayEnter));
//if (i > -1) //if (i > -1)
{ {
curJobStep.ToNextStep(EXECUTE_STEP.R7_WAIT_SHELF_IN_LINE); curJobStep.ToNextStep(EXECUTE_STEP.R7_WAIT_SHELF_IN_LINE);
...@@ -227,8 +233,9 @@ namespace DeviceLibrary ...@@ -227,8 +233,9 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState)) if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
CommonVar.server.CloseDoor(RecycleStation); CommonVar.server.CloseDoor(RecycleStation);
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.FinishEnter)); //int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.FinishEnter));
//if (i > -1) //if (i > -1)
{ {
curJobStep.ToNextStep(EXECUTE_STEP.R9_END); curJobStep.ToNextStep(EXECUTE_STEP.R9_END);
...@@ -242,6 +249,7 @@ namespace DeviceLibrary ...@@ -242,6 +249,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
if (FindRecycleStation()) if (FindRecycleStation())
{ {
curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION); curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION);
...@@ -263,6 +271,7 @@ namespace DeviceLibrary ...@@ -263,6 +271,7 @@ namespace DeviceLibrary
// curJobStep.Msg = msg; // curJobStep.Msg = msg;
// return job; // return job;
//} //}
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
return null; return null;
} }
return this; return this;
...@@ -276,24 +285,24 @@ namespace DeviceLibrary ...@@ -276,24 +285,24 @@ namespace DeviceLibrary
{ {
if(shelfType.Equals(ShelfType.ReelString)) if(shelfType.Equals(ShelfType.ReelString))
{ {
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.T4_1) && s.StateEquals(eNodeStatus.NeedEnter)); int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.T4_1) && s.StateEquals(eNodeStatus.NeedEnter));
if(i==-1) i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.D1) && s.StateEquals(eNodeStatus.NeedEnter)); if(i==-1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.D1) && s.StateEquals(eNodeStatus.NeedEnter));
if (i == -1) i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A2) && s.StateEquals(eNodeStatus.NeedEnter)); if (i == -1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A2) && s.StateEquals(eNodeStatus.NeedEnter));
if(i>-1) if(i>-1)
{ {
RecycleStation = CommonVar.nodeInfo[i].Name; RecycleStation = NodeManager.nodeInfo[i].Name;
return true; return true;
} }
} }
else if(shelfType.Equals(ShelfType.PackingShelf)) else if(shelfType.Equals(ShelfType.PackingShelf))
{ {
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A3) && s.StateEquals(eNodeStatus.NeedEnter)); int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A3) && s.StateEquals(eNodeStatus.NeedEnter));
if (i == -1) i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A2) && s.StateEquals(eNodeStatus.NeedEnter)); if (i == -1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A2) && s.StateEquals(eNodeStatus.NeedEnter));
if (i == -1) i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A8) && s.StateEquals(eNodeStatus.NeedEnter)); if (i == -1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A8) && s.StateEquals(eNodeStatus.NeedEnter));
if (i > -1) if (i > -1)
{ {
RecycleStation = CommonVar.nodeInfo[i].Name; RecycleStation = NodeManager.nodeInfo[i].Name;
return true; return true;
} }
} }
......
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -17,6 +18,8 @@ namespace DeviceLibrary ...@@ -17,6 +18,8 @@ namespace DeviceLibrary
this.agvPlace = agvPlae; this.agvPlace = agvPlae;
TargetPlace = tarPlace; TargetPlace = tarPlace;
this.RFID = RFID; this.RFID = RFID;
StartJobTime = DateTime.Now;
JobName = "送料串任务";
} }
...@@ -30,7 +33,7 @@ namespace DeviceLibrary ...@@ -30,7 +33,7 @@ namespace DeviceLibrary
/// 目的地 /// 目的地
/// </summary> /// </summary>
public string TargetPlace { get; private set; } public string TargetPlace { get; private set; }
private string runInfo = "";
/// <summary> /// <summary>
/// 运行信息 /// 运行信息
/// </summary> /// </summary>
...@@ -38,16 +41,16 @@ namespace DeviceLibrary ...@@ -38,16 +41,16 @@ namespace DeviceLibrary
{ {
get get
{ {
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace)); int t1 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = ""; string from = "";
if (t1 > -1) if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName; from = NodeManager.nodeInfo[t1].AliceName;
else else
from = agvPlace; from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace)); int t2 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = ""; string to = "";
if (t2 > -1) if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName; to = NodeManager.nodeInfo[t2].AliceName;
else else
to = TargetPlace; to = TargetPlace;
return string.Format("送料串任务[RFID={4}]:{0} [目的地={1}][任务名称={2}][任务状态={3}]", runInfo, to, CurTaskName, CurTaskState, RFID); return string.Format("送料串任务[RFID={4}]:{0} [目的地={1}][任务名称={2}][任务状态={3}]", runInfo, to, CurTaskName, CurTaskState, RFID);
...@@ -58,19 +61,19 @@ namespace DeviceLibrary ...@@ -58,19 +61,19 @@ namespace DeviceLibrary
private string GetShowInfo() private string GetShowInfo()
{ {
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace)); int t1 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = ""; string from = "";
if (t1 > -1) if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName; from = NodeManager.nodeInfo[t1].AliceName;
else else
from = agvPlace; from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace)); int t2 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = ""; string to = "";
if (t2 > -1) if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName; to = NodeManager.nodeInfo[t2].AliceName;
else else
to = TargetPlace; to = TargetPlace;
return string.Format("送料串任务: {0} [{1}->{2}]", runInfo, from, to); return string.Format("{0} [{1}->{2}]", runInfo, from, to);
} }
/// <summary> /// <summary>
/// 任务执行 /// 任务执行
...@@ -82,9 +85,11 @@ namespace DeviceLibrary ...@@ -82,9 +85,11 @@ namespace DeviceLibrary
bool rtn = false; bool rtn = false;
agv.Msg = GetShowInfo(); agv.Msg = GetShowInfo();
agv.RFID = RFID; agv.RFID = RFID;
StartJobTime = curJobStep.startTime;
CurTaskState = CommonVar.GetTakJobState(agv); CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE)) if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{ {
agv.HasError = false;
if (!agvPlace.StartsWith(SettingString.C4_Name_Prefix) && TargetPlace.StartsWith(SettingString.C4_Name_Prefix))//D C if (!agvPlace.StartsWith(SettingString.C4_Name_Prefix) && TargetPlace.StartsWith(SettingString.C4_Name_Prefix))//D C
{ {
curJobStep.ToNextStep(EXECUTE_STEP.P3_WAIT_REACH_4C_DOOR); curJobStep.ToNextStep(EXECUTE_STEP.P3_WAIT_REACH_4C_DOOR);
...@@ -118,6 +123,7 @@ namespace DeviceLibrary ...@@ -118,6 +123,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_STATION_RESPONSE); curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_STATION_RESPONSE);
runInfo = "到达" + TargetPlace + ",并发送进料请求"; runInfo = "到达" + TargetPlace + ",并发送进料请求";
msg += runInfo; msg += runInfo;
...@@ -129,6 +135,7 @@ namespace DeviceLibrary ...@@ -129,6 +135,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION); curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION);
runInfo = "到达3D门,去料架处" + TargetPlace; runInfo = "到达3D门,去料架处" + TargetPlace;
msg += runInfo; msg += runInfo;
...@@ -142,6 +149,7 @@ namespace DeviceLibrary ...@@ -142,6 +149,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorDToC, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorDToC, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION); curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION);
runInfo = "到达3C门,去料架处" + TargetPlace; runInfo = "到达3C门,去料架处" + TargetPlace;
msg += runInfo; msg += runInfo;
...@@ -153,7 +161,7 @@ namespace DeviceLibrary ...@@ -153,7 +161,7 @@ namespace DeviceLibrary
} }
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_STATION_RESPONSE)) else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_STATION_RESPONSE))
{ {
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));//&& s.StateEquals(eNodeStatus.MayEnter) int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));//&& s.StateEquals(eNodeStatus.MayEnter)
if (i > -1) if (i > -1)
{ {
//curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_STATION); //curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_STATION);
...@@ -174,38 +182,47 @@ namespace DeviceLibrary ...@@ -174,38 +182,47 @@ namespace DeviceLibrary
} }
else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_STATION)) else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_STATION))
{ {
int idx = CommonVar.nodeInfo.FindIndex(s=>s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishEnter));
int idx = NodeManager.nodeInfo.FindIndex(s=>s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishEnter));
if(idx>-1) if(idx>-1)
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P6_TURN_DIRECTION); curJobStep.ToNextStep(EXECUTE_STEP.P6_TURN_DIRECTION);
runInfo = "料架进入" + TargetPlace + "完成"; runInfo = "料架进入" + TargetPlace + "完成";
agv.HasError = false;
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
} }
else if (curJobStep.IsTimeOut(60000, out double timeOutTime)) else if (curJobStep.IsTimeOut(60000, out TimeSpan timeSpan))
{ {
runInfo = string.Format("等待线体[{0}]进料完成信号[FinishEnter]超时{1}秒", TargetPlace, timeOutTime.ToString("f2")); runInfo = string.Format("等待线体[{0}]进料完成信号[FinishEnter]超时", TargetPlace);
msg += string.Format("等待线体[{0}]进料完成信号[FinishEnter]超时", TargetPlace); msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg($"等待线体[{TargetPlace}]进料完成信号[FinishEnter]超时", timeSpan.TotalMinutes.ToString("f2"));
} }
} }
else if (curJobStep.IsStep(EXECUTE_STEP.P6_TURN_DIRECTION)) else if (curJobStep.IsStep(EXECUTE_STEP.P6_TURN_DIRECTION))
{ {
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState)) if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P7_END); curJobStep.ToNextStep(EXECUTE_STEP.P7_END);
runInfo = "AGV在" + TargetPlace + "出料完成,开始转向"; runInfo = "AGV在" + TargetPlace + "出料完成,开始转向";
agv.HasError = false;
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
CommonVar.server.CloseDoor(TargetPlace); CommonVar.server.CloseDoor(TargetPlace);
//rtn = agv.AssignTask(SettingString.Turn); //rtn = agv.AssignTask(SettingString.Turn);
//UpdateJobTaskInfo(agv); //UpdateJobTaskInfo(agv);
} }
else if (curJobStep.IsTimeOut(60000, out double timeOutTime)) else if (curJobStep.IsTimeOut(60000, out TimeSpan timeSpan))
{ {
runInfo = string.Format("线体[{0}]出料超时{1}秒,请检查料架情况", TargetPlace, timeOutTime.ToString("f2")); runInfo = string.Format("线体[{0}]出料超时,请检查料架情况", TargetPlace);
msg += string.Format("线体[{0}]出料超时,请检查料架情况", TargetPlace); msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
agv.HasError = true;
agv.SetErrorMsg($"线体[{TargetPlace}]出料超时,请检查料架情况", timeSpan.TotalMinutes.ToString("f2"));
} }
} }
else if (curJobStep.IsStep(EXECUTE_STEP.P7_END)) else if (curJobStep.IsStep(EXECUTE_STEP.P7_END))
...@@ -217,6 +234,7 @@ namespace DeviceLibrary ...@@ -217,6 +234,7 @@ namespace DeviceLibrary
runInfo = "AGV在" + TargetPlace + "转向完成,去退料线出口取一个料串回点料机"; runInfo = "AGV在" + TargetPlace + "转向完成,去退料线出口取一个料串回点料机";
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
return new GetShelfJob(TargetPlace, SettingString.D24_Out, "B#", true); return new GetShelfJob(TargetPlace, SettingString.D24_Out, "B#", true);
} }
else else
...@@ -241,6 +259,7 @@ namespace DeviceLibrary ...@@ -241,6 +259,7 @@ namespace DeviceLibrary
runInfo = "AGV在" + TargetPlace + "转向完成"; runInfo = "AGV在" + TargetPlace + "转向完成";
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo,TargetPlace);
return null; return null;
} }
} }
......
using Common; using Common;
using System;
namespace DeviceLibrary namespace DeviceLibrary
{ {
...@@ -14,6 +15,8 @@ namespace DeviceLibrary ...@@ -14,6 +15,8 @@ namespace DeviceLibrary
public StandyJob(string agvPlae) public StandyJob(string agvPlae)
{ {
this.agvPlace = agvPlae; this.agvPlace = agvPlae;
StartJobTime = DateTime.Now;
JobName = "待机任务";
} }
...@@ -22,7 +25,6 @@ namespace DeviceLibrary ...@@ -22,7 +25,6 @@ namespace DeviceLibrary
/// </summary> /// </summary>
private string agvPlace = ""; private string agvPlace = "";
private string runInfo = "";
/// <summary> /// <summary>
/// 运行信息 /// 运行信息
/// </summary> /// </summary>
...@@ -41,12 +43,13 @@ namespace DeviceLibrary ...@@ -41,12 +43,13 @@ namespace DeviceLibrary
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = RunInfo; agv.Msg = runInfo;
StartJobTime = curJobStep.startTime;
CurTaskState = CommonVar.GetTakJobState(agv); CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.NONE)) if (curJobStep.IsStep(EXECUTE_STEP.NONE))
{ {
if (agvPlace.Equals(SettingString.Standby))//在待机位不操作 agv.HasError = false;
if (agvPlace.Equals(SettingString.Standby))//在待机位不操作
{ {
curJobStep.ToNextStep(EXECUTE_STEP.END); curJobStep.ToNextStep(EXECUTE_STEP.END);
runInfo = "在待机位,不执行操作"; runInfo = "在待机位,不执行操作";
...@@ -80,6 +83,7 @@ namespace DeviceLibrary ...@@ -80,6 +83,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, SettingString.DoorCToD);
curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY); curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY);
runInfo = "从4D门回到待机位"; runInfo = "从4D门回到待机位";
msg += runInfo; msg += runInfo;
...@@ -93,6 +97,7 @@ namespace DeviceLibrary ...@@ -93,6 +97,7 @@ namespace DeviceLibrary
{ {
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState)) if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
{ {
RecordRunLog(agv, curJobStep.CurStep(), runInfo, SettingString.Standby);
curJobStep.ToNextStep(EXECUTE_STEP.END); curJobStep.ToNextStep(EXECUTE_STEP.END);
runInfo = "到达待机位"; runInfo = "到达待机位";
msg += runInfo; msg += runInfo;
...@@ -107,6 +112,7 @@ namespace DeviceLibrary ...@@ -107,6 +112,7 @@ namespace DeviceLibrary
runInfo = "在待机位检测到任务,执行任务"; runInfo = "在待机位检测到任务,执行任务";
msg += runInfo; msg += runInfo;
curJobStep.Msg = msg; curJobStep.Msg = msg;
RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
return job; return job;
} }
} }
......
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Management;
namespace DeviceLibrary
{
public enum eMarkState
{
None,
Assigned,
Executing,
Finished
}
/// <summary>
/// 搜索包装仓任务
/// </summary>
public class PackingJobType : JobType
{
/// <summary>
/// 标记
/// </summary>
private static Dictionary<string, eMarkState> Marks = new Dictionary<string, eMarkState>();
private static object locBoj = new object();
public PackingJobType()
{
}
public static string GetMarks()
{
if (Marks != null && Marks.Count > 0)
{
StringBuilder temp = new StringBuilder();
foreach (var item in Marks.Keys)
{
temp.Append(string.Format("{0}={1} ", item, Marks[item]));
}
return temp.ToString().Trim();
}
return "";
}
public static void WriteMarks(string marks = "")
{
if (Marks != null && Marks.Count > 0)
{
Marks.Clear();
string[] tempMarks = marks.Split(' ');
foreach (string item in tempMarks)
{
string[] t1 = item.Split('=');
Marks.Add(t1[0], (eMarkState)Enum.Parse(typeof(eMarkState), t1[1]));
}
}
}
/// <summary>
/// 判断是否为入库标志
/// </summary>
/// <returns></returns>
public static bool IsInStoreMark(string mark)
{
return mark.Equals(SettingString.InStore_Mark);
}
public static bool DelMark(string mark)
{
lock (locBoj)
{
if (Marks != null && Marks.ContainsKey(mark))
{
Marks.Remove(mark);
return true;
}
}
return false;
}
public static bool AddMark(string mark)
{
lock (locBoj)
{
if (Marks != null && !Marks.ContainsKey(mark))
{
Marks.Add(mark, eMarkState.None);
return true;
}
}
return false;
}
public static bool ChangeMarkState(string mark, eMarkState value)
{
lock (locBoj)
{
if (Marks != null && Marks.ContainsKey(mark))
{
Marks[mark] = value;
return true;
}
}
return false;
}
/// <summary>
/// 包装仓任务
/// </summary>
/// <param name="currentAgv"></param>
/// <returns></returns>
public override Job GetNewJob(Agv_Info currentAgv)
{
if (currentAgv.IP.Equals(SettingString.SingleMission_IP1))
return null;
if (!CommonVar.CheckCanExecuteMission(currentAgv))
return null;
if (!CommonVar.CheckAGVStatusNone(currentAgv))
return null;
SearchMarks();
return FindPackingJob(currentAgv);
}
private void SearchMarks()
{
//Mark.Length>1防止Mark为0的情况,Mark=0是VMI的进料
int nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter)
&& s.Mark.Length > 1 && !Marks.ContainsKey(s.Mark) && s.IsUse);
if (nodeIdx > -1)
{
string mark = CommonVar.nodeInfo[nodeIdx].Mark;
AddMark(mark);
LogUtil.info(string.Format("包装仓出库任务生成:{0}={1}", mark, Marks[mark].ToString()));
}
else
{
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter)
&& s.Mark.Equals("0") && !Marks.ContainsKey(SettingString.InStore_Mark) && s.IsUse);
if (nodeIdx > -1)
{
string mark = SettingString.InStore_Mark;
AddMark(mark);
LogUtil.info(string.Format("包装仓入库任务生成:{0}={1}", mark, Marks[mark].ToString()));
}
}
}
/// <summary>
/// 检查节点mark是否存在
/// </summary>
/// <param name="mark"></param>
/// <returns>true:存在</returns>
public static bool CheckNodeMark(string mark, string nodeName = "")
{
if (nodeName.Equals(""))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Mark.Equals(mark));
if (i == -1)
return false;
else
return true;
}
else
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Mark.Equals(mark));
if (i == -1)
return false;
else
return true;
}
}
private static object checkObj = new object();
/// <summary>
/// 检查是否有包装仓出库任务
/// </summary>
/// <returns></returns>
public static int CheckOutStroePackingJob()
{
lock (checkObj)
{
return CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter)
&& Marks.ContainsKey(s.Mark) && Marks[s.Mark].Equals(eMarkState.None) && s.IsUse);
}
}
/// <summary>
/// 检查是否有包装仓入库任务
/// </summary>
/// <returns></returns>
public static int CheckInStroePackingJob()
{
lock (checkObj)
{
int id = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter) && s.Mark.Equals("0") && s.IsUse);
if (id > -1)
return CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A1) && s.RFID.StartsWith(SettingString.Packing_RFID_Prefix));
else
return id;
}
}
/// <summary>
/// 检查是否有包装仓出料架
/// </summary>
/// <returns></returns>
public static int CheckPackingOutShelf(out ClientNode tarNode, out string taskMark)
{
lock (checkObj)
{
taskMark = SettingString.InStore_Mark;
tarNode = null;
int id = CommonVar.nodeInfo.FindIndex(s => s.Name.StartsWith(SettingString.Packing_Box_Prefix) && s.StateEquals(eNodeStatus.NeedLeave) && s.RFID.StartsWith(SettingString.Packing_RFID_Prefix) && s.Mark.Equals("0") && s.IsUse);
if (id > -1)
{
taskMark = SettingString.InStore_Mark;
tarNode = CommonVar.nodeInfo[id];
return id;
}
else
{
id = CommonVar.nodeInfo.FindIndex(s => s.Name.StartsWith(SettingString.Packing_Box_Prefix) && s.StateEquals(eNodeStatus.NeedLeave)
&& s.RFID.StartsWith(SettingString.Packing_RFID_Prefix) && Marks.ContainsKey(s.Mark) && s.IsUse);
if (id > -1)
{
taskMark = CommonVar.nodeInfo[id].Mark;
tarNode = CommonVar.nodeInfo[id];
return id;
}
}
return -1;
}
}
/// <summary>
/// 搜索包装仓任务
/// </summary>
/// <returns>true:有任务</returns>
private Job FindPackingJob(Agv_Info agv)
{
//检查包装仓出料架
int nodeIdx = CheckPackingOutShelf(out ClientNode tarNode, out string taskMark);
if (nodeIdx > -1)
{
int agvId = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob is PackingJob_TransferShelf && ((PackingJob_TransferShelf)s.CurJob).TargetPlace.Equals(tarNode.Name));
if (agvId == -1)
return new PackingJob_TransferShelf(agv.Place, tarNode.Name, "", taskMark);// tarNode.RFID
}
//检查出库任务,没有出库,找入库任务
nodeIdx = CheckOutStroePackingJob();
if (nodeIdx == -1) //搜索包装仓入库任务
{
LogUtil.debug("B区没有找到需要出库的节点");
nodeIdx = CheckInStroePackingJob();
if (nodeIdx > -1)
{
//检查是否有小车去同一个目的地
int agvId = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is PackingJob_GetShelf && ((PackingJob_GetShelf)s.CurJob).TargetPlace.Equals(CommonVar.nodeInfo[nodeIdx].Name));
if (agvId == -1)
{
string Place = CommonVar.nodeInfo[nodeIdx].Name;
LogUtil.info(string.Format("{0} 任务生成:Place={1},Type={2}", agv.Name, Place, SettingString.InStore_Mark));
return new PackingJob_GetShelf(agv.Place, Place, SettingString.InStore_Mark);
}
}
}
else//B区域需要出库,寻找空料架
{
//检查是否有小车去同一个包装仓
int agvId = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is PackingJob_GetShelf && ((PackingJob_GetShelf)s.CurJob).TargetPlace.Equals(CommonVar.nodeInfo[nodeIdx].Name));
if (agvId > -1)
return null;
int n = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A7) && s.StateEquals(eNodeStatus.NeedLeave) &&
s.RFID.StartsWith(SettingString.Packing_RFID_Prefix) && s.IsUse);
if (n > -1)
{
string Place = CommonVar.nodeInfo[n].Name;
string Mark = CommonVar.nodeInfo[nodeIdx].Mark;
LogUtil.info(string.Format("{0} 任务生成:Place={1},Type={2}", agv.Name, Place, Mark));
return new PackingJob_GetShelf(agv.Place, Place, Mark);
}
else
{
//A4没有被占用
n = CommonVar.nodeInfo.FindIndex(s => s.Name == SettingString.A4 && s.StateEquals(eNodeStatus.NeedLeave)
&& s.IsUse);
if (n == -1)
{
nodeIdx = -1;
LogUtil.error("A7,A4不是NeedLeave或被占用");
agv.AddDisplayBoard("包装料架", "PackingShelf", "分盘线出口A7、包装线出口A4均无包装料架,请检查!");
}
else
{
string Place = CommonVar.nodeInfo[n].Name;
string Mark = CommonVar.nodeInfo[nodeIdx].Mark;
LogUtil.info(string.Format("{0} 任务生成:Place={1},Type={2}", agv.Name, Place, Mark));
return new PackingJob_GetShelf(agv.Place, Place, Mark);
}
}
}
return null;
}
}
}
...@@ -62,7 +62,7 @@ namespace DeviceLibrary ...@@ -62,7 +62,7 @@ namespace DeviceLibrary
} }
} }
//检查紧急出料入口需要空料串 //检查紧急出料入口需要空料串
if (FindNeedEnterMission(currentAgv, SettingString.T4_1))//FindNeedEnterMission(currentAgv, SettingString.T4_1,ClientLevel.Middle,false) || if (FindNeedEnterMission(currentAgv, SettingString.T4_1,ClientLevel.Middle,false))//FindNeedEnterMission(currentAgv, SettingString.T4_1,ClientLevel.Middle,false) ||
//FindNeedEnterMission(currentAgv, SettingString.T4_1, ClientLevel.High, false) //FindNeedEnterMission(currentAgv, SettingString.T4_1, ClientLevel.High, false)
{ {
...@@ -186,6 +186,14 @@ namespace DeviceLibrary ...@@ -186,6 +186,14 @@ namespace DeviceLibrary
return new GetShelfJob(currentAgv.Place, SettingString.A9, rfid, true); return new GetShelfJob(currentAgv.Place, SettingString.A9, rfid, true);
} }
} }
if (FindNeedLeaveMission(currentAgv, SettingString.D2, out rfid))
{
if(FindNeedEnterMission(currentAgv, SettingString.A8))
{
LogUtil.info(string.Format("{0} 任务生成:Place={1},rfid={2},点料机满料出口满,上料机构满,出到分盘线", currentAgv.Name, SettingString.D2, rfid));
return new GetShelfJob(currentAgv.Place, SettingString.D2, rfid, true);
}
}
} }
...@@ -196,25 +204,25 @@ namespace DeviceLibrary ...@@ -196,25 +204,25 @@ namespace DeviceLibrary
public static bool FindNeedLeave(Agv_Info agv, string nodeName, out string RFID, string RFID_Prefix = "") public static bool FindNeedLeave(Agv_Info agv, string nodeName, out string RFID, string RFID_Prefix = "")
{ {
int nodeIdx = CommonVar.FindNode(nodeName); int nodeIdx = NodeManager.FindNode(nodeName);
RFID = ""; RFID = "";
if (nodeIdx > -1) if (nodeIdx > -1)
{ {
if (RFID_Prefix.Equals("")) if (RFID_Prefix.Equals(""))
{ {
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedLeave)); nodeIdx = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedLeave));
} }
else if (RFID_Prefix.Trim().Length == 1) else if (RFID_Prefix.Trim().Length == 1)
{ {
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedLeave) && s.RFID.StartsWith(RFID_Prefix)); nodeIdx = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedLeave) && s.RFID.StartsWith(RFID_Prefix));
} }
else else
{ {
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedLeave)); nodeIdx = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedLeave));
} }
if (nodeIdx > -1) if (nodeIdx > -1)
{ {
RFID = CommonVar.nodeInfo[nodeIdx].RFID; RFID = NodeManager.nodeInfo[nodeIdx].RFID;
return true; return true;
} }
} }
...@@ -226,13 +234,13 @@ namespace DeviceLibrary ...@@ -226,13 +234,13 @@ namespace DeviceLibrary
} }
public static bool FindNeedEnter(Agv_Info agv, string nodeName, ClientLevel level= ClientLevel.Low, bool ignoreLevel = true) public static bool FindNeedEnter(Agv_Info agv, string nodeName, ClientLevel level= ClientLevel.Low, bool ignoreLevel = true)
{ {
int nodeIdx = CommonVar.FindNode(nodeName); int nodeIdx = NodeManager.FindNode(nodeName);
if (nodeIdx > -1) if (nodeIdx > -1)
{ {
if (ignoreLevel) if (ignoreLevel)
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedEnter)); nodeIdx = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedEnter));
else else
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedEnter)&& s.Level.Equals(level)); nodeIdx = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.StateEquals(eNodeStatus.NeedEnter)&& s.Level.Equals(level));
if (nodeIdx > -1) if (nodeIdx > -1)
return true; return true;
} }
......
...@@ -7,7 +7,7 @@ using System.Threading.Tasks; ...@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace DeviceLibrary namespace DeviceLibrary
{ {
public class AGVManager public class APIManager
{ {
private static log4net.ILog log = log4net.LogManager.GetLogger("AGVManager"); private static log4net.ILog log = log4net.LogManager.GetLogger("AGVManager");
/// <summary> /// <summary>
...@@ -96,7 +96,7 @@ namespace DeviceLibrary ...@@ -96,7 +96,7 @@ namespace DeviceLibrary
string nodes=""; string nodes="";
foreach (ShelfLockData item in serverResult.data) foreach (ShelfLockData item in serverResult.data)
{ {
CommonVar.GetNodeNameByAliceName(item.cid,out string nodeName); NodeManager.FindNameBy(item.cid,out string nodeName);
int resInt = shelfLockNodeNames.FindIndex(s=>s !=null && s.Equals(nodeName)); int resInt = shelfLockNodeNames.FindIndex(s=>s !=null && s.Equals(nodeName));
if(resInt==-1) if(resInt==-1)
{ {
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class NodeManager
{
/// <summary>
/// 节点信息
/// </summary>
public static List<ClientNode> nodeInfo;
public static void InitNodes()
{
nodeInfo = new List<ClientNode>();
}
public static void FindNameBy(string alicename, out string nodename)
{
nodename = "";
int id = nodeInfo.FindIndex(s => s.AliceName.Equals(alicename));
if (id > -1)
{
nodename = nodeInfo[id].Name;
}
}
/// <summary>
/// 查找节点是否存在以及是否调用
/// </summary>
/// <param name="nodeName">节点名称</param>
/// <returns></returns>
public static int FindNode(string nodeName)
{
int idx = nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.IsUse);
return idx;
}
public static Node GetNodeBy(int i)
{
if (i > -1)
return nodeInfo[i];
return null;
}
public static eNodeStatus? GetState(int i)
{
return GetNodeBy(i)?.GetState();
}
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!