前段時間遇到一個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;