using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using System.Drawing;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Windows.Forms;
|
using HslCommunication.Profinet.Siemens;
|
using HslCommunication;
|
using WZ.Useful.Commons;
|
using System.Diagnostics;
|
using System.Threading;
|
using yunneiWCS.EnumDefine;
|
using System.ServiceModel;
|
using yunneiWCS.ORM;
|
using Newtonsoft.Json;
|
using System.Data.Entity;
|
using yunneiWCS.wcf;
|
using yunneiWCS.data;
|
using yunneiWCS.mes;
|
using yunneiWCS.ExtendFunction;
|
using yunneiWCS.EnumDefine.InStockOrder;
|
using yunneiWCS.EnumDefine.Device;
|
using yunneiWCS.DataAccess;
|
using yunneiWCS.Common;
|
using yunneiWCS.SystemInteraction.tianyong;
|
using yunneiWCS.PLC.Srm;
|
using yunneiWCS.SystemInteraction.mes2.dto;
|
|
namespace yunneiWCS
|
{
|
public partial class Form1 : Form
|
{
|
|
/// <summary>虚拟模式
|
///
|
/// </summary>
|
// bool isvirtual = false;//虚拟模式调试的时候使用
|
public static bool isvirtual = ConfigHelper.GetConfigBool("IsVirtualMode");//修改为配置文件 【EditBy shaocx,2022-01-27】
|
|
public static Mutex single_convIsLock_GG = new Mutex();
|
|
public static Mutex single_convIsLock_GT = new Mutex();
|
|
|
/// <summary>
|
/// wcf服务变量
|
/// </summary>
|
ServiceHost myWcf;
|
public static srmDB srmdb = new srmDB();
|
public static convEntity conv1 = new convEntity();
|
public static convEntity conv2 = new convEntity();
|
public static convEntity conv3 = new convEntity();
|
public static convEntity conv4 = new convEntity();
|
public static List<convEntity> convs = new List<convEntity> { conv1, conv2, conv3, conv4 };
|
public static srmEntity srm = new srmEntity();
|
//agvS状态
|
public static List<AgvStatus> agvs = new List<AgvStatus>();
|
public static SiemensS7Net siemensTcpNet_srm;//声明一个类型为PLC的内部变量
|
public static SiemensS7Net siemensTcpNet_tran;//声明一个类型为PLC的内部变量
|
public static Mutex single = new Mutex();
|
HTTPService api = new HTTPService("http://192.168.0.2:6546/api/v2/");//AGVapi基地址
|
int deviceOpcInitTime = 0;//设备初始化次数
|
public static string[] agvSendStatus = { "无任务发送", "无任务发送" };
|
|
public static string agvInfo = "";
|
///// <summary>
|
///// 缸盖上线站点号
|
///// </summary>
|
//public static List<string> GGstations = new List<string> { "GGU1", "GGU2", "GGU3" };
|
public Form1()
|
{
|
InitializeComponent();
|
Control.CheckForIllegalCrossThreadCalls = false;
|
}
|
|
private void Form1_Load(object sender, EventArgs e)
|
{
|
|
#region 只允许单启动和绑定电脑
|
Process current = Process.GetCurrentProcess();
|
Process[] processes = Process.GetProcessesByName(current.ProcessName);
|
foreach (Process process in processes)
|
{
|
if (process.Id != current.Id)
|
{
|
if (process.MainModule.FileName == current.MainModule.FileName)
|
{
|
MessageBox.Show("不允许重复开启!");
|
Environment.Exit(0);
|
return;
|
}
|
}
|
}
|
//string computerName = Environment.GetEnvironmentVariable("ComputerName");//获取电脑用户名
|
//if (computerName != "DESKTOP-0IQRMAE" && computerName != "WIN-7P7ASICT4UL" && computerName != "XMZ1")
|
//{
|
// MessageBox.Show("非法主机!无权限运行");
|
// Environment.Exit(0);
|
//}
|
#endregion
|
myWcf = new ServiceHost(typeof(yunneiWCS.wcf.yunneiWcf));
|
myWcf.Open();//开启wcf服务
|
#region 设备链接初始化
|
if (!isvirtual)
|
{
|
//设备链接初始化
|
Thread deviceth = new Thread(deviceOpcInit);
|
StartThread(deviceth);
|
//给设备实体赋值
|
|
|
}
|
if (isvirtual)
|
{
|
this.label_title.Text = "虚拟模式不可用于生产";
|
this.label_title.BackColor = Color.Red;
|
}
|
#endregion
|
//检测并发送任务
|
Thread sendtask = new Thread(sendTaskForHasIssued);
|
StartThread(sendtask);
|
Thread _sendTaskForNoIssued = new Thread(sendTaskForNoIssuedForGT);
|
StartThread(_sendTaskForNoIssued);
|
Thread _sendTaskForNoIssuedForGG = new Thread(sendTaskForNoIssuedForGG);
|
StartThread(_sendTaskForNoIssuedForGG);
|
StartThread(new Thread(sendTaskForPick));
|
//堆垛机任务确认
|
Thread TaskConfirm = new Thread(SrmfinishConfirm);
|
StartThread(TaskConfirm);
|
//设备心跳丢失自动初始化
|
Thread checkHandShake = new Thread(checkPlcHandShake);
|
StartThread(checkHandShake);
|
//入库单转成入库任务
|
Thread inStockTask = new Thread(inStockCodeToTask);
|
StartThread(inStockTask);
|
Thread mesSendData = new Thread(mesDataTranffic);
|
StartThread(mesSendData);
|
|
new Thread(mesDataTranfficForRealMes).Start();
|
|
new Thread(RefershData).Start();
|
|
|
new Thread(HandleOutStockList).Start();
|
|
new Thread(CalcQty).Start();
|
|
new Thread(DeleteData).Start();
|
}
|
|
/// <summary>设备初始化
|
/// 设备初始化
|
/// </summary>
|
private void deviceOpcInit()
|
{
|
if (!isvirtual)
|
{
|
deviceOpcInitTime++;
|
bool plcOK = true;
|
siemensTcpNet_srm = new SiemensS7Net(SiemensPLCS.S1500, "192.168.0.10");
|
siemensTcpNet_srm.IpAddress = "192.168.0.10";//ip
|
// siemensTcpNet_srm.Port =Convert.ToInt16(4840);//堆垛机PC端口号
|
//siemensTcpNet_srm.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt");
|
OperateResult operateResultSrm = siemensTcpNet_srm.ConnectServer();
|
if (!operateResultSrm.IsSuccess)//判断是否链接PLC成功
|
{
|
|
this.label_PLC.Text = "第" + deviceOpcInitTime + "次初始化-堆垛机未链接";
|
this.label_PLC.BackColor = Color.Red;
|
plcOK = false;
|
}
|
else
|
{
|
this.label_PLC.Text = "第" + deviceOpcInitTime + "次初始化-堆垛机已链接";
|
this.label_PLC.BackColor = Color.FromArgb(0x404040);
|
//写给堆垛机心跳
|
Thread wSRM = new Thread(writeSrmHandShake);
|
wSRM.Start();
|
}
|
siemensTcpNet_tran = new SiemensS7Net(SiemensPLCS.S1500, "192.168.0.21");
|
siemensTcpNet_tran.IpAddress = "192.168.0.21";//DB块
|
// siemensTcpNet_tran.Port = Convert.ToInt16(4840);//输送线PLC端口号
|
// siemensTcpNet_tran.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt");
|
OperateResult operateResultTran = siemensTcpNet_tran.ConnectServer();
|
if (!operateResultTran.IsSuccess)//判断是否链接PLC成功
|
{
|
this.label_PLC.Text = this.label_PLC.Text + "-输送线未链接";
|
this.label_PLC.BackColor = Color.Red;
|
plcOK = false;
|
}
|
else
|
{
|
this.label_PLC.Text = this.label_PLC.Text + "-输送线已链接";
|
this.label_PLC.BackColor = Color.FromArgb(0x404040);
|
}
|
if (plcOK)
|
{
|
Thread shou = new Thread(shouEntity_Srm);
|
StartThread(shou);
|
|
Thread shou2 = new Thread(shouEntity_Convs);
|
StartThread(shou2);
|
|
Thread shou3 = new Thread(shouEntity_Agvs);
|
StartThread(shou3);
|
}
|
|
}
|
|
}
|
/// <summary>堆垛机显示服务和设备状态状态
|
///
|
/// </summary>
|
private void shouEntity_Srm()
|
{
|
string srmState = "";
|
string srmTaskExcute = "";
|
while (true)
|
{
|
//Thread.Sleep(1000);//1秒执行一次
|
Thread.Sleep(500);//时间缩短 【Editby shaocx,2024-10-09】
|
try
|
{
|
srmState = "";
|
srmTaskExcute = "";
|
|
srm.handShake = siemensTcpNet_srm.ReadInt16(srmdb.R_handShake).Content.ToString();
|
srm.mode = siemensTcpNet_srm.ReadInt16(srmdb.R_mode).Content.ToString() == "2" ? "自动" : "非自动";
|
|
//优化
|
//srm.state = siemensTcpNet_srm.ReadInt16(srmdb.R_state).Content.ToString() == "1" ? "待机" : "执行中";
|
var _db_state = siemensTcpNet_srm.ReadInt16(srmdb.R_state).Content.ToString();
|
var _state_name = "未知";
|
if (_db_state == "1")
|
{
|
_state_name = "待机";
|
}
|
else if (_db_state == "2")
|
{
|
_state_name = "执行中";
|
}
|
else if (_db_state == "3")
|
{
|
_state_name = "暂停中";
|
}
|
else if (_db_state == "4")
|
{
|
_state_name = "报警";
|
}
|
srm.state = _state_name;
|
|
srm.stb = siemensTcpNet_srm.ReadInt16(srmdb.R_stb).Content.ToString() == "1" ? "是" : "否";
|
string fin = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString();
|
srm.posY = siemensTcpNet_srm.ReadInt16(srmdb.W_sourcePosX).Content.ToString();
|
|
srm.posZ = siemensTcpNet_srm.ReadInt16(srmdb.W_sourcePosZ).Content.ToString();
|
string Finish = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString();
|
srm.taskFinish = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString() == "6" ? "完成" : "未完成";
|
srm.TaskID = siemensTcpNet_srm.ReadInt32(srmdb.R_TaskID).Content;
|
|
//修复报警信息取值不对的问题
|
//int Alarm = siemensTcpNet_srm.ReadInt16(srmdb.W_alarmAck).Content;
|
int Alarm = siemensTcpNet_srm.ReadInt16(srmdb.R_Alarm_number).Content;
|
srm.Alarm_info = Enum.GetName(typeof(srmAlarm), Alarm);
|
srm.haveGoods = siemensTcpNet_srm.ReadBool(srmdb.R_haveGoods).Content == true ? "有货" : "没货";
|
|
//显示设备状态
|
srmState = siemensTcpNet_srm.ReadInt16(srmdb.R_state).Content.ToString();
|
srm.stateDetailName = Enum.GetName(typeof(srmStatus), Convert.ToInt32(srmState));
|
//显示设备任务执行
|
srmTaskExcute = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString();
|
srm.srmTaskExcuteName = Enum.GetName(typeof(srmTaskExcute), Convert.ToInt32(srmTaskExcute));
|
SystemWarningMsg.Thread_lbl_shouEntity_Srm = "成功";
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.Thread_lbl_shouEntity_Srm = "异常:" + ex.Message;
|
}
|
}
|
}
|
|
/// <summary>输送线显示服务和设备状态状态
|
///
|
/// </summary>
|
private void shouEntity_Convs()
|
{
|
bool bian = true;
|
while (true)
|
{
|
Thread.Sleep(1000);//1秒执行一次
|
try
|
{
|
//Thread.Sleep(1000);
|
bian = !bian;
|
label_title.BackColor = bian ? Color.Blue : Color.Yellow;
|
for (int i = 0; i < 4; i++)
|
{
|
convs[i].check = siemensTcpNet_tran.ReadByte(convDBS.convDBs[i].R_check).Content == 0 ? "正常" : "外形超限";
|
convs[i].handShake = siemensTcpNet_tran.ReadInt16(convDBS.convDBs[i].R_handShake).Content.ToString();
|
convs[i].isAlarm = siemensTcpNet_tran.ReadBool(convDBS.convDBs[i].R_isAlarm).Content == true ? "故障" : "正常";
|
convs[i].mode = siemensTcpNet_tran.ReadByte(convDBS.convDBs[i].R_mode).Content == 2 ? "自动" : "手动";
|
|
convs[i].position = siemensTcpNet_tran.ReadByte(convDBS.convDBs[i].R_position).Content.ToString();
|
convs[i].taskId = siemensTcpNet_tran.ReadInt32(convDBS.convDBs[i].R_taskId).Content;
|
|
|
convs[i].W_GJJY = siemensTcpNet_tran.ReadBool(convDBS.convDBs[i].W_GJJY).Content;
|
convs[i].W_LoadMaterialConfirm = siemensTcpNet_tran.ReadBool(convDBS.convDBs[i].W_LoadMaterialConfirm).Content;
|
}
|
}
|
catch (Exception)
|
{
|
|
}
|
}
|
}
|
|
/// <summary>输送线显示服务和设备状态状态
|
///
|
/// </summary>
|
private void shouEntity_Agvs()
|
{
|
while (true)
|
{
|
Thread.Sleep(2000);//1秒执行一次
|
try
|
{
|
try
|
{
|
var agvstatus = baseData.readAgvs();
|
if (agvstatus != null && agvstatus.Count == 4)
|
{
|
agvs = agvstatus;
|
}
|
}
|
catch (Exception)
|
{
|
|
|
}
|
}
|
catch (Exception)
|
{
|
|
}
|
|
}
|
|
|
}
|
|
/// <summary>设备心跳丢失自动初始化
|
///
|
/// </summary>
|
private void checkPlcHandShake()
|
{
|
while (true)
|
{
|
|
Thread.Sleep(60000);
|
|
if ((srm.handShake == null || conv1.handShake == null) && isvirtual == false)
|
{
|
deviceOpcInit();
|
}
|
}
|
|
}
|
|
/// <summary>写给堆垛机心跳
|
///
|
/// </summary>
|
private void writeSrmHandShake()
|
{
|
int handShake = 0;
|
while (true)
|
{
|
handShake++;
|
if (handShake > 10000)
|
{
|
handShake = 0;
|
}
|
Thread.Sleep(2000);
|
short MyData = Convert.ToInt16(handShake);
|
|
var iss = siemensTcpNet_srm.Write(srmdb.W_handShake, MyData);
|
}
|
|
}
|
/// <summary>开启线程
|
///
|
/// </summary>
|
private void StartThread(Thread thread)
|
{
|
if (thread != null)
|
{
|
thread.IsBackground = true;
|
thread.Start();
|
}
|
}
|
|
#region 找空库位 【重要!!!!!】
|
|
/// <summary>找空库位
|
///
|
/// </summary>
|
/// <param name="positionType">库位类型,库口=0,空库位=1,缸体=2,缸盖=3</param>
|
/// <returns></returns>
|
public static string findStorage(int positionType)
|
{
|
//库位类型,库口=0,空库位=1,缸体=2,缸盖=3,缸体空托盘=4,缸盖空托盘=5,空托盘=6
|
string toPlace = "";
|
if (single.WaitOne())//增加线程锁防止并发
|
{
|
if (positionType != 2 && positionType != 3)
|
{
|
return "参数异常";
|
}
|
|
try
|
{
|
using (dbmodel mod = new dbmodel())
|
{
|
//寻找所有的空库位
|
List<position> findPosition = mod.position.Where(x => x.positionType == 1 && x.isfree == false && x.isLock == false && x.enable == true
|
&& (x.positionName != "2-27-5" && x.positionName != "2-12-5") //2-27-5 和2-12-5 是除湿机放的位置 【EditBy shaocx,2022-03-29】
|
).ToList();
|
//增加对库存数据的查询过滤 【2022-03-26】
|
findPosition = MyExtendHelper.FilterEmptyPosition(mod, findPosition);
|
if (findPosition.Count < 1)
|
{
|
return "";
|
}
|
List<position> outPosition = new List<position>();
|
if (positionType == 2)
|
{
|
outPosition = findPosition.Where(x => x.col > 19).OrderBy(x => x.layer).ThenByDescending(x => x.col).ToList();
|
//outPosition.Clear();
|
//满了就借用缸盖库位
|
if (outPosition.Count < 1)
|
{
|
outPosition = findPosition.Where(x => x.col < 20).OrderByDescending(x => x.col).ThenBy(x => x.layer).ToList();
|
}
|
}
|
|
if (positionType == 3)
|
{
|
outPosition = findPosition.Where(x => x.col < 20).OrderBy(x => x.layer).ThenBy(x => x.col).ToList();
|
// outPosition.Clear();
|
//满了就借用缸体库位
|
if (outPosition.Count < 1)
|
{
|
outPosition = findPosition.Where(x => x.col > 19).OrderBy(x => x.col).ThenBy(x => x.layer).ToList();
|
}
|
}
|
|
if (outPosition.Count > 0)
|
{
|
toPlace = outPosition[0].positionName + "/" + outPosition[0].positionId;
|
//outPosition[0].isLock = true;
|
PositionHandler.Lock(true, outPosition[0], "找空库位", SysGloble.WCSNAME, null);
|
}
|
int res = mod.SaveChanges();
|
if (res < 1)
|
{
|
res = mod.SaveChanges();
|
if (res < 1)
|
{
|
res = mod.SaveChanges();
|
if (res < 1)
|
{
|
toPlace = "";
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "findStorage", "保存失败");
|
}
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
toPlace = "";
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "findStorage", ex.ToString());
|
}
|
finally { single.ReleaseMutex(); }//一轮结束
|
}
|
return toPlace;
|
}
|
#endregion
|
|
#region 消费Task任务数据线程 【EditBy shaocx,2022-02-06】
|
|
#region 原先的方法
|
///// <summary>发送任务给设备
|
/////
|
///// </summary>
|
//private void sendTask()
|
//{
|
// while (true)
|
// {
|
// Thread.Sleep(2000);
|
// try
|
// {
|
// int ishaveTask = 0;
|
// using (dbmodel mod = new dbmodel())
|
// {
|
// //area=1是缸体侧,area=2是缸盖侧
|
// //先处理任务中的任务(在输送线上的)
|
// List<task> FinishTasking = mod.task.Where(x => x.taskStatus == 3).ToList();
|
// if (FinishTasking.Count > 0)
|
// {
|
// List<task> bobyTask = FinishTasking.Where(x => x.area == 1).ToList();
|
// #region 处理缸体未完成任务
|
// if (bobyTask.Count > 0)
|
// {
|
// foreach (var item in bobyTask)
|
// {
|
// string SourcePlace = "";
|
// if (!isvirtual)
|
// {
|
// #region 判断输送线任务id,赋值SourcePlace
|
// if (conv1.taskId == item.taskId)
|
// {
|
// SourcePlace = "2-39-1";
|
// }
|
// if (conv2.taskId == item.taskId)
|
// {
|
// SourcePlace = "1-39-1";
|
// }
|
// #endregion
|
// }
|
// if (item.taskType == 3 || item.taskType == 5)
|
// {//呼叫空托 或 缸体上线
|
|
// #region 发送rgv任务
|
// if (SourcePlace != "")
|
// {
|
// bool isReadAgv = false;
|
// if (!isvirtual)
|
// {
|
// #region 判断AGV是否空闲
|
// if (agvs.Count == 4)
|
// {
|
// string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1);
|
// if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
|
// isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1);
|
// if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
|
// }
|
|
|
// #endregion
|
// }
|
// if (isReadAgv)
|
// {
|
// #region 发送AGV任务 并清空库存
|
|
// string res = "失败";
|
// if (!isvirtual)
|
// {
|
// res = baseData.sendAgvTask(item.taskId, SourcePlace, item.toPlace, 1);
|
|
// }
|
// string tasktype = "缸体呼叫空托盘/缸体上线";
|
// if (res == "")
|
// {
|
// #region 清空库存更新状态
|
// item.taskStatus = (int)taskStatus.完成;
|
// mod.SaveChanges();
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId;
|
// //库存位
|
// position positions = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace);
|
// //上下线站点位
|
|
// //解锁输送线
|
// position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace);
|
// convs.isLock = false;
|
|
// if (positions != null)
|
// {
|
// #region 清空库位
|
// productStock stock = mod.productStock.FirstOrDefault(x => x.positionId == positions.positionId);
|
// if (stock != null)
|
// {
|
// if (item.taskType == 5)//上线就把数据放到上线站点上
|
// {
|
// position positionStation = mod.position.FirstOrDefault(x => x.positionName == item.toPlace);
|
// if (positionStation != null)
|
// {
|
// stock.positionId = positionStation.positionId;
|
// positionStation.isfree = true;
|
// }
|
// List<productStockList> stocklist = mod.productStockList.Where(x => x.stockId == positions.positionId).ToList();
|
// if (stocklist.Count > 0)
|
// {
|
// foreach (var itemList in stocklist)
|
// {
|
// itemList.stockId = positionStation.positionId;
|
// }
|
// }
|
// }
|
// else//呼叫空托就清空库存
|
// {
|
// mod.productStock.Remove(stock);
|
// }
|
// positions.isfree = false;
|
// positions.isLock = false;
|
// positions.quantity = 0;
|
// positions.positionType = 1;
|
|
// }
|
// else
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "任务ID" + item.taskId + "-" + tasktype + "查找库存失败");
|
// }
|
// #endregion
|
// }
|
// else
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "任务ID" + item.taskId + "-" + tasktype + "查找库位失败");
|
// }
|
// #endregion
|
// }
|
// else
|
// {
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败,任务ID:" + item.taskId;
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", tasktype + "发送RGV任务失败");
|
// }
|
// #endregion
|
|
// int saveRes = mod.SaveChanges();
|
// #region 验证是否保存成功
|
// for (int i = 0; i < 4; i++)
|
// {
|
// if (saveRes < 1)
|
// {
|
// saveRes = mod.SaveChanges();
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
// if (saveRes < 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
// }
|
// #endregion
|
// }
|
// else
|
// {
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-ARV繁忙,任务ID:" + item.taskId;
|
// }
|
|
|
// }
|
// else
|
// {
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId;
|
// }
|
// #endregion
|
// }
|
// else //taskType 1缸体下线和6空托回库
|
// {
|
// #region 发送堆垛机任务
|
// if (SourcePlace != "")
|
// {
|
// if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机")
|
// {
|
// #region 发送堆垛机任务
|
// if (!isvirtual)
|
// {
|
// baseData.sendSrmTask(item.taskId, SourcePlace, item.toPlace, 1);
|
// }
|
// position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace);
|
// convs.isLock = false;
|
// item.taskStatus = (int)taskStatus.待完成;
|
// #endregion
|
|
// int saveRes = mod.SaveChanges();
|
// #region MyRegion
|
// for (int i = 0; i < 4; i++)
|
// {
|
// if (saveRes < 1)
|
// {
|
// saveRes = mod.SaveChanges();
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
// if (saveRes < 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
// }
|
// #endregion
|
|
// }
|
|
// }
|
// #endregion
|
|
// }
|
// }
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = "";
|
// }
|
// #endregion
|
// List<task> lidTask = FinishTasking.Where(x => x.area == 2).ToList();
|
// #region 处理缸盖未完成任务
|
// if (lidTask.Count > 0)
|
// {
|
// foreach (var item in lidTask)
|
// {
|
// string SourcePlace = "";
|
// if (!isvirtual)
|
// {
|
// #region 判断输送线任务id,赋值SourcePlace
|
// if (conv3.taskId == item.taskId)
|
// {
|
// SourcePlace = "1-0-1";
|
// }
|
// if (conv4.taskId == item.taskId)
|
// {
|
// SourcePlace = "2-0-1";
|
// }
|
// #endregion
|
// }
|
// if (SourcePlace != "")
|
// {
|
// if (item.taskType == 3 || item.taskType == 4)//
|
// {
|
// #region 发送AGV任务
|
// bool isReadAgv = false;
|
// if (!isvirtual)
|
// {
|
// if (agvs.Count == 4)
|
// {
|
// #region 判断AGV是否空闲
|
|
// string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1);
|
// if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
|
// isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1);
|
// if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
// #endregion
|
// }
|
|
|
// }
|
// if (isReadAgv)
|
// {
|
|
// string res = "失败";
|
// if (!isvirtual)
|
// {
|
// res = baseData.sendAgvTask(item.taskId, SourcePlace, item.toPlace, 1);
|
// }
|
// if (res == "")
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId;
|
// #region 发送AGV任务
|
// item.taskStatus = (int)taskStatus.完成;
|
// int ishave = mod.SaveChanges();
|
// position delPosition = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace);
|
// //清除库存 需要改,RGV
|
// if (delPosition != null)
|
// {
|
// #region MyRegion
|
// productStock stock = mod.productStock.FirstOrDefault(x => x.positionId == delPosition.positionId);
|
// if (item.taskType == 3)//呼叫空托盘就把数据删了
|
// {
|
// mod.productStock.Remove(stock);
|
// }
|
// else//上线就把数据放到上线站点上
|
// {
|
// position positionStation = mod.position.FirstOrDefault(x => x.positionName == item.toPlace);
|
// if (positionStation != null)
|
// {
|
// stock.positionId = positionStation.positionId;
|
// positionStation.isfree = true;
|
// }
|
// List<productStockList> stocklist = mod.productStockList.Where(x => x.stockId == delPosition.positionId).ToList();
|
// if (stocklist.Count > 0)
|
// {
|
// foreach (var itemList in stocklist)
|
// {
|
// itemList.stockId = positionStation.positionId;
|
// }
|
// }
|
// }
|
|
|
// delPosition.isfree = false;
|
// delPosition.isLock = false;
|
// delPosition.positionType = 1;
|
// #endregion
|
|
// }
|
// //
|
// #region 输送线复位
|
// position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace);
|
// convs.isLock = false;
|
// int saveRes = mod.SaveChanges();
|
// for (int i = 0; i < 4; i++)
|
// {
|
// if (saveRes < 1)
|
// {
|
// saveRes = mod.SaveChanges();
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
// if (saveRes < 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
// }
|
// #endregion
|
|
// #endregion
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发失败,任务ID:" + item.taskId;
|
// }
|
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-ARV繁忙,任务ID:" + item.taskId;
|
// }
|
// #endregion
|
|
// }
|
// else
|
// {
|
// if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机")
|
// {
|
// #region 发送堆垛机任务
|
// if (!isvirtual)
|
// {
|
// baseData.sendSrmTask(item.taskId, SourcePlace, item.toPlace, 1);
|
// //恢复输送线锁定状态
|
|
// }
|
// position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace);
|
// if (convs != null)
|
// {
|
// convs.isLock = false;
|
// }
|
|
// item.taskStatus = (int)taskStatus.待完成;
|
// #endregion
|
|
// int saveRes = mod.SaveChanges();
|
// #region MyRegion
|
// for (int i = 0; i < 4; i++)
|
// {
|
// if (saveRes < 1)
|
// {
|
// saveRes = mod.SaveChanges();
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
// if (saveRes < 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
// }
|
// #endregion
|
|
// }
|
// }
|
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId;
|
// }
|
// }
|
// }
|
// else
|
// {
|
// agvSendStatus[0] = "无任务";
|
// }
|
// #endregion
|
// }
|
// else
|
// {
|
// ishaveTask = 1;
|
// }
|
// //处理未下发的任务
|
// List<task> noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList();
|
// if (noFinishTask.Count > 0)
|
// {
|
// #region 未下发的任务
|
// List<task> bobyTask = noFinishTask.Where(x => x.area == 1).ToList();
|
// //处理缸体未下发任务
|
// if (bobyTask.Count > 0)
|
// {
|
// foreach (var item in bobyTask)
|
// {
|
// //找空闲输送线
|
|
// #region 处理缸体未下发任务
|
|
// if (item.taskType == 1 || item.taskType == 6 || item.taskType == 7)
|
// {
|
|
// #region 发送agv任务
|
// bool isReadAgv = false;
|
// if (!isvirtual)
|
// {
|
// if (agvs.Count == 4)
|
// {
|
// #region 判断AGV是否空闲
|
// string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1);
|
// if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
|
// isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1);
|
// if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
// #endregion
|
// }
|
|
// }
|
// if (isReadAgv)
|
// {
|
|
// string toplace = convIsLock(1);
|
// #region MyRegion
|
// if (toplace != "")
|
// {
|
// #region 发送AGV任务
|
// string res = "失败";
|
// if (!isvirtual)
|
// {
|
// res = baseData.sendAgvTask(item.taskId, item.sourcePlace, toplace, 1);
|
|
// }
|
// if (res == "")
|
// {
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId;
|
// item.middlePlace = toplace;
|
// item.taskStatus = 3;
|
// position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace);
|
// if (unlockPosition != null)
|
// {
|
// unlockPosition.isLock = true;
|
// }
|
// int saveRes = mod.SaveChanges();
|
// #region 检验保存是否成功
|
// for (int i = 0; i < 4; i++)
|
// {
|
// if (saveRes < 1)
|
// {
|
// saveRes = mod.SaveChanges();
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
// if (saveRes < 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
// }
|
// #endregion
|
|
// #endregion
|
// }
|
|
// else
|
// {
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败,任务ID:" + item.taskId;
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送失败! 任务id:" + item.taskId);
|
// }
|
|
|
// }
|
// else
|
// {
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败输送线都被占用,任务ID:" + item.taskId;
|
// }
|
// #endregion
|
|
// }
|
// else
|
// {
|
// agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId;
|
// }
|
// #endregion
|
|
// }
|
// else
|
// {
|
// #region 发送堆垛机任务
|
// if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机")
|
// {
|
// string toplace = convIsLock(1);
|
// if (toplace != "")
|
// {
|
|
// #region 发送堆垛机任务
|
// if (!isvirtual)
|
// {
|
// baseData.sendSrmTask(item.taskId, item.sourcePlace, toplace, 1);
|
// }
|
// position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace);
|
// if (unlockPosition != null)
|
// {
|
// unlockPosition.isLock = true;
|
// }
|
// //保存任务记录
|
// item.middlePlace = toplace;
|
// item.taskStatus = 3;
|
// //增加出库单 状态更改
|
// #endregion
|
|
// int saveRes = mod.SaveChanges();
|
|
// for (int i = 0; i < 4; i++)
|
// {
|
// if (saveRes < 1)
|
// {
|
// saveRes = mod.SaveChanges();
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
// if (saveRes < 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
// }
|
// }
|
// else
|
// {
|
|
// }
|
|
// }
|
// #endregion
|
|
// }
|
// #endregion
|
// }
|
// }
|
// else
|
// {
|
// agvSendStatus[0] = "无任务发送";
|
// }
|
// //处理缸盖未下发任务
|
// List<task> lidTask = noFinishTask.Where(x => x.area == 2).ToList();
|
// if (lidTask.Count > 0)
|
// {
|
// foreach (var item in lidTask)
|
// {
|
// //找空闲输送线
|
// string toplace = convIsLock(3);
|
// #region 处理缸盖未下发任务
|
|
// if (toplace != "")
|
// {
|
// if (item.taskType == 2 || item.taskType == 6 || item.taskType == 7)
|
// {
|
|
|
// bool isReadAgv = false;
|
// if (!isvirtual)
|
// {
|
// if (agvs.Count == 4)
|
// {
|
// #region 判断AGV是否空闲
|
// string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1);
|
// if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
|
// isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1);
|
// if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
// {
|
// isReadAgv = true;
|
// }
|
// #endregion
|
// }
|
|
// }
|
// if (isReadAgv)
|
// {
|
// #region 处理缸盖未下发任务
|
// string res = "失败";
|
// if (!isvirtual)
|
// {
|
// res = baseData.sendAgvTask(item.taskId, item.sourcePlace, toplace, 1);
|
// }
|
// if (res == "")
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId;
|
// item.middlePlace = toplace;
|
// item.taskStatus = 3;
|
// position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace);
|
// if (unlockPosition != null)
|
// {
|
// unlockPosition.isLock = true;
|
// }
|
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败,任务ID:" + item.taskId;
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送失败! 任务id:" + item.taskId);
|
// }
|
|
// #endregion
|
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-RGV繁忙,任务ID:" + item.taskId;
|
// }
|
|
// }
|
// else
|
// {
|
// if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机")
|
// {
|
// #region 发送堆垛机任务
|
// if (!isvirtual)
|
// {
|
// baseData.sendSrmTask(item.taskId, item.sourcePlace, toplace, 1);
|
// }
|
|
// position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace);
|
// if (unlockPosition != null)
|
// {
|
// unlockPosition.isLock = true;
|
// }
|
// item.middlePlace = toplace;
|
// item.taskStatus = 3;
|
// #endregion
|
// }
|
|
// }
|
// int saveRes = mod.SaveChanges();
|
// #region 验证发送是否成功
|
// for (int i = 0; i < 4; i++)
|
// {
|
// if (saveRes < 1)
|
// {
|
// saveRes = mod.SaveChanges();
|
// }
|
// else
|
// {
|
// break;
|
// }
|
// }
|
// if (saveRes < 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
// }
|
// #endregion
|
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId;
|
// }
|
// #endregion
|
// }
|
// }
|
// else
|
// {
|
// agvSendStatus[1] = "无任务发送";
|
// }
|
// #endregion
|
// }
|
// else
|
// {
|
// #region 更改信息状态
|
// if (ishaveTask == 1)
|
// {
|
// agvSendStatus[0] = "无任务发送";
|
// agvSendStatus[1] = "无任务发送";
|
// }
|
// #endregion
|
// }
|
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", ex.ToString());
|
// }
|
// }
|
//}
|
#endregion
|
|
#region 现在的方法
|
|
/// <summary>
|
/// 处理未下发的任务(缸体)
|
/// </summary>
|
private void sendTaskForNoIssuedForGT()
|
{
|
while (true)
|
{
|
Thread.Sleep(2000);
|
try
|
{
|
using (dbmodel mod = new dbmodel())
|
{
|
//area=1是缸体侧,area=2是缸盖侧
|
//处理未下发的任务
|
var queryStatus_NoIssue = (int)taskStatus.未下发;
|
List<task> noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList();
|
//List<task> noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList();
|
if (noFinishTask.Count > 0)
|
{
|
#region 未下发的任务
|
List<task> bobyTask = noFinishTask.Where(x => x.area == 1).ToList();
|
//处理缸体未下发任务
|
if (bobyTask.Count > 0)
|
{
|
foreach (var item in bobyTask)
|
{
|
|
#region 处理缸体未下发任务
|
|
//if (item.taskType == 1 || item.taskType == 6 || item.taskType == 7)
|
if (item.taskType == (int)taskType.缸体下线
|
|| item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.空托下线入库
|
|| item.taskType == (int)taskType.余料回库)
|
{
|
|
#region 发送agv任务
|
bool isReadAgv = false;
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
if (agvs.Count == 4)
|
{
|
#region 判断AGV是否空闲
|
string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1);
|
if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
|
isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1);
|
if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
#endregion
|
}
|
}
|
else
|
{//虚拟模式或强制完成
|
isReadAgv = true;
|
}
|
if (isReadAgv)
|
{
|
|
//string convPlace = convIsLock(1, item, TaskAreaEnum.缸体侧);
|
string convPlace = convIsLock_GT(1, item);
|
#region MyRegion
|
if (convPlace != "")
|
{
|
string res = "失败";
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
res = baseData.sendAgvTask(item, item.taskId, item.sourcePlace, convPlace, 1);
|
}
|
else
|
{//虚拟模式或强制完成
|
res = "";
|
}
|
if (res == "")
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId;
|
item.middlePlace = convPlace;
|
//item.taskStatus = 3;
|
item.taskStatus = (int)taskStatus.已下发;
|
item.remark = "已下发";
|
item.remark = "发送AGV任务成功";
|
position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == convPlace);
|
if (unlockPosition != null)
|
{
|
//unlockPosition.isLock = true;
|
PositionHandler.Lock(true, unlockPosition, "处理未下发的任务(缸体)", SysGloble.WCSNAME, item);
|
}
|
//起点库位解锁、设置无货 【EditBy shaocx,2022-03-23】
|
position _sourcePlace = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace);
|
PositionHandler.LockAndFree(false, false, _sourcePlace, "处理未下发的任务(缸体),修改起点", SysGloble.WCSNAME, item);
|
|
int saveRes = mod.SaveChanges();
|
#region 检验保存是否成功
|
for (int i = 0; i < 4; i++)
|
{
|
if (saveRes < 1)
|
{
|
saveRes = mod.SaveChanges();
|
}
|
else
|
{
|
break;
|
}
|
}
|
if (saveRes < 1)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
}
|
#endregion
|
}
|
else
|
{
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "发送AGV任务失败:" + res;
|
mod.SaveChanges();
|
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId;
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送失败!" + res + " 任务id:" + item.taskId);
|
}
|
}
|
else
|
{
|
agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败输送线都被占用,任务ID:" + item.taskId;
|
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "发送失败输送线都被占用";
|
mod.SaveChanges();
|
}
|
#endregion
|
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId;
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "没发送任务-AGV繁忙";
|
mod.SaveChanges();
|
}
|
#endregion
|
|
}
|
else if (item.taskType == (int)taskType.旁路工位缸体空托回库 || item.taskType == (int)taskType.旁路工位缸体余料回库)
|
{
|
string convPlace = item.middlePlace;//这个输送线站点是工人自己选的
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = MyExtend.HandlerNoIssuedTaskFor旁路工位缸体空托或余料回库(mod, convPlace, item, agvSendStatus);
|
}
|
else if (item.taskType == (int)taskType.缸体下线直接去上线点)
|
{//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】
|
SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg = MyExtend.HandleTaskForNoIssuedForDirectOnLinePoint(mod, agvs, item, agvSendStatus);
|
}
|
else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣
|
|| item.taskType == (int)taskType.空托人工出库
|
)
|
{//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】
|
var errMsg = "";
|
MyExtend.HandleTaskForutStoreBySrm(mod, item, ref errMsg);
|
if (!string.IsNullOrEmpty(errMsg))
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = errMsg;
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = errMsg;
|
mod.SaveChanges();
|
}
|
}
|
else if (item.taskType == (int)taskType.缸体上线去旁路工位)//增加 缸体上线去旁路工位 的分支 【EditBy shaocx,2022-04-24】
|
{
|
//string convPlace = convIsLock(1, item, TaskAreaEnum.缸体侧);
|
string convPlace = convIsLock_GT(1, item);
|
if (convPlace != "")
|
{
|
TaskHelper.sendTaskForNoIssuedFor发送堆垛机任务(mod, item, convPlace);
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "未找到空闲的输送线站点";
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg;
|
mod.SaveChanges();
|
}
|
}
|
else if (item.taskType == (int)taskType.手动入库
|
|| item.taskType == (int)taskType.空托手动入库)
|
{//增加手动入库的分支 【EditBy shaocx,2022-03-16】
|
var errMsg = "";
|
MyExtend.HandleTaskForHandInStore(mod, item, ref errMsg);
|
if (!string.IsNullOrEmpty(errMsg))
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = errMsg;
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = errMsg;
|
mod.SaveChanges();
|
}
|
}
|
else
|
{
|
//string convPlace = convIsLock(1, item, TaskAreaEnum.缸体侧);
|
string convPlace = convIsLock_GT(1, item);
|
if (convPlace != "")
|
{
|
TaskHelper.sendTaskForNoIssuedFor发送堆垛机任务(mod, item, convPlace);
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "未找到空闲的输送线站点";
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg;
|
mod.SaveChanges();
|
}
|
}
|
#endregion
|
}
|
}
|
else
|
{
|
agvSendStatus[0] = "无任务发送";
|
}
|
#endregion
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "没有要处理的状态为未下发的任务";
|
}
|
|
}
|
}
|
catch (Exception ex)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForNoIssued", ex.ToString());
|
SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 处理未下发的任务(缸盖)
|
/// </summary>
|
private void sendTaskForNoIssuedForGG()
|
{
|
while (true)
|
{
|
Thread.Sleep(2000);
|
try
|
{
|
using (dbmodel mod = new dbmodel())
|
{
|
//area=1是缸体侧,area=2是缸盖侧
|
//处理未下发的任务
|
var queryStatus_NoIssue = (int)taskStatus.未下发;
|
List<task> noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList();
|
//List<task> noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList();
|
if (noFinishTask.Count > 0)
|
{
|
|
#region 未下发的任务
|
//处理缸盖未下发任务
|
List<task> lidTask = noFinishTask.Where(x => x.area == 2).ToList();
|
if (lidTask.Count > 0)
|
{
|
foreach (var item in lidTask)
|
{
|
//if (item.taskType == 2 || item.taskType == 6 || item.taskType == 7)
|
if (item.taskType == (int)taskType.缸盖下线 ||
|
item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.空托下线入库
|
|| item.taskType == (int)taskType.余料回库)
|
{//缸盖下线=2, 空托回库=6, 余料回库=7,
|
|
|
bool isReadAgv = false;
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
if (agvs.Count == 4)
|
{
|
#region 判断AGV是否空闲
|
string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1);
|
if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
|
isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1);
|
if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
#endregion
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + ",读取AGV个数不是4个,应该是AGV不在线,任务ID:" + item.taskId;
|
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "读取AGV个数不是4个,应该是AGV不在线";
|
mod.SaveChanges();
|
}
|
}
|
else
|
{//虚拟模式或强制完成
|
isReadAgv = true;
|
}
|
if (isReadAgv)
|
{
|
string convPlace = "";
|
convPlace = findConvPlaceFor_sendTaskForNoIssuedForGG(mod, item);
|
if (string.IsNullOrEmpty(convPlace))
|
{
|
break;//跳出循环
|
}
|
#region 处理缸盖未下发任务的数据保存
|
string res = "失败";
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
res = baseData.sendAgvTask(item, item.taskId, item.sourcePlace, convPlace, 1);
|
}
|
else
|
{//虚拟模式或强制完成
|
res = "";
|
}
|
if (res == "")
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId;
|
item.middlePlace = convPlace;
|
//item.taskStatus = 3;
|
item.taskStatus = (int)taskStatus.已下发;
|
item.remark = "已下发";
|
position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == convPlace);
|
if (unlockPosition != null)
|
{
|
// unlockPosition.isLock = true;
|
PositionHandler.Lock(true, unlockPosition, "处理未下发的任务(缸盖)", SysGloble.WCSNAME, item);
|
}
|
//起点库位解锁、设置无货 【EditBy shaocx,2022-03-23】
|
position _sourcePlace = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace);
|
PositionHandler.LockAndFree(false, false, _sourcePlace, "处理未下发的任务(缸盖),修改起点", SysGloble.WCSNAME, item);
|
if (item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.余料回库)
|
{//给天永发信号
|
TianYongSystem.UpdateStoreByTaskID(mod, item, item.toPlace, (int)item.taskId, item.taskTypeName + ",离开天永站点");
|
}
|
|
int saveRes = mod.SaveChanges();
|
#region 验证发送是否成功
|
if (saveRes < 1)
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "数据库保存失败! 任务id:" + item.taskId;
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
}
|
else
|
{//保存成功
|
|
}
|
#endregion
|
}
|
else
|
{
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "发送AGV任务失败:" + res;
|
mod.SaveChanges();
|
|
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId;
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送发送AGV任务失败:" + res + ", 任务id:" + item.taskId);
|
}
|
|
#endregion
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId;
|
item.remark = "AGV繁忙";
|
mod.SaveChanges();
|
}
|
|
}
|
else if (item.taskType == (int)taskType.缸盖下线直接去上线点)
|
{//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】
|
SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg = MyExtend.HandleTaskForNoIssuedForDirectOnLinePoint(mod, agvs, item, agvSendStatus);
|
item.remark = SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg;
|
mod.SaveChanges();
|
}
|
else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣
|
|| item.taskType == (int)taskType.空托人工出库
|
)
|
{//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】
|
var errMsg = "";
|
MyExtend.HandleTaskForutStoreBySrm(mod, item, ref errMsg);
|
if (!string.IsNullOrEmpty(errMsg))
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = errMsg;
|
item.remark = errMsg;
|
mod.SaveChanges();
|
}
|
}
|
else if (item.taskType == (int)taskType.缸体上线去旁路工位)
|
{//增加 缸体下线直接去旁路工位 的分支 【EditBy shaocx,2022-04-24】
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + ",缸体上线去旁路工位,物料不应该是缸盖,任务ID:" + item.taskId;
|
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "缸体上线去旁路工位,物料不应该是缸盖";
|
mod.SaveChanges();
|
}
|
else if (item.taskType == (int)taskType.手动入库
|
|| item.taskType == (int)taskType.空托手动入库)
|
{//增加手动入库的分支 【EditBy shaocx,2022-03-16】
|
var errMsg = "";
|
MyExtend.HandleTaskForHandInStore(mod, item, ref errMsg);
|
if (!string.IsNullOrEmpty(errMsg))
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = errMsg;
|
item.remark = errMsg;
|
mod.SaveChanges();
|
}
|
}
|
else
|
{
|
string toplace = "";
|
toplace = findConvPlaceFor_sendTaskForNoIssuedForGG(mod, item);
|
if (string.IsNullOrEmpty(toplace))
|
{
|
break;//跳出循环
|
}
|
TaskHelper.sendTaskForNoIssuedFor发送堆垛机任务(mod, item, toplace);
|
}
|
}
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "无任务发送";
|
}
|
#endregion
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "没有要处理的状态为未下发的任务";
|
}
|
|
}
|
}
|
catch (Exception ex)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForNoIssued", ex.ToString());
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 寻找目标点(输送线站点)
|
/// </summary>
|
/// <param name="item"></param>
|
/// <returns></returns>
|
private string findConvPlaceFor_sendTaskForNoIssuedForGG(dbmodel mod, task item)
|
{
|
//找空闲输送线
|
//string convPlace = convIsLock(3, item, TaskAreaEnum.缸盖侧);
|
string convPlace = convIsLock_GG(3, item);
|
|
if (convPlace != "")
|
{
|
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用(或是被锁定,或是输送线上有货),任务ID:" + item.taskId;
|
item.remark = "输送线都被占用(或是被锁定,或是输送线上有货)";
|
mod.SaveChanges();
|
}
|
return convPlace;
|
}
|
|
/// <summary>处理已下发的任务
|
/// 处理已下发的任务
|
/// </summary>
|
private void sendTaskForHasIssued()
|
{
|
while (true)
|
{
|
Thread.Sleep(2000);
|
try
|
{
|
int ishaveTask = 0;
|
using (dbmodel mod = new dbmodel())
|
{
|
//area=1是缸体侧,area=2是缸盖侧
|
//先处理任务中的任务(在输送线上的)
|
var queryStatus = (int)taskStatus.已下发;
|
List<task> FinishTasking = mod.task.Where(x => x.taskStatus == queryStatus).ToList();
|
//List<task> FinishTasking = mod.task.Where(x => x.taskStatus == 3).ToList();
|
if (FinishTasking.Count > 0)
|
{
|
//List<task> bobyTask = FinishTasking.Where(x => x.area == 1).ToList();
|
var queryTaskAreaEnum = (int)TaskAreaEnum.缸体侧;
|
List<task> bobyTask = FinishTasking.Where(x => x.area == queryTaskAreaEnum).ToList();
|
#region 处理缸体未完成任务
|
if (bobyTask.Count > 0)
|
{
|
foreach (var item in bobyTask)
|
{
|
string convPlace = "";
|
convPlace = MyExtendHelper.GetConvPlace(conv1, conv2, conv3, conv4, item, TaskAreaEnum.缸体侧);
|
|
//if (item.taskType == 3 || item.taskType == 5)
|
if (item.taskType == (int)taskType.呼叫空托 || item.taskType == (int)taskType.缸体上线)
|
{//呼叫空托 或 缸体上线
|
|
#region 发送rgv任务
|
if (convPlace != "")
|
{
|
bool isReadAgv = false;
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
#region 判断AGV是否空闲
|
if (agvs.Count == 4)
|
{
|
string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1);
|
if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
|
isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1);
|
if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
|
}
|
|
|
#endregion
|
}
|
else
|
{//虚拟模式或强制完成
|
isReadAgv = true;
|
}
|
if (isReadAgv)
|
{
|
#region 发送AGV任务 并处理库存
|
|
string res = "失败";
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
res = baseData.sendAgvTask(item, item.taskId, convPlace, item.toPlace, 1);
|
}
|
else
|
{//虚拟模式或强制完成
|
res = "";
|
}
|
string tasktype = "缸体呼叫空托盘/缸体上线";
|
if (res == "")
|
{
|
TaskHelper.sendTaskForHasIssuedFor呼叫空托And缸体上线And缸盖上线(mod, item, convPlace, tasktype);
|
}
|
else
|
{
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "发送AGV任务失败:" + res;
|
mod.SaveChanges();
|
|
agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId;
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", tasktype + "发送AGV任务失败:" + res);
|
}
|
#endregion
|
}
|
else
|
{
|
agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId;
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "AGV繁忙";
|
mod.SaveChanges();
|
}
|
}
|
else
|
{
|
agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId;
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "输送线都被占用";
|
mod.SaveChanges();
|
}
|
#endregion
|
}
|
else if (item.taskType == (int)taskType.缸体上线去旁路工位)
|
{//增加 缸体上线去旁路工位 的分支判断 【EditBy shaocx,2022-04-23】
|
|
}
|
else if (item.taskType == (int)taskType.缸体下线直接去上线点)
|
{//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】
|
|
}
|
else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣
|
|| item.taskType == (int)taskType.空托人工出库)
|
{//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】
|
|
}
|
else if (item.taskType == (int)taskType.手动入库
|
|| item.taskType == (int)taskType.空托手动入库)
|
{//增加手动入库的分支 【EditBy shaocx,2022-03-16】
|
|
}
|
else if (item.taskType == (int)taskType.缸体下线 ||
|
item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.空托下线入库
|
|| item.taskType == (int)taskType.余料回库
|
)
|
{//taskType 1缸体下线和6空托回库 7余料回库
|
TaskHelper.sendTaskForHasIssuedFor发送堆垛机任务(mod, item, convPlace);
|
}
|
else if (item.taskType == (int)taskType.旁路工位缸体空托回库 || item.taskType == (int)taskType.旁路工位缸体余料回库
|
)
|
{
|
TaskHelper.sendTaskForHasIssuedFor发送堆垛机任务(mod, item, item.middlePlace);
|
}
|
else //其他任务类型
|
{
|
|
|
}
|
}
|
}
|
else
|
{
|
agvSendStatus[1] = "";
|
}
|
#endregion
|
// List<task> lidTask = FinishTasking.Where(x => x.area == 2).ToList();
|
queryTaskAreaEnum = (int)TaskAreaEnum.缸盖侧;
|
List<task> lidTask = FinishTasking.Where(x => x.area == queryTaskAreaEnum).ToList();
|
#region 处理缸盖未完成任务
|
if (lidTask.Count > 0)
|
{
|
foreach (var item in lidTask)
|
{
|
string convPlace = "";
|
convPlace = MyExtendHelper.GetConvPlace(conv1, conv2, conv3, conv4, item, TaskAreaEnum.缸盖侧);
|
if (convPlace != "")
|
{
|
if (item.taskType == (int)taskType.呼叫空托 || item.taskType == (int)taskType.缸盖上线)
|
{//呼叫空托=3, 缸盖上线=4,
|
#region 发送AGV任务
|
bool isReadAgv = false;
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
if (agvs.Count == 4)
|
{
|
#region 判断AGV是否空闲
|
|
string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1);
|
if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
|
isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1);
|
if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP))
|
{
|
isReadAgv = true;
|
}
|
#endregion
|
}
|
}
|
else
|
{//虚拟模式或强制完成
|
isReadAgv = true;
|
}
|
if (isReadAgv)
|
{
|
string res = "失败";
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
res = baseData.sendAgvTask(item, item.taskId, convPlace, item.toPlace, 1);
|
}
|
else
|
{//虚拟模式或强制完成
|
res = "";
|
}
|
if (res == "")
|
{
|
agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId;
|
#region 发送AGV任务成功后
|
TaskHelper.sendTaskForHasIssuedFor呼叫空托And缸体上线And缸盖上线(mod, item, convPlace, "");
|
#endregion
|
}
|
else
|
{
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "发送AGV任务失败:" + res;
|
mod.SaveChanges();
|
|
agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId;
|
}
|
|
}
|
else
|
{
|
agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId;
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "AGV繁忙";
|
mod.SaveChanges();
|
}
|
#endregion
|
}
|
else if (item.taskType == (int)taskType.缸盖下线直接去上线点)
|
{//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】
|
|
}
|
else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣
|
|| item.taskType == (int)taskType.空托人工出库)
|
{//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】
|
|
}
|
else if (item.taskType == (int)taskType.手动入库
|
|| item.taskType == (int)taskType.空托手动入库)
|
{//增加手动入库的分支 【EditBy shaocx,2022-03-16】
|
|
}
|
else if (item.taskType == (int)taskType.缸体上线去旁路工位)
|
{//增加 缸体上线去旁路工位 的分支判断 【EditBy shaocx,2022-04-23】
|
|
}
|
else
|
{
|
TaskHelper.sendTaskForHasIssuedFor发送堆垛机任务(mod, item, convPlace);
|
}
|
}
|
else
|
{
|
agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId;
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "输送线都被占用";
|
mod.SaveChanges();
|
}
|
}
|
}
|
else
|
{
|
agvSendStatus[0] = "无任务";
|
}
|
#endregion
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SendTask_ErrMsg = "没有要处理的状态为已下发的任务";
|
ishaveTask = 1;
|
}
|
#region 更改信息状态
|
if (ishaveTask == 1)
|
{
|
agvSendStatus[0] = "无任务发送";
|
agvSendStatus[1] = "无任务发送";
|
}
|
#endregion
|
}
|
}
|
catch (Exception ex)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForHasIssued", ex.ToString());
|
SystemWarningMsg.Thread_SendTask_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex);
|
}
|
}
|
}
|
|
|
/// <summary>
|
/// 处理分拣完成的任务
|
/// </summary>
|
private void sendTaskForPick()
|
{
|
while (true)
|
{
|
Thread.Sleep(2000);
|
try
|
{
|
using (dbmodel mod = new dbmodel())
|
{
|
var queryStatus_NoIssue = (int)taskStatus.分拣完成;
|
List<task> noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList();
|
if (noFinishTask.Count > 0)
|
{
|
var item = noFinishTask[0];
|
#region 发送堆垛机任务
|
if (!MyExtendHelper.IsAllowSimulatorHandle(item))
|
{
|
//if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机")
|
if (MyExtendHelper.IsAllowSendNewTaskToSrm())
|
{
|
#region 发送输送线放料完成信号任务
|
TransEnum _TransEnum = MyExtendHelper.GetTransByPlace(item.toPlace);
|
TransService.LoadMaterialConfirm(Convert.ToInt32(_TransEnum) - 1);
|
#endregion
|
|
baseData.sendSrmTask(item, item.taskId, item.toPlace, item.sourcePlace, 1);
|
}
|
else
|
{
|
//保存失败信息到任务表中 【EditBy shaocx,2022-03-16】
|
item.remark = "堆垛机不是自动,无故障,待机状态,不能下发堆垛机任务!!!!";
|
mod.SaveChanges();
|
SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "堆垛机不是自动,无故障,待机状态,不能下发堆垛机任务";
|
continue;
|
}
|
}
|
else
|
{//虚拟模式或强制完成
|
|
}
|
//保存任务记录
|
item.taskStatus = (int)taskStatus.分拣完成后下发设备任务;
|
item.remark = "分拣完成后下发设备任务";
|
//增加出库单 状态更改
|
#endregion
|
|
int saveRes = mod.SaveChanges();
|
|
for (int i = 0; i < 4; i++)
|
{
|
if (saveRes < 1)
|
{
|
saveRes = mod.SaveChanges();
|
}
|
else
|
{
|
break;
|
}
|
}
|
if (saveRes < 1)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId);
|
SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "数据库保存失败! 任务id:" + item.taskId;
|
}
|
}
|
else
|
{
|
SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "没有要处理的状态为未下发的任务";
|
}
|
|
}
|
}
|
catch (Exception ex)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForPick", ex.ToString());
|
SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex);
|
}
|
}
|
}
|
|
#endregion
|
|
#endregion
|
|
#region 处理新建的出库表单[缸体上线、缸盖上线]
|
|
/// <summary>
|
/// 处理新建的出库表单[缸体上线、缸盖上线]
|
/// </summary>
|
public void HandleOutStockList()
|
{
|
while (true)
|
{
|
Thread.Sleep(2000);
|
try
|
{
|
var errMsg = "";
|
var queryStatus1 = (int)taskStatus.新建;
|
var _taskType1 = (int)taskType.缸体上线;
|
var _taskType2 = (int)taskType.缸盖上线;
|
var _taskType3 = (int)taskType.缸体上线去旁路工位;//增加 缸体上线去旁路工位 的分支 【EditBy shaocx,2022-04-23】
|
List<task> taskList = null;
|
using (dbmodel mod = new dbmodel())
|
{
|
taskList = mod.task.Where(x => x.taskStatus == queryStatus1
|
&& (x.taskType == _taskType1 || x.taskType == _taskType2 || x.taskType == _taskType3)
|
).OrderBy(x => x.createTime).ToList();
|
if (taskList != null && taskList.Count > 0)
|
{
|
foreach (var item in taskList)
|
{
|
bool result = MyExtend.DoHandleOutStockList(mod, item, ref errMsg);
|
if (result == false)
|
{
|
SystemWarningMsg.Thread_HandleOutStockList_Msg = "返回错误:" + errMsg + ",任务ID:" + item.taskId;
|
}
|
}
|
}
|
else
|
{
|
SystemWarningMsg.Thread_HandleOutStockList_Msg = "没有要处理的新建的出库表单";
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.Thread_HandleOutStockList_Msg = "异常" + ex.ToString();
|
}
|
}
|
}
|
#endregion
|
|
/// <summary>堆垛机完成确认
|
///
|
/// </summary>
|
public void SrmfinishConfirm()
|
{
|
while (true)
|
{
|
// 库位类型,库口=0,空库位=1,缸体=2,缸盖=3,缸体空托盘=4,缸盖空托盘=5,空托盘=6
|
Thread.Sleep(2000);
|
string plc_taskID = "";//PLC任务号
|
try
|
{
|
var errMsg = "";
|
//增加查询条件 [EditBy shaocx,2022-03-02]
|
var queryStatus1 = (int)taskStatus.完成;
|
var queryStatus2 = (int)taskStatus.作废;
|
var queryStatus3 = (int)taskStatus.新建;
|
task finishTask = null;
|
using (dbmodel mod = new dbmodel())
|
{
|
if (!isvirtual)
|
{//正式环境
|
//首先读取那些被强制完成的任务
|
finishTask = mod.task.FirstOrDefault(x => (x.isForceComplete == 1 && x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2 && x.taskStatus != queryStatus3));
|
if (finishTask != null)
|
{
|
bool result = MyExtend.HandleSrmfinishConfirm(mod, finishTask, ref errMsg);
|
if (result == false)
|
{
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "返回错误:" + errMsg + ",任务号:" + finishTask.taskId;
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "正式环境下,处理任务成功,任务号:" + finishTask.taskId;
|
}
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "正式环境下,没有任务要处理";
|
}
|
finishTask = null;
|
if (srm.taskFinish == "完成")
|
{
|
plc_taskID = srm.TaskID.ToString();
|
finishTask = mod.task.FirstOrDefault(x => x.PlcTaskNo == plc_taskID && (x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2 && x.taskStatus != queryStatus3));
|
if (finishTask != null)
|
{
|
bool result = MyExtend.HandleSrmfinishConfirm(mod, finishTask, ref errMsg);
|
if (result == false)
|
{
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "返回错误:" + errMsg + ",任务号:" + finishTask.taskId;
|
}
|
else
|
{//保存数据成功
|
if (!MyExtendHelper.IsAllowSimulatorHandle(finishTask))
|
{
|
siemensTcpNet_srm.Write(srmdb.W_Task_Finish_ACK, Convert.ToInt16(1));//确认任务
|
}
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "处理任务成功,任务号:" + finishTask.taskId;
|
}
|
}
|
else
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "SrmfinishConfirm", "PLC任务ID:" + plc_taskID + "数据库找不到状态不是已完成或作废的此任务");
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "PLC任务ID:" + plc_taskID + "数据库找不到状态不是已完成或作废的此任务";
|
if (!MyExtendHelper.IsAllowSimulatorHandle(finishTask))
|
{
|
siemensTcpNet_srm.Write(srmdb.W_Task_Finish_ACK, Convert.ToInt16(1));//确认任务
|
}
|
}
|
}
|
else
|
{
|
if (!MyExtendHelper.IsAllowSimulatorHandle(finishTask))
|
{
|
siemensTcpNet_srm.Write(srmdb.W_Task_Finish_ACK, Convert.ToInt16(0));//没完成就0 堆垛机plc需要
|
}
|
}
|
}
|
else
|
{//虚拟模式
|
finishTask = mod.task.FirstOrDefault(x => (x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2 && x.taskStatus != queryStatus3));
|
if (finishTask != null)
|
{
|
bool result = MyExtend.HandleSrmfinishConfirm(mod, finishTask, ref errMsg);
|
if (result == false)
|
{
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "返回错误:" + errMsg + ",任务号:" + finishTask.taskId;
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "模拟环境下!!!,处理任务成功,任务号:" + finishTask.taskId;
|
}
|
}
|
else
|
{
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "模拟环境下!!!,没有任务要处理";
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "finishConfirm", "PLC任务ID:" + plc_taskID + ex.ToString());
|
SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "PLC任务ID:" + plc_taskID + ex.ToString();
|
}
|
}
|
}
|
|
|
/// <summary>
|
/// MES数据推送
|
/// </summary>
|
public void mesDataTranffic()
|
{
|
while (true)
|
{
|
//SystemWarningMsg.msg_mesDataTranffic = "";
|
try
|
{
|
Thread.Sleep(3000);
|
using (dbmodel mod = new dbmodel())
|
{
|
List<task> sendMesData = mod.task.Where(x => x.sendMesed == 1).ToList();
|
//增加任务状态的过滤 【EditBy shaocx,2022-02-06】
|
var queryStatus = (int)taskStatus.完成;
|
sendMesData = sendMesData.Where(x => x.taskStatus == queryStatus).ToList();
|
|
if (sendMesData.Count > 0)
|
{
|
foreach (var itemTask in sendMesData)
|
{
|
try
|
{
|
mesMsg res = null;
|
if (isvirtual)
|
{//模拟环境
|
res = new mesMsg();
|
res.ErrorCode = 0;
|
res.ErrorMsg = "模拟环境下,模拟发送";
|
}
|
else
|
{//正式环境
|
switch (itemTask.taskType)
|
{
|
case (int)taskType.缸盖上线:
|
res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity);
|
break;
|
case (int)taskType.缸盖下线:
|
res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-缸盖线", (decimal)itemTask.quantity, itemTask.materialCode);
|
break;
|
case (int)taskType.缸体上线:
|
case (int)taskType.缸体上线去旁路工位://增加 缸体上线去旁路工位 的分支 【EditBy shaocx,2022-04-23】
|
res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity);
|
break;
|
case (int)taskType.缸体下线:
|
res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-机体线", (decimal)itemTask.quantity, itemTask.materialCode);
|
break;
|
case (int)taskType.余料回库:
|
res = mesDataManipulation.OUTStockSend("1", itemTask.materialCode, (decimal)itemTask.quantity);
|
break;
|
//增加推送类型 【EditBy shaocx,2022-02-06】
|
case (int)taskType.缸盖下线直接去上线点:
|
//缸盖下线
|
res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-缸盖线", (decimal)itemTask.quantity, itemTask.materialCode);
|
//缸盖上线
|
res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity);
|
break;
|
case (int)taskType.缸体下线直接去上线点:
|
//缸体下线
|
res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-机体线", (decimal)itemTask.quantity, itemTask.materialCode);
|
//缸体上线
|
res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity);
|
break;
|
default:
|
break;
|
}
|
}
|
|
if (res != null)
|
{
|
if (res.ErrorCode < 3)
|
{
|
itemTask.sendMesed = res.ErrorCode == 0 ? 2 : 3; //1=未发送,2=发送成功,3=发送失败,o是空托盘不参与对接
|
itemTask.mesReply = res.ErrorMsg;
|
mod.SaveChanges();
|
}
|
}
|
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.msg_mesDataTranffic = "推送给MES数据异常:" + JsonConvert.SerializeObject(ex);
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "mesDataTranffic", SystemWarningMsg.msg_mesDataTranffic);
|
}
|
}
|
}
|
else
|
{
|
SystemWarningMsg.msg_mesDataTranffic = "没有数据要推送给MES!";
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.msg_mesDataTranffic = "数据要推送给MES出现异常:" + ex.Message;
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "mesDataTranffic数据要推送给MES出现异常:", SystemWarningMsg.msg_mesDataTranffic + "," + JsonConvert.SerializeObject(ex));
|
}
|
}
|
|
}
|
|
/// <summary>
|
/// MES数据推送 [Editby shaocx,2025-09-02]
|
/// </summary>
|
public void mesDataTranfficForRealMes()
|
{
|
while (true)
|
{
|
try
|
{
|
Thread.Sleep(5000);
|
using (dbmodel mod = new dbmodel())
|
{
|
List<Wms_outInStockRecord_V2_Mes> sendMesData = mod.Wms_outInStockRecord_V2_Mes.Where(x => x.isSendToMes == 0).ToList();
|
|
if (sendMesData.Count > 0)
|
{
|
foreach (var itemTask in sendMesData)
|
{
|
try
|
{
|
ApiResponse<object> ret = null;
|
|
//获取信息明细
|
var details = mod.Wms_outInStockRecord_Details_V2_Mes.Where(x => x.mainId == itemTask.ID).ToList();
|
List<InboundStockInfoToMes> pushData = new List<InboundStockInfoToMes>();
|
foreach (var de in details)
|
{
|
pushData.Add(new InboundStockInfoToMes()
|
{
|
containerCode = itemTask.containerCode,
|
createTime = itemTask.CreateTime?.ToString("yyyy-MM-dd HH:mm:ss"),
|
materialCode = de.productCode,
|
materialName = de.productName,
|
positionName = itemTask.sourcePlace,
|
productName = itemTask.materialName,
|
serialNumber = de.serialNumber,
|
supplier = itemTask.supplier,
|
version = itemTask.version,
|
});
|
}
|
|
if (isvirtual)
|
{//模拟环境
|
ret = new ApiResponse<object>();
|
ret.Success = true;
|
ret.Message = "系统模拟完成";
|
}
|
else
|
{
|
switch (itemTask.outInFlag)
|
{
|
case (int)OutInFlag.入库:
|
ret = PushMesHandler.Mes_InStockSend(pushData, itemTask.ID.ToString());
|
break;
|
case (int)OutInFlag.出库:
|
ret = PushMesHandler.Mes_OutStockSend(pushData, itemTask.ID.ToString());
|
break;
|
default:
|
break;
|
}
|
}
|
|
if (ret.Success)
|
{
|
itemTask.isSendToMes = 1;
|
}
|
else
|
{
|
itemTask.isSendToMes = 0;
|
}
|
itemTask.SendToMesTime = DateTime.Now;
|
itemTask.MesRet = ret.Message;
|
itemTask.SendToMesCount = (itemTask.SendToMesCount ?? 0) + 1;
|
mod.SaveChanges();
|
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.msg_mesDataTranfficForRealMes = "推送给MES数据异常:" + JsonConvert.SerializeObject(ex);
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "mesDataTranffic", SystemWarningMsg.msg_mesDataTranffic);
|
}
|
}
|
}
|
else
|
{
|
SystemWarningMsg.msg_mesDataTranfficForRealMes = "没有数据要推送给MES!";
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.msg_mesDataTranfficForRealMes = "数据要推送给MES出现异常:" + ex.Message;
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "mesDataTranffic数据要推送给MES出现异常:", SystemWarningMsg.msg_mesDataTranfficForRealMes + "," + JsonConvert.SerializeObject(ex));
|
}
|
}
|
|
}
|
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
|
{
|
Environment.Exit(0);//退出本进程所有线程
|
}
|
|
#region 组盘下发后,生成下线入库任务
|
|
#region 原先的旧方法
|
|
///// <summary>生成下线入库任务
|
/////
|
///// </summary>
|
//private void inStockCodeToTask()
|
//{
|
|
|
// while (true)
|
// {
|
// Thread.Sleep(3000);
|
|
// using (dbmodel mod = new dbmodel())
|
// {
|
// //EF事务
|
// //using (DbContextTransaction transaction = mod.Database.BeginTransaction())
|
// //{
|
// try
|
// {
|
// inStockOrder inTask = mod.inStockOrder.FirstOrDefault(x => x.status == 2);
|
// if (inTask != null)
|
// {
|
// int tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? 1 : 2;
|
// //寻找空库位 2是缸体,3是缸盖
|
// #region 生成任务
|
// inTask.status = 3;
|
// int saveRes = mod.SaveChanges();
|
// if (saveRes == 1)
|
// {
|
// string toPlace = findStorage(tasktype + 1);
|
// if (toPlace == "")
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库找不到库位 入库表单号:" + inTask.orderCode);
|
// continue;
|
// }
|
// saveRes = 0;
|
// task newInTask = new task();
|
// newInTask.area = tasktype;//1是缸体侧 2是缸盖
|
// newInTask.createListCode = inTask.orderCode;
|
// newInTask.createTime = DateTime.Now;
|
// newInTask.priority = 1;
|
// newInTask.sourcePlace = inTask.siteCode;
|
// newInTask.taskName = tasktype == 1 ? "缸体入库" : "缸盖入库";
|
// newInTask.taskStatus = 2;
|
// newInTask.taskType = tasktype;
|
// newInTask.toPlace = toPlace.Split('/')[0];
|
// newInTask.materialCode = inTask.productCode;
|
// newInTask.materialName = inTask.productName;
|
// newInTask.quantity = inTask.quantity;
|
// newInTask.sendMesed = 1;//1=未发送,2=发送成功,3=发送失败
|
// newInTask.mesReply = "未发送";
|
// newInTask.supplier = inTask.supplier;//供应商 【EditBy shaocx,2022-01-15】
|
// newInTask.containerCode = inTask.containerCode;//托盘号 【EditBy shaocx,2022-01-15】
|
// mod.task.Add(newInTask);
|
// saveRes = mod.SaveChanges();
|
// if (saveRes != 1)
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库保存任务失败入库表单号:" + inTask.orderCode);
|
// }
|
// saveRes = 0;
|
// }
|
// else
|
// {
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库状态修改失败表单号:" + inTask.orderCode);
|
// }
|
// #endregion
|
// }
|
|
// //transaction.Commit();
|
// }
|
// catch (Exception ex)
|
// {
|
// //保存失败 抛异常 回滚
|
// // transaction.Rollback();
|
// WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", ex.ToString());
|
// }
|
// //}
|
// }
|
|
// }
|
//}
|
|
#endregion
|
|
#region 新方法
|
|
/// <summary>组盘下发后,生成下线入库任务
|
///
|
/// </summary>
|
private void inStockCodeToTask()
|
{
|
while (true)
|
{
|
Thread.Sleep(3000);
|
SystemWarningMsg.Thread_inStockCodeToTask_ErrMsg = "";
|
using (dbmodel mod = new dbmodel())
|
{
|
var queryStatus = (int)InStockOrderStatus.待下发;
|
inStockOrder inTask = mod.inStockOrder.FirstOrDefault(x => x.status == queryStatus);
|
//inStockOrder inTask = mod.inStockOrder.FirstOrDefault(x => x.status == 2);
|
if (inTask != null)
|
{
|
#region 事务处理
|
|
using (var trans = mod.Database.BeginTransaction())
|
{
|
try
|
{
|
|
taskType tasktype = MyExtendHelper.GetTaskTypeForInStockOrder(inTask);
|
//寻找空库位 2是缸体,3是缸盖
|
#region 生成任务
|
//inTask.status = 3;
|
inTask.status = (int)InStockOrderStatus.已下发;
|
int saveRes = mod.SaveChanges();
|
if (saveRes == 1)
|
{
|
//增加 toStieCode的判断 【EditBy shaocx,2022-02-06】
|
string taskName = "";
|
string toPlace = FindToPlaceForInStockOrder(inTask, (int)tasktype, ref taskName);
|
if (string.IsNullOrEmpty(toPlace))
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库找不到库位 入库表单号:" + inTask.orderCode);
|
throw new Exception("下线入库找不到立库空库位 入库表单号:" + inTask.orderCode);
|
}
|
saveRes = 0;
|
task newInTask = new task();
|
newInTask.area = MyExtendHelper.GetTaskAreaForInStockOrder(inTask);//1是缸体侧 2是缸盖
|
newInTask.createListCode = inTask.orderCode;
|
newInTask.createTime = DateTime.Now;
|
newInTask.priority = 1;
|
newInTask.sourcePlace = inTask.siteCode;
|
newInTask.taskType = (int)tasktype;
|
newInTask.taskTypeName = tasktype.ToString();
|
newInTask.taskName = taskName;
|
//newInTask.taskStatus = 2;
|
newInTask.taskStatus = (int)taskStatus.未下发;
|
newInTask.remark = "未下发";
|
|
newInTask.toPlace = toPlace;
|
newInTask.materialCode = inTask.productCode;
|
newInTask.materialName = inTask.productName;
|
newInTask.quantity = inTask.quantity;
|
newInTask.sendMesed = 1;//1=未发送,2=发送成功,3=发送失败
|
newInTask.mesReply = "未发送";
|
newInTask.supplier = inTask.supplier;//供应商 【EditBy shaocx,2022-01-15】
|
newInTask.containerCode = inTask.containerCode;//托盘号 【EditBy shaocx,2022-01-15】
|
newInTask.version = inTask.version;//机型
|
newInTask.creator = SysGloble.WCSNAME;
|
//记录PLC任务号和AGV任务号 【EditBy shaocx,2022-03-28】
|
newInTask.PlcTaskNo = TaskNoHelper.CreatePlcTaskIdForSrmTaskPublic(1);
|
newInTask.AgvTaskNo = TaskNoHelper.CreateTaskIdForAgvTask(newInTask.PlcTaskNo);
|
mod.task.Add(newInTask);
|
saveRes = mod.SaveChanges();
|
if (saveRes != 1)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库保存任务失败入库表单号:" + inTask.orderCode);
|
throw new Exception("下线入库保存任务失败入库表单号:" + inTask.orderCode);
|
}
|
trans.Commit();
|
saveRes = 0;
|
}
|
else
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库状态修改失败表单号:" + inTask.orderCode);
|
throw new Exception("修改入库单状态为已下发失败" + inTask.orderCode);
|
}
|
#endregion
|
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.Thread_inStockCodeToTask_ErrMsg = ex.Message;
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", ex.ToString());
|
trans.Rollback();
|
}
|
}
|
|
#endregion
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 处理入库单,寻找最终的目标库位 【EditBy shaocx,2022-02-06】
|
/// </summary>
|
/// <param name="inTask"></param>
|
/// <param name="tasktype"></param>
|
/// <returns></returns>
|
private string FindToPlaceForInStockOrder(inStockOrder inTask, int tasktype, ref string taskName)
|
{
|
taskType _taskType = (taskType)Enum.Parse(typeof(taskType), tasktype.ToString());
|
|
//增加 toStieCode的判断 【EditBy shaocx,2022-02-06】
|
string toPlace = string.Empty;
|
if (string.IsNullOrEmpty(inTask.toStieCode))
|
{
|
//toPlace = findStorage(tasktype + 1);
|
positionType _positionType = default(positionType);
|
// inTask.orderType = isGT == true ? 1 : 2;//1=缸体,2=缸盖
|
_positionType = inTask.orderType == 1 ? positionType.缸体 : positionType.缸盖;
|
toPlace = findStorage((int)_positionType);
|
//taskName = tasktype == 1 ? "缸体入库" : "缸盖入库";
|
taskName = _taskType.ToString();
|
}
|
else
|
{//表示不入立体库,直接去天永机器人那里
|
toPlace = inTask.toStieCode;
|
|
taskName = _taskType.ToString();
|
}
|
if (toPlace == "")
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库找不到库位 入库表单号:" + inTask.orderCode);
|
return toPlace;
|
}
|
//格式化数据
|
if (string.IsNullOrEmpty(inTask.toStieCode))
|
{
|
toPlace = toPlace.Split('/')[0];
|
}
|
|
return toPlace;
|
}
|
|
#endregion
|
|
#endregion
|
|
#region 寻找库位
|
|
/// <summary>
|
/// 缸盖寻找空输送线站点
|
/// </summary>
|
/// <param name="convCode"></param>
|
/// <param name="_task"></param>
|
/// <param name="_TaskAreaEnum"></param>
|
/// <returns></returns>
|
private string convIsLock_GG(int convCode, task _task)
|
{
|
if (single_convIsLock_GG.WaitOne())//增加线程锁防止并发
|
{
|
try
|
{
|
return convIsLock(convCode, _task, TaskAreaEnum.缸盖侧);
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
finally
|
{
|
single_convIsLock_GG.ReleaseMutex();
|
}//一轮结束
|
}
|
return "";
|
}
|
|
/// <summary>
|
/// 缸体寻找空输送线站点
|
/// </summary>
|
/// <param name="convCode"></param>
|
/// <param name="_task"></param>
|
/// <param name="_TaskAreaEnum"></param>
|
/// <returns></returns>
|
private string convIsLock_GT(int convCode, task _task)
|
{
|
if (single_convIsLock_GT.WaitOne())//增加线程锁防止并发
|
{
|
try
|
{
|
return convIsLock(convCode, _task, TaskAreaEnum.缸体侧);
|
}
|
catch (Exception ex)
|
{
|
throw ex;
|
}
|
finally
|
{
|
single_convIsLock_GT.ReleaseMutex();
|
}//一轮结束
|
}
|
return "";
|
}
|
/// <summary>判断输送线是否都锁定和是否有货
|
///
|
/// </summary>
|
/// <param name="convCode">1=1,2号输送线/缸体侧,3=3,4号输送线/缸盖侧</param>
|
/// <returns></returns>
|
private string convIsLock(int convCode, task _task, TaskAreaEnum _TaskAreaEnum)
|
{
|
//2021-11月24改任务发送成功后再锁定 这里不锁定
|
string convPlace = "";
|
if (MyExtendHelper.IsAllowSimulatorHandle(_task))
|
{//虚拟模式或者是强制完成
|
|
switch (_TaskAreaEnum)
|
{
|
case TaskAreaEnum.缸体侧:
|
convPlace = "2-39-1";//写死
|
break;
|
case TaskAreaEnum.缸盖侧:
|
convPlace = "1-0-1";//写死
|
break;
|
}
|
return convPlace;
|
}
|
try
|
{
|
long num1 = convCode == 3 ? (long)1 : (long)230;
|
long num2 = convCode == 3 ? (long)231 : (long)460;
|
using (dbmodel mod = new dbmodel())
|
{
|
//3,4号输送线 库位ID----1号=460(2-39-1) 2号230(1-39-1) 3号1(1-0-1) 4号231(2-0-1)
|
List<position> pos = mod.position.Where(x => x.positionId == num1 || x.positionId == num2).ToList();
|
|
if (convCode == 3)
|
{
|
#region 缸盖测
|
if (pos[0].isLock == false && conv3.position == "0")
|
{
|
convPlace = pos[0].positionName;
|
|
}
|
else
|
{
|
if (pos[1].isLock == false && conv4.position == "0")
|
{
|
convPlace = pos[1].positionName;
|
|
}
|
|
}
|
#endregion
|
}
|
else
|
{
|
#region 缸体侧
|
if (pos[0].isLock == false && conv2.position == "0")
|
{
|
convPlace = pos[0].positionName;
|
|
}
|
else
|
{
|
if (pos[1].isLock == false && conv1.position == "0")
|
{
|
convPlace = pos[1].positionName;
|
|
}
|
}
|
#endregion
|
|
}
|
|
//增加校验,如果该点有未结束的任务占用,则抛异常 【Editby shaocx,2024-10-09】
|
if (!string.IsNullOrEmpty(convPlace))
|
{
|
var isStationHasDoingTaskResult = MyExtendHelper.IsStationHasDoingTaskForMiddlePlace(mod, convPlace);
|
if (isStationHasDoingTaskResult.result == false)
|
{
|
// throw new Exception(isStationHasDoingTaskResult.resMsg);
|
return string.Empty;
|
}
|
//*/
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
convPlace = "";
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "convIsLock", ex.ToString());
|
}
|
|
return convPlace;
|
}
|
|
#endregion
|
|
|
|
#region 辅助
|
///// <summary>
|
///// 生存库位
|
///// </summary>
|
//public void posiont()
|
//{
|
// using (dbmodel mod = new dbmodel())
|
// {
|
// for (byte i = 1; i < 3; i++)
|
// {
|
// for (byte j = 0; j < 40; j++)
|
// {
|
// for (byte k = 1; k < 7; k++)
|
// {
|
// if (j == 0 || j == 39)
|
// {
|
// if (k > 1)
|
// {
|
// continue;
|
// }
|
// }
|
// position addp = new position();
|
|
// addp.positionName = i + "-" + j + "-" + k;
|
// addp.row = i;
|
// addp.col = j;
|
// addp.layer = k;
|
// addp.isLock = false;
|
// addp.isfree = false;
|
// addp.positionType = 1;
|
// addp.enable = true;
|
// mod.position.Add(addp);
|
|
// }
|
// }
|
// }
|
// int aa = mod.SaveChanges();
|
|
// MessageBox.Show("写入" + aa + "条");
|
// }
|
//}
|
#endregion
|
|
#region 定时删除数据
|
|
/// <summary>
|
/// 定时删除数据
|
/// </summary>
|
public void DeleteData()
|
{
|
while (true)
|
{
|
try
|
{
|
LogTextHelper.BatchDeleteLog();
|
LogTextHelper.BatchDeleteLog(@"H:\\api\\YUN\\Log");
|
ClearDataHandler.Delete_System_TianYongLog(7);
|
ClearDataHandler.Delete_StockClearLog(30);
|
ClearDataHandler.Delete_taskRecord(30);
|
ClearDataHandler.Delete_System_TianYongEmptyBackLog(7);
|
|
ClearDataHandler.Delete_serialNumberHistory(30);
|
|
SystemWarningMsg.Thread_lbl_ClearDataMsg = "成功";
|
}
|
catch (Exception ex)
|
{
|
SystemWarningMsg.Thread_lbl_ClearDataMsg = ex.Message;
|
}
|
finally
|
{
|
Thread.Sleep(24 * 60 * 60 * 1000);//每天一次
|
}
|
}
|
}
|
|
#endregion
|
|
|
#region 定时刷新数据
|
|
/// <summary>
|
/// 定时刷新数据
|
/// </summary>
|
public void RefershData()
|
{
|
while (true)
|
{
|
try
|
{
|
var showNowTime = "(" + DateTimeHelper.ConvertToStringForOnlyShowTime(DateTime.Now) + ")";
|
|
this.lbl_sendTask_errMsg.Text = showNowTime + SystemWarningMsg.Thread_SendTask_ErrMsg;
|
|
this.lbl_inStockCodeToTask_errMsg.Text = showNowTime + SystemWarningMsg.Thread_inStockCodeToTask_ErrMsg;
|
|
this.lbl_NoIssueTaskMsg_GT.Text = showNowTime + SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg;
|
this.lbl_NoIssueTaskMsg_GG.Text = showNowTime + SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg;
|
this.lbl_Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg.Text = showNowTime + SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg;
|
|
this.lbl_msg_mesDataTranffic.Text = showNowTime + SystemWarningMsg.msg_mesDataTranffic;
|
this.lbl_msg_mesDataTranffic_V2.Text = showNowTime + SystemWarningMsg.msg_mesDataTranfficForRealMes;
|
|
this.lbl_sendTaskForPick_ErrMsg.Text = showNowTime + SystemWarningMsg.Thread_sendTaskForPick_ErrMsg;
|
this.lbl_ClearDataMsg.Text = showNowTime + SystemWarningMsg.Thread_lbl_ClearDataMsg;
|
|
this.lbl_Thread_lbl_shouEntity_Srm.Text = showNowTime + SystemWarningMsg.Thread_lbl_shouEntity_Srm;
|
|
|
this.lbl_agvSendStatus1.Text = showNowTime + agvSendStatus[0];
|
this.lbl_agvSendStatu2.Text = showNowTime + agvSendStatus[1];
|
|
|
this.lbl_SrmfinishConfirm_Msg.Text = showNowTime + SystemWarningMsg.Thread_SrmfinishConfirm_Msg;
|
|
this.lbl_Thread_HandleOutStockList_Msg.Text = showNowTime + SystemWarningMsg.Thread_HandleOutStockList_Msg;
|
|
}
|
catch (Exception ex)
|
{
|
|
}
|
finally
|
{
|
Thread.Sleep(1000);
|
}
|
}
|
}
|
|
#endregion
|
|
#region 计算产量,并写入PLC
|
|
/// <summary>
|
/// 计算产量,并写入PLC
|
/// </summary>
|
public void CalcQty()
|
{
|
while (true)
|
{
|
try
|
{
|
MyExtend.CalcQty();
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "CalcQty", "计算产量,并写入PLC成功");
|
}
|
catch (Exception ex)
|
{
|
WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "CalcQty", "计算产量,并写入PLC失败:" + ex.Message + ex.ToString());
|
}
|
finally
|
{
|
Thread.Sleep(6 * 60 * 60 * 1000);//6小时一次
|
}
|
}
|
}
|
|
#endregion
|
}
|
|
}
|