Mitsubish FX 3U PLC 串口 连接单元

2 篇文章 0 订阅
1 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mushroom_lb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值