通过网络虚拟串口对几个PLC进行数据采集,一个PLC占用一个串口,PLC每间隔1s左右就自动上发一组数据(采用电力部门的CDT规约循环发送),现在需要对不同串口发来的数据进行处理、显示和保存到数据库中。以下是我程序中的一些代码:
//创建SPCOMM控件监听串口
for i:=0 to recordcount -1 do
begin
//一些其他处理
freccomm[i]:=TComm.Create(self);
FRecComm[i].CommName :='COM'+FComminfo[i,2] ;
freccomm[i].ReadIntervalTimeout :=readtime;
freccomm[i].BaudRate :=strtoInt(fcomminfo[i,3]);
freccomm[i].OnReceiveData :=comm1.OnReceiveData ;
try
freccomm[i].StartComm ;
except
application.MessageBox ('直流屏监听串口打开失败,请检查串口是否被占用!','错误提示',MB_iconwarning or MB_OK);
freccomm[i].StopComm;
continue ;
end;
next;
application.ProcessMessages ;
end;
//数据接收触发事件 Comm1ReceiveData
procedure Tfrmzlpxx.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,icount:integer;
CommRecBuf:array of byte ;
begin
//进入临界
EnterCriticalSection(cs);
setlength(CommRecBuf,BufferLength) ;
setlength(FCommDataBuf,1) ;
Move(Buffer^,CommRecBuf[0],BufferLength);
CommName:=(sender as TComm).CommName;
(sender as TComm).StopComm ;
for i:=low(FRecComm) to High(FRecComm) do
begin
if 'COM'+FComminfo[i,2] =CommName then
Begin
if (FComminfo[i,4] = 'GZDW31') or (FComminfo[i,4] = 'GZDW32') then
begin
//校验成功,保存数据及填充数据;失败则跳出循环,离开临界
if FillGZW31Data(CommRecBuf,i) then
FillGZDW31Data(i);
end
else if (FComminfo[i,4] = 'GZDW41') or (FComminfo[i,4] = 'GZDW42') then
FillGZW41Data(CommRecBuf,i);
Break;
end;
end;
(sender as TComm).startcomm ;
//离开临界
LeaveCriticalSection(cs);
end;//上面的程序总存在不同的问题,请老师给点意见
//创建SPCOMM控件监听串口
for i:=0 to recordcount -1 do
begin
//一些其他处理
freccomm[i]:=TComm.Create(self);
FRecComm[i].CommName :='COM'+FComminfo[i,2] ;
freccomm[i].ReadIntervalTimeout :=readtime;
freccomm[i].BaudRate :=strtoInt(fcomminfo[i,3]);
freccomm[i].OnReceiveData :=comm1.OnReceiveData ;
try
freccomm[i].StartComm ;
except
application.MessageBox ('直流屏监听串口打开失败,请检查串口是否被占用!','错误提示',MB_iconwarning or MB_OK);
freccomm[i].StopComm;
continue ;
end;
next;
application.ProcessMessages ;
end;
//数据接收触发事件 Comm1ReceiveData
procedure Tfrmzlpxx.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,icount:integer;
CommRecBuf:array of byte ;
begin
//进入临界
EnterCriticalSection(cs);
setlength(CommRecBuf,BufferLength) ;
setlength(FCommDataBuf,1) ;
Move(Buffer^,CommRecBuf[0],BufferLength);
CommName:=(sender as TComm).CommName;
(sender as TComm).StopComm ;
for i:=low(FRecComm) to High(FRecComm) do
begin
if 'COM'+FComminfo[i,2] =CommName then
Begin
if (FComminfo[i,4] = 'GZDW31') or (FComminfo[i,4] = 'GZDW32') then
begin
//校验成功,保存数据及填充数据;失败则跳出循环,离开临界
if FillGZW31Data(CommRecBuf,i) then
FillGZDW31Data(i);
end
else if (FComminfo[i,4] = 'GZDW41') or (FComminfo[i,4] = 'GZDW42') then
FillGZW41Data(CommRecBuf,i);
Break;
end;
end;
(sender as TComm).startcomm ;
//离开临界
LeaveCriticalSection(cs);
end;//上面的程序总存在不同的问题,请老师给点意见
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货