FLEXSCHE产品介绍

FLEXSCHE版本17

2017年7月24日发布了FLEXSCHE版本17.0。实施了大约190项的功能扩展。在此介绍一下其中的主要功能。(版本16.0和版本17.0的差异)

整体提速

再一次挤出了干抹布中的水。

大量数据的排程处理、绘图处理、输入输出处理等、会给CPU带来莫大的负担。所以、从统计学的角度特定处理实际数据后反复运行的记录、综合去除对该部分的负荷、加上对细节的仔细调整、从而实现了进一步的提速。很多数据都观测到有1~2成程度以上的改善。

例如、标准示例数据“10万工作”的重排程处理的平均时间从版本16时4.0秒缩短为版本17的2.8秒(30%提速)。另外、其他的更大的数据从62秒缩短到53秒(15%提速)。排程以外的处理也进行了提速。
※上述测试值以CPU为Intel Core i7-6700K的PC进行的测试。

另外、缩放甘特图表对庞大数量的工作进行绘图时、进行了简化显示绘图内容提高反应速度的细心处理。甘特图表的放大·缩小·滚动等反应速度有了体感上的提高。

工作场所计划选项

“工作场所计划选项”是以布局在工作场所的制造物之间的干涉为制约进行排程的选项产品。版本17对工作场所计划选项进行了大幅度的功能强化。

布局限制

对各个工作可设置必须布局在工作场所内的特定的领域内的制约、反之不得布局在特定领域内的制约等。例如、工作场所内的特定的范围内顶棚高度不足无法进行大型产品的作业所以不能安排这样的工作在该场所等、可以根据实际情况进行细致的计划拟定。

考虑间隙的计划

实现了可以在作业物周围空出特定大小的间隙的计划。例如可用于作业物形状由CAD导入并未包含作业空间时、或需要在作业物周围留出工人通过的路线空间。

形状输入时的操作性向上

在输入形状时、实现了如绘图软件(绘图工具)那样可以通过使用鼠标点击简单添加顶点。另外可以显示作为参考的背景图并在图的上层进行设计编辑。

在工作场所面板显示背景图片

实现了在工作场所的背景显示图片。与实际的工作场所的图片叠加显示更能够简单把握作业物的布局场所。

运用强化

形状或布局的异常可以通过数据验证方法进行检测了。另外、可以通过工作实绩表格输入布局实绩信息了。

FLEXSCHE CarryOut

FLEXSCHE CarryOut是用以支援制造现场执行计划的机制。版本17进行了功能强化。

在服务器上反映工作实绩并更新计划

实现了工作指令可以维持可执行的状态。

传统方式难以把握在上游工序发生延迟或发生突发性问题时的影响、很多情况都不得不依赖制造现场当场的判断。为了反映工作延迟的状况得到可执行的计划需要将情况返回计划负责人并重新计划、但现实情况下却很困难。特别是计划拟定的频度限定在1日1次或1周1次时更为困难。

版本17可以在CarryOut服务器上反映当前状况的同时更新计划。可以随时随地得到可执行的最新的指令了。用于更新计划的排程规则可以和FLEXSCHE GP同样自由构建。

另外通过如下的“适应时间制约”灵活嵌入时间缓冲可以尽量不受工作延迟和突发问题发生的影响、实现安定生产。

客户端窗口的自定义

各用户和各资源的客户端(平板电脑)的画面布局和显示内容支持自定义了。可以针对各个用户改变显示项,仅显示该用户所需的信息。

标准的画面布局

变更布局和显示项、
并嵌入了为了在生产现场阅览的图纸

用户界面

对显示部分进行了多数改良,变得更为灵活更为便利。

丰富了甘特图表的图棒和文本的绘图方法

甘特图表的最佳显示方式根据人的喜好应该有很多种方式。

版本17对资源甘特图表和订单甘特图表的工作棒以及字符串的显示方式进行了整理,大幅度增加了各种变化。另外添加了为了在有限的空间内高效显示更多的字符信息的逻辑。

里程碑的强化

自定义符号

可以自由添加里程碑的符号图了。可以将任意的图文件作为里程碑的标志。

在订单甘特图表显示

在订单甘特图表内也可以显示里程碑了。

高速绘图和从订单指定方式的扩展

例如对特定的作业图表行的特定的时间等、可以更为自由的显示里程碑了。另外修改了绘图处理从而提高了性能。能够比之前更快绘制大量里程碑。

看板行的强化

丰富了可用看板行。

增加了可作为看板行使用的类型。添加了工作、工作图、工序图、工序层次、规格看板行。能够比之前更为灵活的构件图表并直接显示各种所需信息。

在各段显示订单甘特图表行左部分

一般来讲一个订单的甘特图表行有时由多段构成。这种情况下可以切换每段的图表行左部分的显示内容了。运用此机制例如可以和实现下图“品目工序别甘特图表”。

※仅在多纵列时可用。

FLEXSCHE Editor的功能扩展

字段内的复选框

复选框化比单纯字符串显示更为直观、操作时也只要钩选所以更为简单。

从表格窗口参照快照

在表格窗口可以显示只读的快照数据了。对某时刻的计划数据除了以甘特图表方式以外能够以数据形式进行对比了。

在选择候选中显示正式名称

在指定规格和品目、资源等字段可以显示其正式名称了。指定非机械式决定的代码而是命名的正式名称可以更为便于各种数据的确认。

FLEXSCHE d-MPS(供需平衡调整选项)的功能扩展

MPS编辑器的用户定义行

可以添加以计算表达式方式计算出的每月·每日值的行。例如可以保存某时刻的MPS计划在快照、从而能够对比预计生产量和当前生产量。

排程和建模

适应时间制约

对于从定义在工序间的缓冲吸收工作延迟能够简单建模了

工厂中有瓶颈工序时、为了最大化工厂全体的产出、必须最大限度运转瓶颈工序。那时为了不使由于前工序突发的故障(设备故障等)或统计变化(周期时间的变化)发生停止和降速、在瓶颈工序前设计时间余裕这种手法已经广为人知了。这个余裕时间称为“缓冲时间”。

適使用适应制约的机制可以对应这种计划手法、可以简单实现在计划时包含“缓冲时间”计划、并在进入运行阶段时以缓冲吸收延迟这种建模和排程。

原材料候选

有替代原料时、可以根据排程时的状况进行选择了

有多个原料候选时、之前是“这个订单用这个”需要这种人为决定(使用选择器的方式)。

虽然也可以让FLEXSCHE决定并动态选择、但限定于类似“用这个设备的话用这个原料”这种方式(使用品目许方式)。

版本17开始可以对候选资源和品目的所有组合、在排程规则中判断如何选择最好。例如可以在规则中制订“优选选择原料A,如果不足的话也可以使用原料B”,对于各个订单如何选择资源、品目可以根据排程的状况进行判断了。

对被选方指定多个选择器

更为简单的表现工序的变化

选择器是之前FLEXSCHE就有的机制、对所需原料或前工序设置名称(="选择器")、各个订单可以进行选择。此例中最多需要2个工序制造产品。需要4种原料("A1"、"A2"、"B1"、"B2")、需要进行"工序1"("L1")可自由选择并列举在订单中。此例如此制作了3种工作方式。

这种方法可以自由进行组合(上例中有数十个组合方式)但同时也存在

  • 为了表现组合不得不逐个列举烦杂
  • 实际上不允许的组合也没有排除

这样的不足点。

因此版本17可以对被许可的组合命名、在定义工序时对工序设置该名称(如有必要可以列举)。此例中对3个组合命名为"T1"、"T2"、"T3"、在其所需位置设置选择器。方式"T2"和"T3"都需要"工序1"、将其列举的选择器字符串"T2|T3"设置在工序。这样在订单只需要单纯指定组合方式的名称,这样也就不会误指定不被允许的组合了。

自动批次关联方法强化

强化了自动批次关联方法(高级选项“订单自动关联”功能)。

数量限制

可以用计算表达式指定批次间关联数量的上限值了。例如、从数量上看供给方和需求方就算能够以1:1进行关联时、却特意以1:N进行关联并行制造从而可缩短提前期、这种需求可以将实现了。

动态选择对方批次

可以更灵活的选择关联方了。例如可以实现“尽量找到与残留数量一直的对方进行关联”。

对应了安全库存量水准推移

従以前也能够将为了对应将来有可能突然发生的需求将安全库存量部分留下不进行关联、现在在安全库存量根据时期不同发生变化的情况下也可以根据时期留下库存了。

FLEXSCHE EDIF(数据接口)

FLEXSCHE EDIF是为了外部数据源(数据库或CSV文件)和FLEXSCHE间灵活进行数据交换的机制。同时具备可以自由定义布局的Excel报表输出功能。

版本17强化了FLEXSCHE EDIF的功能。

对应ADO.NET、扩大高速化对象数据库的范围

对应ADO.NET提供商从而使EDIF差异导出实现了最大提速60倍(Oracle 20万工作的差异导出时)。另外EDIF增加了可进行MySQL、DB2、PostgreSQL这样的ADO.NET提供商支持的数据库了。

指定记录导出的顺序(排序)

可以通过计算表达式指定记录的导出顺序了。之前是FLEXSCHE内部固定的记录顺序、现在可以按交货期顺序、数量顺序等任意顺序进行输出了。

添加表映射“工作(更新)”

限于注释等一部分特有项、可以对工作进行差异导入了。可以将外部数据的信息向现有工作汇总更新了。

Excel报表的工作表名可以通过表达式指定了

之前Excel报表的工作表名是固定的、现在可以动态指定了。

添加入门向导

添加了EDIF、Excel报表的入门向导。按照向导操作可以体验EDIF和Excel报表的功能。

计算表达式相关

带名称参数

调用函数时的参数、不按照原来的位置顺序、能以参数名和值的组合进行指定了。特别是在函数中有多个可省略参数时便于使用。

之前的记述方法:
.NeighborOperations( LinkType.In, , , true )
新的记述方法:
.NeighborOperations( LinkType.In, overConnection:true )

解决背包问题的函数

可以使用解决组合问题的其中一个“背包问题”的函数List.SolveKnapsack了。例如在自动批次关联方法中使用时、不能用多个供给批次进行关联时可以选择尽量减少浪费的组合。

{600,300,150,220,450,500}.SolveKnapsack(1000)
結果=> {600,150,220}

程序相关(面向开发人员)

可以通过Add-in更新或关闭FSF非模态窗体

FLEXSCHE Scripting Form能够通过仅仅记述脚本(JavaScript/VBScript)就可以轻松制作窗体(对话框、面板、视图)。但是之前关闭面板或视图或更新显示内容等契机、只能通过对面板或视图直接进行鼠标操作时才能获取。

版本17在窗体之外的Add-in也可以进行操作了,从而大幅度扩展了其活用范围。

从结构化记述方法生成调用外部方法的脚本

条件分歧和循环反复等、复杂的管理结构在排程规则中记述可以通过“结构化记述方法”通过对话框方式进行进行处理流程的设置。规模小的时候非常方便,但大规模的情况下对于习惯了编程的开发人员更倾向于使用文本编辑器进行编码。特别是制作需要验证的规则时使用脚本可能更为高效。但是将现有的结构化记述方法定义以脚本(外部方法)代码方式从零开始编写比较麻烦。

所以版本17可以自动生成与现有结构化记述方法对等的JavaScript代码模板添加了能调用它的新的“外部方法调用方法”。虽然不是直接生成可动作的代码、但也可以大幅度缩短变换作业、从而实现添加简单的处理就可驱动了。

显示例子

// External method
// Class name : @optimize
// Entry name : optimize
// 此模板代码我法直接执行。请恰当替换代码中出现的计算表达式和变量。
// ·代入文的左边值无法从takt表达式变换为JavaScript的计算表达式时、
//  请使用SDSpace.Calculate()方式进行替换。
//  在计算表达式中参照变量时、用CreateTypedExpression制作ISDExpression
//  例、可以用ISDExpression.AddVariable()赋值。
// ·在管理结构内使用相同表达式反复评价时、活用ISDExpression例
//  可以节省无用的表达式解析处理。
// ·从排程方法参照结构化记述方法内声明的变量时
//  作为方法的参数声明、请改写为用IGPExecutableEntity.ParameterValue()
//  明确赋值。
// ·改写代码后、运行[工具]-[外界程序重新登记]后外部方法即可使用
function _optimize( gpManager, settings )
{
/*
  // select target, record list as 'opers' / 对象标记
  var method_00 = gpManager.CreateExecutableEntity( Script.Null,
	'scheduling-method', '4FFFD14593C84439A4D62E5DB227F36E' );
  // clear flag 'operToMove' for opers / 对象标记
  var method_01 = gpManager.CreateExecutableEntity( Script.Null,
	'scheduling-method', 'A8D3706703CE4E8EB6AC0C0A8375B484' );
  // record let, dt on NumSpec / 属性设置
  var method_02 = gpManager.CreateExecutableEntity( Script.Null,
	'scheduling-method', '634157C095E24B1BB93F689F84C31BE6' );
  // RecordAsBest0-0(Unassign) and unassign pendings / 解除工作分派
  var method_03 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'B2527E9FCBD043A1A42219C034CD78C9' );
  // calc LST (1) and record 'lst' and 'mwtH' for each resource / 工作主导调度
  var method_04 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'98D62C9A03144FA492FEB6C0C570B700' );
  // calc LST (2) / 解除工作分派
  var method_05 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'9D217769F85245EEAE162106294A9E0C' );
  // RecordAsBest0-1(Reassign) / 工作主导调度
  var method_06 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'E5124B4CBBF34A25A012F999664BF18D' );
  // 解除工作分派
  var method_07 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'15629FBD5DEF4A2290111B8E61B8C0BA' );
  // move operToMove to resToMove at timeToMove / 工作主导调度
  var method_08 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'9E8CD555763143958204A9071AFFA958' );
  // relocate resToMove / 正向重新分派
  var method_09 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'701D79C8FD4C4B1E929C712B13589D57' );
  // record dt on NumSpec for opers on resToMove / 属性设置
  var method_10 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'1FAA32D06BA044E59D913B681ED77490' );
  // record as tabu / 属性设置
  var method_11 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'948A309CBBF648A59E8C2BBA583C4584' );
  // Record As Best / 正向重新分派
  var method_12 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'D2120074768E4DFDA3323B42151E209A' );
  // (debug) record evalBest on Project.Property / 属性设置
  var method_13 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'55B91F351A27429C834E15DD2A5C59F4' );
  // (debug) record eval on Project.Property / 属性设置
  var method_14 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'CDDADFCCE3054BA588F9E8171CDD1674' );
  // clear tabu / 属性设置
  var method_15 = gpManager.CreateExecutableEntity( Script.Null, 'scheduling-method',
	'F739DD31ACAF4D12B952438EC9CDEEC2' );
 【中略】
  var cMetaRepeat;
  var cRepeat;
  var debug;
  var evalBest;
  var opersTabu;
  var ress;
  method_00.Execute(); // select target, record list as 'opers'
  cMetaRepeat = 3;
  cRepeat = 500;
  debug = true;
  if( $debug )
	method_01.Execute(); // clear flag 'operToMove' for opers
  method_02.Execute(); // record let, dt on NumSpec
  ress = $opers.Union([.AssignedResource]);
  evalBest = $opers._Eval01 + $ress.Sum([$opers._EvalForRes($_object)]);
  if( $evalBest > 0 )
  {
	var iMetaRepeat;
	var iRepeat;
	method_03.Execute(); // RecordAsBest0-0(Unassign) and unassign pendings
	method_04.Execute(); // calc LST (1) and record 'lst' and 'mwtH' for each resource
	method_05.Execute(); // calc LST (2)
	method_06.Execute(); // RecordAsBest0-1(Reassign)
	iMetaRepeat = 0;
	while( $iMetaRepeat < $cMetaRepeat and $evalBest > 0 )
	{
	  if( true )
	  {
		var cRes;
		var eval;
		var iRes;
		cRes = $ress.Count;
		iRes = 0;
		while( $iRes < $cRes )
		{
		  var opersOnRes;
		  var resToMove;
		  resToMove = $ress.At($iRes);
		  opersOnRes = $resToMove.AssignedOperations.Select([.Flag('target')]);
		  while( true )
		  {
			var operToMove;
			var timeToMove;
			operToMove = $opersOnRes.Select([not .Flag('tabu')
			  and ._dEval3_ToJoinLeft <= 0]).MinAt([.ManufactureStartTime]);
			if( not $operToMove.DoesExist )
			  break;
			timeToMove = $operToMove._TimeToJoin($resToMove);
			if( $timeToMove.IsNormal and $timeToMove < $operToMove.StartTime )
			{
			  method_07.Execute(); // 解除工作分派
			  method_08.Execute(); // move operToMove to resToMove at timeToMove
			  method_09.Execute(); // relocate resToMove
			  method_10.Execute(); // record dt on NumSpec for opers on resToMove
			}
			if( true )
			  method_11.Execute(); // record as tabu
		  }
		  iRes = $iRes + 1;
		}
		eval = $opers._Eval01 + $ress.Sum([$opers._EvalForRes($_object)]);
		if( $eval < $evalBest )
		{
		  method_12.Execute(); // Record As Best
		  evalBest = $eval;
		  if( $debug )
			method_13.Execute(); // (debug) record evalBest on Project.Property
		}
		if( $debug )
		  method_14.Execute(); // (debug) record eval on Project.Property
	  }
	  if( true )
	  {
		method_15.Execute(); // clear tabu
		opersTabu = OperationList.Empty;
	  }
	  iRepeat = 0;
	  while( $iRepeat < $cRepeat and $evalBest > 0 )
	  {
		var eval;
		var operToImprove;
		var operToMove;
		operToImprove = $opers.Select([.NumSpec('dt')<0 and not .Flag('tabu')])
		 .MinAt([.ManufactureStartTime]);
		if( not $operToImprove.DoesExist )
		  break;
 【后略】

对表格窗口的子键添加Editing和Edited

对表格窗口的本体部分的Add-in的子键添加了Editing和Edited。可以在编辑字段前后添加Add-in了。 例如编辑前通过Add-in进行禁用字符或格式的检验、对值进行变换或接受输入、或取消输入。 也可以在编辑后通过Add-in对受到编辑所带来的影响的各种表格或视图进行更新。

其他

zip版FLEXSCHE

由于公司内部信息系统管理上的规定无法安装FLEXSCHE评估版或无法以测试功能的目的进行安装的情况很多。例如就算没有这些限制也想避免删除旧版本后安装新版本测试后再恢复元版本这种繁杂的操作吧。

版本17的zip版FLEXSCHE可以不进行安装直接将zip格式文件解压缩展开后即可运行FLEXSCHE。zip版FLEXSCHE不对系统(注册表等)写入、所以可以同时放置多个版本而互不干涉、便于测试用途。但有.NET Add-in无法在该版本运行、也无法通过自动化客户端操作等限制、不能以实际运作目的使用zip版。

FLEXSCHE产品介绍

PAGETOP