各位前辈,我现在用的是DMC-B140,用vb.net编程,现在遇到一些问题,请各位帮帮忙,谢谢。
G1_control.commandValue("PA,, 7500 ;BGC;AMC")
Do Until G1_control.commandValue("SCC") = 1
Application.DoEvents()
LOOP
G1_control.commandValue("PA,, -7500 ;BGC;AMC")
Do Until G1_control.commandValue("SCC") = 1
Application.DoEvents()
Loop
我想做的是让C轴先向下运动3mm,然后再向反方向运动3mm,但是程序会报错,报错的原因是没有足够的
时间读取下一个命令,但是我已经用SCC这个命令来判断C轴是否已经停止,为什么还会有错呢?之后在
帖子中看到刘工建议用_BGX来判断当前轴的运动状态,G1_control.commandValue("_BGC")但是程序不
识别该指令,是我的格式不正确,还是有其他的原因呢?
还有个问题,看资料上,应该是选用TP来反馈当前轴卡的运动位置,但是通过GAILTOOL来观察时,
TPX的数值只有我发送的脉冲数的一半,并且不稳定,一直在跳变,是该选用TD来反馈吗?
回复内容:
对: 刘岩利 1、AMC本身就是一个需要时间的指令 2、_BGC不是... 内容的回复!
非常感谢刘工的热心解答。
我还有一些困惑之处
1)如果电子齿轮比设置正常的情况下,TPX的值是不是应该几乎等于TDX的值,有一个脉冲的差别是正常的,我的理解对吗?我上次问题中提到值会跳变,通常会有6,7个脉冲的变化,这还正常吗?
2)是通过调用TVX的命令来反馈各轴运动的速度吗?通过galil tool 观察TVX的值,一直在跳变。轴卡运动的速度和脉冲的比例是由哪些因素决定的?
3)机台完成的主要任务是做画线,通常只用PA,PR,LM等命令,很不理解JOG运动命令,跟随指令,电子齿轮同步功能这些是特定的功能才需运用吗?
我是一只菜鸟,还请刘工多包容我提的这些比较幼稚的问题
1)如果电子齿轮比设置正常的情况下,TPX的值是不是应该几乎等于TDX的值,有一个脉冲的差别是正常的,我的理解对吗?
一般来说,是建议电子齿轮比这样设置。
我上次问题中提到值会跳变,通常会有6,7个脉冲的变化,这还正常吗?
这要看您使用的伺服和机械了。有些号称高分辨反馈的伺服,但是实际应用中自己就不能定位在1-2个分辨率以内。当然,也可能是机械本身有扰动或者驱动器参数不太合适。
2)是通过调用TVX的命令来反馈各轴运动的速度吗?通过galil tool 观察TVX的值,一直在跳变。轴卡运动的速度和脉冲的比例是由哪些因素决定的?
TVX得到的是编码器反馈的速度,而且是最近0.25s内的平均速度。鉴于您的编码器反馈值就在不停的跳,那么TVX的值肯定也是不停的跳。
3)机台完成的主要任务是做画线,通常只用PA,PR,LM等命令,很不理解JOG运动命令,跟随指令,电子齿轮同步功能这些是特定的功能才需运用吗?
作为通用运动控制卡,当然要提供很多功能给不同的用户使用。这些功能指令本身对于其它用户可能是基本功能,对您来说,也可以算是特定的功能。这个没有严格的标准定义。
回复内容:
对: 刘岩利 1)如果电子齿轮比设置正常的情况下,TPX的值是不是应... 内容的回复!
刘工,您好,我最近又遇到一些问题,还请您帮忙答疑,非常谢谢
1) 我们用sp xx的命令设置单轴运动时轴的速度,如果我要求A轴速度为10mm/s,那么sp xx的xx 该设为多少呢,这个中间的比例怎么换算呢?加速度又是怎么换算的?
2)我现在想让机台做动作,Z轴放下,画一条线(可以是直线或者是斜线),抬起,然后移动到其他点,再下降Z轴,画线,抬起,多次重复这个动作,但是每次画线的位置不一样。
想请教下是采用多轴运动还是插补(A,B轴)或插补三轴的的方式来完成这个动作呢?它们有什么区别吗?
我现在选用的插补(A,B轴),但是遇到了一个问题,在画完一条线时,是用下列语句来判断这个插补动作是否完成,
Do UntilG1_control.commandValue("MG_BGA") = 0 And G1_control.commandValue("MG_BGB")= 0
Application.DoEvents()
Loop
又因为DOevents要处理的动作就是Z轴画线产生的相关消息,那么即使这时已经查询插补运动已经完成了,但是还因为DO EVENT这个动作一直才进行,所以不能跳出这个循环,您有什么好的建议吗?
3)机台进行的另一个动作是Z轴放下,画一圈线,再抬起,如果我采用的是三轴插补的运动方式,就是将所到所要运动的指令都存放在LI指令中,只有在整个插补运动完成后才作一个判断,那么我该怎么判断LI中存放的那些指令是否执行完?
4)插补运动中速度Vs=sqr(Va*2+Vb*2),如果我要画一条斜线的速度为10mm/s,那是否设置Vs=10即可?
5)是不是想让机台运动的更精确,都应该在每个动作是都需添加加速度和减速度的指令呢?加速度和减速度又需怎么设置才合理呢
"1) 我们用sp xx的命令设置单轴运动时轴的速度,如果我要求A轴速度为10mm/s,那么sp xx的xx 该设为多少呢,这个中间的比例怎么换算呢?加速度又是怎么换算的?"
SP指令,是以输出的指令脉冲的频率为单位的。至于和您的机构实际运动速度中间的比例是多少,这个我是不可能知道的。您和机构设计以及电气设计人员确认一下,一个指令脉冲对应的移动距离是多少。加速度也是同样的转换方式。
“2)我现在想让机台做动作,Z轴放下,画一条线(可以是直线或者是斜线),抬起,然后移动到其他点,再下降Z轴,画线,抬起,多次重复这个动作,但是每次画线的位置不一样。
想请教下是采用多轴运动还是插补(A,B轴)或插补三轴的的方式来完成这个动作呢?它们有什么区别吗?
我现在选用的插补(A,B轴),但是遇到了一个问题,在画完一条线时,是用下列语句来判断这个插补动作是否完成,
Do UntilG1_control.commandValue("MG_BGA") = 0 And G1_control.commandValue("MG_BGB")= 0
Application.DoEvents()
Loop
又因为DOevents要处理的动作就是Z轴画线产生的相关消息,那么即使这时已经查询插补运动已经完成了,但是还因为DO EVENT这个动作一直才进行,所以不能跳出这个循环,您有什么好的建议吗?”
比较简单直接的建议就是改善您“处理的动作就是Z轴画线产生的相关消息”的相关程序代码。
如果需要其它建议,那么还需要确认您的动作要求,比如画线的动作是否连续,画两根线之间,有没有其它的动作要做?
至于是两轴插补还三轴插补来实现画线的动作,主要区别是速度的变换,如果是三轴插补,Z轴的升降会比较生硬,需要额外处理一下。用两轴的简单一点。
“3)机台进行的另一个动作是Z轴放下,画一圈线,再抬起,如果我采用的是三轴插补的运动方式,就是将所到所要运动的指令都存放在LI指令中,只有在整个插补运动完成后才作一个判断,那么我该怎么判断LI中存放的那些指令是否执行完?”
无论是两轴还是三轴插补,都可以查询操作数 _CS 得到当前执行的是第几段插补线
“4)插补运动中速度Vs=sqr(Va*2+Vb*2),如果我要画一条斜线的速度为10mm/s,那是否设置Vs=10即可?”
当然不行,除非您的机构是一个脉冲就可以移动1mm的,否则,就要做好比例换算。
“5)是不是想让机台运动的更精确,都应该在每个动作是都需添加加速度和减速度的指令呢?加速度和减速度又需怎么设置才合理呢”
您是指插补的线段么?如果下一条线段与当前的线段的方向夹角不大 的话,就不必额外的加、减速处理。如果是一般的定位运动,则不需要每次都重新设置,控制卡会记得并使用您上次的设置值。
加速度和减速度的设置,是以符合设备需要为合理的标准。首先,驱动部分要能够实现,加速和减速都是要靠电机输出的力或力矩来实现的,如果电机本身输出的力矩就不够,设置过的啊的加速度无法实现,反而回带来问题。其次,机构要能承受,设备不会因为过大的加速度带来严重的晃动。不要反复运动几次以后,机构就散架了。最后,在满足前两点的前提下,数值尽量大一点,提高效率。
回复内容:
对: 刘岩利 "1) 我们用sp xx的命令设置单轴运动时轴的速度,... 内容的回复!
多谢刘工热情解答,可能是我表达的有些不清楚,有些问题还是不太理解,还请帮忙
1)现在机台的设置是A轴运动1mm,需要发送1000个脉冲,那么对应的1mm/s的速度是否也是就是设定SP1000呢?加速度?
2)
如果我要让机台执行上图这个动作,我可以采取这种方法,
第一种就是比较笨拙的,采用PAA,PAB的多轴运动,每次运动到一个点,就用MG_BG的方式判断是否完成,完成再进行下一个点;
第二种是采用插补方式,大概就是
我们用一个定时器不停的获取机台当前的坐标,设为xx,yy
a)
PA x0,y0
do until()
loop
PA,,z1
do until()
loop
LMAB
LI x1-xx, y1-yy
LI x2-xx, y2-yy
……
LE
PA,,-z1
BG
这段程序可以准确的完成图中的动作?
b)
把上段程序中间那段的换成
LMAB
LI x1-x0, y1-y0
LI x2-x1, y2-y1
……
LE
这样写和上一段程序是否有区别吗?
因为我担心机台由于从(x0,y0) 走到(x1,y1),是否有可能因为速度等相关问题,还未完全走完,就又开始向(x2,y2)运动,是否采取第一段程序要更精确?
c)如果不想调单独调用PA这个指令,是否采用三轴插补的也可满足
LMABC
LI x0-xx,x0-yy,0
LI 0,0,Z1
LI x1-x0, y1-y0,0
LI x2-x1, y2-y1,0
……
LI 0,0,-z1
这样可行吗 ?
3)插补运动中速度Vs=sqr(Va*2+Vb*2),我要画一条斜线的速度为10mm/s,假设我们的比例是10mm/s对应SP=10000,那VS=10000还是VS=sqr(10000*2+10000*2)
4)上图中的拐角是否也只能加速,减速的方式去改善?
复内容:
对: 刘岩利 1、是的,SP1000 2、不知道你写出来的是VB的程... 内容的回复!
刘工您好,很感谢您每次热心的解答
我上面那段程式的确是个大概的流程,上面图中的线段是由7个点构成的,我用(x0,y0),(x1,y1),(x2,y2)……表示这个7个点的坐标,(xx,yy)是我用一个定时器不断抓取当前机台反馈的位置,z1是机台抬起或下降的距离;
两轴插补程序:
G1_control.commandValue("LMAB;LI (x0-xx) ,(y0-yy) ;LE;BGS)
Do Until G1_control.commandValue (MG_BGA") = 0 And G1_control.commandValue("MG_BGB") =0
Application.DoEvents()
Loop
G1_control.commandValue("PA,,z1;BGC;")
Do Until G1_control.commandValue("MG_BGC") = 0
Application.DoEvents()
loop
G1_control.commandValue("LMAB;VS10000;VA100000;VD100000;
LI (x1-x0) ,(y1-y0) ;
LI (x2-x1) ,(y2-y1) ;
……
LI (x6-x5) ,(y6-y5) ;
LE;BGS)
Do Until G1_control.commandValue (MG_BGA") = 0 And G1_control.commandValue("MG_BGB") =0
Application.DoEvents()
Loop
G1_control.commandValue("PA,,-z1;BGC;")
Do Until G1_control.commandValue("MG_BGC") = 0
Application.DoEvents()
loop
三轴插补程序
G1_control.commandValue("LMABC;VS10000;VA100000;VD100000;
LI (x1-x0) ,(y1-y0),0;
LI 0 ,0,z1;
LI (x2-x1) ,(y2-y1),0;
LI (x3-x2) ,(y3-y2),0;
……
LI (x6-x5) ,(y6-y5),0;
LI 0 ,0,-z1;
LE;BGS“)
Do Until G1_control.commandValue (MG_BGA") = 0 And G1_control.commandValue("MG_BGB") =0 And
G1_control.commandValue("MG_BGC") =0
Application.DoEvents()
Loop
(1)请教刘工这两段程序是否都能实现图中的动作?除了您上次回答说,三轴插补运动中Z轴升降生硬,其他是否无区别?
(2)您说“但是每两个线段之间都是拐直角,建议在没个线段的末端加山减速,否则多半有震荡的。”
是否用“VA100000;VD100000;”可以满足?还是需要另加其他指令?
(3)因为插补运动是将多个指令依次执行完成,是否会有从第一点走向第二点,第二点还未到达,就向第三点运动的可能?