Commit 685b768b 张东亮

合并分支 '软件退出后,重启软件继续动作' 到 'master'

跨楼层单电梯单送料任务测试ok

查看合并请求 !2
2 个父辈 3851a2eb 1efab408
正在显示 39 个修改的文件 包含 671 行增加112 行删除
......@@ -64,7 +64,7 @@ namespace AGVControl
{
Invoke(new Action(() =>
{
NodeManager.UpdateDataSource(DgvNode);
NodeManager.UpdateDataSource(DgvNode, curRow, curColum);
}));
}
......@@ -72,7 +72,7 @@ namespace AGVControl
{
Invoke(new Action(() =>
{
NodeManager.UpdateDataSource(DgvNode);
NodeManager.UpdateDataSource(DgvNode, curRow, curColum);
}));
}
......@@ -127,16 +127,17 @@ namespace AGVControl
showTimer.Stop();
NodeManager.UnRegisEvent(Server_NodeChanged, Server_NodeOnline);
}
private int curRow=0, curColum=0;
private void DgvNode_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) return;
int idx = e.RowIndex;
curRow = e.RowIndex;
curColum = e.ColumnIndex;
if (e.ColumnIndex == 0) //调用
{
NodeManager.nodeInfo[idx].IsUse = !NodeManager.nodeInfo[idx].IsUse;
NodeManager.UpdateDataSource(DgvNode);
NodeManager.nodeInfo[curRow].IsUse = !NodeManager.nodeInfo[curRow].IsUse;
NodeManager.UpdateDataSource(DgvNode,curRow,curColum);
}
}
......@@ -190,15 +191,18 @@ namespace AGVControl
LogUtil.logBox = this.richTextBox1;
}
}
int missionCurRow = 0, missionCurColum = 0;
private void dgvInfos_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 5)
{
if (e.RowIndex == -1)
return;
DeviceLibrary.manager.MissionManager.UpdateDataSource(dgvInfos);
}
if (e.RowIndex == -1)
return;
missionCurColum = e.ColumnIndex;
missionCurRow = e.RowIndex;
}
private void dgvInfos_CellContentClick_1(object sender, DataGridViewCellEventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
......
......@@ -103,20 +103,27 @@ namespace AGVControl
LogUtil.info($"取消自动任务,当前运行信息是:{Agv.Msg}");
try
{
if (Agv.CurJob != null && Agv.CurJob.JobParam != null && Agv.CurJob.JobParam.GetMissionInfo() != null)
//Agv.CurJob != null && Agv.CurJob.JobParam != null &&
if ( Agv.CurJob.JobParam.GetMissionInfo() != null)
{
DeviceLibrary.manager.MissionManager.SetMissionState(Agv.CurJob.JobParam.GetMissionInfo().missionId, DeviceLibrary.service.model.MissionState.中止,out string msg);
LogUtil.info($"取消自动任务,当前任务信息是:{Common.JsonHelper.SerializeObject(Agv.CurJob.JobParam.GetMissionInfo())}");
if (MessageBox.Show($"是否删除该任务[{Agv.JobContext.MissionId}]?", "提示", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))
{
DeviceLibrary.manager.MissionManager.SetMissionState(Agv.CurJob.JobParam.GetMissionInfo().missionId, DeviceLibrary.service.model.MissionState.中止, out string msg);
LogUtil.info($"{Agv.Name}取消自动任务,并终止当前任务:{Common.JsonHelper.SerializeObject(Agv.CurJob.JobParam.GetMissionInfo())}");
}
else
{
LogUtil.info($"{Agv.Name}取消自动任务,任务不中止:{Common.JsonHelper.SerializeObject(Agv.CurJob.JobParam.GetMissionInfo())}");
}
}
}
catch { }
Agv.CurJob = null;
//MiR_API.Del_Mission(Agv);
//添加Init任务
AgvTaskManager.AssignMission(Agv, $"{SettingString.Init}");
}
Agv.CurJob = null;
Agv.JobContext = new DeviceLibrary.bean.agv.JobContext();
}
else
{
......
......@@ -7,19 +7,18 @@
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<log4net>
<appender name="AgvServer" type="log4net.Appender.RollingFileAppender">
<file value="logs/AgvServer/AgvServer.log"/>
<appender name="AGVDispatch" type="log4net.Appender.RollingFileAppender">
<file value="logs/AGVDispatch/AGVDispatch.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="30"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<appender name="HttpManager" type="log4net.Appender.RollingFileAppender">
<file value="logs/HttpManager/HttpManager.log"/>
<appender name="AgvServer" type="log4net.Appender.RollingFileAppender">
<file value="logs/AgvServer/AgvServer.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="30"/>
......@@ -29,10 +28,11 @@
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<appender name="AGVDispatch" type="log4net.Appender.RollingFileAppender">
<file value="logs/AGVDispatch/AGVDispatch.log"/>
<appender name="HttpManager" type="log4net.Appender.RollingFileAppender">
<file value="logs/HttpManager/HttpManager.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="30"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
......@@ -86,6 +86,17 @@
<conversionPattern value="%m%n"/>
</layout>
</appender>
<appender name="TcpKPIO" type="log4net.Appender.RollingFileAppender">
<file value="logs/TcpKPIO/TcpKPIO.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="30" />
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m%n"/>
</layout>
</appender>
<logger name="MissionManager">
<level value="info"/>
<appender-ref ref="MissionManager"/>
......@@ -110,9 +121,13 @@
<level value="Info"/>
<appender-ref ref="HttpManager"/>
</logger>
<logger name="AGVDispatch">
<logger name="TcpKPIO">
<level value="fatal"/>
<appender-ref ref="TcpKPIO"/>
</logger>
<root name="AGVDispatch">
<level value="info"/>
<appender-ref ref="AGVDispatch"/>
</logger>
</root>
</log4net>
</configuration>
\ No newline at end of file
......@@ -154,7 +154,36 @@ namespace Common
;
return result;
}
public static string PostWithFormUrlEncoded(string url, string paramData, Encoding encoding)
{
if (paramData != "null" && paramData != null)
{
// LogUtil.debug(LOGGER, "HTTP POST to " + url + " \n\t >> " + paramData);
}
string result = "";
if (url.ToLower().IndexOf("https", System.StringComparison.Ordinal) > -1)
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; });
}
try
{
var wc = new MyWebClient(10000);
if (string.IsNullOrEmpty(wc.Headers["Content-Type"]))
wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
wc.Encoding = encoding;
result = wc.UploadString(url, "POST", paramData);
//LogUtil.info(result);
}
catch (Exception e)
{
LogUtil.error("POST ERROR:" + e.ToString());
}
return result;
}
public static string Get(string url)
{
return Get(url, Encoding.UTF8);
......@@ -176,7 +205,7 @@ namespace Common
}
catch (Exception e)
{
LogUtil.error("HTTP GET ERROR:" +url+ e.Message);
LogUtil.error("HTTP GET ERROR:[" +url+ "]"+e.Message);
}
return "";
}
......
[{"Name":"2号车","MissionId":"P05120220303134542","JobFullName":"DeviceLibrary.bean.job.LineOneToManyJob","JobStep":"SD_Line_OneToMany_04_UpdateLocation","JobParam":{"SrcNode":{"Id":63,"Name":"D11Tail","Type":2,"Workshop":"4D","IP":"","Online":true,"IOState":"","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"D11线尾","WarnMsg":""},"CurTargetNode":{"Id":30,"Name":"T1","Type":2,"Workshop":"4D","IP":"10.85.164.26","Online":true,"IOState":"DI0=0,DI1=0","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"10.85.164.26","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"T1线","WarnMsg":""},"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"T1_TakeShelfOff","AliceName":"T1线的放料点","Guid":"d82ffed1-4d21-11ec-bb1a-94c691a7387d","Type":1,"TypeId":"10.85.199.3"}},{"Name":"17号车","MissionId":"","JobFullName":"DeviceLibrary.ChargeJob","JobStep":"NONE","JobParam":{"SrcNode":{"Id":75,"Name":"3C5EWarehouse","Type":2,"Workshop":"3C","IP":"172.16.15.17","Online":true,"IOState":"DI0=0,DI1=0","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"172.16.15.17","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"3C5E库房","WarnMsg":""},"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"AutoCharge_3C","AliceName":"3C充电位","Guid":"e4def119-88de-11ec-b8f1-0001297a28c0","Type":0,"TypeId":null}},{"Name":"207号车","MissionId":"","JobFullName":"DeviceLibrary.ChargeJob","JobStep":"CHARGE_WAIT_REACH_CHARGE","JobParam":{"SrcNode":{"Id":16,"Name":"4DPCBAWarehouse","Type":2,"Workshop":"1F","IP":"","Online":true,"IOState":"","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"PCBA库房","WarnMsg":""},"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"AutoCharge_1F","AliceName":"1F充电位","Guid":"f5ba94d1-8fcb-11ec-8251-00012977e167","Type":0,"TypeId":null}},{"Name":"205号车","MissionId":"","JobFullName":"","JobStep":"","JobParam":{"SrcNode":null,"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"","AliceName":null,"Guid":null,"Type":0,"TypeId":null}},{"Name":"201号车","MissionId":"","JobFullName":"","JobStep":"","JobParam":{"SrcNode":null,"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"","AliceName":null,"Guid":null,"Type":0,"TypeId":null}}]
\ No newline at end of file
[{"Name":"2号车","MissionId":"P05120220303134542","JobFullName":"DeviceLibrary.bean.job.LineOneToManyJob","JobStep":"SD_Line_OneToMany_04_UpdateLocation","JobParam":{"SrcNode":{"Id":63,"Name":"D11Tail","Type":2,"Workshop":"4D","IP":"","Online":true,"IOState":"","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"D11线尾","WarnMsg":""},"CurTargetNode":{"Id":30,"Name":"T1","Type":2,"Workshop":"4D","IP":"10.85.164.26","Online":true,"IOState":"DI0=0,DI1=0","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"10.85.164.26","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"T1线","WarnMsg":""},"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"T1_TakeShelfOff","AliceName":"T1线的放料点","Guid":"d82ffed1-4d21-11ec-bb1a-94c691a7387d","Type":1,"TypeId":"10.85.199.3"}},{"Name":"17号车","MissionId":"","JobFullName":"DeviceLibrary.ChargeJob","JobStep":"NONE","JobParam":{"SrcNode":{"Id":75,"Name":"3C5EWarehouse","Type":2,"Workshop":"3C","IP":"172.16.15.17","Online":true,"IOState":"DI0=0,DI1=0","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"172.16.15.17","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"3C5E库房","WarnMsg":""},"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"TakeShelfOff","AliceName":"卸下料车","Guid":"f76a06cc-4e0f-11ec-9e66-54b2038d1924","Type":3,"TypeId":"10.85.199.140"}},{"Name":"207号车","MissionId":"","JobFullName":"DeviceLibrary.ChargeJob","JobStep":"CHARGE_WAIT_REACH_CHARGE","JobParam":{"SrcNode":{"Id":16,"Name":"4DPCBAWarehouse","Type":2,"Workshop":"1F","IP":"","Online":true,"IOState":"","IsUse":true,"nodeStatus":0,"ExtendEquip":{"IP":"","ButtonConfirmSig":false,"ApiConfirmSig":false,"CanConfirm":true},"RFID":"00","ClientLevel":0,"AliceName":"PCBA库房","WarnMsg":""},"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"AutoCharge_1F","AliceName":"1F充电位","Guid":"f5ba94d1-8fcb-11ec-8251-00012977e167","Type":0,"TypeId":null}},{"Name":"205号车","MissionId":"","JobFullName":"","JobStep":"","JobParam":{"SrcNode":null,"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"","AliceName":null,"Guid":null,"Type":0,"TypeId":null}},{"Name":"201号车","MissionId":"","JobFullName":"","JobStep":"","JobParam":{"SrcNode":null,"CurTargetNode":null,"TargetNodes":[],"Shelf":null,"OpType":2},"AgvTask":{"Id":-1,"Name":"","AliceName":null,"Guid":null,"Type":0,"TypeId":null}}]
\ No newline at end of file
[]
\ No newline at end of file
[{"missionId":"P05120220303134542","liftName":null,"canMerge":false,"State":7,"sourceWorkshop":"4D","sourceFloor":4,"destinationFloor":4,"sourcePoint":"D11Tail","destinationWorkshop":"4D","destinationPoint":"T1","needBack":true,"projectType":5,"Remark":null,"JobName":"[4D->4D 半成品领用任务]"}]
\ No newline at end of file
......@@ -73,7 +73,7 @@ namespace DeviceLibrary.manager
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(File_AgvInfo);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.
string strPath = string.Format("/agvs/agv[@id=\"{0}\"]", agv.ID);
string strPath = string.Format("/agvs/agv[@ip=\"{0}\"]", agv.IP);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
//selectXe.SetAttribute("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());//也可以通过SetAttribute来增加一个属性
selectXe.GetElementsByTagName("Auto").Item(0).InnerText = agv.Auto.ToString();
......
<?xml version="1.0" encoding="utf-8"?>
<agvs>
<agv id="20" ip="10.85.199.68">
<name>2号车</name>
<!--职责范围-->
<Scope>
<Workshop>4D</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运
-->
<Tasks>
<Task>PCB领用</Task>
<Task>半成品领用</Task>
<Task>Tray领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_D2</Remark>
</Scope>
<!--是否自动-->
<Auto>True</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.3</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<!-- <agv id="7" ip="10.85.199.73"> -->
<!-- <name>7号车</name> -->
<!-- <!--职责范围--> -->
<!-- <Scope> -->
<!-- <Workshop>4D</Workshop> -->
<!-- <!--可执行的任务: -->
<!-- 无, -->
<!-- PCB领用 = 1, -->
<!-- Tray领用 = 2, -->
<!-- 包材领用 = 4, -->
<!-- 半成品领用, -->
<!-- 静电箱领用, -->
<!-- 空台车领用, -->
<!-- 空台车归还, -->
<!-- 成品入库, -->
<!-- 半成品入库, -->
<!-- 半成品入库与领用, -->
<!-- 垃圾清运 -->
<!-- --> -->
<!-- <Tasks> -->
<!-- <Task>PCB领用</Task> -->
<!-- <Task>半成品领用</Task> -->
<!-- <Task>Tray领用</Task> -->
<!-- </Tasks> -->
<!-- <!--使用的电梯,多个电梯使用逗号隔开--> -->
<!-- <Remark>LIFT_D2</Remark> -->
<!-- </Scope> -->
<!-- <!--是否自动--> -->
<!-- <Auto>False</Auto> -->
<!-- <UseFleet>false</UseFleet> -->
<!-- <FleetIp>10.85.199.3</FleetIp> -->
<!-- <Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization> -->
<!-- <IO_GUIDs> -->
<!-- <IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID> -->
<!-- </IO_GUIDs> -->
<!-- </agv> -->
<agv id="4" ip="10.85.199.64">
<name>17号车</name>
<!--职责范围-->
<Scope>
<Workshop>3C</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运
-->
<Tasks>
<Task>包材领用</Task>
<Task>半成品领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_C1</Remark>
</Scope>
<!--是否自动-->
<Auto>True</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.140</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="132" ip="10.85.199.132">
<name>207号车</name>
<!--职责范围-->
<Scope>
<Workshop>1F</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运
-->
<Tasks>
<Task>包材领用</Task>
<Task>半成品领用</Task>
<Task>Tray领用</Task>
<Task>静电箱领用</Task>
<Task>PCB领用</Task>
<Task>空台车领用</Task>
<Task>空台车归还</Task>
<Task>成品入库</Task>
<Task>半成品入库</Task>
<Task>半成品入库与领用</Task>
<Task>垃圾清运</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_C1,LIFT_D2</Remark>
</Scope>
<!--是否自动-->
<Auto>False</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.132</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="19" ip="10.85.199.19">
<name>205号车</name>
<!--职责范围-->
<Scope>
<Workshop>3D</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运
-->
<Tasks>
<Task>PCB领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_D2</Remark>
</Scope>
<!--是否自动-->
<Auto>False</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.140</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="27" ip="10.85.199.27">
<name>201号车</name>
<!--职责范围-->
<Scope>
<Workshop>4C</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运
-->
<Tasks>
<Task>PCB领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_C1</Remark>
</Scope>
<!--是否自动-->
<Auto>False</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.3</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
</agvs>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<agvs>
<agv id="20" ip="192.168.101.75">
<agv id="20" ip="10.85.199.68">
<name>2号车</name>
<!--职责范围-->
<Scope>
......@@ -22,12 +22,13 @@
<Tasks>
<Task>PCB领用</Task>
<Task>半成品领用</Task>
<Task>Tray领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_D2</Remark>
</Scope>
<!--是否自动-->
<Auto>False</Auto>
<Auto>True</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.3</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
......@@ -35,11 +36,11 @@
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="7" ip="10.85.199.73">
<name>7号车</name>
<agv id="4" ip="10.85.199.64">
<name>17号车</name>
<!--职责范围-->
<Scope>
<Workshop>4D</Workshop>
<Workshop>3C</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
......@@ -55,23 +56,67 @@
垃圾清运
-->
<Tasks>
<Task>PCB领用</Task>
<Task>包材领用</Task>
<Task>半成品领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_D2</Remark>
<Remark>LIFT_C1</Remark>
</Scope>
<!--是否自动-->
<Auto>False</Auto>
<UseFleet>true</UseFleet>
<FleetIp>10.85.199.3</FleetIp>
<Auto>True</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.140</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="17" ip="10.85.199.64">
<name>17号车</name>
<agv id="132" ip="10.85.199.132">
<name>207号车</name>
<!--职责范围-->
<Scope>
<Workshop>1F</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运
-->
<Tasks>
<Task>包材领用</Task>
<Task>半成品领用</Task>
<Task>Tray领用</Task>
<Task>静电箱领用</Task>
<Task>PCB领用</Task>
<Task>空台车领用</Task>
<Task>空台车归还</Task>
<Task>成品入库</Task>
<Task>半成品入库</Task>
<Task>半成品入库与领用</Task>
<Task>垃圾清运</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_C1,LIFT_D2</Remark>
</Scope>
<!--是否自动-->
<Auto>True</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.132</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="19" ip="10.85.199.19">
<name>205号车</name>
<!--职责范围-->
<Scope>
<Workshop>3D</Workshop>
......@@ -91,18 +136,86 @@
-->
<Tasks>
<Task>PCB领用</Task>
<Task>半成品领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_D2</Remark>
</Scope>
<!--是否自动-->
<Auto>False</Auto>
<UseFleet>true</UseFleet>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.140</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="27" ip="10.85.199.27">
<name>201号车</name>
<!--职责范围-->
<Scope>
<Workshop>4C</Workshop>
<!--可执行的任务:
无,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运
-->
<Tasks>
<Task>PCB领用</Task>
</Tasks>
<!--使用的电梯,多个电梯使用逗号隔开-->
<Remark>LIFT_C1</Remark>
</Scope>
<!--是否自动-->
<Auto>False</Auto>
<UseFleet>false</UseFleet>
<FleetIp>10.85.199.3</FleetIp>
<Authorization>Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==</Authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
<agv id="7" ip="10.85.199.73">
<name>7号车</name>
<!-- 职责范围 -->
<scope>
<workshop>4d</workshop>
<!--可执行的任务:
无,
pcb领用 = 1,
tray领用 = 2,
包材领用 = 4,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运 -->
<tasks>
<task>pcb领用</task>
<task>半成品领用</task>
<task>tray领用</task>
</tasks>
<!-- 使用的电梯,多个电梯使用逗号隔开 -->
<remark>lift_d2</remark>
</scope>
<!-- 是否自动 -->
<auto>false</auto>
<usefleet>false</usefleet>
<fleetip>10.85.199.3</fleetip>
<authorization>basic zglzdhjpynv0b3i6njjmmmywzjflzmyxmgqzmtuyyzk1zjzmmdu5nju3nmu0odjiyjhlndq4mdy0mznmngnmoti5nzkyodm0yjaxna==</authorization>
<IO_GUIDs>
<IO_GUID index="0">6ad07e3a-e0e9-11eb-a184-0001299981d4</IO_GUID>
</IO_GUIDs>
</agv>
</agvs>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!--最小充电电量,小于该电量将不会执行任务-->
<min>20</min>
<!--空闲车辆需要充电的电量-->
<mid>50</mid>
<!--充电完成电量-->
<max>90</max>
<piles>
<pile id ="0">
<!--名称-->
<name>AutoCharge1</name>
<!--别名-->
<alicename>充电位1</alicename>
<guid>40c17cb4-e2f2-11eb-8a99-94c691a7387d</guid>
<!--固定充电桩-->
<fixed>true</fixed>
<!--固定充电桩为true,取第一个;false则判断所有agv.填写AGV编号-->
<agvs>
<agv>20</agv>
</agvs>
</pile>
</piles>
</root>
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!--最小充电电量,小于该电量将不会执行任务-->
<min>20</min>
<!--空闲车辆需要充电的电量-->
<mid>50</mid>
<!--充电完成电量-->
<max>90</max>
<max>95</max>
<piles>
<pile id ="0">
<!--名称-->
<name>AutoCharge1</name>
<name>AutoCharge2</name>
<!--别名-->
<alicename>充电位1</alicename>
<guid>40c17cb4-e2f2-11eb-8a99-94c691a7387d</guid>
<alicename>充电位2</alicename>
<guid>d756f63d-2886-11ea-a0d6-94c691a734f1</guid>
<!--固定充电桩-->
<fixed>true</fixed>
<!--固定充电桩为true,取第一个;false则判断所有agv.填写AGV编号-->
......@@ -20,5 +20,31 @@
<agv>10.85.199.68</agv>
</agvs>
</pile>
<pile id ="1">
<!--名称-->
<name>AutoCharge_3C</name>
<!--别名-->
<alicename>3C充电位</alicename>
<guid>e4def119-88de-11ec-b8f1-0001297a28c0</guid>
<!--固定充电桩-->
<fixed>true</fixed>
<!--固定充电桩为true,取第一个;false则判断所有agv.填写AGV编号-->
<agvs>
<agv>10.85.199.64</agv>
</agvs>
</pile>
<pile id ="2">
<!--名称-->
<name>AutoCharge_1F</name>
<!--别名-->
<alicename>1F充电位</alicename>
<guid>f5ba94d1-8fcb-11ec-8251-00012977e167</guid>
<!--固定充电桩-->
<fixed>true</fixed>
<!--固定充电桩为true,取第一个;false则判断所有agv.填写AGV编号-->
<agvs>
<agv>10.85.199.132</agv>
</agvs>
</pile>
</piles>
</root>
......@@ -24,13 +24,14 @@ namespace DeviceLibrary
if (!value.Equals(msg))
{
AGVManager.SaveAgvContextInfo(step.ToString());
LogUtil.info(string.Format("[{0}]{1}",step,value));
LogUtil.info(string.Format("RunMsg:[{0}][{1}]{2}",Agv,step,value));
}
}
msg = value;
}
}
public string Agv = "";
public RunInfo StepRunInfo = new RunInfo();
public DateTime startTime = DateTime.Now;
......@@ -67,7 +68,15 @@ namespace DeviceLibrary
}
return false;
}
public bool IsTimeOut(double timeOutSeconds)
{
TimeSpan span = DateTime.Now - startTime;
if (span.TotalSeconds > timeOutSeconds)
{
return true;
}
return false;
}
/// <summary>
/// 进入下一个步骤
/// </summary>
......
......@@ -204,7 +204,7 @@ namespace DeviceLibrary
}
public override string ToString()
{
return string.Format("[Name={0},AliceName={1},Workshop={2}]", Name,AliceName,Workshop);
return string.Format("[Name={0},AliceName={1},Workshop={2}]", Name, AliceName, Workshop);
}
/// <summary>
/// 脱机
......@@ -250,6 +250,7 @@ namespace DeviceLibrary
public class ExtendEquip
{
public string IP { get; set; }
private bool buttonConfirmSig = false;
/// <summary>
/// 确认按钮
/// </summary>
......@@ -263,12 +264,13 @@ namespace DeviceLibrary
return false;
else
{
bool rtn= IOManager.GetDI(IP, 0);
if (rtn)
IOManager.WriteDO(IP, 0, 1);
if (buttonConfirmSig)
return true;
else
IOManager.WriteDO(IP,0,0);
return rtn;
{
buttonConfirmSig = GetIO();
return buttonConfirmSig;
}
}
}
......@@ -278,6 +280,22 @@ namespace DeviceLibrary
//}
}
}
private bool GetIO()
{
bool rtn = IOManager.GetDI(IP, 0);
if (rtn)
{
Common.LogUtil.info($"线体按钮确认[{IP}]");
System.Threading.Tasks.Task.Factory.StartNew(delegate
{
IOManager.WriteDO(IP, 0, 1);
System.Threading.Thread.Sleep(5000);
IOManager.WriteDO(IP, 0, 0);
});
}
return rtn;
}
/// <summary>
/// Api确认
/// </summary>
......@@ -319,7 +337,9 @@ namespace DeviceLibrary
public void Reset()
{
apiconfirmSig = false;
buttonConfirmSig = false;
IOManager.WriteDO(IP, 0, 0);
Common.LogUtil.info($"线体按钮状态重置[{IP}]");
}
}
/// <summary>
......
......@@ -248,7 +248,7 @@ namespace DeviceLibrary
Place = new Node();
Msg = "";
Position = new MirPosition();
RunInfos = new List<string>() { "状态", "目的地", "RFID", "负载", "运行模式", "任务信息", "AGV运行信息" };
RunInfos = new List<string>() { "状态", "目的地", "车间", "负载", "运行模式", "任务信息", "AGV运行信息" };
StateKanban = new AGV_UI.Status(name, RunInfos);
}
public AgvInfo()
......@@ -256,7 +256,7 @@ namespace DeviceLibrary
Place = new Node();
Msg = "";
Position = new MirPosition();
RunInfos = new List<string>() { "状态", "目的地", "RFID", "负载", "运行模式", "任务信息", "AGV运行信息" };
RunInfos = new List<string>() { "状态", "目的地", "车间", "顶升", "运行模式", "任务信息", "AGV运行信息" };
StateKanban = new AGV_UI.Status(RunInfos);
IOStatus = new List<IOInfo>();
TaskRunState = new TaskRunState();
......@@ -271,7 +271,7 @@ namespace DeviceLibrary
{
bool isChange = false;
bool preShelfState = IsExistShelf;
bool reachIoValue = GetInput(0, 3).Equals(true);
bool reachIoValue = GetInput(0, 0).Equals(true);
if (reachIoValue)
{
//满足给定的IO值,计算持续时间
......@@ -317,7 +317,7 @@ namespace DeviceLibrary
if (!IsExistShelf.Equals(preShelfState))
{
StateKanban.ShowInfo("负载", IsExistShelf ? "满载" : "空载");
StateKanban.ShowInfo("顶升", IsExistShelf ? "上升" : "下降");
}
......@@ -336,8 +336,8 @@ namespace DeviceLibrary
{
StateKanban.ShowInfo("目的地", Place == null ? "" : Place.AliceName);
StateKanban.ShowInfo("运行模式", Auto ? "自动" : "手动");
if (CurJob != null && CurJob.JobParam.Shelf != null)
StateKanban.ShowInfo("RFID", CurJob.JobParam.Shelf.RFID);
if (Scope!=null)
StateKanban.ShowInfo("车间", Scope.Workshop);
if (this.CurJob != null)
{
Msg = this.CurJob.runInfo;
......
......@@ -51,7 +51,7 @@ namespace DeviceLibrary.bean.job
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftToStore_02_01_WaitLiftDoorOpen))
{
if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().sourceFloor))
{
JobRunStep.ToNextStep(RunStep.S1F_LiftToStore_02_02_EnterLift);
runInfo = $"{JobParam.SrcNode.AliceName}门已开启,去取料点";
......@@ -68,7 +68,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.S1F_LiftToStore_03_PutShelfOn);
runInfo = $"到达{JobParam.SrcNode.AliceName}取料点,开始取料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, SettingString.PutShelfOn);
AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.SrcNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_LiftToStore_03_PutShelfOn))
......
......@@ -37,7 +37,7 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_01_ToStore);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}的取料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.已分配, out string msg);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
JobRunStep.Msg = runInfo;
......@@ -47,6 +47,8 @@ namespace DeviceLibrary
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_02_PutShelfOn);
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
//上报状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
......@@ -82,6 +84,8 @@ namespace DeviceLibrary
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{JobParam.CurTargetNode.Name}"));
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯并等待开门";
JobRunStep.Msg = runInfo;
//开始请求电梯
......@@ -113,11 +117,11 @@ namespace DeviceLibrary
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
}
}
else if (!lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
else if (JobRunStep.IsTimeOut(5) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus);
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(),agv);
System.Threading.Thread.Sleep(2000);
}
}
#region 电梯内有料车
......@@ -158,7 +162,7 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_05_PutShelfOn);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的取料点,准备拾取料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.PutShelfOn}");
AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_05_PutShelfOn))
......@@ -166,7 +170,7 @@ namespace DeviceLibrary
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_06_LeaveLift);
runInfo = $"拾取{JobParam.CurTargetNode.AliceName}的料车完成,准备离开";
runInfo = $"拾取{JobParam.CurTargetNode.AliceName}的料车完成,准备离开电梯";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
}
......@@ -281,7 +285,7 @@ namespace DeviceLibrary
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_06_02_TakeShelfOffAtLift);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,准备卸下料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
AllocateTask(agv, $"{SettingString.TakeShelfOff}_{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_06_02_TakeShelfOffAtLift))
......@@ -309,6 +313,8 @@ namespace DeviceLibrary
//AGV离开
bool rtn= lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
runInfo = $"任务结束:离开{JobParam.CurTargetNode.AliceName}完成并发送离开信号:{rtn}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯运行, out string msg);
JobRunStep.Msg = runInfo;
}
}
......
......@@ -41,7 +41,6 @@ namespace DeviceLibrary
public Job Execute(AgvInfo agv)
{
SetRunInfo(agv);
return Run(agv);
}
public abstract Job Run(AgvInfo agv);
......@@ -51,6 +50,7 @@ namespace DeviceLibrary
/// <param name="agv"></param>
public void SetRunInfo(AgvInfo agv)
{
JobRunStep.Agv = agv.Name;
JobRunStep.StepRunInfo.SetInfo(agv.Name.PadLeft(4, '0'), JobName, agv.Place.AliceName, JobRunStep.CurStep(), runInfo, StartJobTime, DateTime.Now);
TaskStateInfo = agv.TaskRunState.ToTaskInfo();
//FixInfo = JobParam.FixMissionInfo != null ? JobParam.FixMissionInfo.ToTxt():"";
......
......@@ -26,7 +26,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.SD_Line_OneToMany_01_ToPickUpPosition);
runInfo = $"任务开始,去{JobParam.SrcNode.AliceName}的取料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.已分配, out string msg);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
JobRunStep.Msg = runInfo;
}
......@@ -35,6 +35,8 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_Line_OneToMany_02_PutShelfOn);
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
runInfo = $"到达{JobParam.SrcNode.AliceName}的取料点,准备拾取料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.PutShelfOn}");
......
......@@ -26,7 +26,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.ToNextStep(RunStep.SD_LineToLine_01_ToPickUpPosition);
runInfo = $"{JobName}开始:去{JobParam.SrcNode.AliceName}的取料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.已分配, out string msg);
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
JobRunStep.Msg = runInfo;
}
......@@ -35,6 +35,8 @@ namespace DeviceLibrary.bean.job
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LineToLine_02_PutShelfOn);
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
//上报运输状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
......
......@@ -50,7 +50,7 @@ namespace DeviceLibrary
}
else if (JobRunStep.IsStep(RunStep.STANDBY_WAIT_REACH_STANDBY))
{
//if (agv.TaskRunState.CheckTaskFinished(agv.Name))
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.END);
// runInfo = "到达待机位";
......
......@@ -16,7 +16,7 @@ namespace DeviceLibrary.bean.jobType
{
if(agv.Scope.Floor.Equals(1) && agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetReceiveMission(agv);
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1ReceiveMission(agv);
if(missionInfo!=null)
{
Node src = manager.NodeManager.GetNode(liftname, NodeType.Lift);
......
......@@ -15,13 +15,23 @@ namespace DeviceLibrary.bean.jobType
{
if (!agv.IsIdle())
return null;
else if(agv.Scope.Floor.Equals(1))
else if (agv.Scope.Floor.Equals(1))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetDeliverMission(agv,out string liftname);
if(missionInfo!=null)
{
Node src = manager.NodeManager.GetNode(missionInfo.sourcePoint, NodeType.Node);
Node dest = manager.NodeManager.GetNode(liftname, NodeType.Lift);
if (src == null)
{
Common.LogUtil.error($"无法生成任务,起始点不存在:{missionInfo.sourcePoint}");
return null;
}
if (dest == null)
{
Common.LogUtil.error($"无法生成任务,电梯不存在:{liftname}");
return null;
}
JobParam jobParam = new JobParam(src, dest, null, missionInfo);
return new F1StoreToLiftJob(jobParam);
}
......
......@@ -23,6 +23,7 @@ namespace DeviceLibrary.bean.jobType
Type type = Type.GetType(agv.JobContext.JobFullName); // 通过类名获取同名类
Job job = (Job)System.Activator.CreateInstance(type);
job.JobParam= agv.JobContext.JobParam;
job.JobParam.CurTargetNode = manager.NodeManager.GetNodeByName(agv.JobContext.JobParam.CurTargetNode.Name);
job.JobParam.SetMissionInfo(missionInfo);
job.Task = agv.JobContext.AgvTask;
job.JobRunStep.ToNextStep((RunStep)Enum.Parse(typeof(RunStep), agv.JobContext.JobStep));
......
......@@ -61,6 +61,7 @@ namespace DeviceLibrary.lift
}
info = new service.model.SendInInfo()
{
liftId = missionInfo.liftName,
destinationFloor = missionInfo.sourceFloor,
destinationPoint = missionInfo.sourcePoint,
destinationClient = destclient,
......@@ -80,6 +81,7 @@ namespace DeviceLibrary.lift
}
info = new service.model.SendInInfo()
{
liftId = missionInfo.liftName,
sourceClient = agvInfo.Client,
sourceFloor = missionInfo.sourceFloor,
sourcePoint = missionInfo.sourcePoint,
......@@ -98,7 +100,7 @@ namespace DeviceLibrary.lift
/// </summary>
/// <param name="liftId"></param>
/// <param name="agvInfo"></param>
/// <returns></returns>
/// <returns></returns>
public static bool AGVLeave(string liftId, AgvInfo agvInfo)
{
bool rtn = HttpManager.AGVLeave(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor });
......
......@@ -79,10 +79,10 @@ namespace DeviceLibrary
/// <param name="liftId"></param>
/// <param name="client"></param>
/// <returns></returns>
public static bool GetsysClientBy(int floor,string liftId,out string client)
public static bool GetsysClientBy(int floor, string liftId, out string client)
{
client = "";
AgvInfo agv = agvInfo.Find(s=>s.Scope.Floor.Equals(floor)&& s.Scope.Remark.Split(',').Contains(liftId));
AgvInfo agv = agvInfo.Find(s => s.Scope.Floor.Equals(floor) && s.Scope.Remark.Split(',').Contains(liftId));
if (agv == null)
return false;
else
......@@ -106,7 +106,7 @@ namespace DeviceLibrary
public static void SaveAgvContextInfo(string step)
{
string filePath = CONFIG_PATH + AppConfigHelper.GetValue(SettingString.FileName_AgvContext);
if(Monitor.TryEnter(writeobj,500))
if (Monitor.TryEnter(writeobj, 500))
{
try
{
......@@ -126,7 +126,7 @@ namespace DeviceLibrary
File.Delete(filePath);
}
File.WriteAllText(filePath, json);
LogUtil.info("保存Agv上下文信息到[" + filePath + $"]:{json}");
LogUtil.debug("保存Agv上下文信息到[" + filePath + $"]:{json}");
}
catch (Exception ex)
{
......@@ -139,26 +139,26 @@ namespace DeviceLibrary
}
else
{
LogUtil.error("SaveAgvContextInfo timeout:"+step);
LogUtil.error("SaveAgvContextInfo timeout:" + step);
}
}
static void ReadAgvContextInfo(List<AgvInfo> agvInfos)
static void ReadAgvContextInfo(List<AgvInfo> agvInfos)
{
string filePath = CONFIG_PATH + AppConfigHelper.GetValue(SettingString.FileName_AgvContext);
List<JobContext> agvs =new List<JobContext>();
List<JobContext> agvs = new List<JobContext>();
try
{
string json = "";
bool configchanged = false;
if (File.Exists(filePath))
{
json=File.ReadAllText(filePath);
if(!string.IsNullOrEmpty(json))
json = File.ReadAllText(filePath);
if (!string.IsNullOrEmpty(json))
{
agvs = JsonHelper.DeserializeJsonToList<JobContext>(json);
if(agvs ==null)
if (agvs == null)
{
return;
}
......@@ -174,7 +174,7 @@ namespace DeviceLibrary
break;
}
}
if(!configchanged)
if (!configchanged)
{
bean.jobType.RecoveryJobType recoveryJobType = new RecoveryJobType();
foreach (AgvInfo agv in agvInfos)
......@@ -184,9 +184,13 @@ namespace DeviceLibrary
{
agv.SetJobContext(info);
agv.CurJob = recoveryJobType.GetNewJob(agv);
if (agv.CurJob != null && (agv.CurJob is StandyJob || agv.CurJob is ChargeJob))
{
agv.CurJob = null;
}
}
}
LogUtil.info("读取并使用Agv上下文信息[" + filePath + "]:"+json);
LogUtil.info("读取并使用Agv上下文信息[" + filePath + "]:" + json);
}
}
}
......
......@@ -25,7 +25,7 @@ namespace DeviceLibrary
ping.Dispose();
if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
{
log.Error(name + " Ping " + ip + " 请求没有响应");
//log.Error(name + " Ping " + ip + " 请求没有响应");
return false;
}
return true;
......@@ -297,14 +297,14 @@ namespace DeviceLibrary
}
else
{
if (data.code.Equals(0))
if (data.code.Equals(0) && data.msg.ToLower().Equals("ok"))
{
log.Info($"RequestSendIn info:{JsonHelper.SerializeObject(send)},result:code={data.code},msg={data.msg},data={data.data}");
log.Info($"请求电梯成功:{JsonHelper.SerializeObject(send)},result:code={data.code},msg={data.msg},data={data.data}");
return true;
}
else
{
log.Error($"RequestSendIn info:{JsonHelper.SerializeObject(send)},result:code={data.code},msg={data.msg},data={data.data}");
log.Debug($"请求电梯失败:{JsonHelper.SerializeObject(send)},result:code={data.code},msg={data.msg},data={data.data}");
return false;
}
}
......@@ -348,17 +348,19 @@ namespace DeviceLibrary
{
try
{
//string resultStr = HttpHelper.Post(agvreportstate, txt);
Dictionary<string, string> param = new Dictionary<string, string>();
param.Add("info", txt);
string addr = GetItsAddr("/UpdateAgvtransinfo", param);
string resultStr = HttpHelper.Get(addr);
//Dictionary<string, string> param = new Dictionary<string, string>();
//param.Add("info", txt);
//string addr = GetItsAddr("/UpdateAgvtransinfo", param);
// string resultStr = HttpHelper.Get(addr);
string resultStr = HttpHelper.PostWithFormUrlEncoded(agvreportstate,$"info={txt}",System.Text.Encoding.UTF8);
itsData data = JsonHelper.DeserializeJsonToObject<itsData>(resultStr);
//fbackkinfo":"no agvinfo","fbacktime":"20215306105317"}
//if (data == null)
{
Agvtransinfo = $"{agvreportstate}:[{txt}]\r\n[{resultStr}]";
}
log.Debug($"[{agvreportstate}]【{txt}】");
//else
//{
// Agvtransinfo = $"{agvreportstate}:[{txt}][{resultStr}]";
......
......@@ -62,6 +62,7 @@ namespace DeviceLibrary.manager
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = MissionInfos.ToList<MissionInfo>();
dataGridView.DataSource = bindingSource;
dataGridView.Refresh();
}
public static bool IsOpen()
{
......@@ -146,7 +147,7 @@ namespace DeviceLibrary.manager
}
/// <summary>
/// 获取送料任务,以准备执行
/// 获取送料任务,以准备执行 F1StoreToLiftJobType
/// </summary>
/// <param name="missionType"></param>
/// <returns></returns>
......@@ -163,9 +164,11 @@ namespace DeviceLibrary.manager
if (missionInfo != null)
{
liftname = GetLiftName(missionInfo);
SetMissionState(missionInfo, MissionState.接料);
if (liftname.Equals(""))
{
return null;
}
Log.Info($"执行任务[{agv.Name}][起始地] {JsonHelper.SerializeObject(missionInfo)}");
WriteMission();
}
}
}
......@@ -194,7 +197,38 @@ namespace DeviceLibrary.manager
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
(s.State >= MissionState.前往电梯 && s.State <= MissionState.电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
(s.State >= MissionState.到达电梯 && s.State <= MissionState.电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
if (missionInfo != null)
{
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
}
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
}
MissionChangedEvent?.Invoke();
return missionInfo;
}
/// <summary>
/// 获取1楼接收料任务,以准备执行
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public static MissionInfo GetF1ReceiveMission(AgvInfo agv)
{
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.State >= MissionState.返回到达电梯内 && s.State <= MissionState.返回电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
if (missionInfo != null)
{
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
......@@ -356,7 +390,7 @@ namespace DeviceLibrary.manager
public static void SetMissionState(MissionInfo missionInfo,MissionState missionState)
{
missionInfo.SetState(missionState);
Log.Info($"设置任务[{missionInfo.missionId}] 状态为{missionState}成功");
Log.Info($"设置任务[{missionInfo.missionId}] 状态为[{missionState}]成功");
}
/// <summary>
/// 任务能否被删除
......@@ -381,6 +415,23 @@ namespace DeviceLibrary.manager
{
switch (missionInfo.projectType)
{
case ProjectType.治具领用:
if (missionInfo.sourceWorkshop.StartsWith("1"))
{
if (missionInfo.destinationWorkshop.Equals(SettingString._3D))
{
liftname = SettingString.LIFT_D2;
}
else if (missionInfo.destinationWorkshop.Equals(SettingString._4C))
{
liftname = SettingString.LIFT_C1;
}
else if (missionInfo.destinationWorkshop.Equals(SettingString._4D))
{
liftname = SettingString.LIFT_D2;
}
}
break;
case ProjectType.PCB领用:
if (missionInfo.sourceWorkshop.StartsWith("1"))
{
......@@ -478,7 +529,7 @@ namespace DeviceLibrary.manager
LogUtil.error("GetLiftName:" + missionInfo.missionId, e);
}
missionInfo.liftName = liftname;
return "";
return liftname;
}
}
}
......@@ -75,7 +75,7 @@ namespace DeviceLibrary.manager
//}
}
public static void UpdateDataSource(DataGridView dataGridView)
public static void UpdateDataSource(DataGridView dataGridView,int curRow=0,int curColum=0)
{
BindingSource bindingSource = new BindingSource();
foreach (Node node in NodeManager.nodeInfo)
......@@ -85,6 +85,12 @@ namespace DeviceLibrary.manager
bindingSource.Add(node);
}
dataGridView.DataSource = bindingSource;
if(dataGridView.Rows.Count>=curRow
&& dataGridView.Columns.Count>=curColum)
{
dataGridView.CurrentCell = dataGridView.Rows[curRow].Cells[curColum]; ;
}
dataGridView.Refresh();
}
public static Node GetNodeById(int id)
{
......
......@@ -45,7 +45,7 @@ namespace DeviceLibrary
{
MissionManager.SetMissionState(createMissionInfo.missionId, MissionState.创建, out string msg);
MissionManager.Add(createMissionInfo);
Log.Info($"Create mission from API:{s}");
Log.Info($"创建任务成功:{s}");
}
else
......
......@@ -138,6 +138,7 @@ namespace DeviceLibrary.service.model
/// 创建
/// </summary>
创建,
已分配,
/// <summary>
/// 接料
/// </summary>
......@@ -194,10 +195,11 @@ namespace DeviceLibrary.service.model
/// </summary>
public enum ProjectType
{
,
PCB领用 = 1,
Tray领用 = 2,
包材领用 = 4,
=0,
PCB领用,
Tray领用,
治具领用,
包材领用,
半成品领用,
静电箱领用,
空台车领用,
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!