|
|
Line 1: |
Line 1: |
| {{Languages|Program_Examples:Group_Blending}} | | {{Languages|Program_Examples:Group_Blending}} |
− | here is an example of using blended motion. we have a simulated XY table that moves in a rectangle contour. the motion is done with different blendingFactor: 0 / 1 / 2 | + | here is an example of using blended motion for a single axis. the motion is done with different blendingFactor: 0 / 1 / 2 |
− | | |
− | config.prg:
| |
− | <syntaxhighlight lang="vb">
| |
− | '------------------------------------------------------------------------------
| |
− | ' File: CONFIG.PRG
| |
− | ' Purpose: simulated XY configuration file
| |
− | ' Version: 1.00
| |
− | ' Author: Eran Korkidi
| |
− | ' Description:
| |
− | '------------------------------------------------------------------------------
| |
− | | |
− | | |
− | Sys.NumberAxes = 14
| |
− | common shared XYtable as group Axnm=a1 Axnm=a2 Model=1 'of xy
| |
− | common shared xSimulatedSystem as long = 1
| |
− | common shared xRealSystem as long = 0
| |
− | common shared xActualSystem as long = 0 ' 1 = simulated , 0 = real
| |
− | common shared dVelocityLimit as double
| |
− | common shared dDrivePeMax as double
| |
− | common shared dSec2msec as double = 1000
| |
− |
| |
− | common shared num_Of_Motion_Drives as long =0
| |
− | | |
− | program
| |
− | | |
− | Load ETHERCAT.LIB
| |
− | Load EC_USER.LIB
| |
− | Load EC_CDHD.LIB
| |
− | Load ECX_DIO8.LIB
| |
− | Load EC_AI8ME.LIB
| |
− | Load CPX_FB38.LIB
| |
− | Load EC_HCNC.LIB
| |
− | Load EK1100.LIB
| |
− | Load TP_PARAM.LIB
| |
− | Load TP_SIM.LIB
| |
− | Load TP.LIB
| |
− | | |
− | A7.AxisName = CONV
| |
− | | |
− | sys.DoubleFormat = 1
| |
− | sys.NoMotion = 1
| |
− | Sys.Name = "Train_2_XY"
| |
− | Print "MC is running: " Sys.Name
| |
− | | |
− | end program
| |
− | | |
− | </syntaxhighlight>
| |
| | | |
| | | |
− |
| |
− | autoexec.prg:
| |
| <syntaxhighlight lang="vb"> | | <syntaxhighlight lang="vb"> |
− | '------------------------------------------------------------------------------
| |
− | ' File: AUTOEXEC.PRG
| |
− | ' Purpose: autoexec for XYportal
| |
− | ' Version: 1.00
| |
− | ' Author: Eran Korkidi
| |
− | ' Description:
| |
− | ' History: Created: 30.NOV.2015
| |
− | '------------------------------------------------------------------------------
| |
− |
| |
− | common shared xDoneAxSetupPrg as long = 0
| |
− | common shared xDoneGroupPrg as long = 0
| |
− | common shared xDoneConvPrg as long = 0
| |
− |
| |
− | program continue
| |
− |
| |
− | if xActualSystem = xRealSystem then
| |
− | Load EC_SETUP.PRG
| |
− | Stas EC_SETUP.PRG
| |
− | while EC_SETUP.PRG.State <> 10
| |
− | Sleep 10
| |
− | end while
| |
− | Unload EC_SETUP.PRG
| |
− | end if
| |
− |
| |
− | Load XY_setup.PRG
| |
− | Stas XY_setup.PRG
| |
− | while (NOT xDoneGroupPrg)
| |
− | Sleep 1
| |
− | end while
| |
− |
| |
− | call TP_INIT
| |
− |
| |
− | terminate program
| |
− |
| |
− | </syntaxhighlight>
| |
− |
| |
− |
| |
− |
| |
− | XY_SETUP.PRG:
| |
− | <syntaxhighlight lang="vb">
| |
− | '-----------------------------------------------------------------------
| |
− | ' Program: SetupGantry.prg
| |
− | ' Author: Eran Korkidi
| |
− | ' Description: system setup - GANTRY XYZ
| |
− | ' History: 14.APR.2015 Eran Korkidi created
| |
− | '-----------------------------------------------------------------------
| |
− | '
| |
− |
| |
− | dim shared myprf as long = -1
| |
− | dim shared gearRat_X as double = 1.0
| |
− | dim shared gearRat_Y as double = 1.0
| |
− |
| |
− | dim shared dAccCurrnetFactor as double
| |
− | dim shared dJointVelFactor as double
| |
− | dim shared dRobotVelFactor as double
| |
− | dim shared lElementID as double
| |
− |
| |
− | dim shared Jvmax as double = 360.0
| |
− | dim shared AccVratio as double = 30.0
| |
− |
| |
− | dim shared axisPitch[2] as double
| |
− |
| |
− | program
| |
− |
| |
− | dim omega as double = 10.0
| |
− | dim i as long
| |
− | dim k as long
| |
− |
| |
− | call setupInit
| |
− |
| |
− | if xActualSystem = xSimulatedSystem then
| |
− | for i = 1 to 2
| |
− | systemAxis(i).Simulated = TRUE
| |
− | systemAxis(i).Dadd = i
| |
− | Pos_Units[i] = 360000
| |
− | next
| |
− | else
| |
− | for i = 1 to 2
| |
− | if NOT systemAxis(i).Dadd then
| |
− | systemAxis(i).Simulated = TRUE
| |
− | systemAxis(i).Dadd = i
| |
− | end if
| |
− | Pos_Units[i] = 360000/axisPitch[i]/360
| |
− | next
| |
− | end if
| |
− |
| |
− | with XYtable
| |
− |
| |
− | En = FALSE
| |
− | while En
| |
− | Sleep 10
| |
− | end while
| |
− |
| |
− | Attach
| |
− | Vord = 100
| |
− | Print "STX Gantry - geometric setup"
| |
− |
| |
− | J1.MotionBusVelocityScale = 0
| |
− | J1.MotionBusVelocityBase = 1000 ' counts per sec matches CDHD
| |
− | J2.MotionBusVelocityScale = 0
| |
− | J2.MotionBusVelocityBase = 1000 ' counts per sec matches CDHD
| |
− |
| |
− | J1.Abs = TRUE
| |
− | J2.Abs = TRUE
| |
− | J1.axisType = 1
| |
− | J2.axisType = 1
| |
− | J1.Pfac = gearRat_X * Pos_Units[J1.Dadd]
| |
− | J2.Pfac = gearRat_Y * Pos_Units[J2.Dadd]
| |
− | J1.Vfac = J1.Pfac/1000
| |
− | J2.Vfac = J2.Pfac/1000
| |
− | J1.Afac = J1.Vfac/1000
| |
− | J2.Afac = J2.Vfac/1000
| |
− | J1.Jfac = J1.Afac/1000
| |
− | J2.Jfac = J2.Afac/1000
| |
− | J1.Direction = 1
| |
− | J2.Direction = 1
| |
− | J1.Disp = 0.0
| |
− | J2.Disp = 0.0
| |
− | J1.Vmax = Jvmax 'mm/sec ' TBD
| |
− | J2.Vmax = Jvmax 'mm/sec ' TBD
| |
− | J1.Vospd = 1.2 * J1.Vmax
| |
− | J2.Vospd = 1.2 * J2.Vmax
| |
− | J1.Vcruise = 0.5 * J1.Vmax
| |
− | J2.Vcruise = 0.5 * J2.Vmax
| |
− | J1.Amax = J1.Vmax * AccVratio
| |
− | J2.Amax = J2.Vmax * AccVratio
| |
− | J1.Dmax = J1.Amax
| |
− | J2.Dmax = J2.Amax
| |
− | J1.Acc = J1.Amax
| |
− | J2.Acc = J2.Amax
| |
− | J1.Dec = J1.Dmax
| |
− | J2.Dec = J2.Dmax
| |
− | J1.Jmax = omega * J1.Amax
| |
− | J2.Jmax = omega * J2.Amax
| |
− | J1.Jerk = J1.Jmax
| |
− | J2.Jerk = J2.Jmax
| |
− | J1.Smooth = -1
| |
− | J2.Smooth = -1
| |
− | J1.prftype = myprf
| |
− | J2.prftype = myprf
| |
− | A1.PMin = -1.0
| |
− | A1.PMax = 400.0
| |
− | J1.PMin = -1.0
| |
− | J1.PMax = 400.0
| |
− | A2.PMin = -1.0
| |
− | A2.PMax = 400.0
| |
− | J2.PMin = -1.0
| |
− | J2.PMax = 400.0
| |
− | J1.PmaxEn = TRUE
| |
− | J2.PmaxEn = TRUE
| |
− | J1.PminEn = TRUE
| |
− | J2.PminEn = TRUE
| |
− | J1.positionerrorsettle = 0.1
| |
− | J2.positionerrorsettle = 0.1
| |
− | J1.PeMax = 20 'mm
| |
− | J2.PeMax = 20 'mm
| |
− | PeMax = Sqrt(J1.PeMax^2 + J2.PeMax^2 ) ' follwing error in mm (envelope)
| |
− | J1.PositionRollOverEnable=0
| |
− | J2.PositionRollOverEnable=0
| |
− |
| |
− | Smooth = -1
| |
− | prftype = myprf
| |
− | Vfac = 1/1000
| |
− | Afac = Vfac/1000
| |
− | Jfac = Afac/1000
| |
− | Vmax = Jvmax
| |
− | Amax = max(J1.Amax,J2.Amax)
| |
− | Dmax = max(J1.Dmax,J2.Dmax)
| |
− | Jmax = max(J1.Jmax,J2.Jmax)
| |
− |
| |
− | J1.PositionErrorDelay = 5.07
| |
− | J2.PositionErrorDelay = 5.07
| |
− | for i = 1 to 2
| |
− | for k = 1 to 2
| |
− | if i = k then
| |
− | cplg[i][k] = 1
| |
− | else
| |
− | cplg[i][k] = 0
| |
− | end if
| |
− | next
| |
− | next
| |
− | Coupled = 1
| |
− | Abs = 1
| |
− | ConfigGroup
| |
− | Vcruise = 0.5 * Vmax
| |
− | Acc = Amax
| |
− | Dec = Dmax
| |
− | Jmax = Omega * Amax
| |
− | Jerk= Jmax
| |
− | PositionErrorSettle = 0.025 ' 25um
| |
− |
| |
− | Detach
| |
− | end with
| |
− |
| |
− | Print ""
| |
− | Print "-------------------------"
| |
− | Print "XY portal - setup is done"
| |
− | Print "-------------------------"
| |
− | Print ""
| |
− |
| |
− | end program
| |
− |
| |
− |
| |
− | function max(byval a as double, byval b as double ) as double
| |
− | if a > b then
| |
− | max = a
| |
− | else
| |
− | max = b
| |
− | end if
| |
− | end function
| |
− |
| |
− |
| |
− | function min(byval a as double, byval b as double ) as double
| |
− | if a < b then
| |
− | min = a
| |
− | else
| |
− | min = b
| |
− | end if
| |
− | end function
| |
− |
| |
− |
| |
− | sub setupInit
| |
− | axisPitch[1] = 1
| |
− | axisPitch[2] = 1
| |
− | end sub
| |
− | </syntaxhighlight>
| |
− |
| |
− |
| |
| | | |
− | XY_Blend.PRG:
| |
− | <syntaxhighlight lang="vb">
| |
| '------------------------------------------------------------------------------ | | '------------------------------------------------------------------------------ |
− | ' File: <MyTask>.prg | + | ' File: BLEND.prg |
− | ' Purpose: Just an example of a module header | + | ' Purpose: MC training for blending motion of a single axis |
| ' Version: 1.00 | | ' Version: 1.00 |
− | ' Author: <MyFullName> | + | ' Author: Eran Korkidi |
− | ' Description:
| + | ' History: 2021-08-04 Created |
− | ' History: YYYY-MM-DD <MyShortCut> V1.00 | |
− | ' Created
| |
| '------------------------------------------------------------------------------ | | '------------------------------------------------------------------------------ |
| | | |
− | ' module global "constants"
| |
− |
| |
− |
| |
− | ' module global variables
| |
| | | |
| | | |
| program | | program |
| | | |
− | dim i as long | + | Attach X |
− | | + | X.En = 1 |
− | Attach XYTABLE | + | Sleep 100 |
− | XYTABLE.En = 1
| + | X.Abs = 1 |
− | while NOT XYTABLE.En | + | |
− | Sleep 1
| + | X.CP = 20 |
− | end while | + | X.BlendingFactor = 80 |
− | call move1 | + | Record X_MOT2.rec 10000 Gap=1 RecData = X.pcmd, X.VCMD, X.ismoving |
− | call move2 | + | X.BlendingMethod = 0 |
− | Detach XYTABLE | + | call executeMot |
| + | X.BlendingMethod = 1 |
| + | call executeMot |
| + | X.BlendingMethod = 2 |
| + | call executeMot |
| + | RecordClose |
| + | |
| + | Detach X |
| | | |
| end program ' <MyTask>.prg | | end program ' <MyTask>.prg |
| | | |
| | | |
− | sub move1 | + | sub executeMot |
− | | + | Move X 0 Vcruise=100 |
− | dim i as long
| + | waitForMotion X |
− | for i = 1 to 3
| |
− | Move XYTABLE {300,300}
| |
− | Move XYTABLE {0,0}
| |
− | next
| |
− | while XYTABLE.IsMoving
| |
− | Sleep 1
| |
− | end while
| |
− |
| |
− | end sub
| |
− | | |
− | | |
− | sub move2
| |
− | | |
− | XYTABLE.BlendingFactor = 80
| |
− | XYTABLE.Cp = 20
| |
− | | |
− | Move XYTABLE {0,0} | |
− | while XYTABLE.IsMoving
| |
− | Sleep 1
| |
− | end while
| |
− |
| |
− | XYTABLE.BlendingMethod = 0
| |
− | Record blend_0.rec 10000 Gap = 1 RecData = A1.Pcmd, A2.Pcmd, A1.Vcmd, A2.Vcmd | |
| RecordOn | | RecordOn |
− | Move XYTABLE {0,100} | + | Sleep 100 |
− | Move XYTABLE {100,100} | + | Move X 50 Vcruise=20 |
− | Move XYTABLE {100,0} | + | Sleep 500 |
− | Move XYTABLE {0,0}
| + | Move X 100 Vcruise=20 |
− | while XYTABLE.IsMoving
| + | waitForMotion X |
− | Sleep 1
| + | Sleep 100 |
− | end while
| + | RecordOff |
− | RecordClose
| |
− | | |
− | XYTABLE.BlendingMethod = 1
| |
− | Record blend_1.rec 10000 Gap = 1 RecData = A1.Pcmd, A2.Pcmd, A1.Vcmd, A2.Vcmd
| |
− | RecordOn
| |
− | Move XYTABLE {0,100} | |
− | Move XYTABLE {100,100} | |
− | Move XYTABLE {100,0} | |
− | Move XYTABLE {0,0}
| |
− | while XYTABLE.IsMoving
| |
− | Sleep 1
| |
− | end while
| |
− | RecordClose
| |
− | | |
− | XYTABLE.BlendingMethod = 2
| |
− | Record blend_2.rec 10000 Gap = 1 RecData = A1.Pcmd, A2.Pcmd, A1.Vcmd, A2.Vcmd
| |
− | RecordOn
| |
− | Move XYTABLE {0,100}
| |
− | Move XYTABLE {100,100}
| |
− | Move XYTABLE {100,0}
| |
− | Move XYTABLE {0,0}
| |
− | while XYTABLE.IsMoving
| |
− | Sleep 1
| |
− | end while
| |
− | RecordClose | |
− | | |
| end sub | | end sub |
| | | |
| </syntaxhighlight> | | </syntaxhighlight> |