using HslCommunication;
using System.ComponentModel;
using System.Reflection;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.StackerCrane;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
namespace WIDESEAWCS_Tasks.StackerCraneJob
{
public class GetStackerObject
{
private SpeStackerCrane _speStackerCrane;
public GetStackerObject(SpeStackerCrane speStackerCrane)
{
_speStackerCrane = speStackerCrane;
}
///
/// 设备状态
///
///
///
public RgvEquipmentStatus RgvCraneStatusValue => GetRgvCraneStatus();
///
/// 工作模式(1联机 0脱机)
///
///
///
public RgvCraneAutoStatus RgvCraneAutoStatusValue => GetRgvCraneAutoStatus();
///
/// 工作状态
///
///
///
public RgvWorkStatus RgvCraneWorkStatusValue => GetRgvCraneWorkStatus();
///
/// 作业状态
///
///
///
public RgvJobCraneStatus StaclerkJobJobStatusValue => GetRgvJobCraneWorkStatus();
///
/// 任务完成
///
///
///
public StackerCraneTaskCompleted StackerCraneTaskCompletedValue => GetStackerCraneTaskCompleted();
///
/// 作业命令
///
///
///
public int WorkCommandValue() => _speStackerCrane.GetValue(RgvCraneDBName.WorkCommand);
///
/// 获取RGV设备状态
///
///
private RgvEquipmentStatus GetRgvCraneStatus()
{
return Enum.Parse(GetStatus(nameof(RgvEquipmentStatus)));
}
///
/// 获取rgv手自动状态
///
///
private RgvCraneAutoStatus GetRgvCraneAutoStatus()
{
return Enum.Parse(GetStatus(nameof(RgvCraneAutoStatus)));
}
///
/// 获取rgv工作状态
///
///
private RgvWorkStatus GetRgvCraneWorkStatus()
{
return Enum.Parse(GetStatus(nameof(RgvWorkStatus)));
}
///
/// 获取rgv作业状态
///
///
private RgvJobCraneStatus GetRgvJobCraneWorkStatus()
{
return Enum.Parse(GetStatus(nameof(RgvJobCraneStatus)));
}
///
/// 获取堆垛机任务状态
///
///
private StackerCraneTaskCompleted GetStackerCraneTaskCompleted()
{
return Enum.Parse(GetStatus(nameof(StackerCraneTaskCompleted)));
}
private string GetEnumDes(T value) where T : Enum
{
FieldInfo? fieldInfo = typeof(T).GetField(value.ToString());
if (fieldInfo != null)
{
DescriptionAttribute? descriptionAttribute = fieldInfo.GetCustomAttribute();
if (descriptionAttribute != null)
{
return descriptionAttribute.Description;
}
return "未定义";
}
return "未知";
}
private string GetStatus(string protocolParamType)
{
List devicePros = _speStackerCrane.DeviceProDTOs.Where(x => x.DeviceProParamType == protocolParamType).ToList();
if (devicePros.Count == 0)
{
throw new Exception("未获取到协议信息");
}
for (int i = 0; i < devicePros.Count; i++)
{
object readStatus = _speStackerCrane.Communicator.ReadAsObj(devicePros[i].DeviceProAddress, devicePros[i].DeviceDataType);
DeviceProtocolDetailDTO? deviceProtocolDetail = _speStackerCrane.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePros[i].DeviceProParamName) ?? throw new Exception();
deviceProtocolDetail = _speStackerCrane.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePros[i].DeviceProParamType && x.ProtocalDetailValue.Equals(readStatus.ToString()));
if (deviceProtocolDetail != null)
{
return deviceProtocolDetail.ProtocolDetailType;
}
return StackerCraneStatus.Unkonw.ToString();
}
return StackerCraneStatus.Unkonw.ToString();
}
///
/// 堆垛机任务完成事件
///
public event EventHandler StackerCraneTaskCompletedEventHandler;
///
/// 堆垛机完成事件是否已订阅
///
public bool IsEventSubscribed => StackerCraneTaskCompletedEventHandler != null;
private bool _isChecked = false;
///
/// 监测堆垛机任务是否完成
///
public void CheckStackerCraneTaskCompleted()
{
if (_isChecked)
return;
Task.Run(() =>
{
_isChecked = true;
try
{
DeviceProDTO? devicePro = _speStackerCrane.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackerCraneTaskCompleted));
if (devicePro != null)
{
DeviceProtocolDetailDTO? deviceProtocolDetail = _speStackerCrane.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePro.DeviceProParamName && x.ProtocolDetailType == StackerCraneTaskCompleted.WorkCompleted.ToString());
if (deviceProtocolDetail != null)
{
OperateResult operateResult = new OperateResult();
TypeCode typeCode = SiemensDBDataType.GetTypeCode(devicePro.DeviceDataType);
switch (typeCode)
{
case TypeCode.Boolean:
operateResult = _speStackerCrane.Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
break;
case TypeCode.Byte:
operateResult = _speStackerCrane.Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
break;
case TypeCode.Int16:
operateResult = _speStackerCrane.Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
break;
case TypeCode.Int32:
operateResult = _speStackerCrane.Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
break;
case TypeCode.UInt16:
operateResult = _speStackerCrane.Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
break;
case TypeCode.UInt32:
operateResult = _speStackerCrane.Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
break;
default:
break;
}
int taskNum = _speStackerCrane.CurrentTaskNum;
if (operateResult.IsSuccess)
{
StackerCraneTaskCompletedEventArgs args = new(taskNum);
StackerCraneTaskCompletedEventHandler?.Invoke(_speStackerCrane, args);
}
}
}
}
catch (Exception ex)
{
}
finally
{
_isChecked = false;
}
});
}
public bool SendCommand(RgvCraneTaskCommand command)
{
try
{
if(_speStackerCrane.IsConnected)
{
_speStackerCrane.SetValue(RgvCraneDBName.TaskNo, command.TaskNo);
_speStackerCrane.SetValue(RgvCraneDBName.WorkType, command.WorkType);
_speStackerCrane.SetValue(RgvCraneDBName.GoodsType, command.GoodsType);
_speStackerCrane.SetValue(RgvCraneDBName.StartPos, command.StartPos);
_speStackerCrane.SetValue(RgvCraneDBName.EndPos, command.EndPos);
return true;
}
return false;
}
catch (Exception ex)
{
return false;
}
}
}
}