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;
///
/// 定时轮询任务
///
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);
}
}
}
}
}
}
}