请问SPCOMM 控件怎么自定义接收数据,不用receivedata 事件,
还有我要接受三个PLC 发来的数据,请问有定时器可以做得到吗?真的很急!!!

解决方案 »

  1.   

    我的程序要读一个PLC的三个地址的数据,是不是要用到线程?定时器可以吗??  1>读VD100 地址的数据:
      先发送读数据申请,PLC返回确认,再发送读数据指令,然后才返回所要的数据(两次写操作)  2>读VD104 地址的数据:也是和上面的一样的,只是地址不一样而已
      
      3>读VD108 地址的数据:也是和上面的一样的,只是地址不一样而已
    要用到线程吗?请问怎么做????
      

  2.   

    procedure TFmain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var t_B:ARRAY[1..8192] oF CHAR ;
    i:word;
    beginmove(buffer^,t_b,bufferlength);
    if start then
    begin
    for i:=1 to bufferlength do
            begin
            ReceiveText.Text:=ReceiveText.Text+' '+inttohex(ord(t_b[i]),2);
            end;
    end;
    end;procedure TFmain.AReceiveExecute(Sender: TObject);
    begin
    try
            comm1.StartComm;
            Start:=true;
            Areceive.Enabled:=false;
            asetcom.Enabled:=false;
            astop.Enabled:=true;
            Statusbar.Panels[1].Text:=Tostr();
            Statusbar.Panels[0].Text:='接收状态...';
    except
            Error($100);
    end;
    end;procedure TFmain.AstopExecute(Sender: TObject);
    begin
    try
            comm1.StopComm;
            start:=false;
            astop.Enabled:=false;
            asetcom.Enabled:=true;
            Areceive.Enabled:=true;
            Statusbar.Panels[1].Text:='串口状态未知';
            Statusbar.Panels[0].Text:='停止状态...';except
            Error($101);
    end;
    end;procedure TFmain.AfontExecute(Sender: TObject);
    begin
    if FontDialog.Execute then
            begin
                    ReceiveText.Font:=FontDialog.Font;
            end;
    end;procedure TFmain.AcolorExecute(Sender: TObject);
    begin
    if ColorDialog.Execute then
            begin
              ReceiveText.Color:=ColorDialog.Color;
            end;
    end;
      

  3.   

    你去这里下载完整例子看吧:http://www.2ccc.com/article.asp?articleid=1047
      

  4.   

    我说的是不用receivedata 事件,楼可能没有看清楚吧
      

  5.   

    ---------------
    --------------------
    我的程序要读一个PLC的三个地址的数据,是不是要用到线程?定时器可以吗??  1>读VD100 地址的数据:
      先发送读数据申请,PLC返回确认,再发送读数据指令,然后才返回所要的数据(两次写操作)  2>读VD104 地址的数据:也是和上面的一样的,只是地址不一样而已
      
      3>读VD108 地址的数据:也是和上面的一样的,只是地址不一样而已
    要用到线程吗?请问怎么做????
      

  6.   

    是S7-200吧 :) 建议采用Modbus协议,安装Modbus工具箱(这个附加指令包可以在西门子官方网站上免费下载),这样你的PLC就支持Modbus了。每个PLC都可以定义1个站号,PLC接收到数据会检查数据帧中的目标站号是否与本站相符,如果不是,则不会响应查询数据。用OnReceiveData事件绝对不会出任何问题的。你在程序中对每台PLC进行轮询,就可以采集到所有PLC的数据了。还有,Modbus的指令1次可以连续取120个字的数据,你的VD100~VD108数据可以1次全部读上来,这样可以提高效率。
      

  7.   

    我用的是OMRON的PLC,用多口卡通讯,下位机有10台.采用线程的方式进行通讯,通讯控件用的是SPCOMM,用RECEIVEDATA没什么问题.你是不是只用一个串口通讯呀?那就只能采取轮讯的方式了.如果串口多,要求实时性好的话,我觉得还是用线程通讯好一点.