using HH.WCS.HangYang.device; using HH.WCS.HangYang.models.other; using HH.WCS.HangYang.process; using HH.WCS.HangYang.util; using HH.WCS.HangYang.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.HangYang.core { /// /// 定时轮询任务 /// internal class Monitor { internal static void CheckThirdOutWork() { //第三方读中间表 //var db= new SqlHelper().GetInstance("中间表的sql连接字符串"); // db.Queryable //读到了出库单,插入到我们的表 } 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().GetInstance(); var model = db.Queryable().Where(a => a.Area == "人工卸货区").First(); if (model != null && model.State == 0) { //可以自动转运,并且此类型的任务数量小于2条,准备创建任务 if (db.Queryable().Count(a => a.S_TYPE == "自动转运" && a.N_B_STATE < 3) < 3) { //起点库区找到一个托盘 var start = db.Queryable().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().Where(a => a.S_AREA_CODE == "原材料库" && a.S_LOC_RULE == start.LocCntrRel.Container.S_SPEC).First(); ; if (zone != null) { var endLoc = db.Queryable().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); } } } } } } } }