using HH.WCS.Mobox3.TSSG.api;
using HH.WCS.Mobox3.TSSG.device;
using HH.WCS.Mobox3.TSSG.models;
using HH.WCS.Mobox3.TSSG.process;
using HH.WCS.Mobox3.TSSG.util;
using HH.WCS.Mobox3.TSSG.wms;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
namespace HH.WCS.Mobox3.TSSG.core
{
///
/// 定时轮询任务
///
internal class Monitor
{
internal static void CheckThirdOutWork() {
//第三方读中间表
//var db= new SqlHelper().GetInstance("中间表的sql连接字符串");
// db.Queryable
//读到了出库单,插入到我们的表
}
internal static void CheckOutWork() {
//读自己的中间表,我们自己的表有表有个字段计数,计数小于最大值,继续出库,一次生成一条任务
}
///
/// 待定,此项目plc怎么对接还不确定
///
internal static void CheckDevice() {
//检测输送线状态
S7Helper.ReadStr("plc1", 100, 1, 8);
S7Helper.ReadBit("plc1", 101, 1, 2);
S7Helper.ReadInt("plc1", 102, 1, 6);
//1 设备plc的ip deviceNo 自动建立连接
//2 设备对应的通讯项和线体类型(输送线入口、输送线出口、提升机的入口。。。。)起始读的偏移地址,写的偏移地址
//{ "deviceNo":"5","code":"9001","location":"F1CJ-SSX1-01","writeAddr900":0,"writeAddr905":-1,"writeAddr710":0,"readAddr901":2,"readAddr902":0,"lineType":1},
//3 通讯项自动读plc,读到的数据根据lineType做处理,自动创建任务或者更新任务状态(创建一个设备动作或任务动作,如果是任务动作有个线程去读)
}
// 定时器(单位:分钟)
private static System.Timers.Timer aTimer = new System.Timers.Timer(Settings.WaitTime * 60000);
private static System.Timers.Timer bTimer = new System.Timers.Timer(Settings.WaitTime * 60000);
private static string flag1 = null;
private static string flag2 = null;
internal static void CheckEndLoc() {
foreach (var item in ApiHelper.cacheInstockInfos)
{
LogHelper.Info($"缓存信号处理,缓存IP:{item.Key}", "TSSG");
var instockInfo = item.Value;
var end = WMSHelper.GetInstockEnd(instockInfo.item, instockInfo.endArea);
LogHelper.Info($"(缓存信号,目标库区:{instockInfo.endArea},物料编码:{instockInfo.item})终点货位:" + JsonConvert.SerializeObject(end), "TSSG");
if (end != null)
{
ApiHelper.Instock(instockInfo);
ApiHelper.cacheInstockInfos.Remove(item);
LogHelper.Info("缓存信息生成入库任务,并删除缓存信息:" + JsonConvert.SerializeObject(item), "TSSG");
return;
}
if (item.Key == "192.168.1.160" && instockInfo.UDID != flag1)
{
flag1 = instockInfo.UDID;
// 挂钩Elapsed事件以提供定时器信号
aTimer.Elapsed -= OnTimedEvent1;
aTimer.Elapsed += OnTimedEvent1;
// 设置自动重置为true(意味着定时器会重复触发)
aTimer.AutoReset = false;
aTimer.Stop(); // 确保定时器停止
aTimer.Enabled = true; // 启动定时器
}
if (item.Key == "192.168.1.161" && instockInfo.UDID != flag2)
{
flag2 = instockInfo.UDID;
// 挂钩Elapsed事件以提供定时器信号
aTimer.Elapsed -= OnTimedEvent2;
aTimer.Elapsed += OnTimedEvent2;
// 设置自动重置为true(意味着定时器会重复触发)
aTimer.AutoReset = true;
aTimer.Stop(); // 确保定时器停止
aTimer.Enabled = true; // 启动定时器
}
}
}
private static void OnTimedEvent1(Object source, ElapsedEventArgs e)
{
foreach (var item in ApiHelper.cacheInstockInfos)
{
var instockInfo = item.Value;
if (instockInfo.UDID == flag1) {
if (Settings.BufferArea != null && Settings.BufferArea != "") {
var end = WMSHelper.GetInstockEnd(instockInfo.item, Settings.BufferArea);
if (end != null) {
item.Value.endArea = Settings.BufferArea;
LogHelper.Info("ip:" + item.Key + "信号等待时间超时,变更终点库区为缓存区", "TSSG");
}
}
}
}
}
private static void OnTimedEvent2(Object source, ElapsedEventArgs e)
{
foreach (var item in ApiHelper.cacheInstockInfos)
{
var instockInfo = item.Value;
if (instockInfo.UDID == flag2)
{
if (Settings.BufferArea != null && Settings.BufferArea != "")
{
var end = WMSHelper.GetInstockEnd(instockInfo.item, Settings.BufferArea);
if (end != null)
{
item.Value.endArea = Settings.BufferArea;
LogHelper.Info("ip:" + item.Key + "信号等待时间超时,变更终点库区为缓存区", "TSSG");
}
}
}
}
}
// 自动移库
internal static void AutoShiftStock()
{
var startLoc = WMSHelper.GetShiftStockStart(Settings.BufferArea);
if (startLoc != null) {
var end = WMSHelper.GetInstockEnd(startLoc.LocCntrRel.CntrItemRel.S_ITEM_CODE);
if (end != null) {
var wcsTask = new WCSTask
{
S_OP_NAME = "入库",
S_CODE = WCSHelper.GenerateTaskNo(),
S_TYPE = "下线入库",
S_START_LOC = startLoc.S_CODE,
S_END_LOC = end.S_CODE,
S_SCHEDULE_TYPE = "NDC",
N_CNTR_COUNT = 1,
S_CNTR_CODE = startLoc.LocCntrRel.S_CNTR_CODE,
N_START_LAYER = startLoc.N_CURRENT_NUM,
N_END_LAYER = end.N_CURRENT_NUM + 1
};
if (WCSHelper.CreateTask(wcsTask))
{
LocationHelper.LockLoc(startLoc.S_CODE, 2);
LocationHelper.LockLoc(end.S_CODE, 1);
}
}
}
}
///
/// 移库单移库
///
public static void ShiftStockOrder() {
List tN_YiKuDetails = WMSHelper.getShiftOrderDetail();
foreach (var item in tN_YiKuDetails)
{
if (item.N_QTY > item.N_COMPLETE_NUM) {
Location startLoc = WMSHelper.GetShiftStockStart(item.S_START_AREA, item.S_START_ROW);
Location endLoc = WMSHelper.GetShiftStockEnd(item.S_END_AREA, item.S_END_ROW);
if (startLoc != null && endLoc != null && !WMSHelper.isRowLock(endLoc))
{
var wcsTask = new WCSTask
{
S_OP_CODE = item.S_NO,
S_OP_NAME = "移库单移库",
S_CODE = WCSHelper.GenerateTaskNo(),
S_TYPE = "移库",
S_START_LOC = startLoc.S_CODE,
S_END_LOC = endLoc.S_CODE,
S_SCHEDULE_TYPE = "NDC",
N_CNTR_COUNT = 1,
S_CNTR_CODE = startLoc.LocCntrRel.S_CNTR_CODE,
N_START_LAYER = startLoc.N_CURRENT_NUM,
N_END_LAYER = endLoc.N_CURRENT_NUM + 1
};
if (WCSHelper.CreateTask(wcsTask))
{
LocationHelper.LockLoc(startLoc.S_CODE, 2);
LocationHelper.LockLoc(endLoc.S_CODE, 1);
}
}
}
}
}
}
}