用MScomm控件读写16台仪表,不要用sleep()低效延时,应该用什么策略???今天都在线等(100分)

  • 主题发起人 主题发起人 yuzhi2005
  • 开始时间 开始时间
一个MSCOMM可以操作多个串口,前提是打开使用之后要关闭.
相同的道理,一个串口可以管理多个串口通信设备(基于485通信),16台仪器也不多,效率低主要怕串口处理数据量过大(由于串口本身速率的关系),100台仪器,每次只发一个字节,上传一个字节(9600波特率)和一台仪器,发10000个节字,收10000个字节(9600波特率),哪一个时间长(还不包括对数据处理的时间).
我以前做过电力抄表管理软件,一次性可以控制多个客户端(电表),所有电表的数据都是一问一答上传到PC机,一般现在的电表或者仪器仪表都是主从应答式的,电脑没有发对应电表地址的命令,仪表就不返回数据.在波特率可以提高的情况下,完全有时间控制16台仪器仪表.如果控制不了,只能说程序上有问题.顺便提一下,在串口里不提倡用SLEEP之类的延时,因为用SLEEP延时无法交出控制权.这样有时从仪表传上来的数据,电脑串口无法及时响应.

按照协议做好公共调用函数之后,用一个FOR循环,就可以一次性读取全部16个仪器仪表的返回数据.不要动不动就搞多线程,线程开多了并不好管理.有利也有弊.
 
sxwy,你说的很有道理,我考虑一下
 
485通信是半双工的,所以必须使用1问1答的方式,整个系统中你的PC是主机,负责发送查询命令,其他设备是从机,只能被动的发送数据。以前我做的电梯监控系统就是如此的。要注意的是可能某些从机发生故障不能答复,需要你在主机的轮询编码中考虑到。
 
ccwwdd,你说的太对了,本来我是用时间触发方式的,但是因为机器故障,没有办法处理这种故障事件,所以才觉得有点麻烦的
 
加入时间控制,在对某一个设备发送数据后,等待规定的时间,如果还没有数据返回,就认为超时,不处理,跳到下一个设备.WHILE等待时加入APPLICATION.PROCESSMESSAGES.就可以解决等待"死机"的现像.
 
读完前台发消息通知读后一台
 
sxwy,我用Timer加了一个时间延时判断是否超时,但是不好使,Timer本身是不精确的,控制也不好控制,他和单片机上的定时器还是有区别的,不好用啊
 
另外APPLICATION.PROCESSMESSAGES如果加在后面的话,交出了控制权,程序就会执行后面的处理数据程序,但是程序就会执行后面的发送下一台仪表的命令了,这是不行的
 
网中戏,你具体说说你的想法吧,一起讨论一下嘛
 
在pc上使用串行口进行数据通信及交互,一定是异步的,不能简单的使程序顺序执行。因为windwos系统是基于事件触发机制的。在你发送完读1#机状态的命令(同时启动超时定时器)后,应该交出控制器给系统,等待2个事件的发生:一是串行口收到1#机的状态数据;二是超时定时器被触发(1#机未响应)。不管是那一种事件被触发,在这些事件的处理代码中你都可以发送读2#机的命令了。
 
把协议给出来吧,有哪么难吗.有时间帮你做算了.
 
我当时也做过一个跟这差不多的东西,我的做法是采集层和上位(显示,储存)分开,中间隔一个内存映射。
 
ccwwdd,我试验过你的方法但是,我要读16台仪表啊,怎么样安排程序,才能使发送完读命令,启动定时器,交出控制权,而不执行发送下一条命令的程序,但是还要使读16台仪表的过程连续起来,并且中间如果有仪表坏掉了,可以检测出来,并跳过继续读下一条指令呢???
 
sxwy,谢谢啊,仪表不在你身边,就是你做了也不好试验,先谢谢了,这几个月我天天上大富翁,我接触的专业网站这个是最好的,这上面的朋友很热心,我学到了很多东西,sxwy,谢谢你啊,我总结一下我的问题,你愿意帮忙的话,就给看看然后给一个详细一点的框架,具体实现我就做了。
我要实现:
1。程序登陆时用户选择要检测的仪表(当然用户选择的仪表也可能中间坏掉,这个要检测出来,如果选中的仪表突然关掉了,向此仪表发送命令仪表没有返回数据不能触发Oncomm事件)
2。循环检测用户选中的仪表的工作状态,如果处在运行状态则存数据库,画图。
3。每次循环尽可能快,不要用sleep(),最好用事件驱动Oncomm
4。我最关键要解决的是用事件驱动方式触发Oncomm怎么样使整个过程连续起来,并且关掉一个用户选中的仪表,不影响程序的执行。
sxwy,如果你想好了留个电话吧,这样可以交流的更清楚。
如果哪位朋友愿意和我交流就请留个电话或QQ
我的QQ是191916049
 
风林,你的采集层是怎么做的???用的事件驱动还是查询方式???
 
自定义协议
 
加了,看能否帮到你.
 
我原来做过门禁刷卡系统,采用485通讯,采用轮询的方式。一个一个发指令,接收数据。
 
sxwy,我现在在线,好像没有加上啊
 
天道酬勤,你每一个发完命令应该需要延时一下才读数据吧???
 
后退
顶部