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");
///
/// 获取SrmEntity实体集合
///
///
public List GetSrm_CacheEntity()
{
return Srm_CacheEntity.DeviceObjs;
}
///
/// 堆垛机任务完成确认信号发送
///
/// 设备号
/// 任务号
///
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;
}
///
/// 判断堆垛机是否可用
///
///
///
///
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;
}
}
///
/// 判断堆垛机是否可用,是否可以发送新任务给堆垛机
///
///
///
///
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;
}
}
///
/// 验证堆垛机任务是否已经完成
///
///
/// 0表示没有任务完成,其他表示任务完成,并返回任务号
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;
}
}
///
/// 是否允许给堆垛机发送新任务
///
///
///
/// true:允许,false:不允许
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;
}
}
///
/// 删除任务
///
///
///
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;
}
}
///
/// 堆垛机急停
///
///
///
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;
}
}
///
/// 给堆垛机发送任务
///
///
///
///
///
///
public SdaResEntity SendSrmTask(int srmId, int taskId, string sourcePlace, string toPlace, short command,short pallettype)
{
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 && sourcePlace.Length != 11)
{
sdaResult.resMsg = "来源库位不对";
return sdaResult;
}
}
if (toPlace.Length != 10 && toPlace.Length != 11)
{
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,pallettype, 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;
}
}
///
/// 堆垛机解警
///
///
///
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;
}
}
///
/// 堆垛机继续任务
///
///
///
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;
}
}
///
/// 判断是否有心跳
///
///
///
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;
}
}
///
/// 堆垛机是否满足下发任务的要求
///
///
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;
}
}
///
/// 写入STB
///
///
///
///
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;
}
}
///
/// 写入AckTaskFinish
///
///
///
///
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;
}
}
}
}