Commit 29fc87a5 张东亮

测试可用

1 个父辈 757c5c07
......@@ -105,7 +105,6 @@ namespace LogisticsIntelligence
this.Name = "FrmMain";
this.Text = "LiftController";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing);
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmMain_FormClosed);
this.Load += new System.EventHandler(this.FrmMain_Load);
this.tableLayoutPanel1.ResumeLayout(false);
this.groupBox1.ResumeLayout(false);
......
......@@ -29,11 +29,6 @@ namespace LogisticsIntelligence
AddForm(" IO列表 ", frmi);
timer1.Start();
}
private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
{
//appContext.Close();
timer1.Enabled = false;
}
private void UpdateLift()
{
this.Invoke(new Action(()=> {
......@@ -52,6 +47,11 @@ namespace LogisticsIntelligence
{
e.Cancel = true;
}
else
{
timer1.Enabled = false;
System.Environment.Exit(System.Environment.ExitCode);
}
}
private void AddForm(string text, Form form)
{
......
类型,说明,名称,属性值,设备名称,默认值,描述,电器定义,代码定义,SlaveID
PRO,IO模块对应的DI数量,IO_DILength,192.168.103.21#8;192.168.103.22#8,,,,,,
PRO,模块对应的DO数量,IO_DOLength,192.168.103.21#8;192.168.103.22#8,,,,,,
PRO,IO模块IP,PRO_AOI_IP_1,192.168.103.21,,,,,,
PRO,IO模块IP,PRO_AOI_IP_2,192.168.103.22,,,,,,
PRO,IO模块对应的DI数量,IO_DILength,10.85.199.29#8;192.168.103.22#8,,,,,,
PRO,模块对应的DO数量,IO_DOLength,10.85.199.29#8;192.168.103.22#8,,,,,,
PRO,IO模块IP,PRO_AOI_IP_1,10.85.199.29,,,,,,
,,,,,,,,,
DI,D2-任务应答,LIFT_D2_Response,0,PRO_AOI_IP_1,0,D2-任务应答,X21,X21,0
DI,D2-到达1F,LIFT_D2_AtFirst,1,PRO_AOI_IP_1,0,D2-到达1F,X22,X22,0
......
......@@ -6,11 +6,13 @@ namespace DeviceLibrary.Context
{
ServiceContext serviceContext = new ServiceContext();
LineManager lineManager = new LineManager();
public void Init()
{
LiftContext.Init();
lineManager.Init();
IOManager.Init();
IOManager.instance.ConnectionIOList(LineManager.Config.DIODeviceNameList);
}
public void Open()
{
......
......@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceLibrary
{
......@@ -23,19 +24,16 @@ namespace DeviceLibrary
int trytimes = 5;
ConfigIO configIo = LineManager.Config.DOList[ioType];
instance.WriteSingleDO(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
Thread.Sleep(60);
while(trytimes>0 && !IOValue(ioType).Equals(ioValue))
{
instance.WriteSingleDO(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
trytimes--;
}
Thread.Sleep(100);
}
else
{
LogUtil.error("没有DO=" + ioType);
}
}
public static void CIOMove(string ioType,IO_VALUE ioValue)
public static void CIOMove(string ioType, IO_VALUE ioValue)
{
if (!IOValue(ioType).Equals(ioValue))
{
......@@ -63,10 +61,10 @@ namespace DeviceLibrary
return ioValue;
}
public static IO_VALUE DOValue(string ioType )
public static IO_VALUE DOValue(string ioType)
{
IO_VALUE ioValue = IO_VALUE.None;
ConfigIO configIo = GetDO(ioType );
ConfigIO configIo = GetDO(ioType);
if (configIo != null)
{
......@@ -78,10 +76,10 @@ namespace DeviceLibrary
}
return ioValue;
}
public static IO_VALUE DIValue(string ioType )
public static IO_VALUE DIValue(string ioType)
{
IO_VALUE ioValue = IO_VALUE.None;
ConfigIO configIo = GetDI(ioType );
ConfigIO configIo = GetDI(ioType);
if (configIo != null)
{
ioValue = instance.GetDIValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
......@@ -92,7 +90,7 @@ namespace DeviceLibrary
}
return ioValue;
}
private static ConfigIO GetDI(string ioType )
private static ConfigIO GetDI(string ioType)
{
ConfigIO configIo = null;
if (LineManager.Config.DIList.ContainsKey(ioType))
......@@ -101,7 +99,7 @@ namespace DeviceLibrary
}
return configIo;
}
private static ConfigIO GetDO(string ioType )
private static ConfigIO GetDO(string ioType)
{
ConfigIO configIo = null;
if (LineManager.Config.DOList.ContainsKey(ioType))
......
......@@ -72,7 +72,7 @@ namespace DeviceLibrary.Models
/// <returns></returns>
public bool IsIdle(out string msg)
{
msg = "ok";
msg = "";
if (Monitor.TryEnter(locObj, 500))
{
......@@ -175,23 +175,36 @@ namespace DeviceLibrary.Models
}
if (IOManager.IOValue($"{liftId}{SettingString._AGVRequest}").Equals(IO_VALUE.HIGH))
{
if (IOManager.IOValue($"{liftId}{SettingString._Response}").Equals(IO_VALUE.HIGH) &&
IOManager.IOValue($"{liftId}{SettingString._DoorOpen}").Equals(IO_VALUE.HIGH))
{
OpenAGVLeave(5);
LogUtil.info($"{lift} 上一次异常退出,发送AGV离开清除异常状态!");
return false;
}
if (IOManager.IOValue($"{liftId}{SettingString._Response}").Equals(IO_VALUE.HIGH))
{
SetState(LiftState.Busy);
Status.Set(lift);
LogUtil.info($"{lift} 成功!");
msg = "ok";
return true;
}
}
else
{
IOManager.IOMove($"{liftId}{SettingString._AGVRequest}", IO_VALUE.HIGH);
OpenAGVRequest(true);
Thread.Sleep(2000);
if (IOManager.IOValue($"{liftId}{SettingString._Response}").Equals(IO_VALUE.HIGH))
{
if (IOManager.IOValue($"{liftId}{SettingString._DoorOpen}").Equals(IO_VALUE.HIGH))
{
OpenAGVLeave(5);
LogUtil.info($"{lift} 上一次异常退出,发送AGV离开清除异常状态!");
return false;
}
SetState(LiftState.Busy);
Status.Set(lift);
LogUtil.info($"{lift} 成功!");
msg = "ok";
return true;
}
msg = "电梯未任务应答";
......@@ -209,29 +222,29 @@ namespace DeviceLibrary.Models
{
if (CanControl(doorInfo))
{
IOManager.IOMove($"{liftId}{SettingString._AGVLeave}", IO_VALUE.HIGH);
Thread.Sleep(3000);
bool rtn = IOManager.IOValue($"{liftId}{SettingString._AGVLeave}").Equals(IO_VALUE.HIGH);
if (rtn && IsDesClient(doorInfo))
if (IsDesClient(doorInfo))
{
//关闭送料信号
CloseSendFloor();
//AGV离开信号,使得门关
CloseDoor();
Status.Clear();
SetState(LiftState.Idle);
//关闭所有IO
CloseAllDO();
LogUtil.info($"AGV离开,{doorInfo.sourceFloor}[{doorInfo.sourceFloor}]取出电梯[{liftId}]内的产品,清除电梯占用");
//是否继续使用电梯
OpenAGVRequest(doorInfo.continueUse);
LogUtil.info($"AGV离开,{doorInfo.sourceFloor}[{doorInfo.sourceFloor}][{doorInfo.continueUse}]取出电梯[{liftId}]内的产品,清除电梯占用");
}
if (rtn && IsSrcClient(doorInfo))
if (IsSrcClient(doorInfo))
{
//关闭呼叫信号
CloseCallFloor();
if (!Status.destinationFloor.Equals(0))
{
RunToFloor(Status.destinationFloor);
while (!CheckIsInRun())
//AGV离开信号,使得门关
CloseDoor();
if (!Status.destinationFloor.Equals(-1))
{
Thread.Sleep(3000);
RunToFloor(Status.destinationFloor);
}
LogUtil.info($"AGV离开,{doorInfo.sourceFloor}[{doorInfo.sourceFloor}]将产品送入电梯[{liftId}]");
}
}
......@@ -239,23 +252,13 @@ namespace DeviceLibrary.Models
}
return false;
}
private bool CheckIsInRun()
{
return IOManager.IOValue($"{liftId}{SettingString._InRun}").Equals(IO_VALUE.HIGH);
}
private bool CheckIsFault()
{
return IOManager.IOValue($"{liftId}{SettingString._InFault}").Equals(IO_VALUE.HIGH);
}
/// <summary>
/// 运行到指定楼层(送料信号)
/// </summary>
/// <param name="floor"></param>
private void RunToFloor(int floor)
{
Task.Factory.StartNew(() => {
switch (floor)
{
//case -1:
......@@ -276,7 +279,22 @@ namespace DeviceLibrary.Models
IOManager.CIOMove($"{liftId}{SettingString._RunToFourth}", IO_VALUE.HIGH);
break;
}
DateTime dateTime1 = DateTime.Now;
//等待运行信号亮
while (!CheckIsInRun())
{
if ((DateTime.Now - dateTime1).TotalSeconds > 10)
{
LogUtil.error("检查AGV送料信号有效:等待电梯运行信号超时");
break;
}
Thread.Sleep(1000);
}
LogUtil.info($"送料信号:运行到{floor}层");
CloseSendFloor();
});
}
/// <summary>
/// 运行到指定楼层(呼叫信号)
/// </summary>
......@@ -326,7 +344,7 @@ namespace DeviceLibrary.Models
return;
if (!liftId.Equals(clientStatus.liftId))
return;
int floor = 0;
int floor = -1;
if (IOManager.IOValue($"{liftId}{SettingString._AtFirst}").Equals(IO_VALUE.HIGH))
{
floor = 1;
......@@ -345,6 +363,8 @@ namespace DeviceLibrary.Models
{
Status.door = "opened";
RunState = LiftRunState.DoorOpen;
//关闭呼叫信号
CloseCallFloor();
}
else
{
......@@ -370,19 +390,91 @@ namespace DeviceLibrary.Models
clientInfo.SetInfo(clientStatus.sourceClient, clientStatus.hasIdleAgv);
}
}
private void CloseAllDO()
private void CloseSendFloor()
{
IOManager.CIOMove($"{liftId}{SettingString._AGVRequest}", IO_VALUE.LOW);
IOManager.CIOMove($"{liftId}{SettingString._AGVLeave}", IO_VALUE.LOW);
IOManager.CIOMove($"{liftId}{SettingString._RunToFirst}", IO_VALUE.LOW);
IOManager.CIOMove($"{liftId}{SettingString._RunToThird}", IO_VALUE.LOW);
IOManager.CIOMove($"{liftId}{SettingString._RunToFourth}", IO_VALUE.LOW);
LogUtil.info("关闭所有送料信号");
}
/// <summary>
/// 等待运行信号亮或者关信号
/// </summary>
/// <returns></returns>
private bool CheckAGVLeaveOK()
{
return !CheckDoorOpen() || CheckIsInRun();
}
private bool CheckDoorOpen()
{
return IOManager.IOValue($"{liftId}{SettingString._DoorOpen}").Equals(IO_VALUE.HIGH);
}
private bool CheckIsInRun()
{
return IOManager.IOValue($"{liftId}{SettingString._InRun}").Equals(IO_VALUE.HIGH);
}
private bool CheckIsFault()
{
return IOManager.IOValue($"{liftId}{SettingString._InFault}").Equals(IO_VALUE.HIGH);
}
private void OpenAGVLeave(bool open)
{
if (open)
{
IOManager.CIOMove($"{liftId}{SettingString._AGVLeave}", IO_VALUE.HIGH);
LogUtil.info("打开AGV离开信号");
}
else
{
IOManager.CIOMove($"{liftId}{SettingString._AGVLeave}", IO_VALUE.LOW);
LogUtil.info("关闭AGV离开信号");
}
}
private void OpenAGVLeave(int second)
{
Task.Factory.StartNew(() => {
OpenAGVLeave(true);
Task.Delay(second*1000);
OpenAGVLeave(false);
});
}
private void CloseDoor()
{
Task.Factory.StartNew(()=>
{
OpenAGVLeave(true);
DateTime dateTime = DateTime.Now;
//门关信号
while (CheckDoorOpen() && (DateTime.Now - dateTime).TotalMinutes<1)
{
if ((DateTime.Now - dateTime).TotalSeconds > 5)
{
IOManager.CIOMove($"{liftId}{SettingString._AGVLeave}", IO_VALUE.HIGH);
}
Thread.Sleep(300);
}
OpenAGVLeave(false);
});
}
private void OpenAGVRequest(bool open)
{
if (open)
{
IOManager.CIOMove($"{liftId}{SettingString._AGVRequest}", IO_VALUE.HIGH);
LogUtil.info("打开AGV请求信号");
}
else
{
IOManager.CIOMove($"{liftId}{SettingString._AGVRequest}", IO_VALUE.LOW);
LogUtil.info("关闭AGV请求信号");
}
}
private void CloseCallFloor()
{
IOManager.CIOMove($"{liftId}{SettingString._FirstCall}", IO_VALUE.LOW);
IOManager.CIOMove($"{liftId}{SettingString._ThirdCall}", IO_VALUE.LOW);
IOManager.CIOMove($"{liftId}{SettingString._FourthCall}", IO_VALUE.LOW);
LogUtil.info("关闭所有呼叫信号");
}
}
/// <summary>
......
......@@ -22,8 +22,11 @@ namespace DeviceLibrary.Models.Service.Request
/// <summary>
/// 架子来源层
/// </summary>
public int sourceFloor { get; set; } = 0;
public int sourceFloor { get; set; } = -1;
/// <summary>
/// 继续使用电梯
/// </summary>
public bool continueUse {get;set;}=false;
public override string ToString()
{
return $"{sourceClient}[{sourceFloor}]:{liftId}";
......
......@@ -13,7 +13,7 @@ namespace DeviceLibrary.Models.Service.Response
/// <summary>
/// 当前电梯处于哪一层
/// </summary>
public int floor { get; set; } = 0;
public int floor { get; set; } = -1;
/// <summary>
/// 电梯门是否打开,打开=opened,关闭=closed
/// </summary>
......@@ -25,7 +25,7 @@ namespace DeviceLibrary.Models.Service.Response
/// <summary>
/// 架子来源楼层
/// </summary>
public int sourceFloor { get; set; } = 0;
public int sourceFloor { get; set; } = -1;
/// <summary>
/// 架子来源点位
/// </summary>
......@@ -37,7 +37,7 @@ namespace DeviceLibrary.Models.Service.Response
/// <summary>
/// 目的地楼层
/// </summary>
public int destinationFloor { get; set; } = 0;
public int destinationFloor { get; set; } = -1;
/// <summary>
/// 目的地点位
/// </summary>
......@@ -65,10 +65,10 @@ namespace DeviceLibrary.Models.Service.Response
public void Clear()
{
sourceClient = "";
sourceFloor = 0;
sourceFloor = -1;
sourcePoint = "";
destinationClient = "";
destinationFloor = 0;
destinationFloor = -1;
destinationPoint = "";
}
}
......
......@@ -2,7 +2,7 @@
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Threading.Tasks;
namespace DeviceLibrary.Service
{
......
......@@ -29,6 +29,7 @@ namespace DeviceLibrary.Service
}
else
{
Log.Info($"AGVLeave接口被调用:{doorInfo}");
Context.LiftContext.AGVLeave(doorInfo,out string msg);
result.msg = msg;
}
......@@ -49,6 +50,7 @@ namespace DeviceLibrary.Service
}
else
{
Log.Info($"AGVCall接口被调用:{doorInfo}");
Context.LiftContext.AGVCall(doorInfo, out string msg);
result.msg = msg;
}
......@@ -69,6 +71,7 @@ namespace DeviceLibrary.Service
}
else
{
Log.Info($"请求接口被调用:{sendInInfo}");
bool idle= Context.LiftContext.RequestSendIn(sendInInfo,out string msg);
result.msg = msg;
}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!