分支自 SuZhouGuanHong/TaiYuanTaiZhong

dengjunjie
2024-02-23 538f1f0db8d02103d040b96a489b1a5803750a11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Comm;
using WIDESEA_Core.EFDbContext;
using WIDESEA_WCS.IRepositories;
using WIDESEA_WCS.Repositories;
using WIDESEA_WCS.WCSClient;
using static System.Collections.Specialized.BitVector32;
 
namespace WIDESEA_WCS
{
    public class Gantry
    {
        static VOLContext Context = new VOLContext();
        Idt_plcinfoheadRepository repository = new dt_plcinfoheadRepository(Context);
        Idt_plcinfodetailRepository plcRepository = new dt_plcinfodetailRepository(Context);
        Idt_geometry_dataRepository dataRepository = new dt_geometry_dataRepository(Context);
        Idt_stationinfoRepository stationinfoRepository = new dt_stationinfoRepository(Context);
 
        #region 查询车轮数据
        public void QueryWheeldata(PLCClient client)
        {
            try
            {
                var plc = repository.FindFirst(x => x.plcinfo_name == client.PLCName);
                List<string> names = new List<string>() { "1单元辊道下料查询车轮", "2单元辊道下料查询车轮", "3单元辊道下料查询车轮", "辊道上料查询车轮" };
                foreach (string name in names)
                {
                    var details = plcRepository.Find(x => x.plcdetail_iotype == plc.plcinfo_iotyep && x.plcdetail_number == name).ToList();
                    var on = DBExtension.Read(details.Where(x => x.plcdetail_name == "R_oi_on").First(), client);
                    if ((byte)on == 1)
                    {
                        var wp_type = DBExtension.Read(details.Where(x => x.plcdetail_name == "R_o_wp_type").First(), client);
                        var geometry = dataRepository.FindFirst(x => x.TypeId == (Int32)wp_type);
                        if (geometry == null)
                        {
                            //DBExtension.Write(details.Where(x => x.plcdetail_name == "W_i_status").First(), client, (Int16)2);
                            //1-找到数据,2-未找到工件类型数据
                            client.WriteByOrder("W_i_status", (byte)2, name);
                            //屏蔽工艺(屏蔽视觉检测/屏蔽涂油);
                            //client.WriteByOrder("W_i_skip_op", "1", name);
                            client.WriteByOrder("R_oi_on", (byte)0, name);
                        }
                        else
                        {
                            //1-找到数据,2-未找到工件类型数据
                            client.WriteByOrder("W_i_status", (byte)1, name);
                            client.WriteByOrder("W_i_parameter_a", (float)geometry.a, name);
                            client.WriteByOrder("W_i_parameter_b", (float)geometry.b, name);
                            client.WriteByOrder("W_i_parameter_c", (float)geometry.c, name);
                            client.WriteByOrder("W_i_parameter_d", (float)geometry.d, name);
                            client.WriteByOrder("W_i_parameter_e", (float)geometry.e, name);
                            client.WriteByOrder("W_i_parameter_f", (float)geometry.f, name);
                            client.WriteByOrder("W_i_parameter_g", (float)geometry.g, name);
                            client.WriteByOrder("W_i_parameter_h", (float)geometry.h, name);
                            //屏蔽工艺(屏蔽视觉检测/屏蔽涂油)
                            if (name != "辊道上料查询车轮")
                            {
                                client.WriteByOrder("W_i_skip_op_SJ1", (byte)1, name);//屏蔽视觉检测设备1
                                client.WriteByOrder("W_i_skip_op_SJ2", (byte)1, name);//屏蔽视觉检测设备2
                                client.WriteByOrder("W_i_skip_op_LT", (byte)1, name);//屏蔽链条机
                            }
                            client.WriteByOrder("R_oi_on", (byte)0, name);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        #endregion
 
        #region 查询订单,是否需要加工
        public void QueryOrder(PLCClient client)
        {
            try
            {
                var plc = repository.FindFirst(x => x.plcinfo_name == client.PLCName);
                List<string> names = new List<string>() { "1单元辊道下料查询订单", "2单元辊道下料查询订单", "3单元辊道下料查询订单", "辊道上料查询订单" };
                foreach (string name in names)
                {
                    var details = plcRepository.Find(x => x.plcdetail_iotype == plc.plcinfo_iotyep && x.plcdetail_number == name).ToList();
                    var on = DBExtension.Read(details.Where(x => x.plcdetail_name == "R_oi_on").First(), client);
                    if ((byte)on == 1)
                    {
                        var wp_id = DBExtension.Read(details.Where(x => x.plcdetail_name == "R_o_wp_id").First(), client);
                        //需添加查询车轮SN号订单逻辑   需添加入库模式判断,手动入库模式需人工添加入库库区,否则报警
 
 
                        var wp_type = DBExtension.Read(details.Where(x => x.plcdetail_name == "R_o_wp_type").First(), client);
                        var geometry = dataRepository.FindFirst(x => x.TypeId == (Int32)wp_type);
                        if (geometry == null)
                        {
                            //1-好,允许加工,2-不在列表中,3-不加工车轮类型,4-手动入库模式人工未选择库区
                            client.WriteByOrder("W_i_status", (Int16)2, name);
                            client.WriteByOrder("R_oi_on", (Int16)0, name);
                        }
                        else
                        {
                            //1-好,允许加工,2-不在列表中,3-不加工车轮类型,4-手动入库模式人工未选择库区
                            client.WriteByOrder("W_i_status", (Int16)1, name);
                            //client.WriteByOrder("W_i_job_id", "", name);
                            //client.WriteByOrder("W_i_drawing_id", "", name);
                            //client.WriteByOrder("W_i_heat_id", "", name);
                            //client.WriteByOrder("W_i_sourceheat", "", name);
                            //client.WriteByOrder("W_i_batch_id", "", name);
                            client.WriteByOrder("R_oi_on", (Int16)0, name);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        #endregion
 
        #region 下料位交互
        public void Layofflevel(PLCClient client)
        {
            try
            {
                var plc = repository.FindFirst(x => x.plcinfo_name == client.PLCName);
                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>() { "1单元下料区", "2单元下料区", "3单元下料区" };
                foreach (string name in names)
                {
                    var details = plcRepository.Find(x => x.plcdetail_iotype == plc.plcinfo_iotyep && x.plcdetail_number == name).ToList();
 
                    var Request = (bool)DBExtension.Read(details.Where(x => x.plcdetail_name == "R_Request_Load").First(), client);
                    if (!Request) continue;
 
                    List<string> StationCodes = new List<string>() { "X01001001", "X01001002", "X01001003" };
                    if (name == "2单元下料区")
                        StationCodes = new List<string>() { "X02001001", "X02001002", "X02001003" };
                    if (name == "3单元下料区")
                        StationCodes = new List<string>() { "X03001001", "X03001002" };
                    var Wheel_Type = (Int32)DBExtension.Read(details.Where(x => x.plcdetail_name == "R_Wheel_Type").First(), client);//车轮类型
                    var Wheel_id = DBExtension.Read(details.Where(x => x.plcdetail_name == "R_Wheel_id").First(), client).ToString();//车轮SN号
                    for (int i = 0; i < StationCodes.Count - 1; i++)
                    {
                        var PartStatus = (Int32)DBExtension.Read(details.Where(x => x.plcdetail_name == "R_PartStatus").First(), client);//1:ok;2:nok
                        string NG = StationCodes[StationCodes.Count - 1];//NG货位
                        var station = stationinfoRepository.FindFirst(x => x.stationCode == StationCodes[i] && x.enable && x.location_state == LocationStateEnum.Stroge.ToString() && x.quantity < 5);
                        if (station == null) continue;
                        var Pipelinedetails = plcRepository.Find(x => x.plcdetail_iotype == Pipelineplc.plcinfo_iotyep && x.plcdetail_number == StationCodes[i]).ToList();
                        var PalletSignal = (Int16)DBExtension.Read(Pipelinedetails.Where(x => x.plcdetail_name == "R_PalletSignal").First(), client);//读取托盘信号:1:有,2无
                        if (PalletSignal == 1)
                        {
                            if (PartStatus == 1 && NG != station.stationCode)
                            {
                                client.WriteByOrder("W_AreaNr", (Int16)i + 1, name);//区域货位号
                                client.WriteByOrder("W_IndexNr", (Int16)station.quantity + 1, name);//托盘上的第几个车轮
                            }
                            else if (PartStatus == 2 && NG == station.stationCode)
                            {
                                client.WriteByOrder("W_AreaNr", (Int16)i + 1, name);//区域货位号
                                client.WriteByOrder("W_IndexNr", (Int16)station.quantity + 1, name);//托盘上的第几个车轮
                            }
                            client.WriteByOrder("W_Storage_Type", (Int16)1, name);//托盘类型1-横放;2-竖放(暂时只有横放托盘)
                            client.WriteByOrder("W_Enabl_Load", true, name);//是否允许
                        }
                    }
                    var finished = (bool)DBExtension.Read(details.Where(x => x.plcdetail_name == "R_load_finished").First(), client);//放料完成
                    if (finished)
                    {
                        var AreaNr = (Int16)DBExtension.Read(details.Where(x => x.plcdetail_name == "W_AreaNr").First(), client);
                        var station = stationinfoRepository.FindFirst(x => x.stationCode == StationCodes[AreaNr - 1]);
                        station.quantity = station.quantity++;
                        stationinfoRepository.Update(station);
                        client.WriteByOrder("W_Storage_update", true, name);//货位状态更新
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        #endregion
    }
}