“数据结构+算法”视角的Asprova

  1. 云栖社区>
  2. 博客>
  3. 正文

“数据结构+算法”视角的Asprova

shoen 2019-03-18 20:51:00 浏览1449


 

1.        概述

Asprova[1] APS是一款专业的生产排产系统,深入学习Asprova对于理解和实践APS,以及研发生产制造类软件都有很好的参考价值。Asprova经过多年的生产实践,具备强大的功能和丰富的操作界面,但也导致模型较为复杂,学习难度较大。本文以“数据结构+算法”视角抽离出可应用于实践的Asprova极简模型,便于理解和扩展。

2.        生产排程

8beb4d73851288ba071ee115cd1ba272a5bb0261

1 生产排程

生产排程主要包括以下主要功能:

n  模板数据:主要包括制造BOM,出勤模式表,生产日历表等;

n  订单表:包括制造订单、库存、销售订单、采购订单,本文主要指制造订单;

n  排程逻辑:基于计划参数,进行订单展开、订单分派和计划评估;

n  生成指令:制订的计划向现场传达工作指示;

n  实绩:工厂中根据指令实行制造,便可以取得实绩。

系统依次执行如下过程:

(1)       用户:配置模板数据;

(2)       用户:配置计划参数;

(3)       用户:录入制造订单;

(4)       系统:执行排程逻辑;

(5)       用户:制作生产指令;

(6)       用户:提交工作实绩。

3.        模板数据

3.1.        制造BOM

3.1.1.       工序概略

ABC公司采购原材料M1X并通过加工、组装、包装工序最后生产出产品AX100AX200BX100BX200CX100CX200。用工序的概略图来表示各产品每个工序的流程。

8c09e44d5ef9dced14a7c6f58f5be175719a732a

2 工序概略图

3.1.2.       制造BOM

制造BOM描述所有品目的制造流程,每个品目的制造流程由多道工序顺序连接而成,每道工序关联资源。

下图以品目A为例,品目ACTPRCK三道工序顺序制造而成,每道工序的资源为CT1PR1以及CK1CKR

54d1442b0120fe1e16831371fbc5dc520e943ea5

3 品目A制造流程

74ba4c0b8d05eb02f239a6e4d044d767627790df

4 Asprova图形显示的品目A的制造流程

制造BOM用以下表格进行数据维护:

表格 1 制造BOM实例

品目

工序编号

工序代码

指令种类

指令代码

品目/资源

制造

移动时间MIN

A

10

CT

输入指令

In

M1

0.01

 

使用指令

M

CT1

6sp

 

20

PR

使用指令

M

PR1;PR2

5sp

60

30

CK

使用指令

M

CK1

6sp

60

使用指令

S0

CKR

0

 

 

用户输入制造BOM,制造BOM生成品目、工作模板、指令模板等多个数据结构。制造BOM和品目、工作模板、指令模板的关系如下图所示:

b671e19b39dbc8b35df38dd07f9dce86de2fd92c

5 制造BOM数据结构

3.1.3.       制造BOM(IO)

表格 2 制造BOM

名称

数据类型

属性名

说明

品目

对象

Item

A

工序编号

整数

ProcNo

10

工序代码

WBS引用

ProcCode

CTPRCK:制造品目A的工序模板

指令类别

枚举

InstructionType

(1)     输入指令;

(2)     使用指令;

指令代码

字符串

InstructionCode

(1)     In

(2)     M

品目/资源

对象

ItemOrResource

(1)     M1

(2)     CT1PR1CK1CKR

前设置

表达式

Task1Expr

 

制造

表达式

Task2Expr

6sp

后设置

表达式

Task3Expr

 

接续方法

枚举

TimeConstraintMethod

ES

移动时间MIN

时间表达式

TimeConstraintMin

 

移动时间MAX

时间表达式

TimeConstraintMax

 

资源优先度

实数

Priority

设置分派优先度。优先大的数值。

 

3.2.        制造BOM生成:品目/资源

3.2.1.       品目类

制造BOM通过类中“工序编码”和“指令代码”可生成品目类,并设定与品目相关的制品、半成品以及原料等数据。

3.2.1.1.       数据结构

表格 3 品目类

名称

数据类型

属性名

说明

品目名

BSTR

Name

品目的名称。

子品目

ASOObjectList

LeftItemList

生产该品目时候投入的原料。

父品目

ASOObjectList

RightItemList

投入该品目而生产的品目。

子品目(递归)

ASOObjectList

LeftmostItemList

递归地搜索生产该品目时候所投入的原料。

父品目(递归)

ASOObjectList

RightmostItemList

投入该品目而生产的最终品目。

子对象

对象

<RO> <Multi>

Child

 

次级子对象。

【共同】-【子对象】:工作模板

 

3.2.1.2.       算法

表格 4 制造BOM

品目

工序编号

工序代码

指令种类

指令代码

品目/资源

A

10

CT

输入指令

In

M1

使用指令

M

CT1

20

PR

使用指令

M

PR1;PR2

30

CK

使用指令

M

CK1

使用指令

S0

CKR

 

表格 5 品目类

品目名

子品目

父品目

子对象

A

M1

AX

CT;PR;CK

AX

A;X

AX100;AX200

KD;CK

AX100

AX

-

PK

AX200

AX

-

PK

X

-

AX

-

M1

-

A

-

 

表格 6 品目生成算法

 

3.2.2.       工作模板:BOM(工序选定器/工作模板/任务选定器)

3.2.2.1.       数据结构

表格 7 工作模板

名称

数据类型

属性名

说明

种类

TMasterType

Type

主数据对象类别。【工作模板】

工序

ASBProcess

Proc

工序对象

前工序

对象

<RO> <Multi>

PrevProc

前工序

后工序

对象

<RO> <Multi>

NextProc

后工序

父品目

对象

<RO> <Multi>

RightItem

将该品目当作工序的品目。

输入指令

对象

<RO> <Multi>

InputInstruction

输入指令。

输出指令

对象

<RO> <Multi>

OutputInstruction

输出指令。

使用指令

对象

<RO> <Multi>

UseBomInstruction

使用指令。

工作/任务

对象

<RO> <Multi>

Work

使用主数据工作/主数据任务的工作/任务

【前置任务】、【制造任务】

3.2.2.2.       算法

表格 8 制造BOM

品目

工序编号

工序代码

指令种类

指令代码

品目/资源

A

10

CT

输入指令

In

M1

使用指令

M

CT1

20

PR

使用指令

M

PR1;PR2

30

CK

使用指令

M

CK1

使用指令

S0

CKR

 

表格 9 工作模板

工序

父品目

输入指令

使用指令

CT

A

In

M

PR

A

-

M

CK

A

-

M;S0

 

表格 10 工作模板生成算法

1.         输入:【制造BOM类】

2.         遍历【制造BOM类】的每个[品目]-[工序]-[指令种类]

3.         输出:【工作模板】

 

3.2.3.       输入指令模板

3.2.3.1.       数据结构

                                                      表格 11 制造BOM

名称

数据类型

属性名

说明

品目

ASBItem

Item

该输入指令的品目。

工序

(工作/任务/选择器)

ASBMaster

Master

该指令所包括的所有对象。

输入指令管理

ASBInputInstructionMaster

InputInstructionMaster

该输入指令所参照的输入指令管理。

输入指令

对象

<RO> <Multi>

InputWorkInst

参照该使用指令模板的工作使用指令。

制造

表达式

InputBomInst

设定相对1个单位的输出指令品目,所必需的输入指令品目数量。

 

3.2.3.2.       算法

表格 12制造BOM

品目

工序编号

工序代码

指令种类

指令代码

品目/资源

制造

A

10

CT

输入指令

In

M1

0.01

使用指令

M

CT1

6sp

20

PR

使用指令

M

PR1;PR2

5sp

30

CK

使用指令

M

CK1

6sp

使用指令

S0

CKR

0

 

表格 13 输入指令模板

品目

工作/任务/选择器

输入指令管理

制造

M1

CT

In

0.01

 

3.2.4.       使用指令模板

3.2.4.1.       数据结构

表格 14 使用指令模板

名称

数据类型

属性名

说明

资源

ASBResource

Resource

分派可能的资源。

工序

(工作/任务/选择器)

ASBMaster

Master

该指令所包括的所有对象。

使用指令管理

ASBUseInstructionMaster

UseInstructionMaster

 

工作使用指令

对象

<RO> <Multi>

UseInst

参照该使用指令模板的工作使用指令。

3.2.4.2.       算法

表格 145制造BOM模板

品目

工序编号

工序代码

指令种类

指令代码

品目/资源

A

10

CT

输入指令

In

M1

使用指令

M

CT1

20

PR

使用指令

M

PR1;PR2

30

CK

使用指令

M

CK1

使用指令

S0

CKR

 

表格 16 使用指令模板

资源

工作/任务/选择器

使用指令管理

CT1

CT

M

PR1;PR2

PR

M

CK1

CK

M

CK1

CKR

S0

 

表格 17 使用指令模板生成算法

1.         输入:【制造BOM类】

2.         遍历【制造BOM类】的每个[品目]-[品目/资源]-[工序]-[指令种类]

3.         输出:【使用指令模板】

 

3.3.        出勤模式表

出勤模式用于设定一天中工作时间段的模式。

2cc39fea3a659145a52e3c56dba863fe39c0c958

6 出勤模式

3.4.        生产日历表

生产日历设定每个源/毎日的出勤模式。

957f155a5af85622701430da4de9af4c78c47baf

7 生产日历

 

4.        排程逻辑

4.1.        数据结构

fe8cac5e2cc10daefddedbc5e8d63c0465991396

8 排程算法数据结构

 6cf6e5302592f0685a9271682b0dfcbeaab16d12

9 分派结果

4.1.1.       订单类:Order

表格 18 订单类

名称

数据类型

属性名

说明

订单种类

TOrderType

Order_Type

设定订单的种类。

订单区分

TIsReplenishmentOrder

IsReplenishmentOrder

区分是补充订单还是登录订单。

品目

ASBItem

Item

订单的品目。

订单数量

double

Qty

订单数量

优先度

double

Priority

设定优先度。在计画参数的分派键[订单优先度]中使用该值,决定分派顺序。

分派方向

TOrderAssignmentDirection

AssignmentDirection

设定订单分派方向

Ø  未指定 [根据优先度]相同。

Ø  F 正方向 将订单正向分派。

Ø  B 逆方向 将订单逆向分派。

Ø  P 遵从优先度 将订单按照优先度的分派方向分派。

交货期

DATE

LET

交货期

工作

对象<RO> <Multi>

Order_Operations

此订单的工作列表。它既包含分割父工作又包含分割子工作。如果订单是一个订单组,那么它还会包含工作组。

子订单

ASOObjectList<RO> <Multi>

LeftOrderList

与原材料方面(左侧)关联的订单。

父订单

ASOObjectList<RO> <Multi>

RightOrderList

关联在右侧的订单。

 

4.1.2.       工作类

表格 19 工作类

名称

数据类型

属性名

说明

种类

TWorkType<RO>

Work_Type

工作的种类。有工作/分派工作途径/制造任务/前设置任务/后设置任务/资源锁定任务。

工作模板

ASBMaster

Work_Bom

现在引用的主数据工作。

前工序工作

ASBOperation

PrevOperation

前工序工作。包括不同订单的工作以及由后订单关联的工作。

后工序工作

ASBOperation

NextOperation

后工序工作。包括不同订单的工作以及由后订单关联的工作。

前设置任务

ASBOperation::SetupTask

SetupTask

前设置任务

制造任务

ASBOperation::ProductionTask

ProductionTask

制造任务。

后设置任务

ASBOperation::TeardownTask

TeardownTask

后设置任务。

 

4.1.3.       制造任务:工作类

表格 20 制造任务

名称

数据类型

属性名

说明

种类

TWorkType<RO>

Work_Type

工作的种类。有工作/分派工作途径/制造任务/前设置任务/后设置任务/资源锁定任务。

工作模板

ASBMaster

Work_Bom

现在引用的主数据工作。

工作输入指令

ASBInputInstruction

InputInstructions

该工作的下面存在的工作输入指令。

工作输出指令

ASBOutputInstruction

OutputInstructions

输出指令。

工作使用指令

ASBUseInstruction

UseInstructions

该工作正下方存在的工作使用指令。

 

4.1.4.       工作使用指令类

表格 21 工作使用指令类

名称

数据类型

属性名

说明

资源

ASBResource

Resource

该工作使用指令被分派(上回为止)的资源。

 

4.2.        排程算法

4.2.1.       伪代码

表格 22 排程算法流程

1.         订单录入:输入完成品的制造订单【订单表】;

2.         订单补充:将完成品的每个子品目生成补充订单

2.1.  获得品目:【订单表】à[品目项]à【品目表】,通过迭代【品目表】找到所有子品目;

2.2.  补充订单:每个子品目补充【订单表】;

3.         订单展开:将每项工作对应资源

3.1.  生成工作:【订单表】à[品目项]à【品目表】à[子对象](共同-子对象:工序模板)à根据工序模板生成【工作表】;

3.2.  生成任务:【工作表】à[工作模板项]à【工作模板表】à[工作/任务](链接-工作/任务)-[制造项]à【制造任务表】;(工作模板表结合制造BOM生成任务)

3.3.  生成指令:【制造任务表】à [工作输入指令项][工作输出指令项]以及[工作使用指令项](链接)

3.4.  关联设备:[工作使用指令项]à【工作使用指令表】à[资源]

4.         分派

4.1.  分派方向:计划参数的分派方向,订单的分派方向,订单优先度决定分派方向。分派方向根据正向或者逆向,决定从哪个工作开始进行分派;

4.2.  分派顺序:订单之间的顺序,分派顺序设置:【计划参数设置】-【基本】-【分派规则】;

4.3.  实际分派:按【分派顺序】从选择【订单】,在每个【订单】中根据【分派方向】选择【工作】,确定每项【工作】中各项【任务】在【资源】上的开始时间和结束时间。

5.         计划评估

5.1.  排程后,输出【逾期订单数】、【交货期遵守率】、【平均等待时间】等评估指标。

 

4.2.2.       流程图

71c28d21ab0d66eb91633c8bad5f2033c45a03e0

10 算法数据结构流程

5.        小结

通过模板数据和排程逻辑的数据结构和算法给出了Asprova APS极简的业务模型,通过这个模型可以了解制造BOM(工艺)、工序、订单、工作、任务、指令以及品目/资源等要素如何协同工作,完成生产排程流程。后续在此基础模型之上,继续深入研究Asprova的模板数据和排程逻辑的约束条件,逐步完善业务模型,不断满足工厂的实际需求。

初学Pascal已经是20多年前事了,不论是WSNCBTC还是APS,专业方向和业务在不断变迁,但Niklaus Wirth[2]提出的“算法+数据结构=程序”这个公式却依旧指导着老程序员们继续前行。

 

参考文献

[1] Asprova[EB/OL]. www.asprova.cn/.

[2] Niklaus Wirth[EB/OL]. https://baike.baidu.com/item/尼古拉斯·沃斯/1095875.