使用手册 - Simple:从使用到开发:修订间差异

来自MDCS wiki
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
 
第116行: 第116行:


[[文件:B4b776c07aa0e8d687305fd4a879d44.png|无框|600x600像素]]
[[文件:B4b776c07aa0e8d687305fd4a879d44.png|无框|600x600像素]]
MethodMember下的方法,会形成simple中的一个按钮,由于这个方法是写在小车中的,所以点击小车-动作,即可看到这个按钮并使用。
[[文件:1250453daa4d9fd3121a0564d209335.png|无框|600x600像素]]
==== 3.3 为车辆创建一个任务进程 ====
任务进程作为simple中重要部分,可以执行自动化任务。目前已有的标准任务插件有:AbstractChainDeliveryMission(链式搬运任务抽象类)、AbstractChargeMission(自动充电抽象类)、AbstractInterlockMission(安全互锁抽象类)。
下面以最常用的链式搬运任务为例。讲解任务进程如何开发。
首先创建一个该场景下的链式搬运任务类,并集成抽象类(若无标准任务抽象类,需继承Mission类),然后覆写Execute方法,在里面加入进程启动时需要进行的操作。如果有自定义的选车逻辑,可以覆写CustomCarSelectLogic方法。
[[文件:0da5d71dd60ed6555f93404d3cd5a15.png|无|缩略图|600x600像素]]
然后可以在该类中添加MethodMember,添加任务中的按钮。
[[文件:36ef0b693d648fde330f8a995ce962a.png|无|缩略图|600x600像素]]
编译simple工程,替换插件,可以在进程-添加自定义进程中看到刚才新写的任务进程。添加后,可在下方的动作内看到新写的按钮。
==== 3.4 开发中常用方法 ====
simple中有以下常用方法
{| class="wikitable"
|+
!方法名
!作用
!参数类型
!返回值类型
|-
|SimpleLib.GetSite(in siteId)
|找到id为SiteId的点
|int
|Site
|-
|SimpleLib.GetCar(int cartId)
|找到id为cartId的车辆
|interesting
|Car
|-
|SimpleLib.GetAllSites()
|获取simple中所有点
|
|list
|-
|SimpleLib.GetAllCars()
|获取simple中所有车
|
|list
|-
|SimpleLib.GetAllTracks()
|获取simple中所有路径
|
|list
|-
|car.fields["fields"]
|获取车辆字段为“fields”的值
|
|string
|-
|site.fields["fields"]
|获取站点字段为“fields”的值
|
|string
|-
|track.fields["fields"]
|获取路径字段为“fields”的值
|
|string
|-
|car.status.enums["soc"]
|获取clumsy中ASLowerIO且设置upload的变量
|string
|string
|}

2023年10月19日 (四) 16:45的最新版本

1.认识simple

1.1 认识Simple根目录

下图是某项目的Simple根目录,其中SimpleComposer.exe为Simple的应用程序,simple.json为配置文件,根目录下的各种.dll库文件为依赖项,如本项目中用到AbstractChainDeliveryMission类,就引用自MDCSToolBox.dll中。其余json文件,如1510.json为Simple的工程文件。plugins文件夹下存储了工程师开发的当前场景的插件。

下图为错误示范,由于开发项目时引用不规范,导致编译出很多无用的dll库文件,且直接放在Simple根目录下,有时会导致Simple启动时报错。

1.2 认识simple.json文件

下图为simple.json文件中的内容,autoload代表了自动加载此工程文件,ip及port为simple监听的ip及端口。

1.3 加载simple插件

打开Simple文件夹,在Plugin里面会有工程师提供的当前场景的插件(默认名称AMRScene.dll),根据车型以及业务场景的不同,工程师会编写对应的插件,如果插件有更新,替换Simple/Plugins目录内AMRScene.dll即可。AMRScene.pdb为调试所用,可以简单的理解为,当程序异常或报错时,可以在控制台看到异常的程序在哪一行。

2.如何使用Simple

2.1 simple主界面

如下图,为simple主界面,界面中的各个元素的功能如标注中所示。

2.2 创建小车

如下图,点击车辆-添加,可以选择添加的小车类型,本地模拟可以添加模拟车,实际生产中需添加本项目车型。

添加车辆后,若为本地模拟,只需要设置速度,将速度填写在speed字段中;若为实际车辆,还需要填写ip地址,填写在address字段中。

2.3 创建站点和路径

如下图所示,点击场景-添加,即可添加站点和路径,首先添加站点,添加路径时需要将站点连接起来。

2.4 添加/修改站点、路径字段

如下图所示,选中站点或路径时,可以看到添加的字段。字段需要根据程序中所写的内容进行添加。点击添加字段,输入 字段名:字段值 即可添加字段。

simple中内置了很多字段,如下表

字段类型 字段名称 字段含义 举例
站点 mustFree 必空点 给某个点设置mustFree:[1,2,3],代表此站点被锁时,id为1、2、3的站点不允许被其它点锁定
站点 codeArrive 到达此点动作 codeArrive:agv.Put();代表到达此点后执行Put动作
站点 codeLeave 离开此点动作 codeLeave:agv.Put();代表离开此点时执行Put动作
站点 codeQueue 队列动作 codeQueue:agv.Put();代表在此点发生路径切换时执行Put动作
站点 routing 必经点 参考使用手册-routing字段使用
路径 speed 该路径速度 speed:1000,代表在此段路径上车辆速度切换为1000
路径 direction 该路径方向 direction:1代表此段路径为单行道且只能正向,2代表反向,0不限制方向

2.4 移动车辆

在创建好站点、路径,添加好车辆之后,可以控制小车移动,如果使用模拟车,需要先选中模拟车,右键点击站点,模拟车就会移动到该站点,如果使用真实小车,小车会出现在定位的位置上。点击初始化,模拟车需要双击“去某地”,然后左键点击想去的站点,真实车辆直接使用右键单击想去的站点,就会生成路径并执行。

2.5 使用进程

工程师会针对业务场景设计进程,如自动充电、链式搬运等,点击进程-添加即可添加对应的进程,添加进程后需启动进程,并且可以点击下方的按钮,会有对应的动作。

2.6 保存

此步骤为最关键的一步,建议经常进行保存,点击保存项目,新建文件进行保存,建议命名格式为:日期-时间,也请不要覆盖之前的项目文件,保证出问题后方便回滚。记得每次修改,都在最新的工程文件基础上修改。

3.如何开发simple插件

3.1 定义场景中的一台车

定义场景中的一台车,意味着需要定义场景和车,场景包括站点和路径,车包括本项目的小车。

首先在simple工程下创建xxxCar.cs,在此文件中会定义该场景内的车辆。创建车辆类,继承抽象类。如下图所示,创建了FG2305014项目的车体,继承自clumsyCar。Creat中定义了创建车辆时的基本信息,以下代码表示创建了名为“赛力斯潜伏式牵引”、ip地址为“127.0.0.1”、速度为1000的车辆。通过覆写draw方法,可以改变车体在simple界面中的形状。

在创建完车体后,还需要定义其在站点、路径上的动作。首先需要定义站点、路径上的字段,分别创建SiteFields和TrackFields类,类中的对象为站点、路径上的字段,字段可以通过coder机制(路径编译机制)下发到车体,使车辆执行对应的动作。

定义完字段,需要使用TemplateTrackCoderSettings和TemplateSiteCoderSettings进行路径编译,为路径编译的Attribute,Attribute的定义可以查看微软官方文档。下图为几个例子。

priority代表优先级,优先级越高,执行顺序越靠前。templateString为下发脚本的内容,agv.GO()代表执行Go方法,此方法需要在clumy工程下的AGV.cs中写好。useVerb为触发条件,track.reverseDst == dst.id表示在路径上有reverseDst字段,且值为目标点的id,此时会下发agv.Go(***)的脚本,Go中的参数分别为起始点坐标和id、终点的坐标和id、路径的id和速度、转弯类型(自旋或平滑转弯)、是否倒退,blockVerb = true代表不执行比此条优先级更低的动作。整条TemplateSiteCoderSettings的意思为:在路径上有reverseDst字段,且值为目标点的id,此时会下发让车辆倒走的脚本,且为最后一个动作。

3.2 为小车写一个循环跑圈程序

首先写一个移动小车去目标点的方法。任然在刚才的车体类中写。调用FindRoute寻路,起始点为小车当前点,目标点为参数中传递进来的点,执行完后,更新小车的siteId为目标点的id。

然后写一个demo,首先通过SimpleLib.GetAllSites()获取所有点位,然后找到name字段为“start”、“startSite”、“endSite”的点。,然后循环执行刚才写的GoSite方法,使小车绕着路径一直跑。需注意,地图上必须有name字段为“start”、“startSite”、“endSite”的三个点,且可以找到他们之间的路径。

MethodMember下的方法,会形成simple中的一个按钮,由于这个方法是写在小车中的,所以点击小车-动作,即可看到这个按钮并使用。

3.3 为车辆创建一个任务进程

任务进程作为simple中重要部分,可以执行自动化任务。目前已有的标准任务插件有:AbstractChainDeliveryMission(链式搬运任务抽象类)、AbstractChargeMission(自动充电抽象类)、AbstractInterlockMission(安全互锁抽象类)。

下面以最常用的链式搬运任务为例。讲解任务进程如何开发。

首先创建一个该场景下的链式搬运任务类,并集成抽象类(若无标准任务抽象类,需继承Mission类),然后覆写Execute方法,在里面加入进程启动时需要进行的操作。如果有自定义的选车逻辑,可以覆写CustomCarSelectLogic方法。

然后可以在该类中添加MethodMember,添加任务中的按钮。

编译simple工程,替换插件,可以在进程-添加自定义进程中看到刚才新写的任务进程。添加后,可在下方的动作内看到新写的按钮。

3.4 开发中常用方法

simple中有以下常用方法

方法名 作用 参数类型 返回值类型
SimpleLib.GetSite(in siteId) 找到id为SiteId的点 int Site
SimpleLib.GetCar(int cartId) 找到id为cartId的车辆 interesting Car
SimpleLib.GetAllSites() 获取simple中所有点 list
SimpleLib.GetAllCars() 获取simple中所有车 list
SimpleLib.GetAllTracks() 获取simple中所有路径 list
car.fields["fields"] 获取车辆字段为“fields”的值 string
site.fields["fields"] 获取站点字段为“fields”的值 string
track.fields["fields"] 获取路径字段为“fields”的值 string
car.status.enums["soc"] 获取clumsy中ASLowerIO且设置upload的变量 string string