Difference between revisions of "Program Examples:Single Axis Blending"

From SoftMC-Wiki
Jump to: navigation, search
(Created page with "{{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 w...")
 
(added)
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>
 
  
 
&nbsp;
 
&nbsp;
 
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>
 
 
&nbsp;
 
 
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>
 
 
&nbsp;
 
  
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>

Revision as of 10:24, 4 August 2021

Language: English  • 中文(简体)‎

here is an example of using blended motion for a single axis. the motion is done with different blendingFactor: 0 / 1 / 2

 

'------------------------------------------------------------------------------
' File:        BLEND.prg
' Purpose:     MC training for blending motion of a single axis
' Version:     1.00
' Author:      Eran Korkidi
' History:     2021-08-04  Created
'------------------------------------------------------------------------------



program

	Attach X
	X.En = 1
	Sleep 100
	X.Abs = 1
	
	X.CP = 20
	X.BlendingFactor = 80
	Record X_MOT2.rec 10000 Gap=1 RecData = X.pcmd, X.VCMD, X.ismoving
		X.BlendingMethod = 0
		call executeMot
		X.BlendingMethod = 1
		call executeMot
		X.BlendingMethod = 2
		call executeMot
	RecordClose
	
	Detach X

end program ' <MyTask>.prg


sub executeMot
	Move X 0 Vcruise=100
	waitForMotion X
	RecordOn
		Sleep 100
		Move X 50 Vcruise=20
		Sleep 500
		Move X 100 Vcruise=20
		waitForMotion X
		Sleep 100
	RecordOff
end sub