首页 上一页 1 2 下一页 尾页

如何在控制器和上位机之间完成大量数据传送? 点击:3860 | 回复:22



renmingcan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2010-11-26 18:53:07
楼主
我现在通过B140控制scara机械手,但是机械手在做直线运动时,需要大量插补数据,我现在的做法是将数据通过函数放到数组中,然后使用CD命令,而B140的数组容量只有800,所以数据不能一次下载完成,只能通过分段下载,我的问题是如何实现数据连续发送?

个人的想法是:把数组容量一分为二,一个用来供给CD命令,另外一半用来从上位机接收数据,当一个数组中的数据发送完后,切换为接收数组,原来的接收数组供给CD命令。采用这种方法,就需要控制器和上位机之间完成交互,可以参考GALIL网站的APP NOTES NO. 2414,但在2414中使用的时UI命令,B140并不支持,但可以通过变量的方式完成交互,如何通过上位机设置变量的数值?我的想法是(1)通过数组上传,轮询变量状态,通过数组下载修改变量状态。(2)通过计算机发送MG指令查询变量状态,如何更改变量状态?(3)使用ZA命令设置自定义变量,通过查QR询自定义变量。请教大家这几种方式有什么优劣?哪种方式更可靠一些?另外是否有更好的方法可以使用?谢谢!



刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2010-11-29 10:25:03
1楼

如何通过上位机设置变量的数值?

直接发指令就可以了。如控制器上有变量POINT,PC要查询该变量的值,只要发指令“POINT=”,控制器的反应和“MG POINT”是完全一样的。PC要设置该变量的值,比如设置为376,只要发指令“POINT=376”,控制器向对待其它指令一样反馈冒号和回车。

 

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2010-11-30 08:43:33
2楼

多谢刘工解答。在使用contour模式时,我碰到了一个比较诡异的问题(个人感觉),当我使用CM ABC时,C轴只有使用CD 正的数据时才动作,当CD加负的数值时没有动作,查看_CM一直为1,使用MG输出发现数据缓冲区满了之后,并没有执行。而使用RPC =正值或负值时都会动作,比较CE,MT,然后将CE,MT设置为相同的数值,症状依旧,换用CM ABD数据就可以顺利执行,请教刘工这可能时什么原因引起的?有设置不对的地方?

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2010-11-30 09:28:57
3楼

抱歉,我看着有点乱。

“C轴只有使用CD 正的数据时才动作,当CD加负的数值时没有动作,”

您给的什么数据?给数据的具体指令是什么?

 

“使用MG输出发现数据缓冲区满了之后,并没有执行”

您是用什么指令查看的,控制器反馈的是什么?

 

“而使用RPC =正值或负值时都会动作,”

RP本身是个查询指令,您用的实际IP还是PR?C轴是否连接了限位开关或设置了软极限?

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2010-11-30 21:21:23
4楼

呵呵,不好意思,我描述的不是很清楚,比如我在CM C的状态下,连续使用CD 500两次马达可以动作,而使用CD -500马达不动作。我用数组填充缓冲区,用一个变量记录数组下标,用MG _CM输出缓冲区剩余容量。当使用CD -500,CD -500,...当缓冲区MG _CM 输出为1后,程序就停下来了,CD指令就不会继续执行。RPC是输入错误,我用PRC 500和PRC -500马达都动作,但是CD使用负数时就没有反应。C轴我用LDC =3禁用了限位开关,查看正负软件限位都是一个非常的数值,好像是27XXXXX吧,具体数值我也记不清楚了

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2010-12-01 10:02:47
5楼

真的很奇怪了,我重复一下这个动作试一下。

另外问一下,您的时间间隔设置的是多少?用的是什么马达?

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2010-12-01 21:42:38
6楼

我用的时间间隔是DE =4或者5,马达是东方马达的alpha step马达

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2010-12-01 22:20:34
7楼

我自己试了一下,确实只要是C轴给出负数,就不再执行了,A、B、D轴没有发现这个问题。着应该是控制器本身的内部BUG。

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2010-12-04 14:54:16
8楼

多谢刘工的解答,这样我就不用去反复试验了。我就用ABD来走contour模式,用C轴走Z方向。

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2010-12-06 12:41:41
9楼
这个实在是很抱歉了!我们在和原厂联系,修正这个BUG,但是在没有真正拿到原厂修正版测试之后,也不敢答应您这个问题哪天能改好。

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2010-12-11 19:36:13
10楼

没关系 。还有一个问题想要请教刘工,我用arraydownload和arraydownfile函数下载数据时发现这两个API貌似占用的机器周期有些长,测试发现使用API下载CSV文件时占用机器周期较长,开始以为是windows读写硬盘速度慢引起的,于是将数据提前读入数组,使用下载数组的API函数性能并没有多大改善。我在终端输出时间,发现下载文件时,终端输出会停顿一下,时间差至少是140个工作周期数,最多1000多个,机器在动作时,中间会出现明显的停顿。如果有大量数据的话,就不能简单的通过将数据下载到数组中进行操作。我现在直接3使用*250个数据,机械手运动完成后,下载新的数据,然后继续运行。看来缓冲区少的运动控制器使用Countour模式还是有些难度。

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2010-12-15 09:13:00
11楼
抱歉,这几天没上网,回复得太晚了。

您目前下载数组,一次下载的数据量是多少?您前面说是用了两个数组,这两个数组分别是多大的?个人建议是改成“少吃多餐”的方式。

之前我做类似的应用时,是循环使用一组数组X[200],Y[200],Z[200]作为缓冲区(因为早期的GALIL卡轮廓模式没有缓冲区),用一个变量做“指针”,当PC发现数组使用超出50组数据时,就就开始补充数据了,而且数据也不是采用数组下载的方式,而是一个元素一个元素的赋值,例如 DMCCOMMAND(HDMC,“X[0]=100;Y[0]=50;Z[0]=35”,RESP,RESP;EN)(因为早期的GALIL卡不支持在运动中下载数组)

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2010-12-16 22:50:30
12楼

我是用的是两个数组,{A[100],B[100],C[100]}和{D[100],E[100],F[100]},用个变量做指针,当一个数组数据发完之后,切换到另外一个数组,但是数组下载的时候的时候感觉控制器会产生较大的时延。我原来的想法是CD指令执行一次,就从上位机下载一个数据,感觉效率不是太高,但是基本上可以保证两个CD指令之间的时间差不会相差太大。我用的是GalilTools,不知道DMCWin是否也可以支持DMC-B140,因为我记得注册时,提示无法识别的控制器。我用的VC 6.0,所以就使用的COM编程。今天修改程序时碰见一个比较奇怪的问题,不知道是我自己的程序出现了问题,还是别的问题。症状大体如下:(1)在程序里使用command发送AM指令(命令手册里提到不让使用command发送AM指令),即使发送了只是command会提示超时报错,现在的状况是,马达运动了,但是查看TD和TP,发现并没有到目标位置。(2)去掉发送AM指令,反复测试,偶尔也会出现TD和TP不能到达目标位置,一般第一次运动会出现偏差的概率较大 (3)将函数中的AC和DC指令设定去掉,暂时测试正常。我现在还没有弄明白出现问题出现在哪里。我的程序结构如下。

发送位置指令

while(查询马达是否停止 && 马达是否报警 )

{

查询马达是否超时;

}

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2010-12-17 09:10:51
13楼
“不知道DMCWin是否也可以支持DMC-B140”

不支持,可以把B140当作2200设置,这样可以实现基本的 DMCOPEN、DMCCLOSE、DMCCOMMAND

“我原来的想法是CD指令执行一次,就从上位机下载一个数据,感觉效率不是太高,但是基本上可以保证两个CD指令之间的时间差不会相差太大。”

效率未必有多大的差别,只是有了一定的“实时要求”



“在程序里使用command发送AM指令”

这样会导致在运动结束前控制器对PC完全没有相应,包括这次的指令本身也不响应,所以出现超时错误。

“马达运动了,但是查看TD和TP,发现并没有到目标位置。”

是马达运动结束后,TD没有到位么?至于TP,您在编码器接口上接的是什么啊?

能否问一下 “查询马达是否停止”和“马达是否报警”,以及“查询马达是否超时”的具体指令内容?


“将函数中的AC和DC指令设定去掉,暂时测试正常。”

您原本是设置了什么样的AC与呢?具体的指令内容是什么?

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2011-01-13 08:32:09
14楼


“马达运动了,但是查看TD和TP,发现并没有到目标位置。”

"是马达运动结束后,TD没有到位么?至于TP,您在编码器接口上接的是什么啊?"

TD和TP都没有到位,后来经过检查,可能是马达报警接线有些问题。编码器接口上接的是步进电机的编码器

 

能否问一下 “查询马达是否停止”和“马达是否报警”,以及“查询马达是否超时”的具体指令内容?

查询马达是否停止使用的是 MG _TS。马达是否报警我使用的是外部的输入板卡,查询马达是否超时是马达开始运动时,读取当前时间,然后加上马达的超时值,如果马达在停止时,读取的时间值<当前数值+超时值,就认为没有超时,否则认为马达运行超时,系统报错。




“将函数中的AC和DC指令设定去掉,暂时测试正常。”

您原本是设置了什么样的AC与呢?具体的指令内容是什么?

原来AC和DC只是设置的加速度,问题可能不是这里引起的

 

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2011-01-13 08:56:21
15楼

请教刘工:现在设备已经可以正常作业了,但是我通过观察发现在每次发送指令之间通过GalilToolsLite查看TC,每次指令开始之前都会产生一个123 TCP lost sync or timeout TCP通讯错误,在命令手册里有这样的描述“在运行控制器上的用户程序时,如出现以太网通讯错误(123 TCP lost sync or 则自动在 0 线程运行以此标号开头的子程序。出现这样的错误,意味着通讯句柄 TCP应答信号(例如,由于连接线断开) 。这种情况下,出错的句柄被关闭。”是什么原因导致的123错误呢?

我现在的做法是每次发指令前都通过putaddress连接控制器,然后发送指令。有没有可能每次使用的通讯句柄都不相同,而导致这个错误?或者不需要频繁连接控制器?

还有一个问题就是42 Contour data being sent too slowly 轮廓数据提供太慢,这个错误会偶然发生,查询CM为31,而不是正常值的32,也就是说有一个数值一直发送不出去。我也没有想清楚是什么原因导致的?这个错误一般出现在走直线段的情况下,在走直线段时,我为了减小机械振动,将DT指令的时间值增大了1,也就是速度慢了一倍。

如果出现了42号错误,采用什么样的办法是相对安全的?可以让设备继续运行,而不需要初始化。在报错的情况下,我通过GalilTools查看编码器的数值,发现数值应该还是可以正常变化的。是不是可以采用读取编码器的数,然后让系统使用RS让控制器复位,然后恢复编码器的数值。貌似这种方法比较复杂,实在不行我就直接报错,让机台重新初始化。

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2011-01-13 10:36:19
16楼

确实不需要频繁连接控制器。除非已经确认连接出了问题,否则不需要重新连接。

建议你更充分的利用缓冲区,而不是让缓冲区中只保持有一组数据的状态,至少给个两三条吧。

出现42号错误,实际上不影响控制器的工作,不需要控制器复位

 

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2011-01-13 21:52:27
17楼

回复内容:我的缓冲区基本上会有数据的,在出现42号错误时,CM一直保持为31,不能恢复为32

对:刘岩利 关于内容的回复:



确实不需要频繁连接控制器。除非已经确认连接出了问题,否则不需要重新连接。

建议你更充分的利用缓冲区,而不是让缓冲区中只保持有一组数据的状态,至少给个两三条吧。

出现42号错误,实际上不影响控制器的工作,不需要控制器复位

 

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2011-01-14 15:56:58
18楼

"我的缓冲区基本上会有数据的,在出现42号错误时,CM一直保持为31,不能恢复为32"

那么,最后一条CD命令是怎么写的?

renmingcan

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 18回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2004年12月29日
发表于:2011-01-21 10:40:01
19楼

回复内容:

最后一条指令是这样写的

DT 0;
CD 0,0,0,0=0;

42号错误只是偶发的,可能几天才会出现一次


对:刘岩利 关于内容的回复:



"我的缓冲区基本上会有数据的,在出现42号错误时,CM一直保持为31,不能恢复为32"

那么,最后一条CD命令是怎么写的?

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:16帖 | 8239回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2011-01-21 13:11:55
20楼

哦,我的意思是,出错前的最后一条指令是什么。


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页