KanoaMES v1.11
Release Date - 6/15/25
Implementation Guidance
This release package has been tested against Ignition 8.1.47.
The minimum required version of Ignition is 8.1.33
- kanoaMES_1_11_19.modl
- ApexCharts-signed 1.0.17.modl
- BIJC_Calendar_Component_v1.8.1.modl
Note...
- We have set itemId in the mes.workOrder to NOT NULL. A work order record is invalid if it doesn't contain an itemId. If the module update fails as Hawthorn attempts to set this constraint,
- go into the database and either delete any workorders that has null itemIds, or set them to a valid itemId.
Summary
Our latest release 1.11 brings more features and a ton of fixes and improvements to all aspects of the KanoaMES product. In summary, we have added...
- Performance Reason Coding - Analyze the reasons your assets ran slowly
- Generate serialized numbers - Create templates that determine how serialized numbers are generated
- Add custom attributes to lots
- Track lot location on mobile assets - assetTransportId
- User configuration of Asset Operation screen
- Search for production order scheduled events
- Import and export dashboard widgets
- Improved Downtime Analysis only include events that occur during production
Performance States
We've added Performance Reason Coding that allows speed loss to be coded and categorized. This addition means that you now have a way to codify all the different reasons that can affect an assets' OEE. We call it the trifecta!
- Downtime Reasons for Availability
- Item States and Scrap Reasons for OEE Quality
- Performance Reasons for OEE Performance
Performance States can be grouped into performance reason state classes and then linked to assets and items, so only those reasons valid for an asset/item combo are available for operator selection.
Performance Events can be added via the Performance Event editor.
We have created three new widgets that you can use to create a dashboard to display Speed Loss analytics.
- kanoa/core/dbp/widgets/analytics/performanceReasonBarChart
- kanoa/core/dbp/widgets/analytics/performanceReasonPieChart
- kanoa/core/dbp/widgets/analytics/performanceReasonTable
Downtime Analysis
We have refactored our asset state event analysis calls to only return downtime events that occur during production runs. Although most of our analysis screens only called for downtime data during production times, it was possible to go the downtime analysis screen and select a period that include non production time and all downtime state events during that time frame would be returned which caused some confusion.
So we have created the following new functions....
- system.kanoa.event.getAssetStateEvents(). Replaces getDowntimeData() and getStateEvents() functions which have been deprecated.
- system.kanoa.event.getAssetStateEventsSummary(). Replaces getDowntimeDataSummary() and getStateEventSummary() functions which have been deprecated.
- system.kanoa.event.getAssetStateEventsByShift(). Replaces getDowntimeDataByShift() which has been deprecated.
- system.kanoa.event.getAssetStateEventsByShiftSummary(). Replaces getDowntimeDataByShiftSummary() which has been deprecated.
- system.kanoa.event.getAssetStateEventsByInterval(). Replaces getDowntimeDataByInterval() which has been deprecated.
- system.kanoa.event.getAssetStateEventsByCategory(). Replaces getDowntimeDataByCategory() which has been deprecated.
All our analysis views have been modified to call the new functions. Any custom screens you have created that call the deprecated functions will still work and they in turn have been modified to also only return downtime during production events.
New Lot Features
Serialized Numbers
We've added 5 new system functions that allow you to define a serialized template to then start generating serial numbers against.
system.kanoa.serial.addSerialNumber() allows you to specify a prefix, suffix, zfill and starting value for a serialized template name.
Example...
serialInfo = {'serialName': 'lpn', 'prefix': 'KAN', 'zfill': 6, 'suffix': '-A'} userId = system.kanoa.security.getIDPUserId({'userName': 'SYSTEM'}) serialId, msg = system.kanoa.serial.addSerialNumber(serialInfo, userId)
Once a template has been created, you can now call system.kanoa.serial.getNextSerialNumber(serialId, userId) to generate the next unique serialNumber. Other functions added are system.kanoa.serial.deleteSerialNumber(), system.kanoa.serial.getSerialNumbers() and system.kanoa.serial.updateSerialField().
Lot Attributes We've added the ability to add attributes to a lot.
New Lot Attribute functions are system.kanoa.lot.getLotAttributes(), addLotAttribute(), updateLotAttribute(), and deleteLotAttribute().
Attributes of a lot can now be viewed in a lot Attribute table on Trace Graph screen.
assetTransportId
Lot events can now be associated with mobile assets. Simply create your mobile assets in the asset configuration screen and add to the lotEvent using the 'assetTransportId' keyword. Not only can you tell where in your facility a lot is, you can also tell which tray, rack or truck it is on.
Asset Operator Screen Configuration
We have added a new tab to asset configuration that will allow a user to select the navigable items, custom left and right panel and dashboards to be shown to an operator on the Asset Operation screen all in one place.
Info panels and Ops panels have been moved to their own folders to be able to provide a dropdown list of available panels.
- kanoa/mes/asset/operation/infoPanel
- kanoa/mes/asset/operation/opsPanel
To create custom panels, simply add your own to these folders in the kanoaMES project or your runnable project that inherits from kanoaAPP.
To add custom navItems to the navigation selection view, a client will override the following view in the kanoaMES or runnable project that inherits from kanoaAPP...
- kanoa/mes/config/assetOperation/navItems and add elements to defaultNavItems
- kanoa/mes/asset/operation/navigation/navSelector and add elements to defaultNavItems
- kanoa/mes/asset/operation/navigation/navSelector and add elements to navItems. This will need to set any specific viewParams for each added view
New Schedule Features
Production Order Event search
You can now search for scheduled events by production order in both the operations scheduler and in the Order screen.
Adjust Schedule Rate based on shift crew size
It is now possible to have the schedule duration of an order calculated based on crew size scheduled for a shift.
To enable this functionality..
* 'Shift Adherence' and 'Intelligent Scheduling' must be disabled
* Configure an asset attribute called '_adjustScheduleRateBasedOnCrewSize' and set to 1. This can be set at any level of the asset hierarchy
* Order is dragged onto schedule
Order Custom Schedule Rate
It has always been possible to have an order received ERP to contain rate information regarding the expected (standard) rate and schedule rate, and the asset-item rate will be stored. In v1.11.19, we extend this to provide a mechanism for storing a custom schedule rate / standard rate that only applies to the production order and that is used when an order to dragged onto the scheduler. This provides a way of having an order that has specific configuration information regarding the production of an item.
How it works...
When an order from ERP is processed, simply add the custom rate information as a workOrderMetaData field called 'orderScheduleRateInfo' against the order.
orderScheduleRateInfo = {
'scheduleRate': 45,
'standardRate': 60,
'itemPeriodName': 'Hour',
'infeedUnits': 'LB'
}
orderMetaDataInfo = {
'workOrderId': 1,
'metaDataName': 'orderScheduleRateInfo',
'metaDataValue': system.util.jsonEncode(orderScheduleRateInfo)
}
userId = system.kanoa.security.getIDPUserId({'userName': 'SYSTEM'})
workOrderMetaDataId = system.kanoa.order.addProductionOrderMetaData(orderMetaDataInfo, userId)
print workOrderMetaDataId
>>> 10
When the order is dragged onto the calendar, we now check to see the order has a workOrderMetaData field called 'orderScheduleRateInfo' and will use that information, other it will use the item-asset rate information.
New Dashboard Features
You can now export and import widgets as well as dashboards. Go to the widget editor under dashboards and export away.
Change Log
User Security
- Add 'Show disabled' to user table.
- userSource selections are wrong and cannot select default. This has been fixed.
- Cannot set user as gateway admin. This is because the enabled binding was set to false due to the userSource name. This has been fixed.
Scheduling
- Default date in schedule Event Viewer is February. This is fixed.
- Found issue with calculating 'start' and end fields when DB is not set to UTC. This has been fixed.
- Recurring schedule selection 'Set' button is disabled. This has been fixed.
- Inherited shifts differ on weekly, monthly, and daily views. This has been fixed.
- Add itemDescription to order eventSelector
Material Management
- 'Show Item Attributes' is now back on the Item Configuration screen. It was removed due to performance issues but is now back and significantly faster.
Lot Management
- Add 'Export button on Lot Manager to export lots to excel.
- Added assetTransportId to lotEvent table to be able to track mobile equipment that a lot is placed on.
- Updated lot trace graph to show asset transport.
Asset Management
- Added current shift info to asset operation info panel.
- Exporting a big asset tree now shows progress indicator.
Bug fixes
- Breadcrumb asset selector show duplicate names. This is fixed.
- Item State Link page does not update automatically after adding new Item States. This is fixed.
- Deleting an item state did not remove it from item state table. This is fixed.
- Disabled item states show up as enabled in "edit" mode. This is fixed.
- Only show downtime on analysis pages that occurs during Production modes. Added new function called getAssetStateEvents() that replaces getDowntimeData and getStateData().
- Importing assets sets new states that do not exist in the target system into an asset group. This is fixed.
- Asset duplication does not maintain cell hierarchy. This is fixed.
- Run Chart does not properly show Scheduled Events. This is fixed.
- CurrentShift in date selector does not auto-refresh. This is fixed.
- Date selector doesn't work if persistent is set to false. This is fixed.
- Date selector incorrect for "last week" & "last 24 hours". This is fixed.
- assetGroupName does not comes across with asset export/import. This is fixed.
- Date was not set on startup of assetOperation screen, causing any widgets dependent on the session values t not show data. This is fixed.
Dashboard & Widgets
- Made downtimeEditor widget more configurable. Added displayOptions to the view params. displayOptions are {'minDuration', 'sortOrder': {'field': 'startDate', 'order': desc'}, 'showState': 'showAll'}. sortOrder field options are 'startDate' or 'duration' showStates options are 'showAll', 'showDTCoded', 'showDTUncoded'
- Changed the flexContainer properties for the assetLevelHeader view to improve the visual clarity when you have cells under an asset. Set the state icon in assetOEEState to be a 30px square.
- Added import and export widget feature
Database Schema Changes
Updated
- [mes].lotEvent to add assetTransportId and FK's
- [mes].[vwLotEvent] to return operationAssetId, operationAssetName and operationAssetPath and assetTransportId
- [mes].[vwLotOperationEvent] to return assetName and assetPath
- [mes].[fnGetWOCount] to get product order actual production counts from Line set order and also counterEvent workOrderId. Also only returns outfeed counts for 'line' assets.
- [mes].[spGetAssetProductionEvents] and [mes].[spGetAssetProductionEventsByShift] to add with (NOLOCK)
- [mes].[vwAsset] to return a tagPath for all assets not just OEE_Enabled assets.
- [mes].[vwScheduleBlock] to correctly calculate 'start' and end fields when DB is not set to UTC.
- [mes].[vwWorkOrder] to fix schedQty calculation. Also made itemId not null.
Added
- [mes].[serialNumbers]
- [mes].[vwSerialNumbers]
- [mes].[performanceEvent]
- [mes].[performanceState]
- [mes].[performanceStateClass]
- [mes].[performanceStateLink]
- [mes].[vwPerformanceEvent]
- [mes].[vwPerformanceState]
- [mes].[vwPerformanceStateClass]
- [mes].[vwPerformanceStateLink]
- [mes].[spGetAssetProductionEvents]
- [mes].[spGetAssetProductionEventsByShift]
- [mes].[spGetAssetProductionEventSummary]
- [mes].[spGetAssetStateEvents]
- [mes].[spGetAssetStateEventSummary]
- [mes].[spGetAssetStateEventByShift]
- [mes].[spGetAssetStateEventByCategory]
- [mes].[spGetAssetStateEventByShiftSummary]
- [mes].[spGetAssetStateEventsByInterval]
Deprecated
- [mes].[spGetDowntimeData]
- [mes].[spGetDowntimeDataByCategory]
- [mes].[spGetDowntimeDataByInterval]
- [mes].[spGetDowntimeDataByShift]
- [mes].[spGetStateData]
Projects
KANOA_SCRIPTS
- Added 'Upload New State Events' View. This shows how to import historical stateEvents directly to the db.
kanoaAPP
- Added 'performanceReasonBarChart', 'performanceReasonPieChart' and 'performanceReasonTable' to kanoa/core/dbp/widgets/analytics views.
- Added 'performanceStateClassEditor', 'performanceStateConfiguration' and 'performanceStateEditor' to kanoa/mes/config/performanceStates views.
- Updated 'lotTrace', 'lotOperationEventInfo', 'lotEvents' in kanoa/mes/lots views. Updated 'kanoa/mes/lots/lotPanel/lotEvents'. Change is to handle new assetTransportId field.
- Updated 'kanoa/core/templates/selectors/dateSelector' view to add displayOption 'persistent' to view params. Useful when you have two dateSelector on the same view and you want them to not interact.
- Updated kanoa/scheduler/operations and kanoa/scheduler/shifts to fix 'Default date in schedule Event Viewer is February'.
- Updated kanoa/core/dbp/widgets/analytics/assetOEEBarChart. This widget got broken. hourTimestamp became hourTimeStamp and oee is no longer returned
- Updated kanoa/mes/asset/downtime/downtimeTable to use new getAssetStateEvents() function. Downtime viewer was not working correctly for 'This Week' date range.
- Updated kanoa/mes/asset/downtime/downtimeTable, kanoa/core/dbp/widgets/analytics/assetDowntimeTable, kanoa/mes/analytics/downtimeApex, kanoa/core/dbp/widgets/inputs/downtimeEditor kanoa/mes/analytics/embedded/assetChart, kanoa/core/dbp/widgets/analytics/topDowntimeBy, kanoa/core/dbp/widgets/analytics/assetDowntimeBarChart, kanoa/mes/analytics/widgets/assetDowntimeBarChart
- to use new getAssetStateEvents() function.
- Updated kanoa/mes/config/itemStates/itemStateConfiguration to fix issue with deleting an item state did not remove it from item state table.
- Updated kanoa/mes/analytics/runChart/equipmentSchedule to properly show Scheduled Events.
- Updated kanoa/scheduler/embedded/recurringOptions to fix issue with set button being disabled.
- Updated kanoa/mes/asset/runReview/runTable to support runs containing multiple production orders.
- Updated kanoa/mes/asset/operation/runControl so it can be used as a widget. Also made it more mobile responsive.
- kanoa/mes/analytics/runChart/main is now using sortOrder for assets
System Functions
Added
- system.kanoa.event.getAssetStateEvents(). This function replaces getDowntimeData() and getStateEvents() functions which have been deprecated.
- system.kanoa.event.getAssetStateEventsSummary(). This function replaces getDowntimeDataSummary() and getStateEventSummary() functions which have been deprecated.
- system.kanoa.event.getAssetStateEventsByShift(). This function replaces getDowntimeDataByShift() which has been deprecated.
- system.kanoa.event.getAssetStateEventsByShiftSummary(). This function replaces getDowntimeDataByShiftSummary() which has been deprecated.
- system.kanoa.event.getAssetStateEventsByInterval(). This function replaces getDowntimeDataByInterval() which has been deprecated.
- system.kanoa.event.getAssetStateEventsByCategory(). This function replaces getDowntimeDataByCategory() which has been deprecated.
- system.kanoa.item.checkItemClassPath(). When a new item is received from ERP, this function will check if the itemClassPath exists and if not, creates it.
- system.kanoa.event.updateCounterEvent().
- system.kanoa.event.getPerformanceEvents()
- system.kanoa.event.addPerformanceEvent()
- system.kanoa.event.updatePerformanceEvent()
- system.kanoa.event.deletePerformanceEvent()
- system.kanoa.serial
- system.kanoa.performanceState
- system.kanoa.utilities.getDictionaryValue()
- system.kanoa.lot.getLotAttributes()
- system.kanoa.lot.addLotAttribute()
- system.kanoa.lot.updateLotAttribute()
- system.kanoa.lot.deleteLotAttribute()
- system.kanoa.dashboard.exportWidget()
- system.kanoa.dashboard.importWidget()
- system.kanoa.utilities.getDictionaryValue()
Updated
- system.kanoa.asset.getCounterType() to handle enabled column value when it is null.
- system.kanoa.asset.getAssets() to add assetName and assetGroupName being passed as a parameters.
- system.kanoa.attribute.getAttributeEvents() to accept two new parameters 'strictDates' and 'hasValue'.
- system.kanoa.item.addItemAttribute() to return itemAttrId if attribute already exists.
- system.kanoa.order.getProductionOrderMetaData() to handle a null workorderId.
- system.kanoa.order.getProductionOrders() to remove dueDate is null as it was slowing performance.
- system.kanoa.shift.getShiftCalendarEvents() to ensure inherited shifts are returned correctly for periods other a week.
- system.kanoa.shift.getCurrentShift() to use GETDATE() to check for current shift.
- system.kanoa.shift.updateShiftEvents() to correct 'No Shift' defines offset when database is not in UTC.
- system.kanoa.event.addCounterEvent() to handle optional parameters.
- system.kanoa.asset.unlinkAssetState(). Not all return paths were returning a tuple.
- system.kanoa.asset.enableAssetStateLink(). Now returns a tuple.
- system.kanoa.asset.exportAsset() to replace local copy.
- system.kanoa.asset.updateMode(). getKey was set to 1, changed to 0 for # of records modified.
- system.kanoa.asset.unlinkAssetMode(). Not all return paths were returning a tuple.
- system.kanoa.asset.setAssetModeCode(). Switched to getKey=0 to return # of records modified.
- system.kanoa.asset.updateStateCategory(). Modified return tuple.
- system.kanoa.asset.updateStateField(). Updated getKey=0.
- system.kanoa.asset.deleteStateCategory(). Modified return tuple.
- system.kanoa.attribute.getAttributes(). Parameterized attributePath to handle special chars.
- system.kanoa.asset.getClosestAncestorAttribute(). Check for null assetPath and assetAttrName.
- system.kanoa.event.getModeEvents(). Allow just the startDate to be passed to see if a modeEvent exists at this time and also tStamp to return modeEvent at this time.
- system.kanoa.security.addUser(). Removed casting of int on user.id
- system.kanoa.lot.getLotEvents(). Added operationAssetPath, operationAssetGroupName and operationAssetName params and return values
- system.kanoa.lot.getLotsForLotOperationEvent(), getLotOperationEvent(), addLotOperationEvent(), updateLotOperationEvent(), deleteLotOperationEvent() and executeLotOperation() . to support assetTransportId and to handle execution when we can't create a lotId due to missing field.
- system.kanoa.order.getProductionOrders(). Added itemDescription field
- system.kanoa.event.getAssetProductionEvents() and system.kanoa.event.getAssetProductionEventsByShift() both now return itemDescription()
Intellisense
- Corrected system.kanoa.security.getIDPUserId().
- Corrected system.kanoa.event.addStateEvent().
- Corrected system.kanoa.security.addUser().
- Corrected system.kanoa.asset.addAsset().
Tags
- Add new generalCounterUDT. It's a UDT that you can drop into a line tag folder and configure it to add other 'general' counts.
Version Updates
1.11.19
- system.kanoa.lot.updateLotAttribute() returns tuple for all return paths
- system.kanoa.event.getPerformanceEvents() no longer returns duplicate records
- system.kanoa.asset.getAssetAttributes() includes parameters and return values for assetName and assetGroupName
- Asset export button is no longer displayed if no asset is selected
- Fixed issue where updateShiftEvents() was creating 'No Shift Defined' events with a duration of 0 seconds
- Added ability for orders to store a custom scheduleRate / standardRate and have be used when an order is scheduled.
- system.kanoa.shit.getShiftCalendarEvents() and system.kanoa.schedule.getCalendarsEvents() tzOffsets parameter is now optional
- Added system.kanoa.event.getAssetPerformanceEventsByShift()