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 @@ - - - -