求助!组态王和vb通过dde连接的问题! 点击:1673 | 回复:10



gfhit

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2007年10月23日
发表于:2009-04-11 21:43:08
楼主
我用采集卡,用vb做数据采集,把周期采集结束的标志位(比如数字1)通过dde方式传给组态王。可是如果vb不运行采集部分,只运行周期性的给数,没有什么问题,组态王的数据正确。可是只要加上采集部分,通讯就不好使了,这是为什么呀?那位高手能指点压下呀!



tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2009-04-13 09:34:01
1楼

可能是你的采集部分比较占用运行时间导致的。

把程序贴出来看看。

gfhit

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2007年10月23日
发表于:2009-04-13 10:33:00
2楼

Dim DigitalValue As Variant
Dim AnalogValue As Variant 

AdvAI1.AcquireBulkDataToMemory 1000, DigitalValue, 0, False, True
AdvAI1.StopAcquireBulkData (0)
AdvAI1.ConvertDigitalValueToAnalog DigitalValue, AnalogValue, 1000
 

我用的是研华activeDAQ控件,用控件函数采集。

gfhit

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2007年10月23日
发表于:2009-04-13 11:00:12
3楼

Private Sub Form_Load()
AdvAI1.DeviceNumber = 0

AdvAI1.ChannelScanStart = 12
AdvAI1.ChannelScanCoun= 2

‘Sets DataSampleRate
AdvAI1.DataSampleRate = 1000

‘Stts timer
Timer1.Interval = 15000
Timer1.Enabled = False


End Sub

Private Sub Timer1_Timer()
Text.Text = 1

‘Delay
Dim Savetime As Double
‘Text1 = "timeGetTime begin"
Savetime = timeGetTime ‘记下开始时的时间
While timeGetTime < Savetime + 4000 ‘循环等待,延时4s
DoEvents ‘转让控制权,以便让操作系统处理其它的事件。
Wend


‘Starts to acquire bulk data
Dim DigitalValue As Variant
Dim AnalogValue As Variant

AdvAI1.AcquireBulkDataToMemory 1000, DigitalValue, 0, False, True
AdvAI1.StopAcquireBulkData (0)
AdvAI1.ConvertDigitalValueToAnalog DigitalValue, AnalogValue, 1000


‘Delay
Savetime = timeGetTime ‘记下开始时的时间
While timeGetTime < Savetime + 4000 ‘循环等待,延时4s
DoEvents ‘转让控制权,以便让操作系统处理其它的事件。
Wend
Text.Text = 0
End Sub

Text.Text  与组态王连接。vb运行没有问题,Text.Text  0、1交替变化,但组态王对应的变量不变。请高手指点!

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2009-04-14 11:13:46
4楼

看看组态王给的例子吧

http://www.gongkong.com/webpage/solutions/200205/5-82B0-A3A587AFDC3E.htm

 

“可是如果vb不运行采集部分,只运行周期性的给数,没有什么问题,组态王的数据正确。可是只要加上采集部分,通讯就不好使了”

能否描述的更清楚些?感觉DDE连接时间溢出。

针对你的程序,改成如下:

Private Sub Timer1_Timer()
Text.Text = 1

debug.print  "Text.Text=1 --- 1",timeGetTime


‘Delay
Dim Savetime As Double
‘Text1 = "timeGetTime begin"
Savetime = timeGetTime ‘记下开始时的时间
While timeGetTime < Savetime + 4000 ‘循环等待,延时4s
DoEvents ‘转让控制权,以便让操作系统处理其它的事件。
Wend


‘Starts to acquire bulk data
Dim DigitalValue As Variant
Dim AnalogValue As Variant

debug.print "Text.Text=1 --- 2",timeGetTime

‘ ----------------------------------------------------------------------------------------
‘ 加上下面的程序就不行了是吗?
‘ ----------------------------------------------------------------------------------------
‘ AdvAI1.AcquireBulkDataToMemory 1000, DigitalValue, 0, False, True
‘ AdvAI1.StopAcquireBulkData (0)
‘ AdvAI1.ConvertDigitalValueToAnalog DigitalValue, AnalogValue, 1000
‘ ----------------------------------------------------------------------------------------

debug.print "Text.Text=1 --- 3",timeGetTime
‘Delay
Savetime = timeGetTime ‘记下开始时的时间
While timeGetTime < Savetime + 4000 ‘循环等待,延时4s
DoEvents ‘转让控制权,以便让操作系统处理其它的事件。
Wend

debug.print "Text.Text=1 --- 4",timeGetTime
Text.Text = 0
End Sub

gfhit

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2007年10月23日
发表于:2009-04-14 16:07:47
5楼

对,3楼所示程序删除2楼所示的程序后运行,在组态王里得到的是0、1交替变换的现象。如果用3楼所示程序运行,在组态王中的现象是0、1只循环交替一次,第二次周期开始就不变了。

gfhit

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2007年10月23日
发表于:2009-04-14 16:15:55
6楼

而且当组态王和采集程序同时运行一段时间后,就会出现诸如什么什么内存不可读或者不可写这样的系统错误。

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2009-04-14 16:39:26
7楼

 

自己写一个dde client或找一个别的支持dde程序 测试一下看看,是不是和组态王连的现象一致。

如果一致,更多的可能是你的程序有问题。

debug.print "Text.Text=1 --- 2",timeGetTime 得到的时间是多少呀?是不是采集程序段占用时间太多。一个简单的做法就是加消耗同样多的时间看看出现的现象是否一样。

Savetime = timeGetTime ‘记下开始时的时间
While timeGetTime < Savetime + 4000 ‘循环等待,延时4s (如果采集时间是占用4s)
‘不转让控制权。
Wend

另外,你的程序定时器15s执行一次,在Ontimer里先延时4s,再采集数据,又延时4s,不知道有何用意?

gfhit

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2007年10月23日
发表于:2009-04-15 12:18:24
8楼

测试时间如下:

Text.Text=1 --- 1       2245814
Text.Text=1 --- 2       2249815
Text.Text=1 --- 3       2250818
Text.Text=1 --- 4       2254822

我觉得从时间上看应该没什么问题。采集时间大概是是1s。

gfhit

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:90
  • 注册:2007年10月23日
发表于:2009-04-15 12:22:08
9楼
延时是为了让组态王有充裕的时间处理所得到的数据。

tomyi

  • 精华:0帖
  • 求助:1帖
  • 帖子:21帖 | 233回
  • 年度积分:0
  • 历史总积分:598
  • 注册:2002年10月30日
发表于:2009-04-16 15:53:02
10楼

那就自己写一个dde client或找一个别的支持dde程序 测试一下看看,是不是和组态王连的现象一致。 如果能正常显示,则就说明组态王有问题?问组态王技术支持,或则采用别的途径,如OPC或直接做一个控件,在组态王里调用。。。




热门招聘
相关主题

官方公众号

智造工程师