一台计算机有10几个串口(RS485),每个串口设备接10台Modbus的设备(总线通讯),如果我在这台电脑上同时连接这些设备的话,就会对10个COM口进行读操作,我现在的方案是:
由于每个串口所连接的设备数量和型号相同,所以,我写一个类模块,对单个串口所连接的设备进行通讯和数据处理。然后在主程序中创建10个类实例(其中内部参数不同)。
但是问题是,运行程序的时候,我感觉电脑慢了下来,我不知道实例化10个类的时候,这个主程序是不是还是单线程的,这10个类实例运行的时候还是占用这一个单线程的队列,如果我把这10个类写成10个exe程序,然后再运行的话是不是会好些,这是我的想法。我觉得慢下来应该是单线程满负荷或者是超负荷运行造成的,各位大侠,请给点意见,绝不吝啬分。
由于每个串口所连接的设备数量和型号相同,所以,我写一个类模块,对单个串口所连接的设备进行通讯和数据处理。然后在主程序中创建10个类实例(其中内部参数不同)。
但是问题是,运行程序的时候,我感觉电脑慢了下来,我不知道实例化10个类的时候,这个主程序是不是还是单线程的,这10个类实例运行的时候还是占用这一个单线程的队列,如果我把这10个类写成10个exe程序,然后再运行的话是不是会好些,这是我的想法。我觉得慢下来应该是单线程满负荷或者是超负荷运行造成的,各位大侠,请给点意见,绝不吝啬分。
建议使用支持多线程的开发工具。
你可以试试将串口封装为 activex.exe,工程属性中设置为多线程运行,并且要使用事件回调技术(如果使用等待,用户端则会在调用返回前被挂起)
请介绍一下广播方式的实现方法,因为设备的地址和现场的实际情况,网络结构不能更改了,而且我现在还只对VB的MScomm熟悉一点,请介绍下通讯广播的方法,使用MSCOMM怎么实现?谢谢,
是这样,封装成activex exe
详细你要看MADN,里面有个使用回调的控制咖啡炉的例子,讲的很详细
广播需要设备能支持广播,你要看设备是否能接受广播,广播就是发送0地址数据。Modbus协议是一种应答式协议,主机发出功能及参数,从机马上应答;在一条总线上,一个时刻,主机只能一台从机通信,应该不适合使用广播。
1、VB是单线程的
2、Moudle Bus通信每次只能读取一个下位机。再发表一点不成熟的看法,像楼主这样的情况,不管有多少个串口,我们就管计算机连接的下位机数量,共计100个以上的下位机,如果每个下位机通信占用20ms,那么读完一次也是2s时间,实际时间开销会比这大,建议楼主将串口通信代码放到Timer中,且区别对待,对不精要的数据读取时间间隔放宽些,减少通信时间开销,此外,不要采用OnComm方式通信,发送了命令后等待的方式,并且在等待的循环体中添加DoEvents来释放CPU资源,这样可以有效的防止程序界面“假死”的现象。再者,在硬件上,你可以考虑减少串口,采用 RS485 HUB,把下位机数据缓存在HUB上,这样也能有效的提高通信效率。这样处理,时效性会大幅提高,但成本可能也会提高不少。
Option Explicit
Dim bolWrite(0 To 99) As Boolean '写下位机标志变量,分别对应1~100个下位机
Dim intReadNo As Integer '读取下位机的标识,0~99,分别对应1~100下位机
Private Sub Timer1_Timer()
Dim intP As Integer
For intP = 0 To 99
If bolWrite(intP) Then
'写下位机
End If
Next intP
'读下位机
ReadXiaWeiji (intReadNo)
intReadNo = (intReadNo + 1) Mod 100 '这个是关键,更新读取对象
End Sub
这一句不错,循环,我用的是:A=iif(A=100,1,A+1)兄弟你的思路我知道的,很感谢,通讯设备有一些是自定义的协议,大部分是Modbus,弄起来比较麻烦,现在通讯还算是畅通的,没什么别的问题,就是VB的单线程把程序速度拖慢了,我实例化了10个通讯的类模块,其实还是单线程,只是操作起来方便了些而已。所以我想换个方式来实现
InputLen,InBufferCount,RThreshold的参数,触发oncomm后接收数据放在timer里面还是在oncomm()里面处理呢,我是用timer1自动发送请求指令轮询8个串口,每个串口下面有三个设备,如何用timer2来判断数据是否接受完毕呢?