Difference between revisions of "MC-Basic:CIRCLE"

From SoftMC-Wiki
Jump to: navigation, search
(Created page with '{{MC-Basic |SHORT FORM= |SYNTAX= Circle ''<group>'' Angle = ''<angle> ''CircleCenter = {''<vector>''}<br> {CirclePlane = ''<circle plane>''} ''{Optional Property}''* ''{Veloc…')
 
 
(21 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 +
{{Languages|MC-Basic:CIRCLE}}
 
{{MC-Basic
 
{{MC-Basic
 
|SHORT FORM=
 
|SHORT FORM=
Line 4: Line 5:
  
 
|SYNTAX=
 
|SYNTAX=
Circle ''<group>'' Angle = ''<angle> ''CircleCenter = {''<vector>''}<br>
+
'''Circle''' <''group''> '''Angle''' = ''<angle> '''''CircleCenter''' = {''<vector>''}
 
+
{'''CirclePlane''' = ''<circle plane>''} ''{Optional Nodal Property}''*  
{CirclePlane = ''<circle plane>''} ''{Optional Property}''* ''{VelocityFinal ='' ''<value>''}
 
  
 
Or
 
Or
  
Circle ''<group>'' CirclePoint = ''<vector> ''TargetPoint = {''<vector>''}<br>
+
'''Circle''' <''group''> '''CirclePoint''' = ''<vector> '''''TargetPoint''' = {''<vector>''} ''{Optional Nodal Property}''*  
 
 
{CirclePlane = ''<circle plane>''} ''{Optional Property}''* ''{VelocityFinal ='' ''<value>''}
 
  
 
|AVAILABILITY=
 
|AVAILABILITY=
Line 18: Line 16:
  
 
|DESCRIPTION=
 
|DESCRIPTION=
The CIRCLE command issues a circular path trajectory for the specified group, and uses the properties of that group.
+
The CIRCLE command issues a circular(arc) path trajectory for the specified group/robot, and uses the properties of that group.
 +
 
 +
The CIRCLE command has two formats. One specifies the group name, the angle and the circle center. This format enables multi-turn circular motion. The other is defined by a circle point and the final point of the arc.  
  
The CIRCLE command specifies the group name, the angle and the circle center. Other properties are optional, and may be selected from the following list:
+
The optional properties override the permanent values of the properties for the duration of the command. When using an optional property, the keyword must be specified.
  
ABSOLUTE<br>
+
For robot models the CIRCLE command issues a circular path in Cartesian space (XYZ). Orientation angles are interpolated proportionally to the circle angle.
        ACCELERATION<br>
+
 
        ACCELERATIONMAX<br>
+
For PUMA robots the orientation vector is kept orthogonal to the circular path.
        DECELERATION<br>
 
        DECELERATIONMAX<br>
 
        SMOOTHFACTOR<br>
 
        STARTTYPE<br>
 
        VELOCITYCRUISE<br>
 
        VELOCITYMAX
 
  
These optional properties override the permanent values of the properties for the duration of the command. When using an optional property, the keyword must be specified.
 
  
 
|TYPE=
 
|TYPE=
Line 38: Line 31:
  
 
|RANGE=
 
|RANGE=
''<group>'': An existing group<br>
+
<''group''>: An existing group<br>
''<angle>'': +/- MaxDouble
+
<''angle''>: ± MaxDouble - Positive values describe CCW and negative CW rotations
  
''<circle plane>'': 0 (XY)<br>
+
<''circle plane''>:  
 +
*0 (XY)
 +
*1 (XZ)
 +
*2 (YZ)
  
1 (XZ)<br>
+
''<vector>'': location or joint value
 
 
2 (YZ)
 
 
 
All others: +/- Max Double
 
  
 
|UNITS=
 
|UNITS=
Line 59: Line 51:
  
 
|LIMITATIONS=
 
|LIMITATIONS=
Applicable only to groups. A group cannot be moved if an axis from the group is being moved individually. A group must be attached in order to be moved from within a task.
+
*Applicable only to groups.  
 +
*A group cannot be moved if an axis from the group is being moved individually.  
 +
*A group must be attached in order to be moved from within a task.
  
 
|EXAMPLE=
 
|EXAMPLE=
Circle XYTable Angle = 90 CircleCenter = {20,10} Vcruise = 500
+
Circle XYTable Angle = 90 CircleCenter = {20,10} Vtran = 500
 +
 
 +
Circle XYtable CirclePoint = {10,20} TargetPoint = {100,200} Vtran = 500
 +
 
 +
= ''Half Circle'' =
 +
Here is a simple example for generating half circle motion with a delta (XYZR) robot.
 +
<syntaxhighlight lang="vb">
 +
Attach DELTA
 +
DELTA.En=1
 +
Record circPnt.rec 100000 Gap=1 RecData = DELTA.SetPoint{1},DELTA.SetPoint{2}, Sys.Clock
 +
Move DELTA #{100,0,426,0}
 +
Delay DELTA 3000
 +
RecordOn
 +
Circle DELTA CirclePoint=#{0,100,426,0} TargetPoint=#{-100,0,426,0}
 +
Delay DELTA 3000
 +
RecordClose
 +
Detach DELTA
 +
</syntaxhighlight>
 +
 
 +
[[File:circPnt.JPG|left|caption|450px]]
 +
 
 +
 
 +
 
 +
 
 +
 
 +
= ''Helical'' =
 +
Here is a simple example for circle in 3D. The circle itself was defined at XY plane with additional movement in Z axis.<br/>
 +
'''The code : '''<br/>
 +
At the config file:
 +
System.NumberAxes = 3
 +
common shared Axes[3] as generic axis
 +
common shared temp_grp  as group Axnm = a1 Axnm = a2  Axnm = a3
 +
common shared PLANE_XY as const long =0
 +
common shared PLANE_XZ as const long =1
 +
common shared PLANE_YZ as const long =2
 +
Program
 +
  Axes[1] = a1
 +
  Axes[2] = a2
 +
  Axes[3] = a3
 +
  sys.DoubleFormat = 1
 +
  sys.Name = "Helical"
 +
  with temp_grp
 +
End Program
 +
The setup stage:<br/>
 +
dim shared pdl as long = 2
 +
Program continue
 +
  dim i as long = 1
 +
  for i = 1 to 3
 +
    attach Axes[i]
 +
      ' **** Setting Motion Parameters ****
 +
      Axes[i].fmode = 0
 +
      Axes[i].pemax = 10
 +
      Axes[i].pfac = 2^16   
 +
      Axes[i].vfac = Axes[i].pfac/1000/60
 +
      Axes[i].afac = Axes[i].vfac/1000
 +
      Axes[i].jfac = Axes[i].afac/1000
 +
      Axes[i].VCruise = 1000
 +
      Axes[i].vmax = 3000
 +
      Axes[i].vospd = Axes[i].vmax * 1.2
 +
      Axes[i].velocitysafetylimit = Axes[i].vmax * 1.5
 +
      Axes[i].amax = 30000
 +
      Axes[i].dmax = 30000
 +
      Axes[i].jmax = 300000
 +
      Axes[i].acc = Axes[i].amax
 +
      Axes[i].dec = Axes[i].dmax
 +
      Axes[i].jerk = Axes[i].jmax 
 +
      Axes[i].simulated = ON     
 +
    detach Axes[i]   
 +
  next
 +
  call SetGroup
 +
terminate Program
 +
The used subroutine and fumction at setup:<br/>
 +
sub SetGroup
 +
attach
 +
    en=0
 +
    vord = 100
 +
    Print ".... "; ElementName; " - kinematics/geometric setup"
 +
    PeMax    = 1  ' follwing error in mm (envelope)
 +
    smooth  = -1
 +
    prftype = 1
 +
    vfac    = 1/1000
 +
    afac    = vfac/1000
 +
    jfac    = afac/1000 
 +
    vmax = max(j1.vmax,j2.vmax)
 +
    amax = max(j1.amax,j2.amax)
 +
    dmax = amax   
 +
    decstop = 1.1*dmax
 +
    jmax    = max(j1.jmax,j2.jmax)
 +
    PositionErrorDelay    = pdl
 +
    abs = 1 
 +
    vcruise = 0.5 * Vmax
 +
    acc = amax
 +
    dec = dmax
 +
    jmax = 10*amax
 +
    jerk= jmax
 +
    PositionErrorSettle = 0.1 ' 100um
 +
    BlendingMethod = 0     
 +
    configgroup   
 +
    detach
 +
end sub
 +
 
 +
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
 +
 
 +
And the actual program:
 +
 
 +
dim shared circle_center[8] as joint of XYZ
 +
program
 +
  dim index as long = 1
 +
  attach
 +
    ?VesExecute(" sys.Motion= ON")
 +
    call InitBuffer
 +
    abs = 1
 +
    en =1   
 +
    move {0 , 0 , 0} vcruise = 100 acc= 3000
 +
    move {25 , 0 , 0} vcruise =100  acc= 3000
 +
    call StillMoving   
 +
    record test11.rec 100000 gap =1 recdata = pcmd{1} , pcmd{2}, pcmd{3}
 +
    recordon
 +
        ' Start "helical"
 +
      for index = 1 to 8 
 +
        Circle  Angle = 180  CircleCenter = (circle_center[index]+ {0,0,index*5})  Vtran = 500 CirclePlane = PLANE_XY
 +
        call StillMoving
 +
        print "Position" , pcmd , index
 +
      next   
 +
      sleep 10
 +
    recordclose
 +
  detach
 +
end program
 +
 
 +
The used subroutines:<br/>
 +
 
 +
sub StillMoving
 +
  while ismoving <> 0
 +
    sleep 1
 +
  end while
 +
end sub
 +
 
 +
sub InitBuffer
 +
  dim index as long
 +
  for index=1 to 8 step 2
 +
    circle_center[index] = {0,0,0}
 +
  next
 +
  for index=2 to 8 step 2
 +
    circle_center[index] = {12.5,0,0}
 +
  next
 +
end sub
 +
<br/>
 +
 
 +
'''The results:'''
 +
[[File:helical2.JPG|left|caption|450px]]
 +
 
 +
 
 +
 
  
Circle XYtable CirclePoint = {10,20} TargetPoint = {100,200} Vcruise = 500
 
  
 
|SEE ALSO=
 
|SEE ALSO=
* [[Axystems:MC-Basic:ATTACH|ATTACH]]
+
 
* [[Axystems:MC-Basic:group.CIRCLECENTER|group.CIRCLECENTER]]
+
* [[MC-Basic:group.CIRCLECENTER|group.CIRCLECENTER]]
* [[Axystems:MC-Basic:group.ANGLE|group.ANGLE]]
+
* [[MC-Basic:group.ANGLE|group.ANGLE]]
* [[Axystems:MC-Basic:group.CIRCLETYPE|group.CIRCLETYPE]]
+
* [[MC-Basic:group.CIRCLETYPE|group.CIRCLETYPE]]
* [[Axystems:MC-Basic:group.CIRCLEPOINT|group.CIRCLEPOINT]]
+
* [[MC-Basic:group.CIRCLEPOINT|group.CIRCLEPOINT]]
 +
* [[MC-Basic:group.CIRCLEPLANE|group.CIRCLEPLANE]]
  
  
 
}}
 
}}

Latest revision as of 02:55, 26 April 2017

Language: English  • 中文(简体)‎

The CIRCLE command issues a circular(arc) path trajectory for the specified group/robot, and uses the properties of that group.

The CIRCLE command has two formats. One specifies the group name, the angle and the circle center. This format enables multi-turn circular motion. The other is defined by a circle point and the final point of the arc.

The optional properties override the permanent values of the properties for the duration of the command. When using an optional property, the keyword must be specified.

For robot models the CIRCLE command issues a circular path in Cartesian space (XYZ). Orientation angles are interpolated proportionally to the circle angle.

For PUMA robots the orientation vector is kept orthogonal to the circular path.

Syntax

Circle <group> Angle = <angle> CircleCenter = {<vector>} {CirclePlane = <circle plane>} {Optional Nodal Property}*

Or

Circle <group> CirclePoint = <vector> TargetPoint = {<vector>} {Optional Nodal Property}*

Availability

All versions

Type

Double

Range

<group>: An existing group
<angle>: ± MaxDouble - Positive values describe CCW and negative CW rotations

<circle plane>:

  • 0 (XY)
  • 1 (XZ)
  • 2 (YZ)

<vector>: location or joint value

Default

Permanent property values are used unless specified otherwise. Final velocity is 0.

Scope

Task or Terminal

Limitations

  • Applicable only to groups.
  • A group cannot be moved if an axis from the group is being moved individually.
  • A group must be attached in order to be moved from within a task.

Examples

Circle XYTable Angle = 90 CircleCenter = {20,10} Vtran = 500

Circle XYtable CirclePoint = {10,20} TargetPoint = {100,200} Vtran = 500

Half Circle

Here is a simple example for generating half circle motion with a delta (XYZR) robot.

Attach DELTA
	DELTA.En=1
	Record circPnt.rec 100000 Gap=1 RecData = DELTA.SetPoint{1},DELTA.SetPoint{2}, Sys.Clock
	Move DELTA #{100,0,426,0}
	Delay DELTA 3000
	RecordOn
	Circle DELTA CirclePoint=#{0,100,426,0} TargetPoint=#{-100,0,426,0}
	Delay DELTA 3000
	RecordClose
Detach DELTA
caption



Helical

Here is a simple example for circle in 3D. The circle itself was defined at XY plane with additional movement in Z axis.
The code :
At the config file:

System.NumberAxes = 3
common shared Axes[3] as generic axis
common shared temp_grp  as group Axnm = a1 Axnm = a2  Axnm = a3 
common shared PLANE_XY as const long =0
common shared PLANE_XZ as const long =1
common shared PLANE_YZ as const long =2
Program
 Axes[1] = a1
 Axes[2] = a2
 Axes[3] = a3
 sys.DoubleFormat = 1
 sys.Name = "Helical"
 with temp_grp 
End Program

The setup stage:

dim shared pdl as long = 2
Program continue
 dim i as long = 1
  for i = 1 to 3
    attach Axes[i] 
     ' **** Setting Motion Parameters ****
     Axes[i].fmode = 0
     Axes[i].pemax = 10
     Axes[i].pfac = 2^16     
     Axes[i].vfac = Axes[i].pfac/1000/60
     Axes[i].afac = Axes[i].vfac/1000
     Axes[i].jfac = Axes[i].afac/1000
     Axes[i].VCruise = 1000
     Axes[i].vmax = 3000
     Axes[i].vospd = Axes[i].vmax * 1.2
     Axes[i].velocitysafetylimit = Axes[i].vmax * 1.5
     Axes[i].amax = 30000
     Axes[i].dmax = 30000
     Axes[i].jmax = 300000
     Axes[i].acc = Axes[i].amax
     Axes[i].dec = Axes[i].dmax
     Axes[i].jerk = Axes[i].jmax   
     Axes[i].simulated = ON      
   detach Axes[i]    
 next
 call SetGroup 
terminate Program

The used subroutine and fumction at setup:

sub SetGroup
attach
   en=0
   vord = 100
   Print ".... "; ElementName; " - kinematics/geometric setup"
   PeMax    = 1  ' follwing error in mm (envelope)
   smooth  = -1
   prftype = 1
   vfac    = 1/1000
   afac    = vfac/1000
   jfac    = afac/1000  
   vmax = max(j1.vmax,j2.vmax)
   amax = max(j1.amax,j2.amax)
   dmax = amax    
   decstop = 1.1*dmax
   jmax    = max(j1.jmax,j2.jmax)
   PositionErrorDelay    = pdl
   abs = 1  
   vcruise = 0.5 * Vmax
   acc = amax
   dec = dmax
   jmax = 10*amax
   jerk= jmax
   PositionErrorSettle = 0.1 ' 100um
   BlendingMethod = 0      
   configgroup    
   detach
end sub
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

And the actual program:

dim shared circle_center[8] as joint of XYZ
program
 dim index as long = 1
 attach
   ?VesExecute(" sys.Motion= ON")
   call InitBuffer
    abs = 1
    en =1     
    move {0 , 0 , 0} vcruise = 100 acc= 3000
    move {25 , 0 , 0} vcruise =100  acc= 3000 
    call StillMoving     
    record test11.rec 100000 gap =1 recdata = pcmd{1} , pcmd{2}, pcmd{3}
    recordon 
       ' Start "helical"
      for index = 1 to 8   
       Circle  Angle = 180  CircleCenter = (circle_center[index]+ {0,0,index*5})   Vtran = 500 CirclePlane = PLANE_XY 
       call StillMoving
       print "Position" , pcmd , index
      next     
      sleep 10
   recordclose
 detach
end program 

The used subroutines:

sub StillMoving
 while ismoving <> 0
   sleep 1
 end while
end sub
sub InitBuffer
 dim index as long
 for index=1 to 8 step 2
   circle_center[index] = {0,0,0}
 next
 for index=2 to 8 step 2
   circle_center[index] = {12.5,0,0} 
 next
end sub


The results:

caption

See Also