alot new changes. major: statistics page. showing data from 1000 tags. updated db tables scripts. added labels on the conveyors and chutes. fixed chute pe not showing colors correclty. fixed device mapping function not displaying LRPE status correctly. New queries for the statistics page

This commit is contained in:
Salijoghli 2025-11-21 16:44:18 +04:00
parent 73c2a04b86
commit 48dc3a54a1
980 changed files with 441485 additions and 39444 deletions

View File

@ -0,0 +1,626 @@
{
"custom": {
"color": "#000000",
"priority": "No Active Alarms",
"state": "Offline"
},
"params": {
"demoColor": -1,
"demoState": -1,
"tagProps": [
"value",
"System/MCM02/SOL/NCS1_1_SOL48",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.color": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Color"
},
"transforms": [
{
"expression": "if(\r\n {view.params.demoColor} \u003e\u003d 0,\r\n {view.params.demoColor},\r\n coalesce({value}, -1)\r\n)\r\n",
"type": "expression"
},
{
"fallback": "#000000",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#C2C2C2"
},
{
"input": 1,
"output": "#FF0000"
},
{
"input": 2,
"output": "#FFA500"
},
{
"input": 3,
"output": "#0008FF"
},
{
"input": 4,
"output": "#00FF00"
},
{
"input": 5,
"output": "#FFF700"
},
{
"input": 6,
"output": "#87CEEB"
},
{
"input": 7,
"output": "#90EE90"
},
{
"input": 8,
"output": "#964B00"
},
{
"input": 9,
"output": "#FFFFFF"
},
{
"input": 10,
"output": "#000000"
},
{
"input": 11,
"output": "#8B0000"
},
{
"input": 12,
"output": "#808080"
},
{
"input": 13,
"output": "#8B8000"
},
{
"input": 14,
"output": "#006400"
},
{
"input": 15,
"output": "#FFFFC5"
},
{
"input": 16,
"output": "#00008B"
},
{
"input": 17,
"output": "#FF7276"
},
{
"input": 18,
"output": "#556B2F"
},
{
"input": 19,
"output": "#B43434"
},
{
"input": 20,
"output": "#4682B4"
},
{
"input": 21,
"output": "#FFD700"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.divertingLeft": {
"persistent": true
},
"custom.divertingRight": {
"persistent": true
},
"custom.priority": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Priority"
},
"transforms": [
{
"expression": "coalesce({value},0)",
"type": "expression"
},
{
"fallback": null,
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "No Active Alarms"
},
{
"input": 1,
"output": "High"
},
{
"input": 2,
"output": "Medium"
},
{
"input": 3,
"output": "Low"
},
{
"input": 4,
"output": "Diagnostic"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/State"
},
"transforms": [
{
"expression": "if(\r\n {view.params.demoState} \u003e\u003d 0,\r\n {view.params.demoState},\r\n coalesce({value}, -1)\r\n)\r\n",
"type": "expression"
},
{
"fallback": "Offline",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "Closed"
},
{
"input": 1,
"output": "Actuated"
},
{
"input": 2,
"output": "Communication Faulted"
},
{
"input": 3,
"output": "Conveyor Running In Maintenance Mode"
},
{
"input": 4,
"output": "Disabled"
},
{
"input": 5,
"output": "Disconnected"
},
{
"input": 6,
"output": "Stopped"
},
{
"input": 7,
"output": "Enabled Not Running"
},
{
"input": 8,
"output": "Encoder Fault"
},
{
"input": 9,
"output": "Energy Management"
},
{
"input": 10,
"output": "ESTOP Was Actuated"
},
{
"input": 11,
"output": "EStopped"
},
{
"input": 12,
"output": "EStopped Locally"
},
{
"input": 13,
"output": "Extended Faulted"
},
{
"input": 14,
"output": "Full"
},
{
"input": 15,
"output": "Gaylord Start Pressed"
},
{
"input": 16,
"output": "Jam Fault"
},
{
"input": 17,
"output": "Jammed"
},
{
"input": 18,
"output": "Loading Allowed"
},
{
"input": 19,
"output": "Loading Not Allowed"
},
{
"input": 20,
"output": "Low Air Pressure Fault Was Present"
},
{
"input": 21,
"output": "Maintenance Mode"
},
{
"input": 22,
"output": "Conveyor Stopped In Maintenance Mode"
},
{
"input": 23,
"output": "Motor Faulted"
},
{
"input": 24,
"output": "Motor Was Faulted"
},
{
"input": 25,
"output": "Normal"
},
{
"input": 26,
"output": "Off Inactive"
},
{
"input": 27,
"output": "Open"
},
{
"input": 28,
"output": "PLC Ready To Run"
},
{
"input": 29,
"output": "Package Release Pressed"
},
{
"input": 30,
"output": "Power Branch Was Faulted"
},
{
"input": 31,
"output": "Pressed"
},
{
"input": 32,
"output": "Ready To Receive"
},
{
"input": 33,
"output": "Running"
},
{
"input": 34,
"output": "Started"
},
{
"input": 35,
"output": "Stopped"
},
{
"input": 36,
"output": "System Started"
},
{
"input": 37,
"output": "Unknown"
},
{
"input": 38,
"output": "VFD Fault"
},
{
"input": 39,
"output": "Conveyor Running In Power Saving Mode"
},
{
"input": 40,
"output": "Conveyor Jogging In Maintenance Mode"
},
{
"input": 41,
"output": "VFD Reset Required"
},
{
"input": 42,
"output": "Jam Reset Push Button Pressed"
},
{
"input": 43,
"output": "Start Push Button Pressed"
},
{
"input": 44,
"output": "Stop Push Button Pressed"
},
{
"input": 45,
"output": "No Container"
},
{
"input": 46,
"output": "Ready To Be Enabled"
},
{
"input": 47,
"output": "Half Full"
},
{
"input": 48,
"output": "Enabled"
},
{
"input": 49,
"output": "Tipper Faulted"
},
{
"input": 54,
"output": "Diverting"
},
{
"input": 50,
"output": "OK"
},
{
"input": 51,
"output": "DISCONNECTED"
},
{
"input": 52,
"output": "FAULTED"
},
{
"input": 53,
"output": "FAULTED/DISCONNECTED"
},
{
"input": 101,
"output": "Diverting"
},
{
"input": 102,
"output": "Diverting Left"
},
{
"input": 103,
"output": "Diverting Right"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"params.demoColor": {
"paramDirection": "input",
"persistent": true
},
"params.demoState": {
"paramDirection": "input",
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 50,
"width": 50
}
},
"root": {
"children": [
{
"meta": {
"name": "SOL"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.color"
},
"type": "property"
}
},
"props.elements[1].fill.paint": {
"binding": {
"config": {
"expression": "if ({view.custom.state} \u003d \"Offline\", \"#fff\", \"#000\")"
},
"type": "expr"
}
}
},
"props": {
"elements": [
{
"fill": {},
"height": "47.417244",
"id": "beaconSquare",
"name": "beaconSquare",
"stroke": {
"paint": "#000000",
"width": "2.36887"
},
"type": "rect",
"width": "47.337795",
"x": "1.450278",
"y": "1.3708278"
},
{
"fill": {},
"id": "beaconLabel",
"name": "beaconLabel",
"stroke": {
"width": "1.15193"
},
"style": {
"classes": "",
"fontSize": "21px",
"textAnchor": "middle"
},
"text": "SOL",
"textAnchor": "middle",
"type": "text",
"x": "24.958401",
"y": "31.781378"
}
],
"viewBox": "0 0 50 50"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tsystem.perspective.openDock(\u0027Docked-East-Conv\u0027)\n\t#create tags lists for the device\n\tprops \u003d self.view.params.tagProps\n\ttags_table_dataset \u003d autStand.devices.getAllTags(self, props[0])\n\tsystem.perspective.openDock(\u0027Docked-East-Device\u0027,params\u003d{\u0027tagProps\u0027:props, \"tags\":tags_table_dataset, \"name\":\"\"} )"
},
"scope": "G",
"type": "script"
},
"onMouseEnter": {
"config": {
"draggable": false,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"position": {
"relativeLocation": "top-right"
},
"positionType": "relative",
"resizable": false,
"showCloseIcon": false,
"type": "open",
"viewParams": {
"text": "{/root.meta.tooltip.text}"
},
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
},
"onMouseLeave": {
"config": {
"draggable": true,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"resizable": true,
"showCloseIcon": true,
"type": "close",
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
}
}
},
"meta": {
"name": "root",
"tooltip": {
"enabled": true
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "if(\n {view.custom.state} !\u003d \"Offline\",\n \"Source Id: \" + {view.params.tagProps[0]} + \", Priority: \" + {view.custom.priority} + \", State: \" + {view.custom.state},\n \"Device Disconnected\"\n)\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_solenoids"
},
"type": "property"
}
}
},
"props": {
"mode": "percent",
"style": {
"cursor": "pointer",
"overflow": "visible",
"userSelect": "None"
}
},
"type": "ia.container.coord"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 B

View File

@ -0,0 +1,8 @@
SELECT DISTINCT destination_act AS lane
FROM package_history
WHERE destination_act IS NOT NULL
UNION
SELECT DISTINCT lane_id AS lane
FROM pe_history
WHERE lane_id LIKE "CH%" OR lane_id LIKE "RS%1CH"
ORDER BY lane ASC;

View File

@ -0,0 +1,14 @@
-- Hourly Induct Graph Query (Rate)
-- Shows every hour in detail for graphing
SELECT
CONCAT('H', TIMESTAMPDIFF(HOUR,
DATE_FORMAT(t_stamp, "%Y-%m-%d %H:00:00"),
DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00")
)) AS Hour,
COUNT(*) AS Total
FROM alltable
WHERE t_stamp BETWEEN :starttime AND :endtime
GROUP BY DATE(t_stamp), HOUR(t_stamp)
ORDER BY DATE(t_stamp) ASC, HOUR(t_stamp) ASC;

View File

@ -0,0 +1,290 @@
{
"custom": {},
"params": {
"meta": {
"name": "VFD"
},
"props": {
"config": {
"enableHighlight": true,
"isClickable": false
},
"status": {
"color": {
"left": "#B3B3B3",
"right": "#D3D3D3"
},
"showAlways": true,
"tagPath": "[default]MCP03/RO02/RO02_03/VFD",
"tooltip": ""
}
}
},
"propConfig": {
"params.meta": {
"paramDirection": "input",
"persistent": true
},
"params.meta.name": {
"paramDirection": "input",
"persistent": true
},
"params.props": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 105,
"width": 500
}
},
"root": {
"children": [
{
"meta": {
"name": "VFD"
},
"position": {
"height": 64,
"width": 64,
"x": 67.5,
"y": 2.5
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Graphics"
},
"transforms": [
{
"expression": "try(\r\n\tjsonSet({value}, \"showAlways\", true),\r\n\t{view.params.props.status}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"config": {
"enableHighlight": false,
"isClickable": false
}
},
"type": "dex.display.vfd"
},
{
"meta": {
"name": "Label_15"
},
"position": {
"height": 25,
"width": 75,
"x": 195,
"y": 40
},
"props": {
"style": {
"fontSize": "20px",
"fontWeight": "bold",
"textAlign": "right"
},
"text": "Status:"
},
"type": "ia.display.label"
},
{
"meta": {
"name": "lbStatus"
},
"position": {
"height": 25,
"width": "calc(100% - 300px)",
"x": 280,
"y": 40
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Graphics"
},
"transforms": [
{
"code": "\treturn utils.extractStatus(value)",
"type": "script"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"fontSize": "14px",
"fontWeight": "bold",
"overflow": "hidden",
"textAlign": "center",
"textOverview": "ellipsis",
"whiteSpace": "nowrap"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Label_1"
},
"position": {
"height": 25,
"width": 75,
"x": 195,
"y": 5
},
"props": {
"style": {
"fontSize": "20px",
"fontWeight": "bold",
"textAlign": "right"
},
"text": "Name: "
},
"type": "ia.display.label"
},
{
"meta": {
"name": "lbName"
},
"position": {
"height": 25,
"width": "calc(100% - 300px)",
"x": 280,
"y": 5
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Parameters.LabelFull"
},
"transforms": [
{
"expression": "coalesce({value}, \u0027\u0027)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"fontSize": "14px",
"fontWeight": "bold",
"overflow": "hidden",
"textAlign": "center",
"textOverview": "ellipsis",
"whiteSpace": "nowrap"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Label_12"
},
"position": {
"height": 25,
"width": 75,
"x": 195,
"y": 75
},
"props": {
"style": {
"fontSize": "20px",
"fontWeight": "bold",
"textAlign": "right"
},
"text": "Panel:"
},
"type": "ia.display.label"
},
{
"meta": {
"name": "lbStatus_0"
},
"position": {
"height": 25,
"width": "calc(100% - 300px)",
"x": 280,
"y": 75
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Parameters.OPC_Server"
},
"transforms": [
{
"expression": "coalesce({value}, \"Unknown\")",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"fontSize": "14px",
"fontWeight": "bold",
"overflow": "hidden",
"textAlign": "center",
"textOverview": "ellipsis",
"whiteSpace": "nowrap"
}
},
"type": "ia.display.label"
}
],
"meta": {
"name": "root"
},
"props": {
"style": {
"background-color": "#CFCFCF"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,603 @@
{
"custom": {
"color": "#C2C2C2",
"priority": "No Active Alarms"
},
"params": {
"demoColor": -1,
"tagProps": [
"System/MCM02/Encoder/ENSH/NCS1_1_ENSH1",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.color": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Color"
},
"transforms": [
{
"expression": "if(\r\n {view.params.demoColor} \u003e\u003d 0,\r\n {view.params.demoColor},\r\n coalesce({value}, 0)\r\n)\r\n",
"type": "expression"
},
{
"fallback": "#000000",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#C2C2C2"
},
{
"input": 1,
"output": "#FF0000"
},
{
"input": 2,
"output": "#FFA500"
},
{
"input": 3,
"output": "#0008FF"
},
{
"input": 4,
"output": "#00FF00"
},
{
"input": 5,
"output": "#FFF700"
},
{
"input": 6,
"output": "#87CEEB"
},
{
"input": 7,
"output": "#90EE90"
},
{
"input": 8,
"output": "#964B00"
},
{
"input": 9,
"output": "#FFFFFF"
},
{
"input": 10,
"output": "#000000"
},
{
"input": 11,
"output": "#8B0000"
},
{
"input": 12,
"output": "#808080"
},
{
"input": 13,
"output": "#8B8000"
},
{
"input": 14,
"output": "#006400"
},
{
"input": 15,
"output": "#FFFFC5"
},
{
"input": 16,
"output": "#00008B"
},
{
"input": 17,
"output": "#FF7276"
},
{
"input": 18,
"output": "#556B2F"
},
{
"input": 19,
"output": "#B43434"
},
{
"input": 20,
"output": "#4682B4"
},
{
"input": 21,
"output": "#FFD700"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.priority": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Priority"
},
"transforms": [
{
"expression": "coalesce({value},0)",
"type": "expression"
},
{
"fallback": "UNKNOWN",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "No Active Alarms"
},
{
"input": 1,
"output": "High"
},
{
"input": 2,
"output": "Medium"
},
{
"input": 3,
"output": "Low"
},
{
"input": 4,
"output": "Diagnostic"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/State"
},
"transforms": [
{
"expression": "coalesce({value},-1)",
"type": "expression"
},
{
"fallback": "Offline",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "Closed"
},
{
"input": 1,
"output": "Actuated"
},
{
"input": 2,
"output": "Communication Faulted"
},
{
"input": 3,
"output": "Conveyor Running In Maintenance Mode"
},
{
"input": 4,
"output": "Disabled"
},
{
"input": 5,
"output": "Disconnected"
},
{
"input": 6,
"output": "Stopped"
},
{
"input": 7,
"output": "Enabled Not Running"
},
{
"input": 8,
"output": "Encoder Fault"
},
{
"input": 9,
"output": "Energy Management"
},
{
"input": 10,
"output": "ESTOP Was Actuated"
},
{
"input": 11,
"output": "EStopped"
},
{
"input": 12,
"output": "EStopped Locally"
},
{
"input": 13,
"output": "Extended Faulted"
},
{
"input": 14,
"output": "Full"
},
{
"input": 15,
"output": "Gaylord Start Pressed"
},
{
"input": 16,
"output": "Jam Fault"
},
{
"input": 17,
"output": "Jammed"
},
{
"input": 18,
"output": "Loading Allowed"
},
{
"input": 19,
"output": "Loading Not Allowed"
},
{
"input": 20,
"output": "Low Air Pressure Fault Was Present"
},
{
"input": 21,
"output": "Maintenance Mode"
},
{
"input": 22,
"output": "Conveyor Stopped In Maintenance Mode"
},
{
"input": 23,
"output": "Motor Faulted"
},
{
"input": 24,
"output": "Motor Was Faulted"
},
{
"input": 25,
"output": "Normal"
},
{
"input": 26,
"output": "Off Inactive"
},
{
"input": 27,
"output": "Open"
},
{
"input": 28,
"output": "PLC Ready To Run"
},
{
"input": 29,
"output": "Package Release Pressed"
},
{
"input": 30,
"output": "Power Branch Was Faulted"
},
{
"input": 31,
"output": "Pressed"
},
{
"input": 32,
"output": "Ready To Receive"
},
{
"input": 33,
"output": "Running"
},
{
"input": 34,
"output": "Started"
},
{
"input": 35,
"output": "Stopped"
},
{
"input": 36,
"output": "System Started"
},
{
"input": 37,
"output": "Unknown"
},
{
"input": 38,
"output": "VFD Fault"
},
{
"input": 39,
"output": "Conveyor Running In Power Saving Mode"
},
{
"input": 40,
"output": "Conveyor Jogging In Maintenance Mode"
},
{
"input": 41,
"output": "VFD Reset Required"
},
{
"input": 42,
"output": "Jam Reset Push Button Pressed"
},
{
"input": 43,
"output": "Start Push Button Pressed"
},
{
"input": 44,
"output": "Stop Push Button Pressed"
},
{
"input": 45,
"output": "No Container"
},
{
"input": 46,
"output": "Ready To Be Enabled"
},
{
"input": 47,
"output": "Half Full"
},
{
"input": 48,
"output": "Enabled"
},
{
"input": 49,
"output": "Tipper Faulted"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
}
},
"params.demoColor": {
"paramDirection": "input",
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 20,
"width": 20
}
},
"root": {
"children": [
{
"meta": {
"name": "EncoderIcon"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.color"
},
"type": "property"
}
}
},
"props": {
"elements": [
{
"cx": 12,
"cy": "12",
"fill": {},
"name": "statusCircle",
"rx": "10",
"ry": "10",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "ellipse"
},
{
"d": "M 4.6516854,13.685393 H 9.8292135",
"fill": {},
"name": "segLeft",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "M 9.6000004,13.469662 V 8.2112357",
"fill": {},
"name": "segUpLeft",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "M 19.829214,13.685393 H 14.651685",
"fill": {},
"name": "segRight",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "M 14.880899,13.469662 V 8.211236",
"fill": {},
"name": "segUpRight",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "m 9.8154019,8.4404597 4.8815551,0.013462",
"fill": {},
"name": "segTop",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
}
],
"viewBox": "0 0 24 24"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\t#create tags lists for the device\n\tprops \u003d self.view.params.tagProps\n\ttags_table_dataset \u003d autStand.devices.getAllTags(self, props[0])\n\tsystem.perspective.openDock(\u0027Docked-East-Device\u0027,params\u003d{\u0027tagProps\u0027:props, \"tags\":tags_table_dataset, \"name\":\"\"} )"
},
"scope": "G",
"type": "script"
},
"onMouseEnter": {
"config": {
"draggable": false,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"position": {
"relativeLocation": "top-right"
},
"positionType": "relative",
"resizable": false,
"showCloseIcon": false,
"type": "open",
"viewParams": {
"text": "{/Encoder.meta.tooltip.text}"
},
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
},
"onMouseLeave": {
"config": {
"draggable": true,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"resizable": true,
"showCloseIcon": true,
"type": "close",
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
}
}
},
"meta": {
"name": "Encoder",
"tooltip": {
"enabled": true
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "if(\n {view.custom.state} !\u003d \"Offline\",\n \"Source Id: \" + {view.params.tagProps[0]} + \", Priority: \" + {view.custom.priority} + \", State: \" + {view.custom.state},\n \"Device Disconnected\"\n)\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_encoders"
},
"type": "property"
}
}
},
"props": {
"mode": "percent",
"style": {
"cursor": "pointer",
"userSelect": "none"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,10 @@
SELECT concat(date(alltable.t_stamp), ' ', hour(alltable.t_stamp), ':00') as StartTimestamp,
concat('H',TIMESTAMPDIFF(HOUR,DATE_FORMAT(alltable.t_stamp,"%Y-%m-%d %H:00:00"),DATE_FORMAT(now(),"%Y-%m-%d %H:00:00"))) as Hour,
COUNT(*) AS Inducted,
SUM(alltable.ACTUAL_DEST NOT IN ('S013001', 'S012069', 'S011076')) AS Sorted,
SUM(alltable.ACTUAL_DEST IN ('S013001', 'S012069', 'S011076') AND (alltable.DivertStatus & (128|256|512|1024|4096|65536)) > 0) AS AwcsRecirc,
SUM(alltable.ACTUAL_DEST IN ('S013001', 'S012069', 'S011076') AND (alltable.DivertStatus & (4|32|262144|524288|1048576)) > 0) AS OperationalRecirc,
SUM(alltable.ACTUAL_DEST IN ('S013001', 'S012069', 'S011076') AND (alltable.DivertStatus & (2|8|16|64|8192|16384|131072|2097152)) > 0) AS MachineRecirc
FROM alltable
Where (alltable.t_stamp BETWEEN :starttime AND :endtime)
GROUP BY hour(alltable.t_stamp)

View File

@ -0,0 +1,58 @@
SELECT
roundtime AS `Round Time`,
sLocation_ID AS `Location ID`,
CONCAT(COALESCE(Success_pct, 0), '%') AS `Success Percentage`,
CONCAT(COALESCE(Unknown_pct, 0), '%') AS `Unknown Percentage`,
CONCAT(COALESCE(Unexpected_Container_pct, 0), '%') AS `Unexpected Container Percentage`,
CONCAT(COALESCE(Tracking_Error_pct, 0), '%') AS `Tracking Error Percentage`,
CONCAT(COALESCE(Gap_Error_pct, 0), '%') AS `Gap Error Percentage`,
CONCAT(COALESCE(Destination_Full_pct, 0), '%') AS `Destination Full Percentage`,
CONCAT(COALESCE(Destination_Non_Operational_pct, 0), '%') AS `Destination Non Operational Percentage`,
CONCAT(COALESCE(Invalid_Destination_pct, 0), '%') AS `Invalid Destination Percentage`,
CONCAT(COALESCE(Scanner_Error_pct, 0), '%') AS `Scanner Error Percentage`,
CONCAT(COALESCE(Destination_Disabled_pct, 0), '%') AS `Destination Disabled Percentage`,
CONCAT(COALESCE(Throughput_Limit_pct, 0), '%') AS `Throughput Limit Percentage`,
CONCAT(COALESCE(Failed_To_Divert_pct, 0), '%') AS `Failed To Divert Percentage`,
CONCAT(COALESCE(No_Destination_Received_pct, 0), '%') AS `No Destination Received Percentage`,
CONCAT(COALESCE(Lost_Container_pct, 0), '%') AS `Lost Container Percentage`,
CONCAT(COALESCE(Dimension_Error_pct, 0), '%') AS `Dimension Error Percentage`,
CONCAT(COALESCE(Weight_Error_pct, 0), '%') AS `Weight Error Percentage`,
CONCAT(COALESCE(Container_Utilization_pct, 0), '%') AS `Container Utilization Percentage`,
CONCAT(COALESCE(Unable_To_Divert_pct, 0), '%') AS `Unable To Divert Percentage`,
CONCAT(COALESCE(Destination_Not_Attempted_pct, 0), '%') AS `Destination Not Attempted Percentage`
FROM (
SELECT
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(t_stamp) /
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) *
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) AS roundtime,
sLocation_ID,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Success_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 1 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Unknown_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 2 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Unexpected_Container_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 3 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Tracking_Error_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 4 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Gap_Error_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 5 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Destination_Full_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 6 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Destination_Non_Operational_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 7 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Invalid_Destination_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 IN (8, 9, 10) THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Scanner_Error_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 12 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Destination_Disabled_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 13 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Throughput_Limit_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 14 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Failed_To_Divert_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 16 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS No_Destination_Received_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 17 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Lost_Container_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 18 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Dimension_Error_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 19 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Weight_Error_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 20 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Container_Utilization_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 21 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Unable_To_Divert_pct,
CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 22 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) END AS Destination_Not_Attempted_pct
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND (COALESCE(:locationid, '') = '' OR sLocation_ID = :locationid)
GROUP BY roundtime, sLocation_ID
ORDER BY roundtime ASC
) basa;

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 B

View File

@ -0,0 +1,44 @@
SELECT
roundtime AS `Round Time`,
sInduction_Name AS `Induction Name`,
COALESCE(total_single_carrier, 0) AS `Total Single Carrier`,
COALESCE(total_double_carrier, 0) AS `Total Double Carrier`,
COALESCE(total_single_carrier, 0) +
COALESCE(total_double_carrier, 0) AS `Total`
FROM (
SELECT
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(t_stamp) /
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) *
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) AS roundtime,
sInduction_Name,
SUM(diTotal_Single_Carrier) AS total_single_carrier,
SUM(diTotal_Double_Carrier) AS total_double_carrier
FROM induction_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND (sInduction_Name = :inductionname OR :inductionname IS NULL OR :inductionname = '')
GROUP BY roundtime, sInduction_Name
UNION ALL
SELECT
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(t_stamp) /
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) *
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) AS roundtime,
'S02' AS sInduction_Name,
0 AS total_single_carrier,
COUNT(*) AS total_double_carrier
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID LIKE 'S02%'
AND (:inductionname IS NULL OR :inductionname = '' OR :inductionname = 'S02')
GROUP BY roundtime
ORDER BY roundtime ASC
) basa;

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,209 @@
SELECT
CONCAT(DATE(t_stamp), ' ', HOUR(t_stamp), ':00') AS `Start Timestamp`,
CONCAT('H', TIMESTAMPDIFF(HOUR, DATE_FORMAT(t_stamp, "%Y-%m-%d %H:00:00"), DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00"))) AS `Hour`,
sScanner_Name AS `Scanner Name`,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_bad_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS `Total Bad Reads`,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_comm_fault), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS `Total Comm Faults`,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_good_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS `Total Good Reads`,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_multi_items), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS `Total Multi Items`,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_multi_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS `Total Multi Reads`,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_no_data), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS `Total No Data`,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_no_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS `Total No Reads`
FROM scanner_reads
WHERE t_stamp BETWEEN :starttime AND :endtime
AND (sScanner_Name = :scannername OR :scannername IS NULL OR :scannername = '')
GROUP BY DATE(t_stamp), HOUR(t_stamp), sScanner_Name
UNION ALL
SELECT
CONCAT(DATE(t_stamp), ' ', HOUR(t_stamp), ':00') AS `Start Timestamp`,
CONCAT('H', TIMESTAMPDIFF(HOUR, DATE_FORMAT(t_stamp, "%Y-%m-%d %H:00:00"), DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00"))) AS `Hour`,
'S03aa' AS `Scanner Name`,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 NOT IN (0, 8, 9, 10, 11, 15) THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS `Total Bad Reads`,
'0%' AS `Total Comm Faults`,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS `Total Good Reads`,
'0%' AS `Total Multi Items`,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 10 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS `Total Multi Reads`,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 9 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS `Total No Data`,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 8 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS `Total No Reads`
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID LIKE 'S03%'
AND (:scannername IS NULL OR :scannername = '' OR :scannername = 'S03aa')
GROUP BY DATE(t_stamp), HOUR(t_stamp)
ORDER BY `Start Timestamp` ASC;

View File

@ -0,0 +1,38 @@
WITH SORTERS AS (
SELECT
DATE_FORMAT(MIN(s04_timestamp), "%Y-%m-%d %H:%i:00") AS time,
COUNT(*) AS total,
SUM(sort_code="Success") AS success,
SUM(sort_code IN ("Dest Invalid", "Dest None", "Underutilized")) AS awcs,
SUM(sort_code IN ("Dest Disabled", "Dest Full", "Dim Error", "Unexpected", "Weight Err")) AS operational,
SUM(sort_code IN ("Dest Fault", "Div Fail", "Gap Err", "Lost", "Rate High", "Track Err", "Unknown", "Unsafe")) AS machine,
SUM(sort_code IN ("No Read", "No Code", "Multi Label")) AS scanner
FROM package_history
WHERE s04_timestamp BETWEEN :startDate AND :endDate
AND sorter = :sorter
GROUP BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00")
ORDER BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00")
)
SELECT
time,
/* Counts: */
total AS total_count,
success AS success_count,
awcs AS awcs_issues_count,
operational AS operational_issues_count,
machine AS machine_issues_count,
scanner AS scanner_issues_count,
/* PPH: */
ROUND(total*60) AS total_pph,
ROUND(success*60) AS success_pph,
ROUND(awcs*60) AS awcs_issues_pph,
ROUND(operational*60) AS operational_issues_pph,
ROUND(machine*60) AS machine_issues_pph,
ROUND(scanner*60) AS scanner_issues_pph,
/* Percents: */
ROUND(success/total, 4) AS success_percent,
ROUND(awcs/total, 4) AS awcs_issues_percent,
ROUND(operational/total, 4) AS operational_issues_percent,
ROUND(machine/total, 4) AS machine_issues_percent,
ROUND(scanner/total, 4) AS scanner_issues_percent
FROM SORTERS;

View File

@ -0,0 +1,24 @@
SELECT
DATE_FORMAT(:starttime, '%Y-%m-%d %H:%i') AS StartTimestamp,
DATE_FORMAT(:endtime, '%Y-%m-%d %H:%i') AS EndTimestamp,
-- Total is now the sum of Merge, Transport, and Sorter counts
(COALESCE(c.MergeCount,0) + COALESCE(c.TransportCount,0) + COALESCE(c.SorterCount,0)) AS Total,
-- New individual metrics
COALESCE(c.MergeCount,0) AS Merge_MCM01,
COALESCE(c.TransportCount,0) AS Transport_MCM01,
COALESCE(c.SorterCount,0) AS Sorter_MCM02
FROM (SELECT 1) AS p
LEFT JOIN (
SELECT
-- New metric: Merge_MCM01
SUM(Merge_MCM01 = 1) AS MergeCount,
-- New metric: Transport_MCM01
SUM(Transport_MCM01 = 1) AS TransportCount,
-- Kept metric: Sorter_MCM02
SUM(Sorter_MCM02 = 1) AS SorterCount
FROM jam_area
WHERE t_stamp BETWEEN :starttime AND :endtime
) AS c ON 1=1;

View File

@ -0,0 +1,58 @@
SELECT
CASE
WHEN c.sActual_Dest_ID LIKE 'S02%' THEN 'S02'
ELSE 'S03'
END AS Sorter,
DATE_FORMAT(:starttime, '%Y-%m-%d %H:%i') AS start_time,
DATE_FORMAT(:endtime, '%Y-%m-%d %H:%i') AS end_time,
COALESCE(c.sActual_Dest_ID, 'N/A') AS Lane,
COALESCE(c.Success_rate, 0) AS success_rate,
COALESCE(c.Unknown_rate, 0) AS unknown_rate,
COALESCE(c.Unexpected_Container_rate, 0) AS unexpected_container_rate,
COALESCE(c.Tracking_Error_rate, 0) AS tracking_error_rate,
COALESCE(c.Gap_Error_rate, 0) AS gap_error_rate,
COALESCE(c.Destination_Full_rate, 0) AS destination_full_rate,
COALESCE(c.Destination_Non_Operational_rate, 0) AS destination_non_operational_rate,
COALESCE(c.Invalid_Destination_rate, 0) AS invalid_destination_rate,
COALESCE(c.Scanner_Error_rate, 0) AS scan_error_rate,
COALESCE(c.Destination_Disabled_rate, 0) AS destination_disabled_rate,
COALESCE(c.Throughput_Limit_rate, 0) AS throughput_limit_rate,
COALESCE(c.Failed_To_Divert_rate, 0) AS failed_to_divert_rate,
COALESCE(c.No_Destination_Received_rate, 0) AS no_destination_received_rate,
COALESCE(c.Lost_Container_rate, 0) AS lost_container_rate,
COALESCE(c.Dimension_Error_rate, 0) AS dimension_error_rate,
COALESCE(c.Weight_Error_rate, 0) AS weight_error_rate,
COALESCE(c.Container_Utilization_rate, 0) AS container_utilization_rate,
COALESCE(c.Unable_To_Divert_rate, 0) AS unable_to_divert_rate,
COALESCE(c.Destination_Not_Attempted_rate, 0) AS destination_not_attempted_rate,
COALESCE(c.total, 0) AS total
FROM (SELECT 1) AS p
LEFT JOIN (
SELECT
sActual_Dest_ID,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(COUNT(*) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS total,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Success_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 1 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Unknown_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 2 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Unexpected_Container_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 3 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Tracking_Error_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 4 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Gap_Error_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 5 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Destination_Full_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 6 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Destination_Non_Operational_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 7 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Invalid_Destination_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 IN (8, 9, 10) THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Scanner_Error_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 12 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Destination_Disabled_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 13 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Throughput_Limit_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 14 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Failed_To_Divert_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 16 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS No_Destination_Received_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 17 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Lost_Container_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 18 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Dimension_Error_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 19 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Weight_Error_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 20 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Container_Utilization_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 21 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Unable_To_Divert_rate,
CASE WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 22 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2) END AS Destination_Not_Attempted_rate
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
GROUP BY sActual_Dest_ID
) AS c ON 1=1;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,4 @@
SELECT DISTINCT destination_act AS lane
FROM package_history
WHERE destination_act IS NOT NULL
ORDER BY lane ASC;

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,63 @@
################################################################
################################################################
## Version: 1.0 / Author: Dillon Uzar
##
## DESC: For use in WCS Sorting Lane Lookup & Recording
## WARN: Modifying code may cause system to function incorrectly
################################################################
################################################################
import time
#######################################################
#######################################################
#######################################################
#### Constants
#######################################################
# Logger:
LOG = system.util.logger("GL BreakCount Handler")
# For inserting data into database:
CONFIRM_INSERT_QUERY = "INSERT IGNORE INTO gl_history (gaylord_id,count) VALUES (?,?)"
#######################################################
#######################################################
#######################################################
#### Parsing Utils
#######################################################
def logTime(title, trackID, seconds):
millisec = round(seconds * 1000, 1)
if millisec > 4:
LOG.info("%s[ID=%s] took longer than expected (%sms to process)" % (title, trackID, millisec))
#######################################################
#######################################################
#######################################################
#### PLC Event Handling
#######################################################
def processBreak(gaylordID, count):
# This function handles confirm events, and logs the event in SQL
# Ensure ID is valid
if count > 0:
start_time = time.time()
# Log confirm event in SQL:
# Insert into Package History:
system.db.runPrepUpdate(CONFIRM_INSERT_QUERY, [gaylordID, count])
logTime("GL_BREAK[DB_INSERT]", gaylordID, time.time() - start_time)
def processBreakAsync(gaylordID, count):
# This function handles confirm events, and logs the event in SQL
# Ensure ID is valid
if count > 0:
def processConfirmInner():
start_time = time.time()
# Log confirm event in SQL:
# Insert into Package History:
system.db.runPrepUpdate(CONFIRM_INSERT_QUERY, [gaylordID, count])
logTime("GL_BREAK[DB_INSERT]", gaylordID, time.time() - start_time)
system.util.invokeAsynchronous(processConfirmInner)

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -0,0 +1,26 @@
WITH SORTERS AS (
SELECT
MIN(timestamp) AS start_timestamp,
MAX(timestamp) AS end_timestamp,
3600/TIMESTAMPDIFF(SECOND, :startDate, :endDate) AS pph_multiplier,
"SYSTEM" AS sorter,
SUM(IF(lane_id LIKE "UL%", count, 0)) AS inducted,
SUM(IF(lane_id LIKE "CH%", count, 0)) AS sorted
FROM pe_history
WHERE timestamp BETWEEN :startDate AND :endDate
GROUP BY "SYSTEM" /* Makes it so no row is returned if no rows are processed */
)
SELECT
start_timestamp,
end_timestamp,
sorter,
/* Counts: */
inducted AS inducted_count,
sorted AS sorted_count,
/* PPH: */
ROUND(inducted*pph_multiplier) AS inducted_pph,
ROUND(sorted*pph_multiplier) AS sorted_pph,
/* Percents: */
ROUND(inducted/inducted, 4) AS inducted_percent,
ROUND(sorted/sorted, 4) AS sorted_percent
FROM SORTERS;

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -0,0 +1,322 @@
{
"custom": {
"beacon": false,
"flashingColor": "#808080",
"solidColor": "#FF8C00",
"state": "Offline"
},
"params": {
"demoColor": false,
"tagProps": [
"System/MCM02/Beacon/NCS1_1_BCN1_A",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.beacon": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Beacon"
},
"transforms": [
{
"expression": "coalesce({value},{view.params.demoColor})",
"type": "expression"
}
],
"type": "tag"
},
"persistent": true
},
"custom.flashingColor": {
"binding": {
"config": {
"path": "view.custom.beacon"
},
"transforms": [
{
"code": "\t\n\tif value \u003d\u003d 0:\n\t\treturn \"#808080\" # Normal OFF\n\t\n\treturn self.custom.solidColor # Normal ON\n",
"type": "script"
}
],
"type": "property"
},
"persistent": true
},
"custom.solidColor": {
"binding": {
"config": {
"expression": "{view.params.tagProps[0]}"
},
"transforms": [
{
"expression": "coalesce({value}, \"S\")\r\n",
"type": "expression"
},
{
"code": "\treturn value[-1]",
"type": "script"
},
{
"fallback": "#808080",
"inputType": "scalar",
"mappings": [
{
"input": "R",
"output": "#FF0000"
},
{
"input": "G",
"output": "#47FF47"
},
{
"input": "B",
"output": "#0000FF"
},
{
"input": "A",
"output": "#FF8C00"
},
{
"input": "H",
"output": "#FFFFFF"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "expr"
},
"persistent": true
},
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/State"
},
"transforms": [
{
"expression": "coalesce({value},-1)",
"type": "expression"
},
{
"fallback": "Offline",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "OFF"
},
{
"input": 1,
"output": "SOLID"
},
{
"input": 2,
"output": "FLASHING"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"params.demoColor": {
"paramDirection": "input",
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 20,
"width": 20
}
},
"root": {
"children": [
{
"meta": {
"name": "BCN"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.flashingColor"
},
"type": "property"
}
},
"props.elements[1].text": {
"binding": {
"config": {
"path": "view.params.tagProps[0]"
},
"transforms": [
{
"code": "\treturn value[-1]",
"type": "script"
}
],
"type": "property"
}
}
},
"props": {
"elements": [
{
"fill": {},
"height": "47.417244",
"id": "beaconSquare",
"name": "beaconSquare",
"stroke": {
"paint": "#000000",
"width": "2.36887"
},
"type": "rect",
"width": "47.337795",
"x": "1.450278",
"y": "1.3708278"
},
{
"fill": {
"paint": "#000"
},
"fontSize": "29.5834px",
"id": "beaconLabel",
"name": "beaconLabel",
"stroke": {
"width": "1.64352"
},
"style": {
"classes": "",
"fontSize": "30px",
"textAnchor": "middle"
},
"type": "text",
"x": 26.11241,
"y": 35.09856
}
],
"viewBox": "0 0 50 50"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\t#create tags lists for the device\n\tsystem.perspective.closeDock(\"Docked-East-Conv\")\n\tprops \u003d self.view.params.tagProps\n\ttags_table_dataset \u003d autStand.devices.getAllTags(self, props[0])\n\tsystem.perspective.openDock(\u0027Docked-East-Device\u0027,params\u003d{\u0027tagProps\u0027:props, \"tags\":tags_table_dataset, \"name\":\"\"} )"
},
"preventDefault": true,
"scope": "G",
"stopPropagation": true,
"type": "script"
},
"onMouseEnter": {
"config": {
"draggable": false,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"position": {
"relativeLocation": "top-right"
},
"positionType": "relative",
"resizable": false,
"showCloseIcon": false,
"type": "open",
"viewParams": {
"text": "{/root.meta.tooltip.text}"
},
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
},
"onMouseLeave": {
"config": {
"draggable": true,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"resizable": true,
"showCloseIcon": true,
"type": "close",
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
}
}
},
"meta": {
"name": "root",
"tooltip": {
"enabled": true
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "if(\n {view.custom.state} !\u003d \"Offline\",\n \"Source Id: \" + {view.params.tagProps[0]} + \", State: \" + {view.custom.state},\n \"Device Disconnected\"\n)\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_beacons"
},
"type": "property"
}
}
},
"props": {
"mode": "percent",
"style": {
"cursor": "pointer",
"overflow": "visible",
"userSelect": "None"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,393 @@
{
"custom": {},
"params": {
"enableTooltip": true,
"label": null,
"tagPath": "",
"tagPathControl": "",
"view": ""
},
"propConfig": {
"params.enableTooltip": {
"paramDirection": "input",
"persistent": true
},
"params.label": {
"paramDirection": "input",
"persistent": true
},
"params.tagPath": {
"paramDirection": "input",
"persistent": true
},
"params.tagPathControl": {
"paramDirection": "input",
"persistent": true
},
"params.view": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 40,
"width": 135
}
},
"root": {
"children": [
{
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tself.parent.openWindow()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Status"
},
"position": {
"height": "100%",
"width": "100%"
},
"propConfig": {
"props.style.backgroundColor": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}.jsonValues"
},
"transforms": [
{
"expression": "try(\r\n\tif(jsonGet({value}, \"Estop_Active\") \u0026\u0026 {[default]Gateway/ToggleTag},\r\n\t\t\"#F00\",\t\t// Estop\r\n\t\tif(jsonGet({value}, \"bStarted\"),\r\n\t\t\t\"#0F0\",\t// Running\r\n\t\t\t\"#AAA\"\t// Stopped\r\n\t\t)\r\n\t),\r\n\t\"#808080\" // Unknown\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"borderWidth": 1
}
},
"type": "ia.display.label"
},
{
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tself.parent.openWindow()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Text"
},
"position": {
"height": "calc(100% - 10px)",
"width": "calc(100% - 10px)",
"x": 5,
"y": 5
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Parameters.LabelFull"
},
"transforms": [
{
"expression": "coalesce({view.params.label}, {value}, \"Unknown\")",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"backgroundColor": "#FFF",
"borderColor": "#000",
"borderStyle": "solid",
"borderWidth": 1,
"fontSize": "12px",
"fontWeight": "bold",
"overflow": "hidden",
"paddingLeft": "5px",
"textOverflow": "ellipsis",
"textTransform": "uppercase",
"user-select": "none",
"whiteSpace": "nowrap"
}
},
"type": "ia.display.label"
},
{
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tself.parent.openWindow()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "TooltipOverlay"
},
"position": {
"height": "100%",
"width": "100%"
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"path": "view.params.enableTooltip"
},
"type": "property"
}
},
"props.status.tooltip": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Graphics"
},
"transforms": [
{
"expression": "if(isGood({value}),\r\n\tjsonGet({value}, \"tooltip\"),\r\n\t\"Tooltip not configured\"\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"status": {}
},
"type": "dex.display.tooltipoverlay"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\ttagPath \u003d self.view.params.tagPathControl\n\tif tagPath \u003c\u003e \"\":\n\t\ttags \u003d [tagPath + \"/SetStart\"]\n\t\tvalues \u003d [1]\n\t\tsystem.tag.writeAsync(tags, values)"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Start"
},
"position": {
"height": 25,
"width": 25,
"x": "calc(100% - 60px)",
"y": "calc(50% - 12.5px)"
},
"propConfig": {
"props.enabled": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPathControl": "{view.params.tagPathControl}"
},
"tagPath": "{tagPathControl}/SetStart"
},
"transforms": [
{
"expression": "isGood({value})",
"type": "expression"
}
],
"type": "tag"
}
},
"props.textStyle.color": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPathControl": "{view.params.tagPathControl}"
},
"tagPath": "{tagPathControl}/Alarms/bStarted"
},
"transforms": [
{
"expression": "coalesce({value}, false)",
"type": "expression"
},
{
"fallback": "#888888",
"inputType": "scalar",
"mappings": [
{
"input": true,
"output": "#32CD32"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "►",
"textStyle": {
"fontFamily": "Arial",
"fontSize": "14px"
}
},
"type": "ia.input.button"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\ttagPath \u003d self.view.params.tagPathControl\n\tif tagPath \u003c\u003e \"\":\n\t\ttags \u003d [tagPath + \"/SetStop\"]\n\t\tvalues \u003d [1]\n\t\tsystem.tag.writeAsync(tags, values)"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Stop"
},
"position": {
"height": 25,
"width": 25,
"x": "calc(100% - 32.5px)",
"y": "calc(50% - 12.5px)"
},
"propConfig": {
"props.enabled": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPathControl": "{view.params.tagPathControl}"
},
"tagPath": "{tagPathControl}/SetStop"
},
"transforms": [
{
"expression": "isGood({value})",
"type": "expression"
}
],
"type": "tag"
}
},
"props.textStyle.color": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPathControl": "{view.params.tagPathControl}"
},
"tagPath": "{tagPathControl}/Alarms/bStarted"
},
"transforms": [
{
"expression": "coalesce({value}, true)",
"type": "expression"
},
{
"fallback": "#888888",
"inputType": "scalar",
"mappings": [
{
"input": false,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "■",
"textStyle": {
"fontFamily": "monospace",
"fontSize": "14px"
}
},
"type": "ia.input.button"
}
],
"meta": {
"name": "root"
},
"props": {
"style": {
"cursor": "pointer"
}
},
"scripts": {
"customMethods": [
{
"name": "openWindow",
"params": [],
"script": "\tview \u003d self.view.params.view\n\tif view in [\"\", None]:\n\t\tview \u003d \"Windows/Graphics/\"+self.getChild(\"Text\").props.text.replace(\" \", \"_\")\n\t# Open window:\n\twindow \u003d \"Windows/GraphicsWrapper\"\n\tparams \u003d {\"view\": view}\n\tsystem.perspective.navigate(\"/\")\n\tsystem.perspective.navigate(view\u003dwindow, params\u003dparams)"
}
],
"messageHandlers": []
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,156 @@
################################################################
################################################################
## Version: 1.0 / Author: Dillon Uzar
##
## DESC: For use in FMS in recording Flow Management data
## WARN: Modifying code may cause system to function incorrectly
################################################################
################################################################
import json
import system
import time
#######################################################
#######################################################
#######################################################
#### Constants
#######################################################
# Logger:
LOG = system.util.logger("FMS Handler")
# For inserting data into database:
INSERT_QUERY = "INSERT INTO fms_history (conveyor, segment, data) VALUES (?,?,?)"
#######################################################
#######################################################
#######################################################
#### Parsing Utils
#######################################################
def extractNibble(val, nibble):
if val is not None:
return (val >> (nibble*4)) & 0x0F
def logTime(title, conv, seg, data, start_time):
millisec = round((time.time() - start_time) * 1000, 1)
LOG.info("%s[CONV=%s][SEG=%s][DATA=%s] took %sms to process" % (title, conv, seg, data, millisec))
#######################################################
#######################################################
#######################################################
#### Tag Event Handling
#######################################################
def logSegment(conveyor, segment, data):
# Log event in SQL:
# Insert into FMS History:
start_time = time.time()
INSERT_QUERY = "INSERT INTO fms_history (conveyor, segment, data) VALUES (?,?,?)"
system.db.runPrepUpdate(INSERT_QUERY, [conveyor, segment, data])
#logTime("FMS[DB_INSERT]", conveyor, segment, data, start_time)
def dintOnChange(tag, tagPath, previousValue, currentValue, initialChange, missedEvents):
# Don't execute on startup, or if new value is bad quality:
if currentValue.quality.isGood():
# Only consider it a change if the value is different:
if currentValue.value <> previousValue.value:
id = int(tagPath.split("/")[-1].replace("DINT", ""))
conveyor = tag['parameters']['LabelFull']
# ID=0 is unique where the first nibble is the average of all segments, the 7 other segments are normal segments:
if id == 0:
# Ignore first nibble, which is the average of all segments:
for i in range(1, 8):
# Check if segment changed:
curVal = extractNibble(currentValue.value, i)
prevVal = extractNibble(previousValue.value, i)
if curVal <> prevVal:
segment = i - 1
logSegment(conveyor, segment, curVal)
else:
for i in range(0, 8):
# Check if segment changed:
curVal = extractNibble(currentValue.value, i)
prevVal = extractNibble(previousValue.value, i)
if curVal <> prevVal:
segment = i + (id-1)*8 + 7
logSegment(conveyor, segment, curVal)
#######################################################
#######################################################
#######################################################
#### Graphics Tag Scripts
#######################################################
"""
radial-gradient(circle at 30%,
#f5bff5 calc((var(--conv-width) - 4px)/2*0.25),
#000 calc((var(--conv-width) - 4px)/2*0.25),
#000 calc((var(--conv-width) - 4px)/2*0.25 + 1px),
transparent calc((var(--conv-width) - 4px)/2*0.25 + 1px)),
radial-gradient(circle at 50%, #d900d9 calc((var(--conv-width) - 4px)/2*1), #000 calc((var(--conv-width) - 4px)/2*1), #000 calc((var(--conv-width) - 4px)/2*1 + 1px), transparent calc((var(--conv-width) - 4px)/2*0.25 + 1px)), radial-gradient(circle at 70%, #ec7fec 7px, #000 7px, #000 8px, transparent 8px), radial-gradient(circle at 90%, #e23fe2 10px, #000 10px, #000 11px, transparent 11px), #00D900
"""
def genSegmentsTable(obj):
segments = []
if obj is not None and obj["Count"] is not None:
for i in range(1, obj["Count"]+1):
dint = "DINT"+str(int(i/8))
if obj[dint] is not None:
percent = extractNibble(obj[dint], i % 8) / 15.0
segments.append([i, percent])
return system.dataset.toDataSet(["segment", "fill"], segments)
def genSegmentColor(data):
perc = (data/15.0)
c1 = 255 - (255 - 217)*perc
c2 = 255 - (255 - 0)*perc
return "rgb(%s, %s, %s)" % (c1, c2, c1)
def genSegmentsPattern(obj):
if obj["Count"] is not None and obj["Count"] > 0:
percUnit = 100 / float(obj["Count"])
gradients = []
for i in range(1, obj["Count"]+1):
dint = "DINT"+str(int(i/8))
if obj[dint] is not None:
data = extractNibble(obj[dint], i % 8)
color = genSegmentColor(data)
circlePos = ((obj["Count"]-i))*percUnit + percUnit/2.0
perc = (data/15.0*0.5+0.5) if data > 0 else 0.0 # Make circle size between 50%-100%
if perc > 0.0:
output = "radial-gradient(circle at %s%%" % (circlePos)
output += ", %s calc((var(--conv-width) - 8px)/2*%s)" % (color, perc)
output += ", #000 calc((var(--conv-width) - 8px)/2*%s)" % (perc)
output += ", #000 calc((var(--conv-width) - 8px)/2*%s + 1px)" % (perc)
output += ", transparent calc((var(--conv-width) - 8px)/2*%s + 1px)" % (perc)
output += ")"
gradients.append(output)
if len(gradients) > 0:
return ", ".join(gradients)+","
return ""
def genSegmentsTooltip(obj):
if obj["Count"] is not None and obj["Count"] > 0:
data = extractNibble(obj["DINT0"], 0)
output = "<br><br>SegmentAVG: %s%%" % (int(round(100 * data / 15.0)))
for i in range(1, obj["Count"]+1):
dint = "DINT"+str(int(i/8))
if obj[dint] is not None:
data = extractNibble(obj[dint], i % 8)
output += "<br>Segment%s: %s%%" % (i, int(round(100 * data / 15.0)))
return output
return ""
def genSegmentHeatmap(obj):
segments = []
if obj["Count"] is not None and obj["Count"] > 0:
for i in range(1, obj["Count"]+1):
dint = "DINT"+str(int(i/8))
if obj[dint] is not None:
data = extractNibble(obj[dint], i % 8)
color = 255 * data / 15
segments.append("rgb(255, %s, %s)" % (color, color))
return json.dumps(segments)

View File

@ -0,0 +1,36 @@
{
"base": {
"style": {
"backgroundImage": "linear-gradient(180deg, rgba(245,245,245,1) 0%, rgba(235,235,235,1) 70%, rgba(208,208,208,1) 100%);",
"borderColor": "#555",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#000",
"textTransform": "uppercase"
}
},
"variants": [
{
"pseudo": "hover",
"style": {
"backgroundImage": "linear-gradient(0deg, rgba(245,245,245,1) 0%, rgba(235,235,235,1) 70%, rgba(208,208,208,1) 100%);",
"borderColor": "#000",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#000",
"cursor": "pointer"
}
},
{
"pseudo": "disabled",
"style": {
"backgroundImage": "linear-gradient(180deg, rgba(208,208,208,1) 0%, rgba(208,208,208,1) 100%);",
"borderColor": "#555",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#555555",
"cursor": "not-allowed"
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View File

@ -0,0 +1,7 @@
{
"base": {
"style": {
"color": "#FF0000"
}
}
}

View File

@ -0,0 +1,76 @@
{
"custom": {},
"params": {},
"props": {
"defaultSize": {
"height": 24,
"width": 24
}
},
"root": {
"children": [
{
"meta": {
"name": "troubleshoot_white_24dp"
},
"position": {
"height": 1,
"width": 1
},
"props": {
"elements": [
{
"elements": [
{
"fill": {
"paint": "transparent"
},
"height": "24",
"name": "rect",
"type": "rect",
"width": "24"
}
],
"name": "group",
"type": "group"
},
{
"elements": [
{
"elements": [
{
"d": "M22,20.59l-4.69-4.69C18.37,14.55,19,12.85,19,11c0-4.42-3.58-8-8-8c-4.08,0-7.44,3.05-7.93,7h2.02C5.57,7.17,8.03,5,11,5 c3.31,0,6,2.69,6,6s-2.69,6-6,6c-2.42,0-4.5-1.44-5.45-3.5H3.4C4.45,16.69,7.46,19,11,19c1.85,0,3.55-0.63,4.9-1.69L20.59,22 L22,20.59z",
"name": "path",
"type": "path"
},
{
"name": "polygon",
"points": "8.43,9.69 9.65,15 11.29,15 12.55,11.22 13.5,13.5 15.5,13.5 15.5,12 14.5,12 13.25,9 11.71,9 10.59,12.37 9.35,7 7.7,7 6.45,11 1,11 1,12.5 7.55,12.5",
"type": "polygon"
}
],
"name": "group",
"type": "group"
}
],
"name": "group",
"type": "group"
}
],
"fill": {
"paint": "#FFFFFF"
},
"viewBox": "0 0 24 24"
},
"type": "ia.shapes.svg"
}
],
"meta": {
"name": "root"
},
"props": {
"mode": "percent"
},
"type": "ia.container.coord"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -0,0 +1,10 @@
{
"base": {
"style": {
"paddingBottom": "5px",
"paddingLeft": "5px",
"paddingRight": "5px",
"paddingTop": "5px"
}
}
}

View File

@ -0,0 +1,290 @@
{
"custom": {},
"params": {
"meta": {
"name": "VFD"
},
"props": {
"config": {
"enableHighlight": true,
"isClickable": false
},
"status": {
"color": {
"left": "#B3B3B3",
"right": "#D3D3D3"
},
"showAlways": true,
"tagPath": "[default]MCP03/RO02/RO02_03/VFD",
"tooltip": ""
}
}
},
"propConfig": {
"params.meta": {
"paramDirection": "input",
"persistent": true
},
"params.meta.name": {
"paramDirection": "input",
"persistent": true
},
"params.props": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 105,
"width": 500
}
},
"root": {
"children": [
{
"meta": {
"name": "VFD"
},
"position": {
"height": 64,
"width": 64,
"x": 67.5,
"y": 17.5
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Graphics"
},
"transforms": [
{
"expression": "try(\r\n\tjsonSet({value}, \"showAlways\", true),\r\n\t{view.params.props.status}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"config": {
"enableHighlight": false,
"isClickable": false
}
},
"type": "dex.display.vfd"
},
{
"meta": {
"name": "Label_15"
},
"position": {
"height": 25,
"width": 75,
"x": 195,
"y": 40
},
"props": {
"style": {
"fontSize": "20px",
"fontWeight": "bold",
"textAlign": "right"
},
"text": "Status:"
},
"type": "ia.display.label"
},
{
"meta": {
"name": "lbStatus"
},
"position": {
"height": 25,
"width": "calc(100% - 300px)",
"x": 280,
"y": 40
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Graphics"
},
"transforms": [
{
"code": "\treturn utils.extractStatus(value)",
"type": "script"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"fontSize": "14px",
"fontWeight": "bold",
"overflow": "hidden",
"textAlign": "center",
"textOverview": "ellipsis",
"whiteSpace": "nowrap"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Label_1"
},
"position": {
"height": 25,
"width": 75,
"x": 195,
"y": 5
},
"props": {
"style": {
"fontSize": "20px",
"fontWeight": "bold",
"textAlign": "right"
},
"text": "Name: "
},
"type": "ia.display.label"
},
{
"meta": {
"name": "lbName"
},
"position": {
"height": 25,
"width": "calc(100% - 300px)",
"x": 280,
"y": 5
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Parameters.LabelFull"
},
"transforms": [
{
"expression": "coalesce({value}, \u0027\u0027)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"fontSize": "14px",
"fontWeight": "bold",
"overflow": "hidden",
"textAlign": "center",
"textOverview": "ellipsis",
"whiteSpace": "nowrap"
}
},
"type": "ia.display.label"
},
{
"meta": {
"name": "Label_12"
},
"position": {
"height": 25,
"width": 75,
"x": 195,
"y": 75
},
"props": {
"style": {
"fontSize": "20px",
"fontWeight": "bold",
"textAlign": "right"
},
"text": "Panel:"
},
"type": "ia.display.label"
},
{
"meta": {
"name": "lbStatus_0"
},
"position": {
"height": 25,
"width": "calc(100% - 300px)",
"x": 280,
"y": 75
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.props.status.tagPath}"
},
"tagPath": "{tagPath}/Parameters.OPC_Server"
},
"transforms": [
{
"expression": "coalesce({value}, \"Unknown\")",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"fontSize": "14px",
"fontWeight": "bold",
"overflow": "hidden",
"textAlign": "center",
"textOverview": "ellipsis",
"whiteSpace": "nowrap"
}
},
"type": "ia.display.label"
}
],
"meta": {
"name": "root"
},
"props": {
"style": {
"background-color": "#CFCFCF"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,44 @@
WITH SCANNERS AS (
SELECT
DATE_FORMAT(MIN(s04_timestamp), "%Y-%m-%d %H:00") AS start_timestamp,
CONCAT("H",
CAST(
TIMESTAMPDIFF(
HOUR,
DATE_FORMAT(MIN(s04_timestamp), "%Y-%m-%d %H:00:00"),
DATE_FORMAT(LEAST(CURRENT_TIMESTAMP(), :endDate), "%Y-%m-%d %H:00:00")
) AS CHAR
)
) AS hour,
COUNT(*) AS total,
SUM(scanner_status NOT IN ("No Read", "No Code", "Multi Label")) AS good_read,
SUM(scanner_status = "No Read") AS no_read,
SUM(scanner_status = "No Code") AS no_code,
SUM(scanner_status = "Multi Label") AS multi_label
FROM package_history
WHERE s04_timestamp BETWEEN :startDate AND :endDate
AND scanner=:scanner
GROUP BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:00")
)
SELECT
start_timestamp,
hour,
/* Counts: */
total AS total_count,
good_read AS good_read_count,
no_read AS no_read_count,
no_code AS no_code_count,
multi_label AS multi_label_count,
/* PPH: */
total AS total_pph,
good_read AS good_read_pph,
no_read AS no_read_pph,
no_code AS no_code_pph,
multi_label AS multi_label_pph,
/* Percents: */
ROUND(total/total, 4) AS total_percent,
ROUND(good_read/total, 4) AS good_read_percent,
ROUND(no_read/total, 4) AS no_read_percent,
ROUND(no_code/total, 4) AS no_code_percent,
ROUND(multi_label/total, 4) AS multi_label_percent
FROM SCANNERS;

View File

@ -0,0 +1,84 @@
{
"custom": {},
"params": {},
"props": {
"defaultSize": {
"height": 498,
"width": 599
}
},
"root": {
"children": [
{
"meta": {
"name": "Runout"
},
"position": {
"height": 408,
"width": 563,
"x": -62,
"y": -9
},
"props": {
"path": "Windows/Graphics/Templates/Runout",
"style": {
"classes": "painted-events"
}
},
"type": "ia.display.view"
},
{
"meta": {
"name": "NavButton_HSS_Sorter"
},
"position": {
"height": 40,
"width": 95,
"x": 278.5,
"y": 67
},
"props": {
"params": {
"enableTooltip": true,
"label": null,
"tagPath": "[default]HSSSorterStatus",
"view": ""
},
"path": "Templates/Buttons/NavButton",
"style": {
"transform": "scale(2)"
}
},
"type": "ia.display.view"
},
{
"meta": {
"name": "NavButton_OXD_Sorter"
},
"position": {
"height": 40,
"width": 97,
"x": 78.5,
"y": 247
},
"props": {
"params": {
"enableTooltip": true,
"label": null,
"tagPath": "[default]OXDSorterStatus",
"view": ""
},
"path": "Templates/Buttons/NavButton",
"style": {
"transform": "scale(2)"
}
},
"type": "ia.display.view"
}
],
"meta": {
"name": "root"
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,36 @@
{
"base": {
"style": {
"backgroundImage": "linear-gradient(180deg, rgba(245,245,245,1) 0%, rgba(235,235,235,1) 70%, rgba(208,208,208,1) 100%);",
"borderColor": "#555",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#000",
"textTransform": "uppercase"
}
},
"variants": [
{
"pseudo": "hover",
"style": {
"backgroundImage": "linear-gradient(0deg, rgba(245,245,245,1) 0%, rgba(235,235,235,1) 70%, rgba(208,208,208,1) 100%);",
"borderColor": "#000",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#000",
"cursor": "pointer"
}
},
{
"pseudo": "disabled",
"style": {
"backgroundImage": "linear-gradient(180deg, rgba(208,208,208,1) 0%, rgba(208,208,208,1) 100%);",
"borderColor": "#555",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#555555",
"cursor": "not-allowed"
}
}
]
}

View File

@ -0,0 +1,16 @@
{
"base": {
"style": {
"backgroundColor": "#B42222B3",
"borderColor": "#000000",
"borderStyle": "solid",
"borderWidth": "0.5px",
"color": "#FFFFFF",
"fontFamily": "Arial",
"fontSize": "14px",
"fontWeight": "bold",
"lineHeight": "20px",
"textAlign": "center"
}
}
}

View File

@ -0,0 +1,97 @@
SELECT
CASE
WHEN COALESCE(c.sLocation_ID, '') LIKE 'S03%' THEN 'S03'
ELSE 'S03'
END AS Sorter,
DATE_FORMAT(:starttime, '%Y-%m-%d %H:%i') AS start_time,
DATE_FORMAT(:endtime, '%Y-%m-%d %H:%i') AS end_time,
COALESCE(NULLIF(c.sLocation_ID, ''), 'N/A') AS sLocation_ID,
COALESCE(c.Success, 0) AS success_count,
COALESCE(c.Unknown, 0) AS unknown_count,
COALESCE(c.Unexpected_Container, 0) AS unexpected_container_count,
COALESCE(c.Tracking_Error, 0) AS tracking_error_count,
COALESCE(c.Gap_Error, 0) AS gap_error_count,
COALESCE(c.Destination_Full, 0) AS destination_full_count,
COALESCE(c.Destination_Non_Operational, 0) AS destination_non_operational_count,
COALESCE(c.Invalid_Destination, 0) AS invalid_destination_count,
COALESCE(c.Scanner_Error, 0) AS scan_error_count,
COALESCE(c.Destination_Disabled, 0) AS destination_disabled_count,
COALESCE(c.Throughput_Limit, 0) AS throughput_limit_count,
COALESCE(c.Failed_To_Divert, 0) AS failed_to_divert_count,
COALESCE(c.No_Destination_Received, 0) AS no_destination_received_count,
COALESCE(c.Lost_Container, 0) AS lost_container_count,
COALESCE(c.Dimension_Error, 0) AS dimension_error_count,
COALESCE(c.Weight_Error, 0) AS weight_error_count,
COALESCE(c.Container_Utilization, 0) AS container_utilization_count,
COALESCE(c.Unable_To_Divert, 0) AS unable_to_divert_count,
COALESCE(c.Destination_Not_Attempted, 0) AS destination_not_attempted_count,
COALESCE(c.total, 0) AS total
FROM
(SELECT 1) AS p
LEFT JOIN (
SELECT
sLocation_ID,
SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) AS Success,
SUM(CASE WHEN adiSort_Code_0 = 1 THEN 1 ELSE 0 END) AS Unknown,
SUM(CASE WHEN adiSort_Code_0 = 2 THEN 1 ELSE 0 END) AS Unexpected_Container,
SUM(CASE WHEN adiSort_Code_0 = 3 THEN 1 ELSE 0 END) AS Tracking_Error,
SUM(CASE WHEN adiSort_Code_0 = 4 THEN 1 ELSE 0 END) AS Gap_Error,
SUM(CASE WHEN adiSort_Code_0 = 5 THEN 1 ELSE 0 END) AS Destination_Full,
SUM(CASE WHEN adiSort_Code_0 = 6 THEN 1 ELSE 0 END) AS Destination_Non_Operational,
SUM(CASE WHEN adiSort_Code_0 = 7 THEN 1 ELSE 0 END) AS Invalid_Destination,
SUM(CASE WHEN adiSort_Code_0 IN (8, 9, 10) THEN 1 ELSE 0 END) AS Scanner_Error,
SUM(CASE WHEN adiSort_Code_0 = 12 THEN 1 ELSE 0 END) AS Destination_Disabled,
SUM(CASE WHEN adiSort_Code_0 = 13 THEN 1 ELSE 0 END) AS Throughput_Limit,
SUM(CASE WHEN adiSort_Code_0 = 14 THEN 1 ELSE 0 END) AS Failed_To_Divert,
SUM(CASE WHEN adiSort_Code_0 = 16 THEN 1 ELSE 0 END) AS No_Destination_Received,
SUM(CASE WHEN adiSort_Code_0 = 17 THEN 1 ELSE 0 END) AS Lost_Container,
SUM(CASE WHEN adiSort_Code_0 = 18 THEN 1 ELSE 0 END) AS Dimension_Error,
SUM(CASE WHEN adiSort_Code_0 = 19 THEN 1 ELSE 0 END) AS Weight_Error,
SUM(CASE WHEN adiSort_Code_0 = 20 THEN 1 ELSE 0 END) AS Container_Utilization,
SUM(CASE WHEN adiSort_Code_0 = 21 THEN 1 ELSE 0 END) AS Unable_To_Divert,
SUM(CASE WHEN adiSort_Code_0 = 22 THEN 1 ELSE 0 END) AS Destination_Not_Attempted,
COUNT(*) AS total
FROM
item_data
WHERE
t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID IS NOT NULL
AND sLocation_ID != ''
GROUP BY
sLocation_ID
) AS c ON 1=1
WHERE c.sLocation_ID IS NOT NULL
UNION ALL
SELECT
'S03' AS Sorter,
DATE_FORMAT(:starttime, '%Y-%m-%d %H:%i') AS start_time,
DATE_FORMAT(:endtime, '%Y-%m-%d %H:%i') AS end_time,
'N/A' AS sLocation_ID,
0 AS success_count,
0 AS unknown_count,
0 AS unexpected_container_count,
0 AS tracking_error_count,
0 AS gap_error_count,
0 AS destination_full_count,
0 AS destination_non_operational_count,
0 AS invalid_destination_count,
0 AS scan_error_count,
0 AS destination_disabled_count,
0 AS throughput_limit_count,
0 AS failed_to_divert_count,
0 AS no_destination_received_count,
0 AS lost_container_count,
0 AS dimension_error_count,
0 AS weight_error_count,
0 AS container_utilization_count,
0 AS unable_to_divert_count,
0 AS destination_not_attempted_count,
0 AS total
WHERE NOT EXISTS (
SELECT 1 FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID IS NOT NULL
AND sLocation_ID != ''
);

View File

@ -0,0 +1,23 @@
WITH GAYLORDS AS (
SELECT
MIN(timestamp) AS start_timestamp,
MAX(timestamp) AS end_timestamp,
3600/TIMESTAMPDIFF(SECOND, :startDate, :endDate) AS pph_multiplier,
gaylord_id AS gaylord,
SUM(count) AS total
FROM gl_history
WHERE timestamp BETWEEN :startDate AND :endDate
GROUP BY gaylord_id
ORDER BY gaylord_id
)
SELECT
start_timestamp,
end_timestamp,
gaylord,
/* Counts: */
total AS total_count,
/* PPH: */
ROUND(total*pph_multiplier) AS total_pph,
/* Percents: */
ROUND(total/total, 4) AS total_percent
FROM GAYLORDS;

View File

@ -0,0 +1,415 @@
{
"custom": {},
"params": {
"alwaysShowAll": false,
"chuteNum": "",
"isClickable": true,
"mirror": false,
"tagPath": "MCP05/PS01/PS01_28CH"
},
"propConfig": {
"params.alwaysShowAll": {
"paramDirection": "input",
"persistent": true
},
"params.chuteNum": {
"paramDirection": "input",
"persistent": true
},
"params.isClickable": {
"paramDirection": "input",
"persistent": true
},
"params.mirror": {
"paramDirection": "input",
"persistent": true
},
"params.tagPath": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 92,
"width": 94
},
"loading": {
"mode": "blocking"
}
},
"root": {
"children": [
{
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tself.parent.openPopup()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Conveyor"
},
"position": {
"height": 48,
"rotate": {
"anchor": "0 0",
"angle": 90
},
"width": 89,
"x": 69,
"y": 1
},
"propConfig": {
"props.config.isClickable": {
"binding": {
"config": {
"expression": "!{view.params.isClickable}"
},
"type": "expr"
}
},
"props.config.showLabel": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Conv/Parameters.LabelFull"
},
"overlayOptOut": true,
"type": "tag"
}
},
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Conv/Graphics"
},
"overlayOptOut": true,
"type": "tag"
}
},
"props.style.transform": {
"binding": {
"config": {
"path": "view.params.mirror"
},
"transforms": [
{
"fallback": null,
"inputType": "scalar",
"mappings": [
{
"input": true,
"output": "scale(1, -1) translateY(-100%)"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"config": {
"type": "chute"
}
},
"type": "dex.display.conveyor"
},
{
"meta": {
"name": "BCN1_BLU"
},
"position": {
"height": 16,
"width": 16,
"y": 3
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/BCN1/BLU/Graphics"
},
"overlayOptOut": true,
"transforms": [
{
"expression": "if({view.params.alwaysShowAll},\r\n\tjsonSet({value}, \"showAlways\", {view.params.alwaysShowAll}),\r\n\t{value}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
},
"props.style.transform": {
"binding": {
"config": {
"path": "parent.props.style.transform"
},
"type": "property"
}
}
},
"type": "dex.display.beacon"
},
{
"meta": {
"name": "BCN1_AMB"
},
"position": {
"height": 16,
"width": 16,
"y": 18
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/BCN1/AMB/Graphics"
},
"overlayOptOut": true,
"transforms": [
{
"expression": "if({view.params.alwaysShowAll},\r\n\tjsonSet({value}, \"showAlways\", {view.params.alwaysShowAll}),\r\n\t{value}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
},
"props.style.transform": {
"binding": {
"config": {
"path": "parent.props.style.transform"
},
"type": "property"
}
}
},
"type": "dex.display.beacon"
},
{
"meta": {
"name": "BCN1_GRN"
},
"position": {
"height": 16,
"width": 16,
"y": 33
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/BCN1/GRN/Graphics"
},
"overlayOptOut": true,
"transforms": [
{
"expression": "if({view.params.alwaysShowAll},\r\n\tjsonSet({value}, \"showAlways\", {view.params.alwaysShowAll}),\r\n\t{value}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
},
"props.style.transform": {
"binding": {
"config": {
"path": "parent.props.style.transform"
},
"type": "property"
}
}
},
"type": "dex.display.beacon"
},
{
"meta": {
"name": "Half_PE"
},
"position": {
"height": 10,
"rotate": {
"angle": 180
},
"width": 62,
"x": 17,
"y": 74
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Half_PE/Graphics"
},
"overlayOptOut": true,
"transforms": [
{
"expression": "if({view.params.alwaysShowAll},\r\n\tjsonSet({value}, \"showAlways\", {view.params.alwaysShowAll}),\r\n\t{value}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"type": "dex.display.photoeye"
},
{
"meta": {
"name": "Jam_PE"
},
"position": {
"height": 10,
"rotate": {
"angle": 180
},
"width": 62,
"x": 17,
"y": 6
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Jam_PE/Graphics"
},
"overlayOptOut": true,
"transforms": [
{
"expression": "if({view.params.alwaysShowAll},\r\n\tjsonSet({value}, \"showAlways\", {view.params.alwaysShowAll}),\r\n\t{value}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"type": "dex.display.photoeye"
},
{
"meta": {
"name": "Full_PE"
},
"position": {
"height": 10,
"rotate": {
"angle": 180
},
"width": 62,
"x": 17,
"y": 36
},
"propConfig": {
"props.status": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Full_PE/Graphics"
},
"overlayOptOut": true,
"transforms": [
{
"expression": "if({view.params.alwaysShowAll},\r\n\tjsonSet({value}, \"showAlways\", {view.params.alwaysShowAll}),\r\n\t{value}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"type": "dex.display.photoeye"
}
],
"meta": {
"name": "root"
},
"propConfig": {
"props.style.transform": {
"binding": {
"config": {
"path": "view.params.mirror"
},
"transforms": [
{
"fallback": null,
"inputType": "scalar",
"mappings": [
{
"input": true,
"output": "scale(-1, 1)"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"style": {
"overflow": "hidden"
}
},
"scripts": {
"customMethods": [
{
"name": "openPopup",
"params": [],
"script": "\tif self.view.params.isClickable:\n\t\tid \u003d \"DivChute|\" + self.view.params.tagPath\n\t\ttitle \u003d utils.prettyName(self.view.params.tagPath.split(\"/\")[-1])\n\t\tparams \u003d { \n\t\t\t\"deviceType\": \"divchute\",\n\t\t\t\"props\": { \n\t\t\t\t\"config\": {\n\t\t\t\t\t\"alwaysShowAll\": self.view.params.alwaysShowAll,\n\t\t\t\t\t\"isClickable\": self.view.params.isClickable,\n\t\t\t\t\t#\"rotate\": self.view.params.rotate,\n\t\t\t\t\t\"mirror\": self.view.params.mirror\n\t\t\t\t},\n\t\t\t\t\"status\": {\n\t\t\t\t\t\"tagPath\": self.view.params.tagPath\n\t\t\t\t}\n\t\t \t},\n\t\t \t\"tabs\": [\"Controls\", \"Alarm History\", \"Devices\"]\t\t\n\t\t}\n\t\tsystem.perspective.openPopup(id, \"Popups/DeviceWrapper\", params, title, resizable \u003d True)"
}
],
"extensionFunctions": null,
"messageHandlers": []
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,43 @@
WITH SORTERS AS (
SELECT
DATE_FORMAT(MIN(s04_timestamp), "%Y-%m-%d %H:%i:00") AS time,
COUNT(*) AS total,
/* PPH Data */
SUM(sort_code="Success") AS success,
SUM(sort_code IN ("Dest Invalid", "Dest None", "Underutilized")) AS awcs,
SUM(sort_code IN ("Dest Disabled", "Dest Full", "Dim Error", "Unexpected", "Weight Err")) AS operational,
SUM(sort_code IN ("Dest Fault", "Div Fail", "Gap Err", "Lost", "Rate High", "Track Err", "Unknown", "Unsafe")) AS machine,
SUM(sort_code IN ("No Read", "No Code", "Multi Label")) AS scanner,
/* Problem Solve Data */
SUM(sort_code="No Read") AS no_read,
SUM(sort_code="No Code") AS no_code,
SUM(sort_code="Multi Label") AS multi_label,
/* Sorter Error Data */
SUM(sort_code="Gap Err") AS gap_err,
SUM(sort_code="Div Fail") AS div_fail,
SUM(sort_code="Dest None") AS dest_none,
SUM(sort_code="Lost") AS lost
FROM package_history
WHERE s04_timestamp BETWEEN :startDate AND :endDate
AND sorter = :sorter
GROUP BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00")
ORDER BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00")
), DATA AS (
SELECT
total,
/* PPH: */
ROUND((SUM((total - machine - scanner)*60) OVER w)/(:movAvgMin+1)) AS total_pph,
/* Problem Solve Percents: */
no_read+no_code+multi_label AS scanner,
/* Sorter Error Percents: */
gap_err+div_fail+dest_none+lost AS sorter
FROM SORTERS
WINDOW w AS (ORDER BY STR_TO_DATE(time, "%Y-%m-%d %H:%i:00") RANGE BETWEEN INTERVAL :movAvgMin MINUTE PRECEDING AND CURRENT ROW)
)
SELECT
MAX(total_pph) AS total_pph,
/* Problem Solve Percents: */
ROUND(SUM(scanner)/SUM(total), 4) AS scanner,
/* Sorter Error Percents: */
ROUND(SUM(sorter)/SUM(total), 4) AS sorter
FROM DATA;

View File

@ -0,0 +1,20 @@
SELECT
COALESCE(c.sActual_Dest_ID, 'N/A') AS Lane,
COALESCE(c.Total_count, 0) AS Total_count,
CONCAT(COALESCE(c.DestFull_perc, 0), '%') AS DestFull_perc
FROM (SELECT 1) AS p
LEFT JOIN (
SELECT
sActual_Dest_ID,
COUNT(*) AS Total_count,
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 5 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END AS DestFull_perc
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND (sActual_Dest_ID LIKE CONCAT(:lane, '%') OR :lane IS NULL OR :lane = '')
GROUP BY sActual_Dest_ID
) AS c ON 1=1
ORDER BY c.sActual_Dest_ID;

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -0,0 +1,97 @@
/*+ MAX_EXECUTION_TIME(8000) */
-- Simple historical alarms query: get all alarms in time period
-- Filter by priority, location, and time range - that's it
SELECT
a.id AS ID,
a.eventtime AS StartTimestamp,
(SELECT MIN(clr.eventtime)
FROM alarm_events clr USE INDEX (idx_alarm_events_eventid)
WHERE clr.eventid = a.eventid
AND clr.eventtype IN (1, 2)
AND clr.id > a.id
) AS EndTimestamp,
TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(SECOND, a.eventtime,
COALESCE(
(SELECT MIN(clr.eventtime)
FROM alarm_events clr USE INDEX (idx_alarm_events_eventid)
WHERE clr.eventid = a.eventid
AND clr.eventtype IN (1, 2)
AND clr.id > a.id
),
NOW()
)
)), '%H:%i:%s') AS Duration,
CONCAT(REPLACE(a.displaypath, '_', '-'), ' ', SUBSTRING_INDEX(a.source, ':/alm:', -1)) AS Description,
CASE a.priority
WHEN 0 THEN 'Diagnostic'
WHEN 1 THEN 'Low'
WHEN 2 THEN 'Medium'
WHEN 3 THEN 'High'
WHEN 4 THEN 'Critical'
ELSE 'Unknown'
END AS Priority,
IFNULL(tag.strValue, '') AS Tag,
-- Use myLocation property directly (99.96% coverage) - MUCH faster than parsing tags!
IFNULL(loc.strValue, '') AS Location,
CASE
WHEN a.priority = 3 THEN 'Alarms-Styles/High'
WHEN a.priority = 2 THEN 'Alarms-Styles/Medium'
WHEN a.priority = 1 THEN 'Alarms-Styles/Low'
WHEN a.priority = 0 THEN 'Alarms-Styles/Diagnostic'
ELSE 'Alarms-Styles/NoAlarm'
END AS Style
FROM alarm_events a FORCE INDEX (idx_alarm_events_type_time_id)
LEFT JOIN alarm_event_data tag FORCE INDEX (idx_alarm_event_data_lookup)
ON tag.id = a.id AND tag.propname = 'myTag'
LEFT JOIN alarm_event_data loc FORCE INDEX (idx_alarm_event_data_lookup)
ON loc.id = a.id AND loc.propname = 'myLocation'
WHERE
a.eventtype = 0
AND a.displaypath NOT LIKE '%System Startup%'
AND a.source NOT LIKE '%System Startup%'
AND a.displaypath NOT LIKE '%System Shutdown%'
AND a.source NOT LIKE '%System Shutdown%'
AND a.eventtime >= :starttime
AND a.eventtime < :endtime
-- Exclude active alarms: only show alarms that have been cleared
-- Check if a later clear/ack event exists for this eventid
AND EXISTS (
SELECT 1
FROM alarm_events clr USE INDEX (idx_alarm_events_eventid)
WHERE clr.eventid = a.eventid
AND clr.eventtype IN (1, 2)
AND clr.id > a.id
LIMIT 1
)
-- Priority filter: Only evaluate priority conditions when parameter is provided
AND (
:priority IS NULL OR :priority = '' OR :priority = 0
OR (
:priority IS NOT NULL AND :priority != '' AND :priority != 0 AND (
(:priority = 3 AND a.priority = 3)
OR (:priority = 2 AND a.priority BETWEEN 2 AND 3)
OR (:priority = 1 AND a.priority BETWEEN 1 AND 3)
)
)
)
-- LOCATION FILTER
AND (
(:location = 'all'
AND (loc.strValue LIKE '%MCM01%' OR loc.strValue LIKE '%MCM02%')
)
OR (:location <> 'all'
AND loc.strValue LIKE CONCAT('%', :location, '%')
)
)
ORDER BY a.eventtime DESC;

View File

@ -0,0 +1,15 @@
SELECT
'S03' AS Sorter,
DATE_FORMAT(:starttime, '%Y-%m-%d %H:%i') AS start_time,
DATE_FORMAT(:endtime, '%Y-%m-%d %H:%i') AS end_time,
'S03' AS sInduction_Name,
COALESCE(sorter_total.total, 0) AS total
FROM (SELECT 1) AS p
LEFT JOIN (
SELECT
COUNT(*) AS total
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID LIKE 'S03%'
) AS sorter_total ON 1=1;

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,130 @@
################################################################
################################################################
## Version: 1.0 / Author: Dillon Uzar
##
## DESC: For use in WCS Sorting Lane Lookup & Recording
## WARN: Modifying code may cause system to function incorrectly
################################################################
################################################################
from __future__ import with_statement
import csv
import os
import random
import re
import string
import system
import time
from os import path
#######################################################
#######################################################
#######################################################
#### Constants
#######################################################
# Logger:
LOG = system.util.logger("WCS Sorting Handler")
# Defaults for function arguments:
PROGRAM_PATH = ""
CARTON_PATH = "WCS_Package"
DEFAULT_DEVICE = "MCP20"
DEFAULT_OPC_SERVER = "Ignition OPC UA Server"
# Configuration variables:
MAX_CARTONS = 100 # Max possible carton IDs
MAX_BARCODE_SIZE = 82 # Max possible size of full barcode
# For extracting PLC info:
PACKAGE_DATA = [
#["Induct_ID", "induct"], # The induct the package was inducted from
#["Scanner_ID", "scanner"], # The scanner the package was scanned from
#["Sorter_ID", "sorter"], # The sorter the package was sorted from
["BCR_Img_ID", "bcr_imgid"], # Barcode reader, sequence ID
["BCR_Seq_ID", "bcr_seqid"], # Barcode reader, image ID
["Length", "pkg_length"], # Package length in units of 1/10". Only populated if available, use 0 if not
["Width", "pkg_width"], # Package width in units of 1/10". Only populated if available, use 0 if not
["Height", "pkg_height"], # Package height in units of 1/10". Only populated if available, use 0 if not
["Carriers", "carriers"], # Num of carriers (trays/shoes) on sorter that the package is occupying. Only populated if available, use 0 if not
["Gap_Leading", "gap_leading"], # Leading edge gap distance in units of 1/10". Only populated if available, use 0 if not. If value exceeds INT size, cap it to the max INT value
["Gap_Trailing", "gap_trailing"], # Trailing edge gap distance in units of 1/10". Only populated if available, use 0 if not. If value exceeds INT size, cap it to the max INT value
["S01_Barcode", "s01_barcode"], # The barcode sent in the S01 message
["S02_Req_Dest_ID", "s02_req_dest"], # The requested destination ID sent in the S02 message
["S02_Alt_Dest_ID", "s02_alt_dest"], # The alternate destination ID sent in the S02 message
["S04_PLC_ID", "s04_plc_id"], # Internal PLC number used to track packages and cross reference to the Host ID
["S04_Host_ID", "s04_host_id"], # The PLC record number sent in the S04 message, (1 - 9999)
["S04_Req_Dest_ID", "s04_req_dest"], # The requested destination ID sent in the S04 message
["S04_Act_Dest_ID", "s04_act_dest"], # The actual destination ID sent in the S04 message
["S04_Sort_Code", "s04_sort_code"], # The reason code sent in the S04 message
["Req_Dest_Reason", "req_dest_reason"], # See Destination Reason Bit-Map sheet
["Alt_Dest_Reason", "alt_dest_reason"] # See Destination Reason Bit-Map sheet
]
TIMESTAMP_DATA = [
["S01_Timestamp_H", "s01_timestamp"], # The timestamp sent in the S01 message, Upper 32-bits, UTS in microseconds
["S01_Timestamp_L", "s01_timestamp"], # The timestamp sent in the S01 message, Lower 32-bits, UTS in microseconds
["S02_Timestamp_H", "s02_timestamp"], # The timestamp sent in the S02 message, Upper 32-bits, UTS in microseconds
["S02_Timestamp_L", "s02_timestamp"], # The timestamp sent in the S02 message, Lower 32-bits, UTS in microseconds
["S04_Timestamp_H", "s04_timestamp"], # The timestamp sent in the S04 message, Upper 32-bits, UTS in microseconds
["S04_Timestamp_L", "s04_timestamp"] # The timestamp sent in the S04 message, Lower 32-bits, UTS in microseconds
]
# Generate array of paths to read:
PACKAGE_PATHS = [v[0] for v in PACKAGE_DATA]
TIMESTAMP_PATHS = [v[0] for v in TIMESTAMP_DATA]
DATA_PATHS = PACKAGE_PATHS + TIMESTAMP_PATHS
# For inserting data into database:
PACKAGE_COLS = [v[1] for v in PACKAGE_DATA]
PACKAGE_VALS = ["?"]*len(PACKAGE_COLS)
TIMESTAMP_COLS = [TIMESTAMP_DATA[i][1] for i in range(len(TIMESTAMP_DATA)) if TIMESTAMP_DATA[i][1] in (v[1] for v in TIMESTAMP_DATA[:i])]
TIMESTAMP_VALS = ["FROM_UNIXTIME(((?&(POWER(2, 32)-1))*POWER(2, 32)+(?&(POWER(2, 32)-1)))/1000000)"]*len(TIMESTAMP_COLS)
UNIQUE_COLS = ["trackid", "induct", "scanner", "sorter"] + PACKAGE_COLS + TIMESTAMP_COLS
UNIQUE_VALS = ["?"]*4 + PACKAGE_VALS + TIMESTAMP_VALS
CONFIRM_INSERT_QUERY = "INSERT IGNORE INTO package_history (" + ",".join(UNIQUE_COLS) + ") VALUES (" + ",".join(UNIQUE_VALS) + ")"
#######################################################
#######################################################
#######################################################
#### Parsing Utils
#######################################################
def isNoRead(field):
return field.replace("?","") == ""
def isMultiRead(field):
return field.replace("#","") == ""
def isBadRead(field):
return (field == None or isNoRead(field) or isMultiRead(field))
def logTime(title, trackID, seconds):
millisec = round(seconds * 1000, 1)
LOG.info("%s[ID=%s] took %sms to process" % (title, trackID, millisec))
#######################################################
#######################################################
#######################################################
#### PLC Event Handling
#######################################################
def processConfirmAsync(trackID, induct, scanner, sorter, program=PROGRAM_PATH, carton=CARTON_PATH, device=DEFAULT_DEVICE, opcServer=DEFAULT_OPC_SERVER):
# This function handles confirm events, and logs the event in SQL
# Ensure ID is valid
if trackID > 0 and trackID < MAX_CARTONS:
def processConfirmInner():
start_time = time.time()
# Setup carton location:
devicePrefix = "[" + device + "]" + program
cartonPrefix = devicePrefix + carton + "[" + str(trackID) + "]"
# Read all carton data directly:
tags = [cartonPrefix + "." + path for path in DATA_PATHS]
values = [trackID, induct, scanner, sorter] + [value.value for value in system.opc.readValues(opcServer, tags)]
logTime("Confirm[PLC_READ]", trackID, time.time() - start_time)
start_time = time.time()
# Log confirm event in SQL:
# Insert into Package History:
system.db.runPrepUpdate(CONFIRM_INSERT_QUERY, values)
logTime("Confirm[DB_INSERT]", trackID, time.time() - start_time)
system.util.invokeAsynchronous(processConfirmInner)

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,24 @@
WITH LANES AS (
SELECT
MIN(timestamp) AS start_timestamp,
MAX(timestamp) AS end_timestamp,
3600/TIMESTAMPDIFF(SECOND, :startDate, :endDate) AS pph_multiplier,
lane_id AS induct,
SUM(count) AS total
FROM pe_history FORCE INDEX (timestamp)
WHERE timestamp BETWEEN :startDate AND :endDate
AND (lane_id LIKE "UL%" OR lane_id LIKE "PRS%" OR lane_id LIKE "RE%")
GROUP BY lane_id
ORDER BY lane_id
)
SELECT
start_timestamp,
end_timestamp,
induct,
/* Counts: */
total AS total_count,
/* PPH: */
ROUND(total*pph_multiplier) AS total_pph,
/* Percents: */
ROUND(total/total, 4) AS total_percent
FROM LANES;

View File

@ -0,0 +1,575 @@
{
"custom": {
"color": "#C2C2C2",
"priority": "No Active Alarms",
"state": "Closed"
},
"params": {
"demoColor": -1,
"tagProps": [
"System/MCM02/Scanner/S03",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.color": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Color"
},
"transforms": [
{
"expression": "if(\r\n {view.params.demoColor} \u003e\u003d 0,\r\n {view.params.demoColor},\r\n coalesce({value}, 0)\r\n)\r\n",
"type": "expression"
},
{
"fallback": "#000000",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#C2C2C2"
},
{
"input": 1,
"output": "#FF0000"
},
{
"input": 2,
"output": "#FFA500"
},
{
"input": 3,
"output": "#0008FF"
},
{
"input": 4,
"output": "#00FF00"
},
{
"input": 5,
"output": "#FFF700"
},
{
"input": 6,
"output": "#87CEEB"
},
{
"input": 7,
"output": "#90EE90"
},
{
"input": 8,
"output": "#964B00"
},
{
"input": 9,
"output": "#FFFFFF"
},
{
"input": 10,
"output": "#000000"
},
{
"input": 11,
"output": "#8B0000"
},
{
"input": 12,
"output": "#808080"
},
{
"input": 13,
"output": "#8B8000"
},
{
"input": 14,
"output": "#006400"
},
{
"input": 15,
"output": "#FFFFC5"
},
{
"input": 16,
"output": "#00008B"
},
{
"input": 17,
"output": "#FF7276"
},
{
"input": 18,
"output": "#556B2F"
},
{
"input": 19,
"output": "#B43434"
},
{
"input": 20,
"output": "#4682B4"
},
{
"input": 21,
"output": "#FFD700"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.priority": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Priority"
},
"transforms": [
{
"expression": "coalesce({value},{view.params.forceFaultStatus},0)",
"type": "expression"
},
{
"fallback": null,
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "No Active Alarms"
},
{
"input": 1,
"output": "High"
},
{
"input": 2,
"output": "Medium"
},
{
"input": 3,
"output": "Low"
},
{
"input": 4,
"output": "Diagnostic"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/State"
},
"transforms": [
{
"expression": "coalesce({value},{view.params.forceFaultStatus},0)",
"type": "expression"
},
{
"fallback": "Unknown",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "Closed"
},
{
"input": 1,
"output": "Actuated"
},
{
"input": 2,
"output": "Communication Faulted"
},
{
"input": 3,
"output": "Conveyor Running In Maintenance Mode"
},
{
"input": 4,
"output": "Disabled"
},
{
"input": 5,
"output": "Disconnected"
},
{
"input": 6,
"output": "Stopped"
},
{
"input": 7,
"output": "Enabled Not Running"
},
{
"input": 8,
"output": "Encoder Fault"
},
{
"input": 9,
"output": "Energy Management"
},
{
"input": 10,
"output": "ESTOP Was Actuated"
},
{
"input": 11,
"output": "EStopped"
},
{
"input": 12,
"output": "EStopped Locally"
},
{
"input": 13,
"output": "Extended Faulted"
},
{
"input": 14,
"output": "Full"
},
{
"input": 15,
"output": "Gaylord Start Pressed"
},
{
"input": 16,
"output": "Jam Fault"
},
{
"input": 17,
"output": "Jammed"
},
{
"input": 18,
"output": "Loading Allowed"
},
{
"input": 19,
"output": "Loading Not Allowed"
},
{
"input": 20,
"output": "Low Air Pressure Fault Was Present"
},
{
"input": 21,
"output": "Maintenance Mode"
},
{
"input": 22,
"output": "Conveyor Stopped In Maintenance Mode"
},
{
"input": 23,
"output": "Motor Faulted"
},
{
"input": 24,
"output": "Motor Was Faulted"
},
{
"input": 25,
"output": "Normal"
},
{
"input": 26,
"output": "Off Inactive"
},
{
"input": 27,
"output": "Open"
},
{
"input": 28,
"output": "PLC Ready To Run"
},
{
"input": 29,
"output": "Package Release Pressed"
},
{
"input": 30,
"output": "Power Branch Was Faulted"
},
{
"input": 31,
"output": "Pressed"
},
{
"input": 32,
"output": "Ready To Receive"
},
{
"input": 33,
"output": "Running"
},
{
"input": 34,
"output": "Started"
},
{
"input": 35,
"output": "Stopped"
},
{
"input": 36,
"output": "System Started"
},
{
"input": 37,
"output": "Unknown"
},
{
"input": 38,
"output": "VFD Fault"
},
{
"input": 39,
"output": "Conveyor Running In Power Saving Mode"
},
{
"input": 40,
"output": "Conveyor Jogging In Maintenance Mode"
},
{
"input": 41,
"output": "VFD Reset Required"
},
{
"input": 42,
"output": "Jam Reset Push Button Pressed"
},
{
"input": 43,
"output": "Start Push Button Pressed"
},
{
"input": 44,
"output": "Stop Push Button Pressed"
},
{
"input": 45,
"output": "No Container"
},
{
"input": 46,
"output": "Ready To Be Enabled"
},
{
"input": 47,
"output": "Half Full"
},
{
"input": 48,
"output": "Enabled"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"params.demoColor": {
"paramDirection": "input",
"persistent": true
},
"params.tagProps": {
"paramDirection": "inout",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 47,
"width": 68
}
},
"root": {
"children": [
{
"meta": {
"name": "scanner"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[3].fill.paint": {
"binding": {
"config": {
"path": "view.custom.color"
},
"type": "property"
}
}
},
"props": {
"elements": [
{
"id": "defs3",
"name": "defs3",
"type": "defs"
},
{
"d": "M 12.414439,21.622269 A 10,10 0 0 1 3.6989343,16.637386 10,10 0 0 1 3.7050549,6.5970154 10,10 0 0 1 12.426631,1.6227621",
"fill": {
"paint": "transparent"
},
"id": "circle2",
"name": "circle2",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "path"
},
{
"d": "m 12.613908,2.4818261 c 6.942674,2.0834521 13.885347,6.0484566 20.828021,9.0726849 -6.945981,3.064219 -13.756047,6.450542 -20.837943,9.220277 l 0.0095,1.573493 C 20.634274,19.516759 28.443167,15.021636 36.358007,11.377844 28.442954,7.8932966 21.08348,3.5675692 12.628474,0.8929519 Z",
"fill": {
"opacity": "1",
"paint": "#000000"
},
"id": "path1",
"name": "path1",
"stroke": {
"paint": "#000000",
"width": "0.4"
},
"type": "path"
},
{
"d": "M 12.389032,20.647726 C 6.9023213,20.490828 3.0753636,16.369847 3.0567874,11.653611 3.038211,6.9373755 6.5424269,3.1052388 12.194672,2.492415 m 0.189184,18.176827 -0.200534,-18.1942153 3.376452,1.1997941 4.395729,1.769738 13.626819,6.0452262 -15.195971,6.684943 z",
"fill": {
"opacity": "1"
},
"id": "path3",
"name": "path3",
"stroke": {
"paint": "#000000",
"width": "0"
},
"type": "path"
}
],
"viewBox": "0 0 38 24"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\t#create tags lists for the device\n\tprops \u003d self.view.params.tagProps\n\ttags_table_dataset \u003d autStand.devices.getAllTags(self, props[0])\n\tsystem.perspective.openDock(\u0027Docked-East-Device\u0027,params\u003d{\u0027tagProps\u0027:props, \"tags\":tags_table_dataset, \"name\":\"\"} )"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "root",
"tooltip": {
"enabled": true,
"location": "top-left",
"style": {}
}
},
"propConfig": {
"meta.tooltip.style.classes": {
"binding": {
"config": {
"expression": "{view.custom.priority}"
},
"transforms": [
{
"fallback": "Alarms-Styles/NoAlarm",
"inputType": "scalar",
"mappings": [
{
"input": "High",
"output": "Alarms-Styles/High"
},
{
"input": "Medium",
"output": "Alarms-Styles/Medium"
},
{
"input": "Low",
"output": "Alarms-Styles/Low"
},
{
"input": "Diagnostic",
"output": "Alarms-Styles/Diagnostic"
}
],
"outputType": "style-list",
"type": "map"
}
],
"type": "expr"
}
},
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "if(\n {view.custom.state} !\u003d \"Closed\",\n \"Source Id: \" + {view.params.tagProps[0]} + \", Priority: \" + {view.custom.priority} + \", State: \" + {view.custom.state},\n \"Device Disconnected\"\n)\n"
},
"type": "expr"
}
}
},
"props": {
"aspectRatio": "68:47",
"mode": "percent",
"style": {
"cursor": "pointer",
"overflow": "hidden"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,22 @@
SELECT
COALESCE(c.sActual_Dest_ID, 'N/A') AS Lane,
COALESCE(c.Total_rate, 0) AS Total_rate,
COALESCE(c.DestFull_rate, 0) AS DestFull_rate
FROM (SELECT 1) AS p
LEFT JOIN (
SELECT
sActual_Dest_ID,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(COUNT(*) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS Total_rate,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 5 THEN 1 ELSE 0 END) * 3600.0 / TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS DestFull_rate
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND (sActual_Dest_ID LIKE CONCAT(:lane, '%') OR :lane IS NULL OR :lane = '')
GROUP BY sActual_Dest_ID
) AS c ON 1=1
ORDER BY c.sActual_Dest_ID;

View File

@ -0,0 +1,60 @@
SELECT
'S03' AS Sorter,
DATE_FORMAT(:starttime, '%Y-%m-%d %H:%i') AS start_time,
DATE_FORMAT(:endtime, '%Y-%m-%d %H:%i') AS end_time,
'S03aa' AS sScanner_Name,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(COALESCE(sorter_total.total_bad_reads, 0) * 3600.0
/ TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS total_bad_reads,
0 AS total_comm_faults,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(COALESCE(sorter_total.total_good_reads, 0) * 3600.0
/ TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS total_good_reads,
0 AS total_multi_items,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(COALESCE(sorter_total.total_multi_reads, 0) * 3600.0
/ TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS total_multi_reads,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(COALESCE(sorter_total.total_no_data, 0) * 3600.0
/ TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS total_no_data,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(COALESCE(sorter_total.total_no_reads, 0) * 3600.0
/ TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS total_no_reads,
CASE
WHEN TIMESTAMPDIFF(SECOND, :starttime, :endtime) = 0 THEN 0
ELSE ROUND(COALESCE(sorter_total.total, 0) * 3600.0
/ TIMESTAMPDIFF(SECOND, :starttime, :endtime), 2)
END AS total
FROM (SELECT 1) AS p
LEFT JOIN (
SELECT
SUM(CASE WHEN adiSort_Code_0 NOT IN (0, 8, 9, 10, 11, 15) THEN 1 ELSE 0 END) AS total_bad_reads,
SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) AS total_good_reads,
SUM(CASE WHEN adiSort_Code_0 = 10 THEN 1 ELSE 0 END) AS total_multi_reads,
SUM(CASE WHEN adiSort_Code_0 = 9 THEN 1 ELSE 0 END) AS total_no_data,
SUM(CASE WHEN adiSort_Code_0 = 8 THEN 1 ELSE 0 END) AS total_no_reads,
COUNT(*) AS total
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID LIKE 'S03%'
) AS sorter_total ON 1 = 1;

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 B

View File

@ -0,0 +1,395 @@
{
"custom": {
"hasControls": null,
"isRunning": false
},
"params": {
"label": "System",
"tagPath": "[default]SystemStatus",
"tagPaths": [],
"view": "Windows/Graphics/Overview"
},
"propConfig": {
"custom.hasControls": {
"binding": {
"config": {
"expression": "// Force refresh:\r\nif(now(1000)\u003dnow(1000),\r\n\t{view.params.tagPaths},\r\n\t{view.params.tagPaths}\r\n)"
},
"transforms": [
{
"code": "\ttags \u003d [tagPath + \"/SetStart.Quality\" for tagPath in value] + [tagPath + \"/SetStop.Quality\" for tagPath in value]\n\tqualities \u003d [v.getQuality() for v in system.tag.readBlocking(tags)]\n\tqualities \u003d [v \u003d\u003d v.Good for v in qualities]\n\treturn any(qualities) and len(qualities) \u003e 0",
"type": "script"
}
],
"type": "expr"
},
"persistent": true
},
"custom.isRunning": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/bStarted"
},
"type": "tag"
},
"persistent": true
},
"params.label": {
"paramDirection": "input",
"persistent": true
},
"params.tagPath": {
"paramDirection": "input",
"persistent": true
},
"params.tagPaths": {
"paramDirection": "input",
"persistent": true
},
"params.tagPaths[0]": {
"paramDirection": "input",
"persistent": true
},
"params.tagPaths[1]": {
"paramDirection": "input",
"persistent": true
},
"params.tagPaths[2]": {
"paramDirection": "input",
"persistent": true
},
"params.tagPaths[3]": {
"paramDirection": "input",
"persistent": true
},
"params.view": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 40,
"width": 125
}
},
"root": {
"children": [
{
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tself.parent.openWindow()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Status"
},
"position": {
"height": "100%",
"width": "100%"
},
"propConfig": {
"props.style.backgroundColor": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}.jsonValues"
},
"transforms": [
{
"expression": "try(\r\n\tif(jsonGet({value}, \"Estop_Active\") \u0026\u0026 {[default]Gateway/ToggleTag},\r\n\t\t\"#F00\",\t\t// Estop\r\n\t\tif(jsonGet({value}, \"bStarted\"),\r\n\t\t\t\"#0F0\",\t// Running\r\n\t\t\t\"#AAA\"\t// Stopped\r\n\t\t)\r\n\t),\r\n\t\"#808080\" // Unknown\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"borderColor": "#000",
"borderStyle": "solid",
"borderWidth": 1
}
},
"type": "ia.display.label"
},
{
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tself.parent.openWindow()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Text"
},
"position": {
"height": "calc(100% - 10px)",
"width": "calc(100% - 10px)",
"x": 5,
"y": 5
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Parameters.LabelFull"
},
"transforms": [
{
"expression": "if({view.params.label} \u003d None || {view.params.label} \u003d \"\",\r\n\t{value},\r\n\t{view.params.label}\r\n)",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"style": {
"backgroundColor": "#FFF",
"borderColor": "#000",
"borderStyle": "solid",
"borderWidth": 1,
"fontFamily": "var(--font-NotoSans)",
"fontSize": "12px",
"fontWeight": "bold",
"paddingLeft": "5px",
"textTransform": "uppercase",
"user-select": "none"
}
},
"type": "ia.display.label"
},
{
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tself.parent.openWindow()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "TooltipOverlay"
},
"position": {
"height": "100%",
"width": "100%"
},
"propConfig": {
"props.status.tooltip": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"tagPath": "{view.params.tagPath}"
},
"tagPath": "{tagPath}/Graphics"
},
"transforms": [
{
"expression": "//\"System\u003cbr\u003eStatus: \"+if({view.custom.hasControls}, if({view.custom.isRunning}, \"Running\", \"Stopped\"), \"Unknown\")\r\njsonGet({value}, \"tooltip\")",
"type": "expression"
}
],
"type": "tag"
}
}
},
"props": {
"status": {}
},
"type": "dex.display.tooltipoverlay"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\ttagPaths \u003d self.view.params.tagPaths\n\tif len(tagPaths) \u003e 0:\n\t\ttags \u003d [tagPath + \"/SetStart\" for tagPath in tagPaths]\n\t\tvalues \u003d [1]*len(tagPaths)\n\t\tsystem.tag.writeAsync(tags, values)"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Start"
},
"position": {
"height": 25,
"width": 25,
"x": "calc(100% - 60px)",
"y": "calc(50% - 12.5px)"
},
"propConfig": {
"props.enabled": {
"binding": {
"config": {
"path": "view.custom.hasControls"
},
"type": "property"
}
},
"props.textStyle.color": {
"binding": {
"config": {
"path": "view.custom.isRunning"
},
"transforms": [
{
"expression": "if(isGood({value}), {value}, \"\")",
"type": "expression"
},
{
"fallback": "#888888",
"inputType": "scalar",
"mappings": [
{
"input": true,
"output": "#32CD32"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "►",
"textStyle": {
"fontFamily": "Arial",
"fontSize": "14px"
}
},
"type": "ia.input.button"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\ttagPaths \u003d self.view.params.tagPaths\n\tif len(tagPaths) \u003e 0:\n\t\ttags \u003d [tagPath + \"/SetStop\" for tagPath in tagPaths]\n\t\tvalues \u003d [1]*len(tagPaths)\n\t\tsystem.tag.writeAsync(tags, values)"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Stop"
},
"position": {
"height": 25,
"width": 25,
"x": "calc(100% - 32.5px)",
"y": "calc(50% - 12.5px)"
},
"propConfig": {
"props.enabled": {
"binding": {
"config": {
"path": "view.custom.hasControls"
},
"type": "property"
}
},
"props.textStyle.color": {
"binding": {
"config": {
"path": "view.custom.isRunning"
},
"transforms": [
{
"expression": "if(isGood({value}), {value}, \"\")",
"type": "expression"
},
{
"fallback": "#888888",
"inputType": "scalar",
"mappings": [
{
"input": false,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "■",
"textStyle": {
"fontFamily": "monospace",
"fontSize": "14px"
}
},
"type": "ia.input.button"
}
],
"meta": {
"name": "root"
},
"props": {
"style": {
"cursor": "pointer"
}
},
"scripts": {
"customMethods": [
{
"name": "openWindow",
"params": [],
"script": "\tview \u003d self.view.params.view\n\tif view in [\"\", None]:\n\t\tview \u003d \"Windows/Graphics/\"+self.getChild(\"Text\").props.text.replace(\" \", \"_\")\n\t# Open window:\n\twindow \u003d \"Windows/GraphicsWrapper\"\n\tparams \u003d {\"view\": view}\n\tsystem.perspective.navigate(\"/\")\n\tsystem.perspective.navigate(view\u003dwindow, params\u003dparams)"
}
],
"extensionFunctions": null,
"messageHandlers": []
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,58 @@
SELECT
roundtime AS `Round Time`,
sActual_Dest_ID AS `Lane`,
COALESCE(Success_rate, 0) AS `Success Rate`,
COALESCE(Unknown_rate, 0) AS `Unknown Rate`,
COALESCE(Unexpected_Container_rate, 0) AS `Unexpected Container Rate`,
COALESCE(Tracking_Error_rate, 0) AS `Tracking Error Rate`,
COALESCE(Gap_Error_rate, 0) AS `Gap Error Rate`,
COALESCE(Destination_Full_rate, 0) AS `Destination Full Rate`,
COALESCE(Destination_Non_Operational_rate, 0) AS `Destination Non Operational Rate`,
COALESCE(Invalid_Destination_rate, 0) AS `Invalid Destination Rate`,
COALESCE(Scanner_Error_rate, 0) AS `Scanner Error Rate`,
COALESCE(Destination_Disabled_rate, 0) AS `Destination Disabled Rate`,
COALESCE(Throughput_Limit_rate, 0) AS `Throughput Limit Rate`,
COALESCE(Failed_To_Divert_rate, 0) AS `Failed To Divert Rate`,
COALESCE(No_Destination_Received_rate, 0) AS `No Destination Received Rate`,
COALESCE(Lost_Container_rate, 0) AS `Lost Container Rate`,
COALESCE(Dimension_Error_rate, 0) AS `Dimension Error Rate`,
COALESCE(Weight_Error_rate, 0) AS `Weight Error Rate`,
COALESCE(Container_Utilization_rate, 0) AS `Container Utilization Rate`,
COALESCE(Unable_To_Divert_rate, 0) AS `Unable To Divert Rate`,
COALESCE(Destination_Not_Attempted_rate, 0) AS `Destination Not Attempted Rate`
FROM (
SELECT
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(t_stamp) /
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) *
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) AS roundtime,
sActual_Dest_ID,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Success_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 1 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Unknown_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 2 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Unexpected_Container_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 3 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Tracking_Error_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 4 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Gap_Error_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 5 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Destination_Full_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 6 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Destination_Non_Operational_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 7 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Invalid_Destination_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 IN (8, 9, 10) THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Scanner_Error_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 12 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Destination_Disabled_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 13 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Throughput_Limit_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 14 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Failed_To_Divert_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 16 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS No_Destination_Received_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 17 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Lost_Container_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 18 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Dimension_Error_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 19 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Weight_Error_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 20 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Container_Utilization_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 21 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Unable_To_Divert_rate,
CASE WHEN CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0) = 0 THEN 0 ELSE ROUND(SUM(CASE WHEN adiSort_Code_0 = 22 THEN 1 ELSE 0 END) * 3600.0 / CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0), 2) END AS Destination_Not_Attempted_rate
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND (COALESCE(:Lane, '') = '' OR sActual_Dest_ID = :Lane)
GROUP BY roundtime, sActual_Dest_ID
ORDER BY roundtime ASC
) basa;

View File

@ -0,0 +1,9 @@
{
"base": {
"style": {
"fontFamily": "Arial",
"fontSize": "10px",
"textAlign": "center"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,685 @@
{
"custom": {
"title": ""
},
"params": {},
"permissions": {
"securityLevels": [],
"type": "AllOf"
},
"propConfig": {
"custom.title": {
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 400,
"width": 1600
}
},
"root": {
"children": [
{
"children": [
{
"meta": {
"name": "Table"
},
"position": {
"height": "100%",
"width": "100%"
},
"props": {
"cells": {
"style": {
"borderBottomColor": "#D5D5D5",
"borderBottomStyle": "solid",
"borderBottomWidth": "1px",
"borderRightColor": "#D5D5D5",
"borderRightStyle": "solid",
"borderRightWidth": "1px",
"color": "#000",
"fontFamily": "Helvetica",
"fontSize": "14px"
}
},
"columns": [
{
"align": "center",
"boolean": "checkbox",
"dateFormat": "MM/DD/YYYY",
"editable": false,
"field": "eventtime",
"footer": {
"align": "center",
"justify": "left",
"style": {
"classes": ""
},
"title": ""
},
"header": {
"align": "center",
"justify": "left",
"style": {
"classes": ""
},
"title": ""
},
"justify": "auto",
"number": "value",
"numberFormat": "0,0.##",
"progressBar": {
"bar": {
"color": "#62A3F6",
"linecap": "round",
"width": 5
},
"max": 100,
"track": {
"color": "#DADADA",
"linecap": "round",
"width": 2
},
"value": {
"color": "#7D7D7D",
"show": true
}
},
"render": "auto",
"resizable": true,
"sort": "none",
"sortable": true,
"strictWidth": false,
"style": {
"classes": ""
},
"toggleSwitch": {
"color": {
"selected": "#2196F3",
"unselected": "#FFFFFF"
}
},
"viewParams": {},
"viewPath": "",
"visible": true,
"width": ""
}
],
"pager": {
"bottom": false
},
"rows": {
"highlight": {
"enabled": false
},
"striped": {
"enabled": false
},
"style": {
"classes": "table/highlight"
}
},
"style": {
"fontFamily": "Helvetica",
"fontSize": "14px",
"fontWeight": "bold"
}
},
"type": "ia.display.table"
}
],
"meta": {
"name": "Table"
},
"position": {
"height": "calc(100% - 40px)",
"width": "calc(100% - 250px)",
"x": 250,
"y": 40
},
"props": {
"style": {
"border-left": "2px solid #000",
"min-width": "450px"
}
},
"type": "ia.container.coord"
},
{
"meta": {
"name": "LabelHeader"
},
"position": {
"height": 40,
"width": "100%"
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"expression": " \"Custom Reports\"\r\n+if(len({view.custom.title})\u003e0, \" - \" + {view.custom.title}, \"\")"
},
"type": "expr"
}
}
},
"props": {
"style": {
"backgroundColor": "#1A4A5E",
"borderBottomColor": "#000000",
"borderBottomStyle": "solid",
"borderBottomWidth": "2px",
"color": "#fff",
"fontFamily": "Helvetica",
"fontSize": 20,
"fontWeight": "bold",
"textAlign": "center"
}
},
"type": "ia.display.label"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\t# Grab Data:\n\ttable \u003d self.parent.getChild(\"Table\").getChild(\"Table\")\n\tdata \u003d utils.downloadCSV(table, self.view.custom.title)"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Button_Export"
},
"position": {
"height": 30,
"width": 100,
"x": "calc(100% - 105px)",
"y": 5
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "Export"
},
"type": "ia.input.button"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\treportTree \u003d self.getSibling(\"ReportTree\")\n\treportTree.meta.visible \u003d not reportTree.meta.visible"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Button_Mode"
},
"position": {
"height": 32,
"width": 85,
"x": 4,
"y": 4
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"expression": "if({../ReportTree.meta.visible},\r\n\t\"Files\",\r\n\t\"Reports\"\r\n)"
},
"type": "expr"
},
"persistent": true
}
},
"props": {
"enabled": false,
"style": {
"classes": "Buttons/Grey"
},
"text": "Files"
},
"type": "ia.input.button"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"draggable": false,
"id": "PABE2XXI",
"modal": true,
"overlayDismiss": true,
"resizable": false,
"showCloseIcon": true,
"title": "Upload Custom Report",
"type": "open",
"viewPath": "Popups/CustomReports/ConfigUpload"
},
"scope": "C",
"type": "popup"
}
}
},
"meta": {
"name": "Button_UploadConfig",
"visible": false
},
"position": {
"height": 32,
"width": 85,
"x": 93,
"y": 4
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"expression": "{../ReportTree.meta.visible}\r\n\u0026\u0026 ({session.props.device.type} \u003d \"designer\" || isAuthorized(\r\n\tfalse,\r\n\t\u0027Authenticated/Roles/Administrator\u0027,\r\n\t\u0027Authenticated/Roles/Developer\u0027\r\n))"
},
"type": "expr"
},
"persistent": true
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "Upload"
},
"type": "ia.input.button"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\t# Get filenames:\n\ttree \u003d self.getSibling(\u0027ReportTree\u0027)\n\tfilenames \u003d [sel.value for sel in tree.props.selectionData]\n\t\n\terr \u003d reports.downloadConfigs(filenames)\n\n\t# Check if err:\n\tif err is not None:\n\t\tsystem.gui.messageBox(err, \"Error\")"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Button_DownloadConfig",
"visible": false
},
"position": {
"height": 32,
"width": 95,
"x": 182,
"y": 4
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"expression": "{../ReportTree.meta.visible}\r\n\u0026\u0026 ({session.props.device.type} \u003d \"designer\" || isAuthorized(\r\n\tfalse,\r\n\t\u0027Authenticated/Roles/Administrator\u0027,\r\n\t\u0027Authenticated/Roles/Developer\u0027\r\n))"
},
"type": "expr"
},
"persistent": true
},
"props.enabled": {
"binding": {
"config": {
"path": "../ReportTree.props.selection"
},
"transforms": [
{
"code": "\treturn len(value)\u003e0",
"type": "script"
}
],
"type": "property"
}
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "Download"
},
"type": "ia.input.button"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"draggable": false,
"id": "5QyUoYBU",
"modal": true,
"overlayDismiss": true,
"resizable": false,
"showCloseIcon": true,
"title": "Delete Confirmation",
"type": "open",
"viewParams": {
"filenames": "{/root/ReportTree.props.selectionData}"
},
"viewPath": "Popups/CustomReports/DeleteConfirmation"
},
"scope": "C",
"type": "popup"
}
}
},
"meta": {
"name": "Button_DeleteConfig",
"visible": false
},
"position": {
"height": 32,
"width": 85,
"x": 281,
"y": 4
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"expression": "{../ReportTree.meta.visible}\r\n\u0026\u0026 ({session.props.device.type} \u003d \"designer\" || isAuthorized(\r\n\tfalse,\r\n\t\u0027Authenticated/Roles/Administrator\u0027,\r\n\t\u0027Authenticated/Roles/Developer\u0027\r\n))"
},
"type": "expr"
},
"persistent": true
},
"props.enabled": {
"binding": {
"config": {
"path": "../ReportTree.props.selection"
},
"transforms": [
{
"code": "\treturn len(value)\u003e0",
"type": "script"
}
],
"type": "property"
}
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "Delete"
},
"type": "ia.input.button"
},
{
"meta": {
"name": "FileTree",
"visible": false
},
"position": {
"height": "calc(100% - 97px)",
"width": 250,
"y": 65
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"expression": "!{../ReportTree.meta.visible}"
},
"type": "expr"
},
"persistent": true
}
},
"props": {
"appearance": {
"defaultNodeIcons": {
"collapsed": {
"color": "#5F707E",
"path": "material/folder"
},
"empty": {
"color": "#869DB1",
"path": "material/stop"
},
"expanded": {
"color": "#5F707E",
"path": "material/folder_open"
}
},
"expandIcons": {
"collapsed": {
"color": "#869DB1",
"path": "material/arrow_right"
},
"empty": {
"color": "#869DB1"
},
"expanded": {
"color": "#869DB1",
"path": "material/arrow_drop_down"
}
},
"selectedStyle": {
"backgroundColor": "#BBE0F6",
"color": "#000",
"cursor": "pointer"
},
"unselectedStyle": {
"classes": "Tree/hoverUnselected",
"cursor": "pointer"
}
}
},
"type": "ia.display.tree"
},
{
"events": {
"component": {
"onActionPerformed": {
"config": {
"script": "\tsystem.perspective.print(self.getSibling(\"FileTree\").props.selection)"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "Button_DownloadFiles",
"visible": false
},
"position": {
"height": 32,
"y": "calc(100% - 32px)"
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"path": "../FileTree.meta.visible"
},
"type": "property"
},
"persistent": true
},
"position.width": {
"binding": {
"config": {
"path": "../FileTree.position.width"
},
"type": "property"
}
},
"props.enabled": {
"binding": {
"config": {
"path": "../FileTree.props.selection"
},
"transforms": [
{
"code": "\treturn len(value)\u003e0",
"type": "script"
}
],
"type": "property"
}
}
},
"props": {
"style": {
"classes": "Buttons/Grey"
},
"text": "Download Selected"
},
"type": "ia.input.button"
},
{
"events": {
"dom": {
"onDoubleClick": {
"config": {
"script": "\tdata \u003d self.props.selectionData\n\tif len(data) \u003d\u003d 1:\n\t\tconfig \u003d data[0].value\n\t\tresults \u003d reports.readTable(config)\n\t\t# Return data table:\n\t\tif \u0027err\u0027 in results:\n\t\t\tsystem.gui.messageBox(results[\u0027err\u0027], \"Error\")\n\t\telse:\n\t\t\ttable \u003d self.getSibling(\"Table\").getChild(\"Table\")\n\t\t\ttable.props.data \u003d results[\u0027data\u0027]\n\t\t\ttable.props.columns \u003d results[\u0027columns\u0027]\n\t\t\tself.view.custom.title \u003d \".\".join(config.split(\".\")[:-1])"
},
"scope": "G",
"type": "script"
}
},
"system": {
"onStartup": {
"config": {
"script": "\tself.refreshList()"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "ReportTree"
},
"position": {
"height": "calc(100% - 65px)",
"width": 250,
"y": 65
},
"props": {
"appearance": {
"defaultNodeIcons": {
"collapsed": {
"color": "#5F707E",
"path": "material/folder"
},
"empty": {
"color": "#869DB1",
"path": "material/stop"
},
"expanded": {
"color": "#5F707E",
"path": "material/folder_open"
}
},
"expandIcons": {
"collapsed": {
"color": "#869DB1",
"path": "material/arrow_right"
},
"empty": {
"color": "#869DB1"
},
"expanded": {
"color": "#869DB1",
"path": "material/arrow_drop_down"
}
},
"selectedStyle": {
"backgroundColor": "#BBE0F6",
"color": "#000",
"cursor": "pointer",
"user-select": "none"
},
"unselectedStyle": {
"classes": "Tree/hoverUnselected",
"cursor": "pointer",
"user-select": "none"
}
}
},
"scripts": {
"customMethods": [
{
"name": "refreshList",
"params": [],
"script": "\ticons \u003d {\n\t\t\"csv\": {\n\t\t\t\"path\": \"material/table_chart\",\n\t\t\t\"color\": \"#869DB1\"\n\t\t},\n\t\t\"sql\": {\n\t\t\t\"path\": \"material/storage\",\n\t\t\t\"color\": \"#869DB1\"\n\t\t}\n\t}\n\t\n\tconfigs \u003d []\n\troles \u003d self.session.props.auth.user.roles\n\tfor config in reports.getConfigs(roles\u003droles):\n\t\tparts \u003d config.split(\".\")\n\t\tconfigs.append({\n\t\t\t\"label\": \".\".join(parts[:-1]),\n\t\t\t\"expanded\": False,\n\t\t\t\"icon\": icons.get(parts[-1], \"\"),\n\t\t\t\"data\": config,\n\t\t\t\"items\": []\n\t\t})\n\t\n\tself.props.items \u003d configs"
}
],
"messageHandlers": [
{
"messageType": "custom-reports-refreshlist",
"pageScope": true,
"script": "\tself.refreshList()",
"sessionScope": false,
"viewScope": false
}
]
},
"type": "ia.display.tree"
},
{
"meta": {
"name": "LabelTree"
},
"position": {
"height": 25,
"width": 250,
"y": 40
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"expression": "if({../ReportTree.meta.visible},\r\n\t\"On-Demand Reports\",\r\n\t\"Pre-Run Reports\"\r\n)"
},
"type": "expr"
},
"persistent": true
}
},
"props": {
"style": {
"backgroundColor": "#808080",
"borderBottomColor": "#000",
"borderBottomStyle": "solid",
"borderBottomWidth": 2,
"color": "#FFF",
"fontSize": "16px",
"fontWeight": "bold",
"textAlign": "center",
"user-select": "none"
},
"text": "On-Demand Reports"
},
"type": "ia.display.label"
}
],
"meta": {
"name": "root"
},
"props": {
"style": {
"min-width": "1000px"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,63 @@
SELECT
roundtime AS `Round Time`,
sScanner_Name AS `Scanner Name`,
COALESCE(total_bad_reads, 0) AS `Total Bad Reads`,
COALESCE(total_comm_faults, 0) AS `Total Comm Faults`,
COALESCE(total_good_reads, 0) AS `Total Good Reads`,
COALESCE(total_multi_items, 0) AS `Total Multi Items`,
COALESCE(total_multi_reads, 0) AS `Total Multi Reads`,
COALESCE(total_no_data, 0) AS `Total No Data`,
COALESCE(total_no_reads, 0) AS `Total No Reads`,
COALESCE(total_bad_reads, 0) +
COALESCE(total_comm_faults, 0) +
COALESCE(total_good_reads, 0) +
COALESCE(total_multi_items, 0) +
COALESCE(total_multi_reads, 0) +
COALESCE(total_no_data, 0) +
COALESCE(total_no_reads, 0) AS `Total`
FROM (
SELECT
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(t_stamp) /
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) *
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) AS roundtime,
sScanner_Name,
SUM(diScanner_bad_reads) AS total_bad_reads,
SUM(diScanner_comm_fault) AS total_comm_faults,
SUM(diScanner_good_reads) AS total_good_reads,
SUM(diScanner_multi_items) AS total_multi_items,
SUM(diScanner_multi_reads) AS total_multi_reads,
SUM(diScanner_no_data) AS total_no_data,
SUM(diScanner_no_reads) AS total_no_reads
FROM scanner_reads
WHERE t_stamp BETWEEN :starttime AND :endtime
AND (sScanner_Name = :scannername OR :scannername IS NULL OR :scannername = '')
GROUP BY roundtime, sScanner_Name
UNION ALL
SELECT
FROM_UNIXTIME(
FLOOR(UNIX_TIMESTAMP(t_stamp) /
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) *
CEIL(TIMESTAMPDIFF(SECOND, :starttime, :endtime) / 24.0)
) AS roundtime,
'S03aa' AS sScanner_Name,
SUM(CASE WHEN adiSort_Code_0 NOT IN (0, 8, 9, 10, 11, 15) THEN 1 ELSE 0 END) AS total_bad_reads,
0 AS total_comm_faults,
SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) AS total_good_reads,
0 AS total_multi_items,
SUM(CASE WHEN adiSort_Code_0 = 10 THEN 1 ELSE 0 END) AS total_multi_reads,
SUM(CASE WHEN adiSort_Code_0 = 9 THEN 1 ELSE 0 END) AS total_no_data,
SUM(CASE WHEN adiSort_Code_0 = 8 THEN 1 ELSE 0 END) AS total_no_reads
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID LIKE 'S03%'
AND (:scannername IS NULL OR :scannername = '' OR :scannername = 'S03aa')
GROUP BY roundtime
ORDER BY roundtime ASC
) basa;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,16 @@
{
"base": {
"style": {
"backgroundColor": "#007EFCB3",
"borderColor": "#000000",
"borderStyle": "solid",
"borderWidth": "0.5px",
"color": "#000000",
"fontFamily": "Arial",
"fontSize": "14px",
"fontWeight": "bold",
"lineHeight": "20px",
"textAlign": "center"
}
}
}

View File

@ -0,0 +1,600 @@
{
"custom": {
"color": "#000000",
"priority": "No Active Alarms",
"state": "Offline"
},
"params": {
"demoColor": -1,
"tagProps": [
"System/MCM01/DPM/PS3_1_DPM1",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.color": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Color"
},
"transforms": [
{
"expression": "if(\r\n {view.params.demoColor} \u003e\u003d 0,\r\n {view.params.demoColor},\r\n coalesce({value}, -1)\r\n)\r\n",
"type": "expression"
},
{
"fallback": "#000000",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#C2C2C2"
},
{
"input": 1,
"output": "#FF0000"
},
{
"input": 2,
"output": "#FFA500"
},
{
"input": 3,
"output": "#0008FF"
},
{
"input": 4,
"output": "#00FF00"
},
{
"input": 5,
"output": "#FFF700"
},
{
"input": 6,
"output": "#87CEEB"
},
{
"input": 7,
"output": "#90EE90"
},
{
"input": 8,
"output": "#964B00"
},
{
"input": 9,
"output": "#FFFFFF"
},
{
"input": 10,
"output": "#000000"
},
{
"input": 11,
"output": "#8B0000"
},
{
"input": 12,
"output": "#808080"
},
{
"input": 13,
"output": "#8B8000"
},
{
"input": 14,
"output": "#006400"
},
{
"input": 15,
"output": "#FFFFC5"
},
{
"input": 16,
"output": "#00008B"
},
{
"input": 17,
"output": "#FF7276"
},
{
"input": 18,
"output": "#556B2F"
},
{
"input": 19,
"output": "#B43434"
},
{
"input": 20,
"output": "#4682B4"
},
{
"input": 21,
"output": "#FFD700"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.priority": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Priority"
},
"transforms": [
{
"expression": "coalesce({value},{view.params.forceFaultStatus},0)",
"type": "expression"
},
{
"fallback": null,
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "No Active Alarms"
},
{
"input": 1,
"output": "High"
},
{
"input": 2,
"output": "Medium"
},
{
"input": 3,
"output": "Low"
},
{
"input": 4,
"output": "Diagnostic"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/State"
},
"transforms": [
{
"expression": "coalesce({value},-1)",
"type": "expression"
},
{
"fallback": "Offline",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "Closed"
},
{
"input": 1,
"output": "Actuated"
},
{
"input": 2,
"output": "Communication Faulted"
},
{
"input": 3,
"output": "Conveyor Running In Maintenance Mode"
},
{
"input": 4,
"output": "Disabled"
},
{
"input": 5,
"output": "Disconnected"
},
{
"input": 6,
"output": "Stopped"
},
{
"input": 7,
"output": "Enabled Not Running"
},
{
"input": 8,
"output": "Encoder Fault"
},
{
"input": 9,
"output": "Energy Management"
},
{
"input": 10,
"output": "ESTOP Was Actuated"
},
{
"input": 11,
"output": "EStopped"
},
{
"input": 12,
"output": "EStopped Locally"
},
{
"input": 13,
"output": "Extended Faulted"
},
{
"input": 14,
"output": "Full"
},
{
"input": 15,
"output": "Gaylord Start Pressed"
},
{
"input": 16,
"output": "Jam Fault"
},
{
"input": 17,
"output": "Jammed"
},
{
"input": 18,
"output": "Loading Allowed"
},
{
"input": 19,
"output": "Loading Not Allowed"
},
{
"input": 20,
"output": "Low Air Pressure Fault Was Present"
},
{
"input": 21,
"output": "Maintenance Mode"
},
{
"input": 22,
"output": "Conveyor Stopped In Maintenance Mode"
},
{
"input": 23,
"output": "Motor Faulted"
},
{
"input": 24,
"output": "Motor Was Faulted"
},
{
"input": 25,
"output": "Normal"
},
{
"input": 26,
"output": "Off Inactive"
},
{
"input": 27,
"output": "Open"
},
{
"input": 28,
"output": "PLC Ready To Run"
},
{
"input": 29,
"output": "Package Release Pressed"
},
{
"input": 30,
"output": "Power Branch Was Faulted"
},
{
"input": 31,
"output": "Pressed"
},
{
"input": 32,
"output": "Ready To Receive"
},
{
"input": 33,
"output": "Running"
},
{
"input": 34,
"output": "Started"
},
{
"input": 35,
"output": "Stopped"
},
{
"input": 36,
"output": "System Started"
},
{
"input": 37,
"output": "Unknown"
},
{
"input": 38,
"output": "VFD Fault"
},
{
"input": 39,
"output": "Conveyor Running In Power Saving Mode"
},
{
"input": 40,
"output": "Conveyor Jogging In Maintenance Mode"
},
{
"input": 41,
"output": "VFD Reset Required"
},
{
"input": 42,
"output": "Jam Reset Push Button Pressed"
},
{
"input": 43,
"output": "Start Push Button Pressed"
},
{
"input": 44,
"output": "Stop Push Button Pressed"
},
{
"input": 45,
"output": "No Container"
},
{
"input": 46,
"output": "Ready To Be Enabled"
},
{
"input": 47,
"output": "Half Full"
},
{
"input": 48,
"output": "Enabled"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"params.demoColor": {
"paramDirection": "input",
"persistent": true
},
"params.tagProps": {
"paramDirection": "inout",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 47,
"width": 68
}
},
"root": {
"children": [
{
"meta": {
"name": "DPM"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"expression": "{view.custom.color}"
},
"type": "expr"
}
}
},
"props": {
"elements": [
{
"d": "M 0 40 L 0 0 L 61 40 Z",
"fill": {},
"name": "path",
"stroke": {
"paint": "#4c4c4c",
"width": 4
},
"transform": "rotate(-180,30.5,20)",
"type": "path"
},
{
"d": "M 0 40 L 0 0 L 61 40 Z",
"fill": {
"paint": "#4C4C4C"
},
"name": "path",
"stroke": {
"paint": "#000000",
"width": 4
},
"type": "path"
}
],
"preserveAspectRatio": "none",
"viewBox": "-0.5 -0.5 62 41"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\t#create tags lists for the device\n\tprops \u003d self.view.params.tagProps\n\ttags_table_dataset \u003d autStand.devices.getAllTags(self, props[0])\n\tsystem.perspective.openDock(\u0027Docked-East-Device\u0027,params\u003d{\u0027tagProps\u0027:props, \"tags\":tags_table_dataset, \"name\":\"\"} )"
},
"scope": "G",
"type": "script"
},
"onMouseEnter": {
"config": {
"draggable": false,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"position": {
"relativeLocation": "top-right"
},
"positionType": "relative",
"resizable": false,
"showCloseIcon": false,
"type": "open",
"viewParams": {
"text": "{/root.meta.tooltip.text}"
},
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
},
"onMouseLeave": {
"config": {
"draggable": true,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"resizable": true,
"showCloseIcon": true,
"type": "close",
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
}
}
},
"meta": {
"name": "root",
"tooltip": {
"enabled": true,
"location": "top-left",
"style": {}
}
},
"propConfig": {
"meta.tooltip.style.classes": {
"binding": {
"config": {
"expression": "{view.custom.priority}"
},
"transforms": [
{
"fallback": "Alarms-Styles/NoAlarm",
"inputType": "scalar",
"mappings": [
{
"input": "High",
"output": "Alarms-Styles/High"
},
{
"input": "Medium",
"output": "Alarms-Styles/Medium"
},
{
"input": "Low",
"output": "Alarms-Styles/Low"
},
{
"input": "Diagnostic",
"output": "Alarms-Styles/Diagnostic"
}
],
"outputType": "style-list",
"type": "map"
}
],
"type": "expr"
}
},
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "if(\n {view.custom.state} !\u003d \"Offline\",\n \"Source Id: \" + {view.params.tagProps[0]} + \", Priority: \" + {view.custom.priority} + \", State: \" + {view.custom.state},\n \"Device Disconnected\"\n)\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_dpm_mcm"
},
"type": "property"
}
}
},
"props": {
"aspectRatio": "68:47",
"mode": "percent",
"style": {
"classes": "Disconnects/Device-Connected",
"cursor": "pointer",
"overflow": "hidden"
}
},
"type": "ia.container.coord"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,18 @@
{
"base": {
"animation": {
"duration": "2.5s",
"keyframes": {
"0%": {
"boxShadow": "0 0 12px 5px rgba(88, 158, 249, 0.8)"
},
"50%": {
"boxShadow": "0 0 20px 8px rgba(88, 158, 249, 1)"
},
"100%": {
"boxShadow": "0 0 5px 2px rgba(88, 158, 249, 0.3)"
}
}
}
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View File

@ -0,0 +1,28 @@
-- Hourly Scanner Graph Query (Rate per hour)
-- Shows every hour in detail for graphing as rates (items per hour)
SELECT
CONCAT('H', TIMESTAMPDIFF(HOUR,
DATE_FORMAT(Startstamp, "%Y-%m-%d %H:00:00"),
DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00")
)) AS Hour,
ROUND(COALESCE(Total, 0) * 3600 / GREATEST(TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 1), 2) AS Total,
ROUND(COALESCE(GoodRead, 0) * 3600 / GREATEST(TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 1), 2) AS GoodRead,
ROUND(COALESCE(NoRead, 0) * 3600 / GREATEST(TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 1), 2) AS NoRead,
ROUND(COALESCE(MultiRead, 0) * 3600 / GREATEST(TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 1), 2) AS MultiRead,
ROUND(COALESCE(NoCode, 0) * 3600 / GREATEST(TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 1), 2) AS NoCode
FROM (
SELECT
MIN(t_stamp) AS Startstamp,
MAX(t_stamp) AS Endtstamp,
COUNT(*) AS Total,
SUM(DivertStatus NOT IN (8, 9, 10)) AS GoodRead,
SUM(DivertStatus = 8) AS NoRead,
SUM(DivertStatus = 10) AS MultiRead,
SUM(DivertStatus = 9) AS NoCode
FROM alltable
WHERE t_stamp BETWEEN :starttime AND :endtime
GROUP BY DATE(t_stamp), HOUR(t_stamp)
) counts
ORDER BY Startstamp ASC;

View File

@ -0,0 +1,36 @@
{
"base": {
"style": {
"backgroundImage": "linear-gradient(180deg, rgba(255,0,0,1) 0%, rgba(245,0,0,1) 70%, rgba(208,0,0,1) 100%);",
"borderColor": "#555",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#000",
"textTransform": "uppercase"
}
},
"variants": [
{
"pseudo": "hover",
"style": {
"backgroundImage": "linear-gradient(0deg, rgba(255,0,0,1) 0%, rgba(245,0,0,1) 70%, rgba(208,0,0,1) 100%);",
"borderColor": "#000",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#000",
"cursor": "pointer"
}
},
{
"pseudo": "disabled",
"style": {
"backgroundImage": "linear-gradient(180deg, rgba(208,0,0,1) 0%, rgba(208,0,0,1) 100%);",
"borderColor": "#555",
"borderStyle": "solid",
"borderWidth": "2px",
"color": "#555555",
"cursor": "not-allowed"
}
}
]
}

View File

@ -0,0 +1,13 @@
{
"base": {
"animation": {
"duration": "1s",
"keyframes": {
"0%": {
"backgroundColor": "#007EFCB3"
},
"100%": {}
}
}
}
}

View File

@ -0,0 +1,867 @@
{
"custom": {
"FilteredViews": [
{
"Path": "autStand/Equipment/Button",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/Camera",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Chute",
"Path": "autStand/Equipment/Conveyor",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/Conveyor",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Conveyor",
"Path": "autStand/Equipment/Conveyor_Left90",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Conveyor",
"Path": "autStand/Equipment/Conveyor_Right90",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/DPM",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/EPC",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/Encoder",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/MCM",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Photoeye",
"Path": "autStand/Equipment/Photoeye_Tracking",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Long Range Photoeye",
"Path": "autStand/Equipment/Photoeye_Long",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Proximity Switch",
"Path": "autStand/Equipment/ProxSensor",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Start/Stop Button",
"Path": "autStand/Equipment/SS_Button",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/IO_Block",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/Solenoid",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/VFD",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Beacon_G",
"Path": "autStand/Equipment/Beacon",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Beacon_A",
"Path": "autStand/Equipment/Beacon",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Beacon_R",
"Path": "autStand/Equipment/Beacon",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Beacon_B",
"Path": "autStand/Equipment/Beacon",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Name": "Beacon_H",
"Path": "autStand/Equipment/Beacon",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/Scanner",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
},
{
"Path": "autStand/Equipment/DPM",
"instancePosition": {},
"instanceStyle": {
"classes": ""
}
}
]
},
"events": {
"system": {
"onStartup": {
"config": {
"script": "\tproject_info \u003d system.perspective.getProjectInfo()\n\tviews \u003d project_info.get(\u0027views\u0027,[])\n\tfilter_criterion \u003d \"Symbol-Views\"\n\tfilter_criterion2 \u003d \"Symbol-Library-Views\"\n\tfilter_criterion3 \u003d \"Controller-Views\"\n\tfilter_criterion4 \u003d \"Device-Views\"\n\tfiltered_views \u003d [\n\t\tview for view in views \n\t\t\t\n\t\tif filter_criterion in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion2 in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion3 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\tand not filter_criterion4 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\t]\n\tjson_structure \u003d []\n\tfor view in filtered_views:\n\t\t\n\t\tif \u0027Test\u0027 not in view[\u0027path\u0027]:\n\t\t\tinstance \u003d {\n\t\t\t\t\"instanceStyle\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t},\n\t\t\t\t\"instancePosition\": {},\n\t\t\t\t\"Path\": view.get(\u0027path\u0027,\u0027\u0027),\n\t\t\t\t\"forceRunning\":3,\n\t\t\t\t\"forceFault\": None,\n\t\t\t\t\"has_state\":True\n\t\t\t}\n\t\t\tjson_structure.append(instance)\n\t\t\n\tjson_result \u003d system.util.jsonEncode(json_structure)\n\tself.params.Dataset \u003d filtered_views\n\tself.params.FilteredViews \u003d json_structure\n\tself.session.custom.alarm_filter.show_running \u003d True\n\tself.session.custom.alarm_filter.show_safety \u003d True\n\tself.session.custom.alarm_filter.show_diagnostic \u003d True\n\tself.session.custom.alarm_filter.show_gateways \u003d True\n\tself.session.custom.alarm_filter.show_low_alarm \u003d True\n\t"
},
"scope": "G",
"type": "script"
}
}
},
"params": {
"Dataset": [],
"FilteredViews": []
},
"propConfig": {
"custom.FilteredViews": {
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 309,
"width": 378
},
"theme": "dark"
},
"root": {
"children": [
{
"children": [
{
"meta": {
"name": "Table"
},
"propConfig": {
"props.data[11].Color.style.backgroundColor": {
"binding": {
"config": {
"path": "session.custom.colours.state5"
},
"type": "property"
}
},
"props.data[11].Color.style.color": {
"binding": {
"config": {
"expression": "if({session.custom.colours.colour_impaired}\u003d true, \u0027#000000\u0027,\u0027#FFFFFF\u0027) "
},
"type": "expr"
}
},
"props.data[12].Color.style.backgroundColor": {
"binding": {
"config": {
"path": "session.custom.colours.state4"
},
"type": "property"
}
},
"props.data[13].Color.style.backgroundColor": {
"binding": {
"config": {
"path": "session.custom.colours.state3"
},
"type": "property"
}
},
"props.data[14].Color.style.backgroundColor": {
"binding": {
"config": {
"path": "session.custom.colours.state2"
},
"type": "property"
}
},
"props.data[15].Color.style.backgroundColor": {
"binding": {
"config": {
"path": "session.custom.colours.state1"
},
"type": "property"
}
},
"props.data[1].Color.style.backgroundColor": {
"binding": {
"config": {
"path": "session.custom.colours.state0"
},
"type": "property"
}
},
"props.data[3].Color.style.backgroundColor": {
"binding": {
"config": {
"path": "session.custom.colours.state5"
},
"type": "property"
}
},
"props.data[3].Color.style.color": {
"binding": {
"config": {
"expression": "if({session.custom.colours.colour_impaired}\u003d true, \u0027#000000\u0027,\u0027#FFFFFF\u0027) "
},
"type": "expr"
}
}
},
"props": {
"cells": {
"style": {
"paddingLeft": 5
}
},
"columns": [
{
"align": "center",
"boolean": "checkbox",
"dateFormat": "MM/DD/YYYY",
"editable": false,
"field": "Color",
"filter": {
"boolean": {
"condition": ""
},
"date": {
"condition": "",
"value": ""
},
"enabled": false,
"number": {
"condition": "",
"value": ""
},
"string": {
"condition": "",
"value": ""
},
"visible": "on-hover"
},
"footer": {
"align": "center",
"justify": "left",
"style": {
"classes": ""
},
"title": ""
},
"header": {
"align": "center",
"justify": "center",
"style": {
"classes": ""
},
"title": ""
},
"justify": "auto",
"nullFormat": {
"includeNullStrings": false,
"nullFormatValue": "",
"strict": false
},
"number": "value",
"numberFormat": "0,0.##",
"progressBar": {
"bar": {
"color": "",
"style": {
"classes": ""
}
},
"max": 100,
"min": 0,
"track": {
"color": "",
"style": {
"classes": ""
}
},
"value": {
"enabled": true,
"format": "0,0.##",
"justify": "center",
"style": {
"classes": ""
}
}
},
"render": "auto",
"resizable": true,
"sort": "none",
"sortable": false,
"strictWidth": true,
"style": {
"classes": ""
},
"toggleSwitch": {
"color": {
"selected": "",
"unselected": ""
}
},
"viewParams": {},
"viewPath": "",
"visible": true,
"width": 85
},
{
"align": "center",
"boolean": "checkbox",
"dateFormat": "MM/DD/YYYY",
"editable": false,
"field": "Description",
"filter": {
"boolean": {
"condition": ""
},
"date": {
"condition": "",
"value": ""
},
"enabled": false,
"number": {
"condition": "",
"value": ""
},
"string": {
"condition": "",
"value": ""
},
"visible": "on-hover"
},
"footer": {
"align": "center",
"justify": "left",
"style": {
"classes": ""
},
"title": ""
},
"header": {
"align": "center",
"justify": "center",
"style": {
"classes": ""
},
"title": ""
},
"justify": "auto",
"nullFormat": {
"includeNullStrings": false,
"nullFormatValue": "",
"strict": false
},
"number": "value",
"numberFormat": "0,0.##",
"progressBar": {
"bar": {
"color": "",
"style": {
"classes": ""
}
},
"max": 100,
"min": 0,
"track": {
"color": "",
"style": {
"classes": ""
}
},
"value": {
"enabled": true,
"format": "0,0.##",
"justify": "center",
"style": {
"classes": ""
}
}
},
"render": "auto",
"resizable": true,
"sort": "none",
"sortable": false,
"strictWidth": false,
"style": {
"borderLeftStyle": "solid",
"borderLeftWidth": 1,
"borderRightStyle": "solid",
"borderRightWidth": 1,
"classes": ""
},
"toggleSwitch": {
"color": {
"selected": "",
"unselected": ""
}
},
"viewParams": {},
"viewPath": "",
"visible": true,
"width": 100
}
],
"data": [
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "",
"borderBottomStyle": "solid",
"borderBottomWidth": 1,
"borderLeftStyle": "hidden",
"borderRightStyle": "hidden",
"classes": "",
"font-weight": "bold"
},
"value": "State"
},
"Description": {
"align": "center",
"editable": false,
"justify": "left",
"style": {
"backgroundColor": "",
"borderBottomStyle": "solid",
"borderBottomWidth": 1,
"borderLeftStyle": "hidden",
"classes": "some-class",
"font-weight": "bold"
},
"value": "Description"
}
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"classes": "",
"color": "#000000"
},
"value": "Stopped"
},
"Description": "MHE is Stopped/Disabled\n"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "#c9fcc0",
"classes": "",
"color": "#000000"
},
"value": "Enabled"
},
"Description": "MHE is Enabled (Not Running)"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"classes": ""
},
"value": "Running"
},
"Description": "MHE is Running"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "#00ffd0",
"classes": "",
"color": "#000000"
},
"value": "Power Saving"
},
"Description": "MHE is in Power Saving Mode"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "#ff8c00",
"classes": "",
"color": "#000000"
},
"value": "Jammed"
},
"Description": "MHE is Jammed"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "#0008ff",
"classes": "",
"color": "#FFFFFF"
},
"value": "Full"
},
"Description": "MHE is Full"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "#946446",
"classes": "",
"color": "#FFFFFF"
},
"value": "Maint Mode"
},
"Description": "MHE is in Maintenance Mode"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "#B45C5C",
"classes": "",
"color": "#FFFFFF"
},
"value": "Maint Running Mode"
},
"Description": "MHE Running in Maintenance Mode"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "#ff0000",
"classes": "",
"color": "#FFFFFF"
},
"value": "Estop / Faulted\n"
},
"Description": "MHE is Estopped / Faulted\n"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"backgroundColor": "",
"borderBottomStyle": "solid",
"borderBottomWidth": 1,
"borderLeftStyle": "hidden",
"borderRightStyle": "hidden",
"borderTopStyle": "solid",
"borderTopWidth": 1,
"classes": "",
"font-weight": "bold"
},
"value": "Priority"
},
"Description": {
"align": "center",
"editable": false,
"justify": "left",
"style": {
"backgroundColor": "",
"borderBottomStyle": "solid",
"borderBottomWidth": 1,
"borderLeftStyle": "hidden",
"borderTopStyle": "solid",
"borderTopWidth": 1,
"classes": "",
"font-weight": "bold"
},
"value": "Description"
}
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"classes": ""
},
"value": "Healthy"
},
"Description": "Healthy, no active alarms"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"classes": "",
"color": "#000000"
},
"value": "Diagnostic"
},
"Description": "Diagnostic Information"
},
{
"Color": {
"align": "center",
"borderLeftColor": "white",
"justify": "left",
"style": {
"classes": "",
"color": "#000000"
},
"value": "Low"
},
"Description": "Running at reduced capacity",
"Status": "Low"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"classes": ""
},
"value": "Medium"
},
"Description": "Controlled Stop"
},
{
"Color": {
"align": "center",
"justify": "left",
"style": {
"classes": "some-class"
},
"value": "High"
},
"Description": "Uncontrolled Stop"
}
],
"dragOrderable": false,
"enableHeader": false,
"headerStyle": {
"backgroundColor": "#2B2B2B",
"color": "#FFFFFF",
"textIndent": "0px"
},
"pager": {
"bottom": false
},
"rows": {
"highlight": {
"color": "#FFFFFF",
"enabled": false
},
"style": {
"classes": "Background-Styles/Controller"
}
},
"selection": {
"enableRowSelection": false,
"style": {
"fontWeight": "bold"
}
}
},
"type": "ia.display.table"
},
{
"children": [
{
"children": [
{
"meta": {
"name": "EmbeddedView"
},
"position": {
"basis": "320px"
},
"propConfig": {
"props.params.FilteredViews": {
"binding": {
"config": {
"path": "view.custom.FilteredViews"
},
"type": "property"
}
}
},
"props": {
"path": "autStand/PopUp-Views/Legend_Popup/Legend-table"
},
"type": "ia.display.view"
}
],
"meta": {
"name": "FlexContainer_6"
},
"position": {
"basis": "800px",
"grow": 1
},
"props": {
"direction": "column"
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "FlexContainer"
},
"position": {
"tabIndex": 1
},
"props": {
"direction": "column",
"style": {
"overflow": "visible"
}
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "TabContainer"
},
"position": {
"basis": "1377px"
},
"propConfig": {
"props.currentTabIndex": {
"onChange": {
"enabled": null,
"script": "\tif currentValue.value \u003d\u003d 2:\n\t\tsystem.perspective.closePopup(\"TZyBcXB7\")\n\t\tsystem.perspective.openPopup(\n\t\t id\u003d\"DOO\", \n\t\t view\u003d\"autStand/PopUp-Views/Legend_Popup/Legend-DOO\", \n\t\t title\u003d\"Description of Operations - Amazon BNA8\",\n\t\t modal\u003dTrue,\n\t\t draggable\u003dFalse,\n\t\t resizable\u003dFalse,\n\t\t showCloseIcon\u003dTrue,\n\t\t)"
}
}
},
"props": {
"currentTabIndex": 1,
"menuStyle": {
"fontWeight": "bold"
},
"style": {
"classes": "Background-Styles/Controller"
},
"tabs": [
"Color",
"Icons",
"DOO"
]
},
"type": "ia.container.tab"
}
],
"events": {
"system": {
"onStartup": {
"config": {
"script": "\tself.getChild(\"TabContainer\").props.currentTabIndex \u003d 0"
},
"scope": "G",
"type": "script"
}
}
},
"meta": {
"name": "root"
},
"props": {
"direction": "column",
"style": {
"backgroundColor": "#3B3B3B",
"opacity": 1
}
},
"type": "ia.container.flex"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,229 @@
SELECT
COALESCE(data.roundtime, 'N/A') AS StartTimestamp,
COALESCE(CONCAT('H', TIMESTAMPDIFF(HOUR, DATE_FORMAT(data.roundtime, "%Y-%m-%d %H:00:00"), DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00"))), 'N/A') AS Hour,
COALESCE(data.sScanner_Name, 'N/A') AS sScanner_Name,
COALESCE(data.BadReads, '0%') AS BadReads,
COALESCE(data.CommFaults, '0%') AS CommFaults,
COALESCE(data.GoodReads, '0%') AS GoodReads,
COALESCE(data.MultiItems, '0%') AS MultiItems,
COALESCE(data.MultiReads, '0%') AS MultiReads,
COALESCE(data.NoData, '0%') AS NoData,
COALESCE(data.NoReads, '0%') AS NoReads,
COALESCE(data.Total, 0) AS Total
FROM (SELECT 1) AS p
LEFT JOIN (
SELECT
CONCAT(DATE(t_stamp), ' ', HOUR(t_stamp), ':00') AS roundtime,
sScanner_Name,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_bad_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS BadReads,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_comm_fault), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS CommFaults,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_good_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS GoodReads,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_multi_items), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS MultiItems,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_multi_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS MultiReads,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_no_data), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS NoData,
CONCAT(
CASE
WHEN (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
) = 0 THEN 0
ELSE ROUND((COALESCE(SUM(diScanner_no_reads), 0) * 100.0) / (
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0)
), 2)
END, '%'
) AS NoReads,
COALESCE(SUM(diScanner_bad_reads), 0) +
COALESCE(SUM(diScanner_comm_fault), 0) +
COALESCE(SUM(diScanner_good_reads), 0) +
COALESCE(SUM(diScanner_multi_items), 0) +
COALESCE(SUM(diScanner_multi_reads), 0) +
COALESCE(SUM(diScanner_no_data), 0) +
COALESCE(SUM(diScanner_no_reads), 0) AS Total
FROM scanner_reads
WHERE t_stamp BETWEEN :starttime AND :endtime
AND (sScanner_Name = :scannername OR :scannername IS NULL OR :scannername = '')
GROUP BY DATE(t_stamp), HOUR(t_stamp), sScanner_Name
UNION ALL
SELECT
CONCAT(DATE(t_stamp), ' ', HOUR(t_stamp), ':00') AS roundtime,
'S03aa' AS sScanner_Name,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 NOT IN (0, 8, 9, 10, 11, 15) THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS BadReads,
'0%' AS CommFaults,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 0 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS GoodReads,
'0%' AS MultiItems,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 10 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS MultiReads,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 9 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS NoData,
CONCAT(
CASE
WHEN COUNT(*) = 0 THEN 0
ELSE ROUND((SUM(CASE WHEN adiSort_Code_0 = 8 THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2)
END, '%'
) AS NoReads,
COUNT(*) AS Total
FROM item_data
WHERE t_stamp BETWEEN :starttime AND :endtime
AND adiSort_Code_0 NOT IN (11, 15)
AND sLocation_ID LIKE 'S03%'
AND (:scannername IS NULL OR :scannername = '' OR :scannername = 'S03aa')
GROUP BY DATE(t_stamp), HOUR(t_stamp)
) AS data ON 1=1
ORDER BY data.roundtime ASC;

View File

@ -0,0 +1,112 @@
import re
import system
reDefault = re.compile(r'\[[^[]+\]')
def _extractParameter(params, parameter, path):
val = params[parameter].value
if hasattr(val, "bindType"):
return system.tag.readBlocking([path+"/Parameters."+parameter])[0].value
else:
return val
def _isGroupedUDT(obj):
for tag in obj["tags"]:
if tag["name"] in ["Graphics", "StatusText"]:
return False
return True
def getSiblingDevices(tagPath, filterType=None, filterTagPath=True):
devices = []
def extractStatusText(obj, path):
# Scan for status text tag:
for tag in obj["tags"]:
if tag["name"] == "StatusText":
return "[ignition]" + reDefault.sub("", path) + "/StatusText"
# Couldn't find it, so return None:
return None
def scan(obj, parentPath):
if isinstance(obj, list):
for tag in obj:
scan(tag, parentPath)
else:
path = parentPath + "/" + obj["name"]
if str(obj["tagType"]) == "Folder" or (str(obj["tagType"]) == "UdtInstance" and (tagPath <> path or not filterTagPath) and _isGroupedUDT(obj)):
for tag in obj["tags"]:
scan(tag, path)
elif str(obj["tagType"]) == "UdtInstance" and (tagPath <> path or not filterTagPath):
params = obj["parameters"]
# Make sure this is a renderable device:
if "DeviceType" in params:
deviceType = _extractParameter(params, "DeviceType", path)
if filterType == None or deviceType in filterType:
labelFull = _extractParameter(params, "LabelFull", path)
devices.append({
"deviceType": deviceType,
"tagPath": path,
"device": labelFull,#"[ignition]" + reDefault.sub("", path) + "/Parameters.LabelFull",
"status": extractStatusText(obj, path)
})
# Scan devices:
if tagPath not in [None, ""]:
tagPath = reDefault.sub("", tagPath) # Remove [default] from tagpath
parentPath = "/".join(tagPath.split("/")[:-1])
config = system.tag.getConfiguration(parentPath, True)
#system.perspective.print(parentPath)
#system.perspective.print(config)
if len(config) > 0 and "tags" in config[0]:
scan(config[0]["tags"], parentPath)
devices.sort(key=lambda x: x["device"])
return devices
def _isTagOPC(path):
try:
return system.tag.readBlocking([path+".ValueSource"])[0].value == "opc"
except:
return False
def _isTagEnabled(path):
try:
return system.tag.readBlocking([path+".Enabled"])[0].value
except:
return False
def getOPCTags(tagPath):
tags = []
def scan(obj, parentPath, relPath=""):
if isinstance(obj, list):
for tag in obj:
scan(tag, parentPath, relPath)
elif "name" in obj:
path = parentPath + "/" + obj["name"]
if "tags" in obj:
# Scan deeper:
relPath = relPath + obj["name"] + "/"
for tag in obj["tags"]:
scan(tag, path, relPath)
else:
if _isTagEnabled(path) and _isTagOPC(path):#and obj["name"] not in ["Graphics"]:
# Found an OPC tag:
tags.append({
"tagName": relPath + obj["name"],
"tagType": "opc",
"tagPath": "[ignition]" + path + ".OpcItemPath",
"tagValue": "[ignition]" + path,
"tagTooltip": "[ignition]" + path + ".Tooltip",
"tagDocumentation": "[ignition]" + path + ".Documentation"
})
# Scan devices:
if tagPath not in [None, ""]:
tagPath = reDefault.sub("", tagPath) # Remove [default] from tagpath
config = system.tag.getConfiguration(tagPath, True)
if len(config) > 0 and "tags" in config[0]:
scan(config[0]["tags"], tagPath)
tags.sort(key=lambda x: x["tagName"])
return tags

View File

@ -0,0 +1,34 @@
WITH SCANNERS AS (
SELECT
DATE_FORMAT(MIN(s04_timestamp), "%Y-%m-%d %H:%i:00") AS time,
COUNT(*) AS total,
SUM(scanner_status NOT IN ("No Read", "No Code", "Multi Label")) AS good_read,
SUM(scanner_status = "No Read") AS no_read,
SUM(scanner_status = "No Code") AS no_code,
SUM(scanner_status = "Multi Label") AS multi_label
FROM package_history
WHERE s04_timestamp BETWEEN :startDate AND :endDate
AND scanner = :scanner
GROUP BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00")
ORDER BY DATE_FORMAT(s04_timestamp, "%Y-%m-%d %H:%i:00")
)
SELECT
time,
/* Counts: */
total AS total_count,
good_read AS good_read_count,
no_read AS no_read_count,
no_code AS no_code_count,
multi_label AS multi_label_count,
/* PPH: */
ROUND(total*60) AS total_pph,
ROUND(good_read*60) AS good_read_pph,
ROUND(no_read*60) AS no_read_pph,
ROUND(no_code*60) AS no_code_pph,
ROUND(multi_label*60) AS multi_label_pph,
/* Percents: */
ROUND(good_read/total, 4) AS good_read_percent,
ROUND(no_read/total, 4) AS no_read_percent,
ROUND(no_code/total, 4) AS no_code_percent,
ROUND(multi_label/total, 4) AS multi_label_percent
FROM SCANNERS;

View File

@ -0,0 +1,73 @@
WITH LANES_SUCCESS AS (
SELECT
MIN(s04_timestamp) AS start_timestamp,
MAX(s04_timestamp) AS end_timestamp,
sorter,
destination_act AS lane,
COUNT(*) AS total
FROM package_history a
WHERE s04_timestamp BETWEEN :startDate AND :endDate
GROUP BY sorter, s04_act_dest
), LANES_FAIL_REQ AS (
SELECT
MIN(s04_timestamp) AS start_timestamp,
MAX(s04_timestamp) AS end_timestamp,
sorter,
CONCAT(sorter, LPAD(s02_req_dest, 2, '0')) AS lane,
SUM(req_dest_reason=5) AS dest_full,
SUM(req_dest_reason=6) AS dest_fault,
SUM(req_dest_reason=12) AS dest_disabled
FROM package_history
WHERE s04_timestamp BETWEEN :startDate AND :endDate
AND s04_act_dest != s02_req_dest
GROUP BY sorter, s02_req_dest
), LANES_FAIL_ALT AS (
SELECT
MIN(s04_timestamp) AS start_timestamp,
MAX(s04_timestamp) AS end_timestamp,
sorter,
CONCAT(sorter, LPAD(s02_alt_dest, 2, '0')) AS lane,
SUM(alt_dest_reason=5) AS dest_full,
SUM(alt_dest_reason=6) AS dest_fault,
SUM(alt_dest_reason=12) AS dest_disabled
FROM package_history
WHERE s04_timestamp BETWEEN :startDate AND :endDate
AND s04_act_dest != s02_alt_dest
GROUP BY sorter, s02_alt_dest
), LANES AS (
SELECT
LEAST(s.start_timestamp, IFNULL(r.start_timestamp, s.start_timestamp), IFNULL(r.start_timestamp, a.start_timestamp)) AS start_timestamp,
GREATEST(s.end_timestamp, IFNULL(r.end_timestamp, s.end_timestamp), IFNULL(r.end_timestamp, a.end_timestamp)) AS end_timestamp,
3600/TIMESTAMPDIFF(SECOND, :startDate, :endDate) AS pph_multiplier,
s.sorter,
s.lane,
s.total,
IFNULL(r.dest_full, 0)+IFNULL(a.dest_full, 0) AS dest_full,
IFNULL(r.dest_fault, 0)+IFNULL(a.dest_fault, 0) AS dest_fault,
IFNULL(r.dest_disabled, 0)+IFNULL(a.dest_disabled, 0) AS dest_disabled
FROM LANES_SUCCESS s
LEFT JOIN LANES_FAIL_REQ r ON s.sorter=r.sorter AND s.lane=r.lane
LEFT JOIN LANES_FAIL_ALT a ON s.sorter=a.sorter AND s.lane=a.lane
)
SELECT
start_timestamp,
end_timestamp,
sorter,
lane,
/* Counts: */
total AS total_count,
dest_full AS dest_full_count,
dest_fault AS dest_fault_count,
dest_disabled AS dest_disabled_count,
/* PPH: */
ROUND(total*pph_multiplier) AS total_pph,
ROUND(dest_full*pph_multiplier) AS dest_full_pph,
ROUND(dest_fault*pph_multiplier) AS dest_fault_pph,
ROUND(dest_disabled*pph_multiplier) AS dest_disabled_pph,
/* Percents: */
ROUND(total/total, 4) AS total_percent,
ROUND(dest_full/total, 4) AS dest_full_percent,
ROUND(dest_fault/total, 4) AS dest_fault_percent,
ROUND(dest_disabled/total, 4) AS dest_disabled_percent
FROM LANES
ORDER BY sorter, lane;

View File

@ -0,0 +1,15 @@
{
"base": {
"style": {
"backgroundColor": "#008000",
"borderColor": "#000000",
"borderStyle": "solid",
"borderWidth": "0.5px",
"color": "#FFFFFF",
"fontFamily": "Arial",
"fontSize": "14px",
"fontWeight": "bold",
"textAlign": "center"
}
}
}

View File

@ -0,0 +1,36 @@
-- Enabled vs Disabled Pie Chart WITH time range support
WITH filtered AS (
SELECT
Name,
Disabled,
t_stamp,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY t_stamp DESC) AS rn
FROM lane_data
WHERE t_stamp BETWEEN :startTime AND :endTime
),
latest_records AS (
SELECT *
FROM filtered
WHERE rn = 1
),
totals AS (
SELECT
GREATEST(COUNT(*), 22) AS total_lanes,
SUM(CASE WHEN Disabled = 1 THEN 1 ELSE 0 END) AS disabled_count
FROM latest_records
)
SELECT
'Enabled' AS `Status`,
ROUND((total_lanes - COALESCE(disabled_count, 0)) * 100.0 / total_lanes, 1) AS `Percentage (%)`
FROM totals
UNION ALL
SELECT
'Disabled' AS `Status`,
ROUND(COALESCE(disabled_count, 0) * 100.0 / total_lanes, 1) AS `Percentage (%)`
FROM totals;

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,7 @@
{
"base": {
"style": {
"color": "#808080"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,637 @@
{
"custom": {
"color": "#C2C2C2",
"isHighlited": false,
"overlayColor": "#ffffff",
"priority": "No Active Alarms",
"state": "Offline"
},
"params": {
"highlight": "",
"tagProps": [
"System/MCM01/Conveyor/Ul15_1",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.color": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Color"
},
"transforms": [
{
"expression": "coalesce({value},0)",
"type": "expression"
},
{
"fallback": "#000000",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#C2C2C2"
},
{
"input": 1,
"output": "#FF0000"
},
{
"input": 2,
"output": "#FFA500"
},
{
"input": 3,
"output": "#0008FF"
},
{
"input": 4,
"output": "#00FF00"
},
{
"input": 5,
"output": "#FFF700"
},
{
"input": 6,
"output": "#87CEEB"
},
{
"input": 7,
"output": "#90EE90"
},
{
"input": 8,
"output": "#964B00"
},
{
"input": 9,
"output": "#FFFFFF"
},
{
"input": 10,
"output": "#000000"
},
{
"input": 11,
"output": "#8B0000"
},
{
"input": 12,
"output": "#808080"
},
{
"input": 13,
"output": "#8B8000"
},
{
"input": 14,
"output": "#006400"
},
{
"input": 15,
"output": "#FFFFC5"
},
{
"input": 16,
"output": "#00008B"
},
{
"input": 17,
"output": "#FF7276"
},
{
"input": 18,
"output": "#556B2F"
},
{
"input": 19,
"output": "#B43434"
},
{
"input": 20,
"output": "#4682B4"
},
{
"input": 21,
"output": "#FFD700"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.isHighlited": {
"binding": {
"config": {
"expression": "{view.params.highlight} !\u003d \"\""
},
"type": "expr"
},
"persistent": true
},
"custom.overlayColor": {
"binding": {
"config": {
"path": "view.params.highlight"
},
"transforms": [
{
"fallback": "#ffffff",
"inputType": "scalar",
"mappings": [
{
"input": "Diagnostic",
"output": "rgb(88, 158, 249)"
},
{
"input": "Low",
"output": "rgb(255, 255, 0)"
},
{
"input": "Medium",
"output": "rgb(247, 160, 96)"
},
{
"input": "High",
"output": "rgb(245, 95, 89)"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
},
"persistent": true
},
"custom.priority": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/Priority"
},
"transforms": [
{
"expression": "coalesce({value},0)",
"type": "expression"
},
{
"fallback": null,
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "No Active Alarms"
},
{
"input": 1,
"output": "High"
},
{
"input": 2,
"output": "Medium"
},
{
"input": 3,
"output": "Low"
},
{
"input": 4,
"output": "Diagnostic"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 2.5,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/State"
},
"transforms": [
{
"expression": "coalesce({value},-1)",
"type": "expression"
},
{
"fallback": "Offline",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "Closed"
},
{
"input": 1,
"output": "Actuated"
},
{
"input": 2,
"output": "Communication Faulted"
},
{
"input": 3,
"output": "Conveyor Running In Maintenance Mode"
},
{
"input": 4,
"output": "Disabled"
},
{
"input": 5,
"output": "Disconnected"
},
{
"input": 6,
"output": "Stopped"
},
{
"input": 7,
"output": "Enabled Not Running"
},
{
"input": 8,
"output": "Encoder Fault"
},
{
"input": 9,
"output": "Energy Management"
},
{
"input": 10,
"output": "ESTOP Was Actuated"
},
{
"input": 11,
"output": "EStopped"
},
{
"input": 12,
"output": "EStopped Locally"
},
{
"input": 13,
"output": "Extended Faulted"
},
{
"input": 14,
"output": "Full"
},
{
"input": 15,
"output": "Gaylord Start Pressed"
},
{
"input": 16,
"output": "Jam Fault"
},
{
"input": 17,
"output": "Jammed"
},
{
"input": 18,
"output": "Loading Allowed"
},
{
"input": 19,
"output": "Loading Not Allowed"
},
{
"input": 20,
"output": "Low Air Pressure Fault Was Present"
},
{
"input": 21,
"output": "Maintenance Mode"
},
{
"input": 22,
"output": "Conveyor Stopped In Maintenance Mode"
},
{
"input": 23,
"output": "Motor Faulted"
},
{
"input": 24,
"output": "Motor Was Faulted"
},
{
"input": 25,
"output": "Normal"
},
{
"input": 26,
"output": "Off Inactive"
},
{
"input": 27,
"output": "Open"
},
{
"input": 28,
"output": "PLC Ready To Run"
},
{
"input": 29,
"output": "Package Release Pressed"
},
{
"input": 30,
"output": "Power Branch Was Faulted"
},
{
"input": 31,
"output": "Pressed"
},
{
"input": 32,
"output": "Ready To Receive"
},
{
"input": 33,
"output": "Running"
},
{
"input": 34,
"output": "Started"
},
{
"input": 35,
"output": "Stopped"
},
{
"input": 36,
"output": "System Started"
},
{
"input": 37,
"output": "Unknown"
},
{
"input": 38,
"output": "VFD Fault"
},
{
"input": 39,
"output": "Conveyor Running In Power Saving Mode"
},
{
"input": 40,
"output": "Conveyor Jogging In Maintenance Mode"
},
{
"input": 41,
"output": "VFD Reset Required"
},
{
"input": 42,
"output": "Jam Reset Push Button Pressed"
},
{
"input": 43,
"output": "Start Push Button Pressed"
},
{
"input": 44,
"output": "Stop Push Button Pressed"
},
{
"input": 45,
"output": "No Container"
},
{
"input": 46,
"output": "Ready To Be Enabled"
},
{
"input": 47,
"output": "Half Full"
},
{
"input": 48,
"output": "Enabled"
},
{
"input": 49,
"output": "Tipper Faulted"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"params.highlight": {
"paramDirection": "input",
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 69,
"width": 49
}
},
"root": {
"children": [
{
"meta": {
"name": "Conveyor45"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.opacity": {
"binding": {
"config": {
"expression": "if({view.custom.isHighlited}, 1, 0)"
},
"type": "expr"
}
},
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.overlayColor"
},
"type": "property"
}
},
"props.elements[0].style.animation": {
"binding": {
"config": {
"expression": "if ({view.custom.isHighlited}, \"2.5s linear infinite both conveyor\", \"\")"
},
"type": "expr"
}
},
"props.elements[1].fill.paint": {
"binding": {
"config": {
"path": "view.custom.color"
},
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "m -0.86795047,19.664401 0.24823006,-8.9351 C 1.4141638,5.1674347 4.2395046,2.4376861 9.9814841,-0.49166894 L 15.036661,7.9157199 C 11.035373,9.451617 10.840679,10.658485 9.8085725,14.305329 l -0.1172109,5.383077 z",
"fill": {},
"id": "path9",
"name": "path9",
"style": {
"opacity": 1,
"transition": "opacity 2.5s linear"
},
"type": "path"
},
{
"d": "m 0.3823775,18.9146 0.185181,-7.76481 C 2.0848475,6.3164005 5.1481255,3.3505165 9.4316745,0.80483942 L 13.3462,7.7400105 C 10.361215,9.0747405 9.1170805,11.08825 8.3471235,14.25744 l -0.08744,4.67802 z",
"fill": {
"opacity": 1
},
"id": "path26615",
"name": "path26615",
"stroke": {
"dasharray": "none",
"opacity": "1",
"paint": "#000000",
"width": "0.45"
},
"style": {
"opacity": "1"
},
"type": "path"
}
],
"preserveAspectRatio": "none",
"style": {
"overflow": "visible"
},
"viewBox": "0 0 14 19"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\t#create devices and tags lists for the conveyor\n\tprops \u003d self.view.params.tagProps[0]\n\tautStand.devices.build_device_mapping(props)\n\tdevice_table_dataset \u003d autStand.devices.build_device_table(self)\n\ttags_table_dataset \u003d autStand.devices.getAllTags(self, props, section \u003d \"conveyor\")\n\tsystem.perspective.openDock(\u0027Docked-East-Conv\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps, \"devices\": device_table_dataset, \"tags\":tags_table_dataset})"
},
"scope": "G",
"type": "script"
},
"onMouseEnter": {
"config": {
"draggable": false,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"position": {
"relativeLocation": "top-right"
},
"positionType": "relative",
"resizable": false,
"showCloseIcon": false,
"type": "open",
"viewParams": {
"text": "{/root.meta.tooltip.text}"
},
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
},
"onMouseLeave": {
"config": {
"draggable": true,
"id": "LZ5nPg42{view.params.tagProps[0]}",
"modal": false,
"overlayDismiss": false,
"resizable": true,
"showCloseIcon": true,
"type": "close",
"viewPath": "autStand/Custom_Views/Tooltip",
"viewportBound": false
},
"scope": "C",
"type": "popup"
}
}
},
"meta": {
"name": "root",
"tooltip": {
"enabled": true
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "if(\n {view.custom.state} !\u003d \"Offline\",\n \"Source Id: \" + {view.params.tagProps[0]} + \", Priority: \" + {view.custom.priority} + \", State: \" + {view.custom.state},\n \"Device Disconnected\"\n)\n"
},
"type": "expr"
}
}
},
"props": {
"mode": "percent",
"style": {
"cursor": "pointer",
"overflow": "visible"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,212 @@
{
"custom": {},
"params": {
"down": true,
"left": true,
"right": true,
"up": true
},
"propConfig": {
"params.down": {
"paramDirection": "input",
"persistent": true
},
"params.left": {
"paramDirection": "input",
"persistent": true
},
"params.right": {
"paramDirection": "input",
"persistent": true
},
"params.up": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 300,
"width": 300
}
},
"root": {
"children": [
{
"meta": {
"name": "Left"
},
"position": {
"height": 1,
"rotate": {
"angle": 0
},
"width": 1
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"path": "view.params.left"
},
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "M0,54 H54",
"fill": {},
"name": "cableLine",
"stroke": {
"paint": "#4c4c4c",
"width": 3
},
"type": "path"
}
],
"preserveAspectRatio": "none",
"style": {
"overflow": "hidden"
},
"viewBox": "4 4 100 100"
},
"type": "ia.shapes.svg"
},
{
"meta": {
"name": "Right"
},
"position": {
"height": 1,
"rotate": {
"angle": 0
},
"width": 1
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"path": "view.params.right"
},
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "M54,54 H104",
"fill": {},
"name": "line_right",
"stroke": {
"paint": "#4c4c4c",
"width": 3
},
"type": "path"
}
],
"preserveAspectRatio": "none",
"style": {
"overflow": "hidden"
},
"viewBox": "4 4 100 100"
},
"type": "ia.shapes.svg"
},
{
"meta": {
"name": "Up"
},
"position": {
"height": 1,
"rotate": {
"angle": 0
},
"width": 1
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"path": "view.params.up"
},
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "M54,0 V54",
"fill": {},
"name": "line_up",
"stroke": {
"paint": "#4c4c4c",
"width": 3
},
"type": "path"
}
],
"preserveAspectRatio": "none",
"style": {
"overflow": "hidden"
},
"viewBox": "4 4 100 100"
},
"type": "ia.shapes.svg"
},
{
"meta": {
"name": "Down"
},
"position": {
"height": 1,
"rotate": {
"angle": 0
},
"width": 1
},
"propConfig": {
"meta.visible": {
"binding": {
"config": {
"path": "view.params.down"
},
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "M54,54 V104",
"fill": {},
"name": "line_down",
"stroke": {
"paint": "#4c4c4c",
"width": 3
},
"type": "path"
}
],
"preserveAspectRatio": "none",
"style": {
"overflow": "hidden"
},
"viewBox": "4 4 100 100"
},
"type": "ia.shapes.svg"
}
],
"meta": {
"name": "root"
},
"props": {
"mode": "percent"
},
"type": "ia.container.coord"
}
}

Some files were not shown because too many files have changed in this diff Show More