Commit 9d07df69 张东亮

二期初版

1 个父辈 34d4da0b
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="AGVDataContext" connectionString="data source=.\Config\agv.db" providerName="System.Data.SQLite.EF6" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite"
type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/>
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6"
description=".Net Framework Data Provider for SQLite (Entity Framework 6)"
type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<appSettings>
<!--AGV系统标识:NEOTEL-1C,NEOTEL-3D,NEOTEL-3C,NEOTEL-4C,NEOTEL-4D-->
<add key="AppIdentity" value="NEOTEL" />
......@@ -34,6 +61,8 @@
<add key="StandTimeout" value="6" />
<!--Agv上下文信息文件名-->
<add key="FileName_AgvContext" value="AgvContext.json" />
<!--3D放置钢网的地方-->
<add key="SteelShelfPos" value="SteelShelfPos" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
......
......@@ -190,20 +190,10 @@ namespace AGVControl
{
LogUtil.logBox = this.richTextBox1;
}
}
private void button1_Click(object sender, EventArgs e)
this.Invoke(new Action(() =>
{
//try
//{
// string missionId = textBox1.Text.Trim();
// MissionInfo missionInfo = MissionManager.GetMission(missionId);
// if(missionInfo != null)
// {
// MissionManager.DeleteById(missionId);
// }
//}
//catch { }
DeviceLibrary.manager.MissionManager.UpdateDataSource(dgvInfos);
}));
}
private void dgvInfos_CellContentClick(object sender, DataGridViewCellEventArgs e)
......
......@@ -83,12 +83,6 @@ namespace AGVControl
{
if (!chkBxAuto.Checked && !Agv.JobContext.MissionId.Equals(""))
{
//if (MessageBox.Show($"正在执行任务[{Agv.JobContext.MissionId}],切到手动后该任务无法继续执行,确定切到手动状态?", "警告", MessageBoxButtons.YesNo).Equals(
// DialogResult.No))
//{
// chkBxAuto.Checked = true;
// return;
//}
LogUtil.info($"人员切换到手动,{Agv.Name}当前执行的任务为{Agv.JobContext.MissionId}");
}
btnReSendTask.Enabled = chkBxAuto.Checked;
......@@ -98,8 +92,6 @@ namespace AGVControl
{
Agv.Auto = false;
ChargePileManager.StopCharge(Agv);
if (Agv.IsCon)
{
LogUtil.info($"取消自动任务,当前运行信息是:{Agv.Msg}");
try
{
......@@ -110,6 +102,12 @@ namespace AGVControl
{
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())}");
foreach (string item in Agv.Scope.Remark.Split(','))
{
DeviceLibrary.lift.LiftContext.ResetLiftOccupiedAgv(item);
}
Agv.CurJob = null;
Agv.JobContext = new DeviceLibrary.bean.agv.JobContext();
}
else
{
......@@ -117,26 +115,21 @@ namespace AGVControl
}
}
}
catch { }
foreach (string item in Agv.Scope.Remark.Split(','))
catch (Exception ex)
{
DeviceLibrary.lift.LiftContext.ResetLiftOccupiedAgv(item);
LogUtil.error($"切换到手动异常", ex);
}
//MiR_API.Del_Mission(Agv);
//添加Init任务
AgvTaskManager.AssignMission(Agv, $"{SettingString.Init}");
}
Agv.CurJob = null;
Agv.JobContext = new DeviceLibrary.bean.agv.JobContext();
}
else
{
if (Agv.IsExistShelf)
if (Agv.IsExistShelf && Agv.CurJob == null)
{
chkBxAuto.Checked = false;
MessageBox.Show(this, string.Format("{0} 车上有负载,无法开启自动模式,请先清空小车负载!", Agv.Name), "警告");
LogUtil.error(string.Format("{0} 车上有负载,无法开启自动模式,请先清空小车负载!", Agv.Name));
return;
LogUtil.error(string.Format("{0} 车上有料车,开启自动模式!", Agv.Name));
MessageBox.Show($"{Agv.Name}车上有料车,开启自动模式!", "警告");
}
Agv.Auto = true;
}
......
......@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AGVControl-Fixture")]
[assembly: AssemblyTitle("AGVDispatch-Intelligentlogistics")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AGVControl-Fixture")]
[assembly: AssemblyProduct("AGVDispatch-Intelligentlogistics")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
......
......@@ -125,9 +125,9 @@
<level value="fatal"/>
<appender-ref ref="TcpKPIO"/>
</logger>
<root name="AGVDispatch">
<logger name="AGVDispatch">
<level value="info"/>
<appender-ref ref="AGVDispatch"/>
</root>
</logger>
</log4net>
</configuration>
\ No newline at end of file
......@@ -39,7 +39,6 @@ namespace Common
public const string File_AgvInfo = "File_AgvInfo";
public const string File_AgvTaskInfo = "File_AgvTaskInfo";
public const string File_NodeInfo = "File_NodeInfo";
public const string FileName_Missions = "Missions.json";
public const string FileName_AgvContext = "FileName_AgvContext";
public const string IsUse = "IsUse";
public const string RFID = "RFID";
......
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
<remove invariant="System.Data.SQLite" /><add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /></DbProviderFactories>
</system.data>
</configuration>
\ No newline at end of file
......@@ -144,7 +144,7 @@ namespace DeviceLibrary
return null;
if (job != null)
{
log.Debug(agv_Info.Name + " GetJob OK " + job.ToString());
//log.Debug(agv_Info.Name + " GetJob OK " + job.ToString());
return job;
}
}
......@@ -163,7 +163,6 @@ namespace DeviceLibrary
AgvInfo agv = AGVManager.agvInfo[i];
if (!agv.IsCon) continue; //AGV网络连接
if (!AGVManager.agvInfo[i].Auto) continue; //AGV是否可用
//Ready,Pause,Executing,Error
if (AGVManager.agvInfo[i].StateID.Equals(eAGVState.Pause))
{
......
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.props" Condition="Exists('..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
......@@ -12,6 +13,8 @@
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
......@@ -31,6 +34,12 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\AGVDispatch\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
</Reference>
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\AGVDispatch\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\AGVDispatch\packages\log4net.2.0.12\lib\net45\log4net.dll</HintPath>
</Reference>
......@@ -38,9 +47,22 @@
<Reference Include="RestSharp">
<HintPath>.\RestSharp.dll</HintPath>
</Reference>
<Reference Include="SQLite.CodeFirst, Version=1.7.0.34, Culture=neutral, PublicKeyToken=eb96ba0a78d831a7, processorArchitecture=MSIL">
<HintPath>..\AGVDispatch\packages\SQLite.CodeFirst.1.7.0.34\lib\net45\SQLite.CodeFirst.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite, Version=1.0.116.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<HintPath>..\AGVDispatch\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.116.0\lib\net46\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Data.SQLite.EF6, Version=1.0.116.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<HintPath>..\AGVDispatch\packages\System.Data.SQLite.EF6.1.0.116.0\lib\net46\System.Data.SQLite.EF6.dll</HintPath>
</Reference>
<Reference Include="System.Data.SQLite.Linq, Version=1.0.116.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<HintPath>..\AGVDispatch\packages\System.Data.SQLite.Linq.1.0.116.0\lib\net46\System.Data.SQLite.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
......@@ -65,21 +87,25 @@
<Compile Include="bean\agv\Mir_Error.cs" />
<Compile Include="bean\agv\Scope.cs" />
<Compile Include="bean\ChargePiles.cs" />
<Compile Include="bean\jobType\SteelBackLiftToLinesJobType.cs" />
<Compile Include="bean\jobType\F1LiftC1ToLiftD2JobType.cs" />
<Compile Include="bean\jobType\F1LiftD2ToLiftC1JobType.cs" />
<Compile Include="bean\jobType\SteelLineToLiftJobType.cs" />
<Compile Include="bean\jobType\LineToLineJobType.cs" />
<Compile Include="bean\jobType\RecoveryJobType.cs" />
<Compile Include="bean\jobType\LineOneToManyJobType.cs" />
<Compile Include="bean\job\ChargeJob.cs" />
<Compile Include="bean\job\F1LiftC1ToLiftD2Job.cs" />
<Compile Include="bean\job\F1LiftD2ToLiftC1Job.cs" />
<Compile Include="bean\job\SteelLiftToLinesJob.cs" />
<Compile Include="bean\job\LineOneToManyJob.cs" />
<Compile Include="bean\job\SteelLineToLiftJob.cs" />
<Compile Include="bean\job\LineToLineJob.cs" />
<Compile Include="bean\job\LiftToLinesJob.cs" />
<Compile Include="bean\job\F1LiftToStoreJob.cs" />
<Compile Include="bean\job\LineToLiftJob.cs" />
<Compile Include="bean\JobParam.cs" />
<Compile Include="bean\jobType\F1LiftToStoreJobType.cs" />
<Compile Include="bean\jobType\BackLiftToLineJobType.cs" />
<Compile Include="bean\jobType\LineToLiftJobType.cs" />
<Compile Include="bean\TaskRunState.cs" />
<Compile Include="bean\jobType\LiftToLinesJobType.cs" />
......@@ -88,6 +114,8 @@
<Compile Include="bean\Node.cs" />
<Compile Include="bean\RunStep.cs" />
<Compile Include="Control.cs" />
<Compile Include="db\AGVDataContext.cs" />
<Compile Include="db\JobContextInfo.cs" />
<Compile Include="lift\ClientStatus.cs" />
<Compile Include="lift\LiftContext.cs" />
<Compile Include="lift\LiftInfo.cs" />
......@@ -148,7 +176,19 @@
</Content>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
<Error Condition="!Exists('..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
<Error Condition="!Exists('..\AGVDispatch\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.116.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\AGVDispatch\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.116.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets'))" />
</Target>
<Import Project="..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\AGVDispatch\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
<Import Project="..\AGVDispatch\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.116.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\AGVDispatch\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.116.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
</Project>
\ No newline at end of file
......@@ -34,7 +34,10 @@ namespace DeviceLibrary.bean
{
missionInfo = value;
}
/// <summary>
/// 存放钢网料架的节点
/// </summary>
public Node SteelShelfNode { get; set; }
/// <summary>
/// 当前目标地点
/// </summary>
......
......@@ -23,7 +23,6 @@ namespace DeviceLibrary
//不为空,且与上一个消息不一样才打印
if (!value.Equals(msg))
{
AGVManager.SaveAgvContextInfo(step.ToString());
LogUtil.info(string.Format("RunMsg:[{0}][{1}]{2}",Agv,step,value));
}
}
......
......@@ -71,6 +71,9 @@ namespace DeviceLibrary.bean
#region 1F库房到电梯
S1F_StoreToLift_01_ToStore,
S1F_StoreToLift_02_PutShelfOn,
S1F_StoreToLift_ToSteelSrc,
S1F_StoreToLift_PlaySound,
S1F_StoreToLift_WaitConfirm,
S1F_StoreToLift_03_ToLift,
S1F_StoreToLift_04_CheckLiftStatus,
......@@ -172,6 +175,7 @@ namespace DeviceLibrary.bean
/// </summary>
SD_LiftToLine_14_04_CloseLiftDoor,
#endregion
SD_LiftToLine_15_ToSteelShelfOff,
/// <summary>
/// 料车无需返回,直接结束
/// </summary>
......
......@@ -624,6 +624,7 @@ namespace DeviceLibrary
if(!JobContext.Equals(jobContext))
{
JobContext = jobContext;
AGVManager.SaveJobContext(this);
}
}
}
......
......@@ -173,13 +173,31 @@ namespace DeviceLibrary
if (JobParam.GetMissionInfo() != null)
{
service.model.ProjectType type = JobParam.GetMissionInfo().projectType;
if (type.Equals(service.model.ProjectType.空台车领用) || type.Equals(service.model.ProjectType.空台车归还))
if (type.Equals(service.model.ProjectType.台车领用) || type.Equals(service.model.ProjectType.台车归还)||
type.Equals(service.model.ProjectType.厂内PCBA入库_台车)|| type.Equals(service.model.ProjectType.半成品入库_台车)
|| type.Equals(service.model.ProjectType.PCBA半成品领用_台车))
{
return false;
}
}
return true;
}
/// <summary>
/// 是否是指定项目类型
/// </summary>
/// <returns></returns>
protected bool IsProjectType(ProjectType projectType)
{
if (JobParam.GetMissionInfo() != null)
{
service.model.ProjectType type = JobParam.GetMissionInfo().projectType;
if (type.Equals(projectType))
{
return true;
}
}
return false;
}
protected string GetTargetName(Node node)
{
if (JobParam.GetMissionInfo() != null && JobParam.GetMissionInfo().projectType.Equals(ProjectType.Tray领用))
......@@ -214,7 +232,7 @@ namespace DeviceLibrary
/// <param name="missionInfo"></param>
protected void ResetOccupiedAgv(MissionInfo missionInfo)
{
missionInfo.ResetOccupied();
MissionManager.SetLiftOccupiedAgv(missionInfo.missionId, string.Empty);
}
}
}
......
......@@ -45,7 +45,7 @@ namespace DeviceLibrary.bean.job
//上报运输状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{ JobParam.SrcNode.Name }"));
$"到达{JobParam.SrcNode.Name}"));
runInfo = $"到达{JobParam.SrcNode.AliceName},等待门开启";
JobRunStep.Msg = runInfo;
......@@ -124,7 +124,7 @@ namespace DeviceLibrary.bean.job
//上报位置
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{ JobParam.CurTargetNode.Name }"));
$"到达{JobParam.CurTargetNode.Name}"));
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_08_UpdateLocation))
......@@ -152,7 +152,7 @@ namespace DeviceLibrary.bean.job
JobRunStep.Msg = runInfo;
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.agvButton,
$"卸货{ JobParam.CurTargetNode.Name }"));
$"卸货{JobParam.CurTargetNode.Name}"));
//重置确认信息
JobParam.CurTargetNode.ExtendEquip.Reset();
StopSound(agv);
......@@ -162,7 +162,7 @@ namespace DeviceLibrary.bean.job
//报警,$"等待{JobParam.CurTargetNode.AliceName}的人员确认超时{timeoutval}分"
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.agvButton,
$"等待{ JobParam.CurTargetNode.Name }确认超时{timeoutval}分"));
$"等待{JobParam.CurTargetNode.Name}确认超时{timeoutval}分"));
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_10_CheckNextLine))
......@@ -192,10 +192,7 @@ namespace DeviceLibrary.bean.job
else if (JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack)
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_15_TakeShelfOff);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,料车无需返回,准备卸车";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,料车无需返回,准备卸车";
AllocateTask(agv, SettingString.TakeShelfOff);
JobRunStep.Msg = runInfo;
}
......@@ -211,7 +208,7 @@ namespace DeviceLibrary.bean.job
//上报位置
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{ JobParam.SrcNode.Name }"));
$"到达{JobParam.SrcNode.Name}"));
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
System.Threading.Thread.Sleep(1000);
......@@ -361,6 +358,22 @@ namespace DeviceLibrary.bean.job
}
#endregion
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_15_TakeShelfOff))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.END);
runInfo = $"在{JobParam.CurTargetNode.AliceName}卸下料车完成";
JobRunStep.Msg = runInfo;
//任务状态变更
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, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"卸车"));
}
}
else if (JobRunStep.IsStep(RunStep.END))
{
JobRunStep.EndJob();
......
......@@ -68,18 +68,31 @@ namespace DeviceLibrary.bean.job
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
if(NeedConfirm())
{
JobRunStep.ToNextStep(RunStep.SD_LineToLine_04_PlaySound);
//确认按钮生效
JobParam.CurTargetNode.ExtendEquip.AllowConfirm();
//上报运输状态
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 }"));
$"到达{JobParam.CurTargetNode.Name}"));
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
PlaySound(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LineToLine_04_WaitConfirm);
//上报运输状态
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}"));
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
}
}
}
else if (JobRunStep.IsStep(RunStep.SD_LineToLine_04_PlaySound))
{
......@@ -87,6 +100,9 @@ namespace DeviceLibrary.bean.job
{
if (OpManager.WaitConfirm.Line(JobParam.CurTargetNode))
{
JobRunStep.ToNextStep(RunStep.SD_LineToLine_04_WaitConfirm);
runInfo = $"在{JobParam.CurTargetNode.AliceName}确认完成";
JobRunStep.Msg = runInfo;
StopSound(agv);
}
else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
......
using Common;
using DeviceLibrary.manager;
using DeviceLibrary.service.model;
namespace DeviceLibrary.bean.job
{
/// <summary>
/// 钢网,电梯到线体,
/// </summary>
public class SteelLiftToLinesJob : Job
{
/// <summary>
/// 满料车任务
/// </summary>
public SteelLiftToLinesJob(JobParam jobParam) : base(jobParam)
{
}
public SteelLiftToLinesJob() : base()
{
}
lift.LiftStatus liftStatus;
public override Job Run(AgvInfo agv)
{
agv.SetJobContext(new bean.agv.JobContext()
{
MissionId = JobParam.GetMissionInfo().missionId,
AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(),
JobStep = JobRunStep.PreStep(),
Name = agv.Name,
JobParam = JobParam
});
if (JobRunStep.IsStep(RunStep.NONE))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_01_ToLift);
runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
JobRunStep.Msg = runInfo;
AllocateTask(agv, JobParam.SrcNode.Name);
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_01_ToLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_02_WaitLiftDoorOpen);
//上报运输状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{JobParam.SrcNode.Name}"));
runInfo = $"到达{JobParam.SrcNode.AliceName},等待门开启";
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_02_WaitLiftDoorOpen))
{
if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_03_EnterLift);
lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP);
runInfo = $"{JobParam.SrcNode.AliceName}门已开启,进电梯取料点";
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯到达, out string msg);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_03_EnterLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_04_PutShelfOn);
runInfo = $"到达{JobParam.SrcNode.AliceName}取料点,准备拾取料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.SrcNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_04_PutShelfOn))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_05_LeaveLift);
//上报运输状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
$"电梯取车"));
runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,准备离开";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_05_LeaveLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_06_CloseLiftDoor);
//关门
bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false);
runInfo = $"离开{JobParam.SrcNode.AliceName},关闭门:{rtn}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.离开电梯, out string msg);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_06_CloseLiftDoor))
{
if (JobParam.GetMissionInfo()?.projectType.Equals(ProjectType.钢网入库) ?? false)
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_15_ToSteelShelfOff);
runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.SteelShelfNode.AliceName}的放料点";
AllocateTask(agv, $"{GetTargetName(JobParam.SteelShelfNode)}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_ToLine);
runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}的放料点";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.送料, out string msg);
AllocateTask(agv, $"{GetTargetName(JobParam.CurTargetNode)}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_07_ToLine))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
//确认按钮生效
JobParam.CurTargetNode.ExtendEquip.AllowConfirm();
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_08_UpdateLocation);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}";
JobRunStep.Msg = runInfo;
//上报位置
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{JobParam.CurTargetNode.Name}"));
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_08_UpdateLocation))
{
if (NeedConfirm())
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_09_WaitConfirm);
runInfo = $"等待{JobParam.CurTargetNode.AliceName}的人员确认";
JobRunStep.Msg = runInfo;
PlaySound(agv);
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_10_CheckNextLine);
runInfo = $"{JobParam.CurTargetNode.AliceName}无需人员确认";
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_09_WaitConfirm))
{
if (OpManager.WaitConfirm.Line(JobParam.CurTargetNode))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_10_CheckNextLine);
runInfo = $"{JobParam.CurTargetNode.AliceName}的人员确认完成";
JobRunStep.Msg = runInfo;
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.agvButton,
$"卸货{JobParam.CurTargetNode.Name}"));
//重置确认信息
JobParam.CurTargetNode.ExtendEquip.Reset();
StopSound(agv);
}
else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
{
//报警,$"等待{JobParam.CurTargetNode.AliceName}的人员确认超时{timeoutval}分"
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.agvButton,
$"等待{JobParam.CurTargetNode.Name}确认超时{timeoutval}分"));
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_10_CheckNextLine))
{
if (JobParam.TargetNodes != null && JobParam.TargetNodes.Count > 0)
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_ToLine);
JobParam.CurTargetNode = JobParam.TargetNodes[0];
JobParam.TargetNodes.RemoveAt(0);
System.Threading.Thread.Sleep(1000);
runInfo = $"去下一线体{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{GetTargetName(JobParam.CurTargetNode)}_{SettingString.TakeShelfOff}");
}
else
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_15_ToSteelShelfOff);
runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,去{JobParam.SteelShelfNode.AliceName}的放料点";
AllocateTask(agv, $"{GetTargetName(JobParam.SteelShelfNode)}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_15_ToSteelShelfOff))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.SD_LiftToLine_15_TakeShelfOff);
runInfo = $"到达{JobParam.SteelShelfNode.AliceName},准备卸车";
//上报位置
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"到达{JobParam.SteelShelfNode.Name}"));
AllocateTask(agv, SettingString.TakeShelfOff);
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_15_TakeShelfOff))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.END);
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);
}
}
else if (JobRunStep.IsStep(RunStep.END))
{
JobRunStep.EndJob();
return null;
}
return this;
}
}
}
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.manager;
using System;
namespace DeviceLibrary
{
/// <summary>
/// 3D钢网入库 到电梯
/// </summary>
public class SteelLineToLiftJob : Job
{
/// <summary>
/// 1F满架运送任务
/// </summary>
public SteelLineToLiftJob(JobParam jobParam) : base(jobParam)
{
}
public SteelLineToLiftJob() : base()
{
}
lift.LiftStatus liftStatus;
public override Job Run(AgvInfo agv)
{
agv.SetJobContext(new bean.agv.JobContext()
{
MissionId = JobParam.GetMissionInfo().missionId,
AgvTask = agv.TaskRunState.Task,
JobFullName = this.ToString(),
JobStep = JobRunStep.PreStep(),
Name = agv.Name,
JobParam = JobParam
});
if (JobRunStep.IsStep(RunStep.NONE))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_01_ToStore);
runInfo = $"任务开始:去{JobParam.SteelShelfNode.AliceName}的取料点";
AllocateTask(agv, $"{JobParam.SteelShelfNode.Name}_{SettingString.PutShelfOn}");
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_01_ToStore))
{
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,
$"到达{JobParam.SrcNode.Name}"));
runInfo = $"到达{JobParam.SrcNode.AliceName}的取料点,开始拾取料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, SettingString.PutShelfOn);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_02_PutShelfOn))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_ToSteelSrc);
//上报状态
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,
$"取车"));
runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.SrcNode.AliceName}放料点";
AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.TakeShelfOff}");
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_ToSteelSrc))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_PlaySound);
//确认按钮生效
JobParam.SrcNode.ExtendEquip.AllowConfirm();
//上报运输状态
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.SrcNode.Name}"));
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的放料点";
JobRunStep.Msg = runInfo;
PlaySound(agv);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_PlaySound))
{
if (OpManager.WaitConfirm.Line(JobParam.SrcNode))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_WaitConfirm);
runInfo = $"在{JobParam.SrcNode.AliceName}确认完成";
JobRunStep.Msg = runInfo;
//重置确认信息
JobParam.CurTargetNode.ExtendEquip.Reset();
StopSound(agv);
}
else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
{
//报警,$"等待{JobParam.CurTargetNode.AliceName}的人员确认超时{timeoutval}分"
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.agvButton,
$"等待{JobParam.SrcNode.Name}确认超时{timeoutval}分"));
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_WaitConfirm))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_03_ToLift);
runInfo = $"在{JobParam.SrcNode.AliceName}确认完成,去{JobParam.CurTargetNode.AliceName}";
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
AllocateTask(agv, JobParam.CurTargetNode.Name);
JobRunStep.Msg = runInfo;
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_03_ToLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus);
//上报状态
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;
//开始请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus))
{
if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().sourceFloor))
{
if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out liftStatus))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_01_ToTemp1);
lift.LiftContext.SetLiftOccupiedAgv(JobParam.CurTargetNode.Name, agv.IP);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车";
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回电梯到达, out string msg);
}
JobRunStep.Msg = runInfo;
}
else
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_06_01_EnterLift);
runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
}
}
else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus);
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
//上报运输状态
manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
service.model.TransportStatus.TypeStr.error, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
$"等待电梯到达超时"));
}
}
#region 电梯内有料车
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_01_ToTemp1))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_02_TakeShelfOffAtTemp1);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点1,将车上料车卸下";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_02_TakeShelfOffAtTemp1))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_03_ToLift);
runInfo = $"在{JobParam.CurTargetNode.AliceName}将车上料车卸在临时点1完成,去电梯口";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_03_ToLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_04_EnterLift);
runInfo = $"到达{JobParam.CurTargetNode.AliceName},去取料点";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.PutShelfOn}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_04_EnterLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_05_PutShelfOn);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的取料点,准备拾取料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_05_PutShelfOn))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_06_LeaveLift);
runInfo = $"拾取{JobParam.CurTargetNode.AliceName}的料车完成,准备离开电梯";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_06_LeaveLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_07_CloseDoor);
//AGV离开
bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,发送离开信号:{rtn}";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回离开电梯, out string msg);
}
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_07_CloseDoor))
{
if (lift.LiftContext.CheckAgvLeaveSig(JobParam.CurTargetNode.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_08_ToStore);
runInfo = $"{JobParam.CurTargetNode.AliceName}关门完成,将料车送到{liftStatus.destinationPoint}的放料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回起始地, out string msg);
}
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{liftStatus.destinationPoint}_{SettingString.TakeShelfOff}");
}
else if (JobRunStep.IsTimeOut(0.5, out double val))
{
//AGV离开
lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
runInfo = $"{JobParam.CurTargetNode.AliceName}离开信号超时重发";
JobRunStep.Msg = runInfo;
System.Threading.Thread.Sleep(3000);
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_08_ToStore))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_09_TakeShelfOff);
runInfo = $"到达{liftStatus.destinationPoint}的放料点,准备卸下";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_09_TakeShelfOff))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_10_ToTemp1);
runInfo = $"料车在{liftStatus.destinationPoint}卸下完成, 返回{JobParam.CurTargetNode.AliceName}的临时点1的取料点";
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
if (missionInfo != null)
{
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.完成, out string msg);
}
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.PutShelfOn}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_10_ToTemp1))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_11_PutTemp1ShelfOn);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点1的取料点,准备拾取料架";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.PutShelfOn}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_11_PutTemp1ShelfOn))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_12_ToLift);
runInfo = $"拾取料架完成,去{JobParam.CurTargetNode.AliceName}";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_12_ToLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus);
runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯";
JobRunStep.Msg = runInfo;
//请求电梯
lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
System.Threading.Thread.Sleep(2000);
}
}
#endregion
#region 电梯内无料车
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_06_01_EnterLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_06_02_TakeShelfOffAtLift);
runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,准备卸下料车";
JobRunStep.Msg = runInfo;
AllocateTask(agv, $"{SettingString.TakeShelfOff}_{JobParam.CurTargetNode.Name}");
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_06_02_TakeShelfOffAtLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_06_03_LeaveLift);
//上报状态
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,
$"电梯卸车"));
if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
{
//设置该电梯内的产品是成品入库
lift.LiftContext.SetFinishedState(JobParam.CurTargetNode.Name, true);
}
runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开";
ResetOccupiedAgv(JobParam.GetMissionInfo());
//任务状态变更
MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
JobRunStep.Msg = runInfo;
}
}
else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_06_03_LeaveLift))
{
if (agv.TaskRunState.CheckTaskFinished(agv.Name))
{
JobRunStep.ToNextStep(RunStep.END);
bool rtn = false;
if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
{
//AGV离开
rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
}
else
{
//AGV离开
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;
}
}
#endregion
else if (JobRunStep.IsStep(RunStep.END))
{
JobRunStep.EndJob();
return null;
}
return this;
}
}
}
......@@ -6,7 +6,7 @@ namespace DeviceLibrary.bean.jobType
/// <summary>
/// 1F,电梯到库房
/// </summary>
public class F1LiftToStoreJobType : JobType
public class BackLiftToLineJobType : JobType
{
public override Job GetNewJob(AgvInfo agv)
{
......@@ -14,7 +14,7 @@ namespace DeviceLibrary.bean.jobType
return null;
else
{
if(agv.Scope.Floor.Equals(1) && agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))
if(agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))//agv.Scope.Floor.Equals(1) &&
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1ReceiveMission(agv);
if(missionInfo!=null)
......
......@@ -25,7 +25,7 @@ namespace DeviceLibrary
return null;
else
{
if (!agv.Scope.Floor.Equals(1) && agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))
if ( agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))//!agv.Scope.Floor.Equals(1) &&
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetReceiveMission(agv);
if (missionInfo != null)
......
......@@ -10,38 +10,13 @@ namespace DeviceLibrary.bean.jobType
/// <summary>
/// 从线体取料并送入电梯内
/// </summary>
public class LineToLiftJobType:JobType
public class LineToLiftJobType : JobType
{
public override Job GetNewJob(AgvInfo agv)
{
if (!agv.IsIdle())
return null;
else if (agv.Scope.Floor.Equals(1))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetF1DeliverMission(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);
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.已分配, out string msg);
return new LineToLiftJob(jobParam);
}
}
else
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetFinishedDeliverMission(agv, out string liftname);
service.model.MissionInfo missionInfo = manager.MissionManager.GetLineToLiftMission(agv, out string liftname);
if (missionInfo != null)
{
Node src = manager.NodeManager.GetNode(missionInfo.sourcePoint, NodeType.Node);
......@@ -61,7 +36,6 @@ namespace DeviceLibrary.bean.jobType
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.已分配, out string msg);
return new LineToLiftJob(jobParam);
}
}
return null;
}
}
......
......@@ -20,9 +20,11 @@ namespace DeviceLibrary.bean.jobType
service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(agv.JobContext.MissionId);
if (missionInfo != null)
{
agv.TaskRunState = new TaskRunState();
agv.TaskRunState.Task = agv.JobContext.AgvTask;
Type type = Type.GetType(agv.JobContext.JobFullName); // 通过类名获取同名类
Job job = (Job)System.Activator.CreateInstance(type);
job.JobParam= agv.JobContext.JobParam;
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;
......
using Common;
using DeviceLibrary.bean.job;
using DeviceLibrary.manager;
namespace DeviceLibrary.bean.jobType
{
/// <summary>
/// 钢网项目-钢网领用-返回楼层,电梯
/// </summary>
public class SteelBackLiftToLinesJobType : JobType
{
public override Job GetNewJob(AgvInfo agv)
{
if (!agv.IsIdle())
return null;
else
{
if(agv.HasEmptyShelfInLift(out string liftname, out lift.LiftStatus lift))
{
service.model.MissionInfo missionInfo = manager.MissionManager.GetSteelReceiveMission(agv);
if(missionInfo!=null)
{
Node src = manager.NodeManager.GetNode(liftname, NodeType.Lift);
string[] dests = lift.destinationPoint.Split(',');
Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : lift.destinationPoint, NodeType.Node);
JobParam jobParam = new JobParam(src, dest,null,missionInfo);
jobParam.SteelShelfNode = NodeManager.GetNode(Common.AppConfigHelper.GetValue("SteelShelfPos"), NodeType.Node);
if (dests.Length > 1)
{
for (int i = 1; i < dests.Length; i++)
{
Node node = manager.NodeManager.GetNode(dests[i], NodeType.Node);
if (node != null)
jobParam.TargetNodes.Add(node);
else
{
LogUtil.error($"无法生成任务,因不存在的节点:{dests[i]}");
return null;
}
}
}
return new SteelLiftToLinesJob(jobParam);
}
}
}
return null;
}
}
}
using DeviceLibrary.manager;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary.bean.jobType
{
/// <summary>
/// 钢网入库,从线体取料并送入电梯内
/// </summary>
public class SteelLineToLiftJobType : JobType
{
public override Job GetNewJob(AgvInfo agv)
{
if (!agv.IsIdle())
return null;
service.model.MissionInfo missionInfo = manager.MissionManager.GetSteelLineToLiftMission(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);
jobParam.SteelShelfNode = NodeManager.GetNode(Common.AppConfigHelper.GetValue("SteelShelfPos"), NodeType.Node);
//任务状态变更
MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.已分配, out string msg);
return new SteelLineToLiftJob(jobParam);
}
return null;
}
}
}
using System.Data.SQLite;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SQLite.CodeFirst;
using DeviceLibrary.service.model;
namespace DeviceLibrary
{
internal class AGVDataContext:DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<AGVDataContext>(modelBuilder);
Database.SetInitializer(sqliteConnectionInitializer);
}
public AGVDataContext() :base("AGVDataContext") { }////配置使用的连接名
public DbSet<MissionInfo> MissionInfos { get; set; }
public DbSet<JobContextInfo> JobContextInfos { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
[Table("job_context")]
internal class JobContextInfo
{
public string agvName { get; set; }
[Key]
public string ip { get; set; }
public string jobContext { get; set; }
}
}
文件属性发生变化
......@@ -62,7 +62,7 @@ namespace DeviceLibrary
{
jobTypes = new List<JobType>();
jobTypes.Add(new LiftToLinesJobType());
jobTypes.Add(new F1LiftToStoreJobType());
jobTypes.Add(new BackLiftToLineJobType());
jobTypes.Add(new LineToLiftJobType());
//jobTypes.Add(new LineToLineJobType());
jobTypes.Add(new LineOneToManyJobType());
......@@ -102,84 +102,65 @@ namespace DeviceLibrary
sysClients.Add(item.Client);
}
}
static object writeobj = new object();
public static void SaveAgvContextInfo(string step)
/// <summary>
/// 获取agv运行上下文
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public static JobContext GetJobContext(AgvInfo agv)
{
string filePath = CONFIG_PATH + AppConfigHelper.GetValue(SettingString.FileName_AgvContext);
if (Monitor.TryEnter(writeobj, 500))
using (AGVDataContext ctx = new AGVDataContext())
{
try
var info = ctx.JobContextInfos.Where(s => s.ip.Equals(agv.IP)).FirstOrDefault();
if (info != null)
{
List<JobContext> context = new List<JobContext>();
foreach (AgvInfo item in agvInfo)
try
{
context.Add(item.JobContext);
return JsonHelper.DeserializeJsonToObject<JobContext>(info.jobContext);
}
string json = JsonHelper.SerializeObject(context);
if (File.Exists(filePath))
catch
{
if (true)
{
string backUpPath = filePath + ".back";
File.Copy(filePath, backUpPath, true);
return new JobContext();
}
File.Delete(filePath);
}
File.WriteAllText(filePath, json);
LogUtil.debug("保存Agv上下文信息到[" + filePath + $"]:{json}");
}
catch (Exception ex)
{
LogUtil.error("保存Agv上下文信息到[" + filePath + "]失败:", ex);
return null;
}
finally
/// <summary>
/// 保存agv运行上下文
/// </summary>
/// <param name="agv"></param>
public static void SaveJobContext(AgvInfo agv)
{
Monitor.Exit(writeobj);
}
using (AGVDataContext ctx = new AGVDataContext())
{
var info = ctx.JobContextInfos.Where(s => s.ip.Equals(agv.IP)).FirstOrDefault();
if (info != null)
{
info.jobContext = JsonHelper.SerializeObject(agv.JobContext);
}
else
{
LogUtil.error("SaveAgvContextInfo timeout:" + step);
info = new JobContextInfo();
info.agvName = agv.Name;
info.ip = agv.IP;
info.jobContext = JsonHelper.SerializeObject(agv.JobContext);
ctx.JobContextInfos.Add(info);
}
ctx.SaveChangesAsync();
}
}
static void ReadAgvContextInfo(List<AgvInfo> agvInfos)
{
string filePath = CONFIG_PATH + AppConfigHelper.GetValue(SettingString.FileName_AgvContext);
List<JobContext> agvs = new List<JobContext>();
try
{
string json = "";
bool configchanged = false;
if (File.Exists(filePath))
{
json = File.ReadAllText(filePath);
if (!string.IsNullOrEmpty(json))
{
agvs = JsonHelper.DeserializeJsonToList<JobContext>(json);
if (agvs == null)
{
return;
}
else
{
foreach (AgvInfo agv in agvInfos)
{
JobContext info = agvs.Find(s => agv.Name.Equals(s.Name));
if (info == null)
{
LogUtil.info($"{agv.Name}配置文件发生变化,不使用Agv上下文信息");
configchanged = true;
break;
}
}
if (!configchanged)
{
if(!agv.Auto)
continue;
bean.jobType.RecoveryJobType recoveryJobType = new RecoveryJobType();
foreach (AgvInfo agv in agvInfos)
{
JobContext info = agvs.Find(s => s.Name.Equals(agv.Name));
JobContext info = GetJobContext(agv);
if (info != null)
{
agv.SetJobContext(info);
......@@ -188,18 +169,13 @@ namespace DeviceLibrary
{
agv.CurJob = null;
}
LogUtil.info($"读取并使用{agv.Name}上下文信息:{JsonHelper.SerializeObject(info)}");
}
}
LogUtil.info("读取并使用Agv上下文信息[" + filePath + "]:" + json);
}
}
}
}
}
catch (Exception ex)
{
LogUtil.error("读取Agv上下文信息[" + filePath + "]失败:", ex);
LogUtil.error("读取Agv上下文信息失败:", ex);
}
}
}
......
......@@ -8,35 +8,39 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static DeviceLibrary.HttpManager;
namespace DeviceLibrary.manager
{
public class MissionManager
{
public delegate void MissionChangedEventHandler();
public static event MissionChangedEventHandler MissionChangedEvent;
static List<MissionInfo> MissionInfos = new List<MissionInfo>();
static Service web = new Service();
static object lockObj = new object();
static log4net.ILog Log = log4net.LogManager.GetLogger("MissionManager");
public static void InitMission()
{
string path = AGVManager.CONFIG_PATH + SettingString.FileName_Missions;
if (!System.IO.File.Exists(path))
return;
string txt = System.IO.File.ReadAllText(path, Encoding.GetEncoding("utf-8"));
MissionInfos = JsonHelper.DeserializeJsonToList<MissionInfo>(txt);
}
static void WriteMission()
/// <summary>
/// 获取所有有效的任务,除中止和完成的任务
/// </summary>
/// <returns></returns>
static List<MissionInfo> getValiteMissions()
{
string path = AGVManager.CONFIG_PATH + SettingString.FileName_Missions;
string txt = JsonHelper.SerializeObject(MissionInfos);
try
using (AGVDataContext ctx = new AGVDataContext())
{
System.IO.File.WriteAllText(path, txt);
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成);
if (missions != null)
return missions.ToList();
}
catch (Exception e)
return new List<MissionInfo>();
}
static List<MissionInfo> getAllMissions()
{
using (AGVDataContext ctx = new AGVDataContext())
{
Log.Error("WriteMission 失败", e);
return ctx.MissionInfos.ToList();
}
}
public static void InitView(DataGridView dataGridView)
......@@ -53,14 +57,18 @@ namespace DeviceLibrary.manager
dataGridView.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView.AllowUserToAddRows = false;
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = MissionInfos.ToList<MissionInfo>();
bindingSource.DataSource = getValiteMissions();
dataGridView.DataSource = bindingSource;
dataGridView.Columns[7].Visible = false;
dataGridView.Columns[10].Visible = false;
}
public static void UpdateDataSource(DataGridView dataGridView)
{
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = MissionInfos.ToList<MissionInfo>();
bindingSource.DataSource = getValiteMissions();
dataGridView.DataSource = bindingSource;
dataGridView.Columns[7].Visible = false;
dataGridView.Columns[10].Visible = false;
dataGridView.Refresh();
}
public static bool IsOpen()
......@@ -77,166 +85,150 @@ namespace DeviceLibrary.manager
}
public static bool Contains(MissionInfo MissionInfo)
{
int id = MissionInfos.FindIndex(s => s.missionId.Equals(MissionInfo.missionId));
int id = getValiteMissions().FindIndex(s => s.missionId.Equals(MissionInfo.missionId));
if (id > -1)
return true;
return false;
}
public static bool Contains(string missionId)
{
int id = MissionInfos.FindIndex(s => s.missionId.Equals(missionId));
int id = getValiteMissions().FindIndex(s => s.missionId.Equals(missionId));
if (id > -1)
return true;
return false;
}
/// <summary>
/// 获取所有任务
/// </summary>
/// <returns></returns>
public static List<MissionInfo> GetMissions()
{
return MissionInfos;
return getAllMissions();
}
public static MissionInfo GetMission(string missionId)
{
int id = MissionInfos.FindIndex(s => s.missionId.Equals(missionId));
if (id > -1)
return MissionInfos[id];
var mission = getValiteMissions().Where(w => w.missionId.Equals(missionId));
if (mission != null)
return mission.FirstOrDefault();
return null;
}
public static string GetMissionIdByShelfInLift(string liftId)
{
int id = MissionInfos.FindIndex(s=> liftId.Equals(s.liftName) &&
(s.state==MissionState.电梯运行 || s.state == MissionState.返回电梯运行));
if (id > -1)
return MissionInfos[id].missionId;
var m = getValiteMissions().Where(s => liftId.Equals(s.liftName) &&
(s.state == MissionState.电梯运行 || s.state == MissionState.返回电梯运行)).FirstOrDefault();
if (m != null)
return m.missionId;
return "";
}
public static string GetMissionIdByFinishedShelfInLift(string liftId)
{
int id = MissionInfos.FindIndex(s => liftId.Equals(s.liftName) && s.projectType.Equals(ProjectType.成品入库)
var m = getValiteMissions().Where(s => liftId.Equals(s.liftName) && s.projectType.Equals(ProjectType.成品入库)
&& (s.state.Equals(MissionState.等待成品回收) || s.state == MissionState.电梯运行
|| s.state == MissionState.返回电梯运行));
if (id > -1)
return MissionInfos[id].missionId;
if (m != null)
return m.FirstOrDefault().missionId;
return "";
}
public static void Add(MissionInfo mission)
/// <summary>
/// 任务添加
/// </summary>
/// <param name="mission">任务信息</param>
/// <returns>true:添加成功;false:添加失败,已存在任务Id</returns>
public static bool AddMission(MissionInfo mission)
{
try
using (AGVDataContext ctx = new AGVDataContext())
{
if (Monitor.TryEnter(lockObj, 1000))
var find = ctx.MissionInfos.Where(w => w.missionId.Equals(mission.missionId)).FirstOrDefault();
if (find == null)
{
MissionInfos.Add(mission);
Log.Info($"新建任务:{JsonHelper.SerializeObject(mission)}");
WriteMission();
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时");
}
finally
{
Monitor.Exit(lockObj);
}
ctx.MissionInfos.Add(mission);
ctx.SaveChangesAsync();
MissionChangedEvent?.Invoke();
return true;
}
public static void DeleteById(string missioId)
{
try
{
MissionInfo missionInfo = null;
if (Monitor.TryEnter(lockObj, 1000))
{
missionInfo = MissionInfos.Find(s => s.missionId.Equals(missioId));
MissionInfos.Remove(missionInfo);
Log.Info($"删除任务:{JsonHelper.SerializeObject(missionInfo)}");
WriteMission();
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
}
MissionChangedEvent?.Invoke();
Log.Error($"任务已添加,无法新建任务:{JsonHelper.SerializeObject(mission)}");
return false;
}
/// <summary>
/// 获取1F送料任务,以准备执行 F1StoreToLiftJobType
/// 获取钢网入库取料架任务,以准备执行 SteelLineToLiftJobType
/// </summary>
/// <param name="missionType"></param>
/// <returns></returns>
public static MissionInfo GetF1DeliverMission(AgvInfo agv, out string liftname)
public static MissionInfo GetSteelLineToLiftMission(AgvInfo agv, out string liftname)
{
MissionInfo missionInfo = null;
liftname = "";
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
s.state.Equals(MissionState.创建) &&
agv.Scope.Tasks.Contains(s.projectType.ToString()));
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
s.state.Equals(MissionState.创建) && s.projectType.Equals(ProjectType.钢网入库) &&
agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
liftname = GetLiftName(missionInfo);
liftname = MissionManager.GetLiftName(missionInfo);
if (liftname.Equals(""))
{
return null;
}
SetMissionOccupied(missionInfo, agv);
ctx.SaveChangesAsync();
Log.Info($"执行任务[{agv.Name}][起始地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
Log.Error("GetF1DeliverMission", e);
}
return null;
}
public static MissionInfo GetFinishedDeliverMission(AgvInfo agv, out string liftname)
/// <summary>
/// 获取取料架任务,以准备执行 LineToLiftJobType
/// </summary>
/// <param name="missionType"></param>
/// <returns></returns>
public static MissionInfo GetLineToLiftMission(AgvInfo agv, out string liftname)
{
MissionInfo missionInfo = null;
liftname = "";
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
s.state.Equals(MissionState.创建) &&
agv.Scope.Tasks.Contains(s.projectType.ToString())&&
s.projectType.Equals(ProjectType.成品入库));
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
s.state.Equals(MissionState.创建) && !s.projectType.Equals(ProjectType.钢网入库) &&
agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
liftname = GetLiftName(missionInfo);
liftname = MissionManager.GetLiftName(missionInfo);
if (liftname.Equals(""))
{
return null;
}
SetMissionOccupied(missionInfo, agv);
Log.Info($"执行成品入库任务[{agv.Name}][起始地] {JsonHelper.SerializeObject(missionInfo)}");
ctx.SaveChangesAsync();
Log.Info($"执行任务[{agv.Name}][起始地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
Log.Error("GetF1DeliverMission", e);
}
return null;
}
static bool AgvCanGetMission(MissionInfo missionInfo)
{
return string.IsNullOrEmpty(missionInfo.occupiedAgv);
......@@ -251,13 +243,17 @@ namespace DeviceLibrary.manager
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
(s.state >= MissionState.到达电梯 && s.state <= MissionState.电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
(s.state >= MissionState.到达电梯 && s.state <= MissionState.电梯到达)
&& agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
ctx.SaveChangesAsync();
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
......@@ -265,16 +261,12 @@ namespace DeviceLibrary.manager
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
Log.Error("GetReceiveMission", e);
}
return null;
}
/// <summary>
/// 获取1楼接收料任务,以准备执行 F1LiftToStoreJobType
/// 获取接收料任务,以准备执行 LiftToStoreJobType,排除钢网项目
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
......@@ -283,25 +275,55 @@ namespace DeviceLibrary.manager
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.state >= MissionState.返回到达电梯内 && s.state <= MissionState.返回电梯到达) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => (agv.Scope.Workshop.Equals(s.sourceWorkshop)) &&
(!s.projectType.Equals(ProjectType.钢网入库) && !s.projectType.Equals(ProjectType.钢网领用)) &&
(s.state >= MissionState.返回到达电梯内 && s.state <= MissionState.返回电梯到达)
&& agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
ctx.SaveChangesAsync();
Log.Info($"执行料架返回1楼任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
Log.Error("GetF1ReceiveMission", e);
}
return null;
}
finally
public static MissionInfo GetSteelReceiveMission(AgvInfo agv)
{
MissionInfo missionInfo = null;
try
{
Monitor.Exit(lockObj);
using (AGVDataContext ctx = new AGVDataContext())
{
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.state >= MissionState.返回到达电梯内 && s.state <= MissionState.返回电梯到达)
&& (s.projectType.Equals(ProjectType.钢网领用) || (s.projectType.Equals(ProjectType.钢网入库)))
&& agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
ctx.SaveChangesAsync();
Log.Info($"执行钢网任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
}
}
catch (Exception e)
{
Log.Error("GetF1ReceiveMission", e);
}
return null;
}
......@@ -315,14 +337,17 @@ namespace DeviceLibrary.manager
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.state.Equals(MissionState.等待成品回收)) && agv.Scope.Tasks.Contains(s.projectType.ToString())
&& s.projectType.Equals(ProjectType.成品入库));
&& s.projectType.Equals(ProjectType.成品入库)).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
ctx.SaveChangesAsync();
Log.Info($"执行1F成品回收任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
......@@ -330,11 +355,7 @@ namespace DeviceLibrary.manager
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
Log.Error("GetF1FinishedD2ToC1Mission", e);
}
return null;
}
......@@ -349,15 +370,18 @@ namespace DeviceLibrary.manager
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.state >= MissionState.到达电梯 && s.state <= MissionState.电梯到达)
&& agv.Scope.Tasks.Contains(s.projectType.ToString())
&& s.projectType.Equals(ProjectType.成品入库));
if (missionInfo != null && AgvCanGetMission(missionInfo)&& missionInfo.missionId.StartsWith("P101"))
&& s.projectType.Equals(ProjectType.成品入库)).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo) && missionInfo.missionId.StartsWith("P101"))
{
SetMissionOccupied(missionInfo, agv);
ctx.SaveChangesAsync();
Log.Info($"执行1F成品入库任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
......@@ -365,11 +389,7 @@ namespace DeviceLibrary.manager
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
Log.Error("GetF1SendFullFinishedC1ToD2Mission", e);
}
return null;
}
......@@ -384,14 +404,19 @@ namespace DeviceLibrary.manager
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
s.sourceWorkshop.Equals(agv.Scope.Workshop) && s.projectType.Equals(ProjectType.半成品领用) &&
(s.state == MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
((s.projectType.Equals(ProjectType.半成品领用)) || (s.sourceWorkshop.Equals(s.destinationWorkshop))) &&
(s.state == MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo, agv);
ctx.SaveChangesAsync();
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
......@@ -399,11 +424,7 @@ namespace DeviceLibrary.manager
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
Log.Error("GetLineToLineMission", e);
}
return null;
}
......@@ -418,16 +439,20 @@ namespace DeviceLibrary.manager
MissionInfo missionInfo = null;
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.destinationWorkshop.Equals(agv.Scope.Workshop) &&
s.sourceWorkshop.Equals(agv.Scope.Workshop) &&
(s.projectType.Equals(ProjectType.PCB领用) || s.projectType.Equals(ProjectType.包材领用))
&&
(s.state >= MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString()));
(s.state >= MissionState.创建) && agv.Scope.Tasks.Contains(s.projectType.ToString())).FirstOrDefault();
if (missionInfo != null && AgvCanGetMission(missionInfo))
{
SetMissionOccupied(missionInfo,agv);
SetMissionOccupied(missionInfo, agv);
ctx.SaveChangesAsync();
Log.Info($"执行任务[{agv.Name}][目的地] {JsonHelper.SerializeObject(missionInfo)}");
return missionInfo;
}
......@@ -435,15 +460,11 @@ namespace DeviceLibrary.manager
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时", e);
}
finally
{
Monitor.Exit(lockObj);
Log.Error("GetStoreToLinesMission", e);
}
return null;
}
static void SetMissionOccupied(MissionInfo missionInfo,AgvInfo agv)
static void SetMissionOccupied(MissionInfo missionInfo, AgvInfo agv)
{
missionInfo.SetAgvOccupied(agv.Name);
MissionChangedEvent?.Invoke();
......@@ -458,9 +479,12 @@ namespace DeviceLibrary.manager
msg = "ok";
try
{
if (Monitor.TryEnter(lockObj, 1000))
using (AGVDataContext ctx = new AGVDataContext())
{
missionInfo = MissionInfos.Find(s => s.missionId.Equals(missionId));
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.missionId.Equals(missionId)).FirstOrDefault();
if (missionInfo == null)
{
msg = $"设置任务{missionId}状态为{missionState}失败,原因为不存在该任务Id";
......@@ -469,48 +493,55 @@ namespace DeviceLibrary.manager
else
{
SetMissionState(missionInfo, missionState);
if (CanMissionDelete(missionState))
{
MissionInfos.Remove(missionInfo);
Log.Info($"删除任务:{JsonHelper.SerializeObject(missionInfo)}");
ctx.SaveChangesAsync();
}
}
WriteMission();
}
}
catch (Exception e)
{
Log.Error("操作 fixMissionInfos 超时");
Log.Error("SetMissionState", e);
}
MissionChangedEvent?.Invoke();
}
public static void SetLiftOccupiedAgv(string missionId, string agvName)
{
MissionInfo missionInfo = null;
try
{
using (AGVDataContext ctx = new AGVDataContext())
{
var missions = ctx.MissionInfos.Where(w => w.state != MissionState.中止
&& w.state != MissionState.取消 && w.state != MissionState.完成).ToList();
missionInfo = missions.Where(s => s.missionId.Equals(missionId)).FirstOrDefault();
if (missionInfo == null)
{
return;
}
else
{
missionInfo.SetAgvOccupied(agvName);
ctx.SaveChangesAsync();
}
finally
}
}
catch (Exception e)
{
Monitor.Exit(lockObj);
Log.Error("SetMissionState", e);
}
MissionChangedEvent?.Invoke();
}
static void SetMissionState(MissionInfo missionInfo, MissionState missionState)
{
missionInfo.SetState(missionState);
Log.Info($"设置任务[{missionInfo.missionId}] 状态为[{missionState}]成功");
}
/// <summary>
/// 任务能否被删除
/// </summary>
/// <param name="missionState"></param>
/// <returns></returns>
static bool CanMissionDelete(MissionState missionState)
{
if (missionState.Equals(MissionState.中止) || missionState.Equals(MissionState.取消) || missionState.Equals(MissionState.完成))
return true;
return false;
}
/// <summary>
/// 根据任务信息得到电梯名称
/// </summary>
/// <param name="missionInfo"></param>
/// <returns></returns>
static string GetLiftName(MissionInfo missionInfo)
public static string GetLiftName(MissionInfo missionInfo)
{
string liftname = "";
try
......@@ -577,21 +608,26 @@ namespace DeviceLibrary.manager
}
}
break;
case ProjectType.半成品入库:
break;
case ProjectType.半成品入库与领用:
break;
case ProjectType.半成品领用:
//二期
case ProjectType.成品入库:
if (missionInfo.sourceWorkshop.Equals(SettingString._3D))
{
if (missionInfo.destinationWorkshop.StartsWith("1"))
{
liftname = SettingString.LIFT_D2;
}
}
break;
case ProjectType.垃圾清运:
case ProjectType.钢网入库:
liftname = SettingString.LIFT_D2;
break;
case ProjectType.成品入库:
case ProjectType.钢网领用:
liftname = SettingString.LIFT_D2;
break;
case ProjectType.空台车归还:
case ProjectType.厂内PCBA入库_台车:
if (missionInfo.destinationWorkshop.StartsWith("1"))
{
if (missionInfo.sourceWorkshop.Equals(SettingString._4D) ||
missionInfo.sourceWorkshop.Equals(SettingString._3D))
if (missionInfo.sourceWorkshop.Equals(SettingString._3D))
{
liftname = SettingString.LIFT_D2;
}
......@@ -599,13 +635,79 @@ namespace DeviceLibrary.manager
{
liftname = SettingString.LIFT_C1;
}
else if (missionInfo.sourceWorkshop.Equals(SettingString._4D))
{
liftname = SettingString.LIFT_D2;
}
}
break;
case ProjectType.移远半成品入库:
if (missionInfo.destinationWorkshop.Equals(SettingString._3C))
{
if (missionInfo.sourceWorkshop.Equals(SettingString._4C))
{
liftname = SettingString.LIFT_C1;
}
}
break;
case ProjectType.移远成品入库:
if (missionInfo.sourceWorkshop.Equals(SettingString._3C))
{
liftname = SettingString.LIFT_C1;
}
break;
case ProjectType.Tray_静电箱回收:
if (missionInfo.sourceWorkshop.Equals(SettingString._3C))
{
if (missionInfo.destinationWorkshop.Equals(SettingString._4C))
{
liftname = SettingString.LIFT_C1;
}
}
break;
case ProjectType.空台车领用:
case ProjectType.半成品入库_台车:
if (missionInfo.sourceWorkshop.Equals(SettingString._3D))
{
if (missionInfo.destinationWorkshop.StartsWith("1"))
{
liftname = SettingString.LIFT_D2;
}
}
break;
case ProjectType.PCBA半成品领用_料架:
if (missionInfo.sourceWorkshop.StartsWith("1"))
{
if (missionInfo.destinationWorkshop.Equals(SettingString._4D) ||
missionInfo.destinationWorkshop.Equals(SettingString._3D))
if (missionInfo.destinationWorkshop.Equals(SettingString._3D))
{
liftname = SettingString.LIFT_D2;
}
}
break;
case ProjectType.PCBA半成品领用_台车:
if (missionInfo.sourceWorkshop.StartsWith("1"))
{
if (missionInfo.destinationWorkshop.Equals(SettingString._3D))
{
liftname = SettingString.LIFT_D2;
}
}
break;
case ProjectType.台车领用:
if (missionInfo.sourceWorkshop.Equals(SettingString._3D))
{
if (missionInfo.destinationWorkshop.Equals(SettingString._4D))
{
liftname = SettingString.LIFT_D2;
}
}
else if (missionInfo.sourceWorkshop.StartsWith("1"))
{
if (missionInfo.destinationWorkshop.Equals(SettingString._3D))
{
liftname = SettingString.LIFT_D2;
}
else if (missionInfo.destinationWorkshop.Equals(SettingString._4D))
{
liftname = SettingString.LIFT_D2;
}
......@@ -615,20 +717,29 @@ namespace DeviceLibrary.manager
}
}
break;
case ProjectType.静电箱领用:
if (missionInfo.sourceWorkshop.Equals(SettingString._3C))
case ProjectType.台车归还:
if (missionInfo.sourceWorkshop.Equals(SettingString._4D))
{
if (missionInfo.destinationWorkshop.Equals(SettingString._4C))
liftname = SettingString.LIFT_D2;
}
else if (missionInfo.sourceWorkshop.Equals(SettingString._3C))
{
liftname = SettingString.LIFT_C2;
liftname = SettingString.LIFT_C1;
}
else if (missionInfo.sourceWorkshop.Equals(SettingString._4C))
{
liftname = SettingString.LIFT_C1;
}
else if (missionInfo.sourceWorkshop.Equals(SettingString._3D))
{
liftname = SettingString.LIFT_D2;
}
break;
}
}
catch (Exception e)
{
LogUtil.error("GetLiftName:" + missionInfo.missionId, e);
LogUtil.error("GetLiftName:" + missionInfo?.missionId, e);
}
missionInfo.liftName = liftname;
return liftname;
......
......@@ -66,7 +66,7 @@ namespace DeviceLibrary.manager
{
agvState.state = "执行任务";
agvState.missionId = item.CurJob.JobParam.GetMissionInfo().missionId;
agvState.remark = item.CurJob.JobParam.GetMissionInfo().Remark;
agvState.remark = item.CurJob.JobParam.GetMissionInfo().remark;
}
else
agvState.state = "自动";
......
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="6.4.4" targetFramework="net472" />
<package id="log4net" version="2.0.12" targetFramework="net472" />
<package id="SQLite.CodeFirst" version="1.7.0.34" targetFramework="net472" />
<package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.116.0" targetFramework="net472" />
<package id="System.Data.SQLite" version="1.0.116.0" targetFramework="net472" />
<package id="System.Data.SQLite.Core" version="1.0.116.0" targetFramework="net472" />
<package id="System.Data.SQLite.EF6" version="1.0.116.0" targetFramework="net472" />
<package id="System.Data.SQLite.Linq" version="1.0.116.0" targetFramework="net472" />
</packages>
\ No newline at end of file
......@@ -35,7 +35,7 @@ namespace DeviceLibrary
result.msg = $"不存在的节点:{createMissionInfo.sourcePoint}";
Log.Error(result.msg);
}
else if(!NodeManager.CheckNodes(createMissionInfo.destinationPoint,out string nodenames))
else if (!NodeManager.CheckNodes(createMissionInfo.destinationPoint, out string nodenames))
{
result.code = -1;
result.msg = $"不存在的节点:{nodenames}";
......@@ -44,14 +44,20 @@ namespace DeviceLibrary
else if (!MissionManager.Contains(createMissionInfo))
{
MissionManager.SetMissionState(createMissionInfo.missionId, MissionState.创建, out string msg);
MissionManager.Add(createMissionInfo);
bool rtn = MissionManager.AddMission(createMissionInfo);
if (rtn)
Log.Info($"创建任务成功:{s}");
else
{
result.code = -1;
result.msg = $"创建任务失败,已存在该任务id:{createMissionInfo.missionId}";
Log.Error(result.msg);
}
}
else
{
result.code = -1;
result.msg = $"已存在该任务id:{createMissionInfo.missionId}";
result.msg = $"创建任务失败:{createMissionInfo.missionId}";
Log.Error(result.msg);
}
}
......@@ -92,10 +98,10 @@ namespace DeviceLibrary
}
else
{
if(MissionManager.Contains(deleteMission.missionId))
if (MissionManager.Contains(deleteMission.missionId))
{
MissionInfo missionInfo = MissionManager.GetMission(deleteMission.missionId);
if(missionInfo ==null)
if (missionInfo == null)
{
result.code = -1;
result.msg = $"不存在该任务id:{deleteMission.missionId}";
......@@ -105,15 +111,15 @@ namespace DeviceLibrary
{
if (missionInfo.state.Equals(MissionState.创建))
{
MissionManager.SetMissionState(missionInfo.missionId, MissionState.取消,out string msg);
MissionManager.SetMissionState(missionInfo.missionId, MissionState.取消, out string msg);
result.msg = msg;
}
else
{
AgvInfo agvInfo=AGVManager.agvInfo.Find(k=>k.JobContext.MissionId == deleteMission.missionId);
if(agvInfo == null)
AgvInfo agvInfo = AGVManager.agvInfo.Find(k => k.JobContext.MissionId == deleteMission.missionId);
if (agvInfo == null)
{
MissionManager.SetMissionState(missionInfo.missionId, MissionState.中止,out string msg);
MissionManager.SetMissionState(missionInfo.missionId, MissionState.中止, out string msg);
result.msg = msg;
}
else
......@@ -153,7 +159,7 @@ namespace DeviceLibrary
else
{
Node node = NodeManager.GetNode(operationFinish.line);
if(node==null)
if (node == null)
{
result.code = -1;
result.msg = $"不存在的线体名:{operationFinish.line}";
......@@ -164,7 +170,7 @@ namespace DeviceLibrary
//if(node.ExtendEquip.CanConfirm)
{
Log.Info($"线体[{operationFinish.line}]被调用确认接口");
node.ExtendEquip.ApiConfirmSig=true;
node.ExtendEquip.ApiConfirmSig = true;
}
//else
//{
......
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -9,11 +11,13 @@ namespace DeviceLibrary.service.model
/// <summary>
/// 任务信息
/// </summary>
[Table("mission_info")]
public class MissionInfo
{
/// <summary>
/// 任务编号
/// </summary>
[Key]
public string missionId { get; set; }
/// <summary>
/// 任务状态
......@@ -127,22 +131,19 @@ namespace DeviceLibrary.service.model
public void SetState(MissionState missionState)
{
state = missionState;
remark = $"{projectType.ToString()},{state.ToString()}";
}
public string Remark { get; set; }
public string remark { get; set; }
public void SetAgvOccupied(string agvname)
{
occupiedAgv = agvname;
}
public void ResetOccupied()
{
occupiedAgv = string.Empty;
}
public static bool IsFinishedProdcut(MissionInfo missionInfo)
{
if (missionInfo == null)
return false;
return missionInfo.projectType.Equals(ProjectType.成品入库);
return missionInfo.projectType.Equals(ProjectType.移远成品入库);
}
}
......@@ -216,13 +217,58 @@ namespace DeviceLibrary.service.model
包材领用,
半成品领用,
静电箱领用,
空台车领用,
空台车归还,
/// <summary>
/// 二期
/// </summary>
台车领用,
/// <summary>
/// 二期
/// </summary>
台车归还,
包材归还,
/// <summary>
/// 二期
/// </summary>
成品入库,
半成品入库,
半成品入库与领用,
垃圾清运,
治具领用
治具领用,
/// <summary>
/// 二期项目
/// </summary>
钢网入库,
/// <summary>
/// 二期
/// </summary>
钢网领用,
/// <summary>
/// 二期
/// </summary>
厂内PCBA入库_台车,
/// <summary>
/// 二期
/// </summary>
移远半成品入库,
/// <summary>
/// 二期
/// </summary>
移远成品入库,
/// <summary>
/// 二期
/// </summary>
Tray_静电箱回收,
/// <summary>
/// 二期
/// </summary>
半成品入库_台车,
/// <summary>
/// 二期
/// </summary>
PCBA半成品领用_料架,
/// <summary>
/// 二期
/// </summary>
PCBA半成品领用_台车,
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!