Commit 0e31e02e LN

vmi链条增加休眠功能

1 个父辈 6f3cdfc5
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
PRO,IO模块对应的DI数量,IO_DILength,192.168.103.25#16,,,,,,, PRO,IO模块对应的DI数量,IO_DILength,192.168.103.25#16,,,,,,,
PRO,模块对应的DO数量,IO_DOLength,192.168.103.25#16,,,,,,, PRO,模块对应的DO数量,IO_DOLength,192.168.103.25#16,,,,,,,
PRO,IO模块IP,PRO_AOI_IP_1,192.168.103.25,,,,,,, PRO,IO模块IP,PRO_AOI_IP_1,192.168.103.25,,,,,,,
PRO,休眠秒数(秒),SleepSeconds,60,,,,,,,
,,,,,,,,,, ,,,,,,,,,,
DI,急停,SuddenStop_BTN,0,PRO_AOI_IP_1,0,急停,X721,DI-01,0, DI,急停,SuddenStop_BTN,0,PRO_AOI_IP_1,0,急停,X721,DI-01,0,
DI,复位,Reset_BTN,1,PRO_AOI_IP_1,0,复位,X722,DI-02,0, DI,复位,Reset_BTN,1,PRO_AOI_IP_1,0,复位,X722,DI-02,0,
......
...@@ -97,6 +97,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -97,6 +97,7 @@ namespace OnlineStore.DeviceLibrary
isInSuddenDown = false; isInSuddenDown = false;
alarmType = AlarmType.None; alarmType = AlarmType.None;
SetWarnMsg(""); SetWarnMsg("");
IOManager.IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW); IOManager.IOMove(IO_Type.Alarm_HddLed, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH); IOManager.IOMove(IO_Type.AutoRun_HddLed, IO_VALUE.HIGH);
MoveInfo.NextMoveStep(MoveStep.VMI_H_StopUp); MoveInfo.NextMoveStep(MoveStep.VMI_H_StopUp);
...@@ -145,10 +146,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -145,10 +146,11 @@ namespace OnlineStore.DeviceLibrary
{ {
case MoveStep.VMI_H_StopUp: case MoveStep.VMI_H_StopUp:
MoveInfo.NextMoveStep(MoveStep.VMI_H_LineRun); MoveInfo.NextMoveStep(MoveStep.VMI_H_LineRun);
LogUtil.info(Name + " 复位:阻挡上升完成,转动流水线"); LogUtil.info(Name + " 复位:阻挡上升完成,转动流水线,停止休眠");
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
IOManager.IOMove(IO_Type.InL_Run, IO_VALUE.HIGH); IOManager.IOMove(IO_Type.InL_Run, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.OutL_Run, IO_VALUE.HIGH); IOManager.IOMove(IO_Type.OutL_Run, IO_VALUE.HIGH);
UpdateSleep(false);
break; break;
case MoveStep.VMI_H_LineRun: case MoveStep.VMI_H_LineRun:
LogUtil.info(Name + " 复位完成"); LogUtil.info(Name + " 复位完成");
...@@ -245,6 +247,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -245,6 +247,8 @@ namespace OnlineStore.DeviceLibrary
OutLineTimerProcess(); OutLineTimerProcess();
IOTimeOutProcess(); IOTimeOutProcess();
SleepTimerProcess();
} }
} }
catch (Exception ex) catch (Exception ex)
......
using OnlineStore.Common; using Asa;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary; using OnlineStore.LoadCSVLibrary;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
...@@ -125,10 +126,122 @@ namespace OnlineStore.DeviceLibrary ...@@ -125,10 +126,122 @@ namespace OnlineStore.DeviceLibrary
public string GetRunInfo() public string GetRunInfo()
{ {
return "进料入口料架: "+LastInShelfId+" 进料出口料架: "+LastOutShelfId+"\r\n"+ return "进料入口料架: " + LastInShelfId + " 进料出口料架: " + LastOutShelfId + "\r\n" +
"进料出口"+Config.InL_AgvName+":"+AgvClient.GetAction(Config.InL_AgvName)+" 出料进口" + Config.OutL_AgvName + ":"+ AgvClient.GetAction(Config.OutL_AgvName) + ""; "进料出口" + Config.InL_AgvName + ":" + AgvClient.GetAction(Config.InL_AgvName) + " 出料进口" + Config.OutL_AgvName + ":" + AgvClient.GetAction(Config.OutL_AgvName) + "\r\n"+
( IsSleep?"休眠中":"工作中");
} }
#endregion #endregion
#region 休眠处理
private bool IsSleep = false;
private DateTime LastBusyTime = DateTime.Now;
private Dictionary<string, IO_VALUE> lastDIValue = new Dictionary<string, IO_VALUE>();
private List<string> needCheckList = new List<string>();
private int GetDIV(string type)
{
if (lastDIValue.ContainsKey(type))
{
return (int)lastDIValue[type];
}
return -1;
}
private void SleepTimerProcess()
{
if (needCheckList.Count <= 0)
{
needCheckList.Add(IO_Type.InL_InStopCheck);
needCheckList.Add(IO_Type.InL_MIddleCheck);
needCheckList.Add(IO_Type.InL_OutStopCheck);
needCheckList.Add(IO_Type.OutL_InCheck);
needCheckList.Add(IO_Type.OutL_InStopCheck);
needCheckList.Add(IO_Type.OutL_InStopDown);
needCheckList.Add(IO_Type.InL_InStopDown);
}
bool agvBusy = false;
ClientAction currA = AgvClient.GetAction(Config.InL_AgvName);
if (currA.Equals(ClientAction.None) || currA.Equals(ClientAction.NeedLeave) || currA.Equals(ClientAction.NeedEnter) )
{
ClientAction currB = AgvClient.GetAction(Config.OutL_AgvName);
if (currB.Equals(ClientAction.None) || currB.Equals(ClientAction.NeedLeave) || currB.Equals(ClientAction.NeedEnter))
{
agvBusy = false;
}
else
{
LastBusyTime = DateTime.Now;
agvBusy = true;
}
}
else
{
LastBusyTime = DateTime.Now;
agvBusy = true;
}
if (agvBusy && IsSleep)
{
UpdateSleep(false);
return;
}
bool diIsBusy = false;
foreach (string type in needCheckList)
{
IO_VALUE currValue = IOManager.IOValue(type);
int lastValue = GetDIV(type);
if (((int)currValue).Equals(lastValue))
{
diIsBusy = false ;
}
else
{
if (lastDIValue.ContainsKey(type))
{
lastDIValue[type]=currValue;
}
else
{
lastDIValue.Add(type, currValue);
}
LastBusyTime = DateTime.Now;
diIsBusy = true;
UpdateSleep(false);
return;
}
}
if (diIsBusy.Equals(false) && agvBusy.Equals(false) && IsSleep.Equals(false))
{
TimeSpan time = DateTime.Now-LastBusyTime;
if (time.TotalSeconds > Config.SleepSeconds)
{
LogUtil.info(Name + "已经空闲【"+Math.Abs(time.TotalSeconds)+"】秒,开始休眠");
UpdateSleep(true);
}
}
}
public void UpdateSleep(bool needSleep)
{
if (needSleep)
{
IsSleep = true;
IOManager.IOMove(IO_Type.InL_Run, IO_VALUE.LOW);
IOManager.IOMove(IO_Type.OutL_Run, IO_VALUE.LOW);
}
else
{
IsSleep = false;
LastBusyTime = DateTime.Now;
IOManager.IOMove(IO_Type.InL_Run, IO_VALUE.HIGH);
IOManager.IOMove(IO_Type.OutL_Run, IO_VALUE.HIGH);
};
}
#endregion
} }
} }
...@@ -15,8 +15,15 @@ namespace OnlineStore.LoadCSVLibrary ...@@ -15,8 +15,15 @@ namespace OnlineStore.LoadCSVLibrary
public VMLLineConfig( string filepath) public VMLLineConfig( string filepath)
: base(1, "", "", filepath) : base(1, "", "", filepath)
{ {
} }
/// <summary>
/// PRO,休眠秒数(秒),SleepSeconds,180,,,,,,,
/// </summary>
[ConfigProAttribute("SleepSeconds", false)]
public int SleepSeconds { get; set; }
/// <summary> /// <summary>
/// PRO IO信号超时时间(毫秒) IOSingle_TimerOut 5000 /// PRO IO信号超时时间(毫秒) IOSingle_TimerOut 5000
/// </summary> /// </summary>
......
...@@ -124,7 +124,7 @@ namespace OnlineStore.VMILineClient ...@@ -124,7 +124,7 @@ namespace OnlineStore.VMILineClient
ReadIOList(); ReadIOList();
lblThisSta.Text = LineManager.GetRunStr(vmiLine.runStatus); lblThisSta.Text = LineManager.GetRunStr(vmiLine.runStatus);
lblWarnMsg.Text = vmiLine.WarnMsg; lblWarnMsg.Text = vmiLine.WarnMsg;
lblInfo.Text = vmiLine.GetRunInfo(); lblInfo.Text = vmiLine.GetRunInfo();
} }
private void FrmTest_FormClosing(object sender, FormClosingEventArgs e) private void FrmTest_FormClosing(object sender, FormClosingEventArgs e)
......
...@@ -8,4 +8,8 @@ Mayleave、MayEnter是包装料仓的,开了门后发,环形线和VMI是不 ...@@ -8,4 +8,8 @@ Mayleave、MayEnter是包装料仓的,开了门后发,环形线和VMI是不
agvclien增加cancelState的参数设置 agvclien增加cancelState的参数设置
20200221 20200221
agv客户端启动时需要设置状态为none
\ No newline at end of file \ No newline at end of file
agv客户端启动时需要设置状态为none
20200227
vmi链条增加休眠功能
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!