@kuriousdesign/machine-sdk 1.0.38 → 1.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,8 @@ import { ButtonBar, StatusBar } from "./HMI";
3
3
  import { PartDataDeprecated } from "./Part";
4
4
  import { Device } from "./BaseDevice/Device";
5
5
  import { GlobalConstants } from "./GlobalConstants";
6
- import { RackData, RackHmiPbs, RecipeData, RecipeManagerPbs, SystemFaultData, TaskQueue, UserData, UserManagerFB, RobData } from ".";
6
+ import { RackData, RackHmiPbs, RecipeData, RecipeManagerPbs, SystemFaultData, TaskQueue, UserData, UserManagerFB } from ".";
7
+ import { RobData } from "./Devices/Robot";
7
8
  export declare enum NodeId {
8
9
  ButtonBar = "Main.HMI.ButtonBar",
9
10
  StatusBar = "Main.HMI.StatusBar",
@@ -90,3 +90,7 @@ export interface Device {
90
90
  apiOpcua: ApiOpcuaData;
91
91
  }
92
92
  export declare const initialDevice: Device;
93
+ export interface DeviceLogData {
94
+ list: DebugLogData[];
95
+ lastIndex: number;
96
+ }
@@ -1,11 +1,13 @@
1
1
  export declare enum DeviceTypes {
2
2
  Base = 0,
3
3
  Axis = 1,
4
- BoschAxis = 2,//need to deprecate this soon
4
+ BoschAxis = 2,
5
5
  DualAxis = 3,
6
6
  Gantry = 4,
7
- Bridge = 5,//used for communication
8
- Machine = 6,
9
- Robot = 7
7
+ Bridge = 6,
8
+ Machine = 7,
9
+ Robot = 8,
10
+ Vision = 10,
11
+ TwoPos = 11
10
12
  }
11
13
  export declare function deviceTypeToString(deviceType: DeviceTypes): string;
@@ -1,4 +1,21 @@
1
1
  "use strict";
2
+ // {attribute 'qualified_only'}
3
+ // {attribute 'strict'}
4
+ // TYPE DeviceTypes :
5
+ // (
6
+ // Base := 0,
7
+ // Axis := 1,
8
+ // BoschAxis:=2,
9
+ // DualAxis:=3,
10
+ // Gantry:=4,
11
+ // System:=5,
12
+ // Bridge:=6,
13
+ // Conductor:=7,
14
+ // Rob:=8,
15
+ // Eoat:=9,
16
+ // Vision:=10
17
+ // );
18
+ // END_TYPE
2
19
  Object.defineProperty(exports, "__esModule", { value: true });
3
20
  exports.DeviceTypes = void 0;
4
21
  exports.deviceTypeToString = deviceTypeToString;
@@ -9,11 +26,12 @@ var DeviceTypes;
9
26
  DeviceTypes[DeviceTypes["BoschAxis"] = 2] = "BoschAxis";
10
27
  DeviceTypes[DeviceTypes["DualAxis"] = 3] = "DualAxis";
11
28
  DeviceTypes[DeviceTypes["Gantry"] = 4] = "Gantry";
12
- DeviceTypes[DeviceTypes["Bridge"] = 5] = "Bridge";
13
- DeviceTypes[DeviceTypes["Machine"] = 6] = "Machine";
14
- DeviceTypes[DeviceTypes["Robot"] = 7] = "Robot";
29
+ DeviceTypes[DeviceTypes["Bridge"] = 6] = "Bridge";
30
+ DeviceTypes[DeviceTypes["Machine"] = 7] = "Machine";
31
+ DeviceTypes[DeviceTypes["Robot"] = 8] = "Robot";
32
+ DeviceTypes[DeviceTypes["Vision"] = 10] = "Vision";
33
+ DeviceTypes[DeviceTypes["TwoPos"] = 11] = "TwoPos";
15
34
  })(DeviceTypes || (exports.DeviceTypes = DeviceTypes = {}));
16
- ;
17
35
  function deviceTypeToString(deviceType) {
18
36
  switch (deviceType) {
19
37
  case DeviceTypes.Base:
@@ -32,6 +50,10 @@ function deviceTypeToString(deviceType) {
32
50
  return 'Machine';
33
51
  case DeviceTypes.Robot:
34
52
  return 'Robot';
53
+ case DeviceTypes.Vision:
54
+ return 'Vision';
55
+ case DeviceTypes.TwoPos:
56
+ return 'Two Position';
35
57
  default:
36
58
  return 'Unknown';
37
59
  }
@@ -0,0 +1,52 @@
1
+ export declare enum RobWaypoints {
2
+ NONE = 0,
3
+ HOME = 1,
4
+ FIXTURE_LEFT_PERCH = 2,
5
+ FIXTURE_RIGHT_PERCH = 3,
6
+ TOOL_PERCH = 4
7
+ }
8
+ export declare function robotWaypointToString(waypoint: RobWaypoints): string;
9
+ export declare enum RobTools {
10
+ NONE = 0,
11
+ WEIGHING_GRIPPER = 1,
12
+ APPLICATOR = 2,
13
+ CAMERA = 3
14
+ }
15
+ export declare function robotToolToString(tool: RobTools): string;
16
+ export declare const RobTasks: {
17
+ NONE: number;
18
+ RETRIEVE_TOOL: number;
19
+ RETURN_TOOL: number;
20
+ GO_TO_WAYPOINT: number;
21
+ GRIP_PART: number;
22
+ SAMPLE_WEIGHT: number;
23
+ REPOSITION_AND_RELEASE_PART: number;
24
+ REMOVE_FALSE_BOTTOMS: number;
25
+ HOME_SQUEEGEE_MOTOR: number;
26
+ WIPE_APPLICATOR: number;
27
+ PERFORM_APPLICATION_TASK: number;
28
+ INSERT_FALSE_BOTTOMS: number;
29
+ TAKE_IMAGES: number;
30
+ };
31
+ export declare function robotTaskToString(task: number): string;
32
+ export interface RobData {
33
+ zone: RobZoneData;
34
+ pos: RobWaypoints;
35
+ dest: RobWaypoints;
36
+ cartesian: RobPositionData;
37
+ recipeOffsets: RobPositionData[];
38
+ }
39
+ export interface RobPositionData {
40
+ x: number;
41
+ y: number;
42
+ z: number;
43
+ wdeg: number;
44
+ pdeg: number;
45
+ rdeg: number;
46
+ }
47
+ export interface RobZoneData {
48
+ cncHorzShuttle: boolean;
49
+ waypointShuttle: boolean;
50
+ dcsNoGo: boolean;
51
+ outsideOfCnc: boolean;
52
+ }
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ // {attribute 'qualified_only'}
3
+ // {attribute 'strict'}
4
+ // TYPE RobWaypoints :
5
+ // (
6
+ // NONE := 0, //do not remove or change this
7
+ // HOME := 1, //identifier for the robot's home position
8
+ // FIXTURE_LEFT_PERCH := 2, //identifier for the fixture perch position
9
+ // FIXTURE_RIGHT_PERCH := 3, //identifier for the fixture perch position
10
+ // TOOL_PERCH :=4
11
+ // );
12
+ // END_TYPE
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.RobTasks = exports.RobTools = exports.RobWaypoints = void 0;
15
+ exports.robotWaypointToString = robotWaypointToString;
16
+ exports.robotToolToString = robotToolToString;
17
+ exports.robotTaskToString = robotTaskToString;
18
+ var RobWaypoints;
19
+ (function (RobWaypoints) {
20
+ RobWaypoints[RobWaypoints["NONE"] = 0] = "NONE";
21
+ RobWaypoints[RobWaypoints["HOME"] = 1] = "HOME";
22
+ RobWaypoints[RobWaypoints["FIXTURE_LEFT_PERCH"] = 2] = "FIXTURE_LEFT_PERCH";
23
+ RobWaypoints[RobWaypoints["FIXTURE_RIGHT_PERCH"] = 3] = "FIXTURE_RIGHT_PERCH";
24
+ RobWaypoints[RobWaypoints["TOOL_PERCH"] = 4] = "TOOL_PERCH";
25
+ })(RobWaypoints || (exports.RobWaypoints = RobWaypoints = {}));
26
+ function robotWaypointToString(waypoint) {
27
+ switch (waypoint) {
28
+ case RobWaypoints.NONE:
29
+ return 'None';
30
+ case RobWaypoints.HOME:
31
+ return 'Home';
32
+ case RobWaypoints.FIXTURE_LEFT_PERCH:
33
+ return 'Fixture Left Perch';
34
+ case RobWaypoints.FIXTURE_RIGHT_PERCH:
35
+ return 'Fixture Right Perch';
36
+ case RobWaypoints.TOOL_PERCH:
37
+ return 'Tool Perch';
38
+ default:
39
+ return 'Unknown';
40
+ }
41
+ }
42
+ // {attribute 'qualified_only'}
43
+ // {attribute 'strict'}
44
+ // TYPE RobTools :
45
+ // (
46
+ // NONE := 0, //do not remove or change this
47
+ // WEIGHING_GRIPPER := 1, //identifier for the weighing gripper tool
48
+ // APPLICATOR := 2, //identifier for the applicator tool
49
+ // CAMERA := 3 //identifier for the camera tool
50
+ // );
51
+ // END_TYPE
52
+ var RobTools;
53
+ (function (RobTools) {
54
+ RobTools[RobTools["NONE"] = 0] = "NONE";
55
+ RobTools[RobTools["WEIGHING_GRIPPER"] = 1] = "WEIGHING_GRIPPER";
56
+ RobTools[RobTools["APPLICATOR"] = 2] = "APPLICATOR";
57
+ RobTools[RobTools["CAMERA"] = 3] = "CAMERA";
58
+ })(RobTools || (exports.RobTools = RobTools = {}));
59
+ function robotToolToString(tool) {
60
+ switch (tool) {
61
+ case RobTools.NONE:
62
+ return 'None';
63
+ case RobTools.WEIGHING_GRIPPER:
64
+ return 'Weighing Gripper';
65
+ case RobTools.APPLICATOR:
66
+ return 'Applicator';
67
+ case RobTools.CAMERA:
68
+ return 'Camera';
69
+ default:
70
+ return 'Unknown';
71
+ }
72
+ }
73
+ // {attribute 'qualified_only'}
74
+ // {attribute 'strict'}
75
+ // TYPE RobTasks :
76
+ // (
77
+ // NONE := 0, //do not remove or change this
78
+ // RETRIEVE_TOOL := 1, //param0: toolId (identifier from Tools enum specifying which tool to retrieve, e.g., WEIGHING_GRIPPER, APPLICATOR, CAMERA), checks for tool presence; if missing, moves to "Home" and signals fault
79
+ // RETURN_TOOL := 2, //param0: toolId (identifier from Tools enum specifying which tool to return to the tool rack)
80
+ // GO_TO_WAYPOINT := 3, //param0: positionId (identifier from Positions enum specifying the target waypoint, e.g., FIXTURE_PERCH, HOME), moves robot to the specified position
81
+ // GRIP_PART := 4, //param0: partId (identifier of the part to grip, e.g., part 1), performs a diagonal lift (½" up, ½" away from fixed clamp side) for clearance
82
+ // SAMPLE_WEIGHT := 5, //param0: sampleCount (number of weight samples, e.g., XX), param1: sampleDuration (duration in seconds, e.g., 2), waits briefly then records average weight over the period
83
+ // REPOSITION_AND_RELEASE_PART := 6, //no params: moves back ¼" toward fixed clamp, down ¼", opens gripper to drop tube onto false bottom, returns to perch position
84
+ // REMOVE_FALSE_BOTTOMS := 7, //no params: removes false bottoms from the fixture(s)
85
+ // HOME_SQUEEGEE_MOTOR := 8, //no params: homes the squeegee motor while moving to fixture perch position
86
+ // WIPE_APPLICATOR := 9, //no params: cleans the applicator (detailed cleaning procedure TBD)
87
+ // PERFORM_APPLICATION_TASK := 10, //param0: tubeId (identifier of the tube to process, e.g., tube 1), applies the task to the specified tube
88
+ // INSERT_FALSE_BOTTOMS := 11, //no params: slides false bottoms back into place in the fixture(s)
89
+ // TAKE_IMAGES := 12 //param0: tubeList (list of tube IDs to image), captures images and sends to HMI for display (most recent as large image, others in album view)
90
+ // );
91
+ // END_TYPE
92
+ exports.RobTasks = {
93
+ NONE: 0,
94
+ RETRIEVE_TOOL: 1,
95
+ RETURN_TOOL: 2,
96
+ GO_TO_WAYPOINT: 3,
97
+ GRIP_PART: 4,
98
+ SAMPLE_WEIGHT: 5,
99
+ REPOSITION_AND_RELEASE_PART: 6,
100
+ REMOVE_FALSE_BOTTOMS: 7,
101
+ HOME_SQUEEGEE_MOTOR: 8,
102
+ WIPE_APPLICATOR: 9,
103
+ PERFORM_APPLICATION_TASK: 10,
104
+ INSERT_FALSE_BOTTOMS: 11,
105
+ TAKE_IMAGES: 12
106
+ };
107
+ function robotTaskToString(task) {
108
+ switch (task) {
109
+ case exports.RobTasks.NONE:
110
+ return 'None';
111
+ case exports.RobTasks.RETRIEVE_TOOL:
112
+ return 'Retrieve Tool';
113
+ case exports.RobTasks.RETURN_TOOL:
114
+ return 'Return Tool';
115
+ case exports.RobTasks.GO_TO_WAYPOINT:
116
+ return 'Go To Waypoint';
117
+ case exports.RobTasks.GRIP_PART:
118
+ return 'Grip Part';
119
+ case exports.RobTasks.SAMPLE_WEIGHT:
120
+ return 'Sample Weight';
121
+ case exports.RobTasks.REPOSITION_AND_RELEASE_PART:
122
+ return 'Reposition And Release Part';
123
+ case exports.RobTasks.REMOVE_FALSE_BOTTOMS:
124
+ return 'Remove False Bottoms';
125
+ case exports.RobTasks.HOME_SQUEEGEE_MOTOR:
126
+ return 'Home Squeegee Motor';
127
+ case exports.RobTasks.WIPE_APPLICATOR:
128
+ return 'Wipe Applicator';
129
+ case exports.RobTasks.PERFORM_APPLICATION_TASK:
130
+ return 'Perform Application Task';
131
+ case exports.RobTasks.INSERT_FALSE_BOTTOMS:
132
+ return 'Insert False Bottoms';
133
+ case exports.RobTasks.TAKE_IMAGES:
134
+ return 'Take Images';
135
+ default:
136
+ return 'Unknown';
137
+ }
138
+ }
@@ -31,4 +31,5 @@ export declare const GCs: {
31
31
  SYSTIME_TO_UTC_SCALAR: number;
32
32
  NUM_PARTS_PER_FIXTURE: number;
33
33
  MAX_NUM_HW_CARDS: number;
34
+ NUM_ENTRIES_MACHINE_LOG: number;
34
35
  };
@@ -80,4 +80,5 @@ exports.GCs = {
80
80
  //TASKQUEUE_LEN:INT:=100;
81
81
  // HW SIDE
82
82
  MAX_NUM_HW_CARDS: 16,
83
+ NUM_ENTRIES_MACHINE_LOG: 100,
83
84
  };
@@ -1,4 +1,4 @@
1
- import { ComponentAnimation, DeviceRegistration, TaskQueue } from ".";
1
+ import { ComponentAnimation, DebugLogData, DeviceLogData, DeviceRegistration, TaskQueue } from ".";
2
2
  import { PartDataStatus } from "./Part";
3
3
  export interface UserData {
4
4
  activeUser: number;
@@ -42,5 +42,12 @@ export interface Machine {
42
42
  registeredDevices: DeviceRegistration[];
43
43
  heartbeatPlc: number;
44
44
  heartbeatHmi: number;
45
+ machineLog: LogRecordData;
46
+ deviceLogs: DeviceLogData[];
45
47
  }
48
+ export interface LogRecordData {
49
+ list: DebugLogData[];
50
+ lastIndex: number;
51
+ }
52
+ export declare const initialLogRecordData: LogRecordData;
46
53
  export declare const initialMachine: Machine;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initialMachine = exports.initialMachineCfg = exports.initialSystemFaultData = exports.initialFaultCodeData = void 0;
3
+ exports.initialMachine = exports.initialLogRecordData = exports.initialMachineCfg = exports.initialSystemFaultData = exports.initialFaultCodeData = void 0;
4
4
  const _1 = require(".");
5
5
  const Part_1 = require("./Part");
6
6
  exports.initialFaultCodeData = {
@@ -20,6 +20,10 @@ exports.initialMachineCfg = {
20
20
  apiOpcuaDeviceId: -1,
21
21
  ethernetAdapterList: [],
22
22
  };
23
+ exports.initialLogRecordData = {
24
+ list: Array(_1.GCs.NUM_ENTRIES_MACHINE_LOG).fill(null).map(() => ({ ..._1.initialDebugLogData })),
25
+ lastIndex: 0,
26
+ };
23
27
  exports.initialMachine = ({
24
28
  estopCircuit_OK: false,
25
29
  estopCircuitDelayed_OK: false,
@@ -37,4 +41,6 @@ exports.initialMachine = ({
37
41
  registeredDevices: [],
38
42
  heartbeatPlc: 0,
39
43
  heartbeatHmi: 0,
44
+ machineLog: { ...exports.initialLogRecordData },
45
+ deviceLogs: Array(_1.GCs.NUM_DEVICES).fill(null).map(() => ({ ..._1.initialDeviceLogData })),
40
46
  });
@@ -1,4 +1,4 @@
1
- import { RobPositionData } from "..";
1
+ import { RobPositionData } from "./Devices/Robot";
2
2
  export interface ShelfPartPositionData {
3
3
  index: number;
4
4
  colNum: number;
@@ -1,24 +0,0 @@
1
- import { TaskData, RobPositions, TaskId } from "..";
2
- export interface RobData {
3
- zone: RobZoneData;
4
- pos: RobPositions;
5
- dest: RobPositions;
6
- cartesian: RobPositionData;
7
- taskReq: TaskId;
8
- taskData: TaskData;
9
- recipeOffsets: RobPositionData[];
10
- }
11
- export interface RobPositionData {
12
- x: number;
13
- y: number;
14
- z: number;
15
- wdeg: number;
16
- pdeg: number;
17
- rdeg: number;
18
- }
19
- export interface RobZoneData {
20
- cncHorzShuttle: boolean;
21
- waypointShuttle: boolean;
22
- dcsNoGo: boolean;
23
- outsideOfCnc: boolean;
24
- }
@@ -1,2 +1 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -9,7 +9,6 @@ export * from "./RecipeData";
9
9
  export * from "./RecipeManagerFB";
10
10
  export * from "./UserManagerFB";
11
11
  export * from "./TaskQueue";
12
- export * from "./RobData";
13
12
  export * from "./Devices";
14
13
  export * from "./Bridge";
15
14
  export * from "./Part";
@@ -25,7 +25,6 @@ __exportStar(require("./RecipeData"), exports);
25
25
  __exportStar(require("./RecipeManagerFB"), exports);
26
26
  __exportStar(require("./UserManagerFB"), exports);
27
27
  __exportStar(require("./TaskQueue"), exports);
28
- __exportStar(require("./RobData"), exports);
29
28
  __exportStar(require("./Devices"), exports);
30
29
  __exportStar(require("./Bridge"), exports);
31
30
  __exportStar(require("./Part"), exports);
@@ -5,4 +5,3 @@ export * from "./ExtrusionType";
5
5
  export * from "./DeviceId";
6
6
  export * from "./TaskId";
7
7
  export * from "./Pages";
8
- export * from "./RobPositions";
@@ -21,4 +21,3 @@ __exportStar(require("./ExtrusionType"), exports);
21
21
  __exportStar(require("./DeviceId"), exports);
22
22
  __exportStar(require("./TaskId"), exports);
23
23
  __exportStar(require("./Pages"), exports);
24
- __exportStar(require("./RobPositions"), exports);
@@ -11,6 +11,7 @@ export declare const MachineTags: {
11
11
  HeartbeatHMI: string;
12
12
  parts: string;
13
13
  taskQueue: string;
14
+ machineLog: string;
14
15
  };
15
16
  export declare const DeviceTags: {
16
17
  Cfg: string;
@@ -26,5 +27,6 @@ export declare const DeviceTags: {
26
27
  ApiOpcuaHmiReq: string;
27
28
  ApiOpcuaHmiResp: string;
28
29
  };
30
+ export declare const DeviceLogTags = "Machine.DeviceLogs";
29
31
  export * from "./opcua";
30
32
  export * from "./mqtt";
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.DeviceTags = exports.MachineTags = exports.PlcNamespaces = void 0;
17
+ exports.DeviceLogTags = exports.DeviceTags = exports.MachineTags = exports.PlcNamespaces = void 0;
18
18
  exports.PlcNamespaces = {
19
19
  Machine: 'Machine',
20
20
  MachineHw: 'MachineHw',
@@ -29,6 +29,8 @@ exports.MachineTags = {
29
29
  HeartbeatHMI: 'HeartbeatHMI',
30
30
  parts: 'Parts',
31
31
  taskQueue: 'TaskQueue',
32
+ //deviceLogs: 'DeviceLogs',
33
+ machineLog: 'MachineLog',
32
34
  };
33
35
  exports.DeviceTags = {
34
36
  Cfg: 'Cfg',
@@ -45,5 +47,6 @@ exports.DeviceTags = {
45
47
  ApiOpcuaHmiReq: 'ApiOpcua/HmiReq',
46
48
  ApiOpcuaHmiResp: 'ApiOpcua/HmiResp',
47
49
  };
50
+ exports.DeviceLogTags = 'Machine.DeviceLogs';
48
51
  __exportStar(require("./opcua"), exports);
49
52
  __exportStar(require("./mqtt"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuriousdesign/machine-sdk",
3
- "version": "1.0.38",
3
+ "version": "1.0.40",
4
4
  "description": "Shared data types and helpers for machine-related repositories",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -8,13 +8,12 @@ import {
8
8
  RackHmiPbs,
9
9
  RecipeData,
10
10
  RecipeManagerPbs,
11
- RobPositionData,
12
11
  SystemFaultData,
13
12
  TaskQueue,
14
13
  UserData,
15
14
  UserManagerFB,
16
- RobData,
17
15
  } from ".";
16
+ import { RobData } from "./Devices/Robot";
18
17
 
19
18
  export enum NodeId {
20
19
  // new node ids
@@ -102,10 +102,10 @@ export interface DeviceStatus {
102
102
  state: number; // enum for States enum, same as the boolean states in the data structure
103
103
  stepNum: number;
104
104
  stepDescription: string;
105
-
105
+
106
106
  colorCode: number; // color to indicate the current status for HMI purposes
107
107
  statusMsg: string; // status string
108
-
108
+
109
109
  error: boolean; // state, device or child has an error
110
110
  killed: boolean; // device is de-energized
111
111
  inactive: boolean; // waiting to be reset
@@ -124,15 +124,15 @@ export interface DeviceStatus {
124
124
  ipr: boolean; // IdleOrPausedOrRunning
125
125
  kei: boolean; // KilledErrorOrInactive
126
126
  runningOrStopping: boolean;
127
-
127
+
128
128
  // Children Status
129
129
  allChildrenIdle: boolean;
130
130
  allChildrenKilled: boolean;
131
131
  allChildrenInactive: boolean;
132
132
  allChildrenIdleOrError: boolean;
133
-
133
+
134
134
  commanderId: number; // used for external control
135
-
135
+
136
136
  recordingLogs: boolean;
137
137
  }
138
138
 
@@ -202,4 +202,17 @@ export const initialDevice: Device = {
202
202
  process: initialProcessData,
203
203
  script: initialProcessData,
204
204
  apiOpcua: initialApiOpcuaData
205
- };
205
+ };
206
+
207
+
208
+ // TYPE DeviceLogData :
209
+ // STRUCT
210
+ // List: ARRAY[0..DeviceConstants.NUM_LOG_ENTRIES-1] OF DebugLogData;
211
+ // LastIndex:INT; //index of the most recent recorde entries
212
+ // END_STRUCT
213
+ // END_TYPE
214
+
215
+ export interface DeviceLogData {
216
+ list: DebugLogData[];
217
+ lastIndex: number; // index of the most recent recorded entries
218
+ }
@@ -1,13 +1,35 @@
1
+ // {attribute 'qualified_only'}
2
+ // {attribute 'strict'}
3
+ // TYPE DeviceTypes :
4
+ // (
5
+ // Base := 0,
6
+ // Axis := 1,
7
+ // BoschAxis:=2,
8
+ // DualAxis:=3,
9
+ // Gantry:=4,
10
+ // System:=5,
11
+ // Bridge:=6,
12
+ // Conductor:=7,
13
+ // Rob:=8,
14
+ // Eoat:=9,
15
+ // Vision:=10
16
+ // );
17
+ // END_TYPE
18
+
19
+
20
+
1
21
  export enum DeviceTypes {
2
22
  Base = 0,
3
23
  Axis = 1,
4
- BoschAxis = 2, //need to deprecate this soon
24
+ BoschAxis = 2,
5
25
  DualAxis = 3,
6
26
  Gantry = 4,
7
- Bridge = 5, //used for communication
8
- Machine = 6,
9
- Robot = 7,
10
- };
27
+ Bridge = 6,
28
+ Machine = 7,
29
+ Robot = 8,
30
+ Vision = 10,
31
+ TwoPos = 11
32
+ }
11
33
 
12
34
  export function deviceTypeToString(deviceType: DeviceTypes): string {
13
35
  switch (deviceType) {
@@ -27,6 +49,10 @@ export function deviceTypeToString(deviceType: DeviceTypes): string {
27
49
  return 'Machine';
28
50
  case DeviceTypes.Robot:
29
51
  return 'Robot';
52
+ case DeviceTypes.Vision:
53
+ return 'Vision';
54
+ case DeviceTypes.TwoPos:
55
+ return 'Two Position';
30
56
  default:
31
57
  return 'Unknown';
32
58
  }
@@ -0,0 +1,165 @@
1
+ // {attribute 'qualified_only'}
2
+ // {attribute 'strict'}
3
+ // TYPE RobWaypoints :
4
+ // (
5
+ // NONE := 0, //do not remove or change this
6
+ // HOME := 1, //identifier for the robot's home position
7
+ // FIXTURE_LEFT_PERCH := 2, //identifier for the fixture perch position
8
+ // FIXTURE_RIGHT_PERCH := 3, //identifier for the fixture perch position
9
+ // TOOL_PERCH :=4
10
+ // );
11
+ // END_TYPE
12
+
13
+ export enum RobWaypoints {
14
+ NONE = 0,
15
+ HOME = 1,
16
+ FIXTURE_LEFT_PERCH = 2,
17
+ FIXTURE_RIGHT_PERCH = 3,
18
+ TOOL_PERCH = 4
19
+ }
20
+
21
+ export function robotWaypointToString(waypoint: RobWaypoints): string {
22
+ switch (waypoint) {
23
+ case RobWaypoints.NONE:
24
+ return 'None';
25
+ case RobWaypoints.HOME:
26
+ return 'Home';
27
+ case RobWaypoints.FIXTURE_LEFT_PERCH:
28
+ return 'Fixture Left Perch';
29
+ case RobWaypoints.FIXTURE_RIGHT_PERCH:
30
+ return 'Fixture Right Perch';
31
+ case RobWaypoints.TOOL_PERCH:
32
+ return 'Tool Perch';
33
+ default:
34
+ return 'Unknown';
35
+ }
36
+ }
37
+
38
+ // {attribute 'qualified_only'}
39
+ // {attribute 'strict'}
40
+ // TYPE RobTools :
41
+ // (
42
+ // NONE := 0, //do not remove or change this
43
+ // WEIGHING_GRIPPER := 1, //identifier for the weighing gripper tool
44
+ // APPLICATOR := 2, //identifier for the applicator tool
45
+ // CAMERA := 3 //identifier for the camera tool
46
+ // );
47
+ // END_TYPE
48
+
49
+ export enum RobTools {
50
+ NONE = 0,
51
+ WEIGHING_GRIPPER = 1,
52
+ APPLICATOR = 2,
53
+ CAMERA = 3
54
+ }
55
+
56
+ export function robotToolToString(tool: RobTools): string {
57
+ switch (tool) {
58
+ case RobTools.NONE:
59
+ return 'None';
60
+ case RobTools.WEIGHING_GRIPPER:
61
+ return 'Weighing Gripper';
62
+ case RobTools.APPLICATOR:
63
+ return 'Applicator';
64
+ case RobTools.CAMERA:
65
+ return 'Camera';
66
+ default:
67
+ return 'Unknown';
68
+ }
69
+ }
70
+
71
+ // {attribute 'qualified_only'}
72
+ // {attribute 'strict'}
73
+ // TYPE RobTasks :
74
+ // (
75
+ // NONE := 0, //do not remove or change this
76
+ // RETRIEVE_TOOL := 1, //param0: toolId (identifier from Tools enum specifying which tool to retrieve, e.g., WEIGHING_GRIPPER, APPLICATOR, CAMERA), checks for tool presence; if missing, moves to "Home" and signals fault
77
+ // RETURN_TOOL := 2, //param0: toolId (identifier from Tools enum specifying which tool to return to the tool rack)
78
+ // GO_TO_WAYPOINT := 3, //param0: positionId (identifier from Positions enum specifying the target waypoint, e.g., FIXTURE_PERCH, HOME), moves robot to the specified position
79
+ // GRIP_PART := 4, //param0: partId (identifier of the part to grip, e.g., part 1), performs a diagonal lift (½" up, ½" away from fixed clamp side) for clearance
80
+ // SAMPLE_WEIGHT := 5, //param0: sampleCount (number of weight samples, e.g., XX), param1: sampleDuration (duration in seconds, e.g., 2), waits briefly then records average weight over the period
81
+ // REPOSITION_AND_RELEASE_PART := 6, //no params: moves back ¼" toward fixed clamp, down ¼", opens gripper to drop tube onto false bottom, returns to perch position
82
+ // REMOVE_FALSE_BOTTOMS := 7, //no params: removes false bottoms from the fixture(s)
83
+ // HOME_SQUEEGEE_MOTOR := 8, //no params: homes the squeegee motor while moving to fixture perch position
84
+ // WIPE_APPLICATOR := 9, //no params: cleans the applicator (detailed cleaning procedure TBD)
85
+ // PERFORM_APPLICATION_TASK := 10, //param0: tubeId (identifier of the tube to process, e.g., tube 1), applies the task to the specified tube
86
+ // INSERT_FALSE_BOTTOMS := 11, //no params: slides false bottoms back into place in the fixture(s)
87
+ // TAKE_IMAGES := 12 //param0: tubeList (list of tube IDs to image), captures images and sends to HMI for display (most recent as large image, others in album view)
88
+ // );
89
+ // END_TYPE
90
+
91
+ export const RobTasks = {
92
+ NONE: 0,
93
+ RETRIEVE_TOOL: 1,
94
+ RETURN_TOOL: 2,
95
+ GO_TO_WAYPOINT: 3,
96
+ GRIP_PART: 4,
97
+ SAMPLE_WEIGHT: 5,
98
+ REPOSITION_AND_RELEASE_PART: 6,
99
+ REMOVE_FALSE_BOTTOMS: 7,
100
+ HOME_SQUEEGEE_MOTOR: 8,
101
+ WIPE_APPLICATOR: 9,
102
+ PERFORM_APPLICATION_TASK: 10,
103
+ INSERT_FALSE_BOTTOMS: 11,
104
+ TAKE_IMAGES: 12
105
+ };
106
+
107
+ export function robotTaskToString(task: number): string {
108
+ switch (task) {
109
+ case RobTasks.NONE:
110
+ return 'None';
111
+ case RobTasks.RETRIEVE_TOOL:
112
+ return 'Retrieve Tool';
113
+ case RobTasks.RETURN_TOOL:
114
+ return 'Return Tool';
115
+ case RobTasks.GO_TO_WAYPOINT:
116
+ return 'Go To Waypoint';
117
+ case RobTasks.GRIP_PART:
118
+ return 'Grip Part';
119
+ case RobTasks.SAMPLE_WEIGHT:
120
+ return 'Sample Weight';
121
+ case RobTasks.REPOSITION_AND_RELEASE_PART:
122
+ return 'Reposition And Release Part';
123
+ case RobTasks.REMOVE_FALSE_BOTTOMS:
124
+ return 'Remove False Bottoms';
125
+ case RobTasks.HOME_SQUEEGEE_MOTOR:
126
+ return 'Home Squeegee Motor';
127
+ case RobTasks.WIPE_APPLICATOR:
128
+ return 'Wipe Applicator';
129
+ case RobTasks.PERFORM_APPLICATION_TASK:
130
+ return 'Perform Application Task';
131
+ case RobTasks.INSERT_FALSE_BOTTOMS:
132
+ return 'Insert False Bottoms';
133
+ case RobTasks.TAKE_IMAGES:
134
+ return 'Take Images';
135
+ default:
136
+ return 'Unknown';
137
+ }
138
+ }
139
+
140
+
141
+ export interface RobData {
142
+ zone: RobZoneData;
143
+ pos: RobWaypoints;
144
+ dest: RobWaypoints;
145
+ cartesian: RobPositionData;
146
+ //taskReq: TaskId; //incoming task request
147
+ //taskData: TaskData;
148
+ recipeOffsets: RobPositionData[];
149
+ }
150
+
151
+ export interface RobPositionData {
152
+ x: number;
153
+ y: number;
154
+ z: number;
155
+ wdeg: number;
156
+ pdeg: number;
157
+ rdeg: number;
158
+ }
159
+
160
+ export interface RobZoneData {
161
+ cncHorzShuttle: boolean;
162
+ waypointShuttle: boolean; //Joint moves, wrist is holding parts upright and at a distance that allows robot to rotate about J1 without fear of collision, basically just moving J1
163
+ dcsNoGo: boolean;
164
+ outsideOfCnc: boolean;
165
+ }
@@ -92,4 +92,5 @@ export const GCs = {
92
92
  //TASKQUEUE_LEN:INT:=100;
93
93
  // HW SIDE
94
94
  MAX_NUM_HW_CARDS: 16,
95
+ NUM_ENTRIES_MACHINE_LOG: 100,
95
96
  };
@@ -1,4 +1,4 @@
1
- import { ComponentAnimation, DeviceConstants, DeviceRegistration, GCs, initialDeviceRegistration, initialTaskQueue, TaskQueue } from ".";
1
+ import { ComponentAnimation, DebugLogData, DeviceConstants, DeviceLogData, DeviceRegistration, GCs, initialDebugLogData, initialDeviceLogData, initialDeviceRegistration, initialTaskQueue, TaskQueue } from ".";
2
2
  import { initialPartDataStatus, PartData, PartDataStatus } from "./Part";
3
3
 
4
4
 
@@ -84,8 +84,27 @@ export interface Machine {
84
84
  registeredDevices: DeviceRegistration[];
85
85
  heartbeatPlc: number;
86
86
  heartbeatHmi: number;
87
+ machineLog: LogRecordData;
88
+ deviceLogs: DeviceLogData[]; //ARRAY[0..(GCs.NUM_DEVICES-1)] OF DeviceLogData;
87
89
  }
88
90
 
91
+ // TYPE LogRecordData :
92
+ // STRUCT
93
+ // List: ARRAY[0..DiagConstants.NUM_ENTRIES_RECORDED_LOG-1] OF DebugLogData;
94
+ // LastIndex:USINT; //index of the most recent recorde entries
95
+ // END_STRUCT
96
+ // END_TYPE
97
+
98
+ export interface LogRecordData {
99
+ list: DebugLogData[];
100
+ lastIndex: number; // index of the most recent recorded entries
101
+ }
102
+
103
+ export const initialLogRecordData: LogRecordData = {
104
+ list: Array(GCs.NUM_ENTRIES_MACHINE_LOG).fill(null).map(() => ({ ...initialDebugLogData })),
105
+ lastIndex: 0,
106
+ };
107
+
89
108
  export const initialMachine: Machine = ({
90
109
  estopCircuit_OK: false,
91
110
  estopCircuitDelayed_OK: false,
@@ -103,4 +122,6 @@ export const initialMachine: Machine = ({
103
122
  registeredDevices: [],
104
123
  heartbeatPlc: 0,
105
124
  heartbeatHmi: 0,
125
+ machineLog: { ...initialLogRecordData },
126
+ deviceLogs: Array(GCs.NUM_DEVICES).fill(null).map(() => ({ ...initialDeviceLogData })),
106
127
  });
@@ -1,4 +1,5 @@
1
- import { RobPositionData } from "..";
1
+ import { RobPositionData } from "./Devices/Robot";
2
+
2
3
 
3
4
  export interface ShelfPartPositionData {
4
5
  index: number;
@@ -1,27 +0,0 @@
1
- import { TaskData, RobPositions, TaskId } from "..";
2
-
3
- export interface RobData {
4
- zone: RobZoneData;
5
- pos: RobPositions;
6
- dest: RobPositions;
7
- cartesian: RobPositionData;
8
- taskReq: TaskId; //incoming task request
9
- taskData: TaskData;
10
- recipeOffsets: RobPositionData[];
11
- }
12
-
13
- export interface RobPositionData {
14
- x: number;
15
- y: number;
16
- z: number;
17
- wdeg: number;
18
- pdeg: number;
19
- rdeg: number;
20
- }
21
-
22
- export interface RobZoneData {
23
- cncHorzShuttle: boolean;
24
- waypointShuttle: boolean; //Joint moves, wrist is holding parts upright and at a distance that allows robot to rotate about J1 without fear of collision, basically just moving J1
25
- dcsNoGo: boolean;
26
- outsideOfCnc: boolean;
27
- }
@@ -9,7 +9,6 @@ export * from "./RecipeData";
9
9
  export * from "./RecipeManagerFB";
10
10
  export * from "./UserManagerFB";
11
11
  export * from "./TaskQueue";
12
- export * from "./RobData";
13
12
  export * from "./Devices";
14
13
  export * from "./Bridge";
15
- export * from "./Part";
14
+ export * from "./Part";
@@ -7,4 +7,3 @@ export * from "./DeviceId";
7
7
  export * from "./TaskId";
8
8
 
9
9
  export * from "./Pages";
10
- export * from "./RobPositions";
@@ -13,6 +13,8 @@ export const MachineTags = {
13
13
  HeartbeatHMI: 'HeartbeatHMI',
14
14
  parts: 'Parts',
15
15
  taskQueue: 'TaskQueue',
16
+ //deviceLogs: 'DeviceLogs',
17
+ machineLog: 'MachineLog',
16
18
  }
17
19
 
18
20
  export const DeviceTags = {
@@ -31,5 +33,7 @@ export const DeviceTags = {
31
33
  ApiOpcuaHmiResp: 'ApiOpcua/HmiResp',
32
34
  }
33
35
 
36
+ export const DeviceLogTags = 'Machine.DeviceLogs';
37
+
34
38
  export * from "./opcua";
35
39
  export * from "./mqtt";
@@ -1,12 +0,0 @@
1
- export enum RobPositions {
2
- AnyPosition = -1, //used when configuring tasks, this is used for start position id for pure moves
3
- Lost = 0,
4
- Home = 1,
5
- WashPerch = 2,
6
- RackPerch = 3, //used for shelf picking and reject
7
- DeadNestPerch = 4, //used for preop and postop tasks
8
- CncPerch = 5, //standby position outside of cnc door with wrist rotated so parts are horizontal
9
- DeburrPerch = 6,
10
- CncWaypoint = 7,
11
- CncHover = 8,
12
- }