FLEXSCHE Version 17
FLEXSCHE Version 17.0 was released on July 24, 2017. It includes approximately 190 feature enhancements. Here are some of the major ones. (Differences between Version 16.0 and Version 17.0)
Overall Speed Improvement
We squeezed the dry rag even further.
Scheduling processing, drawing processing, input/output processing of large amounts of data put a tremendous load on the CPU. Therefore, by statistically identifying the code that is repeatedly executed when processing actual data, comprehensively removing the load on those parts, and carefully tuning the details, further speed improvements have been achieved. Improvements of about 10-20% or more can be expected with a lot of data.
For example, the average time for rescheduling the standard sample data "100,000 operations" was reduced from 4.0 seconds in version 16 to 2.8 seconds in version 17 (30% speed improvement). In another larger and more complex data set, 62 seconds was reduced to 53 seconds (15% speed improvement). Processes other than scheduling have also been sped up.
* These measured values were taken on a PC equipped with an Intel Core i7-6700K CPU.
Additionally, when zooming in on the Gantt chart and a large number of operations are rendered, we have implemented measures to simplify the rendering content to improve responsiveness. The expansion, reduction, and scrolling of the Gantt chart have visibly improved.
the Workshop Planning Option
The "Workshop Planning Option" is an optional product for scheduling that considers the interference between manufactured items placed in the workshop as constraints. In version 17, this workshop planning option has been significantly enhanced.
Placement Restrictions
It is now possible to set constraints such as requiring operations to be placed within specific areas of the workshop or prohibiting placement within certain areas. For example, you can create detailed plans that reflect actual conditions, such as not placing tall workpieces in areas with low ceilings within the workshop.
Planning Considering Gaps
It is now possible to plan to leave a predetermined gap around the workpiece. This is useful when the workpiece shape is imported from CAD and does not include the workspace, or when you want to ensure space for workers to pass around the workpiece.
Improved Usability When Entering Shapes
When entering shapes, it is now possible to easily add vertices with the mouse, similar to drawing software (drawing tools). You can also display a reference image in the background and plot on top of it.
Display Images in the Background of the Workshop Panel
It is now possible to display images in the background of the workshop. By overlaying images of the actual workshop, it becomes easier to grasp the placement locations of workpieces.
Operational Enhancements
It is now possible to detect abnormalities in shapes and placements using the Validate Data Method. Additionally, it is now possible to input actual placement information in the Operation Result Table.
FLEXSCHE CarryOut
FLEXSCHE CarryOut is a system that supports the execution of plans in the manufacturing site. In version 17, its functionality has been further enhanced.
Reflect Operation Results on the Server and Update Plans
It is now possible to maintain work instructions in an executable state.
Previously, it was often difficult to grasp the impact of delays in upstream processes or sudden troubles, and it was often necessary to rely on ad-hoc judgments at the manufacturing site. To obtain an executable plan that reflects delays and troubles in operations, it was necessary to return to the planner for rescheduling, which was practically difficult. This is especially true when the frequency of planning is limited to once a day or once a week.
In version 17, it is now possible to update plans at any time by reflecting the current situation on the CarryOut server, allowing you to always obtain the latest executable instructions. The scheduling rules for plan updates can be freely constructed, just like in FLEXSCHE GP.
By incorporating a flexible time buffer in advance through the "Adaptive Time Constraint" below, it is possible to achieve stable manufacturing that is less affected even if delays or troubles occur in operations.
Customization of Client Screens
It is now possible to freely customize the screen layout and display items of the client (tablet) for each user and resource. You can change the item names to suit individual users and display only the information you want to show.
User Interface
Many improvements have been made around the display, making it more flexible and convenient.
Variations in the Drawing Method of Bars and Text on the Gantt Chart
The desirable way to display a Gantt chart varies according to individual preferences and purposes.
In version 17, the display methods of work bars and text on resource Gantt charts and order Gantt charts have been organized, and the variations have significantly increased. Furthermore, logic has been incorporated to efficiently and legibly render a large amount of text information in limited space.
Enhancement of Milestones
Customization of Symbols
It is now possible to freely assign images to milestone symbols. Any image file can be used as a milestone symbol.
Display on Order Gantt as Well
It is now possible to display milestones on the order Gantt chart as well.
Acceleration of Rendering and Expansion of Specification Methods from Orders
It is now possible to display milestones more freely, such as at specific times on specific job Gantt rows. Additionally, performance has improved due to a review of the rendering process. When displaying a large number of milestone images, rendering is faster than before.
Enhancement of Signboard Rows
The types of signboard rows available have increased.
The types of items that can be used as signboard rows have increased. Newly added are signboard rows for operations, operation graphs, process graphs, process hierarchies, and specs. This allows for more flexible chart configurations and direct display of the information you want to see.
Display the Left Section of Order Gantt Chart Rows by Rack
Generally, a single order Gantt chart row may be composed of multiple racks, and in such cases, it is now possible to switch the display content of the left section of the chart row by rack. By using this mechanism, it is possible to realize a "Gantt chart by item process" as shown in the diagram, for example.
* This is only effective in the case of multiple columns.
Function Expansion of FLEXSCHE Editor
Checkboxes in Fields
By using checkboxes, it becomes easier to view than displaying as a string, and operation is simplified as you only need to check.
Refer to Snapshots from the Table Window
It is now possible to display snapshot data in read-only mode in the table window. You can compare the plan data at a certain point in time from the perspective of master data rather than a Gantt chart.
Display Official Names in Selection Candidates
It is now possible to display official names in fields that specify specs, items, resources, etc. By displaying easy-to-understand official names instead of mechanically assigned codes, it becomes easier to verify the data.
Functionality Expansion of FLEXSCHE d-MPS (Supply and Demand Balance Adjustment Option)
User-Defined Rows in the MPS Editor
It is possible to add rows defined by formulas for monthly and daily values. For example, you can save the MPS plan at a certain point in time as a snapshot and compare the planned production volume with the current production volume.
Scheduling and Modeling
Adaptive Time Constraint
It has become easier to model the way delays in operations consume the pre-given buffer between processes.
In cases where there is a bottleneck process within the factory, to maximize the throughput of the entire factory, the bottleneck process must be operated to its fullest extent. In such cases, a widely known method is to plan in advance with a time buffer before the bottleneck process to prevent it from stopping or slowing down due to sudden troubles (such as equipment failures) or statistical fluctuations (such as cycle time variations) that occur in the preceding process. This buffer time is referred to as "buffer time."
By utilizing the mechanism of adaptive time constraints, it has become easy to model and schedule in a way that includes "buffer time" in the plan during the planning phase and absorbs delays with the buffer during the execution phase.
Raw Material Candidate
It is now possible to select according to the situation during scheduling, such as when there are alternative raw materials.
When there were multiple candidates for raw materials, it was previously necessary for a person to decide in advance, such as "use this one for this order" (using a selector method).
There was also a method to let the scheduler dynamically change the item, but it was limited to cases like "use this one if working with this resource (equipment)" (using an item selection method).
In version 17, it has become possible to evaluate which combination of candidate resources and items is best to choose from scheduling rules. For example, by setting a rule like "prioritize using raw material A, but use raw material B if it's insufficient," the scheduler can decide which resource and item to use for each order based on the situation.
Specify multiple selectors for the selected side
The expression of process variations has become simpler.
A selector is a mechanism that has been available in FLEXSCHE for a long time, allowing you to give names (="selectors") to the required raw materials or preceding processes and select them for each order. In this example, you can freely choose whether four types of raw materials are needed ("A1", "A2", "B1", "B2") or whether "Process 1" is necessary ("L1") and list them in the order. In this way, three patterns of operations are created in this example.
While this method allows for free expression of combinations (in the above example, there are dozens of patterns),
- it is cumbersome as you have to enumerate each combination to express them.
- It can also express combinations that are not actually allowed,
which is a drawback.
Therefore, in version 17, it has become possible to give names to allowed combination patterns and set them in the process when defining the process (enumerating them if necessary). In this example, the three combination patterns are named "T1", "T2", and "T3", and they are set as selectors in the required places. Since both patterns "T2" and "T3" require "Process 1", the selector string "T2|T3" is set between the processes. By doing this, you only need to specify the name of the combination pattern from the order, and you will not mistakenly specify a disallowed combination.
Enhanced Automatic Lot Pegging Method
The automatic lot pegging method (a feature of the advanced option "Order Pegging Automation") has been further enhanced.
Quantity Limitation
It is now possible to specify the upper limit for pegging quantities between lots using an expression. For example, even if it is possible to peg the supply side and demand side in a 1:1 ratio in terms of quantity, you can intentionally peg them in a 1:N ratio to manufacture in parallel, thereby reducing lead time.
Dynamically Select the Counterpart Lot
The selection of pegging counterparts has become more flexible. For example, it is now possible to achieve "peg with a counterpart that matches the remaining quantity as closely as possible."
Support for Safety Stock Level Transition
Previously, it was possible to leave the portion of safety stock unpegged for sudden future demand, but now it is also possible to leave the amount according to the period if the safety stock level changes over time.
FLEXSCHE EDIF (Data Interface)
FLEXSCHE EDIF is a mechanism for flexible data exchange between external data sources (databases or CSV files) and FLEXSCHE. It also has a function to output Excel reports with freely definable layouts.
In version 17, the functionality of FLEXSCHE EDIF has been further enhanced.
Support for ADO.NET, Speedup, and Expansion of Target Databases
By supporting ADO.NET providers, EDIF differential export has achieved up to 60 times speedup (in the case of differential export of 200,000 operations in Oracle). Additionally, it is now possible to execute EDIF on databases that support ADO.NET providers, such as MySQL, DB2, and PostgreSQL.
Specify (Sort) the Order of Record Output
It is now possible to specify the order of record output using an expression. Previously, the record order was fixed internally in FLEXSCHE, but now it is possible to output in any order, such as due date order or quantity order.
Added Table Mapping "Operation (Update)"
It is now possible to perform differential import on existing operations, limited to certain specific items such as comments. Information from external data can be collectively written into existing operations.
Specify Excel Report Sheet Names with Expressions
The output sheet names of Excel reports were previously fixed, but now they can be specified using expressions.
Added Introductory Guide
An introductory guide for EDIF and Excel reports has been added. By following the guide, you can experience the functions of EDIF and Excel reports.
Related to Expressions
Named Arguments
It is now possible to specify arguments when calling a function as a pair of argument names and values, regardless of the original order. This is especially useful when a function has many optional arguments.
Conventional Notation:
.NeighborOperations( LinkType.In, , , true )
Newly Usable Notation:
.NeighborOperations( LinkType.In, overConnection:true )
Function to Solve the Knapsack Problem
It is now possible to use the function List.SolveKnapsack to solve the "knapsack problem," one of the combinatorial problems. For example, by using this in the automatic lot pegging method, you can choose a combination that minimizes waste when it is not allowed to peg across multiple supply lots.
{600,300,150,220,450,500}.SolveKnapsack(1000)
Result => {600,150,220}
Programming Related (For Developers)
Update or Close FSF Modeless Form from Add-ins, etc.
The FLEXSCHE Scripting Form is a mechanism for easily creating forms (dialogs, panels, views) by simply writing scripts (JavaScript/VBScript). However, previously, the opportunity to close panels or views or update the display content was limited to direct operations with a mouse on the panel or view.
In version 17, it has become possible to operate from add-ins outside the form, greatly expanding the range of utilization.
Generate Scripts from Structurally Control Method to Call External-Method Method
The "Structurally Control Method," which is used to describe advanced scheduling rules with complex control structures such as conditional branches and loops, allows you to input the flow of processing on a dialog. While convenient for small-scale operations, for developers accustomed to programming, coding with a text editor may be preferable as the scale grows. Especially in rule creation that requires trial and error, scripting is more efficient. However, writing script code (external method) equivalent to the existing structurally control method definition from scratch is quite a tedious task.
Therefore, in version 17, it has become possible to generate a template file of equivalent JavaScript code from the existing structurally control method, and a new "Call External-Method Method" can be added to call it. Although the generated code does not work as is, a large part of the conversion work is taken over, so it can be made to work with some adjustments.
Display Implementation Example
// External method // Class name : @optimize // Entry name : optimize // Iのひな形コードtoそのまま実行するIandはできません。コードNakataに現れるExpressionand変数to // 適切に書き換えてfor more information. // ・代Joining文の左辺値totaktExpressionlaunchJavaScriptのExpressionに書き換えられNo場合は、 // SDSpace.Calculate()で評価するように書き換えてfor more information. // Expression内で変数to参照している場合は、CreateTypedExpressionでISDExpression // インスタンスto作って、ISDExpression.AddVariable()で値to与えるIandisできます。 // ・制御構造内で同じExpressionis繰り返し評価される場合は、ISDExpressionインスタンスto // 使いまわすIandで、無駄な式解析処理to省くIandisできます。 // ・SchedulingメソッドlaunchStructurally control method内で宣言した変数to参照している // 場合は、メソッドのParameterandして宣言し、IGPExecutableEntity.ParameterValue()で // 値to明示的に与えるように書き換えてfor more information. // ・コードto書き換えた後、from [Tools]-[Add-in再登録]to実行するand外部メソッドis // 利用可能になります 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 / Fォワード再割付け 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 / Fォワード再割付け 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' ); 【Nakata略】 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; 【後略】
Added Editing and Edited as subkeys to the table window
Added Editing and Edited as subkeys to the main part of the table window add-in. You can add add-ins just before and after a field is edited. For example, in the pre-edit add-in, you can perform checks for prohibited characters or formats, convert values, and accept input, or create an add-in that cancels the input itself. In the post-edit add-in, it becomes possible to update data or views affected by the edit.
Other
ZIP version of FLEXSCHE
Due to management circumstances of the internal information system, there are often cases where it is not easy to install the evaluation version or try out new features of FLEXSCHE. Even without such restrictions, uninstalling a version once installed and reverting to the original can be cumbersome and something to avoid.
With the ZIP version of FLEXSCHE version 17, you can execute FLEXSCHE simply by extracting the ZIP format compressed file and placing it in any folder without the need for installation. The ZIP version of FLEXSCHE does not write anything to the system (such as the registry), so multiple versions can be placed without interfering with each other, making it suitable for purposes like "trying various things." However, there are some limitations (displayed at startup) such as .NET add-ins not working and not being operable from an automation client, so it cannot be used for actual operations.