前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻。小米/华为智能工厂只能说是中国制造2025的一个代表,产业转型和制造升级,笔者从事的企业领域就越到越来越多的(制造)企业开始悄悄的自动化/智能化。这里肯定有国家政策推动的大背景,同时,也有着企业自身不断提高生产率的“刚需”。

  本序列我们也从一个需求问题开始;然后,拆解需求(问题);其次,解决拆解需求(问题)的点;再次,通过的不断技术摸索和迭代过程找到一个个合理的解决需求的方法和手段,最终,完成了这个需求(问题)的项目实战。我们会在文中描述演化过程、方法论、过程保证机制和实用的工具等,最终带着大家完成这样一个实际项目需求的项目过程。项目涉及的Django的更多基础知识请大家阅读笔者早期的《Python开发入门与实战系列》。

  本文的过程采用python3.6和django2.1版本

项目需求:这是一个简版物流自动化仓库实例,仓库控制系统(以下简称WCS)需要调度AGV小车运送一个实托盘(搬运单元)从1楼入库站台经由提升机搬运到2楼指定的仓库货位。

1.需求分析

  仓库控制系统(以下简称WCS)需要调度AGV小车运送一个实托盘(搬运单元)从1楼入库站台经由提升机搬运到2楼指定的仓库货位。这句简要描述常常是我们在项目URS看到的需求描述,接下来我们需要对拿到的需求进行分析,形成一个个可度量的开发功能点。

1.1.用例说明

  需求用例说明文档能够很好的对需求进行详细的分析,主要的包含内容包括:前置条件、事件流程和后置条件(执行结果)用例描述如下表,通过用例分析我们能够很好的把握需求的具体事件执行流程,并通过文档清晰的描述出来,便于后期设计编码时作为开发设计人员的指导。

  经过团队头脑风暴讨论,大家基本上达成了如下表的需求用例说明,我们把这个调度设备的搬运过程设计成一个序列顺序执行的步骤(子任务),这些子任务对应着设备的执行分解动作。

用例编码

1.1

执行角色

WCS

用例名称

托盘入库用例

前提条件

  1. WMS已完成任务货位的分配,任务核心信息:托盘条码、源地址、目标地址;
  2. AGV不能跨楼层作业,1楼与2楼分别是不同的AGV小车执行任务;

需求描述

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. 功能模块

  对于这样一个看似简单的需求来说,包含两大主要功能模块

    1. 任务分解:依据物理设备处理任务的条件,对任务进行分解,任务分解的粒度是设备能够识别并执行(动作)
    2. 任务调度:任务调度就是按照顺序执行的逻辑,把任务顺序和逐一下达给设备

  这里也有几个基本逻辑就是,设备在某一个时间点上只能执行一个子任务,只有这个任务执行完毕后方能下达新的子任务。多重任务逻辑只会导致设备无法完成任务(不知道到底该执行那个动作)。

4.1. 实体关系

  我们从上面需求分析整理当前至少包括2个实体,包含的属性(字段)如下:

1任务

任务ID,任务号,源地址(从哪儿),目标地址(到哪儿),开始时间,结束时间,状态

2子任务:

子任务ID,任务ID,源地址(从哪儿 上一个子任务的目标地址), 目标地址(到哪儿 下一个子任务的源地址), 执行机构,开始时间,结束时间,状态

5. 小节

  本章我们从一个需求问题开始,然后经过需求分析,把需求问题分解为功能点和数据实体,实体是下一步我们设计表或ORM model的基础原型,上面的实体只是一个初步的需求分析主要字段要求,实体属性(字段)会设计时会增加特定的其它属性(字段)。 下一章节我们将描绘如何把这个需求逐步演化到模型设计。

python工业互联网应用实战2—从需求开始的更多相关文章

  1. python工业互联网应用实战1—SQL与ORM

    从sql到ORM应该说也是编程体系逐步演化的结果,通过类和对象更好的组织开个过程中遇到的各种业务问题,面向对象的解耦和内聚作为一套有效的方法论,对于复杂的企业应用而言确实能够解决实践过程中很多问题. ...

  2. python工业互联网应用实战3—模型层构建

    本章开始我们正式进入到实战项目开发过程,如何从需求分析获得的实体数据转到模型设计中来,变成Django项目中得模型层.当然,第一步还是在VS2019 IDE环境重创建一个工程项目,本文我们把工程名称命 ...

  3. python工业互联网应用实战3—Django Admin列表

    Django Admin笔者使用下来可以说是Django框架的开发利器,业务model构建完成后,我们就能快速的构建一个增删查改的后台管理框架.对于大量的企业管理业务开发来说,可以快速的构建一个可发布 ...

  4. python工业互联网应用实战7—业务层

    本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...

  5. python工业互联网应用实战6—任务分解

    根据需求定义"任务"是一个完整的业务搬运流程,整个流程涉及到多个机构(设备)分别动作执行多个步骤,所以依据前面的模型设计,需要把任务分解到多个连续的子任务(作业),未来通过顺序串联 ...

  6. python工业互联网应用实战11—客户端UI

    这个章节我们将演示用户端界面的开发,当前演示界面还是采用先实现基本功能再逐步完善的"敏捷"模式.首先聚焦在功能逻辑方面实现普通用户与系统的交互,普通用户通过url能查看到当前任务的 ...

  7. python工业互联网应用实战13—基于selenium的功能测试

    本章节我们再来说说测试,单元测试和功能测试.单元测试我们在数据验证章节简单提过了,本章我们进一步如何用单元测试来测试view的功能代码:同时,也涉及一下基于selenium的功能测试做法.笔者过去的项 ...

  8. python工业互联网应用实战14——单元测试覆盖率

    前面的章节我们完成了任务管理主要功能的开发及单元测试编写,可如何知道单元测试效果怎么样呢?测试充分吗?还有没有没有测到的地方呢? 本章节我们介绍一个统计测试代码覆盖率的利器Coverage,Cover ...

  9. python工业互联网应用实战15-前后端分离模式1

    我们在13章节里通过监控界面讲了如何使用jquery的动态加载数据写法,通过简单案例来说明了如何实现动态的刷新监控界面的数据,本章我们将演示如何从Django模板加载数据逐步演化到前后端分离的异步数据 ...

随机推荐

  1. python小练习-列表、字典

    1. 切片(Slice) L=['a','b','c','d'] L[0:2]表示从索引0开始取,直到索引2为止,但不包括索引2.即索引0,1,正好是2个元素 如果第一个索引是0,还可以省略: L[: ...

  2. 安装依赖jdk---linux

    1,下载JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2,使用XFTP ...

  3. 特效 css3 渐变背景框

    .box{ 子级 position: relative; width: 300px; height: 400px; display: flex; justify-content: center; al ...

  4. Java——参数传递

    写这篇文章时,其实还是不理解Java中的参数传递只有传值没有传址(传引用).这里引用知乎上大神的讲解来记录一下. 一.基本类型和引用类型 int num = 10; String str = &quo ...

  5. 在 MacOS 中使用 multipass 安装 microk8s 环境

    在 MacOS 中使用 multipass 安装 microk8s 环境 Multipass & MicroK8s 介绍 What is Kubernetes? Kubernetes clus ...

  6. 我的第一个jQuery插件开发(日期选择器,datePicker),功能还不完善,但用于学习参考已经足够了。

    一.学习jQuery插件开发网上的帖子很多,插件开发的方式也有好几种,现在推荐一个帖子讲述的特别好,我也是这篇文张的基础上学习的. 参考:http://www.cnblogs.com/ajianbey ...

  7. jQuery-操作元素的内容,属性,样式

    1.操作内容 获取: 双标签:html() input:val() 设置: 双标签:html('新内容') input:val('新内容') 2.操作属性 * 获取:attr('属性名') * 设置: ...

  8. Vue中导出Excel表格方法

    本文记录一下在Vue中实现导出Excel表格的做法.参考度娘上各篇博客,最后实现功能 Excel表格,我的后端返回的是数据流,然后文件名是放进了content-disposition中,前端进行获取. ...

  9. Vue父子组件传值以及父调子方法、子调父方法

    稍微总结了一下Vue中父子间传值以及相互调方法的问题,非常基础.希望可以帮到你!先来个最常用的,直接上代码: 1.父传值给子组件 父组件: <template> <div> & ...

  10. Java实现 LeetCode 537 复数乘法(关于数学唯一的水题)

    537. 复数乘法 给定两个表示复数的字符串. 返回表示它们乘积的字符串.注意,根据定义 i2 = -1 . 示例 1: 输入: "1+1i", "1+1i" ...