本文共 6403 字,大约阅读时间需要 21 分钟。
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]. .
[2] Niklaus Wirth[EB/OL]. 尼古拉斯·沃斯/1095875.
转载地址:http://kfqyx.baihongyu.com/