using Castle.Core.Internal;
|
using Newtonsoft.Json;
|
using System;
|
using System.Diagnostics;
|
using System.Linq;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using WIDESEA_Common;
|
using WIDESEA_Common.Tools;
|
using WIDESEA_Core.EFDbContext;
|
using WIDESEA_Entity.DomainModels;
|
using WIDESEA_Services.IRepositories;
|
using WIDESEA_Services.Repositories;
|
using WIDESEA_WCS.EquipBaseInfo;
|
using WIDESEA_WCS.WCSClient;
|
|
namespace WIDESEA_WCS.SchedulerExecute.AGV
|
{
|
public partial class AGVSchedulerExecute
|
{
|
private static int _readSendAGVTaskSignalso = 0;
|
private static bool isTrue1 = false;
|
private static string name1 = "";
|
|
public static void SendAGVTask1(PLCClient plcClient)
|
{
|
if (Interlocked.Exchange(ref _readSendAGVTaskSignalso, 1) == 0)
|
{
|
try
|
{
|
VOLContext context = new VOLContext();
|
Idt_agvtaskRepository agvtaskRepository = new dt_agvtaskRepository(context);
|
dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName).OrderBy(r => r.agv_createtime).FirstOrDefault();
|
if (agvTask!=null)
|
{
|
int TaskInteractive = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));//1收到//DB1000.114.0
|
|
int TaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveW.ToString()));//0初始/1下发/2取消/3更改//DB1000.112.0
|
|
int resetTaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveW.ToString()));//DB1000.118.0
|
|
int resetTaskInteractiver = Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveR.ToString()));//DB1000.120.0
|
|
WriteLog.Info("agvplc总").Write("连接成功:" + plcClient.PLCName + "TaskInteractive:" + TaskInteractive + ",TaskInteractiveW" + TaskInteractiveW + ",resetTaskInteractiveW" + resetTaskInteractiveW + ",resetTaskInteractiver:" + resetTaskInteractiver + "--" + DateTime.Now, "agvplc总");
|
|
#region
|
//if (isTrue1 && name1 == plcClient.PLCName)
|
//{
|
// if (TaskInteractiveW != 0 || resetTaskInteractiveW != 0 || TaskInteractive != 0)
|
// {
|
// plcClient.WriteValue(TaskDBName.resetTaskInteractiveW.ToString(), 1);
|
// Task.Delay(2000).Wait();
|
// resetTaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveW.ToString()));
|
// dt_agvtask a1 = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).FirstOrDefault();
|
// dt_agvtask a2 = agvtaskRepository.Find(r => r.agv_taskstate != AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).FirstOrDefault();
|
// bool a3 = false;
|
|
// if (a1 != null && a2 == null)
|
// {
|
// a3 = true;
|
// }
|
// bool s1 = (a1 == null ? true : false);
|
// bool s2 = (a2 == null ? true : false);
|
// DateTime swewa = DateTime.Now;
|
// TimeSpan ts = a1.agv_createtime.Subtract(swewa).Duration();
|
// string diff = ts.TotalSeconds.ToString();
|
// double sumdiff = Double.Parse(diff);
|
// int sum = (int)sumdiff;
|
// bool s3 = sum > 180;
|
// WriteLog.Info("agv测试").Write("创建未执行任务是否存在:" + s1 + "存在下发任务:" + s2 + "===a3:" + a3 +
|
// "--时间差为:" + sum + "==s3" + s3 +
|
// DateTime.Now, "agv测试");
|
// if (resetTaskInteractiveW == 1 || (a3 && s3))
|
// {
|
// plcClient.WriteValue(TaskDBName.resetTaskInteractiveW.ToString(), 0);
|
// plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
// Task.Delay(2000).Wait();
|
// a3 = false;
|
// }
|
// return;
|
// }
|
// else
|
// {
|
// isTrue1 = false;
|
// name1 = "";
|
// }
|
//}
|
//if (resetTaskInteractiver == 1)
|
//{
|
// plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
// for (int i = 0; i < 5; i++)
|
// {
|
// Thread.Sleep(300);
|
// var agvnumber = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveW.ToString()));
|
// if (agvnumber != 0)
|
// {
|
// plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
//}
|
#endregion
|
|
if (0 == TaskInteractive && TaskInteractiveW == 0)
|
{
|
|
//写入任务信息
|
string rel = AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum);
|
/*2023.8.2新增 给驰众写入卷绕长度*/
|
if (agvTask?.agv_toaddress.Contains("JR") ?? false)
|
{
|
plcClient.SiemensPLCClient.SiemensS7NetClient.Write("DB1000.122", agvTask.size);
|
if (!string.IsNullOrEmpty(agvTask.JRunm))
|
{
|
plcClient.SiemensPLCClient.SiemensS7NetClient.Write("DB1000.78.0", agvTask.JRunm);
|
WriteLog.Info("SendAGVTask").Write("给AGV写入任务卷绕信息," + agvTask.size + agvTask.JRunm + DateTime.Now, "SendAGVTask");
|
}
|
else
|
{
|
WriteLog.Info("SendAGVTask").Write("给AGV写入任务卷绕信息,值为空" + DateTime.Now, "SendAGVTask");
|
}
|
|
}
|
#region
|
//if (agvTask.agv_fromaddress.Contains("JJK") && agvTask.agv_toaddress.Contains("TBHCJ"))
|
//{
|
// string barcode = "TB-" + agvTask.agv_materbarcode.Split('*')[0].Substring(agvTask.agv_materbarcode.Split('*')[0].Length - 1, 1);
|
// plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), barcode);
|
// WriteLog.Info("materBarcode1").Write(agvTask.agv_tasknum+barcode + DateTime.Now, "materBarcode1");
|
// for (int i = 0; i < 10; i++)
|
// {
|
// Thread.Sleep(1000);
|
// string newbarcode = plcClient.ReadBarcodeValue(TaskDBName.materBarcode.ToString()).ToString();
|
// if (newbarcode != barcode)
|
// {
|
// plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), barcode);
|
// WriteLog.Info("materBarcode2").Write(agvTask.agv_tasknum + barcode +newbarcode+ DateTime.Now, "materBarcode2");
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
//}
|
//else
|
//{
|
// plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), "0");
|
// for (int i = 0; i < 10; i++)
|
// {
|
// Thread.Sleep(1000);
|
// string newbarcode = plcClient.ReadBarcodeValue(TaskDBName.materBarcode.ToString()).ToString();
|
// WriteLog.Info("materBarcode3").Write(agvTask.agv_tasknum + newbarcode + DateTime.Now, "materBarcode3");
|
// if (newbarcode!="0")
|
// {
|
// string barcode3= plcClient.WriteBarcodeValue(TaskDBName.materBarcode.ToString(), "0").ToString();
|
// WriteLog.Info("materBarcode4").Write(agvTask.agv_tasknum + barcode3 + DateTime.Now, "materBarcode4");
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
//}
|
#endregion
|
Thread.Sleep(1000);
|
string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString();
|
if (taskId != agvTask.agv_tasknum)
|
{
|
//isTrue1 = true;
|
//name1 = plcClient.PLCName;
|
agvTask.ErrMsg = "AGV读取任务号不匹配";
|
agvTask.agv_realesstime = DateTime.Now;
|
agvtaskRepository.Update(agvTask, true);
|
}else if (string.IsNullOrEmpty(rel))
|
{
|
//写入任务确认1
|
plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 1);
|
Thread.Sleep(1000);
|
//读取AGV信号
|
int ReadTask_1_OK = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));
|
if (ReadTask_1_OK == 1)
|
{
|
//写入WCS确认信号0
|
plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
Thread.Sleep(2000);
|
//读取AGV信号是否为0
|
int ReadTask_0_OK = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));
|
if (ReadTask_0_OK == 0)
|
{
|
agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString();
|
agvTask.agv_realesstime = DateTime.Now;
|
agvtaskRepository.Update(agvTask, true);
|
// 上传AGV运行数据 by xiaoyang
|
SendMESTask.SendMesTask(agvTask, 0);
|
}
|
else
|
{
|
agvTask.ErrMsg = "给AGV写入任务确认0失败";
|
agvTask.agv_realesstime = DateTime.Now;
|
agvtaskRepository.Update(agvTask, true);
|
}
|
}
|
else if (ReadTask_1_OK == 11)
|
{
|
plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
Thread.Sleep(2000);
|
int ReadTask_0_Error = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));
|
if (ReadTask_0_Error == 0)
|
{
|
agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString();
|
agvTask.agv_realesstime = DateTime.Now;
|
agvtaskRepository.Update(agvTask, true);
|
}
|
else
|
{
|
agvTask.ErrMsg = "给AGV写入任务异常确认0失败";
|
agvTask.agv_realesstime = DateTime.Now;
|
agvtaskRepository.Update(agvTask, true);
|
}
|
}
|
else
|
{
|
agvTask.ErrMsg = "给AGV写入任务确认1失败";
|
agvTask.agv_realesstime = DateTime.Now;
|
agvtaskRepository.Update(agvTask, true);
|
}
|
}
|
else
|
{
|
agvTask.ErrMsg = "给AGV写入任务失败";
|
agvTask.agv_realesstime = DateTime.Now;
|
agvtaskRepository.Update(agvTask, true);
|
}
|
}
|
else if (TaskInteractive == 11 && TaskInteractiveW == 1)
|
{
|
plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
//Thread.Sleep(2000);
|
//int ReadTask_0_Error = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));
|
//if (ReadTask_0_Error == 0)
|
//{
|
// agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString();
|
// agvTask.agv_realesstime = DateTime.Now;
|
// agvtaskRepository.Update(agvTask, true);
|
//}
|
//else
|
//{
|
// isTrue1 = true;
|
// name1 = plcClient.PLCName;
|
// throw new Exception(string.Format("给AGV写入任务重复确认0失败11,任务号{0}", agvTask.agv_tasknum));
|
//}
|
}
|
else if (0 == TaskInteractive && TaskInteractiveW == 1)
|
{
|
plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
}
|
else if (1 == TaskInteractive && TaskInteractiveW == 1)
|
{
|
plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
|
}
|
}
|
|
}
|
catch (Exception ex)
|
{
|
WriteLog.Info("SendAGVTask").Write(plcClient.PLCName+ ex.Message.ToString()+ DateTime.Now, "SendAGVTask");
|
}
|
finally
|
{
|
Interlocked.Exchange(ref _readSendAGVTaskSignalso, 0);
|
}
|
}
|
}
|
}
|
}
|