Tjiny
2025-07-02 dfaa7178c3321fab0c7d95c28900e983aaa0a752
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
using System.Linq;
using HH.WCS.Mobox3.RiDong.models;
using HH.WCS.Mobox3.RiDong.models.other;
using HH.WCS.Mobox3.RiDong.util;
using Opc.UaFx;
using Opc.UaFx.Client;
using Task = HH.WCS.Mobox3.RiDong.models.Task;
 
namespace HH.WCS.Mobox3.RiDong.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<Task>().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);
                        }
                    }
                }
            }
        }
 
    }
}