分支自 SuZhouGuanHong/TaiYuanTaiZhong

dengjunjie
2024-07-03 a05b17c400067475a256071c2e92a9f1b3abe343
桁架模式2
已修改4个文件
已添加1个文件
788 ■■■■■ 文件已修改
代码管理/PCS/WCS_Server/WIDESEA_WCS/Common/Gantry.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Common/Gantry2.cs 717 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/GantryJob.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Services/WCS/Partial/dt_patternService.cs 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/WCSClient/Siemens/SiemensPLCClient.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Common/Gantry.cs
@@ -27,7 +27,7 @@
namespace WIDESEA_WCS
{
    public class Gantry
    public class Gantry : Gantry2
    {
        #region æŸ¥è¯¢è½¦è½®æ•°æ®
        /// <summary>
@@ -627,6 +627,7 @@
                                if (!Stations.Where(x => x.enable && x.stationCode != NGStation && x.location_state != LocationStateEnum.Stroge.ToString()).Any())
                                {
                                    var station = Stations.Where(x => x.enable && x.stationCode != NGStation && x.location_state == LocationStateEnum.Stroge.ToString()).OrderBy(x => x.lastUpdateTime).FirstOrDefault();
                                    if (station != null)
                                    agvtask(stationinfoRepository, station, Work, name == "3单元下料区" ? "TaskType_OutsourceInbound" : "TaskType_Inbound");
                                }
                                #endregion
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Common/Gantry2.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,717 @@
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 è§†è§‰æ£€æµ‹è¿½æº¯è½¦è½®ä¿¡æ¯
        /// <summary>
        /// è§†è§‰æ£€æµ‹è¿½æº¯è½¦è½®ä¿¡æ¯
        /// </summary>
        /// <param name="client"></param>
        public void QuerySJSN(PLCClient client)
        {
            VOLContext Context = new VOLContext();
            Idt_info_traceRepository traceRepository = new dt_info_traceRepository(Context);
            List<string> names = new List<string>() { "视觉检测1", "视觉检测2", "视觉检测3", "视觉检测4" };
            foreach (string name in names)
            {
                try
                {
                    var Read_Load = client.ReadByOrder<bool>("Read_Load", name);//视觉检测开始信号
                    if (Read_Load)
                    {
                        var PartID_Load = client.ReadByOrder<string>("PartID_Load", name);//车轮SN号
                        var State_Load = client.ReadByOrder<Int16>("State_Load ", name);//车轮状态
                        var LoadTime = client.ReadByOrder<string>("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<bool>("Read_Unload", name);//视觉检测完成信号
                    if (Read_Unload)
                    {
                        var PartID_Unload = client.ReadByOrder<string>("PartID_Unload", name);//车轮SN号
                        var State_Unload = client.ReadByOrder<Int16>("State_Unload  ", name);//车轮状态
                        var UnloadTime = client.ReadByOrder<string>("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查询车轮订单和车轮参数
        /// <summary>
        /// æ¨¡å¼2查询车轮订单和车轮参数
        /// </summary>
        /// <param name="client"></param>
        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<string> names = new List<string>() { "1单元申请查询订单和车轮参数", "2单元申请查询订单和车轮参数", "检测上料申请查询订单和车轮参数" };
            foreach (var name in names)
            {
                try
                {
                    var oi_on = client.ReadByOrder<Byte>("oi_on", name); //申请
                    if (oi_on == 1)
                    {
                        var wp_id = client.ReadByOrder<string>("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取放料完成
        /// <summary>
        /// æ¨¡å¼2取放料完成
        /// </summary>
        /// <param name="client"></param>
        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<string> names = new List<string>() { "1单元取料放料", "2单元取料放料" };
            foreach (string name in names)
            {
                try
                {
                    var areaCode = Pipeline.area_code(name.Contains("1单元") ? "1单元下料区" : "2单元下料区");
                    var R_Finished = client.ReadByOrder<Int16>("R_Finished", name); //1:取料完成;2:放料完成
                    var W_Update_Finished = client.ReadByOrder<Int16>("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<string>("R_Wheel_id", name);//车轮SN号
                        var R_In_Clamp_Area = client.ReadByOrder<Int16>("R_In_Clamp_Area", name);//下料位号
                        var R_IndexNr = client.ReadByOrder<Int16>("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<string>("R_Wheel_id", name);//车轮SN号
                        var R_In_Clamp_Area = client.ReadByOrder<Int16>("R_In_Clamp_Area", name);//下料位号
                        var R_IndexNr = client.ReadByOrder<Int16>("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<Int16>("R_Request", name);//1:取料;2:放料
                    #region å–æ–™
                    if (R_Request == 1)
                    {
                        var R_Wheel_id = client.ReadByOrder<string>("R_Wheel_id", name);//车轮SN号
                        var R_In_Clamp_Area = client.ReadByOrder<Int16>("R_In_Clamp_Area", name);//下料位号
                        var R_IndexNr = client.ReadByOrder<Int16>("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<string>("R_Wheel_id", name);//车轮SN号
                        var R_In_Clamp_Area = client.ReadByOrder<Int16>("R_In_Clamp_Area", name);//下料位号
                        var R_IndexNr = client.ReadByOrder<Int16>("R_IndexNr", name); //托盘上的第几个车轮
                        var R_PartStatus = client.ReadByOrder<Int16>("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车轮下料
        /// <summary>
        /// æ¨¡å¼2NG车轮下料(合并到模式2取放料完成)
        /// </summary>
        /// <param name="client"></param>
        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<string> names = new List<string>() { "X01001003", "X02001003" };
            foreach (var name in names)
            {
                try
                {
                    var Area = name == "X01001003" ? "5" : "6";
                    #region ä¸‹æ–™å®Œæˆ
                    var finished = client.ReadByOrder<Boolean>("o_load_finished ", name);//放料完成
                    var updatefinished = client.ReadByOrder<Boolean>("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<Int16>("o_wheel_type ", name); //车轮类型
                        var Wheel_SN = client.ReadByOrder<string>("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<Int16>("i_areaNr", name);
                        if (AreaNr == 0)
                        {
                            client.WriteByOrder("i_storage_update", true, name);//货位状态更新
                            continue;
                        }
                        #region åˆ¤æ–­åŒºåŸŸå·æ˜¯å¦ä¸€è‡´
                        var area = client.ReadByOrder<Int16>("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<Int16>("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<Boolean>("o_request_load ", name);//下料申请
                    if (Request_Load)
                    {
                        #region è¯»å–桁架信息
                        var Wheel_Type = client.ReadByOrder<Int16>("o_wheel_type", name);//车轮类型
                        var Wheel_id = client.ReadByOrder<string>("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<Int16>("o_partstatus ", name);//1:ok;2:nok
                        var load_zone = client.ReadByOrder<Boolean>("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<string> list = new List<string>();
                                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;
        }
        /// <summary>
        /// æ›´æ”¹å·¥å•状态
        /// </summary>
        /// <param name="SN"></param>
        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
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/GantryJob.cs
@@ -44,9 +44,18 @@
            }
            client.WriteByOrder("W_Palpitate", client.ReadByOrder<bool>("R_Palpitate", "心跳"));
            Gantry gantry = new Gantry();
            #region æ¨¡å¼1
            gantry.QueryOrder(client);
            gantry.QueryWheeldata(client);
            gantry.Layofflevel(client);
            gantry.Layofflevel(client);//模式1/2三单元都使用这个方法下料
            #endregion
            #region æ¨¡å¼2
            gantry.QueryWheelOrderData(client);
            gantry.Finished(client);
            #endregion
            //gantry.QuerySJSN(client);//视觉采集
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Services/WCS/Partial/dt_patternService.cs
@@ -23,6 +23,8 @@
using WIDESEA_WCS.Repositories;
using WIDESEA_Comm;
using WIDESEA_WCS.WCSClient;
using System.Xml.Linq;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
namespace WIDESEA_WCS.Services
{
@@ -53,6 +55,8 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                var model = JsonConvert.DeserializeObject<dt_pattern>(v);
                if (model.pattern_state == 1) throw new Exception("当前就是模式1");
                var Gantry_client = PLCClient.Clients.FirstOrDefault(t => t.PLCName == "桁架");
                if (Gantry_client == null) throw new Exception("桁架调度服务未开启!");
                if (!Gantry_client.IsConnected) throw new Exception("与桁架连接超时!");
@@ -61,17 +65,29 @@
                var stations = stationinfoRepository.Find(x => x.stationCode == "X01001001" || x.stationCode == "X01001002" || x.stationCode == "X02001001" || x.stationCode == "X02001002").ToList();
                if (stations.Where(x => x.tray_status == TrayStateEnum.StrogeTray.ToString()).Any())
                    throw new Exception("设置为模式1失败!下料位存在车轮!");
                #region å†™å…¥ä¿¡å·å‘Šè¯‰æ¡æž¶åˆ‡æ¢æ¨¡å¼
                var ok = Gantry_client.ReadByOrder<bool>("o_enable_change_mode", model.pattern_name);
                #endregion
                var model = JsonConvert.DeserializeObject<dt_pattern>(v);
                if (ok)
                {
                    Gantry_client.WriteByOrder("i_mode", (Int16)1, model.pattern_name);
                model.pattern_state = 1;
                var cont = _repository.Update(model, true);
                if (cont > 0)
                    content.OK(model.pattern_name + "设置为模式1成功!");
                else
                    content.Error(model.pattern_name + "设置为模式1失败!");
                        throw new Exception(model.pattern_name + "设置为模式2失败!");
                    foreach (var stat in stations)
                    {
                        stat.enable = true;
                    }
                    stationinfoRepository.UpdateRange(stations, x => new { x.enable }, true);
                }
                else
                    content.Error(model.pattern_name + "设置为模式1失败!桁架未允许设置为模式1");
            }
            catch (Exception ex)
            {
@@ -89,6 +105,8 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                var model = JsonConvert.DeserializeObject<dt_pattern>(v);
                if (model.pattern_state == 0) throw new Exception("当前就是模式2");
                var Gantry_client = PLCClient.Clients.FirstOrDefault(t => t.PLCName == "桁架");
                if (Gantry_client == null) throw new Exception("桁架调度服务未开启!");
                if (!Gantry_client.IsConnected) throw new Exception("与桁架连接超时!");
@@ -97,13 +115,27 @@
                var stations = stationinfoRepository.Find(x => x.stationCode == "X01001001" || x.stationCode == "X01001002" || x.stationCode == "X02001001" || x.stationCode == "X02001002").ToList();
                if (stations.Where(x => x.tray_status == TrayStateEnum.StrogeTray.ToString()).Any())
                    throw new Exception("设置为模式2失败!下料位存在车轮!");
                var model = JsonConvert.DeserializeObject<dt_pattern>(v);
                #region å†™å…¥ä¿¡å·å‘Šè¯‰æ¡æž¶åˆ‡æ¢æ¨¡å¼
                var ok = Gantry_client.ReadByOrder<bool>("o_enable_change_mode", model.pattern_name);
                #endregion
                if (ok)
                {
                    Gantry_client.WriteByOrder("i_mode", (Int16)2, model.pattern_name);
                model.pattern_state = 0;
                var cont = _repository.Update(model, true);
                if (cont > 0)
                    content.OK(model.pattern_name + "设置为模式2成功!");
                else
                    content.Error(model.pattern_name + "设置为模式2失败!");
                        throw new Exception(model.pattern_name + "设置为模式2失败!");
                    foreach (var stat in stations)
                    {
                        stat.enable = false;
                    }
                    stationinfoRepository.UpdateRange(stations, x => new { x.enable }, true);
                }
                else
                    content.Error(model.pattern_name + "设置为模式2失败!桁架未允许设置为模式2");
            }
            catch (Exception ex)
            {
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/WCSClient/Siemens/SiemensPLCClient.cs
@@ -155,8 +155,17 @@
        /// <returns></returns>
        public override DataType ReadByOrder<DataType>(string orderName, string Method = null)
        {
            var item = itemGroups.Where(t => t.name.Equals(orderName)).FirstOrDefault();
            if (Method != null) { item = itemGroups.Where(t => t.name.Equals(orderName) && t.Methods.Equals(Method)).FirstOrDefault(); }
            DBItemGroup item = null;
            //var item = itemGroups.Where(t => t.name.Equals(orderName)).FirstOrDefault();
            //if (Method != null) { item = itemGroups.Where(t => t.name.Equals(orderName) && t.Methods.Equals(Method)).FirstOrDefault(); }
            var items = itemGroups.Where(t => t.name.Contains(orderName)).ToList();
            if (items.Count > 0)
            {
                if (Method != null)
                    item = items.Where(t => t.Methods.Contains(Method)).FirstOrDefault();
                else
                    item = items.Where(t => t.name.Contains(orderName)).FirstOrDefault();
            }
            if (item == null)
            {
                throw new Exception($"PLC{PLCName},未定义指令{orderName}");