搜索
bottom↓
回复: 3

MODBUS驱动设计与实现【恢复】

[复制链接]

出0入0汤圆

发表于 2008-11-20 15:55:22 | 显示全部楼层 |阅读模式
MODBUS驱动设计与实现(DELPHI)

控件安装完后在DELPHI里调用此控件,打开源代码可直接修改,支持DELPHI5、6、7



 初始化属性



constructor TModbusM.Create( AOwner: TComponent );

begin

  inherited Create( AOwner );

  // Initialize to default values

  FComPortHandle             := 0;       // Not connected

  FComPort                   := pnCOM2;  // COM 2

  FComPortBaudRate           := br9600;  // 9600 bauds

  FComPortDataBits           := db8BITS; // 8 data bits

  FComPortStopBits           := sb1BITS; // 1 stop bit

  FComPortParity             := ptNONE;  // no parity

  FComPortHwHandshaking      := hhNONE;  // no hardware handshaking

  FComPortSwHandshaking      := shNONE;  // no software handshaking

  FComPortInBufSize          := 1028;    // input buffer of 1024 bytes

  FComPortOutBufSize         := 1028;    // output buffer of 1024 bytes

  FComPortPollingDelay       := 80;    // poll COM port every 80ms

  FOutputTimeout             := 5000;    // output timeout - 5000ms

  FEnableDTROnOpen           := false;   // DTR high on connect

  // Temporary buffer for received data

  ......

  ......

end;







//MODBUS发送

procedure TModbusM.Query;

var

  CadenaCRC: word;

  Cadena: TDataByte;

  PCadena: PByte;

  LCadena,i: Integer;

  ByteTemp: Byte;

begin

  if not connected then begin

    FError:=11;

    if Assigned(FOnError) then FOnError(Self, SErrorCodes[11] );

    Exit;

  end;

  if FBusy then begin

    FError:=10;

    if Assigned(FOnError) then FOnError(self, SErrorCodes[11]);

    exit;

  end;



  FBusy:=True;

  FError:=0;

  SetLength(ReadBuffer, 0);





  //功能码1数据打包,依次累推可增加自己所需的其它功能码

  case FFunction of

  1: begin

       Setlength(Cadena,8);

       Cadena[0]:=FslaveId;

       Cadena[1]:=FFunction;

       Cadena[2]:=Hi(Foffset);

       Cadena[3]:=Lo(Foffset);

       Cadena[4]:=Hi(Fquantity);

       Cadena[5]:=Lo(Fquantity);

       CadenaCRC:=CRC(Cadena);

       Cadena[high(Cadena)-1]:=lo(CadenaCRC);

       Cadena[high(Cadena)]:=hi(CadenaCRC);

       PCadena:=@Cadena[0];

       LCadena:=High(Cadena)+1;

       if SendData(PCadena,LCadena)=LCadena

         then FTimer.Enabled:=True

         else begin

           FError:=9;

           if Assigned(FOnError) then FOnError(Self, SErrorCodes[FError]);

           FBusy:=False;

         end;

     end;

  ......

  ......

end;



//MODBUS接收

procedure TModbusM.Response( Sender: TObject; DataPtr: pointer; DataSize: integer );

var

  CadenaCRC: Word;

  PCadena: PByte;

  i, LCadena : Integer;

  ByteTemp: Byte;



begin



  FTimer.Enabled:=False;  //定时器停止



  PCadena:=DataPtr;

  LCadena:=DataSize;



  //SetLength(Cadena, Legth(Cadena)+LCadena);

  //Setlength(Cadena,  LCadena);



  for i:=0 to LCadena-1 do

  begin

    SetLength(ReadBuffer, Length(ReadBuffer)+1 );

    ReadBuffer[Length(ReadBuffer)-1]:=PCadena^;

    inc(PCadena);

  end;



  CadenaCRC:=CRC(ReadBuffer);

  if (Lo(CadenaCRC)<>ReadBuffer[high(ReadBuffer)-1]) or (Hi(CadenaCRC)<>ReadBuffer[high(ReadBuffer)]) then

  begin

    FError:=9;

    if Assigned(FOnError) then FOnError(Self, SErrorCodes[FError]);;

    FBusy:=False;

    Exit;

  end;

  //功能码1解析,依次累推可增加自己所需的其它功能码

  case ReadBuffer[1] of

  1: begin

       if Fquantity Mod 8>0 then

         ByteTemp:=(FQuantity div 8)+1

       else ByteTemp:=Fquantity div 8;

       if length(ReadBuffer)= ByteTemp+5 then

         begin

           SetLength(FReadValues, ReadBuffer[2]);

           for i:=0 to ReadBuffer[2]-1 do

           FReadValues:=ReadBuffer[3+i];

         end

       else begin

         FError:= 4;

         if Assigned(FOnError) then FOnError(Self, SErrorCodes[FError]);;

         FBusy:=False;

         exit;

       end;

     end;

  ......

  ......

end;

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入8汤圆

发表于 2008-11-21 12:18:18 | 显示全部楼层
什么控件安装完后?

出0入0汤圆

发表于 2008-11-21 09:41:24 | 显示全部楼层
对DELPHI不熟

出0入0汤圆

发表于 2008-11-20 18:17:07 | 显示全部楼层
看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 16:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表