Program Init Variables BeforeStart Program Information 'Program Info: This is a demonstration program for the "Kelvin Tool Changer"' 'Last update: - 4/2 2020 - 01:30' 'Program scope: Demo program running a UR robot with a Kelvin Tool Changer. This program can handle all issues with the tool changer' 'Programmed by Henning Forbech, 4TECH Robotics Aps, www.toolchanger.eu' 'Program information: This program is a demonstration program for running a UR-robot with the Kelvin Tool Changer' 'Sub-Programs should be programmed to start near "Ready" and end again in the same place' 'Sub-Programs can be programmed and tested outside the "Kelvin" program. The program is called as a subprogram in ''Kelvin''. The external program can be set to updated with changes made to the embedded code in the "Kelvin" program' 'This program starts with the robot arm in the "Ready" position. First step in the program (1) will move the robot to get all joints in the right position' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '2do: Put small notes on thing to do here:' 'Safety limits must be set up for the robot. Propper values for force, speed and range have be defined to make the operation of the robot safe. See "Safety" section above' Safety 'Safety settings for UR robots with Kelvin Tool Changer' 'Tool connected: If the tool is disconnected during operation the robot must stop to prevent a dangerous situation' '''ToolFree'' must be set to ''1'' to allow disconnection of tool. ' '''Hook open'' if AI(1)<4.6V ' ToolFree≔1 'Tool ID: The program will only work with the right tool connected. Tool-ID must be checked at pick-up and when appropriated during programs' 'Space: Setup the space for the robots operation. Prevent the robot arm from hitting anything' 'Force restrictions: Setup the security levels for forces' Environments 'Tool Voltage Supply must be set to 24V for the Tool Changer to be able to identify Tool-ID and to verify Hook positions' 'Info: How to set Tool Voltage: Under the "I/O" tab (right to the "Move" tab) the voltage for the tool can be set (lower right corner). Those 24V' 'Info: AO(0) must be set to voltage. If it is set to currant (4-20mA) a 0V setting will change to 4mA. When the setting is set back to voltage this setting will become 4V!!!' General setup for the Tool Changer '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Language setting:' 'Set language: It is possible to set the language for some of the popups that the user will see. The variable "Lang" control witch language that are shown' 'Kelvin Program #46 (Language) can be used by the operator to change language' 'Language options: 1:Danish 2:English 3:German 4:French 5:Spanish' 'Language info: If a popup do not have a comment in the language indicated by "Lang" the comment in English will be shown' 'Translation to German, France and Spanish was done with Google Translate. Sorry for mistakes' 'Default value for Lang: 2 (English)' Lang≔2 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'TCP info:' 'For starting up the program TCP is set to TCP_1' 'TCP_1 is the center of the Tool Plate in the Docking Station. X:0 mm, Y:0mm, Z:34 mm, Weight set to 144g, CGy: 11mm' 'TCP_2 is for Tool-A: Values: X:0 mm, Y:0mm, Z:?? mm, Weight set to ??g, CGy: ?? mm' 'TCP_3 is for Tool-B: Values: X:0 mm, Y:0mm, Z:?? mm, Weight set to ??g, CGy: ?? mm' 'TCP_4 is for Tool-C: Values: X:0 mm, Y:0mm, Z:?? mm, Weight set to ??g, CGy: ?? mm' 'TCP_5 is for Tool-D: Values: X:0 mm, Y:0mm, Z:?? mm, Weight set to ??g, CGy: ?? mm' Set '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Kelvin Action Info: This value will tell the program what to do next ' 'Kelvin Action Info: 1 is checking if the robot is ready. Normally this step will "Do Nothing". When the robot pass the start check it will let the user chose what task to run next' Kelvin_Action≔1 'At startup the robot will run the program the set in "Kelvin_Action". Default is "1"' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '''ToolService'' variable is used to control the ToolService program' '''ToolService'' must be set to 20 to show menu at start' ToolService≔20 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '''BackUp'' variable is used to control the backup routine (program #43)' '''BackUp'' must be set to 10 to show menu at start' BackUp≔10 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '''ReLoad'' variable is used to control the reload from backup routine (program #44)' '''ReLoad'' must be set to 10 to show menu at start' ReLoad≔10 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '''DockSetUp'' variable is used to control the Dock SetUp routine (program #42)' '''DockSetUp'' must be set to 10 to show menu at start' DockSetUp≔10 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '''Dock4SetUp'' variable is used to control the reload from backup routine (program #44)' '''Dock4SetUp'' must be set to 10 to show menu at start' Dock4SetUp≔10 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '''Dock4Adjust'' variable is used to control the dock setup routine (program #42)' '''Dock4Adjust'' must be set to 99 at program start' '''Dock4Adjust''=99 an 88 are used to block some functions in proram #42' Dock4Adjust≔99 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '''UserXAdjustment'' variable is used to control th fine adjustment routine (program #42-3)' '''UserXAdjustment'' must be set to 13 to show menu at start' UserXAdjustment≔13 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Loop info:To run more than once, loop must be reset after exit. See ''LoopReStarter'' at #0' Tool ID setup 'List of Tool-ID used on this robot installation:' '(your company): Dock-A:ID-? (?-tool)/ Dock-B: ID-? (?-too)/ Dock-C:Free / Dock-D:ID-?(?-tool) / Dock-M:UsersChoice!' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Tool-ID Adjust compensate for the difference between theoretical values (listed below) and real values measured by the robot. ' 'Tool-ID Adjustment: Sample: UR5 robot: 12V: 0.5 - 24V: 1.00 - (Default: 24V: 1.0)' 'Values for Tool ID(@24V): ID0: 4.9V(no Tool ID present), ID1: 5.7V, ID2: 6.7V, ID3: 7.4V, ID4: 8.4V, ID5: 9.5V, ID6: 10.8V, ID7: 11.7V, ID8: 12.4V, ID9: 13.2V, ID10: 14.1V' Tool_ID_Adjust≔1.00 'Hook Open: AI3<0.5 (0.25V@12V)' 'Hook Locked: AI3>4.6V (2.3V@12V)' 'PowerSupply: AI3:0=No power! AI3:2.1V=24V (AI3:1.0V=12V)' Docking setup 'This is data used for docking operations. Data for setting up docking stations can be found under ''Dock-X setup''' 'Only the Center Point information is saved for each docking station. The waypoints for the docking operations are generated from these data by the program' 'The varable "Dock_A_Home" is saved as an instalation variable. This makes it possible for the user to make changes and save these new values even when the robot is shut down' 'When the program start the data for each dock center is copied from the installation value' 'The actual values for this robot can be found under "Installation" and "Variables"' 'It is recommended to save a set of working values for each docking station. Use program #43' 'Information: Dock-X is only used for updating or fine tuning a docking station. All changes and test runs are done on Dock-X. Data from Dock-X will be transferred to the real dock at the end of the update procedure' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'FrontDoor: Default: 90 mm (Front2Center variable)' Front2Center≔90 'FrontDoor-Center line at 22 deg with Robot X-axis' '22 deg: Cos22: 0.9272 Sin22: 0.3746' DeltaFront≔p[Front2Center/1000*0.9272,Front2Center/1000*0.3746,0,0,0,0] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Start point. Default: 1 mm (Start2Center variable). ToolChanger overshoot the center point by this value' Start2Center≔1 DeltaStart≔p[Start2Center/1000*0.9272,Start2Center/1000*0.3746,0,0,0,0] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Opening overshoot Open by 4 deg. (48 deg = 0,0,1.694)' DeltaOpening≔p[0,0,0,0,0,1.1694] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Open position is 65 deg from Center-Front line (43 deg from X-axis)(0,0,1.1)' DeltaOpen≔p[0,0,0,0,0,1.1] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'BackDoor default: 45 mm (Back2Center variable) To get Master free of Dock' Back2Center≔45 'BackDoor is ''Open'' and z movement' DeltaBack≔p[0,0,-Back2Center/1000,0,0,1.1] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'In the locking process the tool changer overturn to make sure the Hook is locked' 'The rubber mounts in the docking station will flex during this operation' 'Values for overturning: 1deg: (0,0,6.2644) 2deg:(6.2470) 3deg:(6.2295) 4deg:(6.2121) 5deg:(6.1946) 6deg:(6.1772) 7deg:(6.1598)' 'Default value for overturning is 4 deg.' 'DeltaLocking must be set individualy for each dock' 'If the connection is set up for high torque load it takes some extra overturning to secure the hook. Use 5 or 6 values' DeltaLocking3≔p[0,0,0,0,0,6.2295] DeltaLocking4≔p[0,0,0,0,0,6.2121] DeltaLocking5≔p[0,0,0,0,0,6.1946] DeltaLocking6≔p[0,0,0,0,0,6.1772] DeltaLocking7≔p[0,0,0,0,0,6.1598] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'DockSetUp' '(see under Dock-X: ''DockXDeltaTrans'')' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Data in this section is used for small adjustments to the pose for the docking station. Used for adjusting a docking station' 'Default for Dock Adjust is to use 0.333 deg. (1/3 deg.)' 1/3deg 'Pose to give 0.3 deg rotation (0.005 rad)' Xcw≔p[0,0,0,6.278,0,0] Xccw≔p[0,0,0,0.005,0,0] Ycw≔p[0,0,0,0,6.278,0] Yccw≔p[0,0,0,0,0.005,0] Zcw≔p[0,0,0,0,0,6.278] Zccw≔p[0,0,0,0,0,0.005] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' '1/2deg' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' Dock A setup 'Warning: Do not change these values!! It will corrupt the program :-)' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_A_Center≔Dock_A_Home 'If ''Dock_A_Home'' is lost, unsuppress next step and restart the program' 'Dock_A_Center≔p[0.169,-0.335,0.065,0.3277,-1.5561,-0.272]' 'BackUp 15/1 2020: : 0.169,-0.335,0.065,0.3277,-1.5561,-0.272' 'SmartLAB at Aalborg University' Dock_A_BackUp≔p[0.169,-0.335,0.065,0.3270,-1.55610,-0.27200] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_A_Front≔pose_trans(Dock_A_Center, DeltaFront) Dock_A_Back≔pose_trans(Dock_A_Center,DeltaBack) Dock_A_Start≔pose_trans(Dock_A_Center, DeltaStart) Dock_A_Open≔pose_trans(Dock_A_Center, DeltaOpen) 'Locking can be set to be more agressive by changing to ''5'' or ''6'' version for ''DeltaLocking''. Default is 4' '''Delta Locking''' 'Dock_A_Locking≔pose_trans(Dock_A_Center, DeltaLocking3)' Dock_A_Locking≔pose_trans(Dock_A_Center, DeltaLocking4) 'Dock_A_Locking≔pose_trans(Dock_A_Center, DeltaLocking5)' 'Dock_A_Locking≔pose_trans(Dock_A_Center, DeltaLocking6)' 'Dock_A_Locking≔pose_trans(Dock_A_Center, DeltaLocking7)' Dock_A_Opening≔pose_trans(Dock_A_Center, DeltaOpening) Dock B setup 'Warning: Do not change these values!! It will currupt the program :-)' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_B_Center≔Dock_B_Home 'If ''Dock_B_Home'' is lost, unsuppress next step to restart' 'Dock_B_Center≔p[0.108,-0.558,0.065,1.4854,2.9667,2.4629]' 'BackUp 15/1 2020: : 0.108, -0.558, 0.065, 1.4854, 2.9667, 2.4629' 'SmartLAB at Aalborg University' Dock_B_BackUp≔p[0.108,-0.558,0.065,1.4854,2.9667,2.4629] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_B_Front≔pose_trans(Dock_B_Center, DeltaFront) Dock_B_Back≔pose_trans(Dock_B_Center,DeltaBack) Dock_B_Start≔pose_trans(Dock_B_Center, DeltaStart) Dock_B_Open≔pose_trans(Dock_B_Center, DeltaOpen) 'Locking can be set to be more agressive by changing to ''5'' or ''6'' version for ''DeltaLocking''. Default is 4' '''Delta Locking''' 'Dock_B_Locking≔pose_trans(Dock_B_Center, DeltaLocking3)' Dock_B_Locking≔pose_trans(Dock_B_Center, DeltaLocking4) 'Dock_B_Locking≔pose_trans(Dock_B_Center, DeltaLocking5)' 'Dock_B_Locking≔pose_trans(Dock_B_Center, DeltaLocking6)' 'Dock_B_Locking≔pose_trans(Dock_B_Center, DeltaLocking7)' Dock_B_Opening≔pose_trans(Dock_B_Center, DeltaOpening) Dock C setup 'Warning: Do not change these values!! It will corrupt the program :-)' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_C_Center≔Dock_C_Home 'If ''Dock_C_Home'' is lost, unsuppress next step to restart' 'Dock_C_Center≔p[-0.062,-0.5654,0.064,1.8451,2.2266,2.537]' 'BackUp 15/1 2020: : -0.062, -0.5654, 0.064, 1.8451, 2.226, 2.537' 'SmartLAB at Aalborg University' Dock_C_BackUp≔p[-0.062,-0.5654,0.064,1.8451,2.226,2.537] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_C_Front≔pose_trans(Dock_C_Center, DeltaFront) Dock_C_Back≔pose_trans(Dock_C_Center,DeltaBack) Dock_C_Start≔pose_trans(Dock_C_Center, DeltaStart) Dock_C_Open≔pose_trans(Dock_C_Center, DeltaOpen) 'Locking can be set to be more agressive by changing to ''5'' or ''6'' version for ''DeltaLocking''. Default is 4' '''Delta Locking''' 'Dock_C_Locking≔pose_trans(Dock_C_Center, DeltaLocking3)' Dock_C_Locking≔pose_trans(Dock_C_Center, DeltaLocking4) 'Dock_C_Locking≔pose_trans(Dock_C_Center, DeltaLocking5)' 'Dock_C_Locking≔pose_trans(Dock_C_Center, DeltaLocking6)' 'Dock_C_Locking≔pose_trans(Dock_C_Center, DeltaLocking7)' Dock_C_Opening≔pose_trans(Dock_C_Center, DeltaOpening) Dock D setup 'Warning: Do not change these values!! It will corrupt the program :-)' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_D_Center≔Dock_D_Home 'If ''Dock_D_Home'' is lost, unsuppress next step to restart' 'Dock_D_Center≔p[0.11029,0.34475,0.73566,-0.02545,0.00984,1.97563]' 'BackUp 15/1 2020: : (not valid)' 'SmartLAB at Aalborg University' Dock_D_BackUp≔p[0.11103,0.34408,0.73569,-0.02553,0.00977,1.95934] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' Dock_D_Front≔pose_trans(Dock_D_Center, DeltaFront) Dock_D_Back≔pose_trans(Dock_D_Center,DeltaBack) Dock_D_Start≔pose_trans(Dock_D_Center, DeltaStart) Dock_D_Open≔pose_trans(Dock_D_Center, DeltaOpen) 'Locking can be set to be more agressive by changing to ''5'' or ''6'' version for ''DeltaLocking''. Default is 4' '''Delta Locking''' 'Dock_D_Locking≔pose_trans(Dock_D_Center, DeltaLocking3)' Dock_D_Locking≔pose_trans(Dock_D_Center, DeltaLocking4) 'Dock_D_Locking≔pose_trans(Dock_D_Center, DeltaLocking5)' 'Dock_D_Locking≔pose_trans(Dock_D_Center, DeltaLocking6)' 'Dock_D_Locking≔pose_trans(Dock_D_Center, DeltaLocking7)' Dock_D_Opening≔pose_trans(Dock_D_Center, DeltaOpening) Dock X setup 'Dock-X is a temporary dock, used for setting up docking stations' 'Some data and settings used for setting up docking stations. General data for docking stations can be found under ''Docking setup''' '''DockXDeltaTrans'' is the micro steps used for fine tuning docking stations (in mm). Default: 0.5' DockXDeltaTrans≔0.50 '''UserAdjustments'' must have a value for the loop to start' UserXAdjustment≔13 Dock_X_Center≔p[0.3,0,0.5,0.8,3,0] 'Default: 0.3 , 0 , 0.5 , 0.8 , 3 , 0' 'This is a set of waypoints used for setting up Docking Stations (Dock-X)' Dock_X_Front≔pose_trans(Dock_X_Center, DeltaFront) Dock_X_Back≔pose_trans(Dock_X_Center,DeltaBack) Dock_X_Start≔pose_trans(Dock_X_Center, DeltaStart) Dock_X_Open≔pose_trans(Dock_X_Center, DeltaOpen) 'Locking can be set to be more aggressive by changing to ''5'' or ''6'' version for ''DeltaLocking''. Default is 3' '''Delta Locking''' 'Dock_X_Locking≔pose_trans(Dock_X_Center, DeltaLocking3)' Dock_X_Locking≔pose_trans(Dock_X_Center, DeltaLocking4) 'Dock_X_Locking≔pose_trans(Dock_X_Center, DeltaLocking5)' 'Dock_X_Locking≔pose_trans(Dock_X_Center, DeltaLocking6)' 'Dock_X_Locking≔pose_trans(Dock_X_Center, DeltaLocking7)' Dock_X_Opening≔pose_trans(Dock_X_Center, DeltaOpening) Dock M setup 'Dock M is for manual tool changing. The robot arm will stop at this position to let the operator replace and/or mount a tool. ' 'When a tool is manual mounted the program will check that the hook is locked and read out the ID for the tool' 'Manually operation of the tool changer will only be allowed when "ToolFree" is set to 1' 'Warning: Values and waypoints are linked to this position. They may need update if you change these values!! ' Dock_M_Center≔p[0.14,-0.2,0.55,0.25,0.76,6.16] "Ready" setup '"Ready" is the pose where the program switch control from the Kelvin program over to subprograms and back again' 'Subprograms start and end near this point (pose)' 'Programs for changing tools start with one tool at this point and end here again after the robot switch to another tool' Ready≔p[-0.1,-0.3,0.4,1.2,2.9,0] 'Ready BackUp: (-0.1,-0.3,0.4,1.2,2.9,0)' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'A series of waypoints are used to bring the robot arm and tools safety between the Ready pose and the docking stations (Front Door)' 'These waypoints are hard coded with a name and pose (simple waypoints can be lost in back-up)' 'Naming of these waypoints follow a scheme of "Ready_(number)_(dock)". Lowest number is closest to Ready' 'Right before drop-off (typical #3) the tool will be put in the configuration for parking (e.g. closing gripper)' 'Right after pick-up (typical #3) the tool will be initialized and tested (e.g. open and closing gripper)' 'Waypoints for ''Ready to FrontDoor''. Low numbers are close to ''Ready''' Ready_1_A≔p[0.03,-0.325,0.365,1.278,3.08,-0.145] Ready_2_A≔p[0.104,-0.338,0.276,1.424,3.936,-1.305] Ready_3_A≔p[0.13,-0.338,0.2,0.0025,-1.7417,0.0661] Ready_1_B≔p[0.035,-0.358,0.4,1.2,2.9,0] Ready_2_B≔p[0.085,-0.515,0.253,1.557,2.905,1.078] Ready_3_B≔p[0.09,-0.55,0.217,1.33,3.13,1.89] Ready_1_C≔p[-0.085,-0.358,0.4,1.2,2.9,0] Ready_2_C≔p[-0.072,-0.515,0.253,2.258,2.368,1.088] Ready_3_C≔p[-0.065,-0.55,0.217,1.985,2.317,1.967] Ready_1_D≔p[0,0,0,0,0,0] Ready_2_D≔p[0,0,0,0,0,0] Ready_3_D≔p[0,0,0,0,0,0] Ready_1_M≔p[-0.1,-0.28,0.4,1.35,2.48,-0.137] Ready_2_M≔p[0.060,-0.32,0.37,0.71,2.075,-0.158] Ready_3_M≔p[0.06,-0.33,0.51,0.25,0.84,-0.207] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Waypoints between BackDoors. Low number is closest to first dock' BackA_1_B≔p[0.218,-0.394,0.2,1.428,3.99,-1.632] BackA_2_B≔p[0.184,-0.588,0.2,3.6,2.88,0.75] BackA_1_C≔p[0.218,-0.394,0.200,1.428,3.99,-1.632] BackA_2_C≔p[-0.026,-0.613,0.200,3.822,1.457,1.885] BackA_1_D≔p[0,0,0,0,0,0] BackA_2_D≔p[0,0,0,0,0,0] BackA_1_M≔p[0.195,-0.33,0.186,1.428,3.99,-1.632] BackA_2_M≔p[0.03,-0.31,0.41,0.419,-0.79,0.203] BackA_1_R≔p[0.2,-0.335,0.160,1.27,4.168,-1.332] BackA_2_R≔p[0.02,-0.435,0.350,3.253,2.565,-0.43] BackB_1_C≔p[0.063,-0.613,0.169,3.769,2.435,1.166] BackB_2_C≔p[-0.026,-0.613,0.169,3.822,1.457,1.885] BackB_1_D≔p[0,0,0,0,0,0] BackB_2_D≔p[0,0,0,0,0,0] BackB_1_M≔p[0.109,-0.576,0.187,3.74,2.55,1.06] BackB_2_M≔p[0.059,-0.4778,0.256,1.305,1.66,1.214] BackB_1_R≔p[0.112,-0.59,0.195,3.56,2.56,1.41] BackB_2_R≔p[0.02,-0.44,0.33,3.58,1.75,0.64] BackC_1_D≔p[0,0,0,0,0,0] BackC_2_D≔p[0,0,0,0,0,0] BackC_1_M≔p[-0.075,-0.58,0.187,3.805,1.307,1.944] BackC_2_M≔p[0.059,-0.478,0.256,1.3305,1.66,1.214] BackC_1_R≔p[-0.07,-0.59,0.17,3.68,1.38,2.01] BackC_2_R≔p[-0.025,-0.45,0.33,3.55,1.21,1.0] BackD_1_M≔p[0,0,0,0,0,0] BackD_2_M≔p[0,0,0,0,0,0] BackD_1_R≔p[0,0,0,0,0,0] BackD_2_R≔p[0,0,0,0,0,0] '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'More poses for the robot arm may be set up here' Pneumatics 'Info on the pneumatic control system' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Setting the pneumatic valves' 'Pneumatic valves can be on 5-3 valve with closed center position or two 3-2 valves. Two 3-2 valves will make it possible to control each line individual' 'AO[0] is the pneumatic supply for line A. Set to "0" to stop flow (under "I/O" analog_out[0] most be set to voltage)' Set AO[0]=4.0 'AO[1] is the pneumatic supply for line B. Set to "0" to stop flow (under "I/O" analog_out[0] most be set to voltage)' Set AO[1]=4.0 'Warning: If AO(1) is 4.0 all ''0 volt'' settings in the program have changed to 4.0V!!!' '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'To make it easy to program the operation of the valves pneumatics can be set with the "Pneu" variable' 'Pneu_A=0 means that line A is closed and Pneu_A=1 that it is open' 'With 5-3 valve A and B can't be open at the same time. With two 3-2 valves they can!' Pneu_A≔0 Pneu_B≔0 '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -' 'Pressure control:' 'If the pneumatics is set up with an electric pressure controler this program will set the pressure' 'Thread_3 is transforming the P_Pneu value into a voltage (P_Volt) for the regulator' 'P_pneu is the air pressure (value in bar) wanted by the programmer. Set to '0' for startup' 'P_Pneu≔0' 'P_Glue, P_Sealing, P_Vacu: Use for setting pressure level in SubPrograms. More predefined values can be added here' 'P_Vacu≔0' 'P_Glue≔0' 'P_Sealing≔0' 'P_Volt is the voltage setting for the regulator' 'Volt2Bar is setting a voltage for the pneumatic regulator from the pressure wanted (depending on the pressure regulator)' Volt2Bar≔0.115 Robot Program '''Kelvin'' shell program is running in an closed Loop. ''Kelvin Action'' parameter is used to start the different subprograms' 'Run Kelvin program #40 for more information' Loop 1: Start-Up procedure 'Routine for start-up of the Kelvin Tool Changer demo program' 'The robot will initialize and move to the starting position, but first we turn off pneumatics' 'After initalization and moving to start point (Ready) we show a list of jobs' If Kelvin_Action≟1 Pneu_A≔0 Pneu_B≔0 Wait: 0.2 Welcome Popup If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup MoveJ StartIniWaypnt 'StartIniWaypoint is same position as ''Ready''' 'This waypoint is in the same position as "Ready" but force the robot to have all joints in the right positions' 'This waypoint is typical lost if the program is moved or installed from a backup. Move the robot arm to the "Work Place" and set a new waypoint here' Ready 2: Free If Kelvin_Action≟2 Wait: 0.2 Popup 3: Free If Kelvin_Action≟3 Wait: 0.2 Popup 4: Free If Kelvin_Action≟4 Wait: 0.2 Popup 5: Free If Kelvin_Action≟5 Wait: 0.2 Popup 6: Free If Kelvin_Action≟6 Wait: 0.2 Popup 7: Free If Kelvin_Action≟7 Wait: 0.2 Popup 8: Free If Kelvin_Action≟8 Wait: 0.2 Popup 9: Free If Kelvin_Action≟9 Wait: 0.2 Popup 10: Work with Tool-A If Kelvin_Action≟10 ToolFree≔1 Wait: 0.2 Popup Call HookCheckOpen Call Transit_Ready_to_A_Back Call HookCheckOpen Call Dock_A_PickUp Call Check_Tool_A_ID ToolFree≔0 Call Transit_A_Front_to_Ready Popup 'Insert program steps and link to sub-program here' Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_Ready 11: Work with Tool-B If Kelvin_Action≟11 Wait: 0.2 Popup Call HookCheckOpen Call Transit_Ready_to_B_Back Call HookCheckOpen Call Dock_B_PickUp Call Check_Tool_B_ID ToolFree≔0 Call Transit_B_Front_to_Ready Popup 'Insert program steps and link to sub-program here' Call Transit_Ready_to_B_Front Call Check_Tool_B_ID ToolFree≔1 Call Dock_B_DropOff Call Transit_B_Back_to_Ready 12: Work with Tool-C If Kelvin_Action≟12 Wait: 0.2 Popup Call HookCheckOpen Call Transit_Ready_to_C_Back Call HookCheckOpen Call Dock_C_PickUp Call Check_Tool_C_ID ToolFree≔0 Call Transit_C_Front_to_Ready Popup 'Insert program steps and link to sub-program here' Call Transit_Ready_to_C_Front Call Check_Tool_C_ID ToolFree≔1 Call Dock_C_DropOff Call Transit_C_Back_to_Ready 13: Work with Tool-ABC If Kelvin_Action≟13 Wait: 0.2 Popup ToolFree≔1 Call Transit_Ready_to_A_Back Call HookCheckOpen Call Dock_A_PickUp Call Check_Tool_A_ID ToolFree≔0 Call Transit_A_Front_to_Ready Wait: 2.0 Loop 1 times Switch A2B Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_B_Back Call HookCheckOpen Call Dock_B_PickUp Call HookCheckClosed Call Check_Tool_B_ID ToolFree≔0 Call Transit_B_Front_to_Ready Wait: 2.0 Switch B2C Call Transit_Ready_to_B_Front Call Check_Tool_B_ID ToolFree≔1 Call Dock_B_DropOff Call Transit_B_Back_to_C_Back Call HookCheckOpen Call Dock_C_PickUp Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call Transit_C_Front_to_Ready Wait: 2.0 Switch C2A Call Transit_Ready_to_C_Front Call Check_Tool_C_ID ToolFree≔1 Call Dock_C_DropOff Call Transit_C_Back_to_A_Back Call HookCheckOpen Call Dock_A_PickUp Call HookCheckClosed Call Check_Tool_A_ID ToolFree≔0 Call Transit_A_Front_to_Ready Wait: 2.0 Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_Ready 14: Manual Tool Change If Kelvin_Action≟14 ToolFree≔1 Popup Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Popup Call HookCheckClosed Call DetectToolID Call HookCheckClosed Call Dock_M_PickUp Call Transit_Dock_M_to_Ready ToolFree≔1 Popup 15: Free If Kelvin_Action≟15 Wait: 0.2 Popup 16: Free If Kelvin_Action≟16 Wait: 0.2 Popup 17: Free If Kelvin_Action≟17 Wait: 0.2 Popup 18: Free If Kelvin_Action≟18 Wait: 0.2 Popup 19: Free If Kelvin_Action≟19 Wait: 0.2 Popup 20: Free If Kelvin_Action≟20 Wait: 0.2 Popup 40: Info If Kelvin_Action≟40 Popup Popup Popup Popup Popup Popup Popup 'Popup' Popup 41: Tool Service If Kelvin_Action≟41 Wait: 0.2 Loop ToolService≠0 20: Start Tool Service If ToolService≟20 Popup Popup Popup Popup Wait: 0.2 1: Dock-A to Dock-M If ToolService≟1 Popup If analog_in[3]>0.5*Tool_ID_Adjust Popup ToolService≔9 Else Call HookCheckOpen Call Transit_Ready_to_A_Back Call Dock_A_PickUp Call HookCheckClosed Call Check_Tool_A_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_A_ID Call Transit_A_Front_to_Ready Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Popup Call HookCheckOpen Call Transit_Dock_M_to_Ready 2: Dock-B to Dock-M If ToolService≟2 Popup If analog_in[3]>0.5*Tool_ID_Adjust Popup ToolService≔9 Else Call HookCheckOpen Call Transit_Ready_to_B_Back Call Dock_B_PickUp Call HookCheckClosed Call Check_Tool_B_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_B_ID Call Transit_B_Front_to_Ready Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Popup Call HookCheckOpen Call Transit_Dock_M_to_Ready 3: Dock-C to Dock-M If ToolService≟3 Popup If analog_in[3]>0.5*Tool_ID_Adjust Popup ToolService≔9 Else Call HookCheckOpen Call Transit_Ready_to_C_Back Call Dock_C_PickUp Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_C_ID Call Transit_C_Front_to_Ready Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Popup Call HookCheckOpen Call Transit_Dock_M_to_Ready 4: Dock-D to Dock-M If ToolService≟4 Popup If analog_in[3]>0.5*Tool_ID_Adjust Popup ToolService≔9 Else Call HookCheckOpen Call Transit_Ready_to_D_Back Call Dock_D_PickUp Call HookCheckClosed Call Check_Tool_D_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_D_ID Call Transit_D_Front_to_Ready Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Popup Call HookCheckOpen Call Transit_Dock_M_to_Ready 5: Dock-M to Dock-A If ToolService≟5 Popup Call Transit_Ready_to_Dock_M ToolFree≔1 Popup Call HookCheckClosed Call Check_Tool_A_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_A_ID Call Transit_Dock_M_to_Ready Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_Ready 6: Dock-M to Dock-B If ToolService≟6 Popup Call Transit_Ready_to_Dock_M ToolFree≔1 Popup Call HookCheckClosed Call Check_Tool_B_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_B_ID Call Transit_Dock_M_to_Ready Call Transit_Ready_to_B_Front Call Check_Tool_B_ID ToolFree≔1 Call Dock_B_DropOff Call Transit_B_Back_to_Ready 7: Dock-M to Dock-C If ToolService≟7 Popup Call Transit_Ready_to_Dock_M ToolFree≔1 Popup Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_C_ID Call Transit_Dock_M_to_Ready Call Transit_Ready_to_C_Front Call Check_Tool_C_ID ToolFree≔1 Call Dock_C_DropOff Call Transit_C_Back_to_Ready 8: Dock-M to Dock-D If ToolService≟8 Popup Call Transit_Ready_to_Dock_M ToolFree≔1 Popup Call HookCheckClosed Call Check_Tool_D_ID ToolFree≔0 Call HookCheckClosed Call Check_Tool_D_ID Call Transit_Dock_M_to_Ready Call Transit_Ready_to_D_Front Call Check_Tool_D_ID ToolFree≔1 Call Dock_D_DropOff Call Transit_D_Back_to_Ready 9: R-2-M: Mount tool If ToolService≟9 Popup Call Transit_Ready_to_Dock_M 'Call Dock_M_DropOff' Popup Call HookCheckClosed Call DetectToolID Call Dock_M_PickUp Call Transit_Dock_M_to_Ready ToolFree≔1 10: R-2-M: Remove tool If ToolService≟10 Popup Call Transit_Ready_to_Dock_M ToolFree≔1 Call Dock_M_DropOff Popup Call HookCheckOpen 'Call Dock_M_PickUp' Call Transit_Dock_M_to_Ready 11: R-2-M: Replace tool If ToolService≟11 Popup Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Popup Call HookCheckClosed Call DetectToolID Call Dock_M_PickUp Call Transit_Dock_M_to_Ready ToolFree≔1 0: End Tool Service If ToolService≟0 '''0: End program'' must be last step in the Tool Service loop' 'This routine can close down the DockSetUp program. It also checks for non-valid user input and ask for next task. Valid input must be in the 'ElseIf' string' ElseIf ToolService≟0 or ToolService≟1 or ToolService≟2 or ToolService≟3 or ToolService≟4 or ToolService≟5 or ToolService≟6 or ToolService≟7 or ToolService≟8 or ToolService≟9 or ToolService≟10 or ToolService≟11 or ToolService≟20 Wait: 0.5 Else Popup Wait: 0.5 ToolService≔'Tool Service task number: (''20'': Menu ''0'': End)' Wait: 0.2 42: Dock SetUp and Adjust If Kelvin_Action≟42 'This loop runs the setup operation. ''0'' end the loop and go back to the Kelvin menu' 'Some steps depend on user indput, others are done automaticaly by setting a value for ''DockSetUp''' Popup Loop DockSetUp≠0 10: Start Dock SetUp If DockSetUp≟10 Popup Wait: 0.2 1: SetUp New Dock If DockSetUp≟1 Popup Popup Wait: 10.0 Popup Popup Popup Halt 2: Dock Adjust If DockSetUp≟2 Popup Popup MoveJ Ready Popup Dock4SetUp≔'Dock to adjust: 1:A 2:B 3:C 4:D (Exit: ''0'')' 'We need a copy to control the program' If Dock4SetUp≟0 Popup 'Next we kill the Dock SetUp routine and go back to Kelvin menu' DockSetUp≔0 Dock4Adjust≔Dock4SetUp Popup Loop 1 times If Dock4Adjust≟1 Call Transit_Ready_to_A_Front Popup MoveL Dock_A_Front Dock_A_Center Popup If Dock4Adjust≟2 Call Transit_Ready_to_B_Front Popup MoveL Dock_B_Front Dock_B_Center Popup If Dock4Adjust≟3 Call Transit_Ready_to_C_Front Popup MoveL Dock_C_Front Dock_C_Center Popup If Dock4Adjust≟4 Call Transit_Ready_to_D_Front Popup MoveL Dock_D_Front Dock_D_Center Popup If Dock4Adjust≟99 Popup DockSetUp≔0 If Dock4Adjust≟0 Popup ElseIf Dock4Adjust≟0 or Dock4Adjust≟1 or Dock4Adjust≟2 or Dock4Adjust≟3 or Dock4Adjust≟4 or Dock4Adjust≟10 or Dock4Adjust≟99 Wait: 0.2 Else Popup 'When tool in dock we go on to next step' '''DockSetUp'' set to 3 for next step' DockSetUp≔3 3: ManualDockAdjustments 'This routine will help the operator to fine tune the alignment of the Tool Changer to the Dock Station' 'The step size in this adjustment can be changede by setting a new value for 'DeltaTrans' and unsuppres a rotation value in the 'BeforeStart' section' If DockSetUp≟3 Wait: 0.2 If Dock4Adjust≟99 Popup DockSetUp≔0 Wait: 0.2 If Dock4Adjust≟88 Popup MoveL Dock_X_Front Dock_X_Center Popup Popup Popup Popup Loop UserXAdjustment≠0 DockXCenterBeta≔get_actual_tcp_pose() If UserXAdjustment≟1 DockXCenter1≔pose_trans(DockXCenterBeta, p[-DockXDeltaTrans/1000*0.9272,-DockXDeltaTrans/1000*0.3746,0,0,0,0]) MoveL DockXCenterBeta DockXCenter1 Wait: 0.5 If UserXAdjustment≟2 DockXCenter2≔pose_trans(DockXCenterBeta, p[DockXDeltaTrans/1000*0.9272,DockXDeltaTrans/1000*0.3746,0,0,0,0]) MoveL DockXCenterBeta DockXCenter2 Wait: 0.2 If UserXAdjustment≟3 DockXCenter3≔pose_trans(DockXCenterBeta, p[-DockXDeltaTrans/1000*0.3746,DockXDeltaTrans/1000*0.9272,0,0,0,0]) MoveL DockXCenterBeta DockXCenter3 Wait: 0.2 If UserXAdjustment≟4 DockXCenter4≔pose_trans(DockXCenterBeta, p[DockXDeltaTrans/1000*0.3746,-DockXDeltaTrans/1000*0.9272,0,0,0,0]) MoveL DockXCenterBeta DockXCenter4 Wait: 0.2 If UserXAdjustment≟5 DockXCenter5≔pose_trans(DockXCenterBeta, p[0,0,DockXDeltaTrans/1000,0,0,0]) MoveL DockXCenterBeta DockXCenter5 Wait: 0.2 If UserXAdjustment≟6 DockXCenter6≔pose_trans(DockXCenterBeta, p[0,0,-DockXDeltaTrans/1000,0,0,0]) MoveL DockXCenterBeta DockXCenter6 Wait: 0.5 If UserXAdjustment≟7 DockXCenter7≔pose_trans(DockXCenterBeta, Xccw) MoveL DockXCenterBeta DockXCenter7 Wait: 0.2 If UserXAdjustment≟8 DockXCenter8≔pose_trans(DockXCenterBeta, Xcw) MoveL DockXCenterBeta DockXCenter8 Wait: 0.2 If UserXAdjustment≟9 DockXCenter9≔pose_trans(DockXCenterBeta, Yccw) MoveL DockXCenterBeta DockXCenter9 Wait: 0.2 If UserXAdjustment≟10 DockXCenter10≔pose_trans(DockXCenterBeta, Ycw) MoveL DockXCenterBeta DockXCenter10 Wait: 0.2 If UserXAdjustment≟11 DockXCenter11≔pose_trans(DockXCenterBeta, Zccw) MoveL DockXCenterBeta DockXCenter11 Wait: 0.2 If UserXAdjustment≟12 DockXCenter12≔pose_trans(DockXCenterBeta, Zcw) MoveL DockXCenterBeta DockXCenter12 Wait: 0.2 If UserXAdjustment≟0 Popup ElseIf UserXAdjustment≟0 or UserXAdjustment≟1 or UserXAdjustment≟2 or UserXAdjustment≟3 or UserXAdjustment≟4 or UserXAdjustment≟5 or UserXAdjustment≟6 or UserXAdjustment≟7 or UserXAdjustment≟8 or UserXAdjustment≟9 or UserXAdjustment≟10 or UserXAdjustment≟11 or UserXAdjustment≟12 or UserXAdjustment≟13 Wait: 0.2 Else Popup UserXAdjustment≔'Fine tune command: (Exit: ''0'')' Wait: 0.2 UserXAdjustment≔13 Popup Dock_X_Home≔get_actual_tcp_pose() Dock_X_Center≔Dock_X_Home Dock_X_Front≔pose_trans(Dock_X_Center, DeltaFront) Dock_X_Back≔pose_trans(Dock_X_Center,DeltaBack) Dock_X_Start≔pose_trans(Dock_X_Center, DeltaStart) Dock_X_Open≔pose_trans(Dock_X_Center, DeltaOpen) Dock_X_Locking≔pose_trans(Dock_X_Center, DeltaLocking4) Dock_X_Opening≔pose_trans(Dock_X_Center, DeltaOpening) MoveL Dock_X_Center Dock_X_Front DockSetUp≔4 Dock4Adjust≔88 4: TestDrive Slow If DockSetUp≟4 If Dock4Adjust≟99 Popup DockSetUp≔0 Wait: 0.2 Popup Wait: 0.5 MoveL Dock_X_Front Dock_X_Start Dock_X_Opening Dock_X_Open Dock_X_Back Wait: 1.0 Dock_X_Back Dock_X_Open Dock_X_Locking Dock_X_Center Wait: 1.0 Dock_X_Center Dock_X_Front Popup 5: TestDrive Fast If DockSetUp≟5 If Dock4Adjust≟99 Popup DockSetUp≔0 Wait: 0.2 Popup Wait: 0.5 MoveL Dock_X_Front Dock_X_Start Dock_X_Opening Dock_X_Open Dock_X_Back Wait: 0.5 Dock_X_Back Dock_X_Open Dock_X_Locking Dock_X_Center Wait: 0.5 Dock_X_Center Dock_X_Front Wait: 0.5 MoveL Dock_X_Front Dock_X_Start Dock_X_Opening Dock_X_Open Dock_X_Back Wait: 0.5 Dock_X_Back Dock_X_Open Dock_X_Locking Dock_X_Center Wait: 0.5 Dock_X_Center Dock_X_Front Popup 6: Save setting If DockSetUp≟6 If Dock4Adjust≟99 Popup DockSetUp≔0 Wait: 0.2 Wait: 0.2 Dock4Adjust≔99 Popup If Dock4SetUp≟1 Popup Dock_A_Home≔Dock_X_Home Dock_A_Center≔Dock_A_Home If Dock4SetUp≟2 Popup Dock_B_Home≔Dock_X_Home Dock_B_Center≔Dock_B_Home If Dock4SetUp≟3 Popup Dock_C_Home≔Dock_X_Home Dock_C_Center≔Dock_C_Home If Dock4SetUp≟4 Popup Dock_D_Home≔Dock_X_Home Dock_D_Center≔Dock_D_Home Popup 'Next we kill the Dock SetUp routine' DockSetUp≔0 0: End DockSetUp program '''0: End program'' must be last step in the DockSetUp loop' 'This routine can close down the DockSetUp program. It also checks for non-valid user input and ask for next task. Valid input must be in the 'ElseIf' string' If DockSetUp≟0 Wait: 0.2 ElseIf DockSetUp≟0 or DockSetUp≟1 or DockSetUp≟2 or DockSetUp≟3 or DockSetUp≟4 or DockSetUp≟5 or DockSetUp≟6 or DockSetUp≟10 Wait: 0.2 Else Popup Wait: 0.5 DockSetUp≔'Programs: 1:New 2:Adjust 3:FineTune 4:Slow 5:Fast 6:Save (Exit: 0)' 43: Save to BackUp If Kelvin_Action≟43 Wait: 0.2 Popup Popup Loop BackUp≠0 If BackUp≟10 Popup If BackUp≟1 Popup Dock_A_BackUp≔Dock_A_Home If BackUp≟2 Popup Dock_B_BackUp≔Dock_B_Home If BackUp≟3 Popup Dock_C_BackUp≔Dock_C_Home If BackUp≟4 Popup Dock_D_BackUp≔Dock_D_Home If BackUp≟0 Wait: 0.2 ElseIf BackUp≟0 or BackUp≟1 or BackUp≟2 or BackUp≟3 or BackUp≟4 or BackUp≟10 Wait: 0.2 Else Popup Wait: 0.2 BackUp≔'BackUp: A:1 B:2 C:3 D:4 (Exit:''0'' Menu:''10'')' 44: Reload from BackUp If Kelvin_Action≟44 Wait: 0.2 Popup Loop ReLoad≠0 If ReLoad≟10 Popup If ReLoad≟1 Popup Dock_A_Home≔Dock_A_BackUp Dock_A_Center≔Dock_A_Home If ReLoad≟2 Popup Dock_B_Home≔Dock_B_BackUp Dock_B_Center≔Dock_B_Home If ReLoad≟3 Popup Dock_C_Home≔Dock_C_BackUp Dock_C_Center≔Dock_C_Home If ReLoad≟4 Popup Dock_D_Home≔Dock_D_BackUp Dock_D_Center≔Dock_D_Home If ReLoad≟0 Wait: 0.2 Popup ElseIf ReLoad≟0 or ReLoad≟1 or ReLoad≟2 or ReLoad≟3 or ReLoad≟4 or ReLoad≟10 Wait: 0.2 Else Popup ReLoad≔'Reload: A:1 B:2 C:3 D:4 (Exit:''0'' Menu:''10'')' 45: Pause If Kelvin_Action≟45 'Program just wait for 10 seconds. Can be used to open ''Move'' or ''I/O'' in the background' Popup Wait: 10.0 Popup 'This step only sends you on to the menu in Step-0 (next step)' 46: Langauge If Kelvin_Action≟46 Wait: 0.2 'Traslation from English to German, Frence an Spanish is based on Google Translate.' 'Default langauge can be set in ''General setup for Tool Changer''' Popup Lang≔'DK:1 UK:2 GE:3 FR:4 ES:5' Sprog PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'If a user enter a invalid langauge numberthe langauge is set to English' Lang≔2 77: Quick Menu If Kelvin_Action≟77 Wait: 0.2 'Insert your favorit programs in the popup' Popup 'This step only sends you on to thoose next program in step #0' 88: Full Menu If Kelvin_Action≟88 Wait: 0.2 Popup Popup Popup Popup Popup Popup Popup Popup 'After this step user is send to step #0 to thoose next program' 99: Short Menu If Kelvin_Action≟99 Wait: 0.2 'This step only sends you on to thoose next program in next step (#0). No listing of program numbers' 0: End program '''0: End program'' (this step) must be last step in the Kelvin Action loop' 'This routine can close down the Kelvin shell program' 'It also checks for non-valid user input and ask for next task' 'Valid input must be listed in the 'ElseIf' string' If Kelvin_Action≟0 Farewell Popup If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Ending the Tool Changer program. Restart ''Kelvin.urp'' to get the shell program back' Halt ElseIf Kelvin_Action≟0 or Kelvin_Action≟1 or Kelvin_Action≟2 or Kelvin_Action≟3 or Kelvin_Action≟4 or Kelvin_Action≟5 or Kelvin_Action≟6 or Kelvin_Action≟7 or Kelvin_Action≟8 or Kelvin_Action≟9 or Kelvin_Action≟10 or Kelvin_Action≟11 or Kelvin_Action≟12 or Kelvin_Action≟13 or Kelvin_Action≟14 or Kelvin_Action≟15 or Kelvin_Action≟16 or Kelvin_Action≟17 or Kelvin_Action≟18 or Kelvin_Action≟19 or Kelvin_Action≟20 or Kelvin_Action≟40 or Kelvin_Action≟41 or Kelvin_Action≟42 or Kelvin_Action≟43 or Kelvin_Action≟44 or Kelvin_Action≟45 or Kelvin_Action≟46 or Kelvin_Action≟77 or Kelvin_Action≟88 or Kelvin_Action≟99 Wait: 0.2 Else 'This popup is shown if the user enter a invalid program number' Try Again Popup If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup Menu Popup 'This popup is shown right before the user must input a number for the next program' If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup LoopReStarter 'Some program loops need to be reset to run more than one time' ToolService≔20 BackUp≔10 ReLoad≔10 DockSetUp≔10 Kelvin_Action≔'Kelvin program: (''88'' for menu, ''0'' to end program)' Halt '- - - - - Game Over - - - - Fine - - - - The End - - - - Slut - - - - - - - - - - - - -' Stop-Popup-39 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' Halt 'Halt command here to prevent the robot to execute not suppressed SubFunctions' SubFunctions 'SubFunctions to be used for building the main program' 'SubFunctions here are only backup versions of the functions used in the main program. Copy-paste into main program' 'Copy-paste into main program' Halt 'Halt command here to prevent the robot to execute not suppressed SubFunctions' 'Switch functions drop-off the first tool and pick-up the next tool' 'All switch functions check the Tool ID by using the function that check the Tool ID for a docking station' 'Tool-ID check can be overruled in popup' Switch A2B Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_B_Back Call HookCheckOpen Call Dock_B_PickUp Call HookCheckClosed Call Check_Tool_B_ID ToolFree≔0 Call Transit_B_Front_to_Ready Switch A2C Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_C_Back Call HookCheckOpen Call Dock_C_PickUp Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call Transit_C_Front_to_Ready Switch A2D Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_D_Back Call HookCheckOpen Call Dock_D_PickUp Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call Transit_D_Front_to_Ready Switch A2M Call Transit_Ready_to_A_Front Call Check_Tool_A_ID ToolFree≔1 Call Dock_A_DropOff Call Transit_A_Back_to_M_Dock Call HookCheckOpen Call Dock_M_PickUp Call HookCheckClosed Call DetectToolID Call Transit_Dock_M_to_Ready Switch B2A Call Transit_Ready_to_B_Front Call Check_Tool_B_ID ToolFree≔1 Call Dock_B_DropOff Call Transit_B_Back_to_A_Back Call HookCheckOpen Call Dock_A_PickUp Call HookCheckClosed Call Check_Tool_A_ID ToolFree≔0 Call Transit_A_Front_to_Ready Switch B2C Call Transit_Ready_to_B_Front Call Check_Tool_B_ID ToolFree≔1 Call Dock_B_DropOff Call Transit_B_Back_to_C_Back Call HookCheckOpen Call Dock_C_PickUp Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call Transit_C_Front_to_Ready Switch B2D Call Transit_Ready_to_B_Front Call Check_Tool_B_ID ToolFree≔1 Call Dock_B_DropOff Call Transit_B_Back_to_D_Back Call HookCheckOpen Call Dock_D_PickUp Call HookCheckClosed Call Check_Tool_D_ID ToolFree≔0 Call Transit_D_Front_to_Ready Switch B2M Call Transit_Ready_to_B_Front Call Check_Tool_B_ID ToolFree≔1 Call Dock_B_DropOff Call Transit_B_Back_to_M_Dock Call HookCheckOpen Call Dock_M_PickUp Call HookCheckClosed Call DetectToolID ToolFree≔0 Call Transit_Dock_M_to_Ready Switch C2A Call Transit_Ready_to_C_Front Call Check_Tool_C_ID ToolFree≔1 Call Dock_C_DropOff Call Transit_C_Back_to_A_Back Call HookCheckOpen Call Dock_A_PickUp Call HookCheckClosed Call Check_Tool_A_ID ToolFree≔0 Call Transit_A_Front_to_Ready Switch C2B Call Transit_Ready_to_C_Front Call Check_Tool_C_ID ToolFree≔1 Call Dock_C_DropOff Call Transit_C_Back_to_B_Back Call HookCheckOpen Call Dock_B_PickUp Call HookCheckClosed Call Check_Tool_B_ID ToolFree≔0 Call Transit_B_Front_to_Ready Switch C2D Call Transit_Ready_to_C_Front Call Check_Tool_C_ID ToolFree≔1 Call Dock_C_DropOff Call Transit_C_Back_to_D_Back Call HookCheckOpen Call Dock_D_PickUp Call HookCheckClosed Call Check_Tool_D_ID ToolFree≔0 Call Transit_D_Front_to_Ready Switch C2M Call Transit_Ready_to_C_Front Call Check_Tool_C_ID ToolFree≔1 Call Dock_C_DropOff Call Transit_C_Back_to_M_Dock Call HookCheckOpen Call Dock_M_PickUp Call HookCheckClosed Call DetectToolID ToolFree≔0 Call Transit_Dock_M_to_Ready Switch D2A Call Transit_Ready_to_D_Front Call Check_Tool_D_ID ToolFree≔1 Call Dock_D_DropOff Call HookCheckOpen Call Transit_D_Back_to_A_Back Call Dock_A_PickUp Call HookCheckClosed Call Check_Tool_A_ID ToolFree≔0 Call Transit_A_Front_to_Ready Switch D2B Call Transit_Ready_to_D_Front Call Check_Tool_D_ID ToolFree≔1 Call Dock_D_DropOff Call Transit_D_Back_to_B_Back Call HookCheckOpen Call Dock_B_PickUp Call HookCheckClosed Call Check_Tool_B_ID ToolFree≔0 Call Transit_B_Front_to_Ready Switch D2C Call Transit_Ready_to_D_Front Call Check_Tool_D_ID ToolFree≔1 Call Dock_D_DropOff Call Transit_D_Back_to_C_Back Call HookCheckOpen Call Dock_C_PickUp Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call Transit_C_Front_to_Ready Switch D2M Call Transit_Ready_to_D_Front Call Check_Tool_D_ID ToolFree≔1 Call Dock_D_DropOff Call Transit_D_Back_to_M_Dock Call HookCheckOpen Call Dock_M_PickUp Call HookCheckClosed Call DetectToolID ToolFree≔0 Call Transit_Dock_M_to_Ready Switch M2A Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Call Transit_M_Dock_to_A_Back Call HookCheckOpen Call Dock_A_PickUp Call HookCheckClosed Call Check_Tool_A_ID ToolFree≔0 Call Transit_A_Front_to_Ready Switch M2B Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Call Transit_M_Dock_to_B_Back Call HookCheckOpen Call Dock_B_PickUp Call HookCheckClosed Call Check_Tool_B_ID ToolFree≔0 Call Transit_B_Front_to_Ready Switch M2C Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Call Transit_M_Dock_to_C_Back Call HookCheckOpen Call Dock_C_PickUp Call HookCheckClosed Call Check_Tool_C_ID ToolFree≔0 Call Transit_C_Front_to_Ready Switch M2D Call Transit_Ready_to_Dock_M Call Dock_M_DropOff Call Transit_M_Dock_to_D_Back Call HookCheckOpen Call Dock_D_PickUp Call HookCheckClosed Call Check_Tool_D_ID ToolFree≔0 Call Transit_D_Front_to_Ready 'SubFunctions in folder. Open folder for more information' 'Thread Programs starts here (Small programs running in the background independent from robot program)' 'Thread-1: Stop program if tool is released' 'Thread-2: Control pneumatic valves' 'Thread-3: Set pneumatic pressure' Thread_1 'This Thread is for securing that a tool is not released during operations' 'Values for "ToolFree" and "HookOpen" is used to deside if the robot should stop' If analog_in[3]<4.0*Tool_ID_Adjust and ToolFree≟0 Popup 'Popup stop program or unsuppress ''Halt'' here' Halt Wait: 0.5 'Thread_2' 'Thread_3' Dock_A_PickUp Set Stop-Popup-40 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_A_Back Dock_A_Open Dock_A_Locking Dock_A_Center Dock_A_Front ToolFree≔0 Dock_A_DropOff Set Stop-Popup-41 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' ToolFree≔1 MoveL Dock_A_Front Dock_A_Start Dock_A_Opening Dock_A_Open Dock_A_Back Dock_B_PickUp Set Stop-Popup-42 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_B_Back Dock_B_Open Dock_B_Locking Dock_B_Center Dock_B_Front ToolFree≔0 Dock_B_DropOff Set Stop-Popup-43 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' ToolFree≔1 MoveL Dock_B_Front Dock_B_Start Dock_B_Opening Dock_B_Open Dock_B_Back Dock_C_PickUp Set Stop-Popup-44 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_C_Back Dock_C_Open Dock_C_Locking Dock_C_Center Dock_C_Front ToolFree≔0 Dock_C_DropOff Set Stop-Popup-45 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' ToolFree≔1 MoveL Dock_C_Front 'If force()>22' Dock_C_Start Dock_C_Opening Dock_C_Open Dock_C_Back Dock_D_PickUp Set Stop-Popup-46 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_D_Back Dock_D_Open Dock_D_Locking Dock_D_Center Dock_D_Front ToolFree≔0 Dock_D_DropOff Set Stop-Popup-47 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' ToolFree≔1 MoveL Dock_D_Front Dock_D_Start Dock_D_Opening Dock_D_Open Dock_D_Back Dock_M_PickUp 'Finish manual tool shift at Dock-M' Set ToolFree≔0 'Restart the live check on the tool connection. Robot will stop if the tool is released after this step' Wait: 0.5 Dock_M_DropOff 'Prepare for manual tool shift at Dock-M' Set ToolFree≔1 'Tool can now be released without trigging a safety stop of the program' Wait: 0.5 Transit_A_Back_to_B_Back Set Stop-Popup-1 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_A_Back BackA_1_B BackA_2_B Dock_B_Back Transit_A_Back_to_C_Back Set Stop-Popup-2 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_A_Back BackA_1_C BackA_2_C Dock_C_Back Transit_A_Back_to_D_Back Set Stop-Popup-3 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_A_Back BackA_1_D BackA_2_D Dock_D_Back Transit_A_Back_to_M_Dock Set Stop-Popup-4 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_A_Back BackA_1_M BackA_2_M Dock_M_Center Transit_A_Back_to_Ready Set Stop-Popup-5 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_A_Back BackA_1_R BackA_2_R Ready Transit_B_Back_to_A_Back Set Stop-Popup-6 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_B_Back BackA_2_B BackA_1_B Dock_A_Back Transit_B_Back_to_C_Back Set Stop-Popup-7 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_B_Back BackB_1_C BackB_2_C Dock_C_Back Transit_B_Back_to_D_Back Set Stop-Popup-8 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_B_Back BackB_1_D BackB_2_D Dock_D_Back Transit_B_Back_to_M_Dock Set Stop-Popup-9 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_B_Back BackB_1_M BackB_2_M Dock_M_Center Transit_B_Back_to_Ready Set Stop-Popup-10 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_B_Back BackB_1_R BackB_2_R Ready Transit_C_Back_to_A_Back Set Stop-Popup-11 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_C_Back BackA_2_C BackA_1_C Dock_A_Back Transit_C_Back_to_B_Back Set Stop-Popup-12 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Dock_C_Back BackB_2_C BackB_1_C Dock_B_Back Transit_C_Back_to_D_Back Set Stop-Popup-13 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_C_Back BackC_1_D BackC_2_D Dock_D_Back Transit_C_Back_to_M_Dock Set Stop-Popup-14 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_C_Back BackC_1_M BackC_2_M Dock_M_Center Transit_C_Back_to_Ready Set Stop-Popup-15 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_C_Back BackC_1_R BackC_2_R Ready Transit_D_Back_to_A_Back Set Stop-Popup-16 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_D_Back BackA_2_D BackA_1_D Dock_B_Back Transit_D_Back_to_B_Back Set Stop-Popup-17 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_D_Back BackB_2_D BackB_1_D Dock_B_Back Transit_D_Back_to_C_Back Set Stop-Popup-18 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_D_Back BackC_2_D BackC_1_D Dock_C_Back Transit_D_Back_to_M_Dock Set Stop-Popup-19 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_D_Back BackD_1_M BackD_2_M Dock_M_Center Transit_D_Back_to_Ready Set Stop-Popup-20 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_D_Back BackD_1_R BackD_2_R Ready Transit_M_Dock_to_A_Back Set Stop-Popup-21 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_M_Center BackA_2_M BackA_1_M Dock_A_Back Transit_M_Dock_to_B_Back Set Stop-Popup-22 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_M_Center BackB_2_M BackB_1_M Dock_B_Back Transit_M_Dock_to_C_Back Set Stop-Popup-23 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_M_Center BackC_2_M BackC_1_M Dock_C_Back Transit_M_Dock_to_D_Back Set Stop-Popup-24 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_M_Center BackD_2_M BackD_1_M Dock_D_Back Transit_Ready_to_A_Back Set Stop-Popup-25 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Ready BackA_2_R BackA_1_R Dock_A_Back Transit_Ready_to_A_Front Set Stop-Popup-26 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Ready Ready_1_A Ready_2_A Ready_3_A Dock_A_Front Transit_A_Front_to_Ready Set Stop-Popup-27 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_A_Front Ready_3_A Ready_2_A Ready_1_A Ready Transit_Ready_to_B_Back Set Stop-Popup-28 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Ready BackB_2_R BackB_1_R Dock_B_Back Transit_Ready_to_B_Front Set Stop-Popup-29 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Ready Ready_1_B Ready_2_B Ready_3_B Dock_B_Front Transit_B_Front_to_Ready Set Stop-Popup-30 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_B_Front Ready_3_B Ready_2_B Ready_1_B Ready Transit_Ready_to_C_Back Set Stop-Popup-31 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Ready BackC_2_R BackC_1_R Dock_C_Back Transit_Ready_to_C_Front Set Stop-Popup-32 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Ready Ready_1_C Ready_2_C Ready_3_C Dock_C_Front Transit_C_Front_to_Ready Set Stop-Popup-33 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_C_Front Ready_3_C Ready_2_C Ready_1_C Ready Transit_Ready_to_D_Back Set Stop-Popup-34 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveL Ready BackD_2_R BackD_1_R Dock_D_Back Transit_Ready_to_D_Front Set Stop-Popup-35 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Ready Ready_1_D Ready_2_D Ready_3_D Dock_C_Front Transit_D_Front_to_Ready Set Stop-Popup-36 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_D_Front Ready_3_D Ready_2_D Ready_1_D Ready Transit_Ready_to_Dock_M Set Stop-Popup-37 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Ready Ready_1_M Ready_2_M Ready_3_M Dock_M_Center Transit_Dock_M_to_Ready Set Stop-Popup-38 Popup Popup Halt 'Stop-Popup is placed at start of movement that is based on data for each robot installation' 'Stop-Popup block a new robot installation from running parts of the program that is not ready for execution' 'Each Stop-Popup have an id number to make it easy to find the right Stop-Popup in the code' MoveJ Dock_M_Center Ready_3_M Ready_2_M Ready_1_M Ready PowerCheck If analog_in[3]<0.4*Tool_ID_Adjust Popup HookCheckOpen If analog_in[3]>0.5*Tool_ID_Adjust HookOpen PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup If analog_in[3]>0.5*Tool_ID_Adjust HookStillOpen PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup HookCheckClosed If analog_in[3]<4.6*Tool_ID_Adjust HookNotClosed1PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup If analog_in[3]<4.6*Tool_ID_Adjust HookNotClosed2PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup If analog_in[3]<4.6*Tool_ID_Adjust HookNotClosed2PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Halt' Else Wait: 0.1 Check_Tool_A_ID 'Suppress all other but the Tool-ID to check for' 'Tool-ID 0' 'If (analog_in[3]<4.6*Tool_ID_Adjust) or (analog_in[3]>5.1*Tool_ID_Adjust)' 'Tool-ID 1' 'If (analog_in[3]<5.5*Tool_ID_Adjust) or (analog_in[3]>5.9*Tool_ID_Adjust)' 'Tool-ID 2' 'If (analog_in[3]<6.5*Tool_ID_Adjust) or (analog_in[3]>6.9*Tool_ID_Adjust)' 'Tool-ID 3' 'If (analog_in[3]<7.2*Tool_ID_Adjust) or (analog_in[3]>7.6*Tool_ID_Adjust)' 'Tool-ID 4' If (analog_in[3]<8.2*Tool_ID_Adjust) or (analog_in[3]>8.6*Tool_ID_Adjust) No ID 4 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Tool-ID 5' 'If (analog_in[3]<9.2*Tool_ID_Adjust) or (analog_in[3]>9.7*Tool_ID_Adjust)' 'Tool-ID 6' 'If (analog_in[3]<10.5*Tool_ID_Adjust) or (analog_in[3]>11.1*Tool_ID_Adjust)' 'Tool-ID 7' 'If (analog_in[3]<11.4*Tool_ID_Adjust) or (analog_in[3]>12.0*Tool_ID_Adjust)' 'Tool-ID 8' 'If (analog_in[3]<12.1*Tool_ID_Adjust) or (analog_in[3]>12.8*Tool_ID_Adjust)' 'Tool-ID 9' 'If (analog_in[3]<12.9*Tool_ID_Adjust) or (analog_in[3]>13.6*Tool_ID_Adjust)' 'Tool-ID 10' 'If (analog_in[3]<13.7*Tool_ID_Adjust) or (analog_in[3]>14.5*Tool_ID_Adjust)' Check_Tool_B_ID 'Suppress all other but the Tool-ID to check for' 'Tool-ID 0' 'If (analog_in[3]<4.6*Tool_ID_Adjust) or (analog_in[3]>5.1*Tool_ID_Adjust)' 'Tool-ID 1' 'If (analog_in[3]<5.5*Tool_ID_Adjust) or (analog_in[3]>5.9*Tool_ID_Adjust)' 'Tool-ID 2' If (analog_in[3]<6.5*Tool_ID_Adjust) or (analog_in[3]>6.9*Tool_ID_Adjust) No ID 2 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Tool-ID 3' 'If (analog_in[3]<7.2*Tool_ID_Adjust) or (analog_in[3]>7.6*Tool_ID_Adjust)' 'Tool-ID 4' 'If (analog_in[3]<8.2*Tool_ID_Adjust) or (analog_in[3]>8.6*Tool_ID_Adjust)' 'Tool-ID 5' 'If (analog_in[3]<9.2*Tool_ID_Adjust) or (analog_in[3]>9.7*Tool_ID_Adjust)' 'Tool-ID 6' 'If (analog_in[3]<10.5*Tool_ID_Adjust) or (analog_in[3]>11.1*Tool_ID_Adjust)' 'Tool-ID 7' 'If (analog_in[3]<11.4*Tool_ID_Adjust) or (analog_in[3]>12.0*Tool_ID_Adjust)' 'Tool-ID 8' 'If (analog_in[3]<12.1*Tool_ID_Adjust) or (analog_in[3]>12.8*Tool_ID_Adjust)' 'Tool-ID 9' 'If (analog_in[3]<12.9*Tool_ID_Adjust) or (analog_in[3]>13.6*Tool_ID_Adjust)' 'Tool-ID 10' 'If (analog_in[3]<13.7*Tool_ID_Adjust) or (analog_in[3]>14.5*Tool_ID_Adjust)' Check_Tool_C_ID 'Suppress all other but the Tool-ID to check for' 'Tool-ID 0' 'If (analog_in[3]<4.6*Tool_ID_Adjust) or (analog_in[3]>5.1*Tool_ID_Adjust)' 'Tool-ID 1' 'If (analog_in[3]<5.5*Tool_ID_Adjust) or (analog_in[3]>5.9*Tool_ID_Adjust)' 'Tool-ID 2' 'If (analog_in[3]<6.5*Tool_ID_Adjust) or (analog_in[3]>6.9*Tool_ID_Adjust)' 'Tool-ID 3' 'If (analog_in[3]<7.2*Tool_ID_Adjust) or (analog_in[3]>7.6*Tool_ID_Adjust)' 'Tool-ID 4' If (analog_in[3]<8.2*Tool_ID_Adjust) or (analog_in[3]>8.6*Tool_ID_Adjust) No ID 4 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Tool-ID 5' 'If (analog_in[3]<9.2*Tool_ID_Adjust) or (analog_in[3]>9.7*Tool_ID_Adjust)' 'Tool-ID 6' 'If (analog_in[3]<10.5*Tool_ID_Adjust) or (analog_in[3]>11.1*Tool_ID_Adjust)' 'Tool-ID 7' 'If (analog_in[3]<11.4*Tool_ID_Adjust) or (analog_in[3]>12.0*Tool_ID_Adjust)' 'Tool-ID 8' 'If (analog_in[3]<12.1*Tool_ID_Adjust) or (analog_in[3]>12.8*Tool_ID_Adjust)' 'Tool-ID 9' 'If (analog_in[3]<12.9*Tool_ID_Adjust) or (analog_in[3]>13.6*Tool_ID_Adjust)' 'Tool-ID 10' 'If (analog_in[3]<13.7*Tool_ID_Adjust) or (analog_in[3]>14.5*Tool_ID_Adjust)' Check_Tool_D_ID 'Suppress all other but the Tool-ID to check for' 'Tool-ID 0' 'If (analog_in[3]<4.6*Tool_ID_Adjust) or (analog_in[3]>5.1*Tool_ID_Adjust)' 'Tool-ID 1' 'If (analog_in[3]<5.5*Tool_ID_Adjust) or (analog_in[3]>5.9*Tool_ID_Adjust)' 'Tool-ID 2' 'If (analog_in[3]<6.5*Tool_ID_Adjust) or (analog_in[3]>6.9*Tool_ID_Adjust)' 'Tool-ID 3' 'If (analog_in[3]<7.2*Tool_ID_Adjust) or (analog_in[3]>7.6*Tool_ID_Adjust)' 'Tool-ID 4' If (analog_in[3]<8.2*Tool_ID_Adjust) or (analog_in[3]>8.6*Tool_ID_Adjust) No ID 4 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Tool-ID 5' 'If (analog_in[3]<9.2*Tool_ID_Adjust) or (analog_in[3]>9.7*Tool_ID_Adjust)' 'Tool-ID 6' 'If (analog_in[3]<10.5*Tool_ID_Adjust) or (analog_in[3]>11.1*Tool_ID_Adjust)' 'Tool-ID 7' 'If (analog_in[3]<11.4*Tool_ID_Adjust) or (analog_in[3]>12.0*Tool_ID_Adjust)' 'Tool-ID 8' 'If (analog_in[3]<12.1*Tool_ID_Adjust) or (analog_in[3]>12.8*Tool_ID_Adjust)' 'Tool-ID 9' 'If (analog_in[3]<12.9*Tool_ID_Adjust) or (analog_in[3]>13.6*Tool_ID_Adjust)' 'Tool-ID 10' 'If (analog_in[3]<13.7*Tool_ID_Adjust) or (analog_in[3]>14.5*Tool_ID_Adjust)' Check_Tool_E_ID 'Suppress all other but the Tool-ID to check for' 'Tool-ID 0' 'If (analog_in[3]<4.6*Tool_ID_Adjust) or (analog_in[3]>5.1*Tool_ID_Adjust)' 'Tool-ID 1' 'If (analog_in[3]<5.5*Tool_ID_Adjust) or (analog_in[3]>5.9*Tool_ID_Adjust)' 'Tool-ID 2' 'If (analog_in[3]<6.5*Tool_ID_Adjust) or (analog_in[3]>6.9*Tool_ID_Adjust)' 'Tool-ID 3' 'If (analog_in[3]<7.2*Tool_ID_Adjust) or (analog_in[3]>7.6*Tool_ID_Adjust)' 'Tool-ID 4' 'If (analog_in[3]<8.2*Tool_ID_Adjust) or (analog_in[3]>8.6*Tool_ID_Adjust)' 'Tool-ID 5' If (analog_in[3]<9.2*Tool_ID_Adjust) or (analog_in[3]>9.7*Tool_ID_Adjust) No ID 5 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Tool-ID 6' 'If (analog_in[3]<10.5*Tool_ID_Adjust) or (analog_in[3]>11.1*Tool_ID_Adjust)' 'Tool-ID 7' 'If (analog_in[3]<11.4*Tool_ID_Adjust) or (analog_in[3]>12.0*Tool_ID_Adjust)' 'Tool-ID 8' 'If (analog_in[3]<12.1*Tool_ID_Adjust) or (analog_in[3]>12.8*Tool_ID_Adjust)' 'Tool-ID 9' 'If (analog_in[3]<12.9*Tool_ID_Adjust) or (analog_in[3]>13.6*Tool_ID_Adjust)' 'Tool-ID 10' 'If (analog_in[3]<13.7*Tool_ID_Adjust) or (analog_in[3]>14.5*Tool_ID_Adjust)' Check_Tool_F_ID 'Suppress all other but the Tool-ID to check for' 'Tool-ID 0' 'If (analog_in[3]<4.6*Tool_ID_Adjust) or (analog_in[3]>5.1*Tool_ID_Adjust)' 'Tool-ID 1' 'If (analog_in[3]<5.5*Tool_ID_Adjust) or (analog_in[3]>5.9*Tool_ID_Adjust)' 'Tool-ID 2' 'If (analog_in[3]<6.5*Tool_ID_Adjust) or (analog_in[3]>6.9*Tool_ID_Adjust)' 'Tool-ID 3' 'If (analog_in[3]<7.2*Tool_ID_Adjust) or (analog_in[3]>7.6*Tool_ID_Adjust)' 'Tool-ID 4' 'If (analog_in[3]<8.2*Tool_ID_Adjust) or (analog_in[3]>8.6*Tool_ID_Adjust)' 'Tool-ID 5' 'If (analog_in[3]<9.2*Tool_ID_Adjust) or (analog_in[3]>9.7*Tool_ID_Adjust)' 'Tool-ID 6' If (analog_in[3]<10.5*Tool_ID_Adjust) or (analog_in[3]>11.1*Tool_ID_Adjust) No ID 6 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup 'Tool-ID 7' 'If (analog_in[3]<11.4*Tool_ID_Adjust) or (analog_in[3]>12.0*Tool_ID_Adjust)' 'Tool-ID 8' 'If (analog_in[3]<12.1*Tool_ID_Adjust) or (analog_in[3]>12.8*Tool_ID_Adjust)' 'Tool-ID 9' 'If (analog_in[3]<12.9*Tool_ID_Adjust) or (analog_in[3]>13.6*Tool_ID_Adjust)' 'Tool-ID 10' 'If (analog_in[3]<13.7*Tool_ID_Adjust) or (analog_in[3]>14.5*Tool_ID_Adjust)' CheckID0 If (analog_in[3]<4.6*Tool_ID_Adjust) or (analog_in[3]>5.1*Tool_ID_Adjust) No ID PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID1 If (analog_in[3]<5.5*Tool_ID_Adjust) or (analog_in[3]>5.9*Tool_ID_Adjust) No ID 1 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID2 If (analog_in[3]<6.5*Tool_ID_Adjust) or (analog_in[3]>6.9*Tool_ID_Adjust) No ID 2 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID3 If (analog_in[3]<7.2*Tool_ID_Adjust) or (analog_in[3]>7.6*Tool_ID_Adjust) No ID 3 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID4 If (analog_in[3]<8.2*Tool_ID_Adjust) or (analog_in[3]>8.6*Tool_ID_Adjust) No ID 4 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID5 If (analog_in[3]<9.2*Tool_ID_Adjust) or (analog_in[3]>9.7*Tool_ID_Adjust) No ID 5 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID6 If (analog_in[3]<10.5*Tool_ID_Adjust) or (analog_in[3]>11.1*Tool_ID_Adjust) No ID 6 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID7 If (analog_in[3]<11.4*Tool_ID_Adjust) or (analog_in[3]>12.0*Tool_ID_Adjust) No ID 7 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID8 If (analog_in[3]<12.1*Tool_ID_Adjust) or (analog_in[3]>12.8*Tool_ID_Adjust) No ID 8 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID9 If (analog_in[3]<12.9*Tool_ID_Adjust) or (analog_in[3]>13.6*Tool_ID_Adjust) No ID 9 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup CheckID10 If (analog_in[3]<13.7*Tool_ID_Adjust) or (analog_in[3]>14.5*Tool_ID_Adjust) No ID 10 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup DetectToolID If (analog_in[3]>4.6*Tool_ID_Adjust) and (analog_in[3]<5.1*Tool_ID_Adjust) Tool-0 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>5.5*Tool_ID_Adjust) and (analog_in[3]<5.9*Tool_ID_Adjust) Tool-1 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>6.5*Tool_ID_Adjust) and (analog_in[3]<6.9*Tool_ID_Adjust) Tool-2 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>7.2*Tool_ID_Adjust) and (analog_in[3]<7.6*Tool_ID_Adjust) Tool-3 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>8.2*Tool_ID_Adjust) and (analog_in[3]<8.6*Tool_ID_Adjust) Tool-4 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>9.2*Tool_ID_Adjust) and (analog_in[3]<9.7*Tool_ID_Adjust) Tool-5 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>10.5*Tool_ID_Adjust) and (analog_in[3]<11.1*Tool_ID_Adjust) Tool-6 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>11.4*Tool_ID_Adjust) and (analog_in[3]<12.0*Tool_ID_Adjust) Tool-7 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>12.1*Tool_ID_Adjust) and (analog_in[3]<12.8*Tool_ID_Adjust) Tool-8 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>12.9*Tool_ID_Adjust) and (analog_in[3]<13.6*Tool_ID_Adjust) Tool-9 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup ElseIf (analog_in[3]>13.7*Tool_ID_Adjust) and (analog_in[3]<14.5*Tool_ID_Adjust) Tool-10 PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup Else Tool-NA PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup Tool-warning PopUp If Lang≟1 Popup ElseIf Lang≟2 Popup ElseIf Lang≟3 Popup ElseIf Lang≟4 Popup ElseIf Lang≟5 Popup Else Popup