python工业互联网应用实战2—从需求开始
前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻。小米/华为智能工厂只能说是中国制造2025的一个代表,产业转型和制造升级,笔者从事的企业领域就越到越来越多的(制造)企业开始悄悄的自动化/智能化。这里肯定有国家政策推动的大背景,同时,也有着企业自身不断提高生产率的“刚需”。
本序列我们也从一个需求问题开始;然后,拆解需求(问题);其次,解决拆解需求(问题)的点;再次,通过的不断技术摸索和迭代过程找到一个个合理的解决需求的方法和手段,最终,完成了这个需求(问题)的项目实战。我们会在文中描述演化过程、方法论、过程保证机制和实用的工具等,最终带着大家完成这样一个实际项目需求的项目过程。项目涉及的Django的更多基础知识请大家阅读笔者早期的《Python开发入门与实战系列》。
本文的过程采用python3.6和django2.1版本
项目需求:这是一个简版物流自动化仓库实例,仓库控制系统(以下简称WCS)需要调度AGV小车运送一个实托盘(搬运单元)从1楼入库站台经由提升机搬运到2楼指定的仓库货位。
1.需求分析
仓库控制系统(以下简称WCS)需要调度AGV小车运送一个实托盘(搬运单元)从1楼入库站台经由提升机搬运到2楼指定的仓库货位。这句简要描述常常是我们在项目URS看到的需求描述,接下来我们需要对拿到的需求进行分析,形成一个个可度量的开发功能点。
1.1.用例说明
需求用例说明文档能够很好的对需求进行详细的分析,主要的包含内容包括:前置条件、事件流程和后置条件(执行结果)用例描述如下表,通过用例分析我们能够很好的把握需求的具体事件执行流程,并通过文档清晰的描述出来,便于后期设计编码时作为开发设计人员的指导。
经过团队头脑风暴讨论,大家基本上达成了如下表的需求用例说明,我们把这个调度设备的搬运过程设计成一个序列顺序执行的步骤(子任务),这些子任务对应着设备的执行分解动作。
|
用例编码 |
1.1 |
执行角色 |
WCS |
|
用例名称 |
托盘入库用例 |
||
|
前提条件 |
|
||
|
需求描述 |
1 WCS分解搬运任务成3个设备作业; 2 调度AGV从入库站台搬运托盘到提升机1楼门口工位; 3 调度提升机到1楼并打开廊门; 4 调度AGV从提升机1楼门口工位到提升机并卸货,返回提升机门口工位; 5 调度提升机1楼提升到2楼并开门; 6 调度AGV进入提升机并载货搬运到2楼门口工位; 7 调度提升机关门; 8 调度AGV从2楼门口工位搬运到库存货位。 |
||
|
备选过程 |
|||
|
扩展过程 |
|
||
|
原始需求描述 |
参见 《XXX URS》 |
||
|
特殊需求 |
无 |
||
|
后置条件 |
WCS调度相关设备完成实托盘从入库站台搬运到库存货位,反馈结果给WMS |
||
2. 需求功能点
从上面的用例说明的需求描述事件流程来看,我们需要先把这一趟搬运任务分解成设备子任务,并串行的方式顺序下达到设备执行,任务清单如下表:
|
序号 |
作业描述 |
执行设备 |
|
1 |
调度AGV从入库站台搬运托盘到提升机1楼门口工位 |
1楼AGV |
|
2 |
调度提升机到1楼并打开门 |
提升机 |
|
3 |
调度AGV从提升机1楼门口工位到提升机并卸货,返回提升机门口工位 |
1楼AGV |
|
4 |
调度提升机1楼提升到2楼并开门 |
提升机 |
|
5 |
调度AGV进入提升机并载货搬运到2楼门口工位 |
2楼AGV |
|
6 |
调度提升机关门 |
提升机 |
|
7 |
调度AGV从2楼门口工位搬运到库存货位 |
2楼AGV |
也就是说这一趟搬运任务,WCS需要分解成7个设备作业子任务,并顺序下达给相应的执行设备执行,最终完成任务的执行(当前的任务划分粒度实际对接AGV和提升机厂家来说会有调整,最终以上步骤会依赖与实际对接的情况,但是主流程不会有太大变化)。
经过分析从1楼入库站台运送托盘到二楼某个指定货位这样一个任务,系统需要分解成7个子任务,下达给设备顺序执行。系统活动图如下:
3. 活动图
经过分析从1楼入库站台运送托盘到2楼某个指定货位这样一个任务,系统需要分解成7个子任务,下达给设备顺序执行。我们还可以通过UML活动图来进一步详细的描述作业的执行顺序如下图:

从图中我们可以看出来一次入库任务,系统分解为7个设备子任务(作业)来执行完整的托盘入库流程,只有所有子任务(作业)执行完成,托盘的入库才算完成。
4. 功能模块
对于这样一个看似简单的需求来说,包含两大主要功能模块
- 任务分解:依据物理设备处理任务的条件,对任务进行分解,任务分解的粒度是设备能够识别并执行(动作)
- 任务调度:任务调度就是按照顺序执行的逻辑,把任务顺序和逐一下达给设备
这里也有几个基本逻辑就是,设备在某一个时间点上只能执行一个子任务,只有这个任务执行完毕后方能下达新的子任务。多重任务逻辑只会导致设备无法完成任务(不知道到底该执行那个动作)。
4.1. 实体关系
我们从上面需求分析整理当前至少包括2个实体,包含的属性(字段)如下:
1任务:
任务ID,任务号,源地址(从哪儿),目标地址(到哪儿),开始时间,结束时间,状态
2子任务:
子任务ID,任务ID,源地址(从哪儿 上一个子任务的目标地址), 目标地址(到哪儿 下一个子任务的源地址), 执行机构,开始时间,结束时间,状态
5. 小节
本章我们从一个需求问题开始,然后经过需求分析,把需求问题分解为功能点和数据实体,实体是下一步我们设计表或ORM model的基础原型,上面的实体只是一个初步的需求分析主要字段要求,实体属性(字段)会设计时会增加特定的其它属性(字段)。 下一章节我们将描绘如何把这个需求逐步演化到模型设计。
python工业互联网应用实战2—从需求开始的更多相关文章
- python工业互联网应用实战1—SQL与ORM
从sql到ORM应该说也是编程体系逐步演化的结果,通过类和对象更好的组织开个过程中遇到的各种业务问题,面向对象的解耦和内聚作为一套有效的方法论,对于复杂的企业应用而言确实能够解决实践过程中很多问题. ...
- python工业互联网应用实战3—模型层构建
本章开始我们正式进入到实战项目开发过程,如何从需求分析获得的实体数据转到模型设计中来,变成Django项目中得模型层.当然,第一步还是在VS2019 IDE环境重创建一个工程项目,本文我们把工程名称命 ...
- python工业互联网应用实战3—Django Admin列表
Django Admin笔者使用下来可以说是Django框架的开发利器,业务model构建完成后,我们就能快速的构建一个增删查改的后台管理框架.对于大量的企业管理业务开发来说,可以快速的构建一个可发布 ...
- python工业互联网应用实战7—业务层
本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...
- python工业互联网应用实战6—任务分解
根据需求定义"任务"是一个完整的业务搬运流程,整个流程涉及到多个机构(设备)分别动作执行多个步骤,所以依据前面的模型设计,需要把任务分解到多个连续的子任务(作业),未来通过顺序串联 ...
- python工业互联网应用实战11—客户端UI
这个章节我们将演示用户端界面的开发,当前演示界面还是采用先实现基本功能再逐步完善的"敏捷"模式.首先聚焦在功能逻辑方面实现普通用户与系统的交互,普通用户通过url能查看到当前任务的 ...
- python工业互联网应用实战13—基于selenium的功能测试
本章节我们再来说说测试,单元测试和功能测试.单元测试我们在数据验证章节简单提过了,本章我们进一步如何用单元测试来测试view的功能代码:同时,也涉及一下基于selenium的功能测试做法.笔者过去的项 ...
- python工业互联网应用实战14——单元测试覆盖率
前面的章节我们完成了任务管理主要功能的开发及单元测试编写,可如何知道单元测试效果怎么样呢?测试充分吗?还有没有没有测到的地方呢? 本章节我们介绍一个统计测试代码覆盖率的利器Coverage,Cover ...
- python工业互联网应用实战15-前后端分离模式1
我们在13章节里通过监控界面讲了如何使用jquery的动态加载数据写法,通过简单案例来说明了如何实现动态的刷新监控界面的数据,本章我们将演示如何从Django模板加载数据逐步演化到前后端分离的异步数据 ...
随机推荐
- A == B ?(hdu2054)
输入格式:直接循环,同时输入两个不带空格未知长度的字符串. 思考:不带空格未知长度且同时输入,用两个char s[maxsize]定义两个字符数组,再用scanf_s()函数同时输入两个字符串. 注意 ...
- .NET Core HttpClientFactory+Consul实现服务发现
前言 上篇文章.NET Core HttpClient+Consul实现服务发现提到过,HttpClient存在套接字延迟释放的问题,高并发情况导致端口号被耗尽引起服务器拒绝服务的问题.好在微软意识到 ...
- JAVA反射整理总结
//1.通过对象获取 Person p=new Person(); Class c=p.getClass(); //2.通过类 ...
- 用tarjan求LCA板子(比倍增快)
懒!!直接转载!!!! https://solstice23.top/archives/62
- P2812 校园网络
luogu 传送门 首先考虑问题一 不难想到,如果有一个学校作为终端机,那么跟其处于同一个强联通中的所有学校就可以不用作为终端机了. 那么,问题一也就迎刃而解了:找到所有入度为0的缩点.因为这个学校( ...
- jQuery-DOM增删查改
1.绑定事件 $().事件名(function(){功能}) 事件名:鼠标事件 键盘事件 表单事件 事件委托:$().on('事件名',#####'target',function(){功能}) 额外 ...
- Web-从Java Request对象到HTTP协议
https://mp.weixin.qq.com/s/PjcA22STEDGwRxVQweObQQ Java Web中的Request对象是哪里来的?Response对象的角色是什么? Java We ...
- 【大厂面试03期】MySQL是怎么解决幻读问题的?
问题分析 首先幻读是什么? 根据MySQL文档上面的定义 The so-called phantom problem occurs within a transaction when the same ...
- SQL Server使用Offset/Fetch Next实现分页
T-SQL实现分页 ,查找指定范围内的数据 首先,正常的查询是这样的 使用分页后 select * from Products order by ProductID offset X rows fet ...
- Java实现 计蒜客 拯救行动
拯救行动 公主被恶人抓走,被关押在牢房的某个地方.牢房用 N \times M (N, M \le 200)N×M(N,M≤200) 的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫( ...