lss
2025-05-16 790eb4d466531a0a727fbc617eb6447167c1da54
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
using HH.WCS.Emerson.device;
using HH.WCS.Emerson.models.other;
using HH.WCS.Emerson.process;
using HH.WCS.Emerson.util;
using HH.WCS.Emerson.wms;
using Opc.UaFx;
using Opc.UaFx.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace HH.WCS.Emerson.core {
    /// <summary>
    /// 定时轮询任务
    /// </summary>
    internal class Monitor {
        internal static void CheckThirdOutWork() {
            //第三方读中间表
            //var db= new SqlHelper<object>().GetInstance("中间表的sql连接字符串");
            // db.Queryable<object>
 
            //读到了出库单,插入到我们的表
 
 
        }
 
        internal static void CheckOutWork() {
            //读自己的中间表,我们自己的表有表有个字段计数,计数小于最大值,继续出库,一次生成一条任务
 
        }
 
 
        internal static void CheckDevice() {
            //检测输送线状态
 
            //S7Helper.ReadStr("plc1", 100, 1, 8);
            //S7Helper.ReadBit("plc1", 101, 1, 2);
            //S7Helper.ReadInt("plc1", 102, 1, 6);
 
            //读取olma的信息
            using (var client = new OpcClient("opc.tcp://localhost:4840/")) {
                //client.Security.UserIdentity = new OpcClientIdentity("userName", "password");
                client.Connect();
                var temperature = client.ReadNode("ns=2;s=Temperature");
                //temperature.Value
 
                // Your code to interact with the server.
 
                OpcReadNode[] commands = new OpcReadNode[] {new OpcReadNode("ns=2;s=Olma_Agv/Compoent_Nr"),
                                                            new OpcReadNode("ns=2;s=Olma_Agv/Quantity"),
                                                            new OpcReadNode("ns=2;s=Olma_Agv/Carriage_Selected"),
                                                            new OpcReadNode("ns=2;s=Olma_Agv/Carriage_in_Position"),
                                                            new OpcReadNode("ns=2;s=Olma_Agv/Request")};
 
                OpcValue[] job = client.ReadNodes(commands).ToArray();
                //根据请求创建创建任务
                var item = job[0].Value.ToString();
                var qty = (int)job[1].Value;
                var bit = (int)job[2].Value;
                var loc = bit == 1 ? "" : "";
                var req = (int)job[4].Value;
                if (req == 1) {
                    //叫料load请求,获取需要的物料信息和数量、终点,判断终点是否有任务,没有任务准备创建任务,去原材料库查找起点
                }
                if (req == 2) {
                    //unload请求,空托和余料回的请求,空托判断空托的尺寸,终点是空托库区堆叠,余料根据尺寸入原材料库
                }
 
 
 
 
 
 
                //写数据
                //OpcStatus result = client.WriteNode("ns=2;s=Machine/Job/Cancel", true);
                /*OpcWriteNode[] commands = new OpcWriteNode[] {
    new OpcWriteNode("ns=2;s=Machine/Job/Number", "0002"),
    new OpcWriteNode("ns=2;s=Machine/Job/Name", "MAN_F01_78910"),
    new OpcWriteNode("ns=2;s=Machine/Job/Speed", 1220.5)
};
 
OpcStatusCollection results = client.WriteNodes(commands);*/
            }
        }
 
        internal static void AutoTask() {
            //自动将人工卸货区的物料转运到原材料库 lmbda
            var db = new SqlHelper<object>().GetInstance();
            var model = db.Queryable<ManualTaskSwitch>().Where(a => a.Area == "人工卸货区").First();
            if (model != null && model.State == 0) {
                //可以自动转运,并且此类型的任务数量小于2条,准备创建任务
                if (db.Queryable<WCSTask>().Count(a => a.S_TYPE == "自动转运" && a.N_B_STATE < 3) < 3) {
                    //起点库区找到一个托盘
                    var start = db.Queryable<Location>().Where(a => a.S_AREA_CODE == "人工卸货区" && a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0).Includes(a => a.LocCntrRel, b => b.Container).First();
                    //根据货位找托盘,找到托盘后判断托盘类型
                    //找终点,原材料库的终点
                    if (start != null) {
                        //S_LOC_RULE
                        var zone = db.Queryable<Zone>().Where(a => a.S_AREA_CODE == "原材料库" && a.S_LOC_RULE == start.LocCntrRel.Container.S_SPEC).First(); ;
                        if (zone != null) {
                            var endLoc = db.Queryable<ZoneLoc>().Includes(a => a.Loc).Where(a => a.S_ZONE_CODE == zone.S_CODE && a.Loc.N_LOCK_STATE == 0 && a.Loc.N_CURRENT_NUM == 0).First();
                            if (endLoc != null) {
                                var end = endLoc.Loc;
                                WCSHelper.CreateTask(DateTime.Now.Ticks.ToString(), start, end, "自动转运", 3, 1, start.LocCntrRel.S_CNTR_CODE);
                            }
                        }
                    }
                }
            }
 
        }
    }
}