hwh
2024-08-27 bf755562a82baa070c77b5aaffd8d6a1310438c7
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
using Flurl.Util;
using Furion.DatabaseAccessor;
using Furion.Logging;
using IoTClient;
using StackExchange.Redis;
using System.Data;
 
namespace WCS.Application;
public static class PLCService
{
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
 
    public static void OnChangeEvent(object sender, EventArgs e)
    {
        try
        {
            var mod = sender as WcsDeviceDto;
            Console.WriteLine("PLC值为" + mod.Value);
            switch (mod.Type)
            {
                case PLCTypeEnum.StackingMachine:
                    StackingMachine(mod);
                    break;
                case PLCTypeEnum.ConveyorLine:
                    ConveyorLine(mod);
                    break;
                case PLCTypeEnum.AGV:
                    AGV(mod);
                    break;
                case PLCTypeEnum.PalletMachine:
                    PalletMachine(mod);
                    break;
                default:
                    break;
            }
        }
        catch (Exception ex)
        {
            Log.Error(ex.Message, ex);
        }
    }
    /// <summary>
    /// 跺机业务处理
    /// </summary>
    /// <param name="modDevice"></param>
    private static void StackingMachine(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.PLCUtil;
        switch (modDevice.ToString())
        {
            case "820":
                var modTask = _db.Queryable<WcsTask>().First(s => s.Status == TaskStatusEnum.Wait && s.TaskType == TaskTypeEnum.Out && s.StartRoadway == modDevice.StationNum);
                if (modTask == null)
                {
                    break;
                }
                var modTaskMonitor = new WcsTaskMonitor()
                {
                    TaskNo = modTask.TaskNo,
                    StartLocat = modTask.StartLocate,
                    EndLocat = modTask.EndLocate,
                    PalletNo = modTask.PalletNo,
                };
                // 根据跺机号确认放货工位
                string outStationNum = "0";
                string endRow = "", endColumn = "", endStorey = "";
                switch (modDevice.StationNum)
                {
                    case "R01":
                        outStationNum = "11";
                        endRow = "1";
                        endColumn = "100";
                        endStorey = "1";
                        break;
                    case "R02":
                        outStationNum = "7";
                        endRow = "1";
                        endColumn = "100";
                        endStorey = "1";
                        break;
                    default: break;
                }
                var modD = modDevice.listDevice.FirstOrDefault();
                if (modD == null)
                {
                    Log.Error($"IP{modDevice.PlcId}.设备id:{modDevice.Id}缺少工位级别设备信息");
                    break;
                }
                var (result, value) = plcConn.GetPlcDBValue(modD.PosType.Value, modD.DbNumber, modD.PlcPos);
                if (result.IsSucceed)
                {
                    if (value == 120)// 放货工位空闲 可放货
                    {
                        if (int.Parse(outStationNum) > 0)
                        {
                            var row = int.Parse(modTaskMonitor.StartLocat.Substring(0, 2)).ToString();
                            var column = int.Parse(modTaskMonitor.StartLocat.Substring(2, 2)).ToString();
                            var layer = int.Parse(modTaskMonitor.StartLocat.Substring(4, 2)).ToString();
                            var deep = int.Parse(modTaskMonitor.StartLocat.Substring(6, 2)).ToString();
                            if (int.Parse(row) > 2) //大于4
                            {
                                row = (int.Parse(row) - 2).ToString();
                            }
                            else
                            {
                                // 起始储位地址为空,跳过 写入任务明细表
                                modTaskMonitor.StartLocat = "";
                                modTaskMonitor.InteractiveMsg = "起始储位为空!";
 
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
 
                                // 通知任务界面任务已存在更新 请更新界面
                                //if (TaskAction.refresh)
                                //{
                                //    wSChat.AlarmInformation("1");
                                //}
                                break;
                            }
                            //给PLC写入任务数据
                            var listResult = new List<Result>();
                            //任务号
                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "TaskNo");
                            listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType.Value, modDevice.DbNumber, modPosTask.PlcPos, modTaskMonitor.TaskNo));
                            //托盘号
                            var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "PalletNo");
                            listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType.Value, modDevice.DbNumber, modPosPalletNo.PlcPos, modTaskMonitor.PalletNo));
                            //起始排
                            var modPosRow = modDevice.listStation.FirstOrDefault(s => s.Text == "StartRow");
                            listResult.Add(plcConn.SetPlcDBValue(modPosRow.PosType.Value, modDevice.DbNumber, modPosRow.PlcPos, row));
                            // 起始列
                            var modPosColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "StartColumn");
                            listResult.Add(plcConn.SetPlcDBValue(modPosColumn.PosType.Value, modDevice.DbNumber, modPosColumn.PlcPos, column));
                            // 起始层
                            var modPosStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "StartLayer");
                            listResult.Add(plcConn.SetPlcDBValue(modPosStorey.PosType.Value, modDevice.DbNumber, modPosStorey.PlcPos, layer));
 
                            // 目标放货工位
                            var modPosEndRow = modDevice.listStation.FirstOrDefault(s => s.Text == "EndRow");
                            listResult.Add(plcConn.SetPlcDBValue(modPosEndRow.PosType.Value, modDevice.DbNumber, modPosEndRow.PlcPos, endRow));
                            var modPosEndColumn = modDevice.listStation.FirstOrDefault(s => s.Text == "EndColumn");
                            listResult.Add(plcConn.SetPlcDBValue(modPosEndColumn.PosType.Value, modDevice.DbNumber, modPosEndColumn.PlcPos, endColumn));
                            var modPosEndStorey = modDevice.listStation.FirstOrDefault(s => s.Text == "EndLayer");
                            listResult.Add(plcConn.SetPlcDBValue(modPosEndStorey.PosType.Value, modDevice.DbNumber, modPosEndStorey.PlcPos, endColumn));
                            //全部写入成功
                            if (listResult.All(s => s.IsSucceed))
                            {
                                // 写入跺机任务下发完成
                                plcConn.SetPlcDBValue(modDevice.PosType.Value, modDevice.DbNumber, modDevice.WcsPos, "10");
 
                                // 将出库任务待执行改为正在执行
                                _db.Updateable<WcsTask>()
                                    .SetColumns(s => s.FinishDate == DateTime.Now)
                                    .SetColumns(s => s.Status == TaskStatusEnum.Doing)
                                    .SetColumns(s => s.Levels == 2)
                                    .Where(s => s.Id == modTask.Id)
                                    .ExecuteCommand();
                                var modInsertTaskMonitor = new WcsTaskMonitor()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PlcId = modDevice.Id,
                                    PlcName = modDevice.Text,
                                    InteractiveMsg = $"写入指令:{modTask.StartLocate}储位====》{outStationNum}工位",
                                    PalletNo = modTask.PalletNo,
                                    Status = TaskStatusEnum.Complete,
                                    StartLocat = modTask.StartLocate,
                                    EndLocat = outStationNum,
                                };
                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                // 通知任务界面任务已存在更新 请更新界面
                                //if (TaskAction.refresh)
                                //{
                                //    wSChat.AlarmInformation("1");
                                //}
                                //修改led屏信息
                                //LedDisplay(modDevice.LedIP, "工位:" + modTask.EndLocate, "出库中 " + $"储位地址:{modTask.StartLocate}", "托盘号:" + modTask.PalletNo);
                            }
                        }
                    }
                }
                else
                {
                    Log.Error(string.Join(',', result.ErrList));
                }
                break;
            default:
                break;
        }
    }
    /// <summary>
    /// 输送线业务处理
    /// </summary>
    /// <param name="modDevice"></param>
    private static void ConveyorLine(WcsDeviceDto modDevice)
    {
 
    }
    /// <summary>
    /// AGV业务处理
    /// </summary>
    /// <param name="modDevice"></param>
    private static void AGV(WcsDeviceDto modDevice)
    {
 
    }
    /// <summary>
    /// 叠托机业务处理
    /// </summary>
    /// <param name="modDevice"></param>
    private static void PalletMachine(WcsDeviceDto modDevice)
    {
 
    }
 
    private static void Test(WcsDeviceDto modDevice)
    {
        //写死测试读string
        var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64");
        Console.WriteLine("DB100.64----" + val);
        //测试批量读取
        Dictionary<string, PLCDataTypeEnum> listaddress = new Dictionary<string, PLCDataTypeEnum>();
        foreach (var modStation in modDevice.listStation)
        {
            listaddress.Add(modStation.PlcPos, modStation.PosType.Value);
        }
        var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress);
        if (result.Value.Count > 0)
        {
            foreach (var value in result.Value)
            {
                Console.WriteLine("地址" + value.Key + "----值" + value, value);
            }
        }
        if (!result.IsSucceed)
        {
            foreach (var err in result.ErrList)
            {
                Console.WriteLine(err);
            }
            if (result.Value.Count > 0)//有错误的也有成功的
            {
 
            }
        }
        if (modDevice.Value == 820)
        {
            //测试写入830
            //var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830");
            ////写入是否成功
            //if (result.IsSucceed)
            //{
 
            //}
        }
        else if (modDevice.Value == 840)
        {
 
        }
        else if (modDevice.Value == 860)
        {
 
        }
    }
 
}