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;
namespace yunneiWCS
{
public partial class Form1 : Form
{
/// 虚拟模式
///
///
// 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();
///
/// wcf服务变量
///
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 convs = new List { conv1, conv2, conv3, conv4 };
public static srmEntity srm = new srmEntity();
//agvS状态
public static List agvs = new List();
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 = "";
/////
///// 缸盖上线站点号
/////
//public static List GGstations = new List { "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(RefershData).Start();
new Thread(HandleOutStockList).Start();
new Thread(CalcQty).Start();
new Thread(DeleteData).Start();
}
/// 设备初始化
/// 设备初始化
///
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);
}
}
}
/// 堆垛机显示服务和设备状态状态
///
///
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;
}
}
}
/// 输送线显示服务和设备状态状态
///
///
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)
{
}
}
}
/// 输送线显示服务和设备状态状态
///
///
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)
{
}
}
}
/// 设备心跳丢失自动初始化
///
///
private void checkPlcHandShake()
{
while (true)
{
Thread.Sleep(60000);
if ((srm.handShake == null || conv1.handShake == null) && isvirtual == false)
{
deviceOpcInit();
}
}
}
/// 写给堆垛机心跳
///
///
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);
}
}
/// 开启线程
///
///
private void StartThread(Thread thread)
{
if (thread != null)
{
thread.IsBackground = true;
thread.Start();
}
}
#region 找空库位 【重要!!!!!】
/// 找空库位
///
///
/// 库位类型,库口=0,空库位=1,缸体=2,缸盖=3
///
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 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 outPosition = new List();
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 原先的方法
///// 发送任务给设备
/////
/////
//private void sendTask()
//{
// while (true)
// {
// Thread.Sleep(2000);
// try
// {
// int ishaveTask = 0;
// using (dbmodel mod = new dbmodel())
// {
// //area=1是缸体侧,area=2是缸盖侧
// //先处理任务中的任务(在输送线上的)
// List FinishTasking = mod.task.Where(x => x.taskStatus == 3).ToList();
// if (FinishTasking.Count > 0)
// {
// List 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 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 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 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 noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList();
// if (noFinishTask.Count > 0)
// {
// #region 未下发的任务
// List 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 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 现在的方法
///
/// 处理未下发的任务(缸体)
///
private void sendTaskForNoIssuedForGT()
{
while (true)
{
Thread.Sleep(2000);
try
{
using (dbmodel mod = new dbmodel())
{
//area=1是缸体侧,area=2是缸盖侧
//处理未下发的任务
var queryStatus_NoIssue = (int)taskStatus.未下发;
List noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList();
//List noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList();
if (noFinishTask.Count > 0)
{
#region 未下发的任务
List 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);
}
}
}
///
/// 处理未下发的任务(缸盖)
///
private void sendTaskForNoIssuedForGG()
{
while (true)
{
Thread.Sleep(2000);
try
{
using (dbmodel mod = new dbmodel())
{
//area=1是缸体侧,area=2是缸盖侧
//处理未下发的任务
var queryStatus_NoIssue = (int)taskStatus.未下发;
List noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList();
//List noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList();
if (noFinishTask.Count > 0)
{
#region 未下发的任务
//处理缸盖未下发任务
List 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);
}
}
}
///
/// 寻找目标点(输送线站点)
///
///
///
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;
}
/// 处理已下发的任务
/// 处理已下发的任务
///
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 FinishTasking = mod.task.Where(x => x.taskStatus == queryStatus).ToList();
//List FinishTasking = mod.task.Where(x => x.taskStatus == 3).ToList();
if (FinishTasking.Count > 0)
{
//List bobyTask = FinishTasking.Where(x => x.area == 1).ToList();
var queryTaskAreaEnum = (int)TaskAreaEnum.缸体侧;
List 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 lidTask = FinishTasking.Where(x => x.area == 2).ToList();
queryTaskAreaEnum = (int)TaskAreaEnum.缸盖侧;
List 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);
}
}
}
///
/// 处理分拣完成的任务
///
private void sendTaskForPick()
{
while (true)
{
Thread.Sleep(2000);
try
{
using (dbmodel mod = new dbmodel())
{
var queryStatus_NoIssue = (int)taskStatus.分拣完成;
List 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 处理新建的出库表单[缸体上线、缸盖上线]
///
/// 处理新建的出库表单[缸体上线、缸盖上线]
///
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 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
/// 堆垛机完成确认
///
///
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();
}
}
}
///
/// MES数据推送
///
public void mesDataTranffic()
{
while (true)
{
SystemWarningMsg.msg_mesDataTranffic = "";
try
{
Thread.Sleep(3000);
using (dbmodel mod = new dbmodel())
{
List 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));
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Environment.Exit(0);//退出本进程所有线程
}
#region 组盘下发后,生成下线入库任务
#region 原先的旧方法
///// 生成下线入库任务
/////
/////
//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 新方法
/// 组盘下发后,生成下线入库任务
///
///
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
}
}
}
}
///
/// 处理入库单,寻找最终的目标库位 【EditBy shaocx,2022-02-06】
///
///
///
///
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 寻找库位
///
/// 缸盖寻找空输送线站点
///
///
///
///
///
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 "";
}
///
/// 缸体寻找空输送线站点
///
///
///
///
///
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 "";
}
/// 判断输送线是否都锁定和是否有货
///
///
/// 1=1,2号输送线/缸体侧,3=3,4号输送线/缸盖侧
///
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 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 辅助
/////
///// 生存库位
/////
//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 定时删除数据
///
/// 定时删除数据
///
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 定时刷新数据
///
/// 定时刷新数据
///
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_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
///
/// 计算产量,并写入PLC
///
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
}
}