using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
using Newtonsoft.Json;
using System.Threading;
using yunneiWCS.EnumDefine;
using yunneiWCS.ORM;
using yunneiWCS.ExtendFunction;
namespace yunneiWCS.data
{
public static class baseData
{
public static Mutex single = new Mutex();
//static HTTPService api = new HTTPService("http://192.168.0.2:6546/api/v2/");//AGVapi基地址
static HTTPService api = new HTTPService("http://192.168.0.3:6546/api/v2/");//AGVapi基地址
/// 发送堆垛机任务
///
///
/// 任务ID
/// 起始地址
/// 目标地址
/// 1=不是重发,2=重发
public static void sendSrmTask(task _task, long taskId, string SourcePlace, string ToPlace, int isref)
{
if (single.WaitOne())//增加线程锁防止并发
{
try
{
//休眠800毫秒 【Editby shaocx,2024-10-09】
//再次校验
if (!MyExtendHelper.IsAllowSendNewTaskToSrm(800))
{
//必须抛异常
throw new Exception("当前堆垛机不满足下发任务的条件,任务号:" + taskId + ",起点:" + SourcePlace + ",终点:" + ToPlace);
}
string[] sourcePlace = SourcePlace.Split('-');
string[] toPlace = ToPlace.Split('-');
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_toPosX, Convert.ToInt16(toPlace[0]));//目标地址排
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_toPosY, Convert.ToInt16(toPlace[1]));//目标地址列
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_toPosZ, Convert.ToInt16(toPlace[2]));//目标地址层
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_command, Convert.ToInt16(1));//执行方式 搬运
if (_task == null)
{
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_TaskNo, Convert.ToInt32(taskId));//任务id
}
else
{
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_TaskNo, Convert.ToInt32(_task.PlcTaskNo));//此处任务号更改 【EditBy shaocx,2022-03-28】
}
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_sourcePosX, Convert.ToInt16(sourcePlace[0]));//起始地址排
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_sourcePosY, Convert.ToInt16(sourcePlace[1]));//起始地址排
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_sourcePosZ, Convert.ToInt16(sourcePlace[2]));//起始地址排
//记录任务记录
using (dbmodel mod = new dbmodel())
{
if (isref == 1)
{
taskRecord record = new taskRecord();
record.taskId = taskId;
record.sourcePlace = SourcePlace;
record.toPlace = ToPlace;
record.taskInfo = "堆垛机任务";
record.createTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
if (_task != null)
{//增加 【EditBy shaocx,2022-03-28】
record.AgvTaskNo = _task.AgvTaskNo;
record.PlcTaskNo = _task.PlcTaskNo;
}
mod.taskRecord.Add(record);
mod.SaveChanges();
}
}
int a = 0;
while (a < 5)//握手确认
{
if (Form1.srm.stb == "是")
{
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_ack, Convert.ToInt16(1));//ack确认
break;
}
a++;
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
WZ.Useful.Commons.LogTextHelper.WriteLine("baseData", "sendSrmTask", ex.ToString());
throw ex;//必须抛出异常 【Editby shaocx,2024-10-09】
}
finally
{
single.ReleaseMutex();
}//一轮结束
}
}
/// 发送AGV任务
///
///
/// 任务对象
/// 任务ID
/// 起始地址
/// 目标地址
/// 1=不是重发,2=重发
public static string sendAgvTask(task _task, long taskId, string sourcePlace, string toPlace, int isref)
{
//注意:_task肯定不为NULL
string result = "失败";
if (single.WaitOne())//增加线程锁防止并发
{
try
{
var _agvTaskNo = _task.AgvTaskNo;
var _old_agvTaskNo = _task.AgvTaskNo;
if (isref == 2)
{
_agvTaskNo = TaskNoHelper.CreateTaskIdForAgvTask(_task.PlcTaskNo);//重发的时候,要重新生成任务号【Editby shaocx,2024-10-09】
}
var data = new
{
//id = taskId,
//id = _task.AgvTaskNo,//此处任务号更改 【EditBy shaocx,2022-03-28】
id = _agvTaskNo,//此处任务号更改 【EditBy shaocx,2022-03-28】
systemId = "WMS",
type = "LoadingAndUnloading",
source = sourcePlace,
destination = toPlace
};
string paprm = JsonConvert.SerializeObject(data);
Guid guid = System.Guid.NewGuid();
result = api.postContentForStringForAgv("orders", paprm, guid);
//记录AGV发送任务
if (result == "")
{
if (isref == 1)
{
using (dbmodel mod = new dbmodel())
{
taskRecord record = new taskRecord();
record.taskId = taskId;
record.sourcePlace = sourcePlace;
record.toPlace = toPlace;
record.taskInfo = "AGV任务";
record.createTime = DateTime.Now;
if (_task != null)
{//增加 【EditBy shaocx,2022-03-28】
record.AgvTaskNo = _task.AgvTaskNo;
record.PlcTaskNo = _task.PlcTaskNo;
}
mod.taskRecord.Add(record);
mod.SaveChanges();
}
}
else
{
//重发,需要更新AGV任务号 【Editby shaocx,2024-10-09】
using (dbmodel mod = new dbmodel())
{
var taskDb = mod.task.Where(t => t.taskId == _task.taskId).FirstOrDefault();
taskDb.AgvTaskNo = _agvTaskNo;
//子任务的agv任务号
var taskRecord = mod.taskRecord.Where(t => t.AgvTaskNo == _old_agvTaskNo).FirstOrDefault();
if (taskRecord == null)
{
result = "根据agv任务号" + _old_agvTaskNo + "没有找到agv任务";
return result;
}
taskRecord.AgvTaskNo = _agvTaskNo;
mod.SaveChanges();
}
}
}
else
{
AgvRetModel agvRet = JsonConvert.DeserializeObject(result);
if (agvRet != null)
{
result = agvRet.message;
}
else
{
result = "AGV返回失败状态码";
}
WZ.Useful.Commons.LogTextHelper.WriteLine("baseData", "sendAgvTask", "发送AGV任务失败Taskid:" + taskId + " 发送结果: " + result + " 是否重发:" + (isref == 1 ? "不是" : "是"));
}
}
catch (Exception ex)
{
result = "AGV发送异常:" + ex.Message;
WZ.Useful.Commons.LogTextHelper.WriteLine("baseData", "sendAgvTask" + "发送AGV任务异常Taskid:" + taskId, ex.ToString());
}
finally { single.ReleaseMutex(); }//一轮结束
}
return result;
}
/// 堆垛机ACK确认
///
///
public static void sendSrmACK()
{
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_ack, Convert.ToInt16(1));//ack确认
}
/// 堆垛机任务确认
///
///
public static void srmConfirm()
{
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_Task_Finish_ACK, Convert.ToInt16(1));//确认任务
}
public static void srmAlarmReset()
{
Form1.siemensTcpNet_srm.Write(Form1.srmdb.W_alarmAck, Convert.ToInt16(1));//确认任务
}
public static List readAgvs()
{
Guid guid = System.Guid.NewGuid();
string res = api.getContentForString("agvStatus", guid);
List result = JsonConvert.DeserializeObject>(res);
return result;
}
}
}