1.提升机单一对象

2.PLC
dev
zhangxy 4 weeks ago
parent b214b21caf
commit e6835e96a9

@ -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
{
/// <summary>
/// 提升机编号
/// </summary>
public string ElevatorId { get; set; }
/// <summary>
/// 当前楼层
/// </summary>
public int CurrentFloor { get; set; }
/// <summary>
/// 运行状态0空闲1运行中2故障3维护
/// </summary>
public int RunningStatus { get; set; }
/// <summary>
/// 当前任务编号
/// </summary>
public string CurrentTaskId { get; set; }
/// <summary>
/// 是否在线
/// </summary>
public bool IsOnline { get; set; }
/// <summary>
/// 任务编号
/// </summary>
public string TaskId { get; set; }
/// <summary>
/// 任务状态
/// </summary>
public int TaskStatus { get; set; }
/// <summary>
/// 起始楼层
/// </summary>
public int FromFloor { get; set; }
/// <summary>
/// 目标楼层
/// </summary>
public int ToFloor { get; set; }
/// <summary>
/// 任务类型
/// </summary>
public int TaskType { get; set; }
/// <summary>
/// 托盘编号
/// </summary>
public string PalletId { get; set; }
/// <summary>
/// 响应代码
/// </summary>
public int Code { get; set; }
/// <summary>
/// 响应消息
/// </summary>
public string Message { get; set; }
}
}

@ -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
{
/// <summary>
/// 提升机编号
/// </summary>
public string ElevatorId { get; set; }
/// <summary>
/// 当前楼层
/// </summary>
public int CurrentFloor { get; set; }
/// <summary>
/// 运行状态0空闲1运行中2故障3维护
/// </summary>
public int RunningStatus { get; set; }
/// <summary>
/// 当前任务编号
/// </summary>
public string CurrentTaskId { get; set; }
/// <summary>
/// 是否在线
/// </summary>
public bool IsOnline { get; set; }
}
}

@ -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
{
/// <summary>
/// 提升机任务反馈信息
/// </summary>
public class ElevatorTaskFeedback
{
/// <summary>
/// 任务编号
/// </summary>
public string TaskId { get; set; }
/// <summary>
/// 提升机编号
/// </summary>
public string ElevatorId { get; set; }
/// <summary>
/// 任务状态
/// </summary>
public int TaskStatus { get; set; }
/// <summary>
/// 当前楼层
/// </summary>
public int CurrentFloor { get; set; }
/// <summary>
/// 完成时间
/// </summary>
public DateTime? CompleteTime { get; set; }
/// <summary>
/// 错误代码
/// </summary>
public int ErrorCode { get; set; }
}
}

@ -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
{
/// <summary>
/// 任务编号
/// </summary>
public string TaskId { get; set; }
/// <summary>
/// 提升机编号
/// </summary>
public string ElevatorId { get; set; }
/// <summary>
/// 起始楼层
/// </summary>
public int FromFloor { get; set; }
/// <summary>
/// 目标楼层
/// </summary>
public int ToFloor { get; set; }
/// <summary>
/// 任务类型
/// </summary>
public int TaskType { get; set; }
/// <summary>
/// 托盘编号
/// </summary>
public string PalletId { get; set; }
}
}

@ -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
{
/// <summary>
/// 提升机任务下发响应结果
/// </summary>
public class ElevatorTaskResponse
{
/// <summary>
/// 是否成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 响应代码
/// </summary>
public int Code { get; set; }
/// <summary>
/// 响应消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 任务编号
/// </summary>
public string TaskId { get; set; }
}
}

@ -13,20 +13,20 @@ namespace Sln.Wcs.ElevatorSdk
/// 获取所有提升机的实时状态 /// 获取所有提升机的实时状态
/// </summary> /// </summary>
/// <returns>提升机状态集合</returns> /// <returns>提升机状态集合</returns>
Task<List<ElevatorStatus>> GetElevatorStatusListAsync(); Task<List<ElevatorInfo>> GetElevatorStatusListAsync();
/// <summary> /// <summary>
/// 下发提升机任务 /// 下发提升机任务
/// </summary> /// </summary>
/// <param name="request">任务下发请求</param> /// <param name="request">任务下发请求</param>
/// <returns>任务下发结果</returns> /// <returns>任务下发结果</returns>
Task<ElevatorTaskResponse> DispatchTaskAsync(ElevatorTaskRequest request); Task<ElevatorInfo> DispatchTaskAsync(ElevatorInfo request);
/// <summary> /// <summary>
/// 获取提升机任务执行反馈 /// 获取提升机任务执行反馈
/// </summary> /// </summary>
/// <param name="taskId">任务编号</param> /// <param name="taskId">任务编号</param>
/// <returns>任务反馈信息</returns> /// <returns>任务反馈信息</returns>
Task<ElevatorTaskFeedback> GetTaskFeedbackAsync(string taskId); Task<ElevatorInfo> GetTaskFeedbackAsync(string taskId);
} }
} }

@ -6,7 +6,26 @@ using System.Threading.Tasks;
namespace Sln.Wcs.Model.Domain namespace Sln.Wcs.Model.Domain
{ {
internal class BaseDeviceInfo public class BaseDeviceInfo
{ {
/// <summary>
/// 设备编号
/// </summary>
public string DeviceId { get; set; }
/// <summary>
/// 运行状态0空闲1运行中2故障3维护
/// </summary>
public int RunningStatus { get; set; }
/// <summary>
/// 当前任务编号
/// </summary>
public string CurrentTaskId { get; set; }
/// <summary>
/// 是否在线
/// </summary>
public bool IsOnline { get; set; }
} }
} }

@ -0,0 +1,366 @@
using HslCommunication;
using HslCommunication.Profinet.Inovance;
using Sln.Wcs.Common;
using System;
using System.Threading.Tasks;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2024 WenJY
* CLR4.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; }
/// <summary>
/// 建立连接
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
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;
}
}
/// <summary>
/// 断开连接
/// </summary>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
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}");
}
}
/// <summary>
/// 根据地址读取指定长度数据
/// </summary>
/// <param name="address"></param>
/// <param name="len"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public override byte[] readValueByAddress(string address, int len)
{
try
{
OperateResult<byte[]> 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}");
}
}
/// <summary>
/// 根据地址读取int16数据
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public override int readInt16ByAddress(string address)
{
try
{
OperateResult<short> 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}");
}
}
/// <summary>
/// 根据地址写入int16数据
/// </summary>
/// <param name="address"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
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}");
}
}
/// <summary>
/// 通过PLC地址读取string类型数据
/// </summary>
/// <param name="address"></param>
/// <param name="length"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public override string readStringByAddress(string address, ushort length)
{
try
{
OperateResult<String> 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}");
}
}
/// <summary>
/// 通过PLC地址写入String类型数据
/// </summary>
/// <param name="address"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
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}");
}
}
/// <summary>
/// 通过PLC地址读取Bool类型数据
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
public override bool readBoolByAddress(string address)
{
try
{
OperateResult<bool> 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}");
}
}
/// <summary>
/// 通过PLC地址写入Bool类型数据
/// </summary>
/// <param name="address"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
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}");
}
}
/// <summary>
/// 通过PLC地址写入Double类型数据
/// </summary>
/// <param name="address"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <exception cref="InvalidOperationException"></exception>
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<bool> ConnectAsync(string ip, int port)
{
throw new NotImplementedException();
}
public override bool writeStringByAddress(string address, string value, int length)
{
throw new NotImplementedException();
}
}
}

@ -15,8 +15,4 @@
<ProjectReference Include="..\Sln.Wcs.Common\Sln.Wcs.Common.csproj" /> <ProjectReference Include="..\Sln.Wcs.Common\Sln.Wcs.Common.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Factory\" />
</ItemGroup>
</Project> </Project>

Loading…
Cancel
Save