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

  • 主题发起人 主题发起人 yuzhi2005
  • 开始时间 开始时间
Y

yuzhi2005

Unregistered / Unconfirmed
GUEST, unregistred user!
用MScomm控件读写16台仪表,以前是发完读命令后用sleep()延时,但是因为下位机是16台所以很卡,后来想换成事件触发方式用Oncomm接收,但是遇到两个大问题:
1。如何按用户选择不同发送读命令??(16台仪表不一定全工作)当然对每台仪表的读命令也不一样,但是返回的数据是相同的,都是52字节。
2。如何接收不同仪表的数据????困难在对所有的仪表Oncomm事件只有一个,我还需要对不同的仪表数据存储,显示等操作。
应该用什么策略??今天都在线等了,有做过的请留步,帮忙想一想,不胜感激!!!
 
这个应该用多线程比较好点吧,

我们公司是用Labview做的,
 
Labview能给说说吗??
 
我刚看了看Labview,环境最好先不要换了,用Delphi,多线程我没有用过,像种情况应该怎么写??,大家详细点说说
 
看来你是应用一个串口了,那就没什么办法,只能慢慢来
 
你的数据返回来触发Oncomm,里面有下位机地址码吗?如果有不是一点问题没有。
对于不同仪器返回数据的接收处理,你可能需要自己分析返回数据来判断。

对于整个下位机的巡检 ,你可以选择使用定时器,你这样的要求不高的。这样用户界面也可以及时响应 。
 
机器可以控制吗,
如果可以,
每次返回的数据中让他带一个标志,
这样,电脑就知道接收到的是哪台的机器的数据了,

估计要用线程了,不然没办法控制的。

还有其他办法吗,
 
zywcd,我刚看到你是大幅翁第一名啊,厉害啊
数据接收时可以按你说的,但是用定时器发送命令时不太好办啊
 
Neo_leaf,这方面的多线程你写过吗??给点建议吧
 
zywcd,你的QQ是??
 
Neo_leaf,你的QQ是??
 
排名和水平没有关系。主要看你的应用,我感觉可以。几十台都这样做过。
 
用485方式通讯,采用地址方式读写
 
如果是问答式的通信最好办了.先从主机发送,用485通信管理总线.然后在一个触发事件里接收所有字节.再解包处理.
 
sxwy,我现在就是这样做的,具体实现解决不了啊
 
我发送命令部分要实现的功能是:
(1)自动发送
(2)程序开始时会给用户选择菜单(checkbox),用户选择了哪几台仪表就读那几台仪表
(3)每次发送一台读命令(地址不同)等待Oncomm事件
(4)Timer时间间隔>1s,当然最好尽可能快
我原先用Sleep()时的读部分的代码是:
procedure TMainForm.Timer1Timer(Sender: TObject);
var SQLstring:string;

begin
StatusBar1.Panels[0].Text:='正在检测各仪表';
/////////////////////////////////////////////读出1号仪表的温度及状态
if (form1.CheckBox2.Checked=true) then
begin
Readtempt($30,$31);Temptorder1:=Temptorder; //mainform.Timer1.enable//仪表在运行状态时存数据库的内容
if (string_WCYzt<>'') then
begin
if (string_WCYzt='0') then
begin
SpeedButton9.Caption:='CH';Shape2.Brush.Color:=clyellow;SpeedButton9.Enabled:=true;
end else
if (string_WCYzt='1') then
begin
SpeedButton9.Caption:='CH'; Shape2.Brush.Color:=clyellow;SpeedButton9.Enabled:=true;
readPID($30,$31);PIDorder1:=PIDorder;
if (DisplayingWCY='1')then
begin
Paint20curve();
DisplayArray1:=Temptorder1;
DisplayArray2:=PIDorder1;
Display(DisplayArray1,DisplayArray2);
end;
end else
if (string_WCYzt='2') then
begin
SpeedButton9.Caption:='RUN'; Shape2.Brush.Color:=clgreen; SpeedButton9.Enabled:=true;
iAnalogDisplay21.Value:=strtointdef(Temptorder1[2],0);//段运行时间变化触发存储事件重要的设置!!!!!!!!
end else
if (string_WCYzt='3') then
begin
SpeedButton9.Caption:='RU'; Shape2.Brush.Color:=clgreen; SpeedButton9.Enabled:=true;
readPID($30,$31);
PIDorder1:=PIDorder;
ADOConnection1.Connected:=false;//先连接好对应1号仪表的数据库
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/WSHAdata/WSH_A1.mdb;Persist Security Info=False';
UpdatePID();
Temptorder1[17]:=duan20[1];
iAnalogDisplay21.Value:=strtointdef(Temptorder1[2],0);//段运行时间变化触发存储事件重要的设置!!!!!!!!
if (DisplayingWCY='1')then
begin
Paint20curve();
DisplayArray1:=Temptorder1;
DisplayArray2:=PIDorder1;
Display(DisplayArray1,DisplayArray2);
end;
end else
if (string_WCYzt='ER') then
begin
SpeedButton9.Caption:='ER'; SpeedButton9.Enabled:=false; Shape2.Brush.Color:=clred;
end;
end;
end;
///////////////////////////////////读出2号仪表的温度及状态
if form1.CheckBox30.Checked=true then
begin
Readtempt($30,$32);Temptorder2:=Temptorder; //仪表在运行状态时存数据库的内容
if (string_WCYzt<>'') then
begin
if (string_WCYzt='0') then
begin
SpeedButton8.Caption:='CH';Shape3.Brush.Color:=clyellow;SpeedButton8.Enabled:=true;
end else
if (string_WCYzt='1') then
begin
SpeedButton8.Caption:='CH'; Shape3.Brush.Color:=clyellow;SpeedButton8.Enabled:=true;
readPID($30,$32);PIDorder2:=PIDorder;
if (DisplayingWCY='2')then
begin
Paint20curve();
DisplayArray1:=Temptorder2;
DisplayArray2:=PIDorder2;
Display(DisplayArray1,DisplayArray2);
等等。。。
 
他的问题有点像你的
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3595211
 
jfyes,谢谢你,我看看先
 
我是用一个串口实现的,不知道在一个程序里用多个Mscomm行吗??速度有影响吗???
 
应该一个硬件串口对应一个mscomm.
 
后退
顶部