using System; using System.Threading.Tasks; using HslCommunication; using HslCommunication.Profinet.Omron; using SlnMesnac.Common; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:LAPTOP-E0N2L34V * 命名空间:SlnMesnac.Plc.Factory * 唯一标识:496f8d2b-70e3-4a05-ae18-a9b0fcd06b82 * * 创建者:WenJY * 电子邮箱:wenjy@mesnac.com * 创建时间:2024-03-27 21:58:35 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace SlnMesnac.Plc.Factory { public class OmronNJFactory:PlcAbsractFactory { private StringChange _stringChange; private OmronCipNet omronFinsNet = null; public OmronNJFactory(StringChange stringChange) { _stringChange = stringChange; this.omronFinsNet = new OmronCipNet(); this.omronFinsNet.ConnectTimeOut = 2000; } public override bool IsConnected { get; set; } /// /// 建立连接 /// /// /// /// /// public override bool Connect(string iP, int port) { try { omronFinsNet.IpAddress = iP; omronFinsNet.Port = 44818; //omronFinsNet.SA1 = (byte)192; //omronFinsNet.DA1 = (byte)239; //omronFinsNet.DA2 = (byte)0; OperateResult connect = omronFinsNet.ConnectServer(); this.IsConnected = connect.IsSuccess; if (!connect.IsSuccess) { throw new InvalidOperationException($"欧姆龙PLC连接失败:{connect.Message}"); } return connect.IsSuccess; } catch (Exception ex) { throw new InvalidOperationException($"欧姆龙PLC连接异常:{ex.Message}"); } } /// /// 断开连接 /// /// /// public override bool DisConnect() { try { OperateResult disConnect = omronFinsNet.ConnectClose(); this.IsConnected = false; if (!disConnect.IsSuccess) { throw new InvalidOperationException($"欧姆龙PLC断开连接失败:{disConnect.Message}"); } return disConnect.IsSuccess; } catch (Exception ex) { throw new InvalidOperationException($"欧姆龙PLC断开连接异常:{ex.Message}"); } } /// /// 根据地址读取指定长度数据 /// /// /// /// /// public override object[] readObjectValueByAddress(string address, int len) { try { object[] buff = null; OperateResult read = omronFinsNet.Read(address, (ushort)(len)); if (!read.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};读取指定长度数据失败:{read.Message}"); } buff = new object[read.Content.Length]; for (int i = 0; i < read.Content.Length; i++) { buff[i] = read.Content[i]; } return buff; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};读取指定长度数据异常:{ex.Message}"); } } /// /// 根据地址读取int16数据 /// /// /// /// public override int readInt16ByAddress(string address) { try { OperateResult read = omronFinsNet.ReadInt16(address); if (!read.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};读取int16数据失败:{read.Message}"); } return read.Content; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};读取int16数据异常:{ex.Message}"); } } /// /// 根据地址写入int16数据 /// /// /// /// /// public override bool writeInt16ByAddress(string address, int value) { try { OperateResult operateResult = omronFinsNet.Write(address, Convert.ToInt16(value)); if (!operateResult.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};写入int16数据失败:{operateResult.Message}"); } return operateResult.IsSuccess; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};写入int16数据异常:{ex.Message}"); } } /// /// 通过PLC地址读取string类型数据 /// /// /// /// /// public override string readStringByAddress(string address, ushort length) { try { OperateResult read = omronFinsNet.ReadString(address, length); if (!read.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};读取string数据失败:{read.Message}"); } return read.Content; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};读取string数据异常:{ex.Message}"); } } /// /// 通过PLC地址写入String类型数据 /// /// /// /// /// public override bool writeStringByAddress(string address, string value) { try { OperateResult operateResult = omronFinsNet.Write(address, value); if (!operateResult.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};写入string数据失败:{operateResult.Message}"); } return operateResult.IsSuccess; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};写入string数据异常:{ex.Message}"); } } /// /// 通过PLC地址读取Bool类型数据 /// /// /// /// public override bool readBoolByAddress(string address) { try { OperateResult read = omronFinsNet.ReadBool(address); if (!read.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};读取bool数据失败:{read.Message}"); } return read.Content; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};读取bool数据异常:{ex.Message}"); } } /// /// 通过PLC地址写入Bool类型数据 /// /// /// /// /// public override bool writeBoolByAddress(string address, bool value) { try { OperateResult operateResult = omronFinsNet.Write(address, short.Parse(_stringChange.ParseToInt(value ? "1" : "0").ToString())); if (!operateResult.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};写入bool数据失败:{operateResult.Message}"); } return operateResult.IsSuccess; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};写入bool数据异常:{ex.Message}"); } } /// /// 通过PLC地址写入Double类型数据 /// /// /// /// /// public override bool writeDoubleByAddress(string address, int value) { try { OperateResult operateResult = omronFinsNet.Write(address, Convert.ToDouble(value)); if (!operateResult.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};写入double数据失败:{operateResult.Message}"); } return operateResult.IsSuccess; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};写入double数据异常:{ex.Message}"); } } public override async Task ConnectAsync(string ip, int port) { try { omronFinsNet.IpAddress = ip; omronFinsNet.Port = 44818; //omronFinsNet.SA1 = (byte)192; //omronFinsNet.DA1 = (byte)239; //omronFinsNet.DA2 = (byte)0; OperateResult connect = await omronFinsNet.ConnectServerAsync(); this.IsConnected = connect.IsSuccess; if (!connect.IsSuccess) { throw new InvalidOperationException($"欧姆龙PLC连接失败:{connect.Message}"); } return connect.IsSuccess; } catch (Exception ex) { Console.WriteLine($"欧姆龙PLC连接异常:{ex.Message}"); return false; } } public override byte[] readValueByAddress(string address, int len) { try { OperateResult read = omronFinsNet.Read(address, (ushort)(len)); if (!read.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};读取指定长度数据失败:{read.Message}"); } return read.Content; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};读取指定长度数据异常:{ex.Message}"); } } public override float readFloatByAddress(string address) { try { OperateResult read = omronFinsNet.ReadFloat(address); if (!read.IsSuccess) { throw new InvalidOperationException($"根据地址:{address};读取float数据失败:{read.Message}"); } return read.Content; } catch (Exception ex) { throw new InvalidOperationException($"根据地址:{address};读取float数据异常:{ex.Message}"); } } public override bool readHeartByAddress(string address) { try { OperateResult read = omronFinsNet.ReadBool(address); if (!read.IsSuccess) { return false; } return true; } catch (Exception ex) { return false; } } } }