Commit cd135516 张东亮

init

0 个父辈
正在显示 99 个修改的文件 包含 10597 行增加0 行删除
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
project.fragment.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>AGVDispatch</RootNamespace>
<AssemblyName>AGVDispatch</AssemblyName>
<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>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Agv">
<HintPath>dll\Agv.dll</HintPath>
</Reference>
<Reference Include="Agv.Server">
<HintPath>dll\Agv.Server.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>dll\log4net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>dll\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="RestSharp, Version=106.11.4.0, Culture=neutral, PublicKeyToken=598062e77f915f75, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>dll\RestSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceModel.Activation" />
<Reference Include="System.ServiceModel.Web" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="FrmMain.cs">
<SubType>Form</SubType>
</Compile>
<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>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="icon.ico" />
</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 \ No newline at end of file
<?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.7.2"/>
</startup>
<log4net>
<appender name="AGVDispatch" type="log4net.Appender.RollingFileAppender">
<file value="logs/AGVDispatch.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<appender name="AgvServer" type="log4net.Appender.RollingFileAppender">
<file value="logs/AgvServer.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="30"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<appender name="MiR_API" type="log4net.Appender.RollingFileAppender">
<file value="logs/MiR_API.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="30"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<appender name="AGVManager" type="log4net.Appender.RollingFileAppender">
<file value="logs/AGVManager.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<param name="MaxSizeRollBackups" value="30"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<logger name="MiR_API">
<level value="Error"/>
<appender-ref ref="MiR_API"/>
</logger>
<logger name="AgvServer">
<level value="Info"/>
<appender-ref ref="AgvServer"/>
</logger>
<logger name="AGVManager">
<level value="Debug"/>
<appender-ref ref="AGVManager"/>
</logger>
<root name="AGV_3D_SMD">
<level value="Info"/>
<appender-ref ref="AGV_3D_SMD"/>
</root>
</log4net>
<appSettings>
<add key="http_server" value="http://10.85.162.124/myproject/"/>
<add key="FLEET" value="10.85.199.3"/>
<add key="LocalIP" value="10.85.162.40"/>
<add key="Use_Fleet" value="False"/>
<add key="ChargeThreshold" value="20,90"/>
<add key="LimitPoints" value="0,0;0,0;0,0;0,0"/>
</appSettings>
</configuration>
namespace AGVControl
{
partial class FrmMain
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.panelNode = new System.Windows.Forms.Panel();
this.groupBoxNode = new System.Windows.Forms.GroupBox();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.tabControlAGV = new System.Windows.Forms.TabControl();
this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();
this.flowPanelKanBan = new System.Windows.Forms.FlowLayoutPanel();
this.lblCharge1 = new System.Windows.Forms.Label();
this.lblCharge2 = new System.Windows.Forms.Label();
this.lblStandy1 = new System.Windows.Forms.Label();
this.lblStandy2 = new System.Windows.Forms.Label();
this.lblStandy3 = new System.Windows.Forms.Label();
this.lblStandy4 = new System.Windows.Forms.Label();
this.lblLimit = new System.Windows.Forms.Label();
this.Column16 = new System.Windows.Forms.DataGridViewButtonColumn();
this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column9 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column10 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column6 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DgvNode = new System.Windows.Forms.DataGridView();
this.tableLayoutPanel3.SuspendLayout();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.panelNode.SuspendLayout();
this.groupBoxNode.SuspendLayout();
this.tabPage3.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.tableLayoutPanel4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.DgvNode)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel3
//
this.tableLayoutPanel3.ColumnCount = 1;
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel3.Controls.Add(this.tabControl1, 0, 1);
this.tableLayoutPanel3.Controls.Add(this.tableLayoutPanel4, 0, 0);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 2;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 45.37815F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 54.62185F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(1190, 833);
this.tableLayoutPanel3.TabIndex = 7;
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(3, 380);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(1184, 450);
this.tabControl1.TabIndex = 7;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.tableLayoutPanel2);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(1176, 424);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "状态显示";
this.tabPage1.UseVisualStyleBackColor = true;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 1;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.Controls.Add(this.panelNode, 0, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(1170, 418);
this.tableLayoutPanel2.TabIndex = 34;
//
// panelNode
//
this.panelNode.Controls.Add(this.groupBoxNode);
this.panelNode.Location = new System.Drawing.Point(3, 3);
this.panelNode.Name = "panelNode";
this.panelNode.Size = new System.Drawing.Size(723, 412);
this.panelNode.TabIndex = 0;
//
// groupBoxNode
//
this.groupBoxNode.Controls.Add(this.DgvNode);
this.groupBoxNode.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBoxNode.Location = new System.Drawing.Point(0, 0);
this.groupBoxNode.Name = "groupBoxNode";
this.groupBoxNode.Size = new System.Drawing.Size(723, 412);
this.groupBoxNode.TabIndex = 0;
this.groupBoxNode.TabStop = false;
this.groupBoxNode.Text = "节点状态";
//
// tabPage3
//
this.tabPage3.Controls.Add(this.groupBox1);
this.tabPage3.Controls.Add(this.groupBox2);
this.tabPage3.Location = new System.Drawing.Point(4, 22);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(1176, 424);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "手动&日志";
this.tabPage3.UseVisualStyleBackColor = true;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.richTextBox1);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox1.Location = new System.Drawing.Point(3, 3);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(752, 418);
this.groupBox1.TabIndex = 33;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "日志";
//
// richTextBox1
//
this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.richTextBox1.Location = new System.Drawing.Point(3, 17);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(746, 398);
this.richTextBox1.TabIndex = 0;
this.richTextBox1.Text = "";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.tabControlAGV);
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Right;
this.groupBox2.Location = new System.Drawing.Point(755, 3);
this.groupBox2.Margin = new System.Windows.Forms.Padding(2);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Padding = new System.Windows.Forms.Padding(2);
this.groupBox2.Size = new System.Drawing.Size(418, 418);
this.groupBox2.TabIndex = 32;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "AGV手动";
//
// tabControlAGV
//
this.tabControlAGV.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControlAGV.Location = new System.Drawing.Point(2, 16);
this.tabControlAGV.Name = "tabControlAGV";
this.tabControlAGV.SelectedIndex = 0;
this.tabControlAGV.Size = new System.Drawing.Size(414, 400);
this.tabControlAGV.TabIndex = 47;
//
// tableLayoutPanel4
//
this.tableLayoutPanel4.ColumnCount = 1;
this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel4.Controls.Add(this.flowPanelKanBan, 0, 0);
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel4.Location = new System.Drawing.Point(2, 2);
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel4.Name = "tableLayoutPanel4";
this.tableLayoutPanel4.RowCount = 1;
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 373F));
this.tableLayoutPanel4.Size = new System.Drawing.Size(1186, 373);
this.tableLayoutPanel4.TabIndex = 8;
//
// flowPanelKanBan
//
this.flowPanelKanBan.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowPanelKanBan.Location = new System.Drawing.Point(3, 3);
this.flowPanelKanBan.Name = "flowPanelKanBan";
this.flowPanelKanBan.Size = new System.Drawing.Size(1180, 367);
this.flowPanelKanBan.TabIndex = 0;
//
// lblCharge1
//
this.lblCharge1.AutoSize = true;
this.lblCharge1.Dock = System.Windows.Forms.DockStyle.Top;
this.lblCharge1.Location = new System.Drawing.Point(2, 16);
this.lblCharge1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblCharge1.Name = "lblCharge1";
this.lblCharge1.Size = new System.Drawing.Size(65, 12);
this.lblCharge1.TabIndex = 0;
//
// lblCharge2
//
this.lblCharge2.AutoSize = true;
this.lblCharge2.Dock = System.Windows.Forms.DockStyle.Top;
this.lblCharge2.Location = new System.Drawing.Point(2, 28);
this.lblCharge2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblCharge2.Name = "lblCharge2";
this.lblCharge2.Size = new System.Drawing.Size(65, 12);
this.lblCharge2.TabIndex = 1;
//
// lblStandy1
//
this.lblStandy1.AutoSize = true;
this.lblStandy1.Dock = System.Windows.Forms.DockStyle.Top;
this.lblStandy1.Location = new System.Drawing.Point(2, 40);
this.lblStandy1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblStandy1.Name = "lblStandy1";
this.lblStandy1.Size = new System.Drawing.Size(65, 12);
this.lblStandy1.TabIndex = 2;
//
// lblStandy2
//
this.lblStandy2.AutoSize = true;
this.lblStandy2.Dock = System.Windows.Forms.DockStyle.Top;
this.lblStandy2.Location = new System.Drawing.Point(2, 52);
this.lblStandy2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblStandy2.Name = "lblStandy2";
this.lblStandy2.Size = new System.Drawing.Size(65, 12);
this.lblStandy2.TabIndex = 3;
//
// lblStandy3
//
this.lblStandy3.AutoSize = true;
this.lblStandy3.Dock = System.Windows.Forms.DockStyle.Top;
this.lblStandy3.Location = new System.Drawing.Point(2, 64);
this.lblStandy3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblStandy3.Name = "lblStandy3";
this.lblStandy3.Size = new System.Drawing.Size(65, 12);
this.lblStandy3.TabIndex = 4;
//
// lblStandy4
//
this.lblStandy4.AutoSize = true;
this.lblStandy4.Dock = System.Windows.Forms.DockStyle.Top;
this.lblStandy4.Location = new System.Drawing.Point(2, 76);
this.lblStandy4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblStandy4.Name = "lblStandy4";
this.lblStandy4.Size = new System.Drawing.Size(65, 12);
this.lblStandy4.TabIndex = 5;
//
// lblLimit
//
this.lblLimit.AutoSize = true;
this.lblLimit.Dock = System.Windows.Forms.DockStyle.Top;
this.lblLimit.Location = new System.Drawing.Point(2, 88);
this.lblLimit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblLimit.Name = "lblLimit";
this.lblLimit.Size = new System.Drawing.Size(35, 12);
this.lblLimit.TabIndex = 6;
//
// Column16
//
this.Column16.FillWeight = 107.563F;
this.Column16.HeaderText = "调用";
this.Column16.MinimumWidth = 6;
this.Column16.Name = "Column16";
this.Column16.ReadOnly = true;
//
// Column5
//
this.Column5.FillWeight = 107.563F;
this.Column5.HeaderText = "连接";
this.Column5.MinimumWidth = 6;
this.Column5.Name = "Column5";
this.Column5.ReadOnly = true;
this.Column5.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column9
//
this.Column9.FillWeight = 107.563F;
this.Column9.HeaderText = "RFID";
this.Column9.MinimumWidth = 6;
this.Column9.Name = "Column9";
this.Column9.ReadOnly = true;
this.Column9.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column10
//
this.Column10.FillWeight = 47.05883F;
this.Column10.HeaderText = "类型";
this.Column10.MinimumWidth = 6;
this.Column10.Name = "Column10";
this.Column10.ReadOnly = true;
this.Column10.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column7
//
this.Column7.FillWeight = 107.563F;
this.Column7.HeaderText = "动作";
this.Column7.MinimumWidth = 6;
this.Column7.Name = "Column7";
this.Column7.ReadOnly = true;
this.Column7.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column6
//
this.Column6.FillWeight = 107.563F;
this.Column6.HeaderText = "地点";
this.Column6.MinimumWidth = 6;
this.Column6.Name = "Column6";
this.Column6.ReadOnly = true;
this.Column6.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// DgvNode
//
this.DgvNode.AllowUserToAddRows = false;
this.DgvNode.AllowUserToDeleteRows = false;
this.DgvNode.AllowUserToResizeColumns = false;
this.DgvNode.AllowUserToResizeRows = false;
this.DgvNode.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.DgvNode.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.DgvNode.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.DgvNode.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.DgvNode.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column6,
this.Column7,
this.Column10,
this.Column9,
this.Column5,
this.Column16});
this.DgvNode.Dock = System.Windows.Forms.DockStyle.Fill;
this.DgvNode.Location = new System.Drawing.Point(3, 17);
this.DgvNode.MultiSelect = false;
this.DgvNode.Name = "DgvNode";
this.DgvNode.ReadOnly = true;
this.DgvNode.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
this.DgvNode.RowHeadersVisible = false;
this.DgvNode.RowHeadersWidth = 50;
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
this.DgvNode.RowsDefaultCellStyle = dataGridViewCellStyle2;
this.DgvNode.RowTemplate.Height = 23;
this.DgvNode.Size = new System.Drawing.Size(717, 392);
this.DgvNode.TabIndex = 3;
this.DgvNode.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvNode_CellClick);
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1190, 833);
this.Controls.Add(this.tableLayoutPanel3);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "FrmMain";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "AGV调度系统";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing);
this.Load += new System.EventHandler(this.FrmMain_Load);
this.tableLayoutPanel3.ResumeLayout(false);
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tableLayoutPanel2.ResumeLayout(false);
this.panelNode.ResumeLayout(false);
this.groupBoxNode.ResumeLayout(false);
this.tabPage3.ResumeLayout(false);
this.groupBox1.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.tableLayoutPanel4.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.DgvNode)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4;
private System.Windows.Forms.FlowLayoutPanel flowPanelKanBan;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Label lblCharge1;
private System.Windows.Forms.Label lblCharge2;
private System.Windows.Forms.Label lblStandy1;
private System.Windows.Forms.Label lblStandy2;
private System.Windows.Forms.Label lblStandy3;
private System.Windows.Forms.Label lblStandy4;
private System.Windows.Forms.Label lblLimit;
private System.Windows.Forms.TabControl tabControlAGV;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.Panel panelNode;
private System.Windows.Forms.GroupBox groupBoxNode;
private System.Windows.Forms.DataGridView DgvNode;
private System.Windows.Forms.DataGridViewTextBoxColumn Column6;
private System.Windows.Forms.DataGridViewTextBoxColumn Column7;
private System.Windows.Forms.DataGridViewTextBoxColumn Column10;
private System.Windows.Forms.DataGridViewTextBoxColumn Column9;
private System.Windows.Forms.DataGridViewTextBoxColumn Column5;
private System.Windows.Forms.DataGridViewButtonColumn Column16;
}
}
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Common;
using DeviceLibrary;
using System.Collections.Generic;
namespace AGVControl
{
public partial class FrmMain : Form
{
private bool exit = false;
private bool change;
private NotifyIcon notify;
private ContextMenuStrip notifyMenu;
private System.Timers.Timer showTimer;
public FrmMain()
{
InitializeComponent();
showTimer = new System.Timers.Timer();
showTimer.Interval = 2000;
//showTimer.Enabled = true;
//showTimer.AutoReset = true;
showTimer.Elapsed += ShowTimer_Elapsed;
showTimer.Start();
CommonVar.control.limitArea.ScopeLimitStateChangedEvent += LimitArea_ScopeLimitStateChangedEvent;
}
/// <summary>
/// 限制区域有小车
/// </summary>
/// <param name="ip"></param>
private void LimitArea_ScopeLimitStateChangedEvent(string ip,bool state)
{
Invoke(new Action(()=>
{
if (CommonVar.control.limitArea.Available)
lblLimit.Text = "限制区域车辆:";
else
{
lblLimit.Text = "限制区域车辆:"+ip;
}
}
));
}
private void ShowConfig()
{
int n;
for (int i = 0; i < CommonVar.agvInfo.Count; i++)
{
MiR_API.Get_IO_Status(CommonVar.agvInfo[i], out bool[] input, out bool[] output);
if (input != null && input.Length == 4)
CommonVar.agvInfo[i].IsExistShelf = input[3];
flowPanelKanBan.Controls.Add(CommonVar.agvInfo[i].StateKanban);
AddForm(CommonVar.agvInfo[i].Name,new Manual(CommonVar.agvInfo[i]));
CommonVar.agvInfo[i].StateKanban.Init();
}
for (int i = 0; i < CommonVar.nodeInfo.Count; i++)
{
Agv.ClientNode node = CommonVar.nodeInfo[i];
n = DgvNode.Rows.Add(node.AliceName,node.Action,node.Shelf,node.RFID,node.Online,node.IsUse);
DgvNode.Rows[n].HeaderCell.Value = (n + 1).ToString();
if (i % 2 == 0)
DgvNode.Rows[n].DefaultCellStyle.BackColor = Color.LightBlue;
if (!CommonVar.nodeInfo[i].Online)
DgvNode.Rows[n].DefaultCellStyle.ForeColor = Color.Red;
}
}
private void ItemShow_Click(object sender, EventArgs e)
{
Show();
if (WindowState == FormWindowState.Minimized)
WindowState = FormWindowState.Normal;
}
private void ItemExit_Click(object sender, EventArgs e)
{
foreach (var item in CommonVar.agvInfo)
{
CommonVar.WriteIni(item.Name, SettingString.RFID, item.RFID);
}
notify.Dispose();
exit = true;
Close();
}
private void Notify_MouseDoubleClick(object sender, MouseEventArgs e)
{
Show();
if (WindowState == FormWindowState.Minimized)
WindowState = FormWindowState.Normal;
}
private void FrmMain_Load(object sender, EventArgs e)
{
//托盘菜单
notifyMenu = new ContextMenuStrip();
ToolStripMenuItem itemShow = new ToolStripMenuItem("显示(&S)");
itemShow.Click += ItemShow_Click;
ToolStripMenuItem itemExit = new ToolStripMenuItem("退出(&X)");
itemExit.Click += ItemExit_Click;
notifyMenu.Items.Add(itemShow);
notifyMenu.Items.Add(itemExit);
//托盘控件
notify = new NotifyIcon { Icon = Icon, Visible = true, ContextMenuStrip = notifyMenu, Text = Text };
notify.MouseDoubleClick += Notify_MouseDoubleClick;
ShowConfig();
change = true;
change = false;
CommonVar.server.NodeChanged += Server_NodeChanged; ;
CommonVar.server.NodeOnline += Server_NodeOnline; ;
LogUtil.logBox= richTextBox1;
}
private void Server_NodeOnline(string nodeName, bool online)
{
this.Invoke(new Action(()=>
{
int idx = CommonVar.nodeInfo.FindIndex(s=>s.Name.Equals(nodeName));
if (idx > -1)
{
CommonVar.nodeInfo[idx].Online = online;
DgvNode.Rows[idx].DefaultCellStyle.ForeColor = online ? Color.Black : Color.Red;
DgvNode.Rows[idx].SetValues(CommonVar.nodeInfo[idx].AliceName, CommonVar.nodeInfo[idx].Action, CommonVar.nodeInfo[idx].Shelf, CommonVar.nodeInfo[idx].RFID, CommonVar.nodeInfo[idx].Online, CommonVar.nodeInfo[idx].IsUse);
}
}
));
}
private void Server_NodeChanged(Agv.Node clientNode)
{
int idx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(clientNode.Name));
if (idx > -1)
DgvNode.Rows[idx].SetValues(CommonVar.nodeInfo[idx].AliceName, clientNode.Action, clientNode.Shelf, clientNode.RFID, CommonVar.nodeInfo[idx].Online, CommonVar.nodeInfo[idx].IsUse);
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (!exit)
{
e.Cancel = true;
Hide();
}
foreach (var item in CommonVar.agvInfo)
{
CommonVar.WriteIni(item.Name, SettingString.RFID, item.RFID);
}
//showTimer.Enabled = false;
showTimer.Stop();
// CommonVar.control.AgvChanged -= Control_AgvChanged;
CommonVar.server.NodeChanged -= Server_NodeChanged;
CommonVar.server.NodeOnline -= Server_NodeOnline;
}
private void DgvNode_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) return;
if (e.ColumnIndex == DgvNode.Columns.Count - 1) //调用
{
CommonVar.nodeInfo[e.RowIndex].IsUse = !CommonVar.nodeInfo[e.RowIndex].IsUse;
DgvNode.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = CommonVar.nodeInfo[e.RowIndex].IsUse.ToString();
CommonVar.WriteIni(CommonVar.nodeInfo[e.RowIndex].Name, SettingString.IsUse, CommonVar.nodeInfo[e.RowIndex].IsUse.ToString());
Agv.ClientNode node = CommonVar.nodeInfo[e.RowIndex];
DgvNode.Rows[e.RowIndex].SetValues(node.AliceName, node.Action, node.Shelf, node.RFID, node.Online, node.IsUse);
}
}
bool InShhow = false;
private void ShowTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//ShowEmptyTask();
if (InShhow)
return;
InShhow = true;
Invoke(new Action(() =>
{
lblCharge1.Text = "充电桩1:" + CommonVar.Charge.Station[Charge.AutoCharge1];
//lblCharge2.Text = "充电桩2:" + CommonVar.Charge.Station[Charge.AutoCharge2];
lblStandy1.Text = "待机位1:" + CommonVar.Standby.Station[0];
lblStandy2.Text = "待机位2:" + CommonVar.Standby.Station[1];
lblStandy3.Text = "待机位3:" + CommonVar.Standby.Station[2];
lblStandy4.Text = "待机位4:" + CommonVar.Standby.Station[3];
}));
Application.DoEvents();
InShhow = false;
}
/// <summary>
/// 添加窗体
/// </summary>
/// <param name="text"></param>
/// <param name="form"></param>
private void AddForm(string text, Form form)
{
text = text.PadLeft(10, ' ');
TabPage lineTabPage = new TabPage(text);
// lineTabPage.AutoScroll = true;
// lineTabPage.Tag = lineBean;
Panel linePan = new Panel();
linePan.Dock = DockStyle.Fill;
linePan.AutoScroll = true;
lineTabPage.Controls.Add(linePan);
form.FormBorderStyle = FormBorderStyle.None;
form.TopLevel = false;
linePan.Controls.Add(form);
//form.Dock = DockStyle.Fill;
//linePan.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Left)));
//form.Anchor = ((AnchorStyles)((AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Left)));
form.Show();
// tabPageList.Add(lineTabPage);
tabControlAGV.Controls.Add(lineTabPage);
}
}
}
<?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>
<metadata name="Column6.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column7.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column10.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column9.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column5.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column16.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<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>
AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAADAE
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAPAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAGQAAABfAAAARgAAAAAAAAAAAAAAAAAA
AAAAAAAZAAAAdwAAAFQAAABhAAAAAAAAAAAAAABBAAAAZgAAAI4AAABfAAAAaAAAAIUAAABmAAAAZgAA
AGYAAABmAAAAiAAAAE8AAACLAAAAfAAAAGYAAABRAAAAQAAAADQAAABEAAAAcwAAAG4AAABHAAAAKgAA
ACwAAAAdAAAAHQAAADMAAACCAAAAZQAAAFoAAAAdAAAAdAAAADMAAAB0AAAACQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAHYAAAAvAAAAjQAAACAAAAAAAAAAAAAA
AFIAAAAMAAAAAAAAAAAAAAAuAAAAMAAAAAAAAAAAAAAAAAAAAGoAAABeAAAAAgAAAGsAAABjAAAAbgAA
AFUAAABVAAAAVQAAAF4AAABVAAAAVQAAAFUAAAB0AAAAcAAAAG8AAABDAAAAAAAAAAAAAAAAAAAAAAAA
AEIAAAAvAAAAAAAAAAAAAABmAAAAAAAAAAAAAAAsAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAcwAAAAAAAAAAAAAAZgAAAAAAAAAPAAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACwAAABlAAAAZgAAAH8AAABmAAAAXQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAACFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA6AAAAkAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAA0AAAAagAAAGYAAABDAAAALAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAABDAAAAUAAAAGAAAABjAAAAYAAAACMAAAA7AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAHAAAABlAAAAVQAAAGYAAABgAAAABAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA29cAAP/vAAD//wAAv/8AAP//AAD//wAA//8AAP//
AAD+/wAA/v8AAP//AAD//wAA//8AAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAARgAAAEsAAAAVAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAABSAAAALwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAMoAAAB+AAAAdQAA
AMkAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACdAAAApQAA
AGwAAACqAAAAkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAKAAA
ACUAAAAyAAAAEQAAAM4AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAA
AIgAAAAKAAAARAAAAAgAAACTAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAIgAAACIAAAAjwAA
AMcAAAAIAAAAywAAAL8AAAAjAAAAlwAAAK8AAACZAAAAmQAAAJkAAACZAAAAmQAAAJkAAACZAAAAmQAA
AJkAAADIAAAAKAAAAJEAAACdAAAAiAAAADIAAADAAAAAiAAAAIgAAAB8AAAABAAAAAAAAADJAAAAMwAA
ADMAAAA3AAAAzAAAAAEAAACnAAAAuQAAAA0AAACqAAAAUAAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAA
ADMAAAAzAAAAMwAAAKAAAAA7AAAAWAAAAMQAAABRAAAARQAAAJkAAAAzAAAAMwAAAK0AAAAxAAAAAAAA
ALgAAAA2AAAAJgAAAD0AAAC3AAAAeQAAAAEAAAAAAAAAUwAAAMcAAAAWAAAAXgAAACwAAAAxAAAAXQAA
ABIAAABMAAAARwAAABYAAABeAAAAUAAAAM4AAAAWAAAAAAAAABoAAADUAAAAPwAAAF0AAAAaAAAA2wAA
AB8AAAAAAAAAZgAAAGYAAAAIAAAADQAAABkAAACFAAAAwwAAAMAAAACcAAAAIQAAAAMAAAAXAAAACgAA
AAwAAAAXAAAAAgAAABUAAAAUAAAAAwAAABcAAAAKAAAASAAAAMEAAAC/AAAAvwAAAEMAAAAGAAAAFAAA
AAUAAADOAAAAAAAAAAAAAABmAAAAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAwAAAAhQAAANkAAAAAAAAAAAAAAGYAAADOAAAAuQAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAL8AAAA9AAAA0AAAAAAAAAAAAAAAZgAAAHkAAABpAAAAeAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAAAMUAAADeAAAAAAAAAAAAAABeAAAAvgAAAJEAAAAhAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAACuAAAAuwAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAC5AAAAugAA
ABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAuAAAAkwAAAH8AAAAAAAAAAAAAABoAAADOAAAAYAAA
ADYAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAF4AAACjAAAA1QAAAKwAAABgAAAAAwAAAAAAAAAAAAAAAAAA
ABoAAAByAAAAlwAAALoAAADJAAAA3gAAALsAAAC7AAAAuwAAALsAAAC7AAAAuwAAAM0AAAC7AAAAuwAA
ALsAAAC7AAAAuwAAALsAAAC7AAAAxgAAAOMAAAC7AAAAeAAAADQAAAACAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7AAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAywAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADKAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAAACVAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAADLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnwAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAM0AAAAWAAAAAAAA
AAAAAAAAAAAAAAAAAMsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAACYAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWgAA
AIsAAAAAAAAAAAAAAAAAAAAAAAAAywAAAAAAAAAAAAAAAAAAAAAAAABCAAAAvwAAAAUAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAADAAAArQAAAKIAAACIAAAAiAAAAIgAAADaAAAAiAAAAIgAAACIAAAArQAAALgAAAAUAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAWAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAywAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAADyAAAAMAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAA
AP8AAACLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAA
AAYAAAAzAAAAjQAAABkAAAAhAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABkAAAAvQAAAEsAAAA0AAAAawAAAMoAAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABbAAAAZwAAAAAAAAApAAAAewAAAIgAAABoAAAADAAAABEAAACZAAAAGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAJAAAACgAAAAcAAACHAAAAxQAAAHUAAABCAAAANQAAAFIAAACRAAAAygAAAE0AAAAAAAAAEQAA
AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADQAAADNAAAANgAAAAAAAAASAAAAWwAAAIcAAACIAAAAfgAAAEIAAAACAAAAAAAA
AFgAAADMAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAACyAAAAqgAAAEUAAAALAAAAAAAAAAAAAAAAAAAAFQAA
AFcAAADAAAAAlQAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAigAAAMcAAADGAAAAvAAA
AMkAAAC+AAAAewAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////b/8n/vf/d/CQAIjul/7bbvf/d38P/49////+c//
//X////5z8/n+9///8fwAAB//v39//99+///ffv//733//+AD/////////3////9////+P////3////3
f////d///88///959///n8///+B/////////////
</value>
</data>
</root>
\ No newline at end of file \ No newline at end of file
namespace AGVControl
{
partial class Manual
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Manual));
this.panelInfo = new System.Windows.Forms.Panel();
this.lblInfo = new System.Windows.Forms.Label();
this.grpBxRunMode = new System.Windows.Forms.GroupBox();
this.chkBxAuto = new System.Windows.Forms.CheckBox();
this.btnReSendTask = new System.Windows.Forms.Button();
this.grpBxOperation = new System.Windows.Forms.GroupBox();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.btnReady = new System.Windows.Forms.Button();
this.btnPause = new System.Windows.Forms.Button();
this.btnClearErr = new System.Windows.Forms.Button();
this.grpBxMission = new System.Windows.Forms.GroupBox();
this.btnAssignTask = new System.Windows.Forms.Button();
this.cmbBxMission = new System.Windows.Forms.ComboBox();
this.panelInfo.SuspendLayout();
this.grpBxRunMode.SuspendLayout();
this.grpBxOperation.SuspendLayout();
this.flowLayoutPanel1.SuspendLayout();
this.grpBxMission.SuspendLayout();
this.SuspendLayout();
//
// panelInfo
//
this.panelInfo.Controls.Add(this.lblInfo);
this.panelInfo.Dock = System.Windows.Forms.DockStyle.Top;
this.panelInfo.Location = new System.Drawing.Point(0, 0);
this.panelInfo.Name = "panelInfo";
this.panelInfo.Size = new System.Drawing.Size(385, 43);
this.panelInfo.TabIndex = 0;
//
// lblInfo
//
this.lblInfo.BackColor = System.Drawing.Color.LightBlue;
this.lblInfo.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblInfo.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblInfo.Location = new System.Drawing.Point(0, 0);
this.lblInfo.Name = "lblInfo";
this.lblInfo.Size = new System.Drawing.Size(385, 43);
this.lblInfo.TabIndex = 0;
this.lblInfo.Text = "#号车";
this.lblInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// grpBxRunMode
//
this.grpBxRunMode.Controls.Add(this.chkBxAuto);
this.grpBxRunMode.Controls.Add(this.btnReSendTask);
this.grpBxRunMode.Dock = System.Windows.Forms.DockStyle.Top;
this.grpBxRunMode.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.grpBxRunMode.Location = new System.Drawing.Point(0, 43);
this.grpBxRunMode.Name = "grpBxRunMode";
this.grpBxRunMode.Size = new System.Drawing.Size(385, 70);
this.grpBxRunMode.TabIndex = 1;
this.grpBxRunMode.TabStop = false;
this.grpBxRunMode.Text = "模式选择";
//
// chkBxAuto
//
this.chkBxAuto.AutoSize = true;
this.chkBxAuto.Location = new System.Drawing.Point(7, 21);
this.chkBxAuto.Name = "chkBxAuto";
this.chkBxAuto.Size = new System.Drawing.Size(76, 16);
this.chkBxAuto.TabIndex = 0;
this.chkBxAuto.Text = "自动模式";
this.chkBxAuto.UseVisualStyleBackColor = true;
this.chkBxAuto.CheckedChanged += new System.EventHandler(this.chkBxAuto_CheckedChanged);
//
// btnReSendTask
//
this.btnReSendTask.Location = new System.Drawing.Point(251, 11);
this.btnReSendTask.Name = "btnReSendTask";
this.btnReSendTask.Size = new System.Drawing.Size(75, 53);
this.btnReSendTask.TabIndex = 3;
this.btnReSendTask.Text = "任务重发";
this.btnReSendTask.UseVisualStyleBackColor = true;
this.btnReSendTask.Click += new System.EventHandler(this.btnReSendTask_Click);
//
// grpBxOperation
//
this.grpBxOperation.Controls.Add(this.flowLayoutPanel1);
this.grpBxOperation.Dock = System.Windows.Forms.DockStyle.Top;
this.grpBxOperation.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.grpBxOperation.Location = new System.Drawing.Point(0, 113);
this.grpBxOperation.Name = "grpBxOperation";
this.grpBxOperation.Size = new System.Drawing.Size(385, 108);
this.grpBxOperation.TabIndex = 2;
this.grpBxOperation.TabStop = false;
this.grpBxOperation.Text = "操作";
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.Controls.Add(this.btnReady);
this.flowLayoutPanel1.Controls.Add(this.btnPause);
this.flowLayoutPanel1.Controls.Add(this.btnClearErr);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.Location = new System.Drawing.Point(3, 17);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(379, 88);
this.flowLayoutPanel1.TabIndex = 0;
//
// btnReady
//
this.btnReady.BackColor = System.Drawing.Color.Lime;
this.btnReady.Location = new System.Drawing.Point(30, 3);
this.btnReady.Margin = new System.Windows.Forms.Padding(30, 3, 5, 3);
this.btnReady.Name = "btnReady";
this.btnReady.Size = new System.Drawing.Size(88, 61);
this.btnReady.TabIndex = 0;
this.btnReady.Text = "运行";
this.btnReady.UseVisualStyleBackColor = false;
this.btnReady.Click += new System.EventHandler(this.btnReady_Click);
//
// btnPause
//
this.btnPause.BackColor = System.Drawing.Color.Red;
this.btnPause.Location = new System.Drawing.Point(153, 3);
this.btnPause.Margin = new System.Windows.Forms.Padding(30, 3, 3, 3);
this.btnPause.Name = "btnPause";
this.btnPause.Size = new System.Drawing.Size(88, 61);
this.btnPause.TabIndex = 1;
this.btnPause.Text = "暂停";
this.btnPause.UseVisualStyleBackColor = false;
this.btnPause.Click += new System.EventHandler(this.btnPause_Click);
//
// btnClearErr
//
this.btnClearErr.BackColor = System.Drawing.Color.Yellow;
this.btnClearErr.Location = new System.Drawing.Point(274, 3);
this.btnClearErr.Margin = new System.Windows.Forms.Padding(30, 3, 3, 3);
this.btnClearErr.Name = "btnClearErr";
this.btnClearErr.Size = new System.Drawing.Size(88, 61);
this.btnClearErr.TabIndex = 2;
this.btnClearErr.Text = "清除错误";
this.btnClearErr.UseVisualStyleBackColor = false;
this.btnClearErr.Click += new System.EventHandler(this.btnClearErr_Click);
//
// grpBxMission
//
this.grpBxMission.Controls.Add(this.btnAssignTask);
this.grpBxMission.Controls.Add(this.cmbBxMission);
this.grpBxMission.Dock = System.Windows.Forms.DockStyle.Top;
this.grpBxMission.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.grpBxMission.Location = new System.Drawing.Point(0, 221);
this.grpBxMission.Name = "grpBxMission";
this.grpBxMission.Size = new System.Drawing.Size(385, 70);
this.grpBxMission.TabIndex = 3;
this.grpBxMission.TabStop = false;
this.grpBxMission.Text = "手动任务";
//
// btnAssignTask
//
this.btnAssignTask.Location = new System.Drawing.Point(216, 12);
this.btnAssignTask.Name = "btnAssignTask";
this.btnAssignTask.Size = new System.Drawing.Size(131, 35);
this.btnAssignTask.TabIndex = 1;
this.btnAssignTask.Text = "发任务";
this.btnAssignTask.UseVisualStyleBackColor = true;
this.btnAssignTask.Click += new System.EventHandler(this.btnAssignTask_Click);
//
// cmbBxMission
//
this.cmbBxMission.FormattingEnabled = true;
this.cmbBxMission.Location = new System.Drawing.Point(12, 20);
this.cmbBxMission.Name = "cmbBxMission";
this.cmbBxMission.Size = new System.Drawing.Size(159, 20);
this.cmbBxMission.TabIndex = 0;
//
// Manual
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(385, 297);
this.Controls.Add(this.grpBxMission);
this.Controls.Add(this.grpBxOperation);
this.Controls.Add(this.grpBxRunMode);
this.Controls.Add(this.panelInfo);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "Manual";
this.Load += new System.EventHandler(this.Manual_Load);
this.panelInfo.ResumeLayout(false);
this.grpBxRunMode.ResumeLayout(false);
this.grpBxRunMode.PerformLayout();
this.grpBxOperation.ResumeLayout(false);
this.flowLayoutPanel1.ResumeLayout(false);
this.grpBxMission.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panelInfo;
private System.Windows.Forms.Label lblInfo;
private System.Windows.Forms.GroupBox grpBxRunMode;
private System.Windows.Forms.CheckBox chkBxAuto;
private System.Windows.Forms.GroupBox grpBxOperation;
private System.Windows.Forms.Button btnReady;
private System.Windows.Forms.Button btnPause;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Button btnReSendTask;
private System.Windows.Forms.Button btnClearErr;
private System.Windows.Forms.GroupBox grpBxMission;
private System.Windows.Forms.Button btnAssignTask;
private System.Windows.Forms.ComboBox cmbBxMission;
}
}
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;
bool isInit = false;
private void Manual_Load(object sender, EventArgs e)
{
lblInfo.Text = string.Format("[{0}]", Agv.IP);
cmbBxMission.Items.AddRange(CommonVar.showNameMissionName.Values.ToArray());
cmbBxMission.SelectedIndex = 0;
isInit = true;
}
private void chkBxAuto_CheckedChanged(object sender, EventArgs e)
{
if (!isInit) return;
this.Invoke(new Action(() =>
{
btnReSendTask.Enabled = chkBxAuto.Checked;
btnAssignTask.Enabled = !chkBxAuto.Checked;
if (!chkBxAuto.Checked)//自动-》手动
{
if (Agv.IsCon)
{
MiR_API.Del_Mission(Agv);
//添加Init任务
Agv.AssignTask(SettingString.Init);
}
CommonVar.Standby.DelOccupyInfo(Agv.Name);
CommonVar.Charge.DelOccupyInfo(Agv.Name);
}
else
{
//if (Agv.IsExistShelf)
//{
// LogUtil.error(string.Format("{0} 车上有负载,无法开启自动模式,请先清空小车负载!", Agv.Name));
// return;
//}
if (MessageBox.Show(this, "是否继续上一次的任务?\r\n" + Agv.Msg, "提示", MessageBoxButtons.YesNo).Equals(DialogResult.No))
{
Agv.CurJob = null;
if (Agv.Place.Equals(SettingString.Standby) || Agv.Place.Equals(SettingString.AutoCharge))
Agv.Place = "";
if (Agv.IsCon)
{
MiR_API.Del_Mission(Agv);
}
Agv.RFID = "";
}
else
{
if (Agv.IsCon)
{
Agv.Resend();
}
}
}
Agv.IsUse = chkBxAuto.Checked;
}));
}
private void btnReSendTask_Click(object sender, EventArgs e)
{
if (Agv.IsCon)
{
if (MessageBox.Show("确定对小车重发任务?", Agv.Name, MessageBoxButtons.YesNo) == DialogResult.No)
return;
Task.Factory.StartNew(new Action(()=> {
MiR_API.Clear_Error(Agv);
System.Threading.Thread.Sleep(1000);
MiR_API.State_Ready(Agv);
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)
{
try
{
var key = CommonVar.showNameMissionName.Where(qq => qq.Value == cmbBxMission.SelectedItem.ToString()).Select(qq => qq.Key);
string taskName = key.ToList()[0];
if(!CommonVar.agvMission.Keys.Contains(taskName))
{
LogUtil.error("无选定任务: "+ taskName);
return;
}
if (taskName.Equals(SettingString.Enter) || taskName.Equals(SettingString.Leave))
if (MessageBox.Show("确定对小车发送进/出任务?", Agv.Name, MessageBoxButtons.YesNo) == DialogResult.No)
return;
Agv.AssignTask(taskName);
Agv.StateKanban.ShowInfo("目的地", "");
LogUtil.info(string.Format("{0} 手动发任务 {1}", Agv.Name, taskName));
}
catch(Exception ex)
{
LogUtil.error("手动发任务 ",ex);
}
}
}
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 \ No newline at end of file
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 System.Windows.Forms;
using DeviceLibrary;
using Common;
namespace AGVControl
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
XmlConfigurator.Configure();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//程序只能运行一次
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process process in processes)
{
if (process.Id == current.Id) continue; //自己
if (process.MainModule.FileName == current.MainModule.FileName)
{
//显示已打开的程序
Window_API.ShowWindow(process.MainWindowHandle, Window_API.SW_RESTORE);
Window_API.SwitchToThisWindow(process.MainWindowHandle, true);
return;
}
}
Start();
Application.Run(new FrmMain());
Stop();
}
private static void Start()
{
LogUtil.info("=====程序开始=====");
ReadConfig();
CommonVar.Charge = new Charge();
CommonVar.Standby = new Standby();
CommonVar.control = new DeviceLibrary.Control();
CommonVar.control.Start();
CommonVar.server = new Agv.Server();
CommonVar.server.Start();
}
private static void Stop()
{
CommonVar.control.Stop();
CommonVar.server.Stop();
LogUtil.info("=====程序结束=====\r\n");
}
private static void ReadConfig()
{
string path;
string[] line;
string[] temp;
bool isuse;
string rfid = "";
CommonVar.agvInfo = new List<Agv_Info>();
path = CommonVar.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 = CommonVar.appConfig.AppSettings.Settings[temp[1]].Value;
bool.TryParse(CommonVar.ReadIni(temp[1], SettingString.IsUse), out isuse); //Convert.ToBoolean(val.Split(',')[0]);
rfid = CommonVar.ReadIni(temp[1], SettingString.RFID); //val.Split(',')[1];
CommonVar.agvInfo.Add(new Agv_Info(temp[0], temp[1], temp[2], temp[3], temp[4], isuse, rfid));
}
CommonVar.agvMission = new Dictionary<string, string>();
CommonVar.showNameMissionName = new Dictionary<string, string>();
path = CommonVar.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;
CommonVar.agvMission.Add(temp[1], temp[2]);
CommonVar.showNameMissionName.Add(temp[1], temp[0]);
}
CommonVar.nodeInfo = new List<Agv.ClientNode>();
path = CommonVar.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 != 3) continue;
Boolean.TryParse(CommonVar.ReadIni(temp[0], SettingString.IsUse), out bool isUse);
CommonVar.nodeInfo.Add(new Agv.ClientNode(temp[0], temp[1],temp[2], isUse));
}
//加载任务类型
CommonVar.jobTypeInfo = new List<JobType>();
//CommonVar.jobTypeInfo.Add(new PackingJobType());
CommonVar.jobTypeInfo.Add(new BoxInJobType());
CommonVar.jobTypeInfo.Add(new BoxOutJobType());
CommonVar.jobTypeInfo.Add(new ChargeJobType());
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
LogUtil.error("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject);
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
LogUtil.error("Application_ThreadException", e.Exception);
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AGVControl-ProductionLine")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AGVControl-ProductionLine")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("e1c3207d-c67d-4b46-a9db-d182f2074ccb")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AGVDispatch.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AGVDispatch.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file \ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AGVDispatch.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
文件属性发生变化
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件类型无法预览
此文件的差异太大,无法显示。
文件属性发生变化
此文件类型无法预览
此文件类型无法预览
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="RestSharp" version="106.11.4" targetFramework="net461" />
</packages>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C6D2FC09-46F7-4EC5-A877-15EA06342E4F}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>AGV_UI</RootNamespace>
<AssemblyName>AGV_UI</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Status.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Status.Designer.cs">
<DependentUpon>Status.cs</DependentUpon>
</Compile>
<Compile Include="Manager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Status.resx">
<DependentUpon>Status.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="battery\charge.png" />
<None Include="state\Unknown.png" />
<None Include="state\ready.png" />
<None Include="state\pause.png" />
<None Include="state\manual.png" />
<None Include="state\Executing.png" />
<None Include="state\Error.png" />
<None Include="state\emergency.png" />
<None Include="state\Aborted.png" />
<None Include="task.png" />
<None Include="online.png" />
<None Include="battery\full.png" />
<None Include="battery\common.png" />
<None Include="battery\low.png" />
<None Include="offline.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file \ No newline at end of file
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AGV_UI
{
class Manager
{
static ImageList connImageList;
static ImageList batteryImageList;
static ImageList stateImageList;
static string OnLine = "OnLine";
static string OffLine = "OffLine";
static string LowBattery = "LowBattery";
static string CommonBattery = "CommonBattery";
static string FullBattery = "FullBattery";
static string ChargeBattery = "ChargeBattery";
static string Ready = "Ready";
static string Pause = "Pause";
static string Executing = "Executing";
static string Done = "Done";
static string Aborted = "Aborted";
static string Invalid = "Invalid";
static string EmergencyStop = "EmergencyStop";
static string ManualControl = "ManualControl";
static string Error = "Error";
static string UNKNOWN = "UNKNOWN";
static void InitconnImageList()
{
connImageList = new ImageList();
connImageList.ImageSize = new System.Drawing.Size(32, 32);
connImageList.Images.Add(OnLine, Properties.Resources.online);
connImageList.Images.Add(OffLine, Properties.Resources.offline);
}
static void InitbatteryImageList()
{
batteryImageList = new ImageList();
batteryImageList.ImageSize = new System.Drawing.Size(48, 48);
batteryImageList.Images.Add(LowBattery, Properties.Resources.low);
batteryImageList.Images.Add(CommonBattery, Properties.Resources.common);
batteryImageList.Images.Add(FullBattery, Properties.Resources.full);
batteryImageList.Images.Add(ChargeBattery, Properties.Resources.charge);
}
static void InitStateImageList()
{
stateImageList = new ImageList();
stateImageList.ImageSize = new System.Drawing.Size(48, 48);
stateImageList.Images.Add(UNKNOWN, Properties.Resources.Unknown);
stateImageList.Images.Add(Ready, Properties.Resources.ready);
stateImageList.Images.Add(Done, Properties.Resources.ready);
stateImageList.Images.Add(Pause, Properties.Resources.pause);
stateImageList.Images.Add(ManualControl, Properties.Resources.manual);
stateImageList.Images.Add(Executing, Properties.Resources.Executing);
stateImageList.Images.Add(Error, Properties.Resources.Error);
stateImageList.Images.Add(EmergencyStop, Properties.Resources.emergency);
stateImageList.Images.Add(Aborted, Properties.Resources.Aborted);
stateImageList.Images.Add(Invalid, Properties.Resources.Aborted);
}
/// <summary>
/// 设置连接状态
/// </summary>
/// <param name="state"></param>
/// <returns></returns>
public static Image SetConnState(bool state = false)
{
string tmp = state ? OnLine : OffLine;
if (connImageList == null)
InitconnImageList();
return connImageList.Images[tmp];
}
/// <summary>
/// 设置电量
/// </summary>
/// <param name="min"></param>
/// <param name="max"></param>
public static object[] SetBattery(int curBattery, bool isCharge = false, int min = 20, int max = 90)
{
if (curBattery < 0) curBattery = 0;
Image image;
if (batteryImageList == null)
InitbatteryImageList();
if (isCharge)
{
image = batteryImageList.Images[ChargeBattery];
}
else
{
if (curBattery < min)
image = batteryImageList.Images[LowBattery];
else if (curBattery < max)
image = batteryImageList.Images[CommonBattery];
else
image = batteryImageList.Images[FullBattery];
}
return new object[] { string.Format("{0}%",curBattery), image };
}
/// <summary>
/// 设置小车状态
/// </summary>
/// <param name="curState"></param>
public static object[] SetAGVState(string curState)
{
Image image;
if (stateImageList == null)
InitStateImageList();
if(stateImageList.Images.ContainsKey(curState))
image = stateImageList.Images[curState];
else
image = stateImageList.Images[UNKNOWN];
return new object[] { curState, image };
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AGVStatus")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AGVStatus")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("c6d2fc09-46f7-4ec5-a877-15ea06342e4f")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AGV_UI.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AGV_UI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Aborted {
get {
object obj = ResourceManager.GetObject("Aborted", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap charge {
get {
object obj = ResourceManager.GetObject("charge", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap common {
get {
object obj = ResourceManager.GetObject("common", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap emergency {
get {
object obj = ResourceManager.GetObject("emergency", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Error {
get {
object obj = ResourceManager.GetObject("Error", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Executing {
get {
object obj = ResourceManager.GetObject("Executing", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap full {
get {
object obj = ResourceManager.GetObject("full", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap low {
get {
object obj = ResourceManager.GetObject("low", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap manual {
get {
object obj = ResourceManager.GetObject("manual", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap offline {
get {
object obj = ResourceManager.GetObject("offline", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap online {
get {
object obj = ResourceManager.GetObject("online", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap pause {
get {
object obj = ResourceManager.GetObject("pause", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap ready {
get {
object obj = ResourceManager.GetObject("ready", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap task {
get {
object obj = ResourceManager.GetObject("task", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap Unknown {
get {
object obj = ResourceManager.GetObject("Unknown", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}
<?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.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="offline" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\offline.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="task" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\task.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="online" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\online.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Aborted" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\Aborted.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="emergency" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\emergency.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Error" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\Error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Executing" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\Executing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="manual" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\manual.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pause" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\pause.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ready" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\ready.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Unknown" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\state\Unknown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="charge" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\battery\charge.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="common" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\battery\common.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="full" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\battery\full.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="low" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\battery\low.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>
\ No newline at end of file \ No newline at end of file
namespace AGV_UI
{
partial class Status
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Status));
this.panelTitle = new System.Windows.Forms.Panel();
this.lblBattery = new System.Windows.Forms.Label();
this.picBxConn = new System.Windows.Forms.PictureBox();
this.lblName = new System.Windows.Forms.Label();
this.panelAGVState = new System.Windows.Forms.Panel();
this.lblAGVState = new System.Windows.Forms.Label();
this.lblTask = new System.Windows.Forms.Label();
this.flowPanelMissionState = new System.Windows.Forms.FlowLayoutPanel();
this.panelTitle.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.picBxConn)).BeginInit();
this.panelAGVState.SuspendLayout();
this.SuspendLayout();
//
// panelTitle
//
this.panelTitle.BackColor = System.Drawing.Color.LightBlue;
this.panelTitle.Controls.Add(this.lblBattery);
this.panelTitle.Controls.Add(this.picBxConn);
this.panelTitle.Controls.Add(this.lblName);
this.panelTitle.Dock = System.Windows.Forms.DockStyle.Top;
this.panelTitle.Location = new System.Drawing.Point(0, 0);
this.panelTitle.Name = "panelTitle";
this.panelTitle.Size = new System.Drawing.Size(287, 47);
this.panelTitle.TabIndex = 0;
//
// lblBattery
//
this.lblBattery.Dock = System.Windows.Forms.DockStyle.Right;
this.lblBattery.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblBattery.ForeColor = System.Drawing.Color.Black;
this.lblBattery.Image = ((System.Drawing.Image)(resources.GetObject("lblBattery.Image")));
this.lblBattery.Location = new System.Drawing.Point(249, 0);
this.lblBattery.Name = "lblBattery";
this.lblBattery.Size = new System.Drawing.Size(38, 47);
this.lblBattery.TabIndex = 2;
this.lblBattery.Text = "0%";
this.lblBattery.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// picBxConn
//
this.picBxConn.Dock = System.Windows.Forms.DockStyle.Left;
this.picBxConn.Image = global::AGV_UI.Properties.Resources.offline;
this.picBxConn.Location = new System.Drawing.Point(0, 0);
this.picBxConn.Name = "picBxConn";
this.picBxConn.Size = new System.Drawing.Size(51, 47);
this.picBxConn.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.picBxConn.TabIndex = 1;
this.picBxConn.TabStop = false;
//
// lblName
//
this.lblName.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblName.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblName.ForeColor = System.Drawing.Color.Black;
this.lblName.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.lblName.Location = new System.Drawing.Point(0, 0);
this.lblName.Name = "lblName";
this.lblName.Size = new System.Drawing.Size(287, 47);
this.lblName.TabIndex = 0;
this.lblName.Text = "#号车";
this.lblName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// panelAGVState
//
this.panelAGVState.Controls.Add(this.lblAGVState);
this.panelAGVState.Controls.Add(this.lblTask);
this.panelAGVState.Dock = System.Windows.Forms.DockStyle.Top;
this.panelAGVState.Location = new System.Drawing.Point(0, 47);
this.panelAGVState.Name = "panelAGVState";
this.panelAGVState.Size = new System.Drawing.Size(287, 50);
this.panelAGVState.TabIndex = 1;
//
// lblAGVState
//
this.lblAGVState.Dock = System.Windows.Forms.DockStyle.Right;
this.lblAGVState.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblAGVState.Image = global::AGV_UI.Properties.Resources.Unknown;
this.lblAGVState.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.lblAGVState.Location = new System.Drawing.Point(160, 0);
this.lblAGVState.Name = "lblAGVState";
this.lblAGVState.Size = new System.Drawing.Size(127, 50);
this.lblAGVState.TabIndex = 1;
this.lblAGVState.Text = "None";
this.lblAGVState.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// lblTask
//
this.lblTask.Dock = System.Windows.Forms.DockStyle.Left;
this.lblTask.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblTask.Image = global::AGV_UI.Properties.Resources.task;
this.lblTask.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.lblTask.Location = new System.Drawing.Point(0, 0);
this.lblTask.Name = "lblTask";
this.lblTask.Size = new System.Drawing.Size(216, 50);
this.lblTask.TabIndex = 0;
this.lblTask.Text = "无任务";
this.lblTask.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// flowPanelMissionState
//
this.flowPanelMissionState.BackColor = System.Drawing.Color.LightBlue;
this.flowPanelMissionState.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowPanelMissionState.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
this.flowPanelMissionState.Location = new System.Drawing.Point(0, 97);
this.flowPanelMissionState.Name = "flowPanelMissionState";
this.flowPanelMissionState.Size = new System.Drawing.Size(287, 230);
this.flowPanelMissionState.TabIndex = 2;
//
// Status
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.flowPanelMissionState);
this.Controls.Add(this.panelAGVState);
this.Controls.Add(this.panelTitle);
this.Name = "Status";
this.Size = new System.Drawing.Size(287, 327);
this.panelTitle.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.picBxConn)).EndInit();
this.panelAGVState.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panelTitle;
private System.Windows.Forms.Label lblName;
private System.Windows.Forms.PictureBox picBxConn;
private System.Windows.Forms.Label lblBattery;
private System.Windows.Forms.Panel panelAGVState;
private System.Windows.Forms.Label lblTask;
private System.Windows.Forms.Label lblAGVState;
private System.Windows.Forms.FlowLayoutPanel flowPanelMissionState;
}
}
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;
namespace AGV_UI
{
public partial class Status : UserControl
{
public Status(string name, List<string> infos)
{
InitializeComponent();
AGVName = name;
missionShow = new Dictionary<string, Control>();
if (infos != null && infos.Count > 0)
{
foreach (var item in infos)
{
missionShow.Add(item, new Label() { Name = item,
Font = new Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))),
AutoSize = true
});
}
flowPanelMissionState.Controls.AddRange(missionShow.Values.ToArray());
}
}
public Status()
{
}
public void Init()
{
foreach (string item in missionShow.Keys)
{
ShowInfo(item, "");
}
SetTitle();
}
public int MaxBattery { get; set; } = 90;
public int MinBattery { get; set; } = 20;
public string AGVName { get; private set; }
#region 私有字段
private Dictionary<string, Control> missionShow;
#endregion
void SetTitle()
{
this.Invoke(new Action(() =>
{
lblName.Text = AGVName;
}
));
}
/// <summary>
/// 设置电量
/// </summary>
/// <param name="curBattery"></param>
/// <param name="isInCharge"></param>
public void SetBattery(int curBattery, bool isInCharge = false)
{
object[] objs = Manager.SetBattery(curBattery, isInCharge, MinBattery, MaxBattery);
try
{
this.Invoke(new Action(() =>
{
if (curBattery < MinBattery)
lblBattery.ForeColor = Color.White;
else
lblBattery.ForeColor = Color.Black;
lblBattery.Text = objs[0] as string;
lblBattery.Image = objs[1] as Image;
}
));
}
catch { }
}
/// <summary>
/// 设置连接状态
/// </summary>
/// <param name="state"></param>
public void SetConnectState(bool state = false)
{
Image image = Manager.SetConnState(state);
this.Invoke(new Action(() =>
{
picBxConn.Image = image;
}
));
}
public void ShowInfo(string key, string info)
{
this.Invoke(new Action(() =>
{
if (missionShow.ContainsKey(key))
missionShow[key].Text = string.Format("{0}:{1}",key, info);
}
));
}
/// <summary>
/// 设置当前任务名称
/// </summary>
/// <param name="taskName"></param>
public void SetCurTask(string taskName)
{
this.Invoke(new Action(() =>
{
lblTask.Text = taskName;
}
));
}
/// <summary>
/// 设置agv当前状态
/// </summary>
/// <param name="curState"></param>
public void SetCurState(string curState)
{
object[] objs = Manager.SetAGVState(curState);
this.Invoke(new Action(() =>
{
lblAGVState.Text = objs[0] as string;
lblAGVState.Image = objs[1] as Image;
}
));
}
}
}
<?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="lblBattery.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAOZJREFUaEPt
ziEOw1AQxNBcrCT3v1NKDA0CxmrBtzRspbfX6XTadd/382ac/1/2rI3z32QPLQfTZehyMF2GLgfTZehy
MF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfT
ZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2GLgfTZehyMF2G
LgfTZehyMF2GLgfT9XyupxxMl6HLwXQZuhxMl6HLwXQZuhzM6XR61XV9AQQ5qN/xmUs6AAAAAElFTkSu
QmCC
</value>
</data>
</root>
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BAFEAFE6-04E2-48EE-8845-BFC7EA3E3C21}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Common</RootNamespace>
<AssemblyName>Common</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net">
<HintPath>.\log4net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>.\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="RestSharp">
<HintPath>.\RestSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="helpers\AppConfigHelper.cs" />
<Compile Include="helpers\IniFileHelper.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SettingString.cs" />
<Compile Include="util\HttpHelper.cs" />
<Compile Include="util\JsonHelper.cs" />
<Compile Include="util\LogUtil.cs" />
<Compile Include="util\MyWebClient.cs">
<SubType>Component</SubType>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file \ No newline at end of file
此文件类型无法预览
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Common")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Common")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("bafeafe6-04e2-48ee-8845-bfc7ea3e3c21")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
此文件类型无法预览
此文件的差异太大,无法显示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Common
{
public static class SettingString
{
public const int AGVCNT = 4;
//任务类型
public const string Move = "Move";
public const string Dock = "Dock";
//任务名称
public const string Init = "Init";
public const string Standby = "Standby";
public const string CheckShelf = "CheckShelf";
public const string Wait = "Wait";
public const string Done = "Done";
public const string Aborted = "Aborted";
public const string Invalid = "Invalid";
public const string AutoCharge = "AutoCharge";
public const string Executing = "Executing";
public const string ChargeThreshold = "ChargeThreshold";
public const string FileName_AGV = "AgvName.csv";
public const string FileName_AgvMission = "AgvMission.csv";
public const string FileName_AgvProductionLine = "AgvProductionLine.csv";
public const string FileName_tempData = "tempData.ini";
public const string IsUse = "IsUse";
public const string RFID = "RFID";
public const string EmptyShelfCnt = "EmptyShelfCnt";
public const string FLEET = "FLEET";
/// <summary>
/// 料架RFID前缀
/// </summary>
public const string ReelString_RFID_Prefix = "B";
public const string http_server = "http_server";
/// <summary>
/// 包装仓出空料架位置
/// </summary>
public const string Enter = "Enter";
public const string Leave = "Leave";
/// <summary>
/// 空料串入口
/// </summary>
public const string A2 = "A2";
/// <summary>
/// 空料串出口
/// </summary>
public const string A1 = "A1";
/// <summary>
/// 上料入口
/// </summary>
public const string A4 = "A4";
/// <summary>
/// 上料出口
/// </summary>
public const string A3 = "A3";
/// <summary>
/// 料仓1入口
/// </summary>
public const string D1 = "D1";
/// <summary>
/// 料仓1出口
/// </summary>
public const string D2 = "D2";
/// <summary>
/// 料仓2入口
/// </summary>
public const string D3 = "D3";
/// <summary>
/// 料仓2出口
/// </summary>
public const string D4 = "D4";
public const string LimitPoints = "LimitPoints";
public const string LocalIP = "LocalIP";
public const string Use_Fleet = "Use_Fleet";
}
}
using System;
using System.Windows.Forms;
using System.Xml;
namespace Common
{
public class AppConfigHelper
{
public static System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
public static string GetValue(string key)
{
if (config.AppSettings.Settings[key] == null)
{
LogUtil.info("未找到配置:" + key + ",请检查配置是否完整!");
return "";
}
else
{
return config.AppSettings.Settings[key].Value;
}
}
public static decimal GetNumValue(string key)
{
decimal a = 0;
//System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (config.AppSettings.Settings[key] == null)
{
LogUtil.error("未找到配置:" + key + ",请检查配置是否完整!");
return a;
}
else
{
{
Decimal.TryParse(config.AppSettings.Settings[key].Value, out a);
}
}
return a;
}
public static int GetIntValue(string key)
{
int a = 0;
//System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (config.AppSettings.Settings[key] == null)
{
LogUtil.error("未找到配置:" + key + ",请检查配置是否完整!");
return a;
}
else
{
{
Int32.TryParse(config.AppSettings.Settings[key].Value, out a);
}
}
return a;
}
public static bool GetBoolValue(string key)
{
bool a = false;
//System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (config.AppSettings.Settings[key] == null)
{
LogUtil.error("未找到配置:" + key + ",请检查配置是否完整!");
return a;
}
else
{
{
bool.TryParse(config.AppSettings.Settings[key].Value, out a);
}
}
return a;
}
public static void SaveValue(string key, int value)
{
SaveValue(key, value.ToString());
}
public static void SaveValue(string key, bool value)
{
SaveValue(key, value.ToString());
}
public static void SaveValue(string key, string value)
{
try
{
if (key.Equals("") || value.Equals(""))
{
return;
}
//增加的内容写在appSettings段下 <add key="RegCode" value="0"/>
//System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (config.AppSettings.Settings[key] == null)
{
SetValue(key, value);
}
else
{
UpdateConfig(key, value);
}
}
catch (Exception ex)
{
LogUtil.error("SaveValue保存配置出错:AppKey=" + key + ",AppValue=" + value + "," + ex.StackTrace);
}
}
/// <summary>
/// 更新配置文件信息
/// </summary>
/// <param name="name">配置文件字段名称</param>
/// <param name="Xvalue">值</param>
private static void UpdateConfig(string name, string Xvalue)
{
try
{
XmlDocument doc = new XmlDocument();
doc.Load(Application.ExecutablePath + ".config");
XmlNode node = doc.SelectSingleNode(@"//add[@key='" + name + "']");
XmlElement ele = (XmlElement)node;
ele.SetAttribute("value", Xvalue);
doc.Save(Application.ExecutablePath + ".config");
}
catch (Exception ex)
{
LogUtil.error("UpdateConfig保存配置出错:name=" + name + ",Xvalue=" + Xvalue + "," + ex.StackTrace);
}
}
///<summary>
///向.config文件的appKey结写入信息AppValue 保存设置
///</summary>
///<param name="AppKey">节点名</param>
///<param name="AppValue">值</param>
private static void SetValue(String AppKey, String AppValue)
{
try
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load(System.Windows.Forms.Application.ExecutablePath + ".config");
XmlNode xNode;
XmlElement xElem1;
XmlElement xElem2;
xNode = xDoc.SelectSingleNode("//appSettings");
xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@key='" + AppKey + "']");
if (xElem1 != null)
xElem1.SetAttribute("value", AppValue);
else
{
xElem2 = xDoc.CreateElement("add");
xElem2.SetAttribute("key", AppKey);
xElem2.SetAttribute("value", AppValue);
xNode.AppendChild(xElem2);
}
xDoc.Save(System.Windows.Forms.Application.ExecutablePath + ".config");
}
catch (Exception ex)
{
LogUtil.error("SetValue保存配置出错:AppKey=" + AppKey + ",AppValue=" + AppValue + "," + ex.StackTrace);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Common
{
public class IniFileHelper
{
[System.Runtime.InteropServices.DllImport("kernel32")]
//section:要读取的段落名
//key: 要读取的键点击打开链接点击打开链接
//defVal: 读取异常的情况下的缺省值
//retVal: key所对应的值,如果该key不存在则返回空值
//size: 值允许的大小
//filePath: INI文件的完整路径和文件名
private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath);
[System.Runtime.InteropServices.DllImport("kernel32")]
//section: 要写入的段落名
//key: 要写入的键,如果该key存在则覆盖写入
//val: key所对应的值
//filePath: INI文件的完整路径和文件名
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
/// <summary>
/// 读取INI文件
/// </summary>
/// <param name="section">项目名称(如 [section] )</param>
/// <param name="skey">键</param>
/// <param name="path">路径</param>
public static string ReadValue(string section, string skey, string path)
{
StringBuilder temp = new StringBuilder(500);
GetPrivateProfileString(section, skey, "", temp, 500, path);
return temp.ToString();
}
/// <summary>
/// 写入ini文件
/// </summary>
/// <param name="section">项目名称</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="path">路径</param>
public static void WriteValue(string section, string key, string value, string path)
{
WritePrivateProfileString(section, key, value, path);
}
}
}
此文件类型无法预览
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Collections;
using System.Net;
using System.Net.Security;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Reflection;
using System.Net.NetworkInformation;
namespace Common
{
public class HttpHelper
{
// public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public static string Post(string url, string paramData)
{
return Post(url, paramData, Encoding.UTF8);
}
//public static bool PingURLIP(string url, int ms=100)
//{
// string[] urlArray = url.Split('/');
// if (urlArray.Length > 3)
// {
// string ip = urlArray[2];
// Ping pingSender = new Ping();
// PingReply reply = pingSender.Send(ip, ms);//第一个参数为ip地址,第二个参数为ping的时间
// if (reply.Status == IPStatus.Success)
// {
// //通
// return true;
// }
// else
// {
// //不通
// return false;
// }
// }
// return true;
//}
/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <param name="operation"></param>
/// <param name="simulate">是否模拟服务器返回结果</param>
/// <returns></returns>
//public static Operation Post(string url, Operation operation, bool simulate)
//{
// try
// {
// ////如果Op=0或者Op=5,先拼Ip,不通不发送
// //if (operation.op < 0 || operation.op.Equals(5))
// //{
// // if (PingURLIP(url, 100).Equals(false))
// // {
// // return null;
// // }
// //}
// if (simulate)
// {//模拟服务器返回
// operation.status = 200;
// operation.data.Clear();
// operation.data.Add("posId", "A001");
// string pos = "D100-111#D102-222#D104-333";
// operation.data.Add("pos", pos);
// if (operation.op == 1 || operation.op == 2)
// {//入库或出库
// string json = JsonHelper.SerializeObject(operation);
// LogUtil.error("模拟HTTP服务器返回出库入库信息:" + json);
// return operation;
// }
// }
// else
// {
// string json = "";
// try
// {
// json = JsonHelper.SerializeObject(operation);
// }
// catch (Exception ex)
// {
// LogUtil.error("JsonHelper.SerializeObject(operation) 出错【operation.op=" + operation.op + "】" + ex);
// }
// string result = Post(url, json);
// if (!string.IsNullOrEmpty(result))
// {
// try
// {
// return JsonHelper.DeserializeJsonToObject<Operation>(result);
// }
// catch (Exception ex)
// {
// LogUtil.error("JsonHelper.DeserializeJsonToObject 出错【result=" + result + "】" + ex);
// }
// }
// }
// }
// catch (Exception ex)
// {
// LogUtil.error("Post 出错【operation.op=" + operation.op + "】:" + ex);
// }
// return null;
//}
public static string LastServerMsg = "";
public static string Post(string url, string paramData, Encoding encoding)
{
//if (PingURLIP(url, 100).Equals(false))
//{
// return null;
//}
if (paramData != "null" && paramData != null)
{
// LogUtil.debug(LOGGER, "HTTP POST to " + url + " \n\t >> " + paramData);
}
string result = "";
if (url.ToLower().IndexOf("https", System.StringComparison.Ordinal) > -1)
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; });
}
try
{
var wc = new MyWebClient(5000);
if (string.IsNullOrEmpty(wc.Headers["Content-Type"]))
wc.Headers.Add("Content-Type", "application/json;charset=UTF-8");
wc.Encoding = encoding;
result = wc.UploadString(url, "POST", paramData);
//LogUtil.info(result);
}
catch (Exception e)
{
LogUtil.error("POST ERROR:" + e.ToString());
}
if (!result.Contains("null") && result.Length != 0)
{
//LogUtil.debug(LOGGER,"receive << " + result);
}
LastServerMsg = DateTime.Now.ToLongTimeString() + " URL:" + url + "\r\n"
+ "发送:" + paramData + "\r\n"
+ "接收:" + result + "\r\n"
;
return result;
}
public static string Get(string url)
{
return Get(url, Encoding.UTF8);
}
public static string Get(string url, Encoding encoding)
{
try
{
LogUtil.debug("HTTP GET FROM: " + url);
var wc = new WebClient { Encoding = encoding };
var readStream = wc.OpenRead(url);
using (var sr = new StreamReader(readStream, encoding))
{
var result = sr.ReadToEnd();
LogUtil.debug("receive << " + result);
return result;
}
}
catch (Exception e)
{
LogUtil.error("HTTP GET ERROR:" + e.Message);
}
return "";
}
}
}
\ No newline at end of file \ No newline at end of file
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
namespace Common
{
/// <summary>
/// Json帮助类
/// </summary>
public class JsonHelper
{
/// <summary>
/// 将对象序列化为JSON格式
/// </summary>
/// <param name="o">对象</param>
/// <returns>json字符串</returns>
public static string SerializeObject(object o)
{
string json = JsonConvert.SerializeObject(o);
return json;
}
/// <summary>
/// 解析JSON字符串生成对象实体
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="json">json字符串(eg.{"ID":"112","Name":"石子儿"})</param>
/// <returns>对象实体</returns>
public static T DeserializeJsonToObject<T>(string json) where T : class
{
JsonSerializer serializer = new JsonSerializer();
StringReader sr = new StringReader(json);
object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T));
T t = o as T;
return t;
}
/// <summary>
/// 解析JSON数组生成对象实体集合
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="json">json数组字符串(eg.[{"ID":"112","Name":"石子儿"}])</param>
/// <returns>对象实体集合</returns>
public static List<T> DeserializeJsonToList<T>(string json) where T : class
{
JsonSerializer serializer = new JsonSerializer();
StringReader sr = new StringReader(json);
object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>));
List<T> list = o as List<T>;
return list;
}
/// <summary>
/// 反序列化JSON到给定的匿名对象.
/// </summary>
/// <typeparam name="T">匿名对象类型</typeparam>
/// <param name="json">json字符串</param>
/// <param name="anonymousTypeObject">匿名对象</param>
/// <returns>匿名对象</returns>
public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject)
{
T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
return t;
}
/// <summary>
///写入JSON文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ts"></param>
/// <param name="fileName"></param>
public static void WriteJson<T>(List<T> ts, string fileName) where T : class
{
try
{
string path = fileName + ".json";
string output = JsonConvert.SerializeObject(ts,Formatting.Indented);
File.WriteAllText(path, output);
}
catch (Exception e)
{
LogUtil.error(e.Message + "/r/n" + e.StackTrace);
}
}
/// <summary>
/// 读取JSON文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ts"></param>
/// <param name="fileName"></param>
public static List<T> ReadJson<T>(string fileName) where T : class
{
try
{
string path =fileName + ".json";
StreamReader streamReader = new StreamReader(path);
string jsonStr = streamReader.ReadToEnd();
List<T> jsonObj = DeserializeJsonToList<T>(jsonStr);
streamReader.Close();
return jsonObj;
}
catch (Exception e)
{
LogUtil.error(e.Message + "/r/n" + e.StackTrace);
return null;
}
}
}
///// <summary>
///// 与服务器通信用对象
///// </summary>
//public class Operation
//{
// private string _cid = "";
// public string cid
// {
// get { return _cid; }
// set { _cid = value; }
// }
// public int seq { get; set; }
// public int op { get; set; }
// public int status { get; set; }
// private string _error = "";
// public string error
// {
// get { return _error; }
// set { _error = value; }
// }
// private Dictionary<string, string> _data = new Dictionary<string,string>();
// public Dictionary<string, string> data {
// get { return _data; }
// set { _data = value; }
// }
//}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using System.Reflection;
using System.Drawing;
namespace Common
{
public class LogUtil
{
public static readonly ILog AIOLog = LogManager.GetLogger("AGVDispatch");
private static LogUtil instance = new LogUtil();
public delegate void ShowLog(string msg,Color color);
public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public static Dictionary<int, DateTime> lastErrorLogTime = new Dictionary<int, DateTime>();
public static System.Windows.Forms.RichTextBox logBox = null;
public static int showCount = 20;
public static bool debug_opened = false;
public static void info(ILog log, string msg)
{
if (log == null)
{
return;
}
log.Info(msg);
AddToBox(msg, Color.Black);
//clear();
}
public static void info(ILog log, string msg, Color color)
{
log.Info(msg);
AddToBox(msg, color);
}
public static void debug(ILog log, string msg, Color color)
{
log.Debug(msg);
if (debug_opened)
{
AddToBox(msg, color);
}
}
public static void debug(ILog log, string msg)
{
log.Debug(msg);
if (debug_opened)
{
AddToBox(msg, Color.Gray);
}
}
public static void error(string errorMsg, int type)
{
if (lastErrorLogTime.ContainsKey(type))
{
TimeSpan span = DateTime.Now - lastErrorLogTime[type];
if (span.TotalSeconds > 10)
{
lastErrorLogTime.Remove(type);
lastErrorLogTime.Add(type, DateTime.Now);
error(LOGGER, errorMsg);
}
}
else
{
lastErrorLogTime.Add(type, DateTime.Now);
error(LOGGER, errorMsg);
}
}
public static void error(ILog log, string errorMsg, Exception ex = null)
{
if (errorMsg.Trim().Equals(""))
{
return;
}
if (ex == null)
{
log.Error(errorMsg);
}
else
{
log.Error(errorMsg, ex);
}
AddToBox(errorMsg, Color.Red);
}
private static void AddToBox(string msg, Color color)
{
try
{
ShowLogPro(msg, color);
}
catch (Exception ex)
{
LOGGER.Error("出错:", ex);
}
}
private static List<string> logList = new List<string>();
public static string LastText = "";
private static void ShowLogPro(string msg, Color color)
{
try
{
if (logList.Count > 0)
{
// logList.RemoveAt(0);
}
if (logList.Count >= showCount)
{
logList.RemoveAt(0);
}
string text = "";
foreach (string str in logList)
{
text += str;
}
System.DateTime now = System.DateTime.Now;
logList.Add(now.ToLongTimeString() + " " + msg + Environment.NewLine);
if (logBox == null)
{
return;
}
LastText = text;
if (logBox.Visible)
{
logBox.Text = text;
// logBox.Focus(); //使文本框获取焦点
logBox.AppendText(now.ToLongTimeString() + " " + msg + Environment.NewLine); //增加文本
TimeSpan span = DateTime.Now - lastTime;
if (span.TotalSeconds > 3000000)
{
lastTime = DateTime.Now;
logBox.Select(logBox.Text.Length, 0); //设置光标的位置到文本尾
logBox.ScrollToCaret(); //滚动到控件光标处
}
}
}
catch (Exception ex)
{
LOGGER.Error("出错:" + ex.ToString());
}
}
private static DateTime lastTime = DateTime.Now;
public static void UpdateLogbox()
{
if (logBox != null && logBox.Visible)
{
logBox.Text = LastText;
TimeSpan span = DateTime.Now - lastTime;
if (span.TotalSeconds > 3000000)
{
lastTime = DateTime.Now;
logBox.Select(logBox.Text.Length, 0); //设置光标的位置到文本尾
logBox.ScrollToCaret(); //滚动到控件光标处
}
}
}
public static void ClearLog()
{
if (logBox != null)
{
LastText = "";
logList.Clear();
logBox.Text = "";
}
}
public static void debug(string msg)
{
debug(LOGGER, msg);
}
public static void error(string errorMsg, Exception ex = null)
{
error(LOGGER, errorMsg, ex);
}
public static void info(string msg)
{
info(LOGGER, msg);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
namespace Common
{
public class MyWebClient:WebClient
{
private int _timeout;
/// <summary>
/// 超时时间(毫秒)
/// </summary>
public int Timeout
{
get
{
return _timeout;
}
set
{
_timeout = value;
}
}
public MyWebClient()
{
this._timeout = 60000;
}
public MyWebClient(int timeout)
{
this._timeout = timeout;
}
protected override WebRequest GetWebRequest(Uri address)
{
var result = base.GetWebRequest(address);
result.Timeout = this._timeout;
return result;
}
}
}
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class AGVManager
{
private static log4net.ILog log = log4net.LogManager.GetLogger("AGVManager");
/// <summary>
/// 小车从B区域离开前检查出库任务是否完成
/// </summary>
/// <param name="rfid"></param>
/// <returns>true:可以离开</returns>
public static bool LeaveCheck(Agv_Info agv, out int taskCount)
{
taskCount = 0;
try
{
//CommonVar.log.Info("URL:" + CommonVar.webService["URL"]);
string url = AppConfigHelper.GetValue(SettingString.http_server) + "rest/api/qisda/device/shelfTaskCount?rfid=" + agv.RFID;
var client = new RestSharp.RestClient(url) { Timeout = -1 };
var request = new RestSharp.RestRequest(RestSharp.Method.GET);
RestSharp.IRestResponse response = client.Execute(request);
string json = response.Content;
log.Debug(agv.Name + " [URL: " + url+"] [Return: " + json+"]");
if (string.IsNullOrWhiteSpace(json)) return true; //可以离开
//{"code":0,"msg":"ok","data":{"taskCount":1,"rfid":"A14"}}不能搬运锁定的料架,到待机位等待
ShelfTaskCount serverResult = JsonHelper.DeserializeJsonToObject<ShelfTaskCount>(json);
if (serverResult == null)
{
log.Error(" 没有收到服务器反馈");
return true;
}
if (serverResult.code != 0) return true;
agv.LeftTaskCnt = serverResult.data.taskCount;
if (serverResult.data.taskCount == 0) //该料架出库完成
{
log.Info(agv.Name+" 料架【" + agv.RFID + "】 无剩余出库任务,serverResult.shelfTaskData.taskCount=" + serverResult.data.taskCount.ToString());
return true;
}
else //该料架的出库任务未完成
{
// foreach (ShelfLockData item in serverResult.data)
// {
taskCount = serverResult.data.taskCount;
log.Info(agv.Name + " [RFID=" + serverResult.data.rfid + "] [taskCount=" + serverResult.data.taskCount + "]");
// }
return false;
}
}
catch (Exception ex)
{
log.Error(ex);
return true;
}
}
private static string Addr_getShelfLockInfo = "/rest/api/qisda/device/getShelfLockInfo"; //包装仓获取料架锁定状态地址
public static bool GetShelfLockInfo(string name,string rfid, List<string> shelfLockNodeNames)
{
string msg = "";
try
{
Dictionary<string, string> paramMap = new Dictionary<string, string>();
paramMap.Add("rfid", rfid);
string server = GetAddr(Addr_getShelfLockInfo, paramMap);
DateTime startTime = DateTime.Now;
string resultStr = HttpHelper.Post(server, "");
log.Info("节点【"+name+ "】 料架锁定状态 " + " 【" + server + "】【" + resultStr + "】");
ShelfLockInfo serverResult = JsonHelper.DeserializeJsonToObject<ShelfLockInfo>(resultStr);
if (serverResult == null)
{
msg = "节点【" + name + "】没有收到服务器反馈";
log.Error(msg);
return false;
}
if (serverResult.data.Count == 0) //该料架未锁定
{
msg = "节点【" + name + "】 料架【" + rfid + "】 没有锁定库位的料";
log.Info(msg);
return false;
}
else //该料架存在锁定库位的料
{
string nodes="";
foreach (ShelfLockData item in serverResult.data)
{
CommonVar.GetNodeNameByAliceName(item.cid,out string nodeName);
int resInt = shelfLockNodeNames.FindIndex(s=>s !=null && s.Equals(nodeName));
if(resInt==-1)
{
shelfLockNodeNames.Add(nodeName);
nodes+="锁定的CID=" + item.cid + ",节点名称=" + nodeName+";";
}
}
log.Info("节点【" + name + "】获取" + rfid+"料仓锁定信息完成:"+nodes);
return true;
}
}
catch (Exception ex)
{
log.Error(ex.Message);
}
return false;
}
private static string Addr_updateDeviceAlarmMsg = "/rest/api/qisda/device/updateDeviceAlarmMsg";
/// <summary>
/// 异常看板
/// </summary>
/// <param name="msgList"></param>
/// <returns></returns>
public static string updateDeviceAlarmMsg(List<AlarmMsg> msgList)
{
string msg = "";
try
{
Dictionary<string, string> paramMap = new Dictionary<string, string>();
string msgListStr = JsonHelper.SerializeObject(msgList);
paramMap.Add("deviceAlarmList", msgListStr);
string server = GetAddr(Addr_updateDeviceAlarmMsg, paramMap);
DateTime startTime = DateTime.Now;
string resultStr = HttpHelper.Post(server, "");
msgList.ForEach(new Action<AlarmMsg>(k => log.Debug("deviceAlarmList " + k.ToString()))); ;
RfidData data = JsonHelper.DeserializeJsonToObject<RfidData>(resultStr);
if (data == null)
{
return msg = " updateDeviceAlarmMsg 没有收到服务器反馈";
}
else if (data.code.Equals(0).Equals(false))
{
return msg = " updateDeviceAlarmMsg 【" + server + "】【" + resultStr + "】" + data.msg;
}
return "";
}
catch (Exception ex)
{
log.Error(ex);
}
return msg;
}
private static string GetAddr(string addr, Dictionary<string, string> paramsMap)
{
string server = AppConfigHelper.GetValue(SettingString.http_server);
if (server.EndsWith("/"))
{
server = server.Substring(0, server.Length - 1);
}
string path = server + addr.Trim() + "?";
foreach (string paramName in paramsMap.Keys)
{
string par = System.Web.HttpUtility.UrlEncode(paramsMap[paramName], System.Text.Encoding.UTF8);
path += paramName + "=" + par + "&";
}
path = path.Substring(0, path.Length - 1);
return path;
}
}
public class ShelfLockInfo
{
//返回: {"code":0,"msg":"ok","data":
//[{"barcode":"S20052301213","cid":"packing-20","rfid":"A12","rfidLoc":"3","lockPos":"4D2001AA0006","lockPosId":"1231"}]}
/// <summary>
/// 返回码,0为正常,其他为异常
/// </summary>
public int code { get; set; }
/// <summary>
/// 消息
/// </summary>
public string msg { get; set; }
public List<ShelfLockData> data { get; set; }
}
public class ShelfLockData
{
/// <summary>
/// 库位中料盘的条码
/// </summary>
public string barcode { get; set; }
/// <summary>
/// 库位中料盘的锁定库位对应的料仓编
/// </summary>
public string cid { get; set; }
/// <summary>
/// 料架RFID
/// </summary>
public string rfid { get; set; }
/// <summary>
/// 料架的库位
/// </summary>
public int rfidLoc { get; set; }
/// <summary>
/// 库位中料盘的锁定库位
/// </summary>
public string lockPos { get; set; }
/// <summary>
/// 料架出库的剩余数量
/// </summary>
public int taskCount { get; set; }
}
/// <summary>
/// 获取料架中的任务数
/// </summary>
public class ShelfTaskCount
{
// {"code":0,"msg":"ok","data":{"taskCount":0,"rfid":"A2"}}
/// <summary>
/// 0为正常,其他为异常
/// </summary>
public int code { get; set; }
/// <summary>
/// 消息
/// </summary>
public string msg { get; set; }
public ShelfTaskData data { get; set; }
}
public struct ShelfTaskData
{
/// <summary>
/// 当前料架剩余任务数(即还有几盘料没放上去)
/// </summary>
public int taskCount { get; set; }
/// <summary>
/// 料架RFID
/// </summary>
public string rfid { get; set; }
}
public class AlarmMsg
{
//>>>name : 异常位置名称
public string name = "";
//>>>msgKey : 异常信息唯一标识
public string msgKey = "";
//>>>msgValue : 异常信息
public string msgValue = "";
public int type;
/// <summary>
/// 异常信息
/// </summary>
/// <param name="name">异常位置名称</param>
/// <param name="key">异常信息唯一标识</param>
/// <param name="value">异常信息</param>
public AlarmMsg(string name, string key, string value,int type=0)
{
this.name = name;
this.msgKey = key;
this.msgValue = value;
this.type = type;
}
public override string ToString()
{
return string.Format("[name:{0},msgKey:{1},msgValue:{2},type:{3}]",name,msgKey,msgValue,type);
}
}
public class RfidData
{
//{"code":0,"msg":"ok","data":"7"}
public int code { get; set; }
public string msg { get; set; }
public Dictionary<string, string> data { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using Common;
using System.Threading;
namespace DeviceLibrary
{
public class AgvServer
{
private bool _loop;
private Socket _server; //服务端
private List<Client> _client; //所有客户端
private Thread tListenClient; //监听客户端连接
public delegate void NodeChangedEvent(int nodeIndex);
public event NodeChangedEvent NodeChanged;
public event NodeChangedEvent NodeOnline;
private static log4net.ILog log = log4net.LogManager.GetLogger("AgvServer");
public AgvServer()
{
}
/// <summary>
/// 开启服务
/// </summary>
public void Start()
{
try
{
log.Info("AGVServer服务启动");
IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(AppConfigHelper.GetValue(SettingString.LocalIP)), 12000);
_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_server.Bind(localEP);
_server.Listen(100);
_loop = true;
_client = new List<Client>();
tListenClient = new Thread(new ThreadStart(ListenClient));
tListenClient.Start();
}
catch (Exception ex)
{
log.Error(ex);
}
}
/// <summary>
/// 停止服务
/// </summary>
public void Stop()
{
_loop = false;
for (int i = 0; i < _client.Count; i++)
{
_client[i].Loop = false;
_client[i].IsConn = false;
_client[i].Socket.Close();
}
_server.Close();
_client = null;
log.Info("AGVServer服务关闭");
}
/// <summary>
/// 更新节点界面
/// </summary>
/// <param name="nodeIndex"></param>
public void NodeRefresh(int nodeIndex)
{
NodeChanged?.Invoke(nodeIndex);
}
/// <summary>
/// 小车到达
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public bool Arrive(string nodeName, string RFID = "")
{
int idx;
int n = 0;
do
{
idx = FindClient(nodeName);
if (idx == -1)
{
LogUtil.error("Arrive: 没有找到" + nodeName);
Thread.Sleep(500);
n++;
}
else
{
n = 10;
}
} while (n < 4);
if (idx == -1) return false;
ClientNode node = new ClientNode(nodeName, RFID, eNodeStatus.Arrive);
log.Info("SendTo " + nodeName + " RFID=" + RFID + " " + eNodeStatus.Arrive);
byte[] buff = Encode(node);
return Send(idx, buff);
}
/// <summary>
/// 小车已准备好
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public bool Ready(string nodeName, string RFID = "")
{
int idx;
int n = 0;
do
{
idx = FindClient(nodeName);
if (idx == -1)
{
LogUtil.error("Ready: 没有找到" + nodeName);
Thread.Sleep(500);
n++;
}
else
{
n = 10;
}
} while (n < 4);
if (idx == -1) return false;
ClientNode node = new ClientNode(nodeName, RFID, eNodeStatus.Ready);
log.Info("SendTo " + nodeName + " RFID=" + RFID + " " + eNodeStatus.Ready);
byte[] buff = Encode(node);
return Send(idx, buff);
}
/// <summary>
/// 关门
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public bool CloseDoor(string nodeName, string RFID = "")
{
int idx;
int n = 0;
do
{
idx = FindClient(nodeName);
if (idx == -1)
{
LogUtil.debug("CloseDoor: 没有找到" + nodeName);
Thread.Sleep(500);
n++;
}
else
{
n = 10;
}
} while (n < 4);
if (idx == -1) return false;
ClientNode node = new ClientNode(nodeName, RFID, eNodeStatus.CloseDoor);
log.Info("SendTo " + nodeName + " RFID=" + RFID + " " + eNodeStatus.CloseDoor);
byte[] buff = Encode(node);
return Send(idx, buff);
}
/// <summary>
/// 需要进入料架
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public bool EnterShelf(Agv_Info info)
{
int idx;
int n = 0;
do
{
idx = FindClient(info.Place);
if (idx == -1)
{
log.Error("没有找到" + info.Place);
Thread.Sleep(500);
n++;
}
else
{
n = 10;
}
} while (n < 4);
if (idx == -1) return false;
ClientNode node = new ClientNode(info.Place, info.RFID, eNodeStatus.EnterShelf);
log.Info("SendTo " + info.Place + " RFID=" + info.RFID + " " + eNodeStatus.EnterShelf);
byte[] buff = Encode(node);
return Send(idx, buff);
}
/// <summary>
/// 监听客户端
/// </summary>
private void ListenClient()
{
while (_loop)
{
try
{
Socket socket = _server.Accept(); //这边会暂停,不需要sleep
IPEndPoint ep = (IPEndPoint)socket.RemoteEndPoint;
Thread listen = new Thread(new ParameterizedThreadStart(ListenNet));
string ip = ep.Address.ToString();
ip += ":" + ep.Port;
log.Info(string.Format("客户端连接:{0}", ip));
//新的客户端
Client client = new Client
{
IP = ip,
Loop = true,
IsConn = true,
Socket = socket,
ListenNet = listen,
nodeName = new List<string>(),
};
//重连后关闭旧连接
int idx = _client.FindIndex(s => s.IP.Equals(ip));
if (idx > -1)
{
_client[idx].IsConn = false;
_client[idx].nodeName.Clear();
_client[idx].Loop = false;
_client[idx].Socket.Close();
_client.RemoveAt(idx);
}
_client.Add(client);
listen.Start(_client.Count - 1);
log.Debug(string.Format("[{0}] 已连接", client.IP));
}
catch (SocketException)
{
//关闭连接,退出阻塞Accept
}
catch (Exception ex)
{
log.Error(ex);
}
}
}
/// <summary>
/// 客户端数据接收
/// </summary>
/// <param name="obj">索引</param>
private void ListenNet(object obj)
{
int sleep = 10;
Client client = _client[(int)obj];
byte[] temp = new byte[200];
int time = 0;
while (client.Loop)
{
Thread.Sleep(sleep);
try
{
if (!client.Loop) break;
if (client.Socket.Available > 0)
{
time = 0;
int count = client.Socket.Receive(temp);
byte[] buff = new byte[count];
Array.Copy(temp, 0, buff, 0, count);
ClientNode node = Decode(buff);
if (node == null)
{
log.Error("命令解析失败: " + HexBuff(buff));
}
else
{
//CommonVar.log.Info("Receive[" + client.IP + "] " + node.ToText());
int idx = client.nodeName.FindIndex(s => s == node.Name);
if (idx == -1) client.nodeName.Add(node.Name);
UpdateNode(node);
}
}
else
{
time += sleep;
if (time > 60000)
{
Offline(client);
log.Debug("[" + client.IP + "] 超过60s没有收到数据,关闭连接");
}
}
}
catch (Exception ex)
{
log.Error(ex);
}
}
}
/// <summary>
/// 编码
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
private byte[] Encode(ClientNode node)
{
byte[] name = System.Text.Encoding.UTF8.GetBytes(node.Name);
byte[] mark = System.Text.Encoding.UTF8.GetBytes(node.Mark);
byte[] rfid = System.Text.Encoding.UTF8.GetBytes(node.RFID);
int count = name.Length + mark.Length + rfid.Length + 7;
int idx = 0;
byte[] buff = new byte[count];
buff[idx++] = 0xAB;
buff[idx++] = Convert.ToByte(name.Length);
Array.Copy(name, 0, buff, idx, name.Length);
idx += name.Length;
buff[idx++] = Convert.ToByte(mark.Length);
Array.Copy(mark, 0, buff, idx, mark.Length);
idx += mark.Length;
buff[idx++] = Convert.ToByte(rfid.Length);
Array.Copy(rfid, 0, buff, idx, rfid.Length);
idx += rfid.Length;
buff[idx++] = (byte)node.GetState();
buff[idx++] = Convert.ToByte(node.Level);
buff[idx++] = 0xBA;
return buff;
}
/// <summary>
/// 解码
/// </summary>
/// <param name="buff"></param>
/// <returns></returns>
private ClientNode Decode(byte[] buff)
{
int idx = 0;
if (buff[idx++] != 0xAB) return null;
byte[] temp1 = new byte[buff[idx++]];
Array.Copy(buff, idx, temp1, 0, temp1.Length);
string name = System.Text.Encoding.UTF8.GetString(temp1);
idx += temp1.Length;
temp1 = new byte[buff[idx++]];
Array.Copy(buff, idx, temp1, 0, temp1.Length);
string mark = System.Text.Encoding.UTF8.GetString(temp1);
idx += temp1.Length;
temp1 = new byte[buff[idx++]];
Array.Copy(buff, idx, temp1, 0, temp1.Length);
string rfid = System.Text.Encoding.UTF8.GetString(temp1);
idx += temp1.Length;
eNodeStatus action = (eNodeStatus)buff[idx++];
ClientLevel level = (ClientLevel)buff[idx++];
ClientNode node = new ClientNode(name, rfid, action, mark, level);
if (buff[idx] != 0xBA)
return null;
return node;
}
private void UpdateNode(ClientNode node)
{
int idx = CommonVar.nodeInfo.FindIndex(s => s.Name == node.Name);
if (idx == -1)
{
log.Error(node.Name + " 不存在");
return;
}
if (!CommonVar.nodeInfo[idx].Online)
{
CommonVar.nodeInfo[idx].Online = true;
NodeOnline?.Invoke(idx);
}
NodeChanged?.Invoke(idx);
if (CommonVar.nodeInfo[idx].CheckNodeStateChanged(node))
{
log.Info("节点状态更新 " + node.StatetText());
NodeChanged?.Invoke(idx);
}
}
private void Offline(Client client)
{
client.Loop = false;
client.IsConn = false;
client.Socket.Close();
for (int i = 0; i < client.nodeName.Count; i++)
{
int idx = CommonVar.nodeInfo.FindIndex(s => s.Name == client.nodeName[i]);
if (idx == -1) continue;
CommonVar.nodeInfo[idx].Offline();
NodeOnline?.Invoke(idx);
}
client.nodeName.Clear();
}
private string HexBuff(byte[] buff)
{
string s = "";
if (buff == null) return s;
for (int i = 0; i < buff.Length; i++)
s += buff[i].ToString("X2") + " ";
return s;
}
/// <summary>
/// 查找客户端
/// </summary>
/// <param name="name">节点名称</param>
/// <returns></returns>
private int FindClient(string name)
{
int index = -1;
for (int i = 0; i < _client.Count; i++)
{
if (_client[i].IsConn)
{
int idx = _client[i].nodeName.FindIndex(a => a == name);
if (idx != -1)
{
index = i;
break;
}
}
}
return index;
}
/// <summary>
/// 发送命令
/// </summary>
/// <param name="idx"></param>
/// <param name="buff"></param>
/// <returns></returns>
private bool Send(int idx, byte[] buff)
{
for (int i = 1; i <= 3; i++)
{
try
{
_client[idx].Socket.Send(buff);
log.Debug("[" + _client[idx].IP + "] " + HexBuff(buff));
return true;
}
catch (Exception ex)
{
log.Error("发送失败" + i + "次:" + ex.Message);
}
Thread.Sleep(100);
}
return false;
}
private class Client
{
public bool Loop;
public string IP;
public bool IsConn;
public List<string> nodeName;
public Socket Socket;
public Thread ListenNet;
}
}
}
\ No newline at end of file \ No newline at end of file
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class Charge
{
/// <summary>
/// 充电站
/// </summary>
public Dictionary<string, string> Station;
public const string AutoCharge1 = "AutoCharge1";
public const string AutoCharge2 = "AutoCharge2";
/// <summary>
/// 充电最大电量,小于该值或大于等待指定时间去充电
/// </summary>
public int BatteryMax { get; set; } = 90;
/// <summary>
/// 充电最小电量,小于该值直接去充电
/// </summary>
public int BatteryMin { get; set; } = 20;
public Charge()
{
Station = new Dictionary<string, string>();
Station.Add(AutoCharge1, "");
Station.Add(AutoCharge2, "");
string s = AppConfigHelper.GetValue(SettingString.ChargeThreshold);
string[] arr = s.Split(',');
BatteryMin = Convert.ToInt32(arr[0]);
BatteryMax = Convert.ToInt32(arr[1]);
}
/// <summary>
/// 在空的充电桩添加占用小车
/// </summary>
/// <param name="chargeName">占用充电桩的名称</param>
/// <returns></returns>
public bool AddOccupyInfo(string chargeName,string agvName)
{
if (agvName.Equals(""))
return false;
if (Station.Keys.Contains(chargeName))
{
Station[chargeName] = agvName;
return true;
}
return false;
}
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)
{
lock(loc)
{
foreach (string item in Station.Keys)
{
if (Station[item].Equals(agv.Name))
{
Station[item] = "";
break;
}
}
}
}
public void ClearAllOccupyInfo()
{
lock(loc)
{
if (Station != null && Station.Count > 0)
{
foreach (var item in Station.Keys)
{
Station[item] = "";
}
}
}
}
public bool HasEmptyChargeStation(Agv_Info agv)
{
lock (loc)
{
//if (SettingString.SingleMission_IP1.Equals(agv.IP))
// return true;
//else
//{
// if (Station[AutoCharge2].Equals(""))
// {
// return true;
// }
//}
foreach (string item in Station.Keys)
{
if (Station[item].Equals(""))
{
return true;
}
}
}
return false;
}
/// <summary>
/// 开始充电任务
/// </summary>
/// <param name="agv"></param>
/// <returns>充电任务结果</returns>
public bool StartCharge(Agv_Info agv)
{
bool rtn;
string log;
agv.Place = "";
lock(loc)
{
foreach (string chargeStation in Station.Keys)
{
if (Station[chargeStation].Equals(""))
{
rtn = agv.AssignTask(chargeStation);
if (rtn)
{
Station[chargeStation] = agv.Name;
agv.Place = SettingString.AutoCharge;
log = string.Format("{0} {1}", agv.Name, chargeStation);
LogUtil.info(log);
MiR_API.State_Ready(agv);
}
else
{
Station[chargeStation] = "";
log = string.Format("{0} {1}失败", agv.Name, chargeStation);
LogUtil.info(log);
}
return true;
}
}
}
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using Common;
namespace DeviceLibrary
{
/// <summary>
/// 公共参数
/// </summary>
public static class CommonVar
{
/// <summary>
/// 节点信息
/// </summary>
public static List<Agv.ClientNode> nodeInfo;
/// <summary>
/// 任务类型
/// </summary>
public static List<JobType> jobTypeInfo;
/// <summary>
/// 小车信息
/// </summary>
public static List<Agv_Info> agvInfo;
public static Agv.Server server;
public static Dictionary<string, string> agvMission;
public static Dictionary<string, string> showNameMissionName;
public static Control control;
private static List<string> msg = new List<string>();
public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
public static Charge Charge;
public static Standby Standby;
public static string ReadIni(string section, string key)
{
return IniFileHelper.ReadValue(section, key, CONFIG_PATH + SettingString.FileName_tempData);
}
public static void WriteIni(string section, string key, string value)
{
IniFileHelper.WriteValue(section, key, value, CONFIG_PATH + SettingString.FileName_tempData);
}
public static bool GetNodeNameByAliceName(string aliceName, out string nodeName)
{
nodeName = "";
int id = nodeInfo.FindIndex(s => s.AliceName.Equals(aliceName));
if (id > -1)
{
nodeName = nodeInfo[id].Name;
return true;
}
else
{
return false;
}
}
public static bool GetLineNameByNodeName(string nodeName, out string lineName)
{
lineName = "";
int id = nodeInfo.FindIndex(s => s.Name.Equals(nodeName));
if (id > -1)
{
lineName = nodeInfo[id].LineName;
return true;
}
else
{
return false;
}
}
/// <summary>
/// 查找节点是否存在以及是否调用
/// </summary>
/// <param name="nodeName">节点名称</param>
/// <returns></returns>
public static int FindNode(string nodeName)
{
int idx = nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.IsUse);
return idx;
}
/// <summary>
/// 移动到节点位置
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool MoveToNode(Agv_Info agv, string nodeName)
{
string log;
//清除目的地
agv.Place = "";
//执行下一个任务
int i = FindNode(nodeName);
bool rtn = agv.AssignTask(SettingString.Move + nodeName);
if (rtn)
{
agv.Place = nodeName;
if (i > -1)
log = string.Format("{0} {1} To Node {2} {3}", agv.Name, SettingString.Move, nodeName,nodeInfo[i].Action);
else
log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Move, nodeName);
LogUtil.info(log);
MiR_API.State_Ready(agv);
}
else
{
log = string.Format("{0} {1} To Node {2} 失败", agv.Name, SettingString.Move, nodeName);
LogUtil.info(log);
}
return rtn;
}
/// <summary>
/// 移动到节点位置
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool DockToNode(Agv_Info agv, string nodeName)
{
string log;
//清除目的地
agv.Place = "";
//执行下一个任务
bool rtn = agv.AssignTask(SettingString.Dock + nodeName);
if (rtn)
{
agv.Place = nodeName;
log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Dock, nodeName);
LogUtil.info(log);
MiR_API.State_Ready(agv);
}
else
{
log = string.Format("{0} {1} To Node {2} 失败", agv.Name, SettingString.Dock, nodeName);
LogUtil.info(log);
}
return rtn;
}
public static bool DoorMission(Agv_Info agv, string doorName)
{
agv.Place = doorName;
return agv.AssignTask(SettingString.Move + doorName);
}
/// <summary>
/// 检查当前移动任务是否结束
/// </summary>
/// <param name="taskName">任务名称</param>
/// <param name="taskGUID">任务GUID</param>
/// <returns></returns>
public static bool CheckTaskMoveFinished(Agv_Info agv, string nodeName, string curTaskState)
{
LogUtil.debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Move + nodeName + " " + curTaskState);
return agvMission[SettingString.Move + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
}
/// <summary>
/// 检查当前停靠任务是否结束
/// </summary>
/// <param name="taskName">任务名称</param>
/// <param name="taskGUID">任务GUID</param>
/// <returns></returns>
public static bool CheckTaskDockFinished(Agv_Info agv, string nodeName, string curTaskState)
{
LogUtil.debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Dock + nodeName + " " + curTaskState);
return agvMission[SettingString.Dock + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
}
/// <summary>
/// 检查充电任务是否分配完成
/// </summary>
/// <param name="taskName"></param>
/// <returns></returns>
public static bool CheckTaskFinished(Agv_Info agv, string taskName)
{
return taskName.Contains(SettingString.AutoCharge) && agv.CurTaskState.Equals(SettingString.Executing);
}
public static bool CheckEnterOrLeaveFinished(Agv_Info agv, string actionName, string curTaskState)
{
LogUtil.debug(agv.Name + " 检查进出料是否结束: " + actionName + " " + curTaskState);
return agvMission[actionName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
}
/// <summary>
/// 判断电量是否够执行任务,默认20
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public static bool CheckCanExecuteMission(Agv_Info agv, int threshold = 20)
{
if (agv.Battery <= threshold)
{
LogUtil.debug(agv.Name + " 电量小于20%,不执行任务,等待充电");
return false;
}
return true;
}
/// <summary>
/// 判断小车是否空闲(充电/待机位)
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public static bool CheckAGVStatusNone(Agv_Info agv)
{
if ((agv.CurJob == null || agv.CurJob is ChargeJob || agv.CurJob is StandyJob) && !agv.IsExistShelf)
return true;
else
return false;
}
/// <summary>
/// 获取Job任务状态
/// </summary>
/// <param name="CurTaskID"></param>
/// <returns></returns>
public static string GetTakJobState(Agv_Info agv)
{
if (!agv.CurTaskID.Equals(-1) && MiR_API.Get_Task_State(agv, out string st))
return st;
return SettingString.Wait;
}
}
public static class Window_API
{
[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
[DllImport("user32.dll ", SetLastError = true)]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
public const int SW_RESTORE = 9;
}
/// <summary>
/// 客户端
/// </summary>
public class Client
{
/// <summary>
/// 循环
/// </summary>
public bool Loop;
/// <summary>
/// IP地址
/// </summary>
public string IP;
/// <summary>
/// 是否连接
/// </summary>
public bool IsConn;
/// <summary>
/// 节点名称集合
/// </summary>
public List<string> nodeName;
/// <summary>
/// 套接字
/// </summary>
public Socket Socket;
/// <summary>
/// 接收数据线程
/// </summary>
public Thread ListenNet;
}
}
\ No newline at end of file \ No newline at end of file
任务别称,任务名称,任务GUID
小车初始化,Init,219cd91a-61da-11eb-96a9-0001297a1dca
待机位,MoveStandby,615cef05-61f4-11eb-96a9-0001297a1dca
充电位1,AutoCharge1,d90853ec-5f06-11eb-9d80-0001297a1dca
小车进料,Enter,ce64c188-61da-11eb-96a9-0001297a1dca
小车出料,Leave,a7220ff0-7927-11eb-9adc-54b2038d1924
空料串线出口,MoveA1,60213bb2-764c-11eb-a016-0001297a1dca
空料串线入口,MoveA2,fa9d938e-764b-11eb-a016-0001297a1dca
上料线出口,MoveA3,60213bb2-764c-11eb-a016-0001297a1dca
上料线入口,MoveA4,fa9d938e-764b-11eb-a016-0001297a1dca
设备1入口,MoveD1,60213bb2-764c-11eb-a016-0001297a1dca
设备1出口,MoveD2,fa9d938e-764b-11eb-a016-0001297a1dca
设备2入口,MoveD3,60213bb2-764c-11eb-a016-0001297a1dca
设备2出口,MoveD4,fa9d938e-764b-11eb-a016-0001297a1dca
产线1,MoveS1,60213bb2-764c-11eb-a016-0001297a1dca
产线2,MoveS2,fa9d938e-764b-11eb-a016-0001297a1dca
\ No newline at end of file \ No newline at end of file
Fleet ID,agv名称,IP,授权码,IOID
1,1号车,10.85.199.18,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==,d38637b1-6150-11eb-b885-0001297a1dca
节点名,别名,线名
A1,A1,空料串线出口-A1
A2,A2,空料串线入口-A2
A3,A3,上料线入口-A3
A4,A4,上料线出口-A4
D1,D1,设备1入口-D1
D2,D2,设备1出口-D2
D3,D3,设备2入口-D3
D4,D4,设备3入口-D4
S1,S1,产线1
S2,S2,产线2
\ No newline at end of file \ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using Common;
using log4net.Util;
using RestSharp;
namespace DeviceLibrary
{
public class Control
{
private System.Timers.Timer AgvCallTimer;
private System.Timers.Timer AgvStateTimer;
public delegate void AgvChangedEvent(int agvIndex);
public delegate void AgvMissionEvent();
public event AgvChangedEvent AgvChanged;
public event AgvChangedEvent AgvOnline;
/// <summary>
/// 限制区域
/// </summary>
public ScopeLimit limitArea;
public Control()
{
AgvCallTimer = new System.Timers.Timer
{
Interval = 500,
AutoReset = true,
Enabled = false
};
AgvCallTimer.Elapsed += AgvCallTimer_Elapsed;
AgvStateTimer = new System.Timers.Timer
{
Interval = 5000,
AutoReset = true,
Enabled = false
};
AgvStateTimer.Elapsed += AgvStateTimer_Elapsed;
string[] limitPoints = AppConfigHelper.GetValue(SettingString.LimitPoints).Split(';');
List<Agv_Info.AgvPosition> clsPositions = new List<Agv_Info.AgvPosition>();
string[] s1;
for (int i = 0; i < limitPoints.Length; i++)
{
s1 = limitPoints[i].Split(',');
clsPositions.Add(new Agv_Info.AgvPosition(double.Parse(s1[0]), double.Parse(s1[1])));
}
limitArea = new ScopeLimit(clsPositions);
}
public void Start()
{
AgvCallTimer.Enabled = true;
AgvStateTimer.Enabled = true;
AgvCallTimer.Start();
AgvStateTimer.Start();
}
public void Stop()
{
AgvCallTimer.Enabled = false;
AgvStateTimer.Enabled = false;
AgvCallTimer.Stop();
AgvStateTimer.Stop();
}
private bool AgvStateInProcess = false;
private void AgvStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
bool rtn;
if (AgvStateInProcess) return;
AgvStateInProcess = true;
for (int i = 0; i < CommonVar.agvInfo.Count; i++)
{
try
{
if (!CheckOnline(i)) continue;
bool change = false;
MiR_API.Get_Task_State(CommonVar.agvInfo[i], out string stateStr);
Thread.Sleep(50);
//获取AGV状态
rtn = MiR_API.Get_State(CommonVar.agvInfo[i], out eAGVState stateID, out string stateText, out int battery, out string mission_text, out Agv_Info.AgvPosition position);
Thread.Sleep(50);
change = CommonVar.agvInfo[i].SetState(stateID, stateStr, battery, mission_text, position);
//更新状态stateID.Equals(eAGVState.Executing)
if (change)
{
AgvChanged?.Invoke(i);
}
}
catch (Exception ex)
{
LogUtil.error("AgvStateTimer_" + CommonVar.agvInfo[i].Name + ex.Message + ex.StackTrace);
}
}
AgvStateInProcess = false;
}
private static object lockGetObj = new object();
/// <summary>
/// 获取任务
/// </summary>
/// <param name="agv_Info"></param>
/// <returns></returns>
public Job GetJob(Agv_Info agv_Info)
{
lock(lockGetObj)
{
foreach (JobType find in CommonVar.jobTypeInfo)
{
Job job = null;
if (agv_Info.IsUse)
{
job = find.GetNewJob(agv_Info);
if (job != null)
{
LogUtil.debug(agv_Info.Name + " GetJob OK " + job.ToString());
return job;
}
}
else
{
return null;
}
}
}
return null;
}
private bool AgvCallInProcess = false;
private void AgvCallTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (AgvCallInProcess) return;
AgvCallInProcess = true;
for (int i = 0; i < CommonVar.agvInfo.Count; i++)
{
try
{
Agv_Info agv = CommonVar.agvInfo[i];
if (!agv.IsCon) continue; //AGV网络连接
if (!CommonVar.agvInfo[i].IsUse) continue; //AGV是否可用
//Ready,Pause,Executing,Error
if (!CommonVar.agvInfo[i].StateID.Equals(eAGVState.Ready) && !CommonVar.agvInfo[i].StateID.Equals(eAGVState.Pause)
&& !CommonVar.agvInfo[i].StateID.Equals(eAGVState.Executing) && !CommonVar.agvInfo[i].StateID.Equals(eAGVState.None))
{
LogUtil.debug(CommonVar.agvInfo[i].Name + " 不可调用 StateID=" + CommonVar.agvInfo[i].StateID.ToString());
continue;
}
if (agv.CurJob == null)
{
Job job = GetJob(agv);
if (job != null)
{
agv.CurJob = job;
}
}
if (agv.CurJob != null)
{
agv.CurJob = agv.CurJob.Execute(agv);
}
}
catch (Exception ex)
{
LogUtil.error("AgvCall " + ex.Message + ex.StackTrace);
}
}
AgvCallInProcess = false;
}
private bool CheckOnline(int idx)
{
bool rtn = MiR_API.CheckIP(CommonVar.agvInfo[idx].IP);
if (rtn)
{
if (CommonVar.agvInfo[idx].IsCon)
{
LogUtil.debug(CommonVar.agvInfo[idx].Name + " Online");
}
else
{
CommonVar.agvInfo[idx].IsCon = true;
LogUtil.info(CommonVar.agvInfo[idx].Name + " Online");
AgvOnline?.Invoke(idx);
}
}
else
{
if (CommonVar.agvInfo[idx].IsCon)
{
CommonVar.agvInfo[idx].IsCon = false;
LogUtil.info(CommonVar.agvInfo[idx].Name + " Offline");
AgvOnline?.Invoke(idx);
}
else
{
LogUtil.debug(CommonVar.agvInfo[idx].Name + " Offline");
}
}
return rtn;
}
}
}
\ No newline at end of file \ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{F9619F07-15F1-4E59-A383-3871952BBB79}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DeviceLibrary</RootNamespace>
<AssemblyName>DeviceLibrary</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Agv">
<HintPath>..\AGVDispatch\dll\Agv.dll</HintPath>
</Reference>
<Reference Include="Agv.Server">
<HintPath>..\AGVDispatch\dll\Agv.Server.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>.\log4net.dll</HintPath>
</Reference>
<Reference Include="RestSharp">
<HintPath>.\RestSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AGVManager.cs" />
<Compile Include="bean\Agv_Info.cs" />
<Compile Include="bean\Job.cs" />
<Compile Include="bean\JobStep.cs" />
<Compile Include="bean\JobType.cs" />
<Compile Include="bean\jobType\ChargeJobType.cs" />
<Compile Include="bean\jobType\BoxInJobType.cs" />
<Compile Include="bean\jobType\BoxOutJobType.cs" />
<Compile Include="bean\job\ChargeJob.cs" />
<Compile Include="bean\job\GetShelfJob.cs" />
<Compile Include="bean\job\GetFullShelfJob.cs" />
<Compile Include="bean\job\SendFullShelfJob.cs" />
<Compile Include="bean\job\RecycleEmptyShelf.cs" />
<Compile Include="bean\job\SendShelfJob.cs" />
<Compile Include="bean\job\StandyJob.cs" />
<Compile Include="Charge.cs" />
<Compile Include="CommonVar.cs" />
<Compile Include="Control.cs" />
<Compile Include="DisplayBoard.cs" />
<Compile Include="bean\MiR_API.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ScopeLimit.cs" />
<Compile Include="Standby.cs" />
</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>
</ItemGroup>
<ItemGroup>
<None Include="Config\AgvMission.csv">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Config\AgvName.csv">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Config\AgvProductionLine.csv">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file \ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class DisplayBoard
{
/// <summary>
/// 异常列表
/// </summary>
public List<AlarmMsg> MsgList { get; private set; }
/// <summary>
/// 看板类
/// </summary>
public DisplayBoard()
{
MsgList = new List<AlarmMsg>();
}
/// <summary>
/// 添加上报信息
/// </summary>
/// <param name="name"></param>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="type">默认类型是异常,1表示正常信息</param>
public void Add(string name, string key, string value, int type = 0)
{
MsgList.Add(new AlarmMsg(name, key, value, type));
}
private void ClearAlram()
{
if (MsgList != null && MsgList.Count > 0)
MsgList.Clear();
}
public void UpdateAlarmMsg()
{
if (MsgList != null && MsgList.Count > 0)
{
AGVManager.updateDeviceAlarmMsg(MsgList);
ClearAlram();
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("DeviceLibrary")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DeviceLibrary")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("f9619f07-15f1-4e59-a383-3871952bbb79")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
此文件类型无法预览
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace DeviceLibrary
{
public class ScopeLimit
{
List<string> agvIPs;
//不规则图像坐标
List<Agv_Info.AgvPosition> positions;
Thread threadPoll;//监控线程
/// <summary>
/// 区域是否可用
/// </summary>
public bool Available { get; private set; } = true;
public delegate void ScopeLimitStateChangedEventHandler(string ip, bool state);
public event ScopeLimitStateChangedEventHandler ScopeLimitStateChangedEvent;
public ScopeLimit(List<Agv_Info.AgvPosition> positions)
{
agvIPs = new List<string>();
agvIPs.AddRange(new string[]
{
"10.85.199.68",
"10.85.199.69",
"10.85.199.70",
"10.85.199.71",
"10.85.199.72",
"10.85.199.73",
"10.85.199.74",
"10.85.199.80",
"10.85.199.81",
"10.85.199.114"
});
this.positions = positions;
threadPoll = new Thread(ScopeDetecting);
threadPoll.IsBackground = true;
threadPoll.Start();
}
private void ScopeDetecting()
{
bool rtn;
while (true)
{
Thread.Sleep(5000);
List<string> agvs = new List<string>();
foreach (string ip in agvIPs)
{
Thread.Sleep(1000);
rtn = MiR_API.Get_Position(ip, CommonVar.agvInfo[0].Authorization, out Agv_Info.AgvPosition position);
if (rtn)
{
if (IsInPolygon(position, positions))
{
agvs.Add(ip);
}
}
}
if (agvs.Count > 0)
{
Available = false;
ScopeLimitStateChangedEvent?.Invoke(string.Join(";", agvs), Available);
}
else //不在限制区域
{
if (!Available)
{
Available = true;
ScopeLimitStateChangedEvent?.Invoke("", Available);
}
}
}
}
/// <summary>
/// 判断点是否在多边形内.
/// ----------原理----------
/// 注意到如果从P作水平向左的射线的话,如果P在多边形内部,那么这条射线与多边形的交点必为奇数,
/// 如果P在多边形外部,则交点个数必为偶数(0也在内)。
/// </summary>
/// <param name="checkPoint">要判断的点</param>
/// <param name="polygonPoints">多边形的顶点</param>
/// <returns></returns>
bool IsInPolygon(Agv_Info.AgvPosition checkPoint, List<Agv_Info.AgvPosition> polygonPoints)
{
bool inside = false;
int pointCount = polygonPoints.Count;
Agv_Info.AgvPosition p1, p2;
for (int i = 0, j = pointCount - 1; i < pointCount; j = i, i++)//第一个点和最后一个点作为第一条线,之后是第一个点和第二个点作为第二条线,之后是第二个点与第三个点,第三个点与第四个点...
{
p1 = polygonPoints[i];
p2 = polygonPoints[j];
if (checkPoint.y < p2.y)
{//p2在射线之上
if (p1.y <= checkPoint.y)
{//p1正好在射线中或者射线下方
if ((checkPoint.y - p1.y) * (p2.x - p1.x) > (checkPoint.x - p1.x) * (p2.y - p1.y))//斜率判断,在P1和P2之间且在P1P2右侧
{
//射线与多边形交点为奇数时则在多边形之内,若为偶数个交点时则在多边形之外。
//由于inside初始值为false,即交点数为零。所以当有第一个交点时,则必为奇数,则在内部,此时为inside=(!inside)
//所以当有第二个交点时,则必为偶数,则在外部,此时为inside=(!inside)
inside = (!inside);
}
}
}
else if (checkPoint.y < p1.y)
{
//p2正好在射线中或者在射线下方,p1在射线上
if ((checkPoint.y - p1.y) * (p2.x - p1.x) < (checkPoint.x - p1.x) * (p2.y - p1.y))//斜率判断,在P1和P2之间且在P1P2右侧
{
inside = (!inside);
}
}
}
return inside;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class Standby
{
/// <summary>
/// 待机位
/// </summary>
public List<string> Station;
private const int Station_CNT = 4;
public Standby()
{
Station = new List<string>();
Station.AddRange(new string[Station_CNT]);
}
/// <summary>
/// 在空的待机位添加占用小车
/// </summary>
/// <param name="standName">占用待机位的名称</param>
/// <returns></returns>
public bool AddOccupyInfo(string standName)
{
if (standName.Equals(""))
return false;
int i = Station.FindIndex(s => (s == null || s.Equals("")));
if (i > -1)
{
Station[i] = standName;
return true;
}
return false;
}
/// <summary>
/// 清除占用信息
/// </summary>
/// <param name="standName"></param>
/// <returns></returns>
public bool DelOccupyInfo(string standName)
{
if (standName.Equals(""))
return false;
int i = Station.FindIndex(s => s != null && s.Equals(standName));
if (i > -1)
{
Station[i] = "";
return true;
}
return false;
}
public void ClearAllInfo()
{
if (Station != null && Station.Count > 0)
{
Station.Clear();
Station = new List<string>();
Station.AddRange(new string[Station_CNT]);
}
}
public string GetInfoByID(int index)
{
if (Station ==null ||index<0 || index >= Station_CNT || Station[index] ==null)
return "";
else
return Station[index];
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using Common;
namespace DeviceLibrary
{
public class Agv_Info
{
/// <summary>
/// 小车名称
/// </summary>
public string Name { private set; get; }
/// <summary>
/// 小车在FLEET中的ID号
/// </summary>
public string Fleet_IP { private set; get; }
/// <summary>
/// IP地址
/// </summary>
public string IP { private set; get; }
/// <summary>
/// IO模块GUID
/// </summary>
public string IOID { private set; get; }
/// <summary>
/// 授权码
/// </summary>
public string Authorization { private set; get; }
/// <summary>
/// 当前架子的RFID
/// </summary>
public string RFID { set; get; }
public int LeftTaskCnt { get; set; }
/// <summary>
/// 是否在线
/// </summary>
public bool IsCon
{
set
{
if (!value.Equals(isCon))
{
isCon = value;
StateKanban.SetConnectState(isCon);
}
}
get { return isCon; }
}
private bool isCon = false;
/// <summary>
/// 是否可用
/// </summary>
private bool _IsUse = true;
/// <summary>
/// 是否调用
/// </summary>
public bool IsUse
{
set
{
if (!value.Equals(_IsUse))
{
_IsUse = value;
CommonVar.WriteIni(Name, SettingString.IsUse, _IsUse.ToString());
}
}
get { return _IsUse; }
}
/// <summary>
/// 地点
/// </summary>
public string Place { set; get; }
/// <summary>
/// 地点
/// </summary>
public string PlaceAliceName { set; get; } = "";
/// <summary>
/// 小车的状态ID,(从小车获取)
/// </summary>
public eAGVState StateID { private set; get; }
/// <summary>
/// 负载
/// </summary>
public bool IsExistShelf { set; get; } = false;
/// <summary>
/// 电量百分比,(从小车获取)
/// </summary>
public int Battery { private set; get; }
/// <summary>
/// 当前任务文本,(从小车获取)
/// </summary>
public string MissionText { set; get; } = "";
public class AgvPosition
{
public double orientation { get; set; }
public double x { get; set; }
public double y { get; set; }
public AgvPosition() { }
public AgvPosition(double x, double y)
{
this.x = x;
this.y = y;
}
}
/// <summary>
/// 当前位置
/// </summary>
public AgvPosition Position;
/// <summary>
/// 任务内容
/// </summary>
public string Msg
{
get;
set;
} = "";
/// <summary>
/// 当前任务
/// </summary>
public Job CurJob { get; set; }
/// <summary>
/// 当前任务的ID号
/// </summary>
public int CurTaskID { get; set; } = -1;
public string CurTaskState { get; set; } = "";
/// <summary>
/// 当前任务名称
/// </summary>
public string CurTaskName { get; set; }
/// <summary>
/// 当前任务的GUID
/// </summary>
public string CurTaskGUID { get; set; }
/// <summary>
/// 看板信息
/// </summary>
private DisplayBoard displayBoard;
/// <summary>
/// 任务重发
/// </summary>
public void Resend()
{
if (CurJob != null)
{
CurJob.ResendTask(this);
}
}
/// <summary>
/// 停在同一处超时
/// </summary>
private bool standTimeOut = false;
/// <summary>
/// 离线超时
/// </summary>
private bool offlineTimeOut = false;
public AGV_UI.Status StateKanban;
public bool Use_Fleet = AppConfigHelper.GetBoolValue(SettingString.Use_Fleet);
public Agv_Info(string id, string name, string ip, string authorization, string ioID, bool isUse, string rfid)
{
Fleet_IP = id;
Name = name;
IP = ip;
Authorization = authorization;
IOID = ioID;
RFID = rfid;
IsCon = false;
_IsUse = isUse;
Place = "";
Msg = "";
Position = new Agv_Info.AgvPosition();
displayBoard = new DisplayBoard();
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;
int OfflineLastTimeSeconds = 30;
DateTime standStartTime = DateTime.MaxValue;
DateTime offlineStartTime = DateTime.MaxValue;
/// <summary>
/// 设置状态
/// </summary>
/// <param name="stateID"></param>
/// <param name="stateText"></param>
/// <param name="battery"></param>
/// <param name="missionText"></param>
/// <param name="position"></param>
/// <returns></returns>
public bool SetState(eAGVState stateID, string stateText, int battery, string missionText, AgvPosition 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] &&
if (reachIoValue)
{
//满足给定的IO值,计算持续时间
if (IoStartTime == DateTime.MaxValue)
{
IoStartTime = DateTime.Now;
}
if (IoLastTime > 0)
{
//持续时间
TimeSpan lastTimeSpan = DateTime.Now - IoStartTime;
IsExistShelf = (lastTimeSpan.TotalMilliseconds >= IoLastTime);
}
}
else
{
//重新计时
IoStartTime = DateTime.MinValue;
IsExistShelf = input[3];
}
}
if (!StateID.Equals(stateID) || !CurTaskState.Equals(stateText) || !Battery.Equals(battery)
|| !MissionText.Equals(missionText) || !IsExistShelf.Equals(preShelfState))
isChange = true;
if(!StateID.Equals(stateID))
{
StateID = stateID;
StateKanban.ShowInfo("状态", stateID.ToString());
}
if (!CurTaskState.Equals(stateText))
{
CurTaskState = stateText;
StateKanban.SetCurState(stateText);
}
if (!Battery.Equals(battery))
{
Battery = battery;
StateKanban.SetBattery(battery);
}
//"目的地", "RFID", "负载", "运行模式","任务信息", "AGV运行信息"
if (CommonVar.nodeInfo != null && CommonVar.nodeInfo.Count != 0)
{
Agv.ClientNode node = CommonVar.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("任务信息", Msg);
if (!MissionText.Equals(missionText))
{
MissionText = missionText;
StateKanban.ShowInfo("AGV运行信息", missionText);
}
CheckOfflineTimeOut();
CheckStandTimeOut(position);
UpdateDisplayBoard();
return isChange;
}
/// <summary>
/// 将信息添加到看板
/// </summary>
/// <param name="name">名字显示</param>
/// <param name="key">关键字</param>
/// <param name="value">值</param>
/// <param name="type">上报类型,默认0是异常;1是正常</param>
public void AddDisplayBoard(string name, string key, string value, int type = 0)
{
displayBoard.Add(name, "Agv." + Name + "." + key, value, type);
}
private void UpdateDisplayBoard()
{
bool isAlarm = false;
try
{
if (offlineTimeOut)
{
isAlarm = true;
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "离线" + (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2") + "秒");
}
else if (standTimeOut)
{
isAlarm = true;
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "在" + PlaceAliceName + "停留超时" + (DateTime.Now - standStartTime).TotalMinutes.ToString("f2") + "分钟");
}
else if (StateID.Equals(eAGVState.Error) || StateID.Equals(eAGVState.EmergencyStop) || StateID.Equals(eAGVState.Pause))
{
isAlarm = true;
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", "状态:" + StateID.ToString());
}
if (!isAlarm)
{
if (!Msg.Equals(""))
displayBoard.Add(Name, "lineAgv." + Name + ".Msg", Msg, 1);
else
{
if ((Place.Contains(SettingString.AutoCharge) || Place.Contains(SettingString.Standby)))
{
displayBoard.Add(Name, "lineAgv." + Name + ".Place", Place, 1);
}
}
}
displayBoard.UpdateAlarmMsg();
}
catch (Exception ex)
{
LogUtil.error(Name + "上报小车信息失败" + ex.Message + ex.StackTrace);
}
}
/// <summary>
/// 检查小车是否离线超时
/// </summary>
/// <returns></returns>
private void CheckOfflineTimeOut()
{
if (CurJob != null && !(CurJob is ChargeJob) && !IsCon)
{
//满足条件,计算持续时间
if (offlineStartTime == DateTime.MaxValue)
{
offlineStartTime = DateTime.Now;
}
TimeSpan lastTimeSpan = DateTime.Now - offlineStartTime;
offlineTimeOut = (lastTimeSpan.TotalSeconds >= OfflineLastTimeSeconds);
}
else
{
offlineTimeOut = false;
if ((DateTime.Now - offlineStartTime).TotalSeconds > OfflineLastTimeSeconds)
//LogUtil.error(string.Format("{0} 在{1}离线{2}秒", Name, PlaceAliceName, (DateTime.Now - offlineStartTime).TotalSeconds.ToString("f2")));
offlineStartTime = DateTime.Now;
}
}
/// <summary>
/// 检查小车是否在原地停留超时
/// </summary>
/// <returns></returns>
private void CheckStandTimeOut(AgvPosition position)
{
if (IsUse && CurJob != null && !(CurJob is ChargeJob) &&
(!CurTaskName.Contains(SettingString.Standby)))//!CurTaskName.Contains(SettingString.AutoCharge) ||
{
if (Math.Abs(position.x - Position.x) < 1 && Math.Abs(position.y - Position.y) < 1)
{
//满足条件,计算持续时间
if (standStartTime == DateTime.MaxValue)
{
standStartTime = DateTime.Now;
}
TimeSpan lastTimeSpan = DateTime.Now - standStartTime;
standTimeOut = (lastTimeSpan.TotalMinutes >= StandLastTimeMinute);
}
else
{
//重新计时
standStartTime = DateTime.Now;
standTimeOut = false;
}
}
else if (CurJob != null && (CurJob is ChargeJob))
{
standTimeOut = false;
standStartTime = DateTime.Now;
}
else
{
standTimeOut = false;
standStartTime = DateTime.Now;
}
Position = position;
}
public string[] ToRow()
{
//AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
List<string> s = new List<string>();
s.Add(Name);
s.Add(IP);
s.Add(StateID.ToString());
s.Add(CurTaskID.ToString());
s.Add(CurTaskName);
s.Add(CurTaskState);
//s.Add(Msg);
// s.Add(MissionText);
if (CommonVar.nodeInfo != null && CommonVar.nodeInfo.Count != 0)
{
Agv.ClientNode node = CommonVar.nodeInfo.Find(ss => ss.Name == Place);
if (node != null)
PlaceAliceName = node.AliceName;
else
PlaceAliceName = Place;
}
s.Add(PlaceAliceName);
s.Add(IsExistShelf ? "满载" : "空载");
s.Add(IsCon ? "在线" : "离线");
s.Add(Battery + "%");
s.Add(IsUse ? "是" : "否");
return s.ToArray();
}
/// <summary>
/// 给小车分配任务
/// </summary>
public bool AssignTask(string taskName)
{
bool rtn=false;
if (Use_Fleet)
{
rtn = MiR_API.Add_Mission_Fleet(this, CommonVar.agvMission[taskName]);
}
else
{
rtn = MiR_API.Add_Mission(this, CommonVar.agvMission[taskName]);
}
if (rtn)
{
LogUtil.info(string.Format("{0} 分配{1}任务完成", Name, taskName));
}
else
{
LogUtil.info(string.Format("{0} 分配{1}任务失败", Name, taskName));
}
StateKanban.SetCurTask(CommonVar.showNameMissionName[taskName]);
MiR_API.State_Ready(this);
return rtn;
}
/// <summary>
/// 删除当前小车所有任务/Fleet任务里的尽快任务
/// </summary>
/// <param name="id">删除fleet任务时用到,删除尽快里面的任务</param>
public void DeleteAllTask(string id = "")
{
if (Use_Fleet)
{
MiR_API.Del_Mission_Fleet(this, id);
}
else
{
MiR_API.Del_Mission(this);
}
}
}
/// <summary>
/// MIR 状态,与状态ID对应
/// </summary>
public enum eAGVState
{
None = 0,
Starting,
ShuttingDown,
Ready,
Pause,
Executing,
Aborted,
Completed,
Docked,
Docking,
EmergencyStop,
ManualControl,
Error,
UNKNOWN
}
}
using Common;
namespace DeviceLibrary
{
public abstract class Job
{
/// <summary>
/// 是否任务正在执行,防止任务执行时间过长产生多线程问题
/// </summary>
public bool IsProcess { get; set; }
/// <summary>
/// 运行信息
/// </summary>
public abstract string RunInfo { get; }
/// <summary>
/// 根据任务状态继续执行任务
/// </summary>
public abstract Job Execute(Agv_Info agv);
public int CurTaskID { get; set; } = -1;
/// <summary>
/// 当前的任务名称(与任务GUID对应)
/// </summary>
public string CurTaskName { get; set; } = "";
/// <summary>
/// 当前任务的执行状态
/// </summary>
public string CurTaskState { get; set; } = "Wait";
/// <summary>
/// 更新任务信息
/// </summary>
/// <param name="curTaskName"></param>
/// <param name="curTaskId"></param>
protected void UpdateJobTaskInfo(Agv_Info agv)
{
CurTaskID = agv.CurTaskID;
CurTaskName = agv.CurTaskName;
//CurTaskState = SettingString.Wait;
CurTaskState = CommonVar.GetTakJobState(agv);
}
/// <summary>
/// 任务重发
/// </summary>
/// <returns></returns>
public bool ResendTask(Agv_Info agv)
{
bool rtn = false;
if (!CurTaskID.Equals(-1) && MiR_API.Get_Task_State(agv, out string stateStr))
{
if (stateStr.Equals(SettingString.Aborted) || stateStr.Equals(SettingString.Invalid))
{
rtn = agv.AssignTask(CurTaskName);
if (rtn)
{
UpdateJobTaskInfo(agv);
return true;
}
}
}
else if (!CurTaskName.Equals("") && !CommonVar.agvMission[CurTaskName].Equals(agv.CurTaskGUID))//Job的当前任务与agv最新任务不一致
{
rtn = agv.AssignTask(CurTaskName);
if (rtn)
{
UpdateJobTaskInfo(agv);
return true;
}
}
else if (CurTaskID.Equals(-1))//任务发送失败,重新发送
{
rtn = agv.AssignTask(CurTaskName);
if (rtn)
{
UpdateJobTaskInfo(agv);
return true;
}
}
return false;
}
}
}

using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class JobStep<T> where T : Enum
{
private T step;
private string msg = "";
public string Msg
{
get { return msg; }
set
{
if (!string.IsNullOrEmpty(value))
{
value = step.ToString() + ":" + value;
//不为空,且与上一个消息不一样才打印
if (!value.Equals(msg))
{
LogUtil.info(value);
}
}
msg = value;
}
}
private DateTime startTime = DateTime.Now;
public JobStep(T initStep)
{
this.step = initStep;
this.msg = "";
}
/// <summary>
/// 当前步骤是否是某个步骤
/// </summary>
/// <param name="step"></param>
/// <returns></returns>
public bool IsStep(T step)
{
return this.step.Equals(step);
}
/// <summary>
/// 是否超时
/// </summary>
/// <param name="timeOutMilliseconds"></param>
/// <returns></returns>
public bool IsTimeOut(int timeOutMilliseconds,out double timeOutValue)
{
timeOutValue = 0;
TimeSpan span = DateTime.Now - startTime;
if (span.TotalMilliseconds > timeOutMilliseconds)
{
timeOutValue = span.TotalSeconds;
return true;
}
return false;
}
/// <summary>
/// 进入下一个步骤
/// </summary>
/// <param name="nextStep"></param>
public void ToNextStep(T nextStep)
{
step = nextStep;
startTime = DateTime.Now;
}
public void ResetStartTime()
{
startTime = DateTime.Now;
}
public string CurStep()
{
return step.ToString();
}
}
}
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public class JobType
{
public JobType()
{
}
public virtual Job GetNewJob(Agv_Info agv)
{
return null;
}
/// <summary>
/// 需要离开料架
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
/// <param name="rfid"></param>
/// <param name="empty">料架类型</param>
/// <returns></returns>
public static bool FindNeedLeave(Agv_Info agv, string nodeName, out string rfid, bool empty)
{
rfid = "";
int nodeIdx = CommonVar.FindNode(nodeName);
if (nodeIdx > -1)
{
if (!empty)
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedLeave) && s.Shelf.Equals(Agv.ClientShelf.Full));
else
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedLeave));
if (nodeIdx > -1)
{
if (CommonVar.nodeInfo[nodeIdx].RFID.StartsWith(SettingString.ReelString_RFID_Prefix))
{
rfid = CommonVar.nodeInfo[nodeIdx].RFID;
return true;
}
else
{
agv.AddDisplayBoard(nodeName, "Using." + nodeName, "出口为出料任务,但是RFID状态异常:rfid="+ CommonVar.nodeInfo[nodeIdx].RFID);
}
}
}
else
{
agv.AddDisplayBoard(nodeName, "Using." + nodeName, "调用关闭");
}
return false;
}
/// <summary>
/// 需要进入料架
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
/// <param name="empty">料架类型</param>
/// <returns></returns>
static bool FindNeedEnter(Agv_Info agv, string nodeName, bool empty)
{
int nodeIdx = CommonVar.FindNode(nodeName);
if (nodeIdx > -1)
{
if (empty)
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedEnter) &&
(s.Shelf.Equals(Agv.ClientShelf.Empty) || s.Shelf.Equals(Agv.ClientShelf.None)));
else
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedEnter) &&
s.Shelf.Equals(Agv.ClientShelf.Full));
if (nodeIdx > -1)
return true;
}
else
{
agv.AddDisplayBoard(nodeName, "Using." + nodeName, "调用关闭");
}
return false;
}
/// <summary>
/// 寻找需要进料架[满/空]的节点
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
/// <param name="empty">需要的料架类型,默认是空料架</param>
/// <returns></returns>
public static bool FindNeedEnterMission(Agv_Info agv, string nodeName, bool empty)
{
if (FindNeedEnter(agv, nodeName, empty))
{
int idx = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null &&
(
s.CurJob is SendShelfJob && (((SendShelfJob)s.CurJob).TargetPlace.Equals(nodeName)) ||
s.CurJob is RecycleEmptyShelf && (((RecycleEmptyShelf)s.CurJob).TargetPlace.Equals(nodeName))
));
if (idx == -1)
{
LogUtil.debug(string.Format("{0} FindNeedEnterMission ", agv.Name));
return true;
}
}
return false;
}
/// <summary>
/// 查询节点出料架[满/空]任务
/// </summary>
/// <param name="agv"></param>
/// <param name="nodeName"></param>
/// <param name="RFID"></param>
/// <param name="empty">料架类型</param>
/// <returns></returns>
public static bool FindNeedLeaveMission(Agv_Info agv, string nodeName, out string RFID,bool empty)
{
RFID = "";
if (FindNeedLeave(agv, nodeName, out string rfid,empty))
{
int idx = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null &&
(
(s.CurJob is GetShelfJob && (((GetShelfJob)s.CurJob).TargetPlace.Equals(nodeName)))||
(s.CurJob is GetFullShelfJob && (((GetFullShelfJob)s.CurJob).TargetPlace.Equals(nodeName)))
)
);
if (idx == -1)
{
RFID = rfid;
LogUtil.debug(string.Format("{0} FindNeedLeaveMission", agv.Name));
return true;
}
}
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Script.Serialization;
using Common;
using Microsoft.SqlServer.Server;
using RestSharp;
namespace DeviceLibrary
{
public class MiR_API
{
private const int httpTimeout = 5000;
private static log4net.ILog log = log4net.LogManager.GetLogger("MiR_API");
public static bool IsDebug { get; set; } = false;
/// <summary>
/// 获取IO模块guid列表
/// </summary>
/// <param name="info"></param>
/// <param name="guid"></param>
/// <returns></returns>
public static bool Get_IO_Modules(Agv_Info info, out string[] guid)
{
try
{
guid = null;
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text";
string json = HttpGet(url, info.IP, info.Authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] obj = (object[])serializer.DeserializeObject(json);
if (obj == null)
{
log.Error("URL: " + url + "\n" + "Return: " + json);
return false;
}
guid = new string[obj.Length];
for (int i = 0; i < obj.Length; i++)
{
Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
guid[i] = dic["guid"].ToString();
}
log.Info("URL: " + url + "\n" + "Return: " + json);
return true;
}
catch (Exception ex)
{
guid = null;
log.Error("Get_IO_Modules", ex);
return false;
}
}
/// <summary>
/// 获取IO模块的状态
/// </summary>
/// <param name="info"></param>
/// <param name="input"></param>
/// <param name="output"></param>
/// <returns></returns>
public static bool Get_IO_Status(Agv_Info info, out bool[] input, out bool[] output)
{
try
{
input = null;
output = null;
string url = "http://" + info.IP + "/api/v2.0.0/io_modules/" + info.IOID + "/status";
string json = HttpGet(url, info.IP, info.Authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null)
{
log.Error("URL: " + url + "\n" + "Return: " + json);
return false;
}
object[] objInput = (object[])dic["input_state"];
input = new bool[objInput.Length];
for (int i = 0; i < input.Length; i++)
input[i] = Convert.ToBoolean(objInput[i]);
object[] objOutput = (object[])dic["output_state"];
output = new bool[objOutput.Length];
for (int i = 0; i < output.Length; i++)
output[i] = Convert.ToBoolean(objOutput[i]);
return true;
}
catch (Exception ex)
{
input = null;
output = null;
//log.Error("Get_IO_Status", ex);
return false;
}
}
/// <summary>
/// 获取PLC寄存器的内容
/// </summary>
/// <param name="info"></param>
/// <param name="reg"></param>
/// <param name="regValue"></param>
/// <returns></returns>
public static bool Get_Register(Agv_Info info, int reg, out int regValue)
{
try
{
regValue = -1;
string url = "http://" + info.IP + "/api/v2.0.0/registers/" + reg + "?whitelist=value";
string json = HttpGet(url, info.IP, info.Authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null)
{
log.Error("URL: " + url + "\n" + "Return: " + json);
return false;
}
string s = dic["value"].ToString();
float f = Convert.ToSingle(s);
regValue = Convert.ToInt32(f);
return true;
}
catch (Exception ex)
{
regValue = -1;
log.Error("Get_Register", ex);
return false;
}
}
/// <summary>
/// 设置PLC寄存器的内容
/// </summary>
/// <param name="info"></param>
/// <param name="reg"></param>
/// <param name="regValue"></param>
/// <returns></returns>
public static bool Set_Register(Agv_Info info, int reg, int regValue)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/registers/" + reg;
string body = "{\"value\": " + regValue + "}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null)
{
log.Error("URL: " + url + "\n" + "Return: " + json);
return false;
}
string s = dic["value"].ToString();
float f = Convert.ToSingle(s);
if (regValue == Convert.ToInt32(f))
return true;
else
return false;
}
catch (Exception ex)
{
log.Error("Set_Register", ex);
return false;
}
}
/// <summary>
/// 添加任务到任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission_id"></param>
/// <returns></returns>
public static bool Add_Mission(Agv_Info info, string mission_id, bool isRemovePreMission = true)
{
try
{
info.CurTaskID = -1;
info.CurTaskGUID = "";
info.CurTaskState = SettingString.Wait;
var key = CommonVar.agvMission.Where(qq => qq.Value == mission_id).Select(qq => qq.Key);
info.CurTaskName = key.ToList()[0];
//删除上一任务
Del_Mission(info);
string url = "http://" + info.IP + "/api/v2.0.0/mission_queue";
string body = "{\"mission_id\":\"" + mission_id + "\"}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null)
{
return false;
}
log.Info("URL: " + url + "\n" + "Return: " + json);
string s = dic["mission_id"].ToString();
string id = dic["id"].ToString();
if (s == mission_id)
{
try
{
if (info.IsUse)
info.CurTaskID = Convert.ToInt32(id);
info.CurTaskGUID = mission_id;
log.Info(string.Format("{0} Add_Mission [{1}]", info.Name, key.ToList()[0]));
}
catch
{
log.Error(string.Format("{0} Add_Mission [{1}]", info.Name, mission_id));
}
return true;
}
else
return false;
}
catch (Exception ex)
{
log.Error("Add_Mission", ex);
return false;
}
}
/// <summary>
/// 添加任务到FLEET任务队列
/// </summary>
/// <param name="info"></param>
/// <param name="mission_id"></param>
/// <returns></returns>
public static bool Add_Mission_Fleet(Agv_Info info, string mission_id, bool isRemovePreMission = true)
{
try
{
info.CurTaskID = -1;
info.CurTaskGUID = "";
info.CurTaskState = SettingString.Wait;
var key = CommonVar.agvMission.Where(qq => qq.Value == mission_id).Select(qq => qq.Key);
info.CurTaskName = key.ToList()[0];
//防止上一个任务已执行但返回失败时,删除任务
Del_Mission(info);
string ip = AppConfigHelper.GetValue(SettingString.FLEET);
string url = "http://" + ip + "/api/v2.0.0/mission_scheduler";
string body = "{\"mission_id\":\"" + mission_id + "\",\"robot_id\":" + info.Fleet_IP + "}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null)
{
return false;
}
log.Info("URL: " + url + "\n" + "Return: " + json);
string s = dic["mission_id"].ToString();
string id = dic["id"].ToString();
if (s == mission_id)
{
try
{
info.CurTaskID = Convert.ToInt32(id);
info.CurTaskGUID = mission_id;
log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, key.ToList()[0]));
}
catch
{
log.Info(string.Format("{0} Add_Mission_Fleet [{1}]", info.Name, mission_id));
info.CurTaskName = "";
}
return true;
}
else
return false;
}
catch (Exception ex)
{
log.Error("Add_Mission_Fleet", ex);
return false;
}
}
/// <summary>
/// 获取所有任务列表
/// </summary>
/// <param name="info"></param>
/// <param name="mission">任务(名称,guid)</param>
/// <returns></returns>
public static bool Get_Mission(Agv_Info info, out Dictionary<string, string> mission)
{
mission = null;
try
{
string url = "http://" + info.IP + "/api/v2.0.0/missions/search?whitelist=guid,name";
string body = "{\"filters\" :[]}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] obj = (object[])serializer.DeserializeObject(json);
if (obj == null) return false;
mission = new Dictionary<string, string>();
for (int i = 0; i < obj.Length; i++)
{
Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
mission.Add(dic["name"].ToString(), dic["guid"].ToString());
}
return true;
}
catch (Exception ex)
{
log.Error("Get_Mission", ex);
return false;
}
}
/// <summary>
/// 获取当前任务队列guid
/// </summary>
/// <param name="info"></param>
/// <param name="mission"></param>
/// <returns></returns>
public static bool Get_Mission_Queue(Agv_Info info, out List<string> mission)
{
mission = null;
try
{
string url = "http://" + info.IP + "/api/v2.0.0/mission_queue/search";
string body = "{\"filters\" : [{\"fieldname\": \"state\", \"operator\": \"IN\", \"value\": [\"Pending\", \"Executing\"]}]}";
string json = HttpPost(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] obj = (object[])serializer.DeserializeObject(json);
if (obj == null) return false;
mission = new List<string>();
Dictionary<string, object> dic;
for (int i = 0; i < obj.Length; i++)
{
dic = (Dictionary<string, object>)obj[i];
mission.Add(dic["id"].ToString());
}
for (int i = 0; i < mission.Count; i++)
{
url = "http://" + info.IP + "/api/v2.0.0/mission_queue/" + mission[i];
json = HttpGet(url, info.IP, info.Authorization);
serializer = new JavaScriptSerializer();
dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
mission[i] = dic["mission_id"].ToString();
}
return true;
}
catch (Exception ex)
{
log.Error("Get_Mission_Queue", ex);
return false;
}
}
/// <summary>
/// 删除当前所有任务
/// </summary>
/// <param name="info"></param>
public static void Del_Mission(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/mission_queue";
HttpDel(url, info.IP, info.Authorization);
}
catch (Exception ex)
{
log.Error("Del_Mission", ex);
}
}
/// <summary>
/// 删除Fleet尽快中指定id的任务,已运行的无法删除
/// </summary>
/// <param name="authorization"></param>
/// <param name="id"></param>
public static void Del_Mission_Fleet(Agv_Info agv, string id)
{
try
{
string ip = AppConfigHelper.GetValue(SettingString.FLEET);
string url = "http://" + ip + "/api/v2.0.0/mission_scheduler/" + id;
HttpDel(url, ip, agv.Authorization);
}
catch (Exception ex)
{
log.Error(ex);
}
}
/// <summary>
/// 获取当前小车状态
/// </summary>
/// <param name="info"></param>
/// <param name="stateID"></param>
/// <param name="stateText"></param>
/// <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.AgvPosition position)
{
stateID = eAGVState.UNKNOWN;
stateText = "";
battery = 0;
mission_text = "";
position = new Agv_Info.AgvPosition();
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position";
string json = HttpGet(url, info.IP, info.Authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
//state_id不存在:{"args":{},"error_code":"service_unavailable","error_human":"\u670d\u52a1\u4e0d\u53ef\u7528\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5"}
try
{
stateID = (eAGVState)(Convert.ToInt32(dic["state_id"].ToString()));
}
catch
{
log.Error("Get_State URL:" + url + " Return" + json);
return false;
}
stateID = (eAGVState)(Convert.ToInt32(dic["state_id"].ToString()));
stateText = dic["state_text"].ToString();
mission_text = dic["mission_text"].ToString();
string s = dic["battery_percentage"].ToString();
float f = Convert.ToSingle(s);
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"]);
return true;
}
catch (Exception ex)
{
log.Error("Get_State: ", ex);
return false;
}
}
/// <summary>
/// 获取小车位置
/// </summary>
/// <param name="ip">小车ip</param>
/// <param name="author">授权码</param>
/// <param name="position">输出位置</param>
/// <returns></returns>
public static bool Get_Position(string ip, string author, out Agv_Info.AgvPosition position)
{
position = new Agv_Info.AgvPosition();
try
{
string url = "http://" + ip + "/api/v2.0.0/status?whitelist=position";
string json = HttpGet(url, ip, author);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
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"]);
return true;
}
catch (Exception ex)
{
log.Error("Get_Position: ", ex);
return false;
}
}
public static bool Get_Task_State(Agv_Info agv, out string stateStr)
{
stateStr = SettingString.Wait;
try
{
if (agv.CurTaskID == -1)
return true;
if (agv.Use_Fleet)
{
string ip = AppConfigHelper.GetValue(SettingString.FLEET);
string url = "http://" + ip + "/api/v2.0.0/mission_scheduler/" + agv.CurTaskID;
string json = HttpGet(url, ip, CommonVar.agvInfo[0].Authorization);
log.Debug("URL: " + url + "\n" + "Return: " + json);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
// "mission_id": "2e433130-c045-11ea-9a66-94c691a7387d",
// "id": 7178,
// "state": "Done"
string s = dic["id"].ToString();
if (s.Equals(agv.CurTaskID.ToString()))
{
stateStr = dic["state"].ToString();
return true;
}
}
else
{
string url = "http://" + agv.IP + "/api/v2.0.0/mission_queue/" + agv.CurTaskID;
string json = HttpGet(url, agv.IP, agv.Authorization);
log.Debug("URL: " + url + "\n" + "Return: " + json);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
// "mission_id": "2e433130-c045-11ea-9a66-94c691a7387d",
// "id": 7178,
// "state": "Done"
string s = dic["id"].ToString();
if (s.Equals(agv.CurTaskID.ToString()))
{
stateStr = dic["state"].ToString();
return true;
}
}
return false;
}
catch (Exception ex)
{
log.Error("Get_Task_State", ex);
return false;
}
}
/// <summary>
/// 小车状态改为Ready
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public static bool State_Ready(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text";
string body = "{\"state_id\": 3}";
string json = HttpPut(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["state_id"].ToString();
if (s == "3")
return true;
else
return false;
}
catch (Exception ex)
{
log.Error("State_Ready", ex);
return false;
}
}
/// <summary>
/// 小车状态改为Pause
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public static bool State_Pause(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status?whitelist=state_id,state_text";
string body = "{\"state_id\": 4}";
string json = HttpPut(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["state_id"].ToString();
if (s == "4")
return true;
else
return false;
}
catch (Exception ex)
{
log.Error("State_Pause", ex);
return false;
}
}
/// <summary>
/// 清除错误
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public static bool Clear_Error(Agv_Info info)
{
try
{
string url = "http://" + info.IP + "/api/v2.0.0/status";
string body = "{\"clear_error\": true}";
string json = HttpPut(url, info.IP, info.Authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
return true;
}
catch (Exception ex)
{
log.Error("Clear_Error", ex);
return false;
}
}
/// <summary>
/// 检查IP地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static bool CheckIP(string ip)
{
//IP合法
string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
bool rtn = System.Text.RegularExpressions.Regex.IsMatch(ip, pattern);
if (!rtn)
{
log.Error("非法的IP地址" + ip);
return false;
}
//Ping服务端
try
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply result = ping.Send(ip, 2000);
ping.Dispose();
if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
{
log.Error("Ping " + ip + " 请求没有响应");
return false;
}
return true;
}
catch (Exception ex)
{
log.Error("CheckIP", ex);
return false;
}
}
#region HTTP GET POST PUT DEL
private static string HttpGet(string url, string ip, string authorization)
{
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.GET);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept-Language", "zh_CN");
request.AddHeader("Authorization", authorization);
IRestResponse response = client.Execute(request);
string s = response.Content;
s = s.Replace("\n", "");
s = s.Replace(" ", "");
if (IsDebug)
log.Debug("HttpGet URL: " + url + " Return: " + s);
return s;
}
private static string HttpPost(string url, string ip, string authorization, string body)
{
var client = new RestClient(url) { Timeout = httpTimeout };
var request = new RestRequest(Method.POST);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept-Language", "zh_CN");
request.AddHeader("Authorization", authorization);
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
s = s.Replace("\n", "");
s = s.Replace(" ", "");
if (IsDebug)
log.Debug(string.Format("HttpPost URL: {0}; Body: {1} Return: {2}", url, body, s));
return s;
}
private static string HttpPut(string url, string ip, string authorization, string body)
{
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.PUT);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept-Language", "zh_CN");
request.AddHeader("Authorization", authorization);
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
s = s.Replace("\n", "");
s = s.Replace(" ", "");
if (IsDebug)
log.Debug(string.Format("HttpPut URL: {0}; Body: {1} Return: {2}", url, body, s));
return s;
}
private static void HttpDel(string url, string ip, string authorization)
{
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.DELETE);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", authorization);
request.AddHeader("Accept-Language", "zh_CN");
request.AddParameter("application/json", "", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
if (IsDebug)
log.Debug("HttpDel URL: " + url);
}
#endregion
}
}
using Common;
namespace DeviceLibrary
{
/// <summary>
/// 充电任务
/// </summary>
public class ChargeJob : Job
{
/// <summary>
/// 出完满料后-空车返回任务
/// </summary>
/// <param name="agvPlae">小车当前位置,空表示在待机位</param>
public ChargeJob(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}", runInfo); }
}
private JobStep<CHARGE_STEP> ChargeStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);
/// <summary>
/// 空车返回执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = RunInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (ChargeStep.IsStep(CHARGE_STEP.NONE))
{
if (!CommonVar.Charge.StartCharge(agv))
{
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],由于充电桩有小车,从当前位置" + agvPlace + "回到待机位";
msg += runInfo;
ChargeStep.Msg = msg;
return new StandyJob(agv.Place);
}
else
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "去到充电位";
msg += runInfo;
ChargeStep.Msg = msg;
UpdateJobTaskInfo(agv);
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
{
if (CommonVar.CheckTaskFinished(agv, CurTaskName))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "充电任务分配完成,去充电且等待任务";
msg += runInfo;
ChargeStep.Msg = msg;
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
{
if (agv.Battery > CommonVar.Charge.BatteryMax)
{
runInfo = "充电完成,回待机位";
msg += runInfo;
ChargeStep.Msg = msg;
CommonVar.Charge.DelOccupyInfoByAGV(agv);
return new StandyJob(agv.Place);
}
else if (agv.Battery > CommonVar.Charge.BatteryMin)
{
Job job = CommonVar.control.GetJob(agv);
if (job != null && !(job is ChargeJob) && !(job is StandyJob))
{
runInfo = "在充电位检测到任务,电量[" + agv.Battery + " %]大于最小电量[" + CommonVar.Charge.BatteryMin + " %],可执行任务";
msg += runInfo;
ChargeStep.Msg = msg;
CommonVar.Charge.DelOccupyInfoByAGV(agv);
return job;
}
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.END))
{
}
return this;
}
/// <summary>
/// AGV充电流程
/// </summary>
private enum CHARGE_STEP
{
/// <summary>
///
/// </summary>
NONE,
/// <summary>
/// 等待到达4D门
/// </summary>
WAIT_AGV_REACH_3D_DOOR,
/// <summary>
/// 等待AGV到达充电位
/// </summary>
WAIT_REACH_CHARGE_STATION,
/// <summary>
/// 等待充电完成
/// </summary>
WAIT_REACH_CHARGE_OK,
/// <summary>
/// 充电完成去待机位
/// </summary>
WAIT_REACH_STANDBY,
/// <summary>
///
/// </summary>
END
}
}
}
using System.Threading.Tasks;
namespace DeviceLibrary
{
/// <summary>
/// 小车进出料类型
/// </summary>
public enum eEnterLeaveType
{
/// <summary>
/// 小车进料
/// </summary>
Enter,
/// <summary>
/// 小车出料
/// </summary>
Leave,
}
/// <summary>
/// 进出料任务
/// </summary>
public class EnterLeaveShelfJob : Job
{
/// <summary>
/// 进出料任务
/// </summary>
/// <param name="curNode">位置点</param>
/// <param name="rfid">RFID</param>
public EnterLeaveShelfJob(ClientNode curNode, eEnterLeaveType type,string rfid="")
{
CurNode = curNode;
RFID = rfid;
ActionType = type;
runInfo = type.Equals(eEnterLeaveType.Enter) ? "小车进料任务:" : "小车出料任务:" +curNode.AliceName+" ";
}
/// <summary>
/// 位置点信息
/// </summary>
public ClientNode CurNode { get; set; }
public string RFID { get; set; }
/// <summary>
/// 动作类型
/// </summary>
public eEnterLeaveType ActionType { get; set; }
private string runInfo;
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get { return runInfo; }
}
private JobStep<ENTER_LEAVE_SHELF_STEP> EnterLeaveShelfStep = new JobStep<ENTER_LEAVE_SHELF_STEP>(ENTER_LEAVE_SHELF_STEP.NONE);
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name+ " ";
bool rtn = false;
agv.Msg = runInfo;
if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.NONE))
{
if (ActionType.Equals(eEnterLeaveType.Leave))
{
EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE);
runInfo += "小车链条运行";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
rtn = agv.AssignTask(Common.SettingString.Leave);
UpdateJobTaskInfo(agv);
}
else if(ActionType.Equals(eEnterLeaveType.Enter))
{
EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE);
runInfo +="小车链条运行";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
rtn = agv.AssignTask(Common.SettingString.Enter);
UpdateJobTaskInfo(agv);
}
}
else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE))
{
CurTaskState = CommonVar.GetTakJobState(agv);
if (CommonVar.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{
//EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.END);
runInfo+= "料架/料串进入完成 [" + RFID + "]";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
agv.RFID = "";
// return new EmptyAGVBackJob(LineName);
}
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
{
runInfo= "料架离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo;
//EnterLeaveShelfStep.Msg = msg;
}
}
else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE))
{
CurTaskState = CommonVar.GetTakJobState(agv);
if (CommonVar.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState))
{
//EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.END);
runInfo = "料架/料串出去完成 [" + RFID + "]";
msg += runInfo;
EnterLeaveShelfStep.Msg = msg;
//return new EmptyShelfBackJob(LineName,eShelfType.BigShelf);
}
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
{
//链条停止
runInfo= "料架进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
//msg += runInfo;
//EnterLeaveShelfStep.Msg = msg;
}
}
else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.END))
{
}
return this;
}
}
/// <summary>
/// AGV进出料
/// </summary>
public enum ENTER_LEAVE_SHELF_STEP
{
/// <summary>
///
/// </summary>
NONE,
/// <summary>
/// 等待料架离开产线
/// </summary>
WAIT__SHELF_OUT_LINE,
/// <summary>
/// 等待料架进入产线
/// </summary>
WAIT__SHELF_IN_LINE,
/// <summary>
/// 进入/离开完成
/// </summary>
END
}
}

using Common;
namespace DeviceLibrary
{
/// <summary>
/// 送满料任务:取满料架
/// </summary>
public class GetFullShelfJob : Job
{
/// <summary>
/// 送满料任务:取满料架
/// </summary>
/// <param name="agvPlae">agv当前位置</param>
/// <param name="tarPlace">目的地</param>
public GetFullShelfJob(string agvPlae, string tarPlace, string rfid)
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
RFID = rfid;
}
bool recyMark = false;
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
string RFID = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("取满料架任务:{0}[RFID={1}][目的地={2}][任务名称={3}][任务状态={4}]", runInfo, RFID, to, CurTaskName, CurTaskState);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
/// <summary>
/// 包装仓任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_OUT_SHELF_PLACE);
runInfo = "待机位/充电位收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_OUT_SHELF_PLACE);
runInfo = "默认位置收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_OUT_SHELF_PLACE))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_STATION_STATE);
runInfo = "到达云仓出料口 " + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P3_CHECK_STATION_STATE))
{
if (BoxOutJobType.CheckFullTask(RFID))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = RFID + " 满料任务确认存在,并向线体" + TargetPlace + "发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, "");
}
else
{
string rfid = "";
if (JobType.FindNeedLeave(agv, TargetPlace, out rfid, false))
{
if (rfid.Equals(RFID))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = RFID + " 无满料任务,转为回收任务,向线体" + TargetPlace + "发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
recyMark = true;
CommonVar.server.Ready(TargetPlace, "");
}
else
{
if (BoxOutJobType.CheckFullTask(rfid))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
rfid = RFID;
runInfo = RFID + " 满料任务存在,并向线体" + TargetPlace + "发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, "");
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = RFID + " 无满料任务,转为 " + rfid + " 回收任务,向线体" + TargetPlace + "发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
recyMark = true;
CommonVar.server.Ready(TargetPlace, "");
}
}
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P12_END);
runInfo = "任务 " + RFID + " 在" + TargetPlace + "不存在,任务结束";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE))
{
curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV);
runInfo = "线体" + TargetPlace + "允许出料,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Enter);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
if (recyMark)
{
runInfo = RFID + " 进入小车完成,回收该料架";
msg += runInfo;
curJobStep.Msg = msg;
return new SendShelfJob(TargetPlace, SettingString.A2, RFID);
}
if (BoxOutJobType.CheckFullTask(RFID))
{
runInfo = "料架进入小车完成,无目的地。回收该料架";
msg += runInfo;
curJobStep.Msg = msg;
return new RecycleEmptyShelf(agvPlace, SettingString.A2, true);
}
else
{
runInfo = "料架进入小车完成,回收该料架";
msg += runInfo;
curJobStep.Msg = msg;
return new RecycleEmptyShelf(agvPlace, SettingString.A2, true);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P12_END))
{
return null;
}
return this;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达设备出料口
/// </summary>
P2_WAIT_REACH_OUT_SHELF_PLACE,
/// <summary>
/// 确认云仓是否有该出满料任务,防止该任务被手动出掉
/// </summary>
P3_CHECK_STATION_STATE,
/// <summary>
/// 等待线体回复
/// </summary>
P4_WAIT_LINE_RESPONSE,
/// <summary>
/// 等待料架进入AGV
/// </summary>
P5_WAIT_SHELF_IN_AGV,
/// <summary>
/// 等待到达包装仓
/// </summary>
P6_WAIT_REACH_PACKING_STATION,
/// <summary>
/// 到达包装仓,再次确认是否有任务,防止该任务被手动出掉
/// </summary>
P7_CHECK_PACKING_STATION_STATE,
/// <summary>
/// 等待包装仓回复
/// </summary>
P8_WAIT_PACKING_STATION_RESPONSE,
/// <summary>
/// 等待AGV停靠完成
/// </summary>
P9_WAIT_AGV_DOCK_FINISH,
/// <summary>
/// 等待料架进入包装仓
/// </summary>
P10_WAIT_SHELF_IN_STATION,
/// <summary>
/// 等待到达空料架回收处
/// </summary>
P11_WAIT_REACH_RECYCLE_STATION,
/// <summary>
/// 任务结束
/// </summary>
P12_END
}
}
}
using Common;
namespace DeviceLibrary
{
/// <summary>
/// 取料串
/// </summary>
public class GetShelfJob : Job
{
/// <summary>
///取料串
/// </summary>
/// <param name="agvPlae">agv当前位置</param>
/// <param name="tarPlace">目的地</param>
/// <param name="RFID">RFID</param>
/// <param name="fullShelf">是否是满料串</param>
public GetShelfJob(string agvPlae, string tarPlace, string RFID = "", bool fullShelf = false)
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
this.isFullShelf = fullShelf;
this.RFID = RFID;
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
/// <summary>
/// 是否是满料串
/// </summary>
private bool isFullShelf = false;
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
private string runInfo = "";
private string RFID = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("取{5}料串任务[RFID={4}]: {0}[目的地={1}][任务名称={2}][任务状态={3}]", runInfo, to, CurTaskName, CurTaskState, RFID, isFullShelf ? "满" : "空");
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
private string GetShowInfo()
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("取料串任务: {0} [{1}->{2}]", runInfo, from, to); ;
}
/// <summary>
/// 任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = GetShowInfo();
agv.RFID = RFID;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
if ((agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge)))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE);
runInfo = "待机位/充电位收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE);
runInfo = "默认位置收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
runInfo = "到达料架处" + TargetPlace + ",并向线体发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, "");
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));//&& s.StateEquals(eNodeStatus.MayLeave)
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV);
runInfo = "线体" + TargetPlace + "出料,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(Common.SettingString.Enter);
UpdateJobTaskInfo(agv);
}
if (curJobStep.IsTimeOut(15000, out double timeOutTime))
{
if (TargetPlace.Equals(SettingString.D3) || TargetPlace.Equals(SettingString.D4))
{
runInfo = string.Format("线体[{0}]允许出料信号[{1}]超时{2}秒,该处料串可能被手动干预,回待机位", TargetPlace, Agv.ClientAction.MayLeave, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]允许出料信号[{1}]超时15S,该处料串可能被手动干预,回待机位", TargetPlace, Agv.ClientAction.MayLeave);
curJobStep.Msg = msg;
return new ChargeJob(TargetPlace);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_SHELF_PLACE);
runInfo = string.Format("线体[{0}]允许出料信号[{1}]超时{2}秒,重发出料请求", TargetPlace, Agv.ClientAction.MayLeave, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]允许出料信号[{1}]超时15S,重发出料请求", TargetPlace, Agv.ClientAction.MayLeave);
curJobStep.Msg = msg;
//去待机位
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
if (FindShelfTarget(agv, out string tarNodeName))
{
runInfo = "料串进入小车完成,任务结束";
msg += runInfo;
curJobStep.Msg = msg;
return new SendShelfJob(TargetPlace, tarNodeName, RFID);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P6_WAIT_REACH_STANDBY);
runInfo = "料串进入小车完成,当前无节点需要料串,去待机位";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsTimeOut(60000, out double timeOutTime))
{
runInfo = string.Format("线体[{0}]出料超时{1}秒,请检查出料情况", TargetPlace, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]出料超时,请检查出料情况", TargetPlace);
curJobStep.Msg = msg;
//去待机位
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P6_WAIT_REACH_STANDBY))
{
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
{
runInfo = "到达待机位并搜索任务";
msg += runInfo;
curJobStep.Msg = msg;
if (FindShelfTarget(agv, out string tarNodeName))
{
runInfo = "搜索到料串目的地,任务结束";
msg += runInfo;
curJobStep.Msg = msg;
return new SendShelfJob(SettingString.Standby, tarNodeName, RFID);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P8_END))
{
return null;
}
return this;
}
private bool FindShelfTarget(Agv_Info currentAgv, out string tarPlace)
{
tarPlace = "";
if (isFullShelf)
{
//检查云仓入口是否需要满料串入库
if (IsPlace(SettingString.A3))
{
if (JobType.FindNeedEnterMission(currentAgv, SettingString.D1,false))
{
tarPlace = SettingString.D1;
return true;
}
if (JobType.FindNeedEnterMission(currentAgv, SettingString.D3, false))
{
tarPlace = SettingString.D3;
return true;
}
if (JobType.FindNeedEnterMission(currentAgv, SettingString.A4, true))
{
tarPlace = SettingString.A4;
return true;
}
}
}
else//空料串
{
//检查云仓是否需要空料架
if (IsPlace(SettingString.A1)|| IsPlace(SettingString.D2) || IsPlace(SettingString.D4))
{
if (JobType.FindNeedEnterMission(currentAgv, SettingString.D1, true))
{
tarPlace = SettingString.D1;
return true;
}
if (JobType.FindNeedEnterMission(currentAgv, SettingString.D3, true))
{
tarPlace = SettingString.D3;
return true;
}
if (JobType.FindNeedEnterMission(currentAgv, SettingString.A4, true))
{
tarPlace = SettingString.A4;
return true;
}
if (JobType.FindNeedEnterMission(currentAgv, SettingString.A2, true))
{
tarPlace = SettingString.A2;
return true;
}
}
}
return false;
}
private bool IsPlace(string place)
{
return TargetPlace.Equals(place);
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达包装料架处
/// </summary>
P2_WAIT_REACH_SHELF_PLACE,
/// <summary>
/// 等待到达4D
/// </summary>
P3_WAIT_REACH_4D_DOOR,
/// <summary>
/// 等待到达4C
/// </summary>
P3_WAIT_REACH_4C_DOOR,
/// <summary>
/// 等待线体回复
/// </summary>
P4_WAIT_LINE_RESPONSE,
/// <summary>
/// 等待料架进入AGV
/// </summary>
P5_WAIT_SHELF_IN_AGV,
/// <summary>
/// 等待到达待机位
/// </summary>
P6_WAIT_REACH_STANDBY,
/// <summary>
/// 等待到达4D
/// </summary>
P7_WAIT_REACH_4D_DOOR,
/// <summary>
/// 任务结束
/// </summary>
P8_END
}
}
}
using Common;
using System.Collections.Generic;
using System.Threading;
namespace DeviceLibrary
{
/// <summary>
/// 包装仓任务:在包装仓间转移包装料架,
/// </summary>
public class PackingJob_TransferShelf : Job
{
/// <summary>
/// 包装仓任务
/// </summary>
/// <param name="agvPlae">小车当前位置</param>
public PackingJob_TransferShelf(string agvPlae, string tarPlace, string RFID, string mark)
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
this.mark = mark;
this.RFID = RFID;
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
/// <summary>
/// 料架RFID
/// </summary>
public string RFID = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
/// <summary>
/// 标记
/// </summary>
public string mark = "";
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("包装料架转移任务:{0} [RFID={1}][Mark={2}][目的地={3}][任务名称={4}][任务状态={5}]", runInfo, RFID, mark,to,CurTaskName,CurTaskState);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
/// <summary>
/// 任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
agv.RFID = RFID;
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION);
runInfo = "收到任务,向包装仓" + TargetPlace + "运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE);
runInfo = "到达包装仓" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE))
{
if (PackingJobType.IsInStoreMark(mark))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
else
{
if (PackingJobType.CheckNodeMark(mark, TargetPlace))
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.P15_END);
runInfo = "包装仓" + TargetPlace + "无任务,任务结束";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayLeave));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH);
runInfo = "收到线体对接请求,开始停靠";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.DockToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
//else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
//{
// runInfo = string.Format("线体[{0}]允许对接信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayLeave, timeOutTime.ToString("f2"));
// msg += string.Format("线体[{0}]允许对接信号[{1}]超时", TargetPlace, eNodeStatus.MayLeave);
// curJobStep.Msg = msg;
//}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH))
{
if (CommonVar.CheckTaskDockFinished(agv, TargetPlace, CurTaskState))
{
CommonVar.server.Ready(TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_AGV);
runInfo = "停靠包装仓完成,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Enter);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_AGV))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishLeave));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P7_FIND_LEFT_TASK);
runInfo = "包装料架进入小车完成";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P7_FIND_LEFT_TASK))
{
if(PackingJobType.IsInStoreMark(mark))//入库任务
{
if(CheckShelfLockInfo(agv,out string nodeName,out string lockedNodeNames))
{
if(nodeName.Equals(""))//有锁定节点,但目前忙碌,无法入料,去待机位
{
curJobStep.ToNextStep(EXECUTE_STEP.P14_WAIT_REACH_STANDBY);
runInfo = "入库任务Mark=" + mark + "有剩余任务,但包装仓忙碌,去待机位";
msg += runInfo+";锁定的节点:"+ lockedNodeNames;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = SettingString.Standby;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else//有锁定节点
{
curJobStep.ToNextStep(EXECUTE_STEP.P8_TRANSFER_SHELF);
runInfo = "入库任务Mark=" + mark + "存在剩余任务,到下一包装仓执行任务";
msg += runInfo;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = nodeName;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else//无锁定节点,去A2
{
curJobStep.ToNextStep(EXECUTE_STEP.P12_SEND_FULL_SHELF);
TargetPlace = SettingString.A2;
agvPlace = agv.Place;
runInfo = "入库任务Mark=" + mark + "完成, 去" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
PackingJobType.DelMark(mark);
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else
{
if (FindNextTask(agv, out int nodeIdx))
{
if (nodeIdx > -1)//该mark还有剩余任务
{
curJobStep.ToNextStep(EXECUTE_STEP.P8_TRANSFER_SHELF);
runInfo = "任务Mark=" + mark + "到下一包装仓执行任务";
msg += runInfo;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = CommonVar.nodeInfo[nodeIdx].Name;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else //pack任务还有剩余,但目前包装仓还未生成任务,去待机位
{
curJobStep.ToNextStep(EXECUTE_STEP.P14_WAIT_REACH_STANDBY);
runInfo = "任务Mark=" + mark + "有剩余任务,但包装仓还未生成,去待机位";
msg += runInfo;
curJobStep.Msg = msg;
agvPlace = agv.Place;
TargetPlace = SettingString.Standby;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
else//出库任务完成
{
string name;
string[] ss = mark.Split(',');
switch (ss[1])
{
case "urgent": name = SettingString.A8; break; //紧急
case "cut": name = SettingString.A8; break; //分盘
case "pack": name = SettingString.A3; break; //包装
default: name = SettingString.A8; break;
}
curJobStep.ToNextStep(EXECUTE_STEP.P12_SEND_FULL_SHELF);
TargetPlace = name;
agvPlace = agv.Place;
runInfo = "任务Mark=" + mark + "出库完成, 去" + TargetPlace;
msg += runInfo;
curJobStep.Msg = msg;
PackingJobType.DelMark(mark);
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P8_TRANSFER_SHELF))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P9_WAIT_LINE_RESPONSE);
runInfo = "到达包装仓,发送到达信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Arrive(TargetPlace, RFID);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P9_WAIT_LINE_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayEnter));
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P10_WAIT_AGV_DOCK_FINISH);
runInfo = "收到线体对接请求,开始停靠";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.DockToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
{
runInfo = string.Format("线体[{0}]允许对接信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]允许对接信号[{1}]超时", TargetPlace, eNodeStatus.MayEnter);
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P10_WAIT_AGV_DOCK_FINISH))
{
if (CommonVar.CheckTaskDockFinished(agv, TargetPlace, CurTaskState))
{
CommonVar.server.Ready(TargetPlace, RFID);
curJobStep.ToNextStep(EXECUTE_STEP.P11_WAIT_SHELF_IN_LINE);
runInfo = "停靠包装仓完成,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Leave);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P11_WAIT_SHELF_IN_LINE))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishEnter));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P15_END);
runInfo = "包装料架进入" + TargetPlace + "完成,任务结束";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P12_SEND_FULL_SHELF))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P13_WAIT_TARGET_RESPONSE);
runInfo = "到达目的地" + TargetPlace + ",并发送准备信号";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, RFID);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P13_WAIT_TARGET_RESPONSE))
{
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayEnter));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P11_WAIT_SHELF_IN_LINE);
runInfo = "收到线体入料请求,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Leave);
UpdateJobTaskInfo(agv);
}
//else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
//{
// runInfo = string.Format("线体[{0}]允许入料信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
// msg += string.Format("线体[{0}]允许入料信号[{1}]超时", TargetPlace, eNodeStatus.MayEnter);
// curJobStep.Msg = msg;
//}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P14_WAIT_REACH_STANDBY))
{
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
{
if (FindNextTask(agv, out int nodeIdx))
{
if (nodeIdx > -1)//该mark还有剩余任务
{
curJobStep.ToNextStep(EXECUTE_STEP.P8_TRANSFER_SHELF);
runInfo = "任务Mark=" + mark + "到下一包装仓执行任务";
msg += runInfo;
curJobStep.Msg = msg;
TargetPlace = CommonVar.nodeInfo[nodeIdx].Name;
agvPlace = agv.Place;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P15_END))
{
agv.RFID = "";
return null;
//Job job = CommonVar.control.GetJob(agv);
//if (job != null)
//{
// runInfo = "包装仓转移料架任务完成,检测到任务,开始执行";
// msg += runInfo;
// curJobStep.Msg = msg;
// return job;
//}
}
return this;
}
/// <summary>
/// 根据mark查找下一个任务
/// </summary>
/// <returns></returns>
private bool FindNextTask(Agv_Info agv, out int nodeIdx)
{
//寻找下一个任务点
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter) && s.Mark == mark && s.AgvName == "" && s.IsUse);
if (nodeIdx > -1)
return true;
else
{
if (!mark.Split(',')[1].Equals("pack"))
{
string log = " [Mark=" + mark + "] 出库任务完成";
LogUtil.info(log);
return false;
}
bool rtn = AGVManager.LeaveCheck(agv, out int taskCount);
Thread.Sleep(1000);
if (!rtn)//出库任务还未完成
{
string log = agv.Name + " [Mark=" + mark + "] 出库任务未完成,[taskCount=" + taskCount.ToString() + "]";
LogUtil.info(log);
return true;
}
else
{
string log = agv.Name + " [Mark=" + mark + "] [taskCount = " + taskCount.ToString() + "] 出库任务完成";
LogUtil.info(log);
return false;
}
}
}
private bool CheckShelfLockInfo(Agv_Info agv, out string nodeName,out string lockedNodeNames)
{
List<string> shelfLockedNodeNames = new List<string>();
nodeName = "";
lockedNodeNames = "";
//获取料架锁定信息
AGVManager.GetShelfLockInfo(TargetPlace, RFID, shelfLockedNodeNames);
Thread.Sleep(1000);
if (shelfLockedNodeNames != null && shelfLockedNodeNames.Count > 0)
{
foreach (string item in shelfLockedNodeNames)
{
int nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.Name == item && s.StateEquals(eNodeStatus.NeedEnter) && s.Mark.Equals("") && (s.AgvName == "" || s.AgvName == agv.Name) && s.IsUse);
if (nodeIdx > -1)
{
nodeName = item;
shelfLockedNodeNames.Remove(item);
return true;
}
}
lockedNodeNames = string.Join(";", shelfLockedNodeNames);
return true;
}
return false;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达包装仓
/// </summary>
P2_WAIT_REACH_PACKING_STATION,
/// <summary>
/// 到达包装仓
/// </summary>
P3_CHECK_PACKING_STATION_STATE,
/// <summary>
/// 等待包装仓回复
/// </summary>
P4_WAIT_PACKING_STATION_RESPONSE,
/// <summary>
/// 等待AGV停靠完成
/// </summary>
P5_WAIT_AGV_DOCK_FINISH,
/// <summary>
/// 等待料架进入AGV
/// </summary>
P6_WAIT_SHELF_IN_AGV,
/// <summary>
/// 查询剩余任务
/// </summary>
P7_FIND_LEFT_TASK,
/// <summary>
/// 转移料架
/// </summary>
P8_TRANSFER_SHELF,
/// <summary>
/// 等待线体回复
/// </summary>
P9_WAIT_LINE_RESPONSE,
/// <summary>
/// 等待AGV停靠完成
/// </summary>
P10_WAIT_AGV_DOCK_FINISH,
/// <summary>
/// 等待料架进入线体
/// </summary>
P11_WAIT_SHELF_IN_LINE,
/// <summary>
/// 运送满料架
/// </summary>
P12_SEND_FULL_SHELF,
/// <summary>
/// 等待满料目的地回复
/// </summary>
P13_WAIT_TARGET_RESPONSE,
/// <summary>
/// 等待到达待机位
/// </summary>
P14_WAIT_REACH_STANDBY,
/// <summary>
/// 任务结束
/// </summary>
P15_END
}
}
}

using Common;
namespace DeviceLibrary
{
public enum ShelfType
{
/// <summary>
/// 包装料架
/// </summary>
PackingShelf,
/// <summary>
/// 料串
/// </summary>
ReelString
}
/// <summary>
/// 回收空料架
/// </summary>
public class RecycleEmptyShelf : Job
{
/// <summary>
/// 回收空料架
/// </summary>
/// <param name="agvPlae">小车当前位置,空表示在待机位</param>
public RecycleEmptyShelf(string agvPlae, string tarPlace, bool hasLoad=false,ShelfType type = ShelfType.ReelString)
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
shelfType = type;
this.hasLoad = hasLoad;
}
/// <summary>
/// 车上有负载
/// </summary>
private bool hasLoad = false;
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
/// <summary>
/// 料架类型
/// </summary>
public ShelfType shelfType;
/// <summary>
/// 回收料架处
/// </summary>
public string RecycleStation = "";
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("回收空料架任务:{0} [ShelfType={1}][任务名称={2}][任务状态={3}]", runInfo, shelfType.ToString(),CurTaskName,CurTaskState);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.R1_NONE);
/// <summary>
/// 任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.R1_NONE))
{
if(hasLoad)
{
if (FindRecycleStation(agv))
{
curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION);
runInfo = "车上已有空料架,向" + RecycleStation + "运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, RecycleStation);
UpdateJobTaskInfo(agv);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.R8_WAIT_REACH_STANDY);
runInfo = "车上已有空料架,由于未找到接收空料架处,先回待机位";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv);
}
}
else//车上无料
{
if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge))
{
curJobStep.ToNextStep(EXECUTE_STEP.R2_WAIT_REACH_EMPTY_SHELF_PLACE);
runInfo = "待机位/充电位收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.R2_WAIT_REACH_EMPTY_SHELF_PLACE);
runInfo = "默认位置收到任务,开始执行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R2_WAIT_REACH_EMPTY_SHELF_PLACE))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE);
runInfo = "到达空料架处"+TargetPlace+",向线体发送出料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, "");
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE))
{
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayLeave));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.R4_WAIT_SHELF_IN_AGV);
runInfo = "线体"+TargetPlace+"允许出料,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Enter);
UpdateJobTaskInfo(agv);
}
//else if(curJobStep.IsTimeOut(6000,out double timeOutTime))
//{
// runInfo = string.Format("线体[{0}]允许出料信号[{1}]超时{2}秒",TargetPlace,eNodeStatus.MayLeave,timeOutTime.ToString("f2"));
// msg += string.Format("线体[{0}]允许出料信号[{1}]超时", TargetPlace, eNodeStatus.MayLeave);;
// curJobStep.Msg = msg;
//}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R4_WAIT_SHELF_IN_AGV))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
if (FindRecycleStation(agv))
{
curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION);
runInfo = "空料架进入小车完成,向"+TargetPlace+"运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, RecycleStation);
UpdateJobTaskInfo(agv);
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.R8_WAIT_REACH_STANDY);
runInfo = "空料架进入小车完成,由于未找到接收空料架处,先回待机位";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION))
{
if (CommonVar.CheckTaskMoveFinished(agv, RecycleStation, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE);
runInfo = "到达"+TargetPlace+",发送入料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(RecycleStation,"00");
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE))
{
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.MayEnter));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.R7_WAIT_SHELF_IN_LINE);
runInfo = "收到线体入料请求,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Leave);
UpdateJobTaskInfo(agv);
}
//else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
//{
// runInfo = string.Format("线体[{0}]允许入料信号[{1}]超时{2}秒", RecycleStation, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
// msg += string.Format("线体[{0}]允许入料信号[{1}]超时", RecycleStation, eNodeStatus.MayEnter);
// curJobStep.Msg = msg;
//}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R7_WAIT_SHELF_IN_LINE))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
{
CommonVar.server.CloseDoor(RecycleStation);
//int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.FinishEnter));
//if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.R9_END);
runInfo = "空料架进入"+RecycleStation+"完成";
msg += runInfo;
curJobStep.Msg = msg;
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R8_WAIT_REACH_STANDY))
{
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
{
if (FindRecycleStation(agv))
{
curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION);
runInfo = "检测到"+RecycleStation+"需要空料架,向" + RecycleStation + "运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, RecycleStation);
UpdateJobTaskInfo(agv);
}
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.R9_END))
{
//Job job = CommonVar.control.GetJob(agv);
//if (job != null)
//{
// runInfo = "回收空料架任务完成,检测到任务,开始执行";
// msg += runInfo;
// curJobStep.Msg = msg;
// return job;
//}
return null;
}
return this;
}
/// <summary>
/// 搜索接收空料架的地方
/// </summary>
/// <returns></returns>
private bool FindRecycleStation(Agv_Info agv)
{
if(shelfType.Equals(ShelfType.ReelString))
{
bool res = JobType.FindNeedEnterMission(agv,SettingString.D1,true);
if(res)
{
RecycleStation = SettingString.D1;
return true;
}
res = JobType.FindNeedEnterMission(agv, SettingString.D3, true);
if (res)
{
RecycleStation = SettingString.D3;
return true;
}
res = JobType.FindNeedEnterMission(agv, SettingString.A2, true);
if (res)
{
RecycleStation = SettingString.A2;
return true;
}
}
return false;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
R1_NONE,
/// <summary>
/// 等待到达空料架处
/// </summary>
R2_WAIT_REACH_EMPTY_SHELF_PLACE,
/// <summary>
/// 等待线体回复
/// </summary>
R3_WAIT_LINE_RESPONSE,
/// <summary>
/// 等待料架进入AGV
/// </summary>
R4_WAIT_SHELF_IN_AGV,
/// <summary>
/// 等待到达空料架回收处
/// </summary>
R5_WAIT_REACH_RECYCLE_STATION,
/// <summary>
/// 等待回收线体回复
/// </summary>
R6_WAIT_RECYCLE_STATION_RESPONSE,
/// <summary>
/// 等待料架进入线体
/// </summary>
R7_WAIT_SHELF_IN_LINE,
/// <summary>
/// 等待到达待机位
/// </summary>
R8_WAIT_REACH_STANDY,
/// <summary>
/// 任务结束
/// </summary>
R9_END
}
}
}
using Common;
namespace DeviceLibrary
{
/// <summary>
/// 包装仓任务:将包装料架送往包装仓
/// </summary>
public class SendFullShelfJob : Job
{
/// <summary>
/// 将包装料架送往包装仓
/// </summary>
/// <param name="agvPlae">agv当前位置</param>
/// <param name="tarPlace">目的地</param>
/// <param name="mark">标志:出库任务则显示mark;入库任务显示Mark=InStore</param>
public SendFullShelfJob(string agvPlae, string tarPlace, string mark,string RFID= "")
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
this.RFID = RFID;
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
private string RFID = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("送满料架任务:{0} [RFID={1}][目的地={2}][任务名称={3}][任务状态={4}]", runInfo, RFID ,to,CurTaskName,CurTaskState);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
/// <summary>
/// 任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = runInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_LINE);
runInfo = "收到任务,向线体" + TargetPlace + "运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_LINE))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P3_WAIT_MANNUAL_OPERATION);
runInfo = "到达线体" + TargetPlace + ",等待卸料";
msg += runInfo;
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P3_WAIT_MANNUAL_OPERATION))
{
MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
System.Threading.Thread.Sleep(500);
if ((input != null && input[0]))
{
runInfo = "料架上的料在" + TargetPlace + "卸料完成.";
msg += runInfo;
curJobStep.Msg = msg;
return new RecycleEmptyShelf(TargetPlace,"",true);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_END))
{
return null;
}
return this;
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达线体
/// </summary>
P2_WAIT_REACH_LINE,
/// <summary>
/// 到达线体,等待卸料
/// </summary>
P3_WAIT_MANNUAL_OPERATION,
/// <summary>
/// 任务结束
/// </summary>
P4_END
}
}
}
using Common;
namespace DeviceLibrary
{
/// <summary>
///送料串
/// </summary>
public class SendShelfJob : Job
{
/// <summary>
/// 送料串
/// </summary>
/// <param name="agvPlae">agv当前位置</param>
/// <param name="tarPlace">目的地</param>
public SendShelfJob(string agvPlae, string tarPlace, string RFID = "")
{
this.agvPlace = agvPlae;
TargetPlace = tarPlace;
this.RFID = RFID;
}
/// <summary>
/// 接收任务时,agv的位置
/// </summary>
private string agvPlace = "";
private string RFID = "";
/// <summary>
/// 目的地
/// </summary>
public string TargetPlace { get; private set; }
private string runInfo = "";
/// <summary>
/// 运行信息
/// </summary>
public override string RunInfo
{
get
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("送料串任务[RFID={4}]:{0} [目的地={1}][任务名称={2}][任务状态={3}]", runInfo, to, CurTaskName, CurTaskState, RFID);
}
}
private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);
private string GetShowInfo()
{
int t1 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
string from = "";
if (t1 > -1)
from = CommonVar.nodeInfo[t1].AliceName;
else
from = agvPlace;
int t2 = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
string to = "";
if (t2 > -1)
to = CommonVar.nodeInfo[t2].AliceName;
else
to = TargetPlace;
return string.Format("送料串任务: {0} [{1}->{2}]", runInfo, from, to);
}
/// <summary>
/// 任务执行
/// </summary>
/// <param name="agv"></param>
public override Job Execute(Agv_Info agv)
{
string msg = agv.Name + " ";
bool rtn = false;
agv.Msg = GetShowInfo();
agv.RFID = RFID;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION);
runInfo = "收到任务,向" + TargetPlace + "运行";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, TargetPlace);
UpdateJobTaskInfo(agv);
}
else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_STATION))
{
if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.P3_WAIT_STATION_RESPONSE);
runInfo = "到达" + TargetPlace + ",并发送进料请求";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.server.Ready(TargetPlace, RFID);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P3_WAIT_STATION_RESPONSE))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));//&& s.StateEquals(eNodeStatus.MayEnter)
if (i > -1)
{
curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_SHELF_IN_STATION);
runInfo = "收到线体允许进料信号,链条运行";
msg += runInfo;
curJobStep.Msg = msg;
rtn = agv.AssignTask(SettingString.Leave);
UpdateJobTaskInfo(agv);
}
if (curJobStep.IsTimeOut(15000, out double timeOutTime))
{
curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION);
runInfo = string.Format("线体[{0}]允许进料信号[{1}]超时{2}秒,重发进料请求", TargetPlace, Agv.ClientAction.MayEnter, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]允许进料信号[{1}]超时15S,重发进料请求", TargetPlace, Agv.ClientAction.MayEnter);
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_SHELF_IN_STATION))
{
if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
{
CommonVar.server.CloseDoor(TargetPlace);
curJobStep.ToNextStep(EXECUTE_STEP.P5_END);
runInfo = "料架进入" + TargetPlace + "完成";
msg += runInfo;
curJobStep.Msg = msg;
}
else if (curJobStep.IsTimeOut(60000, out double timeOutTime))
{
runInfo = string.Format("线体[{0}]出料超时{1}秒,请检查料架情况", TargetPlace, timeOutTime.ToString("f2"));
msg += string.Format("线体[{0}]出料超时,请检查料架情况", TargetPlace);
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.P5_END))
{
return null;
}
return this;
}
private bool IsPlace(string place)
{
return TargetPlace.Equals(place);
}
/// <summary>
/// 执行流程
/// </summary>
private enum EXECUTE_STEP
{
/// <summary>
/// 接收到任务
/// </summary>
P1_NONE,
/// <summary>
/// 等待到达目的地
/// </summary>
P2_WAIT_REACH_STATION,
/// <summary>
/// 等待线体回复
/// </summary>
P3_WAIT_STATION_RESPONSE,
/// <summary>
/// 等待料架进入线体
/// </summary>
P4_WAIT_SHELF_IN_STATION,
/// <summary>
/// 任务结束
/// </summary>
P5_END
}
}
}
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}", 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 = RunInfo;
CurTaskState = CommonVar.GetTakJobState(agv);
if (curJobStep.IsStep(EXECUTE_STEP.NONE))
{
if (agvPlace.Equals(SettingString.Standby))//在待机位不操作
{
curJobStep.ToNextStep(EXECUTE_STEP.END);
runInfo = "在待机位,不执行操作";
msg += runInfo;
curJobStep.Msg = msg;
}
else
{
curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY);
runInfo = "从当前位置" + agvPlace + "回到待机位";
msg += runInfo;
curJobStep.Msg = msg;
CommonVar.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv);
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.WAIT_REACH_STANDBY))
{
if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
{
curJobStep.ToNextStep(EXECUTE_STEP.END);
runInfo = "到达待机位";
msg += runInfo;
curJobStep.Msg = msg;
}
}
else if (curJobStep.IsStep(EXECUTE_STEP.END))
{
Job job = CommonVar.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 Common;
namespace DeviceLibrary
{
/// <summary>
/// 云仓进料任务
/// </summary>
public class BoxInJobType : JobType
{
/// <summary>
/// 料仓料串任务
/// </summary>
/// <param name="currentAgv"></param>
/// <returns></returns>
public override Job GetNewJob(Agv_Info currentAgv)
{
if (!CommonVar.CheckCanExecuteMission(currentAgv))
return null;
if (!CommonVar.CheckAGVStatusNone(currentAgv))
return null;
string rfid = "";
//检查设备1入口需要空料串用作出库
if (FindNeedEnterMission(currentAgv, SettingString.D1, true))
{
if(FindNeedLeaveMission(currentAgv,SettingString.A1,out rfid,true))
{
LogUtil.info(string.Format("{0} [{1}]需要空料串,去[{2}]取料串[{3}]", currentAgv.Name, SettingString.D1,SettingString.A1, rfid));
return new GetShelfJob(currentAgv.Place, SettingString.A1, rfid, false);
}
}
//检查设备2入口需要空料串用作出库
if (FindNeedEnterMission(currentAgv, SettingString.D3, true))
{
if (FindNeedLeaveMission(currentAgv, SettingString.A1, out rfid, true))
{
LogUtil.info(string.Format("{0} [{1}]需要空料串,去[{2}]取料串[{3}]", currentAgv.Name, SettingString.D3, SettingString.A1, rfid));
return new GetShelfJob(currentAgv.Place, SettingString.A1, rfid, false);
}
}
//检查设备1入口需要满料
if (FindNeedEnterMission(currentAgv, SettingString.D1, false))
{
if(FindNeedLeaveMission(currentAgv, SettingString.A3, out rfid,false))
{
LogUtil.info(string.Format("{0} [{1}]需要满料串,去[{2}]取料串[{3}]", currentAgv.Name, SettingString.D1, SettingString.A3, rfid));
return new GetShelfJob(currentAgv.Place, SettingString.A3, rfid, true);
}
}
//检查设备2入口需要满料
if (FindNeedEnterMission(currentAgv, SettingString.D3, false))
{
if (FindNeedLeaveMission(currentAgv, SettingString.A3, out rfid, false))
{
LogUtil.info(string.Format("{0} [{1}]需要满料串,去[{2}]取料串[{3}]", currentAgv.Name, SettingString.D3, SettingString.A3, rfid));
return new GetShelfJob(currentAgv.Place, SettingString.A3, rfid, true);
}
}
return null;
}
}
}
using Common;
namespace DeviceLibrary
{
/// <summary>
/// 云仓出料任务
/// </summary>
public class BoxOutJobType : JobType
{
/// <summary>
/// 云仓出料任务
/// </summary>
/// <param name="agv"></param>
/// <returns></returns>
public override Job GetNewJob(Agv_Info agv)
{
if (!CommonVar.CheckCanExecuteMission(agv))
return null;
if (!CommonVar.CheckAGVStatusNone(agv))
return null;
string rfid = "";
string checkPlace = SettingString.D2;
//查找云仓出料的任务
if (FindNeedLeaveMission(agv, checkPlace, out rfid,false))
{
LogUtil.info(string.Format("{0} [{1}]需要出满料串{2}", agv.Name, checkPlace, rfid));
return new GetFullShelfJob(agv.Place, checkPlace, rfid);
}
if (FindNeedLeaveMission(agv, checkPlace,out rfid,true))
{
if (BoxInJobType.FindNeedEnterMission(agv, SettingString.D1, true)||
BoxInJobType.FindNeedEnterMission(agv, SettingString.D3, true)||
BoxInJobType.FindNeedEnterMission(agv, SettingString.A4, true)||
BoxInJobType.FindNeedEnterMission(agv, SettingString.A2, true))
{
LogUtil.info(string.Format("{0} [{1}]需要出空料串{2}", agv.Name, checkPlace, rfid));
return new GetShelfJob(agv.Place, checkPlace, rfid, false);
}
}
checkPlace = SettingString.D4;
if (FindNeedLeaveMission(agv, checkPlace, out rfid,false))
{
LogUtil.info(string.Format("{0} [{1}]需要出满料串{2}", agv.Name, checkPlace, rfid));
return new GetFullShelfJob(agv.Place, checkPlace, rfid);
}
if (FindNeedLeaveMission(agv, checkPlace, out rfid,true))
{
if (BoxInJobType.FindNeedEnterMission(agv, SettingString.D1, true) ||
BoxInJobType.FindNeedEnterMission(agv, SettingString.D3, true) ||
BoxInJobType.FindNeedEnterMission(agv, SettingString.A4, true) ||
BoxInJobType.FindNeedEnterMission(agv, SettingString.A2, true))
{
LogUtil.info(string.Format("{0} [{1}]需要出空料串{2}", agv.Name, checkPlace, rfid));
return new GetShelfJob(agv.Place, checkPlace, rfid, false);
}
}
return null;
}
public static bool CheckFullTask(string rfid = "")
{
return true;
}
}
}

namespace DeviceLibrary
{
/// <summary>
/// 待机任务
/// </summary>
public class ChargeJobType : JobType
{
/// <summary>
/// 待机任务
/// </summary>
/// <param name="currentAgv"></param>
/// <returns></returns>
public override Job GetNewJob(Agv_Info currentAgv)
{
if (currentAgv.Battery < CommonVar.Charge.BatteryMax - 10 && CommonVar.Charge.HasEmptyChargeStation(currentAgv))
{
currentAgv.RFID = "";
return new ChargeJob(currentAgv.Place);
}
else
{
currentAgv.RFID = "";
return new StandyJob(currentAgv.Place);
}
}
}
}
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Management;
namespace DeviceLibrary
{
public enum eMarkState
{
None,
Assigned,
Executing,
Finished
}
/// <summary>
/// 搜索包装仓任务
/// </summary>
public class PackingJobType : JobType
{
/// <summary>
/// 标记
/// </summary>
private static Dictionary<string, eMarkState> Marks = new Dictionary<string, eMarkState>();
private static object locBoj = new object();
public PackingJobType()
{
}
public static string GetMarks()
{
if (Marks != null && Marks.Count > 0)
{
StringBuilder temp = new StringBuilder();
foreach (var item in Marks.Keys)
{
temp.Append(string.Format("{0}={1} ", item, Marks[item]));
}
return temp.ToString().Trim();
}
return "";
}
public static void WriteMarks(string marks = "")
{
if (Marks != null && Marks.Count > 0)
{
Marks.Clear();
string[] tempMarks = marks.Split(' ');
foreach (string item in tempMarks)
{
string[] t1 = item.Split('=');
Marks.Add(t1[0], (eMarkState)Enum.Parse(typeof(eMarkState), t1[1]));
}
}
}
/// <summary>
/// 判断是否为入库标志
/// </summary>
/// <returns></returns>
public static bool IsInStoreMark(string mark)
{
return mark.Equals(SettingString.InStore_Mark);
}
public static bool DelMark(string mark)
{
lock (locBoj)
{
if (Marks != null && Marks.ContainsKey(mark))
{
Marks.Remove(mark);
return true;
}
}
return false;
}
public static bool AddMark(string mark)
{
lock (locBoj)
{
if (Marks != null && !Marks.ContainsKey(mark))
{
Marks.Add(mark, eMarkState.None);
return true;
}
}
return false;
}
public static bool ChangeMarkState(string mark, eMarkState value)
{
lock (locBoj)
{
if (Marks != null && Marks.ContainsKey(mark))
{
Marks[mark] = value;
return true;
}
}
return false;
}
/// <summary>
/// 包装仓任务
/// </summary>
/// <param name="currentAgv"></param>
/// <returns></returns>
public override Job GetNewJob(Agv_Info currentAgv)
{
if (currentAgv.IP.Equals(SettingString.SingleMission_IP1))
return null;
if (!CommonVar.CheckCanExecuteMission(currentAgv))
return null;
if (!CommonVar.CheckAGVStatusNone(currentAgv))
return null;
SearchMarks();
return FindPackingJob(currentAgv);
}
private void SearchMarks()
{
//Mark.Length>1防止Mark为0的情况,Mark=0是VMI的进料
int nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter)
&& s.Mark.Length > 1 && !Marks.ContainsKey(s.Mark) && s.IsUse);
if (nodeIdx > -1)
{
string mark = CommonVar.nodeInfo[nodeIdx].Mark;
AddMark(mark);
LogUtil.info(string.Format("包装仓出库任务生成:{0}={1}", mark, Marks[mark].ToString()));
}
else
{
nodeIdx = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter)
&& s.Mark.Equals("0") && !Marks.ContainsKey(SettingString.InStore_Mark) && s.IsUse);
if (nodeIdx > -1)
{
string mark = SettingString.InStore_Mark;
AddMark(mark);
LogUtil.info(string.Format("包装仓入库任务生成:{0}={1}", mark, Marks[mark].ToString()));
}
}
}
/// <summary>
/// 检查节点mark是否存在
/// </summary>
/// <param name="mark"></param>
/// <returns>true:存在</returns>
public static bool CheckNodeMark(string mark, string nodeName = "")
{
if (nodeName.Equals(""))
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Mark.Equals(mark));
if (i == -1)
return false;
else
return true;
}
else
{
int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Mark.Equals(mark));
if (i == -1)
return false;
else
return true;
}
}
private static object checkObj = new object();
/// <summary>
/// 检查是否有包装仓出库任务
/// </summary>
/// <returns></returns>
public static int CheckOutStroePackingJob()
{
lock (checkObj)
{
return CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter)
&& Marks.ContainsKey(s.Mark) && Marks[s.Mark].Equals(eMarkState.None) && s.IsUse);
}
}
/// <summary>
/// 检查是否有包装仓入库任务
/// </summary>
/// <returns></returns>
public static int CheckInStroePackingJob()
{
lock (checkObj)
{
int id = CommonVar.nodeInfo.FindIndex(s => s.StateEquals(eNodeStatus.NeedEnter) && s.Mark.Equals("0") && s.IsUse);
if (id > -1)
return CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A1) && s.RFID.StartsWith(SettingString.Packing_RFID_Prefix));
else
return id;
}
}
/// <summary>
/// 检查是否有包装仓出料架
/// </summary>
/// <returns></returns>
public static int CheckPackingOutShelf(out ClientNode tarNode, out string taskMark)
{
lock (checkObj)
{
taskMark = SettingString.InStore_Mark;
tarNode = null;
int id = CommonVar.nodeInfo.FindIndex(s => s.Name.StartsWith(SettingString.Packing_Box_Prefix) && s.StateEquals(eNodeStatus.NeedLeave) && s.RFID.StartsWith(SettingString.Packing_RFID_Prefix) && s.Mark.Equals("0") && s.IsUse);
if (id > -1)
{
taskMark = SettingString.InStore_Mark;
tarNode = CommonVar.nodeInfo[id];
return id;
}
else
{
id = CommonVar.nodeInfo.FindIndex(s => s.Name.StartsWith(SettingString.Packing_Box_Prefix) && s.StateEquals(eNodeStatus.NeedLeave)
&& s.RFID.StartsWith(SettingString.Packing_RFID_Prefix) && Marks.ContainsKey(s.Mark) && s.IsUse);
if (id > -1)
{
taskMark = CommonVar.nodeInfo[id].Mark;
tarNode = CommonVar.nodeInfo[id];
return id;
}
}
return -1;
}
}
/// <summary>
/// 搜索包装仓任务
/// </summary>
/// <returns>true:有任务</returns>
private Job FindPackingJob(Agv_Info agv)
{
//检查包装仓出料架
int nodeIdx = CheckPackingOutShelf(out ClientNode tarNode, out string taskMark);
if (nodeIdx > -1)
{
int agvId = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob is PackingJob_TransferShelf && ((PackingJob_TransferShelf)s.CurJob).TargetPlace.Equals(tarNode.Name));
if (agvId == -1)
return new PackingJob_TransferShelf(agv.Place, tarNode.Name, "", taskMark);// tarNode.RFID
}
//检查出库任务,没有出库,找入库任务
nodeIdx = CheckOutStroePackingJob();
if (nodeIdx == -1) //搜索包装仓入库任务
{
LogUtil.debug("B区没有找到需要出库的节点");
nodeIdx = CheckInStroePackingJob();
if (nodeIdx > -1)
{
//检查是否有小车去同一个目的地
int agvId = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is PackingJob_GetShelf && ((PackingJob_GetShelf)s.CurJob).TargetPlace.Equals(CommonVar.nodeInfo[nodeIdx].Name));
if (agvId == -1)
{
string Place = CommonVar.nodeInfo[nodeIdx].Name;
LogUtil.info(string.Format("{0} 任务生成:Place={1},Type={2}", agv.Name, Place, SettingString.InStore_Mark));
return new PackingJob_GetShelf(agv.Place, Place, SettingString.InStore_Mark);
}
}
}
else//B区域需要出库,寻找空料架
{
//检查是否有小车去同一个包装仓
int agvId = CommonVar.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is PackingJob_GetShelf && ((PackingJob_GetShelf)s.CurJob).TargetPlace.Equals(CommonVar.nodeInfo[nodeIdx].Name));
if (agvId > -1)
return null;
int n = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A7) && s.StateEquals(eNodeStatus.NeedLeave) &&
s.RFID.StartsWith(SettingString.Packing_RFID_Prefix) && s.IsUse);
if (n > -1)
{
string Place = CommonVar.nodeInfo[n].Name;
string Mark = CommonVar.nodeInfo[nodeIdx].Mark;
LogUtil.info(string.Format("{0} 任务生成:Place={1},Type={2}", agv.Name, Place, Mark));
return new PackingJob_GetShelf(agv.Place, Place, Mark);
}
else
{
//A4没有被占用
n = CommonVar.nodeInfo.FindIndex(s => s.Name == SettingString.A4 && s.StateEquals(eNodeStatus.NeedLeave)
&& s.IsUse);
if (n == -1)
{
nodeIdx = -1;
LogUtil.error("A7,A4不是NeedLeave或被占用");
agv.AddDisplayBoard("包装料架", "PackingShelf", "分盘线出口A7、包装线出口A4均无包装料架,请检查!");
}
else
{
string Place = CommonVar.nodeInfo[n].Name;
string Mark = CommonVar.nodeInfo[nodeIdx].Mark;
LogUtil.info(string.Format("{0} 任务生成:Place={1},Type={2}", agv.Name, Place, Mark));
return new PackingJob_GetShelf(agv.Place, Place, Mark);
}
}
}
return null;
}
}
}
此文件类型无法预览

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30104.148
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGVDispatch", "AGVDispatch\AGVDispatch.csproj", "{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceLibrary", "DeviceLibrary\DeviceLibrary.csproj", "{F9619F07-15F1-4E59-A383-3871952BBB79}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{BAFEAFE6-04E2-48EE-8845-BFC7EA3E3C21}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGV_UI", "AGV_UI\AGV_UI.csproj", "{C6D2FC09-46F7-4EC5-A877-15EA06342E4F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1C3207D-C67D-4B46-A9DB-D182F2074CCB}.Release|Any CPU.Build.0 = Release|Any CPU
{F9619F07-15F1-4E59-A383-3871952BBB79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F9619F07-15F1-4E59-A383-3871952BBB79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F9619F07-15F1-4E59-A383-3871952BBB79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F9619F07-15F1-4E59-A383-3871952BBB79}.Release|Any CPU.Build.0 = Release|Any CPU
{BAFEAFE6-04E2-48EE-8845-BFC7EA3E3C21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAFEAFE6-04E2-48EE-8845-BFC7EA3E3C21}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BAFEAFE6-04E2-48EE-8845-BFC7EA3E3C21}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BAFEAFE6-04E2-48EE-8845-BFC7EA3E3C21}.Release|Any CPU.Build.0 = Release|Any CPU
{C6D2FC09-46F7-4EC5-A877-15EA06342E4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6D2FC09-46F7-4EC5-A877-15EA06342E4F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6D2FC09-46F7-4EC5-A877-15EA06342E4F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6D2FC09-46F7-4EC5-A877-15EA06342E4F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6958A655-C82F-4C09-951F-24E629575E89}
EndGlobalSection
EndGlobal
文件属性发生变化
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!