FLEXSCHE版本17的新功能
发布时间:2020-9-3发布人:admin
整体提速
再一次挤出了干抹布中的水。
大量数据的排程处理、绘图处理、输入输出处理等、会给CPU带来莫大的负担。所以、从统计学的角度特定处理实际数据后反复运行的记录、综合去除对该部分的负荷、加上对细节的仔细调整、从而实现了进一步的提速。很多数据都观测到有1~2成程度以上的改善。
例如、标准示例数据“10万工作”的重排程处理的平均时间从版本16时4.0秒缩短为版本17的2.8秒(30%提速)。另外、其他的更大的数据从62秒缩短到53秒(15%提速)。排程以外的处理也进行了提速。
※上述测试值以CPU为Intel Core i7-6700K的PC进行的测试。
另外、缩放甘特图表对庞大数量的工作进行绘图时、进行了简化显示绘图内容提高反应速度的细心处理。甘特图表的放大·缩小·滚动等反应速度有了体感上的提高。
用户界面
对显示部分进行了多数改良,变得更为灵活更为便利。
丰富了甘特图表的图棒和文本的绘图方法
甘特图表的最佳显示方式根据人的喜好应该有很多种方式。
版本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对受到编辑所带来的影响的各种表格或视图进行更新。