using HslCommunication;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using WIDESEA_Comm;
using WIDESEA_Comm.LogInfo;
using WIDESEA_Core.BaseProvider;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Entity.DomainModels;
using WIDESEA_WCS.IRepositories;
using WIDESEA_WCS.JobsPart.Common;
using WIDESEA_WCS.Repositories;
using WIDESEA_WCS.WCSClient;
using WIDESEA_WMS.IRepositories;
using WIDESEA_WMS.Repositories;
using static System.Collections.Specialized.BitVector32;
namespace WIDESEA_WCS
{
public class Gantry2
{
#region 视觉检测追溯车轮信息
///
/// 视觉检测追溯车轮信息
///
///
public void QuerySJSN(PLCClient client)
{
VOLContext Context = new VOLContext();
Idt_info_traceRepository traceRepository = new dt_info_traceRepository(Context);
List names = new List() { "视觉检测1", "视觉检测2", "视觉检测3", "视觉检测4" };
foreach (string name in names)
{
try
{
var Read_Load = client.ReadByOrder("Read_Load", name);//视觉检测开始信号
if (Read_Load)
{
var PartID_Load = client.ReadByOrder("PartID_Load", name);//车轮SN号
var State_Load = client.ReadByOrder("State_Load ", name);//车轮状态
var LoadTime = client.ReadByOrder("LoadTime ", name);//视觉检测开始时间
var time = DateTime.ParseExact(LoadTime, "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
var info_trace = traceRepository.Find(x => x.trace_SN == PartID_Load).FirstOrDefault();
if (info_trace != null)
{
info_trace.trace_tcvm_number = name;
info_trace.trace_tcvm_start_time = time;
traceRepository.Update(info_trace, x => new { x.trace_tcvm_number, x.trace_tcvm_start_time }, true);
}
client.WriteByOrder("ReadFinished_Load", true, name);
}
else
client.WriteByOrder("ReadFinished_Load", false, name);
var Read_Unload = client.ReadByOrder("Read_Unload", name);//视觉检测完成信号
if (Read_Unload)
{
var PartID_Unload = client.ReadByOrder("PartID_Unload", name);//车轮SN号
var State_Unload = client.ReadByOrder("State_Unload ", name);//车轮状态
var UnloadTime = client.ReadByOrder("UnloadTime ", name);//视觉检测开始时间
var info_trace = traceRepository.Find(x => x.trace_SN == PartID_Unload).FirstOrDefault();
var time = DateTime.ParseExact(UnloadTime, "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
if (info_trace != null)
{
info_trace.trace_tcvm_finish_time = time;
info_trace.trace_tcvm_statu = State_Unload;
traceRepository.Update(info_trace, x => new { x.trace_tcvm_finish_time, x.trace_tcvm_statu }, true);
}
client.WriteByOrder("ReadFinished_Unload", true, name);
}
else
client.WriteByOrder("ReadFinished_Unload", false, name);
}
catch (Exception ex)
{
WriteLog.Write_Log("报错日志", name, "错误信息!", $"错误信息:{ex.Message}");
}
}
}
#endregion
#region 模式2查询车轮订单和车轮参数
///
/// 模式2查询车轮订单和车轮参数
///
///
public void QueryWheelOrderData(PLCClient client)
{
VOLContext Context = new VOLContext();
Idt_geometry_dataRepository dataRepository = new dt_geometry_dataRepository(Context);
IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(Context);
List names = new List() { "1单元申请查询订单和车轮参数", "2单元申请查询订单和车轮参数", "检测上料申请查询订单和车轮参数" };
foreach (var name in names)
{
try
{
var oi_on = client.ReadByOrder("oi_on", name); //申请
if (oi_on == 1)
{
var wp_id = client.ReadByOrder("o_wp_id", name);
#region SN号不能为空
if (string.IsNullOrEmpty(wp_id))
{
client.WriteByOrder("i_status", (byte)0, name);
WriteLog.Write_Log(name, wp_id, "错误信息!", $"读取桁架信息:\n车轮SN:{wp_id}\n\n写入桁架信息:\ni_status:2\noi_on:0\n\n车轮SN号为空");
continue;
}
#endregion
#region 工单不能为空
var Work = workinfoRepository.Find(x => x.SN == wp_id && (name.Contains("检测上料") ? x.processCode == "28" : x.processCode == "17")).OrderByDescending(x => x.CreateTime).FirstOrDefault();
if (Work == null)
{
client.WriteByOrder("i_status", (byte)2, name);
WriteLog.Write_Log(name, wp_id, "错误信息!", $"读取桁架信息:\n车轮SN:{wp_id}\n\n写入桁架信息:\ni_status:2\noi_on:0\n\n未查询到工单详情");
continue;
}
#endregion
#region 车轮参数不能为空
var geometry = Pipeline.QueryMateriel(Work.drawingNo);
if (geometry == null)
{
client.WriteByOrder("i_status", (byte)3, name);
WriteLog.Write_Log(name, wp_id, "错误信息!", $"读取桁架信息:\n车轮SN:{wp_id}\n\n写入桁架信息:\ni_status:3\noi_on:0\n\n图号:{Work.drawingNo}未查询到车轮信息参数");
continue;
}
#endregion
#region 写入参数
client.WriteByOrder("i_stackNoRange", geometry.stackNoRange, name);//打包数量
client.WriteByOrder("i_drawing_id", Work.drawingNo, name);//图号
client.WriteByOrder("i_job_id", Work.jobID, name);//工单编号
client.WriteByOrder("i_heat_id", Work.heatID, name);//炉代号
client.WriteByOrder("i_batch_id", Work.heatBatchID, name);//热处理批次
client.WriteByOrder("i_parameter_a", (float)geometry.a, name);
client.WriteByOrder("i_parameter_b", (float)geometry.b, name);
client.WriteByOrder("i_parameter_c", (float)geometry.c, name);
client.WriteByOrder("i_parameter_d", (float)geometry.d, name);
client.WriteByOrder("i_parameter_e", (float)geometry.e, name);
client.WriteByOrder("i_parameter_f", (float)geometry.f, name);
client.WriteByOrder("i_parameter_g", (float)geometry.g, name);
client.WriteByOrder("i_parameter_h", (float)geometry.h, name);
client.WriteByOrder("i_status", (byte)1, name);
client.WriteByOrder("i_wp_id", wp_id, name);
#endregion
}
}
catch (Exception ex)
{
WriteLog.Write_Log("报错日志", name, "错误信息!", $"错误信息:{ex.Message}");
}
}
}
#endregion
#region 模式2取放料完成
///
/// 模式2取放料完成
///
///
public void Finished(PLCClient client)
{
VOLContext Context = new VOLContext();
Idt_stationinfoRepository stationinfoRepository = new dt_stationinfoRepository(Context);
IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(Context);
Idt_mes_detailRepository mes_DetailRepository = new dt_mes_detailRepository(Context);
List names = new List() { "1单元取料放料", "2单元取料放料" };
foreach (string name in names)
{
try
{
var areaCode = Pipeline.area_code(name.Contains("1单元") ? "1单元下料区" : "2单元下料区");
var R_Finished = client.ReadByOrder("R_Finished", name); //1:取料完成;2:放料完成
var W_Update_Finished = client.ReadByOrder("W_Update_Finished", name);//1:取料完成;2:放料完成
#region 复位完成信号
if (R_Finished != 1 && W_Update_Finished == 1 || R_Finished != 2 && W_Update_Finished == 2)
{
client.WriteByOrder("W_Update_Finished", (Int16)0, name);
}
#endregion
#region 取料完成
if (R_Finished == 1 && W_Update_Finished != 1)
{
var R_Wheel_id = client.ReadByOrder("R_Wheel_id", name);//车轮SN号
var R_In_Clamp_Area = client.ReadByOrder("R_In_Clamp_Area", name);//下料位号
var R_IndexNr = client.ReadByOrder("R_IndexNr", name); //托盘上的第几个车轮
var station = stationinfoRepository.Find(x => x.area == areaCode && x.stationCode.Substring(x.stationCode.Length - 1, 1) == R_In_Clamp_Area.ToString()).FirstOrDefault();
if (station != null)
{
if (!station.bindSN.Contains(R_Wheel_id))
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"取料完成失败!下料位号:{station.stationCode}\nW_IsError:{5}\n车轮SN号:{R_Wheel_id}\n取第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:当前下料位无此车轮!");
}
var bindSNS = station.bindSN.Split(",");
Updatemes(R_Wheel_id, name);
station.bindSN = OperStr(bindSNS, R_Wheel_id);
var billets = station.billetID.Split(",");
station.billetID = OperStr(billets);
station.quantity = station.quantity - 1;
if (station.quantity <= 0)
{
station.stationType = string.Empty;
station.Number = string.Empty;
station.heatNumber = string.Empty;
station.tray_status = TrayStateEnum.EmptyTray.ToString();
}
var count = stationinfoRepository.Update(station, true);
if (count < 1) throw new Exception($"取料完成信息更新失败!下料位编号:{station.stationCode}");
client.WriteByOrder("W_Update_Finished", (Int16)1, name);//1:取料更新完成;2:放料更新完成
client.WriteByOrder("W_In_Clamp_Area", R_In_Clamp_Area, name);//下料位号
client.WriteByOrder("W_IndexNr", R_IndexNr, name);//托盘上的第几个车轮
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
}
WriteLog.Write_Log("模式2" + name + "取料完成", station.stationCode, $"车轮SN号:{R_Wheel_id}", $"下料位号:{R_In_Clamp_Area}");
}
#endregion
#region 放料完成
else if (R_Finished == 2 && W_Update_Finished != 2)
{
var R_Wheel_id = client.ReadByOrder("R_Wheel_id", name);//车轮SN号
var R_In_Clamp_Area = client.ReadByOrder("R_In_Clamp_Area", name);//下料位号
var R_IndexNr = client.ReadByOrder("R_IndexNr", name); //托盘上的第几个车轮
var station = stationinfoRepository.Find(x => x.area == areaCode && x.stationCode.Substring(x.stationCode.Length - 1, 1) == R_In_Clamp_Area.ToString()).FirstOrDefault();
if (station != null)
{
if (!string.IsNullOrEmpty(station.bindSN))
{
if (station.bindSN.Contains(R_Wheel_id))
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"放料完成失败!下料位号:{station.stationCode}\nW_IsError:{5}\n车轮SN号:{R_Wheel_id}\n放第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:已存在车轮SN号!");
}
}
var Mes_Work = workinfoRepository.Find(x => x.SN == R_Wheel_id && x.processCode == "17").OrderByDescending(x => x.CreateTime).FirstOrDefault();
#region 货位状态更新
station.bindSN = string.IsNullOrEmpty(station.bindSN) ? R_Wheel_id : station.bindSN + "," + R_Wheel_id;
station.billetID = string.IsNullOrEmpty(station.billetID) ? Mes_Work.billetID.ToString() : station.billetID + "," + Mes_Work.billetID;
station.quantity++;
if (station.quantity == 1)
{
station.stationType = Mes_Work.drawingNo;
station.Number = Mes_Work.workOrder;
station.heatNumber = Mes_Work.heatID;
station.tray_status = TrayStateEnum.StrogeTray.ToString();
}
var count = stationinfoRepository.Update(station, true);
if (count < 1)
throw new Exception($"放料完成信息更新失败!下料位编号:{station.stationCode}");
#endregion
#region 修改工单状态
var Detail = mes_DetailRepository.FindFirst(x => x.jobID == Mes_Work.jobID && x.SN == Mes_Work.SN);
Detail.Status = "下线";
Detail.FinishTime = DateTime.Now;
count = mes_DetailRepository.Update(Detail, x => new { x.Status, x.FinishTime }, true);
if (count < 1)
throw new Exception($"工单子表信息更新失败!车轮SN号:{Detail.SN}");
#endregion
client.WriteByOrder("W_Update_Finished", (Int16)2, name);//1:取料更新完成;2:放料更新完成
client.WriteByOrder("W_In_Clamp_Area", R_In_Clamp_Area, name);//下料位号
client.WriteByOrder("W_IndexNr", R_IndexNr, name);//托盘上的第几个车轮
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
}
WriteLog.Write_Log("模式2" + name + "放料完成", station.stationCode, $"车轮SN号:{R_Wheel_id}", $"下料位号:{R_In_Clamp_Area}");
}
#endregion
var R_Request = client.ReadByOrder("R_Request", name);//1:取料;2:放料
#region 取料
if (R_Request == 1)
{
var R_Wheel_id = client.ReadByOrder("R_Wheel_id", name);//车轮SN号
var R_In_Clamp_Area = client.ReadByOrder("R_In_Clamp_Area", name);//下料位号
var R_IndexNr = client.ReadByOrder("R_IndexNr", name); //托盘上的第几个车轮
var station = stationinfoRepository.Find(x => x.area == areaCode && x.stationCode.Substring(x.stationCode.Length - 1, 1) == R_In_Clamp_Area.ToString()).FirstOrDefault();
if (station != null)
{
var Work = workinfoRepository.Find(x => x.SN == R_Wheel_id && x.processCode == "28").OrderByDescending(x => x.CreateTime).FirstOrDefault();
if (Work == null)
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请取料失败!下料位号:{station.stationCode}\nW_IsError:{5}\n车轮SN号:{R_Wheel_id}\n取第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:未查询到检测工单信息!");
}
if (!station.bindSN.Contains(R_Wheel_id))
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请取料失败!下料位号:{station.stationCode}\nW_IsError:{5}\n车轮SN号:{R_Wheel_id}\n取第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:当前下料位无此车轮!");
}
if (station.location_state != LocationStateEnum.Stroge.ToString())
{
client.WriteByOrder("W_IsError", (Int16)4, name);//取料不允许
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请取料失败!下料位号:{station.stationCode}\nW_IsError:{4}\n车轮SN号:{R_Wheel_id}\n取第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:下料位货位状态不为有货!");
}
if (station.quantity != R_IndexNr)
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请取料失败!下料位号:{station.stationCode}\nW_IsError:{5}\n车轮SN号:{R_Wheel_id}\n取第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:机械手抓取车轮与下料位数量不匹配!");
}
client.WriteByOrder("W_In_Clamp_Area", (Int16)R_In_Clamp_Area, name);
client.WriteByOrder("W_IndexNr", (Int16)R_IndexNr, name);
client.WriteByOrder("W_IsError", (Int16)3, name);//取料允许
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
}
else
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请取料失败!下料位号:{R_In_Clamp_Area};W_IsError:{5},未匹配到下料位号!");
}
WriteLog.Write_Log("模式2" + name + "申请取料", station.stationCode, $"W_IsError:{3},车轮SN号:{R_Wheel_id}", $"下料位号:{R_In_Clamp_Area}\n取第几个车轮:{R_IndexNr};\n下料位车轮数:{station.quantity}");
}
#endregion
#region 放料
else if (R_Request == 2)
{
var R_Wheel_id = client.ReadByOrder("R_Wheel_id", name);//车轮SN号
var R_In_Clamp_Area = client.ReadByOrder("R_In_Clamp_Area", name);//下料位号
var R_IndexNr = client.ReadByOrder("R_IndexNr", name); //托盘上的第几个车轮
var R_PartStatus = client.ReadByOrder("R_PartStatus", name);//车轮状态
var station = stationinfoRepository.Find(x => x.area == areaCode && x.stationCode.Substring(x.stationCode.Length - 1, 1) == R_In_Clamp_Area.ToString()).FirstOrDefault();
if (station != null)
{
if (!string.IsNullOrEmpty(station.bindSN))
{
if (station.bindSN.Contains(R_Wheel_id))
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请放料失败!下料位号:{station.stationCode}\nW_IsError:{5}\n车轮SN号:{R_Wheel_id}\n放第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:已存在车轮SN号!");
}
}
if (station.location_state != LocationStateEnum.Stroge.ToString())
{
client.WriteByOrder("W_IsError", (Int16)2, name);//放料不允许
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请放料失败!下料位号:{station.stationCode}\nW_IsError:{2}\n车轮SN号:{R_Wheel_id}\n放第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:下料位货位状态不为有货!");
}
if (station.quantity + 1 != R_IndexNr)
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请放料失败!下料位号:{station.stationCode}\nW_IsError:{5}\n车轮SN号:{R_Wheel_id}\n放第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n错误信息:机械手放料车轮与下料位数量不匹配!");
}
client.WriteByOrder("W_In_Clamp_Area", (Int16)R_In_Clamp_Area, name);
client.WriteByOrder("W_IndexNr", (Int16)R_IndexNr, name);
client.WriteByOrder("W_IsError", (Int16)1, name);//放料允许
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
}
else
{
client.WriteByOrder("W_IsError", (Int16)5, name);//报警
client.WriteByOrder("W_Wheel_id", R_Wheel_id, name);//车轮SN号
throw new Exception($"申请放料失败!下料位号:{R_In_Clamp_Area};未匹配到下料位号!");
}
WriteLog.Write_Log("模式2" + name + "申请放料", station.stationCode, $"W_IsError:{1},车轮SN号:{R_Wheel_id}", $"下料位号:{R_In_Clamp_Area}\n放第几个车轮:{R_IndexNr}\n下料位车轮数:{station.quantity}\n车轮状态:{R_PartStatus}");
}
#endregion
}
catch (Exception ex)
{
WriteLog.Write_Log("报错日志", name, "错误信息!", $"错误信息:{ex.Message}");
}
}
}
#endregion
#region 模式2NG车轮下料
///
/// 模式2NG车轮下料(合并到模式2取放料完成)
///
///
public void NGLayofflevel(PLCClient client)
{
VOLContext Context = new VOLContext();
Idt_stationinfoRepository stationinfoRepository = new dt_stationinfoRepository(Context);
Idt_mes_detailRepository mes_DetailRepository = new dt_mes_detailRepository(Context);
Idt_plcinfodetailRepository plcRepository = new dt_plcinfodetailRepository(Context);
Idt_plcinfoheadRepository repository = new dt_plcinfoheadRepository(Context);
IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(Context);
var Pipeline_client = PLCClient.Clients.FirstOrDefault(t => t.PLCName == "链条机");
if (Pipeline_client == null) throw new Exception("链条机调度服务未开启!");
if (!Pipeline_client.IsConnected) throw new Exception("与链条机连接超时!");
var Pipelineplc = repository.FindFirst(x => x.plcinfo_name == Pipeline_client.PLCName);
List names = new List() { "X01001003", "X02001003" };
foreach (var name in names)
{
try
{
var Area = name == "X01001003" ? "5" : "6";
#region 下料完成
var finished = client.ReadByOrder("o_load_finished ", name);//放料完成
var updatefinished = client.ReadByOrder("i_storage_update ", name);//货位状态更新
#region 货位状态更新复位
if (!finished && updatefinished)
{
client.WriteByOrder("i_storage_update", false, name);//货位状态更新
#region 日志记录
WriteLog.Write_Log("模式2" + name + "放料完成", name + "货位状态更新信号复位", "成功!",
$"读取桁架信息:\n放料完成信号:{finished}\n\n写入桁架信息:\n货位状态更新信号:{false}");
#endregion
}
#endregion
if (finished && !updatefinished)
{
client.WriteByOrder("i_enabl_load", false, name);//是否允许
#region 读取桁架信息
var WheelType = client.ReadByOrder("o_wheel_type ", name); //车轮类型
var Wheel_SN = client.ReadByOrder("o_wheel_id", name);//车轮SN号
if (string.IsNullOrEmpty(Wheel_SN))
{
WriteLog.Write_Log("模式2" + name + "放料完成出错", "车轮SN号为空", "读取桁架信息:", $"车轮SN号:{Wheel_SN}为空");
continue;
}
var Mes_Work = workinfoRepository.Find(x => x.SN == Wheel_SN && x.processCode == "17").OrderByDescending(x => x.CreateTime).FirstOrDefault();
if (Mes_Work == null)
{
WriteLog.Write_Log("模式2" + name + "放料完成出错", Wheel_SN, "读取桁架信息:", $"车轮SN号:{Wheel_SN}未查询到工单信息");
continue;
}
#endregion
var AreaNr = client.ReadByOrder("i_areaNr", name);
if (AreaNr == 0)
{
client.WriteByOrder("i_storage_update", true, name);//货位状态更新
continue;
}
#region 判断区域号是否一致
var area = client.ReadByOrder("o_place_prog", name);//放料完成的区域号
if (AreaNr != area)
{
Pipeline_client.WriteByOrder("W_AlarmSignal", (Int16)2, name);//报警
WriteLog.Write_Log("模式2" + name + "放料完成出错", Wheel_SN, "判断区域号是否一致", $"PCS区域号:{AreaNr};\n桁架区域号:{area}\n错误信息:PCS区域号与桁架区域号不一致!");
continue;
}
#endregion
var station = stationinfoRepository.Find(x => x.stationCode == name && x.stationCode.Substring(x.stationCode.Length - 1, 1) == AreaNr.ToString() && x.enable).FirstOrDefault();
if (station != null)
{
#region 判断车轮数量是否一致
var quantity = client.ReadByOrder("o_pos_prog", name);//桁架记录的车轮数量
if (quantity != station.quantity + 1)
{
Pipeline_client.WriteByOrder("W_AlarmSignal", (Int16)2, name);//报警
WriteLog.Write_Log("模式2" + name + "放料完成出错", Wheel_SN, "判断车轮数量是否一致", $"区域号:{AreaNr};\n桁架车轮数:{quantity}\nPCS车轮数:{station.quantity + 1}\n错误信息:PCS区域号与桁架区域号不一致!");
continue;
}
#endregion
if (!string.IsNullOrEmpty(station.bindSN))
{
if (station.bindSN.Contains(Wheel_SN))
throw new Exception($"{station.stationCode}已存在车轮SN号:{Wheel_SN}");
}
#region 清空给桁架的下料信息
client.WriteByOrder("i_indexNr", (Int16)0, name);//托盘上的第几个车轮
client.WriteByOrder("i_storage_type", (Int16)0, name);//托盘类型1-横放;2-竖放(暂时只有横放托盘)
client.WriteByOrder("i_areaNr", (Int16)0, name);//区域货位号
client.WriteByOrder("i_storage_update", true, name);//货位状态更新
WriteLog.Write_Log("模式2" + name + "放料完成", Wheel_SN, "成功!",
$"读取桁架信息:\n放料完成信号:{finished}\n车轮SN:{Wheel_SN}\n轮型ID:{WheelType}\n下料位号:{AreaNr}\n\n" +
$"处理写入桁架信息:\n区域货位号:{0}\n托盘上的第几个车轮:{0}\n托盘类型:{0}\n\n" +
$"写入桁架信息:\n货位状态更新信号:{true}\n是否允许下料:{false}");
#endregion
#region 货位状态更新
station.bindSN = string.IsNullOrEmpty(station.bindSN) ? Wheel_SN : station.bindSN + "," + Wheel_SN;
station.billetID = string.IsNullOrEmpty(station.billetID) ? Mes_Work.billetID.ToString() : station.billetID + "," + Mes_Work.billetID;
station.quantity++;
if (station.quantity == 1)
{
station.stationType = Mes_Work.drawingNo;
station.Number = Mes_Work.workOrder;
station.heatNumber = Mes_Work.heatID;
station.tray_status = "StrogeTray";
}
station.remark = "";
var count = stationinfoRepository.Update(station, true);
if (count < 1)
throw new Exception($"下料位信息更新失败!下料位编号:{station.stationCode}");
#endregion
#region 修改工单状态
var Detail = mes_DetailRepository.FindFirst(x => x.jobID == Mes_Work.jobID && x.SN == Mes_Work.SN);
Detail.Status = "下线";
Detail.FinishTime = DateTime.Now;
count = mes_DetailRepository.Update(Detail, x => new { x.Status, x.FinishTime }, true);
if (count < 1)
throw new Exception($"工单子表信息更新失败!车轮SN号:{Detail.SN}");
#endregion
}
}
#endregion
#region 下料位数量传给桁架
var Stations = stationinfoRepository.Find(x => x.area == Area).ToList();
foreach (var station in Stations)
{
client.WriteByOrder(station.stationCode, (Int16)station.quantity, name);
}
#endregion
var Station = Stations.Where(x => x.stationCode == name).FirstOrDefault();
//if (Station.enable)
// client.WriteByOrder(Station.stationCode, Station.location_state != LocationStateEnum.Stroge.ToString(), name);
#region 申请下料
var Request_Load = client.ReadByOrder("o_request_load ", name);//下料申请
if (Request_Load)
{
#region 读取桁架信息
var Wheel_Type = client.ReadByOrder("o_wheel_type", name);//车轮类型
var Wheel_id = client.ReadByOrder("o_wheel_id", name);//车轮SN号
if (string.IsNullOrEmpty(Wheel_id))
{
WriteLog.Write_Log("模式2" + name + "申请放料异常", "车轮SN号为空", "", $"读取桁架信息:\n车轮SN号:{Wheel_id}为空");
continue;
}
var Work = workinfoRepository.Find(x => x.SN == Wheel_id && x.processCode == "17").OrderByDescending(x => x.CreateTime).FirstOrDefault();
if (Work == null)
{
client.WriteByOrder("i_enabl_load", false, name);//信号为false桁架停止进入
WriteLog.Write_Log("模式2" + name + "申请放料异常", Wheel_id, "查询机加工工单", $"读取桁架信息:\n车轮SN号:{Wheel_id}未查询到工单信息\n写入桁架信息:\n是否允许下料:{false}");
continue;
}
#endregion
var wheel = Pipeline.QueryMateriel(Work.drawingNo);
if (wheel == null)
{
client.WriteByOrder("i_enabl_load", false, name);//信号为false桁架停止进入
WriteLog.Write_Log("模式2" + name + "申请放料异常", Wheel_id, $"查询{Work.drawingNo}车轮参数", $"读取桁架信息:\n车轮SN号:{Wheel_id}未查询到工单信息\n写入桁架信息:\n是否允许下料:{false}");
continue;
}
#region 换图号,下料口其他图号托盘全部入库
if (Station.enable && Station.location_state == LocationStateEnum.Stroge.ToString() && Station.quantity > 0 && Station.stationType != Work.drawingNo)
{
agvtask(stationinfoRepository, Station, Work, "TaskType_OutsourceInbound");
continue;
}
#endregion
#region 托盘类型不一致需更换托盘
if (Station.enable && Station.tray_type != "LargeTray" && wheel.e > 1100)
{
client.WriteByOrder("i_enabl_load", false, name);//信号为false桁架停止进入
Station.location_state = LocationStateEnum.Trayswitching.ToString();
stationinfoRepository.Update(Station, x => new { x.location_state }, true);
continue;
}
#endregion
var PartStatus = client.ReadByOrder("o_partstatus ", name);//1:ok;2:nok
var load_zone = client.ReadByOrder("o_load_zone ", name);// 进入下料区
if (load_zone) continue;
WriteLog.Write_Log("模式2" + name + "申请放料", Wheel_id, "申请放料", $"读取桁架信息:\n车轮SN:{Wheel_id}\n轮型ID:{Wheel_Type}\n车轮状态:{PartStatus}\n是否进入下料区:{load_zone}");
if ((Int16)PartStatus == 2)
{
if (!(Station.enable && Station.location_state == LocationStateEnum.Stroge.ToString() && Station.quantity < wheel.stackNoRange && Station.stationType == Work.drawingNo))
{
if (Station.enable && Station.location_state == LocationStateEnum.Stroge.ToString() && Station.quantity > 0)
{
agvtask(stationinfoRepository, Station, Work, "TaskType_OutsourceInbound");
continue;
}
if (!(Station.enable && Station.location_state == LocationStateEnum.Stroge.ToString() && Station.quantity == 0)) continue;
}
var Pipelinedetails = plcRepository.Find(x => x.plcdetail_iotype == Pipelineplc.plcinfo_iotyep && x.plcdetail_number == Station.stationCode).ToList();
var PalletSignal = (Int16)DBExtension.Read(Pipelinedetails.Where(x => x.plcdetail_name == "R_PalletSignal").First(), Pipeline_client);//读取托盘信号:1:有,2无
var MaterialSignal = (Int16)DBExtension.Read(Pipelinedetails.Where(x => x.plcdetail_name == "R_MaterialSignal").First(), Pipeline_client);//读取货物信号:1:有,2无
if (PalletSignal == 1)
{
List list = new List();
if (Station.bindSN != null)
{
var SNS = Station.bindSN.Split(",");
foreach (var SN in SNS)
{
if (!string.IsNullOrEmpty(SN))
list.Add(SN);
}
}
//缓存架上车轮数量与SN号数量不一致
if (list.Count != Station.quantity)
{
Station.location_state = LocationStateEnum.Abnormal.ToString();
Station.remark = "车轮数量与SN号数量不一致";
stationinfoRepository.Update(Station, x => new { x.location_state, x.remark }, true);
continue;
}
var area = Convert.ToInt16(Station.stationCode.Substring(Station.stationCode.Length - 1, 1));
client.WriteByOrder("i_areaNr", (Int16)area, name);//区域货位号
client.WriteByOrder("i_indexNr", (Int16)(Station.quantity + 1), name);//托盘上的第几个车轮
client.WriteByOrder("i_storage_type", (Int16)1, name);//托盘类型1-横放;2-竖放(暂时只有横放托盘)
client.WriteByOrder("i_enabl_load", true, name);//是否允许
Station.remark = "桁架下料";
stationinfoRepository.Update(Station, x => new { x.remark }, true);
#region 日志记录
WriteLog.Write_Log("模式2" + name + "申请放料", Wheel_id, "允许放料",
$"读取桁架信息:\n车轮SN:{Wheel_id}\n轮型ID:{Wheel_Type}\n车轮状态:合格" +
$"\n读取托盘光电信号:{PalletSignal}" +
$"\n\n写入桁架信息:\n下料位号:{area}\n第几个车轮:{(Station.quantity + 1)}\n托盘类型:1\n是否允许下料:true");
#endregion
continue;
}
}
}
#endregion
}
catch (Exception ex)
{
WriteLog.Write_Log("报错日志", "模式2NG车轮下料", name, $"错误信息:{ex.Message}");
}
}
}
#endregion
public static string OperStr(string[] strArrty, string SN)
{
string[] newstr = strArrty.Where(x => x != SN).ToArray();
string Newsn = string.Join(",", newstr);
return Newsn;
}
public string OperStr(string[] strArrty)
{
string[] newstr = strArrty.RemoveLast(1);
string Newsn = string.Join(",", newstr);
return Newsn;
}
///
/// 更改工单状态
///
///
public static void Updatemes(string SN, string name)
{
VOLContext Context = new VOLContext();
Idt_mes_detailRepository mes_DetailRepository = new dt_mes_detailRepository(Context);
Idt_mes_headRepository mes_HeadRepository = new dt_mes_headRepository(Context);
IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(Context);
var Mes_Work = workinfoRepository.Find(x => x.SN == SN && (name.Contains("2单元取料放料") ? x.processCode == "28" : x.processCode == "17")).FirstOrDefault();
if (Mes_Work != null)
{
var mes_Detail = mes_DetailRepository.Find(x => x.SN == SN && x.jobID == Mes_Work.jobID).FirstOrDefault();
if (mes_Detail != null)
{
mes_Detail.Status = "上线";
mes_Detail.FinishTime = DateTime.Now;
mes_DetailRepository.Update(mes_Detail, x => new { x.Status, x.FinishTime }, true);
var mes_Head = mes_HeadRepository.Find(x => x.jobID == mes_Detail.jobID).FirstOrDefault();
if (mes_Head != null)
{
mes_Head.finishNum++;
if (mes_Head.finishNum == mes_Head.quantity) mes_Head.FinishTime = DateTime.Now;
mes_HeadRepository.Update(mes_Head, x => new { x.finishNum, x.FinishTime }, true);
}
}
}
}
#region 下料位添加队列任务
public void agvtask(Idt_stationinfoRepository stationinfoRepository, dt_stationinfo stationinfo, VV_Mes_Workinfo Work, string tasktype)
{
VOLContext Context = new VOLContext();
Idt_agvtaskRepository agvtaskRepository = new dt_agvtaskRepository(Context);
IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(Context);
Work = workinfoRepository.Find(x => x.workOrder == stationinfo.Number && x.processCode == "17").FirstOrDefault();
var task = agvtaskRepository.Find(x => x.agv_fromaddress == stationinfo.stationCode).FirstOrDefault();
if (task != null) return;
if (!string.IsNullOrEmpty(Work.area))
tasktype = "TaskType_OutsourceInbound";
AGVTask.AddQueueTask(stationinfoRepository, agvtaskRepository, stationinfo, tasktype, Work);
}
#endregion
}
}