Commit 256f3373 LN

agv修改

1 个父辈 3078ab8b
此文件类型无法预览
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
<add key ="AutoShelfInstore" value ="1"/> <add key ="AutoShelfInstore" value ="1"/>
<!--是否启用入料口移门,1=启用,0=禁用--> <!--是否启用入料口移门,1=启用,0=禁用-->
<add key ="UseDoor" value ="1"/> <add key ="UseDoor" value ="1"/>
<add key ="Agv_Log_Open" value ="1"/>
</appSettings> </appSettings>
<log4net> <log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
...@@ -67,7 +68,7 @@ ...@@ -67,7 +68,7 @@
</layout> </layout>
</appender> </appender>
<appender name="TheRFID" type="log4net.Appender.RollingFileAppender"> <appender name="TheRFID" type="log4net.Appender.RollingFileAppender">
<file value="logs/TheRFID.log"/> <file value="logs/TheRFID-p-1-2.log"/>
<param name="Encoding" value="UTF-8" /> <param name="Encoding" value="UTF-8" />
<appendToFile value="true"/> <appendToFile value="true"/>
<rollingStyle value="Date"/> <rollingStyle value="Date"/>
......
...@@ -11,6 +11,7 @@ namespace OnlineStore.Common ...@@ -11,6 +11,7 @@ namespace OnlineStore.Common
/// </summary> /// </summary>
public class Setting_Init public class Setting_Init
{ {
public static string Agv_Log_Open = "Agv_Log_Open";
public static string Server_Log_Open = "Server_Log_Open"; public static string Server_Log_Open = "Server_Log_Open";
/// <summary> /// <summary>
/// 系统启动时自动启动料仓,=1时自动启动,并隐藏窗口,=0时不需要 /// 系统启动时自动启动料仓,=1时自动启动,并隐藏窗口,=0时不需要
......
...@@ -105,12 +105,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -105,12 +105,12 @@ namespace OnlineStore.DeviceLibrary
else if (wait.WaitType.Equals(WaitEnum.W010_AgvStatus)) else if (wait.WaitType.Equals(WaitEnum.W010_AgvStatus))
{ {
int agvA = (int)AgvClient.GetAction(Config.AgvNodeName); string agvA = AgvClient.GetAction(Config.AgvNodeName);
wait.IsEnd = agvA.Equals(wait.TargetPosition); wait.IsEnd = agvA.Equals(wait.TargetPosition);
if (!wait.IsEnd && span.TotalSeconds > 10) if (!wait.IsEnd && span.TotalSeconds > 10)
{ {
//如果是等待AGV到达,等待有料架信号也算结束 //如果是等待AGV到达,等待有料架信号也算结束
if (wait.TargetPosition.Equals((int)Asa.Actions.Arrive) && MoveInfo.MoveStep.Equals(StoreMoveStep.BI_01_ReadyShelf)) if (wait.AgvAction.Equals(AGVAction.Arrive) && MoveInfo.MoveStep.Equals(StoreMoveStep.BI_01_ReadyShelf))
{ {
if (IOValue(IO_Type.LineTake_Check).Equals(IO_VALUE.HIGH)) if (IOValue(IO_Type.LineTake_Check).Equals(IO_VALUE.HIGH))
{ {
...@@ -123,7 +123,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -123,7 +123,7 @@ namespace OnlineStore.DeviceLibrary
wait.IsEnd = true; wait.IsEnd = true;
} }
} }
else if (wait.TargetPosition.Equals((int)Asa.Actions.FinishOut)) else if (wait.AgvAction.Equals(AGVAction.FinishOut))
{ {
if (IOValue(IO_Type.LineTake_Check).Equals(IO_VALUE.LOW) && IOValue(IO_Type.LineIn_Check).Equals(IO_VALUE.LOW)) if (IOValue(IO_Type.LineTake_Check).Equals(IO_VALUE.LOW) && IOValue(IO_Type.LineIn_Check).Equals(IO_VALUE.LOW))
{ {
...@@ -743,8 +743,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -743,8 +743,8 @@ namespace OnlineStore.DeviceLibrary
InOutStoreLog("出库 " + MoveInfo.SLog + ": 通知agv调度准备带料架的agv,等待agv到达或检测到料架信号,进出轴到P1"); InOutStoreLog("出库 " + MoveInfo.SLog + ": 通知agv调度准备带料架的agv,等待agv到达或检测到料架信号,进出轴到P1");
InOutBackToP1(MoveInfo.MoveParam.MoveP.InOut_P1); InOutBackToP1(MoveInfo.MoveParam.MoveP.InOut_P1);
//需要先叫agv到达 //需要先叫agv到达
AgvClient.ReadyShelf(Config.AgvNodeName); AgvClient.NeedEnter(Config.AgvNodeName);
MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction((int)Asa.Actions.Arrive)); MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction(AGVAction.Arrive));
} }
else else
{ {
......
...@@ -201,15 +201,15 @@ namespace OnlineStore.DeviceLibrary ...@@ -201,15 +201,15 @@ namespace OnlineStore.DeviceLibrary
MoveInfo.OneWaitCanEndStep = true; MoveInfo.OneWaitCanEndStep = true;
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(10000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(10000));
InOutStoreLog(moveName + MoveInfo.SLog + ":调用AgvClient.ReadyEmpty,等待Agv到达 ,最多等待1000"); InOutStoreLog(moveName + MoveInfo.SLog + ":调用AgvClient.ReadyEmpty,等待Agv到达 ,最多等待1000");
AgvClient.ReadyEmpty(Config.AgvNodeName); AgvClient.NeedLeave(Config.AgvNodeName);
//等待agv到达 //等待agv到达
MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction((int)Asa.Actions.Arrive)); MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction(AGVAction.Arrive));
} }
else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_04_ReadyEmpty)) else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_04_ReadyEmpty))
{ {
MoveInfo.NextMoveStep(StoreMoveStep.BS_05_LineBackRun); MoveInfo.NextMoveStep(StoreMoveStep.BS_05_LineBackRun);
//agv到达 //agv到达
if (AgvClient.GetAction(Config.AgvNodeName).Equals(Asa.Actions.Arrive)) if (AgvClient.GetAction(Config.AgvNodeName).Equals(AGVAction.Arrive))
{ {
if (instoreShelf) if (instoreShelf)
{ {
...@@ -221,11 +221,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -221,11 +221,12 @@ namespace OnlineStore.DeviceLibrary
{ {
InOutStoreLog(moveName + MoveInfo.SLog + ":agv到达, 调用AgvClient.MayOut,线体开始反转"); InOutStoreLog(moveName + MoveInfo.SLog + ":agv到达, 调用AgvClient.MayOut,线体开始反转");
} }
AgvClient.MayOut(Config.AgvNodeName); AgvClient.MayLeave(Config.AgvNodeName);
LineBackRun(); LineBackRun();
} }
else else
{//如果agv未到达,直接结束 {
//如果agv未到达,直接结束
MoveEndToRuningStatus(); MoveEndToRuningStatus();
EmprtShelfList = new ConcurrentQueue<string>(); EmprtShelfList = new ConcurrentQueue<string>();
InOutStoreLog(moveName + MoveInfo.SLog + ":等待agv超时,直接结束"); InOutStoreLog(moveName + MoveInfo.SLog + ":等待agv超时,直接结束");
...@@ -241,10 +242,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -241,10 +242,12 @@ namespace OnlineStore.DeviceLibrary
else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_06_WaitInLineSingle)) else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_06_WaitInLineSingle))
{ {
MoveInfo.NextMoveStep(StoreMoveStep.BS_07_WaitTime); MoveInfo.NextMoveStep(StoreMoveStep.BS_07_WaitTime);
InOutStoreLog(moveName + MoveInfo.SLog + ":再转动3000时间,同时等待收到FinishOut"); InOutStoreLog(moveName + MoveInfo.SLog + ":再转动3000时间,同时等待收到FinishOut,等待入料口无信号");
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.LineIn_Check, IO_VALUE.LOW));
//等到agv离开 //等到agv离开
MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction((int)Asa.Actions.FinishOut)); //MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction(AGVAction.FinishOut));
} }
else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_07_WaitTime)) else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_07_WaitTime))
{ {
...@@ -252,7 +255,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -252,7 +255,7 @@ namespace OnlineStore.DeviceLibrary
InOutStoreLog(moveName + MoveInfo.SLog + ": ,同时等待 AGV离开,最多等待5000"); InOutStoreLog(moveName + MoveInfo.SLog + ": ,同时等待 AGV离开,最多等待5000");
MoveInfo.OneWaitCanEndStep = true; MoveInfo.OneWaitCanEndStep = true;
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(5000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(5000));
MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction((int)Asa.Actions.FinishOut)); //MoveInfo.WaitList.Add(WaitResultInfo.WaitAgvAction(action.FinishOut));
} }
else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_08_WaitAGVLeave)) else if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_08_WaitAGVLeave))
...@@ -275,11 +278,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -275,11 +278,11 @@ namespace OnlineStore.DeviceLibrary
#region AGV #region AGV
internal bool ProcessAGVAction(string name, Asa.Actions action) internal bool ProcessAGVAction(string name, string action)
{ {
string logN = name + "收到调度【" + name + "】=【" + action + "】"; string logN = name + "收到调度【" + name + "】=【" + action + "】";
//状态处理 //状态处理
if (action.Equals(Asa.Actions.Usable)) if (action.Equals(AGVAction.CanEnter))
{ {
//判断入口是否可用:入口无料架,缓冲工位无料架,不在入料架处理中 //判断入口是否可用:入口无料架,缓冲工位无料架,不在入料架处理中
bool usable = (storeRunStatus.Equals(StoreRunStatus.Runing) && bool usable = (storeRunStatus.Equals(StoreRunStatus.Runing) &&
...@@ -289,10 +292,10 @@ namespace OnlineStore.DeviceLibrary ...@@ -289,10 +292,10 @@ namespace OnlineStore.DeviceLibrary
&& IOValue(IO_Type.LineIn_Check).Equals(IO_VALUE.LOW) && IOValue(IO_Type.LineIn_Check).Equals(IO_VALUE.LOW)
&& IOValue(IO_Type.LineTake_Check).Equals(IO_VALUE.LOW)); && IOValue(IO_Type.LineTake_Check).Equals(IO_VALUE.LOW));
LogUtil.info(logN + ":" + usable); LogUtil.info(logN + ":" + usable);
return usable; return usable;
} }
else if (action.Equals(Asa.Actions.Arrive)) else if (action.Equals(AGVAction.Arrive))
{ {
//出库处理中不处理 //出库处理中不处理
if (MoveInfo.MoveType.Equals(StoreMoveType.OutStore)) if (MoveInfo.MoveType.Equals(StoreMoveType.OutStore))
......
...@@ -387,7 +387,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -387,7 +387,7 @@ namespace OnlineStore.DeviceLibrary
WarnMsg = msg; WarnMsg = msg;
} }
internal bool AGVProcess(string name, Actions action) internal bool AGVProcess(string name, string action)
{ {
foreach (AC_BOX_Bean box in this.BoxMap.Values) foreach (AC_BOX_Bean box in this.BoxMap.Values)
{ {
......
...@@ -39,7 +39,8 @@ ...@@ -39,7 +39,8 @@
<Reference Include="Asa.IOModule.AIOBOX"> <Reference Include="Asa.IOModule.AIOBOX">
<HintPath>..\..\dll\Asa.IOModule.AIOBOX.dll</HintPath> <HintPath>..\..\dll\Asa.IOModule.AIOBOX.dll</HintPath>
</Reference> </Reference>
<Reference Include="Client"> <Reference Include="Client, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\dll\Client.dll</HintPath> <HintPath>..\..\dll\Client.dll</HintPath>
</Reference> </Reference>
<Reference Include="CodeLibrary"> <Reference Include="CodeLibrary">
......
using BLL; using Asa;
using OnlineStore.Common; using OnlineStore.Common;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
...@@ -11,142 +11,134 @@ namespace OnlineStore.DeviceLibrary ...@@ -11,142 +11,134 @@ namespace OnlineStore.DeviceLibrary
public class AgvClient public class AgvClient
{ {
private static string ServerIp = ConfigAppSettings.GetValue(Setting_Init.AgvServerIp); private static string ServerIp = ConfigAppSettings.GetValue(Setting_Init.AgvServerIp);
//private string NodeName = ""; private static Client agvClient;
private static Client agvClient = new Client(ServerIp); public static Dictionary<string, string> actionMap = new Dictionary<string, string>();
public static Dictionary<string, Asa.Actions> actionMap = new Dictionary<string, Asa.Actions>(); public static List<string> NodeList = new List<string>();
public static List<string> NodeList = new List<string>(); public static void Init()
public static void Init( )
{ {
try try
{ {
// this.NodeName = nodeID;
if (agvClient == null) if (agvClient == null)
{ {
agvClient = new Client(ServerIp); agvClient = new Client(ServerIp);
} }
actionMap = new Dictionary<string, Asa.Actions>(); actionMap = new Dictionary<string, string>();
foreach(string key in NodeList) foreach (string key in NodeList)
{ {
actionMap.Add(key, Asa.Actions.ClientClose); actionMap.Add(key, AGVAction.None);
} }
agvClient.Info += AgvClient_Info;
agvClient.Log += AgvClient_Log; agvClient.Log += AgvClient_Log;
agvClient.Connected += AgvClient_Connected; agvClient.Arrive += AgvClient_Arrive;
agvClient.Action += AgvClient_Action; agvClient.CanEnter += AgvClient_CanEnter;
agvClient.Ready += AgvClient_Ready;
agvClient.Connect(); agvClient.Connect();
agvClient.SetNodeID(NodeList.ToArray());
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("初始化agvClient " + ServerIp + " 出错:" + ex.ToString()); LogUtil.error("初始化agvClient " + ServerIp + " 出错:" + ex.ToString());
} }
} }
internal static bool ISConnected()
private static void AgvClient_Ready(string id, byte[] content)
{
UpdateAction(id, AGVAction.Ready);
RFIDData data = new RFIDData(content);
LogUtil.info("收到 AgvClient_Ready [" + id + "] [" + data.ToData() + "] ");
StoreManager.Store.AGVProcess(id, AGVAction.Ready);
}
private static void AgvClient_CanEnter(string id, byte[] content)
{
UpdateAction(id, AGVAction.CanEnter);
RFIDData data = new RFIDData(content);
LogUtil.info("收到 AgvClient_Ready [" + id + "] [" + data.ToData() + "] ");
StoreManager.Store.AGVProcess(id, AGVAction.CanEnter);
}
private static void AgvClient_Arrive(string id, byte[] content)
{
UpdateAction(id, AGVAction.Arrive);
RFIDData data = new RFIDData(content);
LogUtil.info("收到 AgvClient_Arrive [" + id + "] [" + data.ToData() + "] ");
StoreManager.Store.AGVProcess(id, AGVAction.Arrive);
}
internal static bool ISConnected()
{ {
if (agvClient == null) if (agvClient == null)
{ {
return false; return false;
} }
return agvClient.IsConn; return agvClient.IsConn;
} }
/// <summary> internal static void SendRFID(string NodeName, string rfid)
///02 发送RFID
/// </summary>
/// <param name="NodeName"></param>
internal static void SendRFID(string NodeName, string shelfId)
{ {
byte[] data = null; agvClient.SendRFID(NodeName, rfid);
agvClient.SendRFID(NodeName, data);
}
} internal static void NeedEnter(string NodeName)
/// <summary>
/// 10 准备空车
/// </summary>
/// <param name="NodeName"></param>
internal static void ReadyEmpty(string NodeName)
{ {
agvClient.ReadyEmpty(NodeName); agvClient.NeedEnter(NodeName);
} }
/// <summary> internal static void NeedLeave(string NodeName)
/// 11 准备agv带料架
/// </summary>
/// <param name="NodeName"></param>
internal static void ReadyShelf(string NodeName)
{ {
agvClient.ReadyShelf(NodeName); agvClient.NeedLeave(NodeName);
} }
/// <summary>
/// 12 可以进入
/// </summary>
/// <param name="NodeName"></param>
internal static void MayEnter(string NodeName) internal static void MayEnter(string NodeName)
{ {
agvClient.MayEnter(NodeName); agvClient.MayEnter(NodeName);
} }
/// <summary>
///13 完成进入
/// </summary>
/// <param name="NodeName"></param>
internal static void FinishEnter(string NodeName) internal static void FinishEnter(string NodeName)
{ {
agvClient.FinishEnter(NodeName); agvClient.FinishEnter(NodeName);
} }
/// <summary> internal static void MayLeave(string NodeName)
/// 14 可以出去
/// </summary>
/// <param name="NodeName"></param>
internal static void MayOut(string NodeName)
{
agvClient.MayOut(NodeName);
}
/// <summary>
///17 agv离开
/// </summary>
/// <param name="NodeName"></param>
internal static void GetOut(string NodeName)
{ {
agvClient.GetOut(NodeName); agvClient.MayLeave(NodeName);
} }
private static void AgvClient_Log(string s)
private static bool AgvClient_Action(string name, Asa.Actions action)
{ {
if (actionMap.ContainsKey(name)) try
{ {
actionMap[name] = action; bool isLog = ConfigAppSettings.GetIntValue(Setting_Init.Agv_Log_Open).Equals(1);
if (isLog)
{
LogUtil.info(" AGV " + ServerIp + " Log : " + s);
}
} }
else catch (Exception ex)
{ {
actionMap.Add(name, action); LogUtil.error("AgvClient_Log 出错:" + ex.ToString());
} }
return StoreManager.Store.AGVProcess(name, action);
}
private static void AgvClient_Connected()
{
agvClient.SetNodeID(NodeList.ToArray());
}
private static void AgvClient_Log(string s)
{
LogUtil.info("AGV "+ ServerIp + " Log:" + s);
} }
private static void AgvClient_Info(string s) public static string GetAction(string NodeName)
{
LogUtil.info("AGV "+ ServerIp + " Info:" + s);
}
public static Asa.Actions GetAction(string NodeName)
{ {
if (actionMap.ContainsKey(NodeName)) if (actionMap.ContainsKey(NodeName))
{ {
return actionMap[NodeName]; return actionMap[NodeName];
} }
return Asa.Actions.ClientClose; return AGVAction.None;
} }
public static void Dispose() public static void UpdateAction(string name, string action)
{
if (actionMap.ContainsKey(name))
{
actionMap[name] = action;
}
else
{
actionMap.Add(name, action);
}
}
public static void Dispose()
{ {
try try
{ {
...@@ -157,8 +149,17 @@ namespace OnlineStore.DeviceLibrary ...@@ -157,8 +149,17 @@ namespace OnlineStore.DeviceLibrary
} }
catch (Exception ex) catch (Exception ex)
{ {
LogUtil.error("释放 agvClient "+ ServerIp + " 出错:" + ex.ToString()); LogUtil.error("释放 agvClient " + ServerIp + " 出错:" + ex.ToString());
} }
} }
} }
public class AGVAction
{
public static string None = "None";
public static string Arrive = "Arrive";
public static string CanEnter = "CanEnter";
public static string GetRFID = "GetRFID";
public static string Ready = "Ready";
public static string FinishOut = "FinishOut";
}
} }
...@@ -51,7 +51,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -51,7 +51,7 @@ namespace OnlineStore.DeviceLibrary
{ {
//LogUtil.error("ReadRFID["+ip+"]出错:" + ex.ToString()); //LogUtil.error("ReadRFID["+ip+"]出错:" + ex.ToString());
} }
return new RFIDData(-1, -1); return new RFIDData();
} }
...@@ -73,11 +73,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -73,11 +73,11 @@ namespace OnlineStore.DeviceLibrary
/// <summary> /// <summary>
/// RFID类型,区分是料架还是托盘,托盘E=69,包装料料架A=65,料串=B /// RFID类型,区分是料架还是托盘,托盘E=69,包装料料架A=65,料串=B
/// </summary> /// </summary>
public char RFType = 'A'; public char RFType = '0';
public int Num = 0; public int Num = 0;
public RFIDData(int num, int t) public RFIDData(int num=0, int t=0)
{ {
if (t < 65) if (t < 65)
{ {
......
...@@ -267,11 +267,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -267,11 +267,11 @@ namespace OnlineStore.DeviceLibrary
wait.IsHomeMove = false; wait.IsHomeMove = false;
return wait; return wait;
} }
public static WaitResultInfo WaitAgvAction( int arrive) public static WaitResultInfo WaitAgvAction( string arrive)
{ {
WaitResultInfo wait = new WaitResultInfo(); WaitResultInfo wait = new WaitResultInfo();
wait.WaitType = WaitEnum.W010_AgvStatus; wait.WaitType = WaitEnum.W010_AgvStatus;
wait.TargetPosition = arrive; wait.AgvAction = arrive;
return wait; return wait;
} }
public string ToStr() public string ToStr()
...@@ -319,7 +319,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -319,7 +319,7 @@ namespace OnlineStore.DeviceLibrary
return "扫码完成"; return "扫码完成";
}else if (WaitType.Equals(WaitEnum.W010_AgvStatus)) }else if (WaitType.Equals(WaitEnum.W010_AgvStatus))
{ {
return "Agv状态:" + (Asa.Actions)TargetPosition; return "Agv状态:" + AgvAction;
} }
else else
{ {
...@@ -372,7 +372,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -372,7 +372,7 @@ namespace OnlineStore.DeviceLibrary
/// </summary> /// </summary>
public bool IsEnd{ get; set; } public bool IsEnd{ get; set; }
public string AgvAction = "";
} }
internal class WaitEnum internal class WaitEnum
{ {
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!