草庐IT

APS系统设计经验分享(时间推导 - 2023.03)

kentzhang 2023-03-30 原文

  近段时间忙于各种项目和对【易排平台】的优化,没顾得上分享APS相关的小技巧,回头看看小公众号的关注人数早已达1500+,在此争取时间写一下这段时间在项目上及平台优化过程中遇到的一些小技巧,以感谢诸位的关注。过去数月的解决的问题中,涉及最多的是规划模型中,实现各种时间维度的功能,目前在平台上也稍有成果。因此本次分享就选取其中几个较具代表性的情况,分享给大家,欢迎大家一起探讨。

多种工序接续关系导致的时间推导逻辑

  在项目计划中,任务与任务之间存在多种接续关系,使用PJS模型作为APS的规划模型时,我们可以把一个工单看作一个项目, 工单中的各个工序看作项目中的各个任务,一个工单的加工计划,就相当于一个项目执行计划。因此,在该模型背景下,任务的规划可以划分为空间规划与时间规划,其中前者体现为各任务的资源分配过程,后者可以归纳为任务的开始时间,任务与任务之间的关系等。

  在开始讨论规划过程中的时间计算之前,需要先对其中一些概念作一些定义,以简化下文的语言描述。

概念定义

  在项目计划有多种接续关系,目前易排系统中实现了FS(Finish to Start)与SS(Start to Start)两种关系,其它关系将视具体的项目情况,若有需要再具体实现。

前置工序、后置工序

  在一个工序路线上相邻的两个工序,需要先加工的(即前面的)工序,我们定义为前置工序,后加工的称为后置工序

前导任务、后续任务

  分布在同一资源(例如机台、产线)上、且相邻的两个任务,在时间轴左则(先加工)的我们称之为前导任务,右则(后加工)的我们称为后续任务.

静置时间

  工序路线上两个前/后置任务之间,若前置任务完成后,需要等待一段时间,后置任务才能开始,该等待时间,我们称为静置时间

接续关系

  同一工序路线上,前后两个任务的制约关系,我们称为接续关系。因为我们使用PJS作为原型衍生出来的模型作为规划模型,因此,【易排平台】借用了项目管理中项目计划的任务间依赖关系,正常的项目依赖包括FS(完成-开始),FF(完成-完成),SS(开始-开始)和SF(开始-完成)。而【易排平台】为仅提供其中较为常见的两种关系:FS和SS。这两种关系在系统中的实现逻辑如下。

任务计划开始时间

  在PJS模型中,关于时间维度的推导,其中一个关系变量是各任务的开始时间,各个任务几乎所有时间长度和时间点(我们称为时刻)都与任务的计划开始时间有直接或间接关系。因此,本文着重讲解各种情况下,任务开始时间的推导逻辑。

FS接续关系

  FS接续关系是表示前置工序全部完成后,后续工序才开始生产。这种关系通常出现在后置工序对前置工序具有整体依赖关系的情况。例如一些大型装备生产加工过程中,一个工序的加工对象就是一件大型零部件,因为场景、设备等限制,需要一个工序完全完成后,才能整体交付出去,后置工序才能拉着生产。

  这种接续关系在排程过程中的时候推导最为简单,当前任务的开始时间,为前置任务的完成时间,加上前置任务的静置(详见【静置时间】一节)时间

SS接续关系

  SS接续关系即Start to Start接续关系,它表示前置工序完成了一定量,后置工序即可开始。通常我们用SS 50%, 表示前置工序完成了50%的工作量,后置工序即可开始。例如一个工单的某个工序,需要产生1000件半成品,这些半成品将成为后置工序的原料。为了提高资源利用率,后置工序通常不需等到1000个半成品全部生产完成后才启动生产。而是待前置工序完成了50%(即500件),后置工序即会开始接力加工,从而实现前后两个工序一定程度的并行加工,进而缩短整个工单的生产周期。

  这种情况下,一个任务的开始时间,将不再以前置任务的完成时间为基准进行计算,而是以前置任务完成50%的时间作为基准。即开始时间为:前置任务开始时刻 + 前置任务整体时长 * 50% + 静置时间

同一资源上相邻任务的接续关系

  上述描述的是同一产品的工序路线前,两个互为前/后置工序的任务,因接续关系不同,而导致的计划开始时间计算差异。而分布在同一资源上的一系列任务,同样存在时间推上的逻辑需要理清。

  在同一资源上一对互为前导/后续关系的任务(即两个相邻任务),在时间任务的计划开始时间时,也需要注意。任何一个任务的开始时间,除了考虑其前置任务的结束时间(或在使用SS关系,完成一定百分比的时间)外,还需要考虑该任务的前导任务的完成时间,否则就会出现时间重叠,即一个资源在某一时间段出现多个任务,导致资源超用。

虚拟任务

  而同一资源上两个任务之间有可能存在一些额外操作,例如:同一机台加工完一个零部件后,需要加工另一个产品的零部件,有可能需要更换模具、夹具,这些额外工作,视不同任务的参数而定,有可能不需要额外工作(例如:两个所有参数均一致的零部件加工),也有可能需要同时进行多个额外工作(例如:有些任务的转换,除了需要更换模具,还需要重新调整加工参数,重新试制等)。我们把这些额外工作称为虚拟任务。虚拟任务的多少,及用时长短,对后续任务的开始时间会造成影响。

  因此,在同一资源上,一个任务的开始时间为:前导任务的结束时间,加上前导任务切换到后续任务的虚拟任务时长

现留有以下疑问大家可以思考一下:

  1. 前导/后续任务为什么不需要加上静置时间?
  2. 一个任务的开始时间,需要同时考虑前置任务的完成时间及前导任务的完成时间,那么这两个时间以哪个为准?

工序间的静置时间

  如上述的定义,【静置时间】是指两个前置/后置工序之间的等待时间,对于离散结构的工序路线,静置时间可能存在多个工序之间。例如一个任务存在多个后置任务时,对于不同的后置任务,可能存在不同长度的静置时间。例如,在某些情况下,喷涂工序完成后,需要等待4小时才能进行镀膜工序,但同样是喷涂工序的后置,在工作表面上的钻孔工序,可能静置两小时即可完成。若镀膜工序与钻孔均为喷涂工序的后置工序,则它们具有不同的静置时间,因此,在设计规划模块时,必须考虑此类离散情况下的复杂场景,能实现尽可能减少等待时间,提高资源利用率。

  在【易排平台】最初的设计中,我们考虑了将静置时间纳入前置工序的加工时长上,并作出标识,用于区分工序的加工结束时间与静置结束时间。此方案从时间上确实可以实现后续工序必须在静置完成之后才开始。但存在非常大的局限性与弊端。因为所谓的静置时间,对于一个任务而言是不占用任何资源的(完成喷涂的工件可以放在等待区,喷涂产线可以继续加工后续的工作),若将静置时间加到喷涂工序的时间上,就会造成静置时间也相当于占用了资源。虽然当时我们修改了资源占用的计算方法,将静置时间略过,但该方案明显会导致判断逻辑变得复杂。且上述提到的存在多个静置时间的情况,也难以实现,当然你也可以考虑将静置时间添加到后置工序的开始处,但同理,离散结果的场景不仅存在多个后置工序情况(即工序路线分叉),还存在多个前置工序的情况(即工序路线合并),因此,逻辑将非常复杂,且导致部分场景出现歧义。

  最终我们使用的方法还是修改该设计方案,新的方案是将静置时间抽出来,作为任务间的独立属性存在,该属性不属于工序,而属于工序之间的关系。即在工序路线这个有向图上,静置时间不属于一个任务,而是属于两个任务之间的弧。

原本计划把所有时间相关的设计思路都介绍一下,但发现就目前介绍的思路已经需要相当篇幅。因此将剩余的其它时间相关设计留在下一篇。

事实上,上述对于各场景下,时间的推导只是最为简单的思路,需要实现这些逻辑时,还会遇到非常多需要考虑的要素,限于篇幅不可能在此完全阐明。如下图我们关于时间推导设计的其中一些设计资料,那是相当细的工作。

 

 

下一篇,我们将介绍以下几点的时间设计思路

任务加工时间适配资源日历的方案

  大多数资源不可能 7 x 24工作,也不可能所有任务都能在一个班次(8或12小时)内完成,那么如果实现这些不规则的时间片段与任务长度呢?

工单的排程方式如何体现在时间上

  我们现有的生产计划,有前推式排程,尽可能早开始;还有后拉式排程,尽可能晚开始(JIT);此外,还因为资源限制或半成品时效限制等因素,以关键工序为基准进行排程(尽可能保证关键工序资源使用率最高)。那么在时间上应该如何设计,才能实现这三种典型排程呢?

因时间计算逻辑,引起的OptaPlanner各种Corruption问题

  在处理时间推导逻辑过程中,经常遇到本来很正常的程序,加上一些时间推导逻辑后,就会出现“Score corruption”,"UndoMove corruption"与"Variable Listener Corruption". 这些异常产生的根本原因是什么?应该如何识别?识别出来应该如何改进设计来适配OptaPlanner的评分规范要求,以消除这些异常?

写在最后

  有同行问到:为什么你分享的经验都是一些细枝末节?有没有一些“更有营养”的内容可以分享一下。

我觉得吧,小弟正是软件开发出身的,偶然的机会接触到APS,更偶然机会接触到OptaPlanner才开始的APS系统设计开发工作。经历的都是各种很底层且很细节的问题,但在这些项目实践过程中,我也总结到一些经历,那就是一个很好的方案能否落地,很多细节往往都是起决定性作用。就算不谈技术方面,就是做具体的实施,客户的具体业务场景、细节和规则,都是至关重要的。

  一个宏观的方案对于客户高层领导对整个项目的理解当然是重要的,但项目一旦启动,能否切实地满足需求,使用项目通过各种系统、数据、流程落地到具体的用户部门,才能最终体现整个项目的价值。所以,细枝末节多关注一些也无防。而且纵观整个市场,能提供宏大、高阶推介方案的专家顾问很多,水平极高;相反愿意潜心去处理细枝末节这种脏累差活的人却不多,因此,研究起来可以参考的案例、资料相当匮乏,能深入研究一下,应该也挺有价值的。

<完>

有关APS系统设计经验分享(时间推导 - 2023.03)的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  4. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  5. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  6. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  7. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

随机推荐