一夜不睡觉等候回复

qiangshou2301 2009-12-28 10:52:51
用了2个精密仪器:一个输入距离值(名为Text2里面)让精密平台动,一个测量精密平台走了多少(在名为Axis的Text框里显示时实数据),由于各自精度不一样,这2个Text里的数据会有差别的。
现在的目的是想:
例如:输入Text2为498um,显示为480um,我怎么写VB程序让显示的也为498um。
这个思路可以吗(举个例子)?
1、498-480=18
2、让精密平台增加18,如果此时显示为492了
3、498-492=6
4、让精密平台增加6,如果此时显示为496了
5、498-496=2
6、让精密平台增加2,如果显示为497了



直到2个数据一样了,精密平台不运动了。
怎么用VB程序实现?
...全文
318 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiangshou2301 2010-01-01
  • 打赏
  • 举报
回复
已解决 谢谢各位
nice3k 2010-01-01
  • 打赏
  • 举报
回复
linc_M 2009-12-31
  • 打赏
  • 举报
回复
滥顶~
qiangshou2301 2009-12-30
  • 打赏
  • 举报
回复
这样思路怎么样?
Private Sub Command5_Click()
Dim result&
Dim chazhi As Double
result& = MMC_sendCommand("M" & "N" & "," & "M" & "A" & Round(Val(Text2.Text) * 145.6355328))
Call Sleep(2000) '先让工作台有个大范围的逼近,如果chazhi>=1,循环判断,小范围逼近
'比较工作台与显示值,判断工作台运动到与需要显示的位置
chazhi = Val(Text2.Text) - Val(Form1.Axis(0).Text)
While (Abs(chazhi) >= 1)
result& = MMC_sendCommand("M" & "N" & "," & "M" & "R" & Round(chazhi) * 145.6355328)
Call Sleep(1000)
chazhi = Val(Text2.Text) - Val(Form1.Axis(0).Text)
Wend
End Sub
赵4老师 2009-12-30
  • 打赏
  • 举报
回复
考虑空回误差了没?
slowgrace 2009-12-30
  • 打赏
  • 举报
回复
不明白你为什么不肯实际试一下,而却一直要求别人凭着想象帮你判断代码是否正确?

这不是舍近求远么?
嗷嗷叫的老马 2009-12-29
  • 打赏
  • 举报
回复
运动控制,HOHO.

你思路是对的啊.

直接用个循环进行调整不就行了.

不过这里面有个机械误差问题,是不可避免的,齿轮不可能无间隙耦合.

你只能使用这种逐次逼近的方式工作.

不过这里要考虑多一点,就是负误差与正误差.

负误差基本上就是机械间隙,正误差一般是惯性过冲.

另外,移动速度最好也依接近距离而递减,不然这种闭环系统会很"硬",声音大不说,长期下来,还对机械特性有影响.
Tiger_Zhao 2009-12-29
  • 打赏
  • 举报
回复
没有说不需要微调,毕竟坐标转换不能保证正好到达目标。
命令应该是
MMC_sendCommand("MN,MR(" & lngDif  & ")") 


还有微调要考虑调过头的情况,参数为负数是否会反向移动?
slowgrace 2009-12-29
  • 打赏
  • 举报
回复
15楼做了么?有什么问题?
辛鹤 2009-12-29
  • 打赏
  • 举报
回复
学习
qiangshou2301 2009-12-29
  • 打赏
  • 举报
回复
gzhjic:这个机械上不能调的,电机快慢也没有关系;
Tiger_Zhao:我还是想按照西西这个思路:
Private Sub Command5_Click() '点击这个按钮平台开始运动
Dim result&
Dim lngDif As Long, lngTune As Long
Dim sngPauseTime As Single, sngStart As Single
result& = MMC_sendCommand("M" & "N" & "," & "M" & "A" & Round(Val(Text2.Text) * 145.6355328)) '发送平台绝对运动的命令,首先想让平台运动Sleep(2000)这样的时间内到达一个绝对位置,光栅尺有个测量值显示在AxiS.Text里。
Call Sleep(2000) '让运动时间间隔2秒

sngPauseTime = 0.2 '这以后都是在大的绝对位置上相对运动,所以时间短,每次只等待0.2秒钟.

lngDif = Text2 - Ax '看Text2.Text的输入值与AxiS.Text显示值的差别
While Abs(lngDif) > 1 '如果误差大于1微米(误差要求在1微米之内)
result& = MMC_sendCommand("MN,MR(Text2 - Ax)") '给微动工作台发相对运动命令让它增加 Text2 - Ax 微米.
sngStart = Timer '等待微动工作台运动0.2秒
Do While Timer < sngStart + sngPauseTime
DoEvents
Loop
lngDif = Text2 - Ax'获得新的差值,如果为0了就表示相对运动没有了
Wend
End Sub
Tiger_Zhao 2009-12-29
  • 打赏
  • 举报
回复
接近法当然可以到达目标位置,用坐标转换只不过是极大地减少首次移动接近目标的距离,可以大大减少接近的步数。
既然0点位置可以校正,那么单位比例是最大问题了,精密机件不大可能出现标尺不均匀的问题,不过热胀冷缩是不能避免的。所以隔段时间(机床温度变化)做一下自检,计算一下单位比例,准确度应该是蛮高的。
gzhjic 2009-12-29
  • 打赏
  • 举报
回复
如果有误差,看看机械部分能不能调调,如果真要坚持自己的方案,重新看看西西给你写的代码吧。
qiangshou2301 2009-12-29
  • 打赏
  • 举报
回复
回复Tiger_Zhao,觉得按照你的第一是比较困难,第二感觉是不是可以采取下面的思路:
启动程序后我的精度稍低的运动台与高精度的位置显示光栅尺都是置零位(现在程序能做到),想进行例如下面的步骤来让显示为输入值:
1、想显示500um,输入500um让工作台从0位绝对运动
2、2秒后运动结束,可能显示只有485um,此时需要相对运动来精调
3、让工作台继续精调500-485=15(相对485um运动15um,这个时间可以很短的),可能此时显示为495um
4、让工作台继续精调500-495=5(相对495um运动5um,这个时间可以很短的),可能此时显示为498um
5、让工作台继续精调500-498=2(相对498um运动2um,这个时间可以很短的),可能此时显示为499um



让工作台继续精调,直到显示为500um
stayor 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qiangshou2301 的回复:]
我想这样不行啊!
VB codePrivateSub Command5_Click()Dim result&
result&= MMC_sendCommand("M"&"N"&","&"M"&"A"&Round(Val(Text2.Text)*145.6355328))Call Sleep(2000)'在2秒时间内让平台运动到输入值(是有误差的,由后面的测量具体是多少)If ((Text2.Text- Axis.Text)<>0)Then
result&= MMC_sendCommand("M"&"N"&","&"M"&"A"&Round(Val(Text2.Text- Axis.Text)*145.6355328))EndIfEnd Sub
[/Quote]

为什么不行呢?
gzhjic 2009-12-29
  • 打赏
  • 举报
回复
学习,将电机速度调慢点误差会不会减少?
Tiger_Zhao 2009-12-29
  • 打赏
  • 举报
回复
既然是精密仪器,测量值和指令有差异应该有以下原因,都可以在启动时做个自检求得
1)0点坐标没对齐
在指令0um位置取测量值 a
2)长度单位有比例差异
在指令最大位置取测量值 b,计算 (b-a)/指令最大位置 即为单位比例
3)螺距误差
在向右到达某个位置后(比如 300),不停尝试以最小单位发送左移指令,在安装指令换算的一定坐标内(比如 299~300)其测量值不变,这个范围长度(例中为 3)即为螺距差。

以后要移动的目标值(测量值),可以更具 1) 和 2) 的参数进行坐标转换成指令值,如果与上次移动反向,再加/减螺距差,基本上一次就能很接近甚至直接到达目标,最多再一两次微调。
qiangshou2301 2009-12-29
  • 打赏
  • 举报
回复
现在运动与测量仪器在另外个研究所那儿,怎么能模拟下最好。
slowgrace 2009-12-29
  • 打赏
  • 举报
回复
跟踪调试一下,一切就明了啦
qiangshou2301 2009-12-29
  • 打赏
  • 举报
回复
回复slowgrace,以上3条都满足。
思路:先让平台绝对运动下(几百个um,所需时间为2秒左右),然后有差别就在前一次平台所在位置的基础上相对运动,直到不再相对运动为止,slowgrace分析下这种思路行吗?不知道我这样写行吗?(我想实现注释的目的):

Private Sub Command5_Click() '点击这个按钮平台开始运动
Dim result&
Dim lngDif As Long, lngTune As Long
Dim sngPauseTime As Single, sngStart As Single
result& = MMC_sendCommand("M" & "N" & "," & "M" & "A" & Round(Val(Text2.Text) * 145.6355328)) '发送平台绝对运动的命令,首先想让平台运动Sleep(2000)这样的时间内到达一个绝对位置,光栅尺有个测量值显示在AxiS.Text里。
Call Sleep(2000) '让运动时间间隔2秒

sngPauseTime = 0.2 '这以后都是在大的绝对位置上相对运动,所以时间短,每次只等待0.2秒钟.

lngDif = Text2 - Ax '看Text2.Text的输入值与AxiS.Text显示值的差别
While Abs(lngDif) > 1 '如果误差大于1微米(误差要求在1微米之内)
result& = MMC_sendCommand("MN,MR(Text2 - Ax)") '给微动工作台发相对运动命令让它增加 Text2 - Ax 微米.
sngStart = Timer '等待微动工作台运动0.2秒
Do While Timer < sngStart + sngPauseTime
DoEvents
Loop
lngDif = Text2 - Ax'获得新的差值,如果为0了就表示相对运动没有了
Wend
End Sub
加载更多回复(13)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧