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