• 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.


  • 相关阅读:
    在子线程中更新ProgressBar为null
    有关ContentProvider及相关一系列的简单用法(持续添加)
    Android内容提供者使用及创建
    Android中关于时间的操作
    Cell的一些坑: UITableViewCell宽度,在iphone5的时候是320,在iphone6的时候为啥也是320?
    处理数据源(根据条目字数多少 ,动态显示一行里有多少个条目,类似天猫搜索历史)
    iOS开发之如何跳到系统设置里的各种设置界面
    Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
    xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
    PresentViewController切换界面(一些系统自带的页面切换动画)
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3347992.html
Copyright © 2020-2023  润新知