diff --git a/SLn.Wcs.ElevatorSdk/Dto/ElevatorInfo.cs b/SLn.Wcs.ElevatorSdk/Dto/ElevatorInfo.cs
new file mode 100644
index 0000000..3b56bc9
--- /dev/null
+++ b/SLn.Wcs.ElevatorSdk/Dto/ElevatorInfo.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Sln.Wcs.ElevatorSdk.Dto
+{
+ public class ElevatorInfo
+ {
+ ///
+ /// 提升机编号
+ ///
+ public string ElevatorId { get; set; }
+
+ ///
+ /// 当前楼层
+ ///
+ public int CurrentFloor { get; set; }
+
+ ///
+ /// 运行状态(0:空闲,1:运行中,2:故障,3:维护)
+ ///
+ public int RunningStatus { get; set; }
+
+ ///
+ /// 当前任务编号
+ ///
+ public string CurrentTaskId { get; set; }
+
+ ///
+ /// 是否在线
+ ///
+ public bool IsOnline { get; set; }
+
+ ///
+ /// 任务编号
+ ///
+ public string TaskId { get; set; }
+
+ ///
+ /// 任务状态
+ ///
+ public int TaskStatus { get; set; }
+
+ ///
+ /// 起始楼层
+ ///
+ public int FromFloor { get; set; }
+
+ ///
+ /// 目标楼层
+ ///
+ public int ToFloor { get; set; }
+
+ ///
+ /// 任务类型
+ ///
+ public int TaskType { get; set; }
+
+ ///
+ /// 托盘编号
+ ///
+ public string PalletId { get; set; }
+
+ ///
+ /// 响应代码
+ ///
+ public int Code { get; set; }
+
+ ///
+ /// 响应消息
+ ///
+ public string Message { get; set; }
+ }
+}
diff --git a/SLn.Wcs.ElevatorSdk/Dto/ElevatorStatus.cs b/SLn.Wcs.ElevatorSdk/Dto/ElevatorStatus.cs
deleted file mode 100644
index eefc16f..0000000
--- a/SLn.Wcs.ElevatorSdk/Dto/ElevatorStatus.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Sln.Wcs.ElevatorSdk.Dto
-{
- public class ElevatorStatus
- {
- ///
- /// 提升机编号
- ///
- public string ElevatorId { get; set; }
-
- ///
- /// 当前楼层
- ///
- public int CurrentFloor { get; set; }
-
- ///
- /// 运行状态(0:空闲,1:运行中,2:故障,3:维护)
- ///
- public int RunningStatus { get; set; }
-
- ///
- /// 当前任务编号
- ///
- public string CurrentTaskId { get; set; }
-
- ///
- /// 是否在线
- ///
- public bool IsOnline { get; set; }
- }
-}
diff --git a/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskFeedback.cs b/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskFeedback.cs
deleted file mode 100644
index c5829f6..0000000
--- a/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskFeedback.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Sln.Wcs.ElevatorSdk.Dto
-{
- ///
- /// 提升机任务反馈信息
- ///
- public class ElevatorTaskFeedback
- {
- ///
- /// 任务编号
- ///
- public string TaskId { get; set; }
-
- ///
- /// 提升机编号
- ///
- public string ElevatorId { get; set; }
-
- ///
- /// 任务状态
- ///
- public int TaskStatus { get; set; }
-
- ///
- /// 当前楼层
- ///
- public int CurrentFloor { get; set; }
-
- ///
- /// 完成时间
- ///
- public DateTime? CompleteTime { get; set; }
-
- ///
- /// 错误代码
- ///
- public int ErrorCode { get; set; }
- }
-}
diff --git a/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskRequest.cs b/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskRequest.cs
deleted file mode 100644
index 8782282..0000000
--- a/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskRequest.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Sln.Wcs.ElevatorSdk.Dto
-{
- public class ElevatorTaskRequest
- {
- ///
- /// 任务编号
- ///
- public string TaskId { get; set; }
-
- ///
- /// 提升机编号
- ///
- public string ElevatorId { get; set; }
-
- ///
- /// 起始楼层
- ///
- public int FromFloor { get; set; }
-
- ///
- /// 目标楼层
- ///
- public int ToFloor { get; set; }
-
- ///
- /// 任务类型
- ///
- public int TaskType { get; set; }
-
- ///
- /// 托盘编号
- ///
- public string PalletId { get; set; }
- }
-}
diff --git a/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskResponse.cs b/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskResponse.cs
deleted file mode 100644
index bf5d646..0000000
--- a/SLn.Wcs.ElevatorSdk/Dto/ElevatorTaskResponse.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Sln.Wcs.ElevatorSdk.Dto
-{
- ///
- /// 提升机任务下发响应结果
- ///
- public class ElevatorTaskResponse
- {
- ///
- /// 是否成功
- ///
- public bool Success { get; set; }
-
- ///
- /// 响应代码
- ///
- public int Code { get; set; }
-
- ///
- /// 响应消息
- ///
- public string Message { get; set; }
-
- ///
- /// 任务编号
- ///
- public string TaskId { get; set; }
- }
-
-}
diff --git a/SLn.Wcs.ElevatorSdk/IElevatorSdk.cs b/SLn.Wcs.ElevatorSdk/IElevatorSdk.cs
index ab81bb2..4b5ecab 100644
--- a/SLn.Wcs.ElevatorSdk/IElevatorSdk.cs
+++ b/SLn.Wcs.ElevatorSdk/IElevatorSdk.cs
@@ -13,20 +13,20 @@ namespace Sln.Wcs.ElevatorSdk
/// 获取所有提升机的实时状态
///
/// 提升机状态集合
- Task> GetElevatorStatusListAsync();
+ Task> GetElevatorStatusListAsync();
///
/// 下发提升机任务
///
/// 任务下发请求
/// 任务下发结果
- Task DispatchTaskAsync(ElevatorTaskRequest request);
+ Task DispatchTaskAsync(ElevatorInfo request);
///
/// 获取提升机任务执行反馈
///
/// 任务编号
/// 任务反馈信息
- Task GetTaskFeedbackAsync(string taskId);
+ Task GetTaskFeedbackAsync(string taskId);
}
}
diff --git a/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs b/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs
index 23adf07..e4b6e0e 100644
--- a/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs
+++ b/Sln.Wcs.Model/Domain/BaseDeviceInfo.cs
@@ -6,7 +6,26 @@ using System.Threading.Tasks;
namespace Sln.Wcs.Model.Domain
{
- internal class BaseDeviceInfo
+ public class BaseDeviceInfo
{
+ ///
+ /// 设备编号
+ ///
+ public string DeviceId { get; set; }
+
+ ///
+ /// 运行状态(0:空闲,1:运行中,2:故障,3:维护)
+ ///
+ public int RunningStatus { get; set; }
+
+ ///
+ /// 当前任务编号
+ ///
+ public string CurrentTaskId { get; set; }
+
+ ///
+ /// 是否在线
+ ///
+ public bool IsOnline { get; set; }
}
}
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/Sln.Wcs.Plc.csproj b/Sln.Wcs.Plc/Sln.Wcs.Plc.csproj
index 9e8136b..58acb25 100644
--- a/Sln.Wcs.Plc/Sln.Wcs.Plc.csproj
+++ b/Sln.Wcs.Plc/Sln.Wcs.Plc.csproj
@@ -15,8 +15,4 @@
-
-
-
-