菜鸟求助,我现在用DMC4020控制两个音圈电机作正弦运动,目前可实现单个轴在S或T坐标系下的循环运动,但是同时执行却想不出怎么实现,望各位大神指点一二!
下面是目前的程序
BR1,1
SHAB
R1=100
R2=100
VST= 10000
VSS= 10000
I=1000
J=1000
A=0
B=0
WT3000
#A
CA T;' Specify T coordinate system
VM AN;' Declare A and N-axis as S-plane
CR R1,0,360;' Generate circle with radius of 1000 counts
VE;' End Sequence
BG T;' Start motion of T-plane
#LOOA
A=A+1
CR R1,0,360
VE
#WAITA
JP#LOOA,_LMT>1
JP#WAITA,A<I
STT
AMT
CST
#B
CA S;'Specify S-plane
VM BM;'Declare B and M-axis as S-plane
CR R2,0,360;' Generate circle with radius of 1000 counts
VE;' End Sequence
BG S;'Begin movement on S-plane
#LOOB
B=B+1
CR R2,0,360
VE
#WAITB
JP#LOOB,_LMS>1
JP#WAITB,B<J
#STOP
ST; 'stops motion
AMS; 'waits for motion to complete
VE; 'ends vector mode
CSS; 'clears all sine waves out of vector buffer
MG"finished"
EN
18328063092 | 个人主页 给TA发消息 加TA为好友 发表于:2016-11-01 11:14:34 楼主 |
您可以在不同的线程来运行#A和#B。可参考如下修改后的程序。 BR1,1 SHAB R1=100 R2=100 VST= 10000 VSS= 10000 I=1000 J=1000 A=0 B=0 WT3000 XQ #A,1 XQ #B,2 EN #A CA T;' Specify T coordinate system VM AN;' Declare A and N-axis as S-plane CR R1,0,360;' Generate circle with radius of 1000 counts VE;' End Sequence BG T;' Start motion of T-plane #LOOA A=A+1 CR R1,0,360 VE #WAITA JP#LOOA,_LMT>1 JP#WAITA,A<I STT AMT CST EN #B CA S;'Specify S-plane VM BM;'Declare B and M-axis as S-plane CR R2,0,360;' Generate circle with radius of 1000 counts VE;' End Sequence BG S;'Begin movement on S-plane #LOOB B=B+1 CR R2,0,360 VE #WAITB JP#LOOB,_LMS>1 JP#WAITB,B<J #STOP ST; 'stops motion AMS; 'waits for motion to complete VE; 'ends vector mode CSS; 'clears all sine waves out of vector buffer MG"finished" EN |
BR1,1
SHAB
R1=100
R2=100
VST= 10000
VSS= 10000
I=1000
J=1000
A=0
B=0
WT3000
XQ #A,1
XQ #B,2
EN
#A
CA T;VM AN;CR R1,0,360;BG T
#LOOA
A=A+1
CAT;CR R1,0,360
#WAITA
JP#LOOA,_LMT>1
JP#WAITA,A<I
CAT;VE
AMT
CST
EN
#B
CA S;VM BM;CR R2,0,360;BG S
#LOOB
B=B+1
CAS;CR R2,0,360
#WAITB
JP#LOOB,_LMS>1
JP#WAITB,B<J
CAS;VE
AMS; 'waits for motion to complete
CSS; 'clears all sine waves out of vector buffer
MG"finished"
EN
如果用单一线程的话,处理有点麻烦
BR1,1
SHAB
R1=100
R2=100
VST= 10000
VSS= 10000
I=1000
J=1000
A=0
B=0
WT3000
CA T
VM AN
CR R1,0,360
CA S
VM BM
CR R2,0,360
BG ST;
#LOOP
IFA<I
IF_LMT>1
A=A+1
CAT
CR R1,0,360
ENDIF
ELSE
IFA=I
A=A+1
CAT
VE
ENDIF
ENDIF
IF B<J
IF_LMS>1
B=B+1
CAS
CR R2,0,360
ENDIF
ELSE
IFB=J
B=B+1
CA S
VE
ENDIF
ENDIF
JP#LOOP,(A<=I)|(B<=J)
AM ST
CS ST
MG"finished"
EN
前面回帖的程序,问题就在于,没有把CA T(S)和对于T(S)的定义内容方在同一行里。
GALIL的多线程,本质上是分时轮流执行的。轮流执行,每次是以一个程序行为单位。也就是说,#A开始的程序和#B开始的程序,是你一行我一行交错执行的。而且GALIL中不存在线程的保护,比如局部变量之类的,单一线程中的指令都会影响到其它线程的相关状态。
所以,在执行了CAT之后,立刻就执行了CAS,所以,无论是CR R1,0,360还是CR R2,0,360,都是针对S的定义,T中没有定义任何内容,这样在执行BGT时,就会产生错误,因为T中没有定义任何运动轨迹,没有运动可以开始。
回复内容:
对: 刘岩利 如果不用同步,只用两个独立的插补来实现,原则上应该也没... 内容的回复!
BR1,1
SHAB
R1=100
R2=200
VST= 5000
VSS= 20000
I=10000
J=10000
VA16414000,16414000
VD16414000,16414000
A=0
B=0
WT3000
KP30,30
KD135,135
KI0,0
TM200
DM TIME[1500],TDA[1500]
RA TIME[],TDA[]
RD TIME,_TDA
RC1
XQ #A,1
XQ #B,2
EN
#A
CA T;VM AN;CR R1,0,360;BG T
#LOOA
A=A+1
CAT;CR R1,0,360
#WAITA
JP#LOOA,_LMT>1
JP#WAITA,A<I
CAT;VE
AMT
CST
EN
#B
CA S;VM BM;CR R2,0,360;BG S
#LOOB
B=B+1
CAS;CR R2,0,360
#WAITB
JP#LOOB,_LMS>1
JP#WAITB,B<J
CAS;VE
AMS
CSS
EN
RPA RPB分别是A电机和B电机的参考位置曲线,下面三图分别是三个不同时刻采集到的数据,可以看出RPA和RPB的相对位置关系发生变化,而我设置的程序中,B的频率是A的两倍,理论上讲相对位置关系不会发生变化。
回复内容:
对:刘岩利 既然问题解决了,那应该就是这个因素了,我明天就不试了。至于其它的TM值,您自己算一个合适的速度值吧。当TM值是默认的1000时,速度只要是偶数,就可以。对于其它的TM值,速度设置值的分辨率,是2*1000/_TM。另外,TM的设置也是有一定分辨率的,不是随便设置的,比如您设置的TM200,就不会是一个准确的有效的值。对于TM的分辨率,您看一下手册就行了。 内容的回复:我现在TM值没有设置,R1=100,R2=200,VST=10000,VSS=20000 运行后依然会发生变化,而在同样的速度之下,我当把R1=50,R2=100后,不会发生变化,大概试了几组参数R值都设定为小于150时,不发生变化,我在想是不是R值的影响。