1. 概述
Asprova[1] APS是一款专业的生产排产系统,深入学习Asprova对于理解和实践APS,以及研发生产制造类软件都有很好的参考价值。Asprova经过多年的生产实践,具备强大的功能和丰富的操作界面,但也导致模型较为复杂,学习难度较大。本文以“数据结构+算法”视角抽离出可应用于实践的Asprova极简模型,便于理解和扩展。
2. 生产排程
图 1 生产排程
生产排程主要包括以下主要功能:
n 模板数据:主要包括制造BOM,出勤模式表,生产日历表等;
n 订单表:包括制造订单、库存、销售订单、采购订单,本文主要指制造订单;
n 排程逻辑:基于计划参数,进行订单展开、订单分派和计划评估;
n 生成指令:制订的计划向现场传达工作指示;
n 实绩:工厂中根据指令实行制造,便可以取得实绩。
系统依次执行如下过程:
(1) 用户:配置模板数据;
(2) 用户:配置计划参数;
(3) 用户:录入制造订单;
(4) 系统:执行排程逻辑;
(5) 用户:制作生产指令;
(6) 用户:提交工作实绩。
3. 模板数据
3.1. 制造BOM
3.1.1. 工序概略
ABC公司采购原材料M1、X并通过加工、组装、包装工序最后生产出产品AX100、AX200、BX100、BX200、CX100、CX200。用工序的概略图来表示各产品每个工序的流程。
图 2 工序概略图
3.1.2. 制造BOM
制造BOM描述所有品目的制造流程,每个品目的制造流程由多道工序顺序连接而成,每道工序关联资源。
下图以品目A为例,品目A由CT、PR和CK三道工序顺序制造而成,每道工序的资源为CT1、PR1以及CK1和CKR;
图 3 品目A制造流程
图 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和品目、工作模板、指令模板的关系如下图所示:
图 5 制造BOM数据结构
3.1.3. 制造BOM(IO) 类
表格 2 制造BOM类
名称 |
数据类型 |
属性名 |
说明 |
品目 |
对象 |
Item |
A |
工序编号 |
整数 |
ProcNo |
10 |
工序代码 |
WBS引用 |
ProcCode |
CT、PR、CK:制造品目A的工序模板 |
指令类别 |
枚举 |
InstructionType |
(1) 输入指令; (2) 使用指令; |
指令代码 |
字符串 |
InstructionCode |
(1) In; (2) M |
品目/资源 |
对象 |
ItemOrResource |
(1) M1; (2) CT1、PR1、CK1、CKR |
前设置 |
表达式 |
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. 出勤模式表
出勤模式用于设定一天中工作时间段的模式。
图 6 出勤模式
3.4. 生产日历表
生产日历设定每个源/毎日的出勤模式。
图 7 生产日历
4. 排程逻辑
4.1. 数据结构
图
8 排程算法数据结构
图 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. 流程图
图 10 算法数据结构流程
5. 小结
通过模板数据和排程逻辑的数据结构和算法给出了Asprova APS极简的业务模型,通过这个模型可以了解制造BOM(工艺)、工序、订单、工作、任务、指令以及品目/资源等要素如何协同工作,完成生产排程流程。后续在此基础模型之上,继续深入研究Asprova的模板数据和排程逻辑的约束条件,逐步完善业务模型,不断满足工厂的实际需求。
初学Pascal已经是20多年前事了,不论是WSN、CBTC还是APS,专业方向和业务在不断变迁,但Niklaus Wirth[2]提出的“算法+数据结构=程序”这个公式却依旧指导着老程序员们继续前行。
参考文献
[1] Asprova[EB/OL]. www.asprova.cn/.
[2] Niklaus Wirth[EB/OL]. https://baike.baidu.com/item/尼古拉斯·沃斯/1095875.