风言枫语  

     前段时间遇到一个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.


 

 

posted on 2013-09-30 22:00  风言枫语  阅读(774)  评论(0编辑  收藏  举报