Commit afe4d84f 张东亮

1222

1 个父辈 3fbe1f2e
......@@ -8,10 +8,11 @@
<OutputType>WinExe</OutputType>
<RootNamespace>AGV_3D_Line</RootNamespace>
<AssemblyName>AGV-3D-Line</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
......@@ -75,11 +76,20 @@
<Compile Include="FrmMain.Designer.cs">
<DependentUpon>FrmMain.cs</DependentUpon>
</Compile>
<Compile Include="Manual.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Manual.designer.cs">
<DependentUpon>Manual.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="FrmMain.resx">
<DependentUpon>FrmMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Manual.resx">
<DependentUpon>Manual.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
......@@ -107,6 +117,19 @@
<ItemGroup>
<Content Include="line.ico" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<ProjectReference Include="..\AGV_UI\AGV_UI.csproj">
<Project>{c6d2fc09-46f7-4ec5-a877-15ea06342e4f}</Project>
<Name>AGV_UI</Name>
</ProjectReference>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{bafeafe6-04e2-48ee-8845-bfc7ea3e3c21}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\DeviceLibrary\DeviceLibrary.csproj">
<Project>{f9619f07-15f1-4e59-a383-3871952bbb79}</Project>
<Name>DeviceLibrary</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<log4net>
<appender name="AgvServer" type="log4net.Appender.RollingFileAppender">
......@@ -21,17 +21,17 @@
<file value="logs/UnlockInfo.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="10" />
<param name="MaxSizeRollBackups" value="10"/>
<!-- 切割最多文件数 -->
<param name="MaximumFileSize" value="100MB" />
<param name="MaximumFileSize" value="100MB"/>
<!-- 每个文件的大小 -->
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<param name="RollingStyle" value="Size"/>
<param name="StaticLogFileName" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date]%-5p %m%n"/>
</layout>
</appender>
<logger name ="LineWebService">
<logger name="LineWebService">
<level value="Info"/>
<appender-ref ref="LineWebService"/>
</logger>
......@@ -41,14 +41,14 @@
</root>
</log4net>
<appSettings>
<add key="ITS" value="http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIGetBoxDestInfo?boxRFID=" />
<add key="WebService" value="http://127.0.0.1/BenQMIR/Webservice/AGVService.asmx/" />
<add key="http.server" value="http://10.85.199.25/myproject/" />
<add key="FLEET" value="10.85.199.3" />
<add key="AutoCharge" value="True" />
<add key="ChargeWait" value="1" />
<add key="ChargeThreshold" value="20,90" />
<add key="IP_4D_Light" value="10.85.196.40:8088" />
<add key="IP_4C_Light" value="10.85.197.40:8088" />
<add key="ITS" value="http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIGetBoxDestInfo?boxRFID="/>
<add key="WebService" value="http://127.0.0.1/BenQMIR/Webservice/AGVService.asmx/"/>
<add key="http.server" value="http://10.85.199.25/myproject/"/>
<add key="FLEET" value="10.85.199.3"/>
<add key="AutoCharge" value="True"/>
<add key="ChargeWait" value="1"/>
<add key="ChargeThreshold" value="20,90"/>
<add key="IP_4D_Light" value="10.85.196.40:8088"/>
<add key="IP_4C_Light" value="10.85.197.40:8088"/>
</appSettings>
</configuration>
\ No newline at end of file
</configuration>
......@@ -117,39 +117,6 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="Column1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column2.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column4.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column14.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column21.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column3.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column18.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column23.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column13.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column19.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column11.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column6.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
......@@ -174,6 +141,22 @@
<metadata name="Column16.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="label12.Text" xml:space="preserve">
<value>说明:
·小车/任务状态:
Wait=已发送任务,还未获取到最新状态
Executing=正在执行任务
None=空闲状态
Done=任务完成
Aborted=任务中止
Unknown=软件获取小车状态失败
·获取接驳台RFID:获取指定产线上的料架RFID信息
·物料状态上报:上报料车的产线信息
·清除接驳台RFID:清理指定产线的RFID信息
·清理料架的缓存信息:输入RFID,清除RFID的缓存信息,使料架可以复用
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
......
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DeviceLibrary;
using Common;
namespace AGVControl
{
public partial class Manual : Form
{
public Manual(Agv_Info agv)
{
InitializeComponent();
Agv = agv;
chkBxAuto.Checked = agv.IsUse;
btnReSendTask.Enabled = agv.IsUse;
btnAssignTask.Enabled = !agv.IsUse;
}
Agv_Info Agv;
private bool isIni = false;
private void Manual_Load(object sender, EventArgs e)
{
lblInfo.Text = string.Format("[{0}]", Agv.IP);
foreach (Mission mission in MissionSys.Missions)
{
cmbBxMission.Items.Add(mission.AliceName);
}
cmbBxMission.SelectedIndex = 0;
isIni = true;
}
private void chkBxAuto_CheckedChanged(object sender, EventArgs e)
{
if (!isIni) return;
this.Invoke(new Action(() =>
{
btnReSendTask.Enabled = chkBxAuto.Checked;
btnAssignTask.Enabled = !chkBxAuto.Checked;
Agv.IsUse = chkBxAuto.Checked;
if (!chkBxAuto.Checked)
{
Agv.CurJob = null;
//AGVManager.Standby.DelOccupyInfo(Agv);
AGVManager.Charge.DelOccupyInfo(Agv);
//添加Init任务
MissionSys.AssignMission(Agv, SettingString.Init);
if (Agv.Place.Equals(SettingString.Standby) || Agv.Place.Equals(SettingString.AutoCharge))
Agv.Place = "";
}
else
{
if (Agv.IsExistShelf)
{
LogUtil.error(string.Format("{0} 车上有负载,无法开启自动模式,请先清空小车负载!", Agv.Name));
return;
}
Agv.CurJob = null;
MiR_API.Del_Mission_Fleet(Agv, Agv.CurTaskID.ToString());
MiR_API.Del_Mission(Agv);
Agv.RFID = "";
}
}));
}
private void btnReSendTask_Click(object sender, EventArgs e)
{
if (Agv.IsCon)
{
if (MessageBox.Show("确定对小车重发任务?", Agv.Name, MessageBoxButtons.YesNo) == DialogResult.No)
return;
Agv.Resend();
LogUtil.info(string.Format("{0} 手动重发任务", Agv.Name));
}
}
private void btnReady_Click(object sender, EventArgs e)
{
if (Agv.IsCon)
{
MiR_API.State_Ready(Agv);
LogUtil.info(string.Format("{0} 手动点击运行", Agv.Name));
}
}
private void btnPause_Click(object sender, EventArgs e)
{
if (Agv.IsCon)
{
MiR_API.State_Pause(Agv);
LogUtil.info(string.Format("{0} 手动点击暂停", Agv.Name));
}
}
private void btnClearErr_Click(object sender, EventArgs e)
{
if (Agv.IsCon)
{
MiR_API.Clear_Error(Agv);
LogUtil.info(string.Format("{0} 手动点击清除按钮", Agv.Name));
}
}
private void btnAssignTask_Click(object sender, EventArgs e)
{
if (Agv.IsCon)
{
//Agv.AssignTask(CommonVar.showNameMissionName[cmbBxMission.SelectedItem.ToString()]);
LogUtil.info(string.Format("{0} 手动发任务 {1}", Agv.Name, cmbBxMission.SelectedItem.ToString()));
}
}
private void btnExit_Click(object sender, EventArgs e)
{
Close();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAMAQAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD/J75P/ye9d/8nvXf/J713/ye9d/8nvXf/J713/ye9d/8nvXf/J713/ye9d/8n
vXf/J713/ye+TgAAAAD/LKwu/yyuaAAAAAAAAAAAAAAAAAAAAAD/LK1d/y2ud/8trnf/LK9cAAAAAAAA
AAAAAAAAAAAAAP8ur2n/LbAt/y2lEf8zn6D/M6Cm/zOfiP8zn4j/M5+I/zWiPwAAAAAAAAAA/zWiP/8z
n4j/M5+I/zOfiP8zoKb/M5+g/y2lEQAAAAD/OJNA/zeUcP85kqb/OJKI/ziSiP84koj/OJKI/ziSiP84
koj/OJKI/ziSiP85kqb/N5Rw/ziTQAAAAAAAAAAA/0CDQP9AhHD/QINAAAAAAAAAAAD/P4FB/0CDkP9A
grT/QINn/0OFFwAAAAD/QINA/0CEcP9Ag0AAAAAAAAAAAP9IdED/R3Rw/0h0QAAAAAAAAAAA/0Z2kf9F
dTD/QnAy/0V1Vf9FdHIAAAAA/0h0QP9HdHD/SHRAAAAAAAAAAAD/TGhA/0tmcP9MaEAAAAAA/01nav9N
aEz/Y3qx/3mM6f9LZDP/TGe1AAAAAP9MaED/S2Zw/0xoQAAAAAAAAAAA/1RYQP9UV3D/VFhAAAAAAP9R
Vy//Ulif/2lfa/9rYbX/UFUw/1NakQAAAAD/VFhA/1RXcP9UWEAAAAAAAAAAAP9YTED/V0tw/1hMQAAA
AAD/gIAC/1lJp/9YS53/V0lJ/1dKlf9XSUYAAAAA/1hMQP9XS3D/WExAAAAAAAAAAAD/YDxA/106bv9d
PkIAAAAAAAAAAAAAAAD/Xj4x/188bgAAAAAAAAAAAAAAAP9dPkL/XTpu/2A8QAAAAAAAAAAA/2IrL/9l
LXL/ZC94/2MviP9jL4j/Yy+I/2MviP9jL4j/Yy+I/2MviP9jL4j/ZS13/2Utcv9kLC4AAAAAAAAAAAAA
AAD/bCFc/2sgiP9rIIj/ayCI/2sgiP9rIIj/ayCI/2sgiP9rIIj/ayCI/2sgiP9sH1oAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA//8AAP//AAD//wAA//8AAIPBAADgBwAA/n8AAP3/AAD+XwAA/V8AAPy/AAD//wAA8A8AAOAH
AAD//wAA//8AAA==
</value>
</data>
</root>
\ No newline at end of file
using BLL;
using log4net.Config;
using log4net.Config;
using log4net.Util.TypeConverters;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common;
using System.Windows.Forms;
using DeviceLibrary;
namespace AGVControl
{
static class Program
......@@ -35,107 +34,42 @@ namespace AGVControl
if (process.MainModule.FileName == current.MainModule.FileName)
{
//显示已打开的程序
API.ShowWindow(process.MainWindowHandle, API.SW_RESTORE);
API.SwitchToThisWindow(process.MainWindowHandle, true);
Window_API.ShowWindow(process.MainWindowHandle, Window_API.SW_RESTORE);
Window_API.SwitchToThisWindow(process.MainWindowHandle, true);
return;
}
}
//Common.logTextBox = new TextBox();
//Common.missionView = new DataGridView();
Common.log = log4net.LogManager.GetLogger("AgvServer");
Common.log.Info("=====程序开始=====");
ReadConfig();
//Common.ReadUnlockLineInfo();
Common.mir = new MiR_API();
Common.control = new BLL.Control();
LogUtil.info("=====程序开始=====");
AGVManager.Init();
AGVManager.control = new DeviceLibrary.Control();
//获取节点位置
Common.GetNodesPosition();
Common.control.Start();
Common.server = new AgvServer();
Common.server.Start();
Common.web = new WebService();
Common.web.Open(Common.appConfig.AppSettings.Settings["WebService"].Value);
AGVManager.GetNodesPosition();
AGVManager.control.Start();
AGVManager.server = new AgvServer();
AGVManager.server.Start();
AGVManager.web = new WebService();
AGVManager.web.Open(AppConfigHelper.GetValue("WebService"));
Application.Run(new FrmMain());
Common.control.Stop();
Common.server.Stop();
Common.web.Close();
Common.log.Info("=====程序结束=====\r\n");
AGVManager.control.Stop();
AGVManager.server.Stop();
AGVManager.web.Close();
LogUtil.info("=====程序结束=====\r\n");
}
private static void ReadConfig()
{
string path;
string[] line;
string[] temp;
bool isuse;
string rfid = "";
Common.appConfig = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
Common.agvInfo = new List<Agv_Info>();
path = Common.CONFIG_PATH + SettingString.FileName_AGV;
line = System.IO.File.ReadAllLines(path, Encoding.UTF8);
for (int i = 1; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 5) continue;
//string val = Common.appConfig.AppSettings.Settings[temp[1]].Value;
bool.TryParse(Common.ReadIni(temp[1], SettingString.IsUse), out isuse); //Convert.ToBoolean(val.Split(',')[0]);
rfid = Common.ReadIni(temp[1], SettingString.RFID); //val.Split(',')[1];
Common.agvInfo.Add(new Agv_Info(temp[0], temp[1], temp[2], temp[3], temp[4], isuse, rfid));
}
Common.agvMission = new Dictionary<string, string>();
Common.showNameMissionName = new Dictionary<string, string>();
path = Common.CONFIG_PATH + SettingString.FileName_AgvMission;
line = System.IO.File.ReadAllLines(path, Encoding.UTF8);
for (int i = 1; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 3) continue;
Common.agvMission.Add(temp[1], temp[2]);
Common.showNameMissionName.Add(temp[0], temp[1]);
}
Common.nodeInfo = new List<ClientNode>();
path = Common.CONFIG_PATH + SettingString.FileName_AgvProductionLine;
line = System.IO.File.ReadAllLines(path, Encoding.GetEncoding("gb2312"));
for (int i = 1; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 6) continue;
Boolean.TryParse(Common.ReadIni(temp[1], SettingString.IsUse), out bool isUse);
Int32.TryParse(Common.ReadIni(temp[1], SettingString.EmptyShelfCnt), out int emptyShelfCnt);
if (temp[1].Equals("A5"))
{
Common.nodeInfo.Add(new DoubleLineNodeFor4C(temp[1], temp[2], temp[3], temp[0], temp[4], temp[5], isUse, emptyShelfCnt));
}
else if (temp[1].Equals("A6"))
{
Common.nodeInfo.Add(new DoubleLineNodeFor4D(temp[1], temp[2], temp[3], temp[0], temp[4], temp[5], isUse, emptyShelfCnt));
}
else
Common.nodeInfo.Add(new ClientNode(temp[1], temp[2], temp[3], temp[0], temp[4], temp[5], isUse, emptyShelfCnt));
}
Common.chargeStatus = new ChargeStatus();
Common.itsHttp = Common.appConfig.AppSettings.Settings["ITS"].Value;
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Common.log.Error("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
LogUtil.error("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Common.log.Error("Application_ThreadException", e.Exception);
LogUtil.error("Application_ThreadException", e.Exception);
}
}
......
......@@ -38,7 +38,7 @@ namespace AGV_UI
{
foreach (string item in missionShow.Keys)
{
ShowInfo(item, item);
ShowInfo(item, "");
}
SetTitle();
}
......
......@@ -20,6 +20,7 @@ namespace Common
public const string AutoCharge = "AutoCharge";
public const string Leave = "Leave";
public const string Enter = "Enter";
public const string Init = "Init";
//任务状态
public const string Wait = "Wait";
public const string Done = "Done";
......
......@@ -24,33 +24,12 @@ namespace DeviceLibrary
/// </summary>
public int BatteryMin { get; set; } = 20;
/// <summary>
/// 自动充电
/// </summary>
private bool _autoCharge = true;
/// <summary>
/// 自动充电
/// </summary>
public bool AutoCharge
{
set
{
_autoCharge = value;
AppConfigHelper.SaveValue(SettingString.AutoCharge, value);
}
get
{
return _autoCharge;
}
}
public ChargeManager()
{
Station = new Dictionary<string, string>();
Station.Add(AutoCharge1, "");
Station.Add(AutoCharge2, "");
_autoCharge = AppConfigHelper.GetBoolValue(SettingString.AutoCharge);
string s = AppConfigHelper.GetValue(SettingString.ChargeThreshold);
string[] arr = s.Split(',');
BatteryMin = Convert.ToInt32(arr[0]);
......@@ -75,35 +54,11 @@ namespace DeviceLibrary
private static object loc = new object();
/// <summary>
/// 清除占用信息
/// </summary>
/// <param name="chargeName"></param>
/// <returns></returns>
public bool DelOccupyInfo(string agvName)
{
lock(loc)
{
if (Station.Values.Contains(agvName))
{
foreach (string item in Station.Keys)
{
if (Station[item].Equals(agvName))
{
Station[item] = "";
return true;
}
}
}
}
return false;
}
/// <summary>
/// 清除agv占用信息
/// </summary>
/// <param name="chargeName"></param>
/// <returns></returns>
public void DelOccupyInfoByAGV(Agv_Info agv)
public void DelOccupyInfo(Agv_Info agv)
{
lock(loc)
{
......@@ -112,6 +67,7 @@ namespace DeviceLibrary
if (Station[item].Equals(agv.Name))
{
Station[item] = "";
agv.IsInCharge = false;
break;
}
}
......@@ -132,7 +88,11 @@ namespace DeviceLibrary
}
}
/// <summary>
/// 检查充电桩是否有小车占用
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public bool HasEmptyChargeStation(Agv_Info agv)
{
lock(loc)
......@@ -146,13 +106,6 @@ namespace DeviceLibrary
return true;
}
}
//foreach (string item in Station.Keys)
//{
// if (Station[item].Equals(""))
// {
// return true;
// }
//}
}
return false;
}
......@@ -180,6 +133,8 @@ namespace DeviceLibrary
log = string.Format("{0} {1}", agv.Name, chargeStation);
LogUtil.info(log);
MiR_API.State_Ready(agv);
agv.IsInCharge = true;
return true;
}
else
{
......@@ -187,7 +142,7 @@ namespace DeviceLibrary
log = string.Format("{0} {1}失败", agv.Name, chargeStation);
LogUtil.info(log);
}
return true;
return false;
}
}
......
任务别称,任务名称,任务GUID
移动到VMI出口,MoveA1,eec1eed4-2a04-11ea-9c84-94c691a734f1
移动到VMI入口,MoveA2,f68f18db-2f89-11ea-9ee4-94c691a734f1
移动到包装线入口,MoveA3,979d10eb-2f9d-11ea-9ee4-94c691a734f1
移动到包装线出口,MoveA4,df6d991a-2f9d-11ea-9ee4-94c691a734f1
移动到分盘线出口,MoveA7,71e01c6d-de10-11ea-a3e4-94c691a7387d
移动到分盘线入口,MoveA8,cd0544f8-de10-11ea-a3e4-94c691a7387d
移动到包装仓10-1,MoveB1,86a6ab06-261e-11ea-a30e-94c691a73861
移动到包装仓10-2,MoveB2,55fcfdc5-2623-11ea-a30e-94c691a73861
移动到包装仓11-1,MoveB3,905399c8-2623-11ea-a30e-94c691a73861
移动到包装仓11-2,MoveB4,aa33e13a-2623-11ea-a30e-94c691a73861
移动到包装仓12-2,MoveB5,2cd36cde-2624-11ea-a30e-94c691a73861
移动到包装仓12-1,MoveB6,3e713e8b-2624-11ea-a30e-94c691a73861
停靠到包装仓10-1,DockB1,339d1830-261f-11ea-a30e-94c691a73861
停靠到包装仓10-2,DockB2,a6d6f52a-2624-11ea-a30e-94c691a73861
停靠到包装仓11-1,DockB3,b66f0714-2624-11ea-a30e-94c691a73861
停靠到包装仓11-2,DockB4,d01443f2-2624-11ea-a30e-94c691a73861
停靠到包装仓12-2,DockB5,f50dd02b-2624-11ea-a30e-94c691a73861
停靠到包装仓12-1,DockB6,0e5503f2-2625-11ea-a30e-94c691a73861
移动到料串入口C1,MoveC1,a6e36b4c-2fa0-11ea-9ee4-94c691a734f1
移动到料串出口C2,MoveC2,6c6829de-2624-11ea-a30e-94c691a73861
移动到料串入口C3,MoveC3,3ffe309f-2ae6-11ea-a6cf-94c691a734f1
移动到料串出口C4,MoveC4,2ef71347-2ae7-11ea-a6cf-94c691a734f1
移动到料串入口C5,MoveC5,34ec2f1f-2ae8-11ea-a6cf-94c691a734f1
移动到料串出口C6,MoveC6,52f37677-2f96-11ea-9ee4-94c691a734f1
移动到紧急入料口,MoveC7,bcd0e389-2ab7-11ea-a6cf-94c691a734f1
移动到紧急出料口,MoveC8,8a48301d-2624-11ea-a30e-94c691a73861
移动到点料机D1口,MoveD1,931f7c6c-a97d-11ea-b91f-94c691a7387d
移动到点料机D2口,MoveD2,ae09ca1e-a97f-11ea-b91f-94c691a7387d
移动到点料机D3口,MoveD3,97b77df3-edfb-11ea-a03e-94c691a7387d
移动到点料机D4口,MoveD4,37961cd0-edfd-11ea-a03e-94c691a7387d
移动到退料线入口,MoveG23,5dc60886-ee00-11ea-a03e-94c691a7387d
移动到退料线出口,MoveG24,9a965176-ee00-11ea-a03e-94c691a7387d
移动到待机位,MoveStandby,4eb9641a-3439-11ea-984a-94c691a734f1
移动到充电位1,AutoCharge1,9e1b33c0-2886-11ea-a0d6-94c691a734f1
移动到充电位2,AutoCharge2,d756f63d-2886-11ea-a0d6-94c691a734f1
小车进料,Enter,2eadcb87-239a-11ea-8343-94c691a73861
小车出料,Leave,80943220-239a-11ea-8343-94c691a73861
小车初始化,Init,cd51e039-34eb-11ea-b4fe-94c691a734f1
任务名称,任务别名,目的地,目的地别名,任务GUID
MoveA5,移动到双层线入口,A5,双层线入口,eec1eed4-2a04-11ea-9c84-94c691a734f1
Fleet ID,agv名称,IP,授权码,IOID
1,1号车,10.85.199.67,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,007615a5-2220-11ea-99f2-94c691a73b53
2,2号车,10.85.199.68,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,007615a5-2220-11ea-99f2-94c691a73b53
3,3号车,10.85.199.69,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,007615a5-2220-11ea-99f2-94c691a73b53
4,4号车,10.85.199.70,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,007615a5-2220-11ea-99f2-94c691a73b53
\ No newline at end of file
1,5号车,10.85.199.67,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,007615a5-2220-11ea-99f2-94c691a73b53
2,6号车,10.85.199.68,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,007615a5-2220-11ea-99f2-94c691a73b53
3,7号车,10.85.199.69,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,007615a5-2220-11ea-99f2-94c691a73b53
\ No newline at end of file
节点名,别名,佳世达线名
A1,A1,VMI-A1出口
A2,A2,VMI-A2入口
A7,A7,分盘线-A7出口
A8,A8,分盘线-A8入口
T1_1,T1_1,入料T1入口
T1_2,T1_2,入料T1出口
T2_1,T2_1,入料T2入口
T2_2,T2_2,入料T2出口
T3_1,T3_1,入料T3入口
T3_2,T3_2,入料T3出口
T5_1,T5_1,入料T5入口
T5_2,T5_2,入料T5出口
T4_1,T4_1,紧急料T4入口
T4_2,T4_2,紧急料T4出口
D1,D1,点料机-D1入口
D2,D2,点料机-D2出口
D3,D3,点料机-D3口
D4,D4,点料机-D4口
\ No newline at end of file
产线名,节点名,IP,产线别名,位置名称,位置guid
A5,A5,10.85.162.40,双层线入口(A5),PA5,7ed952c3-b520-11ea-b6ad-00012998f5a0
A6,A6,10.85.162.40,双层线出(A6),PA6,929eb1c2-b520-11ea-b6ad-00012998f5a0
D3,D3,10.85.199.12,3D-S3线,DL3,43855a9b-b365-11ea-a1a5-00012999830e
D4,D4,10.85.199.15,3D-S4线,DL4,73c8b98c-b368-11ea-a1a5-00012999830e
D5,D5,10.85.199.31,3D-S5线,DL5,5436efd7-b432-11ea-a1a5-00012999830e
D6,D6,10.85.199.32,3D-S6线,DL6,6b7710c1-b432-11ea-a1a5-00012999830e
D7,D7,10.85.199.36,3D-S7线,DL6,6b7710c1-b432-11ea-a1a5-00012999830e
D8,D8,10.85.199.37,3D-S8线,DL8,8f039d2e-b432-11ea-a1a5-00012999830e
D9,D9,10.85.199.43,3D-S9线,DL9,9e0b64ab-b432-11ea-a1a5-00012999830e
D10,D10,10.85.199.44,3D-S10线,DL10,aec7da80-b432-11ea-a1a5-00012999830e
D11,D11,10.85.199.14,3D-S11线,DL11,c10984c9-b432-11ea-a1a5-00012999830e
D12,D12,10.85.199.13,3D-S12线,DL12,d6e0b92a-b432-11ea-a1a5-00012999830e
FeederIn,D21,10.85.199.1,3D-备料区入口,FI,1e546c3a-8abe-11ea-ab63-000129922ca6
FeederOut,D22,10.85.199.1,3D-备料区出口,FO,431649a4-8abe-11ea-ab63-000129922ca6
......@@ -140,8 +140,6 @@ namespace DeviceLibrary
{
//上报异常
bool isAlarm = false;
//if (msglist.Count > 0)
// msglist.Clear();
try
{
if (!CheckOnline(i)) continue;
......@@ -149,7 +147,7 @@ namespace DeviceLibrary
MiR_API.Get_Task_State(AGVManager.agvInfo[i].CurTaskID, out string stateStr);
Thread.Sleep(50);
//获取AGV状态
rtn = MiR_API.Get_State(AGVManager.agvInfo[i], out eAGVState stateID, out string stateText, out int battery, out string mission_text, out Agv_Info.clsPosition position);
rtn = MiR_API.Get_State(AGVManager.agvInfo[i], out eAGVState stateID, out string stateText, out int battery, out string mission_text, out Agv_Info.MirPosition position);
Thread.Sleep(50);
if (rtn) change = AGVManager.agvInfo[i].SetState(stateID, stateStr, battery, mission_text, position);
......
......@@ -39,6 +39,7 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceModel.Activation" />
......@@ -64,6 +65,7 @@
<Compile Include="bean\job\jobType\JobForRoomC.cs" />
<Compile Include="bean\job\jobType\JobForRoomD.cs" />
<Compile Include="bean\job\SendFullShelfToLineJob.cs" />
<Compile Include="bean\job\StandyJob.cs" />
<Compile Include="bean\Mission.cs" />
<Compile Include="bean\node\ClientNode.cs" />
<Compile Include="bean\Node.cs" />
......@@ -83,6 +85,7 @@
<Compile Include="ScopeLimit.cs" />
<Compile Include="Shelf.cs" />
<Compile Include="Standby.cs" />
<Compile Include="TCPServer.cs" />
<Compile Include="unlock\LineWebService.cs" />
<Compile Include="unlock\UnlockedShelf.cs" />
<Compile Include="unlock\UnlockMissionManager.cs" />
......
......@@ -16,22 +16,65 @@ namespace DeviceLibrary
/// 任务列表
/// </summary>
public static List<Mission> Missions;
/// <summary>
/// 加载任务列表
/// </summary>
public static void Init()
{
try
{
Missions = new List<Mission>();
string path = AGVManager.CONFIG_PATH + SettingString.FileName_AgvMission;
string[] line = System.IO.File.ReadAllLines(path, Encoding.UTF8);
string[] temp;
for (int i = 1; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 5) continue;
Missions.Add(new Mission(temp[0], temp[1], temp[2], temp[3], temp[4]));
}
LogUtil.info("加载任务成功");
}
catch (Exception ex)
{
LogUtil.error("加载任务失败", ex);
}
}
/// <summary>
/// 根据目的地名获取guid号
/// </summary>
/// <param name="taskName"></param>
/// <returns></returns>
public static string GetMissionGuidByName(string name)
{
Mission mission = Missions.Find(s => s.TargetName.Equals(name));
if (mission != null)
return mission.Guid;
else
LogUtil.error(string.Format("任务目的地{0}不存在,请检查!", name));
return "";
}
/// <summary>
/// 根据任务名获取guid号
/// </summary>
/// <param name="taskName"></param>
/// <returns></returns>
public static string GetMissionGuidByName(string taskName)
public static string GetMissionGuidByTaskName(string taskName)
{
Mission mission = Missions.Find(s => s.Name.Equals(taskName));
return mission.Guid;
if (mission != null)
return mission.Guid;
else
LogUtil.error(string.Format("任务{0}不存在,请检查!", taskName));
return "";
}
/// <summary>
/// 向小车发送任务
/// </summary>
/// <returns></returns>
public static bool AssignMission(Agv_Info agv,string missionName)
public static bool AssignMission(Agv_Info agv, string missionName)
{
bool rtn = false;
string guid = GetMissionGuidByName(missionName);
......@@ -81,7 +124,7 @@ namespace DeviceLibrary
{
MiR_API.Del_Mission(agv);
}
LogUtil.info(string.Format("{0} DelMission [{1}] OK", agv.Name, agv.CurTaskName));
LogUtil.info(string.Format("{0} DelMission [{1}] OK", agv.Name, agv.CurTarName));
}
/// <summary>
......@@ -90,7 +133,7 @@ namespace DeviceLibrary
/// <param name="taskName">任务名称</param>
/// <param name="taskGUID">任务GUID</param>
/// <returns></returns>
public static bool CheckTaskFinished(Agv_Info agv,string taskName, string curTaskState)
public static bool CheckTaskFinished(Agv_Info agv, string taskName, string curTaskState)
{
LogUtil.debug(agv.Name + " 检查当前任务是否结束: " + taskName + " " + curTaskState);
return GetMissionGuidByName(taskName).Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
......
......@@ -6,15 +6,15 @@ using System.Threading.Tasks;
namespace DeviceLibrary
{
public class Standby
public class StandbyManager
{
/// <summary>
/// 待机位
/// </summary>
public List<string> Station;
private const int Station_CNT = 4;
private const int Station_CNT = 3;
public Standby()
public StandbyManager()
{
Station = new List<string>();
Station.AddRange(new string[Station_CNT]);
......
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -41,6 +42,8 @@ namespace DeviceLibrary
/// 是否在线
/// </summary>
public bool IsCon { set; get; }
public bool IsInCharge { get; set; }
/// <summary>
/// 是否可用
/// </summary>
......@@ -52,6 +55,7 @@ namespace DeviceLibrary
if (!value.Equals(_IsUse))
{
_IsUse = value;
AGVManager.WriteIni(Name,SettingString.IsUse,_IsUse.ToString());
}
}
get { return _IsUse; }
......@@ -86,16 +90,16 @@ namespace DeviceLibrary
public string MissionText { set; get; }
public class clsPosition
public class MirPosition
{
public double orientation { get; set; }
public double x { get; set; }
public double y { get; set; }
public float orientation { get; set; }
public PointF Point;
}
/// <summary>
/// 当前位置
/// </summary>
public clsPosition Position;
public MirPosition Position;
/// <summary>
/// 任务内容
......@@ -112,7 +116,7 @@ namespace DeviceLibrary
/// <summary>
/// 使用Fleet发任务
/// </summary>
public bool UseFleet { get; set; } = true;
public bool UseFleet { get; set; } = false;
/// <summary>
/// 当前任务的ID号
/// </summary>
......@@ -120,9 +124,9 @@ namespace DeviceLibrary
public string CurTaskState { get; set; } = "";
/// <summary>
/// 当前任务名称
/// 当前任务目的地名
/// </summary>
public string CurTaskName { get; set; }
public string CurTarName { get; set; }
/// <summary>
/// 当前任务的GUID
......@@ -133,36 +137,6 @@ namespace DeviceLibrary
/// </summary>
public string BoxDestInfo { get; set; } = "";
public string RunInfo()
{
string curJobTaskName = "";
string curJobTaskState = "";
int curJobTaskID = -1;
if (CurJob != null)
{
curJobTaskName = CurJob.CurTaskName;
curJobTaskState = CurJob.CurTaskState;
curJobTaskID = CurJob.CurTaskID;
if (RFID.StartsWith("C"))
{
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态:{4}]{0}当前步骤:{5}{0}执行信息:{6}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);
}
else if (RFID.StartsWith("D"))
{
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}当前步骤:{5}{0}执行信息:{6}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);
}
else
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}当前步骤:{5}{0}执行信息:{6}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);
}
else
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}执行信息:{5}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, MissionText);
}
/// <summary>
/// 任务重发
/// </summary>
......@@ -178,6 +152,7 @@ namespace DeviceLibrary
/// 停在同一处超时
/// </summary>
public bool StandTimeOut { get; set; } = false;
public AGV_UI.Status StateKanban;
public Agv_Info(string id, string name, string ip, string authorization, string ioID, bool isUse, string rfid)
{
ID = id;
......@@ -190,21 +165,24 @@ namespace DeviceLibrary
_IsUse = isUse;
Place = "";
Msg = "";
Position = new Agv_Info.clsPosition();
Position = new MirPosition();
RunInfos = new List<string>() { "目的地", "RFID", "负载", "运行模式", "任务信息", "AGV运行信息" };
StateKanban = new AGV_UI.Status(name, RunInfos);
}
public List<string> RunInfos;
DateTime IoStartTime = DateTime.MaxValue;
int IoLastTime = 5000;
int StandLastTimeMinute = 5;
public DateTime StandStartTime = DateTime.MaxValue;
public bool SetState(eAGVState stateID, string stateText, int battery, string missionText, clsPosition position)
public bool SetState(eAGVState stateID, string stateText, int battery, string missionText, MirPosition position)
{
bool isChange = false;
bool preShelfState = IsExistShelf;
MiR_API.Get_IO_Status(this, out bool[] input, out bool[] output);
if (input != null && input.Length == 4)
{
bool reachIoValue = input[3].Equals(true);//input[2] &&
bool reachIoValue = input[3].Equals(true);
if (reachIoValue)
{
//满足给定的IO值,计算持续时间
......@@ -222,23 +200,55 @@ namespace DeviceLibrary
}
else
{
IsExistShelf = true;
IsExistShelf = false;
}
}
else
{
//重新计时
IoStartTime = DateTime.MinValue;
IsExistShelf = input[3];
IsExistShelf = false;
}
}
if (!StateID.Equals(stateID) || !CurTaskState.Equals(stateText) || !Battery.Equals(battery)
|| !MissionText.Equals(missionText) || !IsExistShelf.Equals(preShelfState))
isChange = true;
StateID = stateID;
CurTaskState = stateText;
Battery = battery;
MissionText = missionText;
if (!CurTaskState.Equals(stateText))
{
CurTaskState = stateText;
StateKanban.SetCurState(stateText);
}
if (!Battery.Equals(battery))
{
Battery = battery;
StateKanban.SetBattery(battery,IsInCharge);
}
//"目的地", "RFID", "负载", "运行模式","任务信息", "AGV运行信息"
if (AGVManager.nodeInfo != null && AGVManager.nodeInfo.Count != 0)
{
ClientNode node = AGVManager.nodeInfo.Find(ss => ss.Name == Place);
if (node != null)
PlaceAliceName = node.AliceName;
else
PlaceAliceName = Place;
}
StateKanban.ShowInfo("目的地", PlaceAliceName);
StateKanban.ShowInfo("RFID", RFID);
if (!IsExistShelf.Equals(preShelfState))
{
StateKanban.ShowInfo("负载", IsExistShelf ? "满载" : "空载");
}
StateKanban.ShowInfo("运行模式", IsUse ? "自动" : "手动");
StateKanban.ShowInfo("任务信息", this.CurJob.RunInfo);
if (!MissionText.Equals(missionText))
{
MissionText = missionText;
StateKanban.ShowInfo("AGV运行信息", missionText);
}
CheckStandTimeOut(position);
return isChange;
}
......@@ -247,12 +257,12 @@ namespace DeviceLibrary
/// 检查小车是否在原地停留超时
/// </summary>
/// <returns></returns>
private void CheckStandTimeOut(clsPosition position)
private void CheckStandTimeOut(MirPosition position)
{
if (IsUse && CurJob != null && !(CurJob is ChargeJob) &&
(!CurTaskName.Contains(SettingString.Standby)))//!CurTaskName.Contains(SettingString.AutoCharge) ||
(!CurTarName.Contains(SettingString.Standby)))//!CurTaskName.Contains(SettingString.AutoCharge) ||
{
if (Math.Abs(position.x - Position.x) < 1 && Math.Abs(position.y - Position.y) < 1)
if (Math.Abs(position.Point.X - Position.Point.X) < 1 && Math.Abs(position.Point.Y- Position.Point.Y) < 1)
{
//满足条件,计算持续时间
if (StandStartTime == DateTime.MaxValue)
......
......@@ -20,9 +20,9 @@ namespace DeviceLibrary
public int CurTaskID { get; set; } = -1;
/// <summary>
/// 当前的任务名称(与任务GUID对应)
/// 当前的任务目的地(与任务GUID对应)
/// </summary>
public string CurTaskName { get; set; } = "";
public string CurTarName { get; set; } = "";
/// <summary>
/// 当前任务的执行状态
/// </summary>
......@@ -36,7 +36,7 @@ namespace DeviceLibrary
protected void UpdateJobTaskInfo(string curTaskName, int curTaskId)
{
CurTaskID = curTaskId;
CurTaskName = curTaskName;
CurTarName = curTaskName;
CurTaskState = MissionSys.GetTakJobState(CurTaskID);
}
/// <summary>
......@@ -50,30 +50,30 @@ namespace DeviceLibrary
{
if (stateStr.Equals(SettingString.Aborted) || stateStr.Equals(SettingString.Invalid))
{
rtn = MissionSys.AssignMission(agv, CurTaskName);
rtn = MissionSys.AssignMission(agv, CurTarName);
if (rtn)
{
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
return true;
}
}
}
else if (!CurTaskName.Equals("") && !MissionSys.GetMissionGuidByName(CurTaskName).Equals(agv.CurTaskGUID))//Job的当前任务与agv最新任务不一致
else if (!CurTarName.Equals("") && !MissionSys.GetMissionGuidByName(CurTarName).Equals(agv.CurTaskGUID))//Job的当前任务与agv最新任务不一致
{
rtn = MissionSys.AssignMission(agv, CurTaskName);
rtn = MissionSys.AssignMission(agv, CurTarName);
if (rtn)
{
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
return true;
}
}
else if (CurTaskID.Equals(-1))//任务发送失败,重新发送
{
rtn = MissionSys.AssignMission(agv, CurTaskName);
rtn = MissionSys.AssignMission(agv, CurTarName);
if (rtn)
{
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
return true;
}
}
......
......@@ -5,6 +5,7 @@ using System.Web.Script.Serialization;
using Common;
using Microsoft.SqlServer.Server;
using RestSharp;
using static DeviceLibrary.Agv_Info;
namespace DeviceLibrary
{
......@@ -86,7 +87,7 @@ namespace DeviceLibrary
}
catch (Exception ex)
{
Common.log.Error("Get_Node_Pos", ex);
log.Error("Get_Node_Pos", ex);
mirPosition = null;
return false;
}
......@@ -224,6 +225,9 @@ namespace DeviceLibrary
{
try
{
info.CurTaskID = -1;
info.CurTaskGUID = "";
info.CurTaskState = SettingString.Wait;
log.Debug(string.Format("{0} Add_Mission [{1}]", info.Name, mission_id));
//删除上一任务
......@@ -254,7 +258,7 @@ namespace DeviceLibrary
catch
{
log.Error(string.Format("{0} Add_Mission [{1}]", info.Name, mission_id));
info.CurTaskName = "";
info.CurTarName = "";
}
return true;
......@@ -312,7 +316,7 @@ namespace DeviceLibrary
catch
{
log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, mission_id));
info.CurTaskName = "";
info.CurTarName = "";
}
return true;
}
......@@ -493,13 +497,13 @@ namespace DeviceLibrary
/// <param name="battery"></param>
/// <param name="mission_text"></param>
/// <returns></returns>
public static bool Get_State(Agv_Info info, out eAGVState stateID, out string stateText, out int battery, out string mission_text, out Agv_Info.clsPosition position)
public static bool Get_State(Agv_Info info, out eAGVState stateID, out string stateText, out int battery, out string mission_text, out MirPosition position)
{
stateID = eAGVState.UNKNOWN;
stateText = "";
battery = 0;
mission_text = "";
position = new Agv_Info.clsPosition();
position = new MirPosition();
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position";
......@@ -528,9 +532,9 @@ namespace DeviceLibrary
battery = Convert.ToInt32(f);
Dictionary<string, object> posDic = (Dictionary<string, object>)dic["position"];
if (posDic == null) return false;
position.orientation = Convert.ToDouble(posDic["orientation"].ToString());
position.x = Convert.ToDouble(posDic["x"]);
position.y = Convert.ToDouble(posDic["y"]);
position.orientation = Convert.ToSingle(posDic["orientation"].ToString());
position.Point.X = Convert.ToSingle(posDic["x"]);
position.Point.Y = Convert.ToSingle(posDic["y"]);
return true;
}
catch (Exception ex)
......
......@@ -22,15 +22,28 @@ namespace DeviceLibrary
/// </summary>
public string TargetName { private set; get; }
/// <summary>
/// 目的地别名(与节点名对应)
/// </summary>
public string TargetAliceName { private set; get; }
/// <summary>
/// 任务guid
/// </summary>
public string Guid { private set; get; }
public Mission(string name,string aliceName,string targetName,string guid)
/// <summary>
/// 任务
/// </summary>
/// <param name="name">任务名称</param>
/// <param name="aliceName">任务别名</param>
/// <param name="targetName">目的地名</param>
/// <param name="targetAliceName">目的地别名</param>
/// <param name="guid">任务guid</param>
public Mission(string name,string aliceName,string targetName,string targetAliceName,string guid)
{
Name = name;
AliceName = aliceName;
TargetName = targetName;
TargetAliceName = targetAliceName;
Guid = guid;
}
}
......
......@@ -28,7 +28,7 @@ namespace DeviceLibrary
/// </summary>
public override string RunInfo
{
get { return string.Format("充电任务:{0} ", runInfo);}
get { return string.Format("充电任务[{0}][{1}]:{2} ", CurTaskID, CurTaskState, runInfo);}
}
private JobStep<CHARGE_STEP> jobStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);
......@@ -53,7 +53,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlace))
{
......@@ -62,7 +62,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{
......@@ -71,7 +71,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -81,7 +81,7 @@ namespace DeviceLibrary
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else
......@@ -94,7 +94,7 @@ namespace DeviceLibrary
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{
......@@ -104,7 +104,7 @@ namespace DeviceLibrary
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -116,7 +116,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -124,7 +124,7 @@ namespace DeviceLibrary
runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "去充电位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -139,7 +139,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (jobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR))
......@@ -153,7 +153,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -165,7 +165,7 @@ namespace DeviceLibrary
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -173,7 +173,7 @@ namespace DeviceLibrary
runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "回到充电位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -181,7 +181,7 @@ namespace DeviceLibrary
}
else if (jobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
{
if (MissionSys.CheckTaskIsOK(agv, CurTaskName,CurTaskState))
if (MissionSys.CheckTaskIsOK(agv, CurTarName,CurTaskState))
{
jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "开始充电任务";
......@@ -199,16 +199,16 @@ namespace DeviceLibrary
runInfo = "电量充足,回待机位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfoByAGV(agv);
AGVManager.Charge.DelOccupyInfo(agv);
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agv.Battery >= AGVManager.Charge.BatteryMin)
{
Job job = AGVManager.control.GetJob(agv);
if (job != null && !(job is ChargeJob))
{
AGVManager.Charge.DelOccupyInfoByAGV(agv);
AGVManager.Charge.DelOccupyInfo(agv);
runInfo = "充电过程检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
......@@ -234,7 +234,7 @@ namespace DeviceLibrary
runInfo = "充电过程中检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfoByAGV(agv);
AGVManager.Charge.DelOccupyInfo(agv);
return job;
}
}
......@@ -261,7 +261,7 @@ namespace DeviceLibrary
runInfo = "在待机位检测到任务,执行任务";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfoByAGV(agv);
AGVManager.Charge.DelOccupyInfo(agv);
return job;
}
else if (job == null && agv.Battery < AGVManager.Charge.BatteryMax / 2)
......@@ -270,7 +270,7 @@ namespace DeviceLibrary
runInfo = "在待机位暂无任务,且当前电量小于" + AGVManager.Charge.BatteryMax / 2 + "%,去充电位";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
AGVManager.Charge.DelOccupyInfoByAGV(agv);
AGVManager.Charge.DelOccupyInfo(agv);
}
}
return this;
......
......@@ -36,7 +36,7 @@ namespace DeviceLibrary
/// </summary>
public override string RunInfo
{
get { return string.Format("返回任务:{0}", runInfo); }
get { return string.Format("返回任务[{0}][{1}]:{2}", CurTaskID,CurTaskState,runInfo); }
}
......@@ -75,7 +75,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{
......@@ -84,7 +84,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -93,7 +93,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -106,7 +106,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{
......@@ -115,7 +115,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -124,7 +124,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -138,7 +138,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{
......@@ -147,7 +147,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -156,7 +156,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -204,7 +204,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (jobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_RoomD_DOOR))
......
......@@ -42,7 +42,7 @@ namespace DeviceLibrary
/// </summary>
public override string RunInfo
{
get { return string.Format("空料架[{0}]返回:{1} ",shelfType.ToString(),runInfo); }
get { return string.Format("空料架[{0}][{1}][{2}]返回:{3} ",shelfType.ToString(), CurTaskID, CurTaskState, runInfo); }
}
......@@ -66,7 +66,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//C车间
{
......@@ -75,7 +75,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -89,7 +89,7 @@ namespace DeviceLibrary
if (!EmptyShelfTargetPlace.Equals(""))
{
MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -100,7 +100,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -114,7 +114,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
......@@ -130,7 +130,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -140,7 +140,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -155,7 +155,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6))
......@@ -176,14 +176,14 @@ namespace DeviceLibrary
ClientNode node = AGVManager.nodeInfo[id];
if (node.StateEquals(eNodeStatus.MayEnter))
{
if (!agv.CurTaskName.Equals(SettingString.Leave))
if (!agv.CurTarName.Equals(SettingString.Leave))
{
jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE);
runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Leave);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -198,7 +198,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE))
......
......@@ -75,7 +75,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Leave);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if(ActionType.Equals(eEnterLeaveType.Enter))
{
......@@ -88,7 +88,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Enter);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (jobStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT_LINE_ReadyEnter_RESPONSE))
......@@ -102,7 +102,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Leave);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (jobStep.IsTimeOut(15000, out double timeOutValue))
{
......@@ -123,7 +123,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Enter);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (jobStep.IsTimeOut(15000, out double timeOutValue))
{
......
......@@ -36,7 +36,7 @@ namespace DeviceLibrary
/// </summary>
public override string RunInfo
{
get { return string.Format("回收空料架[RFID={0}]:{1}",RFID,runInfo); }
get { return string.Format("回收空料架[RFID={0}][{1}][{2}]:{3}",RFID, CurTaskID, CurTaskState, runInfo); }
}
......@@ -60,7 +60,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (!AGVManager.CheckIsInAirDoor(agvPlae) && AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门外->风淋门内
{
......@@ -73,7 +73,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -82,7 +82,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if ((agvPlae.StartsWith(SettingString.RoomD_Name_Prefix) || agvPlae.StartsWith(SettingString.DoubleLine_Name_Prefix) || agvPlae.Equals(SettingString.Standby) ||
......@@ -94,7 +94,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else//起始与目的地在风淋门同一侧
......@@ -108,7 +108,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -129,7 +129,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -146,7 +146,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if ((agvPlae.StartsWith(SettingString.RoomD_Name_Prefix) || agvPlae.StartsWith(SettingString.DoubleLine_Name_Prefix) || agvPlae.Equals(SettingString.Standby) ||
agvPlae.Equals(SettingString.AutoCharge))
......@@ -157,7 +157,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else//4D->4D
......@@ -187,7 +187,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -204,7 +204,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
//都在风淋门内,到达风淋门外
else
......@@ -214,7 +214,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -242,7 +242,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -253,7 +253,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -301,7 +301,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, EmptyShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -366,7 +366,7 @@ namespace DeviceLibrary
agv.RFID = node.RFID;
if (node.StateEquals(eNodeStatus.MayLeave))
{
if (!agv.CurTaskName.Equals("Enter"))
if (!agv.CurTarName.Equals("Enter"))
{
jobStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行" + "[RFID=" + RFID + "]";
......@@ -374,7 +374,7 @@ namespace DeviceLibrary
jobStep.Msg = msg;
//agv.RFID = node.RFID;
MissionSys.AssignMission(agv, SettingString.Enter);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......
......@@ -32,7 +32,7 @@ namespace DeviceLibrary
/// </summary>
public override string RunInfo
{
get { return string.Format("接满料任务:{0}", runInfo); }
get { return string.Format("接满料任务[{0}][{1}]:{2}", CurTaskID, CurTaskState, runInfo); }
}
/// <summary>
......@@ -55,7 +55,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.CheckShelf);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT))
{
......@@ -79,7 +79,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (AGVManager.CheckIsInAirDoor(agvPlace))
{
......@@ -88,7 +88,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))//4C车间
{
......@@ -97,7 +97,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -106,7 +106,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -123,7 +123,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -137,7 +137,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -180,7 +180,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -212,14 +212,14 @@ namespace DeviceLibrary
ClientNode node = AGVManager.nodeInfo[id];
if (node.StateEquals(eNodeStatus.MayLeave))
{
if (!agv.CurTaskName.Equals("Enter"))
if (!agv.CurTarName.Equals("Enter"))
{
jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT__FULL_SHELF_IN_AGV);
runInfo = "收到双层线出料架请求[ReadyLeave]的响应 " + FullShelfStationPlace + "出料架,小车链条运行";
msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Enter);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......
......@@ -40,7 +40,7 @@ namespace DeviceLibrary
/// </summary>
public override string RunInfo
{
get { return string.Format("送满料任务[RFID={0}]:{1}",RFID,runInfo); }
get { return string.Format("送满料任务[RFID={0}][{1}][{2}]:{3}",RFID, CurTaskID, CurTaskState, runInfo); }
}
......@@ -61,7 +61,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -70,7 +70,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -86,7 +86,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
AGVManager.MoveToRoomCStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -97,7 +97,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -106,7 +106,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......@@ -122,7 +122,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE))
......@@ -139,7 +139,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
......@@ -148,7 +148,7 @@ namespace DeviceLibrary
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
}
......@@ -215,14 +215,14 @@ namespace DeviceLibrary
System.Threading.Thread.Sleep(50);
if (node.StateEquals(eNodeStatus.MayEnter))
{
if (!agv.CurTaskName.Equals(SettingString.Leave))
if (!agv.CurTarName.Equals(SettingString.Leave))
{
jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE);
runInfo = "收到产线入料架请求[ReadyEnter]的响应 " + FullShelfPlace + "入料架,小车链条运行";
msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
jobStep.Msg = msg;
MissionSys.AssignMission(agv,SettingString.Leave);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
......
using Common;
namespace DeviceLibrary
{
/// <summary>
/// 待机任务
/// </summary>
public class StandyJob : Job
{
/// <summary>
/// 出完满料后-空车返回任务
/// </summary>
/// <param name="agvPlae">小车当前位置,空表示在待机位</param>
public StandyJob(string agvPlae)
{
this.agvPlace = agvPlae;
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get { return string.Format("待机任务[{0}][{1}]:{2}", CurTaskID, CurTaskState, runInfo); }
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.NONE);
/// <summary>
/// 空车返回执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = "";
CurTaskState = MissionSys.GetTakJobState(CurTaskID);
if (curJobStep.IsStep(EXECUTE_STEP.NONE))
{
if (agvPlace.Equals(SettingString.Standby))//在待机位不操作
{
curJobStep.ToNextStep(EXECUTE_STEP.END);
runInfo = "在待机位,不执行操作";
msg += runInfo;
curJobStep.Msg = msg;
}
else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
{
curJobStep.ToNextStep(EXECUTE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从当前位置" + agvPlace + "回到待机位,先到"+SettingString.RoomD_Name+"门";
msg += runInfo;
curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY);
runInfo = "从当前位置" + agvPlace + "回到待机位";
msg += runInfo;
curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.WAIT_AGV_REACH_4D_DOOR))
{
if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY);
runInfo = "从"+SettingString.RoomD_Name+"门回到待机位";
msg += runInfo;
curJobStep.Msg = msg;
MissionSys.AssignMission(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.WAIT_REACH_STANDBY))
{
if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.END);
runInfo = "到达待机位";
msg += runInfo;
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.END))
{
Job job = AGVManager.control.GetJob(agv);
if (job != null && !(job is StandyJob))
{
runInfo = "在待机位检测到任务,执行任务";
msg += runInfo;
curJobStep.Msg = msg;
return job;
}
}
return this;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
///
/// </summary>
NONE,
/// <summary>
/// 等待到达4D门
/// </summary>
WAIT_AGV_REACH_4D_DOOR,
/// <summary>
/// 等待到达待机位
/// </summary>
WAIT_REACH_STANDBY,
/// <summary>
///
/// </summary>
END
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace DeviceLibrary
{
......@@ -48,7 +44,7 @@ namespace DeviceLibrary
/// <summary>
/// 节点位置坐标
/// </summary>
public PositionStru position;
public PointF Position;
/// <summary>
/// 料架数量信息
/// </summary>
......@@ -56,9 +52,9 @@ namespace DeviceLibrary
{
get
{
if(Common.missionManager !=null && Common.missionManager.GetUnlockInfo(Name) !=null)
if(AGVManager.unlockManager !=null && AGVManager.unlockManager.GetUnlockInfo(Name) !=null)
{
return Common.missionManager.GetUnlockCnt(Name);
return AGVManager.unlockManager.GetUnlockCnt(Name);
}
return 0;
}
......@@ -136,7 +132,7 @@ namespace DeviceLibrary
Online = false;
}
public virtual Job GetNewJob(Agv_Info agv)
public override Job GetNewJob(Agv_Info agv)
{
return null;
}
......
......@@ -3,9 +3,11 @@ using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Common;
using static DeviceLibrary.Agv_Info;
namespace DeviceLibrary
{
......@@ -21,17 +23,85 @@ namespace DeviceLibrary
/// 小车信息
/// </summary>
public static List<Agv_Info> agvInfo;
public static System.Windows.Forms.TextBox logTextBox;
public static System.Windows.Forms.DataGridView missionView;
public static AgvServer server;
public static Control control;
public static WebService web;
public static UnlockMissionManager unlockManager;
public static ChargeManager Charge;
//public static StandbyManager Standby;
public static List<JobType> jobTypes;
public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
/// <summary>
/// 初始化配置
/// </summary>
public static void Init()
{
string path;
string[] line;
string[] temp;
bool isuse;
string rfid = "";
Charge = new ChargeManager();
//Standby = new StandbyManager();
agvInfo = new List<Agv_Info>();
jobTypes = new List<JobType>();
jobTypes.Add(new JobForRoomD());
jobTypes.Add(new ChargeJobType());
path = CONFIG_PATH + SettingString.FileName_AGV;
line = File.ReadAllLines(path, Encoding.UTF8);
for (int i = 1; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 5) continue;
bool.TryParse(ReadIni(temp[1], SettingString.IsUse), out isuse);
rfid = ReadIni(temp[1], SettingString.RFID);
agvInfo.Add(new Agv_Info(temp[0], temp[1], temp[2], temp[3], temp[4], isuse, rfid));
}
//任务加载
MissionSys.Init();
//节点加载
nodeInfo = new List<ClientNode>();
path = CONFIG_PATH + SettingString.FileName_AgvProductionLine;
line = System.IO.File.ReadAllLines(path, Encoding.GetEncoding("gb2312"));
for (int i = 1; i < line.Length; i++)
{
temp = line[i].Split(',');
if (temp.Length != 6) continue;
Boolean.TryParse(ReadIni(temp[1], SettingString.IsUse), out bool isUse);
Int32.TryParse(ReadIni(temp[1], SettingString.EmptyShelfCnt), out int emptyShelfCnt);
nodeInfo.Add(new ClientNode(temp[1], temp[2], temp[3], temp[0], temp[4], temp[5], isUse, emptyShelfCnt));
}
//读取解绑信息
AGVManager.ReadUnlockLineInfo();
}
/// <summary>
/// 读取配置
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string ReadIni(string section, string key)
{
return IniFileHelper.ReadValue(section, key, CONFIG_PATH + SettingString.FileName_tempData);
}
/// <summary>
/// 写入配置
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="value"></param>
public static void WriteIni(string section, string key, string value)
{
IniFileHelper.WriteValue(section, key, value, CONFIG_PATH + SettingString.FileName_tempData);
}
/// <summary>
/// 根据线体名获取节点名
/// </summary>
/// <param name="lineName"></param>
......@@ -679,7 +749,7 @@ namespace DeviceLibrary
return nodeName;
foreach (var item in clientNodes)
{
double dis = Math.Sqrt(Math.Pow((agv.Position.x - item.position.X), 2) + Math.Pow((agv.Position.y - item.position.Y), 2));
double dis = Math.Sqrt(Math.Pow((agv.Position.Point.X - item.Position.X), 2) + Math.Pow((agv.Position.Point.Y - item.Position.Y), 2));
log.Debug(string.Format("{0} 距离{1}={2}", agv.Name, item.Name, dis.ToString("f2")));
if (dis < minDis)
{
......@@ -755,9 +825,9 @@ namespace DeviceLibrary
Thread.Sleep(50);
if (rtn)
{
clientNode.position.X = mirPosition.pos_x;
clientNode.position.Y = mirPosition.pos_y;
log.Debug(string.Format("软件开启:{0} 获取节点位置({1},{2})", clientNode.Name, clientNode.position.X, clientNode.position.Y));
clientNode.Position.X = mirPosition.Point.X;
clientNode.Position.Y = mirPosition.Point.Y;
log.Debug(string.Format("软件开启:{0} 获取节点位置({1},{2})", clientNode.Name, clientNode.Position.X, clientNode.Position.Y));
}
else
{
......
......@@ -2,6 +2,7 @@
using RestSharp;
using System;
using System.Collections.Generic;
using System.Drawing;
namespace DeviceLibrary
{
......@@ -134,9 +135,9 @@ namespace DeviceLibrary
tempLocation = "4CFeederIn";
}
if (Common.GetNodeNameByLineName(tempLocation, out string loc))
if (AGVManager.GetNodeNameByLineName(tempLocation, out string loc))
{
int i = Common.FindNode(loc);
int i = AGVManager.FindNode(loc);
if (i > -1)
{
#region 检查是否有空料架要出,有则先出空料架
......@@ -165,7 +166,7 @@ namespace DeviceLibrary
#endregion
res[0].location = loc;
dest = res[0];
Common.GetLineNameByNodeName(loc, out string line);
AGVManager.GetLineNameByNodeName(loc, out string line);
A6_Target = res[0].ShowInfo(line);
log.Debug("查找满料架任务[RFID=" + rfid + "]:目的地为 " + loc + " [产线名 " + line + "]");
return true;
......@@ -217,7 +218,7 @@ namespace DeviceLibrary
//GET /ESMTCommonInterface/CommonService.asmx/UpdateStatusBy?id=string&location=string HTTP/1.1
//Host: 10.85.17.233
Common.GetLineNameByNodeName(nodeName, out string lineName);
AGVManager.GetLineNameByNodeName(nodeName, out string lineName);
if (lineName.Equals("FeederIn"))
{
lineName = "Feeder";
......@@ -707,25 +708,4 @@ namespace DeviceLibrary
public Dictionary<string, string> data { get; set; }
}
/// <summary>
/// Mir位置
/// </summary>
public class MirPosition
{
/// <summary>
/// 位置名称
/// </summary>
public string name { get; set; }
/// <summary>
/// X轴方位
/// </summary>
public double orientation { set; get; }
/// <summary>
/// x轴
/// </summary>
public double pos_x { get; set; }
public double pos_y { get; set; }
}
}
using System;
using Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
......@@ -25,7 +26,7 @@ namespace DeviceLibrary
UnlockMissions = new Dictionary<string, UnlockInfo>();
foreach (ClientNode item in clientNodes)
{
if (item.Name.StartsWith("A") || item.Name.Equals(SettingString.D4FeederIn) || item.Name.Equals(SettingString.C4FeederIn))
if (item.Name.StartsWith("A") || item.Name.Equals(SettingString.RoomCFeederIn) || item.Name.Equals(SettingString.RoomDFeederIn))
continue;
NodeUnlockMissions.Add(item.Name, new UnlockedShelf());
UnlockMissions = new Dictionary<string, UnlockInfo>();
......@@ -75,12 +76,12 @@ namespace DeviceLibrary
{
UnlockMissions[nodeName] = new UnlockInfo(nodeName, NodeUnlockMissions[nodeName].EmptyCnt, NodeUnlockMissions[nodeName].GetRfidWithTime());
WriteUnlockLineInfo();
Common.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
Common.LogInfo(string.Format("{0}解绑任务添加成功:RFID={1}", nodeName, rfid));
AGVManager.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
LogUtil.info(string.Format("{0}解绑任务添加成功:RFID={1}", nodeName, rfid));
MissionChanged?.Invoke(UnlockMissions);
}
else
Common.LogInfo(string.Format("{0}解绑任务添加失败:RFID={1}", nodeName, rfid));
LogUtil.info(string.Format("{0}解绑任务添加失败:RFID={1}", nodeName, rfid));
return rtn;
}
public bool DelMission(string nodeName, string rfid)
......@@ -90,12 +91,12 @@ namespace DeviceLibrary
{
UnlockMissions[nodeName] = new UnlockInfo(nodeName, NodeUnlockMissions[nodeName].EmptyCnt, NodeUnlockMissions[nodeName].GetRfidWithTime());
WriteUnlockLineInfo();
Common.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
Common.LogInfo(string.Format("{0}解绑任务删除成功:RFID={1}", nodeName, rfid));
AGVManager.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
LogUtil.info(string.Format("{0}解绑任务删除成功:RFID={1}", nodeName, rfid));
MissionChanged?.Invoke(UnlockMissions);
}
else
Common.LogInfo(string.Format("{0}解绑任务删除失败:RFID={1}", nodeName, rfid));
LogUtil.info(string.Format("{0}解绑任务删除失败:RFID={1}", nodeName, rfid));
return rtn;
}
/// <summary>
......@@ -103,7 +104,7 @@ namespace DeviceLibrary
/// </summary>
void WriteUnlockLineInfo()
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(Common.CONFIG_PATH + "UnlockInfo.json"))
using (System.IO.StreamWriter file = new System.IO.StreamWriter(AGVManager.CONFIG_PATH + "UnlockInfo.json"))
{
string s = JsonHelper.SerializeObject(this);
file.WriteLine(s);
......@@ -119,7 +120,7 @@ namespace DeviceLibrary
public List<UnlockRfid> UnlockRfids { get; private set; }
public UnlockInfo(string nodeName, int count, Dictionary<string, string> rfids)
{
if (Common.GetLineNameByNodeName(nodeName, out string line))
if (AGVManager.GetLineNameByNodeName(nodeName, out string line))
{
Line = line;
}
......
......@@ -54,7 +54,7 @@ namespace DeviceLibrary
int tmp = EmptyCnt;
System.Threading.Interlocked.Increment(ref tmp);
EmptyCnt = tmp;
Rfids.Add(rfid, DateTime.Now.ToString("yyyy/MM/dd/HH:mm:ss,fff"));
Rfids.Add(rfid, DateTime.Now.ToString("MM/dd/HH:mm:ss,fff"));
return true;
}
return false;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!