using System;
|
using System.Threading;
|
using iWareCommon.Utils;
|
|
using System.Linq;
|
using Newtonsoft.Json;
|
using System.Collections.Generic;
|
using iWareCommon;
|
using System.Text;
|
using iWareModel;
|
|
|
namespace iWareSda
|
{
|
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“SrmService”。
|
public class SrmService : ISrmService
|
{
|
private static string _namespace = "iWareSda.SrmService.SrmService";
|
private static string nofoundStackerMsg = SysHelper.Language(WareSdaStruct.LanguageFlg, "没有找到堆垛机设备", "No found the Stacker");
|
|
/// <summary>
|
/// 获取SrmEntity实体集合
|
/// </summary>
|
/// <returns></returns>
|
public List<SrmEntity> GetSrm_CacheEntity()
|
{
|
return Srm_CacheEntity.DeviceObjs;
|
}
|
|
/// <summary>
|
/// 堆垛机任务完成确认信号发送
|
/// </summary>
|
/// <param name="srmId">设备号</param>
|
/// <param name="taskId">任务号</param>
|
/// <returns></returns>
|
public SdaResEntity ConfirmTaskFinish(int srmId, int taskId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
try
|
{
|
Log4NetHelper.WriteInfoLog(LogType.SrmSdaService, srmId + "号堆垛机:接收到确认任务:" + taskId + " 已完成的指令");
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = "没有找到SRM设备";
|
return sdaResult;
|
}
|
/*
|
if (srm.RTaskNo != taskId)
|
{
|
return false;
|
}
|
//*/
|
bool flag = false;
|
|
string msg = "";
|
////判断是否IsReady
|
//
|
//SdaResEntity isReady_SdaResEntity = IsReady(srmId, out msg);
|
//if (!isReady_SdaResEntity.result)
|
//{
|
// msg = "判断堆垛机不是空闲并可用状态-" + msg;
|
// sdaResult.result = false;
|
// sdaResult.resMsg = msg;
|
// return sdaResult;
|
//}
|
|
var result = srm.ConfirmTaskFinish(out msg);
|
Log4NetHelper.WriteInfoLog(LogType.SrmSdaService, srmId + "号堆垛机:下发确认任务:" + taskId + " 已完成的指令" + (flag ? "成功" : "失败"));
|
|
sdaResult.result = result;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
catch (Exception ex)
|
{
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, "堆垛机任务完成确认信号发送出现异常:" + JsonConvert.SerializeObject(ex), ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = JsonConvert.SerializeObject(ex);
|
return sdaResult;
|
}
|
}
|
|
public SrmView GetSrmInfo(int srmId)
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
return null;
|
}
|
return srm.View;
|
}
|
|
/// <summary>
|
/// 判断堆垛机是否可用
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <param name="msg"></param>
|
/// <returns></returns>
|
public SdaResEntity IsReady(int srmId, out string msg)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
try
|
{
|
msg = "";
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
msg = string.Format("未找到srmId={0}的堆垛机信息", srmId);
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
|
if (!srm.CanDoTask(srmId, out msg))
|
{
|
sdaResult.resMsg = msg;
|
sdaResult.result = false;
|
return sdaResult;
|
}
|
//var result = (srm.RAuto && !srm.RAlarm && !srm.RLoaded && srm.RForkIni && srm.RState == (int)ESrmState.空闲);
|
//sdaResult.result = result;
|
//sdaResult.resMsg = msg;
|
//if (string.IsNullOrEmpty(msg))
|
//{
|
// sdaResult.resMsg = srm.AlarmCode;
|
//}
|
sdaResult.result = true;
|
return sdaResult;
|
}
|
catch (Exception ex)
|
{
|
msg = ex.Message;
|
sdaResult.result = false;
|
sdaResult.resMsg = "出现异常:" + JsonConvert.SerializeObject(ex);
|
return sdaResult;
|
}
|
}
|
|
/// <summary>
|
/// 判断堆垛机是否可用,是否可以发送新任务给堆垛机
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <param name="msg"></param>
|
/// <returns></returns>
|
public SdaResEntity IsAllowSendTask(int srmId, out string msg)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
try
|
{
|
msg = "";
|
|
sdaResult = IsReady(srmId, out msg);
|
if (!sdaResult.result)
|
{//如果校验堆垛机是否可用失败,返回错误
|
return sdaResult;
|
}
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm.View.R_TaskNo != 0)
|
{//说明目前堆垛机上有任务号,不允许下发新任务
|
msg = string.Format("{0}号堆垛机目前有任务未确认,任务号{1},不允许下发新任务", srmId, srm.View.R_TaskNo);
|
sdaResult.resMsg = msg;
|
sdaResult.result = false;
|
return sdaResult;
|
}
|
sdaResult.result = true;
|
return sdaResult;
|
}
|
catch (Exception ex)
|
{
|
msg = ex.Message;
|
sdaResult.result = false;
|
sdaResult.resMsg = "出现异常:" + JsonConvert.SerializeObject(ex);
|
return sdaResult;
|
}
|
}
|
|
/// <summary>
|
/// 验证堆垛机任务是否已经完成
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <returns>0表示没有任务完成,其他表示任务完成,并返回任务号</returns>
|
public SdaResEntity IsTaskFinish(int srmId, int taskId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
var result = srm.View.R_TaskFinish == 1 && (srm.View.R_TaskNo == taskId);
|
|
sdaResult.result = result;
|
sdaResult.resMsg = "";
|
return sdaResult;
|
}
|
catch (Exception ex)
|
{
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, "出现异常:" + JsonConvert.SerializeObject(ex), ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = JsonConvert.SerializeObject(ex);
|
return sdaResult;
|
}
|
}
|
|
|
|
/// <summary>
|
/// 是否允许给堆垛机发送新任务
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <param name="taskId"></param>
|
/// <returns>true:允许,false:不允许</returns>
|
public SdaResEntity IsAllowSendNewTaskToSrm(int srmId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
var result = srm.IsAllowSendNewTaskToSrm();
|
|
sdaResult.result = result;
|
sdaResult.resMsg = "";
|
return sdaResult;
|
}
|
catch (Exception ex)
|
{
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, "出现异常:" + JsonConvert.SerializeObject(ex), ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = JsonConvert.SerializeObject(ex);
|
return sdaResult;
|
}
|
}
|
|
|
/// <summary>
|
/// 删除任务
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <returns></returns>
|
public SdaResEntity SendSrmDelete(int srmId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg = "";
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
var result = srm.SendDelTask(srm.View.DeviceId, out msg);
|
|
sdaResult.result = result;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
catch (Exception ex)
|
{
|
msg = "堆垛机删除任务出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
|
/// <summary>
|
/// 堆垛机急停
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <returns></returns>
|
public SdaResEntity SendEStop(int srmId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg = "";
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
|
var result = srm.SendEStop(out msg);
|
|
sdaResult.result = result;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
catch (Exception ex)
|
{
|
msg = "堆垛机急停出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
|
/// <summary>
|
/// 给堆垛机发送任务
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <param name="taskId"></param>
|
/// <param name="sourcePlace"></param>
|
/// <param name="toPlace"></param>
|
/// <returns></returns>
|
public SdaResEntity SendSrmTask(int srmId, int taskId, string sourcePlace, string toPlace, short command)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg = "";
|
try
|
{
|
ESrmCmd srmCmd;
|
bool parseResult = Enum.TryParse(command.ToString(), out srmCmd);
|
if (parseResult == false)
|
{
|
msg = SysHelper.Language(WareSdaStruct.LanguageFlg, "任务类型'" + command + "'转换错误", "Task command '" + command + "' convert failed");
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
if (srmCmd == ESrmCmd.库内搬运 || srmCmd == ESrmCmd.入库 || srmCmd == ESrmCmd.出库)
|
{//1-01-01-01
|
if (sourcePlace.Length != 10)
|
{
|
sdaResult.resMsg = "来源库位不对";
|
return sdaResult;
|
}
|
}
|
if (toPlace.Length != 10)
|
{
|
sdaResult.resMsg = "目标库位不对";
|
return sdaResult;
|
}
|
//重新处理 sourcePlace、toPlace [EditBy shaocx,2022-04-02]
|
srm.ReSubStringPlace(ref sourcePlace, ref toPlace);
|
|
var result = srm.SendTask(srmCmd, srmId, taskId, sourcePlace, toPlace, out msg);
|
|
StringBuilder sb = new StringBuilder();
|
sb.Append("下发");
|
sb.Append(srmId + "号堆垛机");
|
sb.Append(", 任务号=" + taskId);
|
sb.Append(", 起始点=" + sourcePlace);
|
sb.Append(", 目标点=" + toPlace);
|
sb.Append(", 的指令=" + (result ? "成功" : "失败"));
|
sb.Append(", 原因=" + msg);
|
|
Log4NetHelper.WriteInfoLog(LogType.SrmSdaService, sb.ToString());
|
|
sdaResult.result = result;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
|
}
|
catch (Exception ex)
|
{
|
msg = "给堆垛机发送任务出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
|
/// <summary>
|
/// 堆垛机解警
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <returns></returns>
|
public SdaResEntity ReleaseAlert(int srmId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg;
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
|
var result = srm.ReleaseAlert(out msg);
|
|
sdaResult.result = result;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
|
}
|
catch (Exception ex)
|
{
|
msg = "堆垛机解警出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
/// <summary>
|
/// 堆垛机继续任务
|
/// </summary>
|
/// <param name="srmId"></param>
|
/// <returns></returns>
|
public SdaResEntity ContinueTask(int srmId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg;
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
|
var result = srm.ContinueTask(out msg);
|
|
sdaResult.result = result;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
|
}
|
catch (Exception ex)
|
{
|
msg = "堆垛机继续任务出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
|
/// <summary>
|
/// 判断是否有心跳
|
/// </summary>
|
/// <param name="deviceId"></param>
|
/// <returns></returns>
|
public SdaResEntity IsHaveHeatBeat(int deviceId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg;
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
var result = srm.IsHaveHeatBeat();
|
|
sdaResult.result = true;
|
sdaResult.resData = result;
|
return sdaResult;
|
|
}
|
catch (Exception ex)
|
{
|
msg = "验证是否有心跳出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
|
/// <summary>
|
/// 堆垛机是否满足下发任务的要求
|
/// </summary>
|
/// <returns></returns>
|
public SdaResEntity IsAllowIssueTask(int deviceId)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg;
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
var result = false;
|
if ((srm.View.R_Mode != Convert.ToInt32(ESrmMode.自动) || srm.View.R_State != Convert.ToInt32(ESrmState.空闲) || srm.View.R_AlarmCode > 0))
|
result = false;
|
result = true;
|
|
sdaResult.result = true;
|
sdaResult.resData = result;
|
return sdaResult;
|
|
}
|
catch (Exception ex)
|
{
|
msg = "验证堆垛机是否满足下发任务的要求出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
|
|
/// <summary>
|
/// 写入STB
|
/// </summary>
|
/// <param name="deviceId"></param>
|
/// <param name="value"></param>
|
/// <returns></returns>
|
public SdaResEntity WriteStb(int deviceId, int value)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg;
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
MessageModel fr = srm.plcService.WriteValuePoint(srm.DBBlockForWrite.W_Stb, value, srm.View.W_Stb);
|
if (fr.result)
|
{
|
sdaResult.result = true;
|
return sdaResult;
|
}
|
else
|
{
|
sdaResult.resMsg = fr.resMsg;
|
return sdaResult;
|
}
|
}
|
catch (Exception ex)
|
{
|
msg = "写入STB出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
/// <summary>
|
/// 写入AckTaskFinish
|
/// </summary>
|
/// <param name="deviceId"></param>
|
/// <param name="value"></param>
|
/// <returns></returns>
|
public SdaResEntity WriteAckTaskFinish(int deviceId, int value)
|
{
|
SdaResEntity sdaResult = new SdaResEntity();
|
string msg;
|
try
|
{
|
var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId);
|
if (srm == null)
|
{
|
sdaResult.resMsg = nofoundStackerMsg;
|
return sdaResult;
|
}
|
|
MessageModel fr = srm.plcService.WriteValuePoint( srm.DBBlockForWrite.W_TaskFinishConfirm, value, srm.View.W_TaskFinishConfirm);
|
if (fr.result)
|
{
|
sdaResult.result = true;
|
return sdaResult;
|
}
|
else
|
{
|
sdaResult.resMsg = fr.resMsg;
|
return sdaResult;
|
}
|
}
|
catch (Exception ex)
|
{
|
msg = "写入Task_Finish_ACK出现异常:" + ex.Message;
|
Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex);
|
sdaResult.result = false;
|
sdaResult.resMsg = msg;
|
return sdaResult;
|
}
|
}
|
|
|
}
|
}
|