使用手册 - Simple:从使用到开发:修订间差异
无编辑摘要 |
无编辑摘要 |
||
| (未显示同一用户的5个中间版本) | |||
| 第1行: | 第1行: | ||
== 1.认识simple == | |||
=== 1.1 认识Simple根目录 === | |||
下图是某项目的Simple根目录,其中SimpleComposer.exe为Simple的应用程序,simple.json为配置文件,根目录下的各种.dll库文件为依赖项,如本项目中用到AbstractChainDeliveryMission类,就引用自MDCSToolBox.dll中。其余json文件,如1510.json为Simple的工程文件。plugins文件夹下存储了工程师开发的当前场景的插件。 | 下图是某项目的Simple根目录,其中SimpleComposer.exe为Simple的应用程序,simple.json为配置文件,根目录下的各种.dll库文件为依赖项,如本项目中用到AbstractChainDeliveryMission类,就引用自MDCSToolBox.dll中。其余json文件,如1510.json为Simple的工程文件。plugins文件夹下存储了工程师开发的当前场景的插件。 | ||
[[文件:74d434da04a4ade031a8bc9dbbcede2.png|无|缩略图|600x600像素]] | [[文件:74d434da04a4ade031a8bc9dbbcede2.png|无|缩略图|600x600像素]] | ||
下图为错误示范,由于开发项目时引用不规范,导致编译出很多无用的dll库文件,且直接放在Simple根目录下,有时会导致Simple启动时报错。 | 下图为错误示范,由于开发项目时引用不规范,导致编译出很多无用的dll库文件,且直接放在Simple根目录下,有时会导致Simple启动时报错。 | ||
[[文件:2e1c582f8ddd429e798bbc9f3f7ef65.png|无|缩略图|600x600像素]] | |||
=== 1.2 认识simple.json文件 === | |||
下图为simple.json文件中的内容,autoload代表了自动加载此工程文件,ip及port为simple监听的ip及端口。 | 下图为simple.json文件中的内容,autoload代表了自动加载此工程文件,ip及port为simple监听的ip及端口。 | ||
[[文件:60968e237ab0e1f7a3d4b899dc6b7c0.png|无|缩略图|600x600像素]] | [[文件:60968e237ab0e1f7a3d4b899dc6b7c0.png|无|缩略图|600x600像素]] | ||
=== 1.3 加载simple插件 === | |||
打开Simple文件夹,在Plugin里面会有工程师提供的当前场景的插件(默认名称AMRScene.dll),根据车型以及业务场景的不同,工程师会编写对应的插件,如果插件有更新,替换Simple/Plugins目录内AMRScene.dll即可。AMRScene.pdb为调试所用,可以简单的理解为,当程序异常或报错时,可以在控制台看到异常的程序在哪一行。 | 打开Simple文件夹,在Plugin里面会有工程师提供的当前场景的插件(默认名称AMRScene.dll),根据车型以及业务场景的不同,工程师会编写对应的插件,如果插件有更新,替换Simple/Plugins目录内AMRScene.dll即可。AMRScene.pdb为调试所用,可以简单的理解为,当程序异常或报错时,可以在控制台看到异常的程序在哪一行。 | ||
== 2.如何使用Simple == | |||
=== 2.1 simple主界面 === | |||
如下图,为simple主界面,界面中的各个元素的功能如标注中所示。 | 如下图,为simple主界面,界面中的各个元素的功能如标注中所示。 | ||
[[文件:Cb0653332cab21edd407a7d9eb74773.png|无框|600x600像素]] | [[文件:Cb0653332cab21edd407a7d9eb74773.png|无框|600x600像素]] | ||
=== 2.2 创建小车 === | |||
如下图,点击车辆-添加,可以选择添加的小车类型,本地模拟可以添加模拟车,实际生产中需添加本项目车型。 | 如下图,点击车辆-添加,可以选择添加的小车类型,本地模拟可以添加模拟车,实际生产中需添加本项目车型。 | ||
| 第33行: | 第28行: | ||
[[文件:Fb9ada5c49d9168b9b929eb67b903ff.png|无框|600x600像素]] | [[文件:Fb9ada5c49d9168b9b929eb67b903ff.png|无框|600x600像素]] | ||
=== 2.3 创建站点和路径 === | |||
如下图所示,点击场景-添加,即可添加站点和路径,首先添加站点,添加路径时需要将站点连接起来。 | 如下图所示,点击场景-添加,即可添加站点和路径,首先添加站点,添加路径时需要将站点连接起来。 | ||
[[文件:C22d3bd3efeec25bfd0136b6f25e70b.png|无框|600x600像素]] | [[文件:C22d3bd3efeec25bfd0136b6f25e70b.png|无框|600x600像素]] | ||
=== 2.4 添加/修改站点、路径字段 === | |||
如下图所示,选中站点或路径时,可以看到添加的字段。字段需要根据程序中所写的内容进行添加。点击添加字段,输入 字段名:字段值 即可添加字段。 | |||
[[文件:9a34d2b545f5958370b05a9107befa2.png|无|缩略图|600x600像素]] | [[文件:9a34d2b545f5958370b05a9107befa2.png|无|缩略图|600x600像素]] | ||
simple中内置了很多字段,如下表 | simple中内置了很多字段,如下表 | ||
| 第83行: | 第78行: | ||
|该路径方向 | |该路径方向 | ||
|direction:1代表此段路径为单行道且只能正向,2代表反向,0不限制方向 | |direction:1代表此段路径为单行道且只能正向,2代表反向,0不限制方向 | ||
|} | |||
=== 2.4 移动车辆 === | |||
在创建好站点、路径,添加好车辆之后,可以控制小车移动,如果使用模拟车,需要先选中模拟车,右键点击站点,模拟车就会移动到该站点,如果使用真实小车,小车会出现在定位的位置上。点击初始化,模拟车需要双击“去某地”,然后左键点击想去的站点,真实车辆直接使用右键单击想去的站点,就会生成路径并执行。 | |||
[[文件:2b1affdb3bbb4bcc744d5d0b00e205c.png|无|缩略图|600x600像素]] | |||
[[文件:97ed37cbbd7788e915864afb3d57834.png|无|缩略图|600x600像素]] | |||
=== 2.5 使用进程 === | |||
工程师会针对业务场景设计进程,如自动充电、链式搬运等,点击进程-添加即可添加对应的进程,添加进程后需启动进程,并且可以点击下方的按钮,会有对应的动作。 | |||
[[文件:A7565cb223c4523e633f86060cebb8d.png|无框|600x600像素]] | |||
=== 2.6 保存 === | |||
此步骤为最关键的一步,建议经常进行保存,点击保存项目,新建文件进行保存,建议命名格式为:日期-时间,也请不要覆盖之前的项目文件,保证出问题后方便回滚。记得每次修改,都在最新的工程文件基础上修改。 | |||
== 3.如何开发simple插件 == | |||
==== 3.1 定义场景中的一台车 ==== | |||
定义场景中的一台车,意味着需要定义场景和车,场景包括站点和路径,车包括本项目的小车。 | |||
首先在simple工程下创建xxxCar.cs,在此文件中会定义该场景内的车辆。创建车辆类,继承抽象类。如下图所示,创建了FG2305014项目的车体,继承自clumsyCar。Creat中定义了创建车辆时的基本信息,以下代码表示创建了名为“赛力斯潜伏式牵引”、ip地址为“127.0.0.1”、速度为1000的车辆。通过覆写draw方法,可以改变车体在simple界面中的形状。 | |||
[[文件:2e5f3fc590e779129098f772a24f728.png|无框|600x600像素]] | |||
在创建完车体后,还需要定义其在站点、路径上的动作。首先需要定义站点、路径上的字段,分别创建SiteFields和TrackFields类,类中的对象为站点、路径上的字段,字段可以通过coder机制(路径编译机制)下发到车体,使车辆执行对应的动作。 | |||
[[文件:9e3d59399bb843163bff85a58539fec.png|无|缩略图|600x600像素]] | |||
定义完字段,需要使用TemplateTrackCoderSettings和TemplateSiteCoderSettings进行路径编译,为路径编译的Attribute,Attribute的定义可以查看微软官方文档。下图为几个例子。 | |||
[[文件:0c5eb0d30b46820ea2a7f6e39a451a4.png|无|缩略图|600x600像素]] | |||
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。 | |||
[[文件:794aa3ee77ec7092a0c7375f6a3d7f0.png|无框|600x600像素]] | |||
然后写一个demo,首先通过SimpleLib.GetAllSites()获取所有点位,然后找到name字段为“start”、“startSite”、“endSite”的点。,然后循环执行刚才写的GoSite方法,使小车绕着路径一直跑。需注意,地图上必须有name字段为“start”、“startSite”、“endSite”的三个点,且可以找到他们之间的路径。 | |||
[[文件: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 |