zoukankan      html  css  js  c++  java
  • 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.


  • 相关阅读:
    骑行的乐趣
    亲子运动会
    【转载】程序员接私活经验总结,来自csdn论坛语录
    【原创】Asp.Net MVC 学习笔记之使用Model验证
    【转载】经典js技巧
    【原创】关于Sqlserver的LogFiles超大的问题
    【总结】Winform编程常用小技巧
    【总结】WebBrowser相关资料索引
    【原创】Asp.Net MVC学习笔记之使用AcceptVerbs标签来制定Action的响应行为
    【转载】一个资深SOHO程序员对新人的建议网上接活(转自CSDN)
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3347992.html
Copyright © 2011-2022 走看看