Mitsubish FX 3U PLC 串口 连接单元

     前段时间遇到一个Mitsubish FX 3U PLC ,现将PLC连接单元分享一下,希望对其他人有所启示。

 

unit PLC_MitsubishiFX;



interface



uses

  Windows, Messages, SysUtils, Classes, syncobjs,UnitCom, ACTPCCOMLib_TLB,

  PLC_Base, PLCCommonFunc;







type

  TPLC_MitsubishiFX=class(TPLC)

  private

    FMyCom:TActFXCPU;{定义串口通信对象}

  public

    ConStructor Create; override; {构造函数}

    destructor Destroy; override; {析构函数}

    function Open(ComName,IpAddress: string):Integer;override;{打开PLC}

    function Close:Integer;override;  {关闭PLC}

    //读PLC函数

    function DoRead(Station:Integer; StartAddress:Integer; Count:Integer; Buffer:Pointer; DataType:array of TPLCDataType): Integer;override;

    //写PLC函数

    function DoWrite(Station:Integer; StartAddress:Integer; Count:Integer; Buffer:Pointer; DataType: TPLCDataType):Integer;override;{返回值为写入成功与否}





end;



implementation



{ TPLC_Mitsubishi }







constructor TPLC_MitsubishiFX.Create;

begin

  Inherited;

  FMyCom:=TActFXCPU.Create(nil); {创建串口通信对象}

  FMyCom.ActTimeOut:=10000;

end;





destructor TPLC_MitsubishiFX.Destroy;

begin

  FMyCom.Free ;{释放串口通信对象}

  inherited;

end;







function TPLC_MitsubishiFX.Open(ComName,IpAddress: string): Integer;

begin

  FMyCom.ActPortNumber :=strtoint(copy(comname,4,length(comname)-3));     //com1

  Result:=FMyCom.Open; //该函数返回0为成功

  if Result = 0 then

    Result := SUCCESS;

end;



function TPLC_MitsubishiFX.Close: Integer;

begin

  Result := FMyCom.Close;{关闭串口通信对象}

  if Result = 0 then

    Result := SUCCESS;

end;





function TPLC_MitsubishiFX.DoRead(Station:Integer; StartAddress:Integer; Count:Integer; Buffer:Pointer; DataType:array of TPLCDataType): Integer;

var

  DataInfo:TPLCStruct; //接收从Buffer传来的参数

  lpdata: array[0..99] of integer;

  i:integer;

  LState:integer;

begin

  DataInfo := PTPLCStruct(Buffer)^;

  try

    LState:=FMyCom.ReadDeviceBlock('D'+ConvertStartAddr(StartAddress),Count,lpdata[0]) ;

  except

    LState:=-1;

  end;



  FLinkState := LState =0;



  if LState<>0 then  //读取失败的情况

  begin

    Result:=UNSUCCESS;

    exit;

  end;



  for i:=0 to Count-1 do

  begin

      DataInfo.PLCInteger[i]:=lpdata[i];

  end;



  PTPLCStruct(Buffer)^:=DataInfo; //传出读取的PLC数据

  Result:=SUCCESS;

end;



function TPLC_MitsubishiFX.DoWrite(Station:Integer; StartAddress:Integer;

  Count:Integer; Buffer:Pointer; DataType: TPLCDataType): Integer;

var

  DataInfo:TPLCStruct; //接收从Buffer传来的参数

  LDataInfo :array[0..100] of integer;

  i:integer;

  LState:integer;

begin

  DataInfo := PTPLCStruct(Buffer)^;

//  if DataType = dtHexInt then

//    for i:=0 to Count - 1 do

//      LDataInfo[i]:=StrToint('$'+DataInfo.PLCChar[i]) //十六进制

//  else

    for i:=0 to Count - 1 do

      LDataInfo[i]:=DataInfo.PLCInteger[i];  //十进制

  try

    LState:=FMyCom.WriteDeviceBlock('D'+ConvertStartAddr(StartAddress),Count,LDataInfo[0]) ;

  except

    LState:=-1;

  end;



  FLinkState := LState = 0;



  if LState = 0 then

    result:= SUCCESS

  else

    result:=UNSUCCESS;

end;



end.


 

 

你可能感兴趣的:(it)