From 5e2e019552423495a7e53d0ab5354491ad26ced8 Mon Sep 17 00:00:00 2001 From: zhangxy Date: Thu, 19 Mar 2026 10:55:14 +0800 Subject: [PATCH] model --- SLn.Wcs.ElevatorSdk/Class1.cs | 7 + .../Sln.Wcs.ElevatorSdk.csproj | 9 + Sln.Wcs.Model/Domain/BaseDeviceInfo.cs | 12 + Sln.Wcs.Model/Sln.Wcs.Model.csproj | 14 + Sln.Wcs.Plc/Factory/InovanceFactory.cs | 366 ++++++++++++++++++ Sln.Wcs.Plc/PlcAbsractFactory.cs | 136 +++++++ Sln.Wcs.Plc/Sln.Wcs.Plc.csproj | 19 + Sln.Wcs.sln | 23 +- 8 files changed, 584 insertions(+), 2 deletions(-) create mode 100644 SLn.Wcs.ElevatorSdk/Class1.cs create mode 100644 SLn.Wcs.ElevatorSdk/Sln.Wcs.ElevatorSdk.csproj create mode 100644 Sln.Wcs.Model/Domain/BaseDeviceInfo.cs create mode 100644 Sln.Wcs.Model/Sln.Wcs.Model.csproj create mode 100644 Sln.Wcs.Plc/Factory/InovanceFactory.cs create mode 100644 Sln.Wcs.Plc/PlcAbsractFactory.cs create mode 100644 Sln.Wcs.Plc/Sln.Wcs.Plc.csproj diff --git a/SLn.Wcs.ElevatorSdk/Class1.cs b/SLn.Wcs.ElevatorSdk/Class1.cs new file mode 100644 index 0000000..9726cae --- /dev/null +++ b/SLn.Wcs.ElevatorSdk/Class1.cs @@ -0,0 +1,7 @@ +namespace Sln.Wcs.ElevatorSdk +{ + public class Class1 + { + + } +} diff --git a/SLn.Wcs.ElevatorSdk/Sln.Wcs.ElevatorSdk.csproj b/SLn.Wcs.ElevatorSdk/Sln.Wcs.ElevatorSdk.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/SLn.Wcs.ElevatorSdk/Sln.Wcs.ElevatorSdk.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs b/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs new file mode 100644 index 0000000..23adf07 --- /dev/null +++ b/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sln.Wcs.Model.Domain +{ + internal class BaseDeviceInfo + { + } +} diff --git a/Sln.Wcs.Model/Sln.Wcs.Model.csproj b/Sln.Wcs.Model/Sln.Wcs.Model.csproj new file mode 100644 index 0000000..040a94a --- /dev/null +++ b/Sln.Wcs.Model/Sln.Wcs.Model.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Sln.Wcs.Plc/Factory/InovanceFactory.cs b/Sln.Wcs.Plc/Factory/InovanceFactory.cs new file mode 100644 index 0000000..1a00778 --- /dev/null +++ b/Sln.Wcs.Plc/Factory/InovanceFactory.cs @@ -0,0 +1,366 @@ +using HslCommunication; +using HslCommunication.Profinet.Inovance; +using Sln.Wcs.Common; +using System; +using System.Threading.Tasks; + +#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 Sln.Wcs.Plc.Factory +{ + public class InovanceFactory : PlcAbsractFactory + { + private StringChange _stringChange; + + private InovanceTcpNet inovanceTcp = null; + + public InovanceFactory(StringChange stringChange) + { + _stringChange = stringChange; + + this.inovanceTcp = new InovanceTcpNet(); + this.inovanceTcp.ConnectTimeOut = 2000; + } + + public override bool IsConnected { get; set; } + + /// + /// 建立连接 + /// + /// + /// + /// + /// + public override bool Connect(string ip, int port) + { + try + { + inovanceTcp?.ConnectClose(); + if (inovanceTcp != null) + { + inovanceTcp.IpAddress = ip; + inovanceTcp.Port = port; + inovanceTcp.DataFormat = HslCommunication.Core.DataFormat.CDAB; + + OperateResult connect = inovanceTcp.ConnectServer(); + this.IsConnected = connect.IsSuccess; + if (!connect.IsSuccess) + { + throw new InvalidOperationException($"汇川PLC连接失败:{connect.Message}"); + } + + return connect.IsSuccess; + } + else + { + throw new ArgumentException($"汇川PLC实例inovanceTcp为null"); + } + } + catch (Exception ex) + { + Console.WriteLine($"汇川PLC连接异常:{ex.Message}"); + return false; + } + } + + /// + /// 断开连接 + /// + /// + /// + public override bool DisConnect() + { + try + { + OperateResult disConnect = inovanceTcp.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 byte[] readValueByAddress(string address, int len) + { + try + { + OperateResult read = inovanceTcp.Read(address, (ushort)(len)); + if (!read.IsSuccess) + { + throw new InvalidOperationException($"根据地址:{address};读取指定长度数据失败:{read.Message}"); + } + return _stringChange.ConvertFloatToINt(read.Content); + } + catch (Exception ex) + { + throw new InvalidOperationException($"根据地址:{address};读取指定长度数据异常:{ex.Message}"); + } + } + + /// + /// 根据地址读取int16数据 + /// + /// + /// + /// + public override int readInt16ByAddress(string address) + { + try + { + OperateResult read = inovanceTcp.ReadInt16(address); + if (!read.IsSuccess) + { + throw new InvalidOperationException($"根据地址:{address};读取int16数据失败:{read.Content}"); + } + 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 = new OperateResult(); + int s = 0; + string[] strArry = address.Split('.'); + + //先读取整个块的内容 + var info = inovanceTcp.ReadInt16(strArry[0]); + if (info.Content == 0) + { + int length = _stringChange.ParseToInt(strArry[1]) + 1; + string[] array = new string[length]; + for (int i = 0; i < length; i++) + { + if (i == _stringChange.ParseToInt(strArry[1])) + { + array[i] = value.ToString(); + } + else + { + array[i] = "0"; + } + } + //反转 + Array.Reverse(array); + byte[] buffer = new byte[array.Length]; + string result = ""; + for (int i = 0; i < array.Length; i++) + { + result += (byte)Convert.ToInt32(array[i], 16); + } + s = Convert.ToInt32(result.Trim(), 2); + operateResult = inovanceTcp.Write(strArry[0], (ushort)s); + } + else + { + var inf2 = Convert.ToString(info.Content, 2); + string[] infoArray = new string[inf2.Length]; + for (int i = 0; i < inf2.Length; i++) + { + infoArray[i] = inf2.Substring(i, 1); + } + Array.Reverse(infoArray); + infoArray[_stringChange.ParseToInt(strArry[1])] = value.ToString(); + string result = ""; + foreach (var item in infoArray) + { + result = result + item; + } + s = Convert.ToInt32(result.Trim(), 10); + operateResult = inovanceTcp.Write(strArry[0], s); + } + 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 = inovanceTcp.ReadString(address, length); + if (!read.IsSuccess) + { + throw new InvalidOperationException($"根据地址:{address};读取string数据失败:{read.Content}"); + } + 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 = inovanceTcp.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 = inovanceTcp.ReadBool(address); + if (!read.IsSuccess) + { + throw new InvalidOperationException($"根据地址:{address};读取bool数据失败:{read.Content}"); + } + 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 = inovanceTcp.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 = inovanceTcp.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 bool readHeartByAddress(string address) + { + throw new NotImplementedException(); + } + + public override Task ConnectAsync(string ip, int port) + { + throw new NotImplementedException(); + } + + public override bool writeStringByAddress(string address, string value, int length) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Sln.Wcs.Plc/PlcAbsractFactory.cs b/Sln.Wcs.Plc/PlcAbsractFactory.cs new file mode 100644 index 0000000..ea4dfdc --- /dev/null +++ b/Sln.Wcs.Plc/PlcAbsractFactory.cs @@ -0,0 +1,136 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2024 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:LAPTOP-E0N2L34V +* 命名空间:SlnMesnac.Plc +* 唯一标识:496f8d2b-70e3-4a05-ae18-a9b0fcd06b82 +* +* 创建者:WenJY +* 电子邮箱:wenjy@mesnac.com +* 创建时间:2024-03-27 21:58:35 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using System.Threading.Tasks; + +namespace Sln.Wcs.Plc +{ + public abstract class PlcAbsractFactory + { + public string ConfigKey { get; set; } + + /// + /// 是否连接 + /// + public abstract bool IsConnected { get; set; } + + /// + /// 建立连接 + /// + /// + /// + /// + public abstract bool Connect(string ip, int port); + + /// + /// 异步建立连接 + /// + /// + /// + /// + public abstract Task ConnectAsync(string ip, int port); + + /// + /// 断开连接 + /// + /// + public abstract bool DisConnect(); + + /// + /// 根据地址读取指定长度数据 + /// + /// + /// + /// + public abstract byte[] readValueByAddress(string address, int len); + + /// + /// 通过PLC地址读取int16类型数据 + /// + /// + /// + public abstract int readInt16ByAddress(string address); + + /// + /// 通过PLC地址写入int16类型数据 + /// + /// + /// + /// + public abstract bool writeInt16ByAddress(string address, int value); + + /// + /// 通过PLC地址读取string类型数据 + /// + /// + /// + public abstract string readStringByAddress(string address, ushort length); + + /// + /// 弃用--通过PLC地址写入String类型数据 + /// + /// + /// + /// + public abstract bool writeStringByAddress(string address, string value); + + /// + /// 使用--通过PLC地址写入String类型数据 + /// + /// + /// + /// + public abstract bool writeStringByAddress(string address, string value, int length); + + /// + /// 通过PLC地址读取Bool类型数据 + /// + /// + /// + public abstract bool readBoolByAddress(string address); + + /// + /// 通过PLC地址读取心跳结果 + /// + /// + /// + public abstract bool readHeartByAddress(string address); + + /// + /// 通过PLC地址写入Bool类型数据 + /// + /// + /// + public abstract bool writeBoolByAddress(string address, bool value); + + /// + /// 通过PLC地址写入Double类型数据 + /// + /// + /// + /// + public abstract bool writeDoubleByAddress(string address, int value); + } +} \ No newline at end of file diff --git a/Sln.Wcs.Plc/Sln.Wcs.Plc.csproj b/Sln.Wcs.Plc/Sln.Wcs.Plc.csproj new file mode 100644 index 0000000..5c1a716 --- /dev/null +++ b/Sln.Wcs.Plc/Sln.Wcs.Plc.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + + + + + + + + + + + + + + diff --git a/Sln.Wcs.sln b/Sln.Wcs.sln index d6ca476..cc29843 100644 --- a/Sln.Wcs.sln +++ b/Sln.Wcs.sln @@ -1,15 +1,22 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.10.35122.118 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sln.Wcs", "Sln.Wcs\Sln.Wcs.csproj", "{747BB353-A39B-4C49-A729-0260CC5A0C16}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs", "Sln.Wcs\Sln.Wcs.csproj", "{747BB353-A39B-4C49-A729-0260CC5A0C16}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sln.Wcs.Common", "Sln.Wcs.Common\Sln.Wcs.Common.csproj", "{D94D5F31-AA0D-4F60-A3B4-667A1FFCD6ED}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs.Common", "Sln.Wcs.Common\Sln.Wcs.Common.csproj", "{D94D5F31-AA0D-4F60-A3B4-667A1FFCD6ED}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sln.Wcs.HikRoBotSdk", "Sln.Wcs.HikRoBotSdk\Sln.Wcs.HikRoBotSdk.csproj", "{F2956A97-69F4-4073-B4C6-72CB7B945565}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sln.Wcs.HikRoBotApi", "Sln.Wcs.HikRoBotApi\Sln.Wcs.HikRoBotApi.csproj", "{9E3193CA-590C-4965-B2EF-02C2AE252095}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs.Model", "Sln.Wcs.Model\Sln.Wcs.Model.csproj", "{18437437-F83E-4A3E-9759-8AF313C47D77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs.Plc", "Sln.Wcs.Plc\Sln.Wcs.Plc.csproj", "{ECB2A29C-7A82-83D1-F9FD-5B8C41E55261}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sln.Wcs.ElevatorSdk", "SLn.Wcs.ElevatorSdk\Sln.Wcs.ElevatorSdk.csproj", "{504764BF-FD5F-4BE5-80C5-061C2EE9C79B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -32,6 +39,18 @@ Global {9E3193CA-590C-4965-B2EF-02C2AE252095}.Debug|Any CPU.Build.0 = Debug|Any CPU {9E3193CA-590C-4965-B2EF-02C2AE252095}.Release|Any CPU.ActiveCfg = Release|Any CPU {9E3193CA-590C-4965-B2EF-02C2AE252095}.Release|Any CPU.Build.0 = Release|Any CPU + {18437437-F83E-4A3E-9759-8AF313C47D77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18437437-F83E-4A3E-9759-8AF313C47D77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18437437-F83E-4A3E-9759-8AF313C47D77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18437437-F83E-4A3E-9759-8AF313C47D77}.Release|Any CPU.Build.0 = Release|Any CPU + {ECB2A29C-7A82-83D1-F9FD-5B8C41E55261}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECB2A29C-7A82-83D1-F9FD-5B8C41E55261}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECB2A29C-7A82-83D1-F9FD-5B8C41E55261}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECB2A29C-7A82-83D1-F9FD-5B8C41E55261}.Release|Any CPU.Build.0 = Release|Any CPU + {504764BF-FD5F-4BE5-80C5-061C2EE9C79B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {504764BF-FD5F-4BE5-80C5-061C2EE9C79B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {504764BF-FD5F-4BE5-80C5-061C2EE9C79B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {504764BF-FD5F-4BE5-80C5-061C2EE9C79B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE