using HH.WCS.JiaTong.api;
|
using HH.WCS.JiaTong.device;
|
using HH.WCS.JiaTong.dispatch;
|
using HH.WCS.JiaTong.util;
|
using HH.WCS.JiaTong.wms;
|
using Newtonsoft.Json;
|
using S7.Net;
|
using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Linq;
|
using System.Threading;
|
using static HH.WCS.JiaTong.LISTA.process.HttpModel;
|
using static System.Collections.Specialized.BitVector32;
|
|
namespace HH.WCS.JiaTong.process
|
{
|
/// <summary>
|
/// 设备信号处理,主要是tcp信号,我们做server被动接收信号来处理,根据项目定制的
|
/// </summary>
|
internal class DeviceProcess
|
{
|
internal static void Analysis(string data, string ip)
|
{
|
if (data.Length >= 6)
|
{
|
//去掉消息头3F 00
|
data = data.Substring(4);
|
//Console.WriteLine($"{ip}-{data}");
|
var plc = Settings.deviceInfos.Where(a => a.address == ip && a.enable == 1).FirstOrDefault();
|
if (plc != null)
|
{
|
if (plc.deviceType == 1)
|
{
|
if (data == "")
|
{
|
// Traystacker(plc);
|
}
|
}
|
}
|
else
|
{
|
Console.WriteLine($"TCP信号处理:未查询到IP为{ip}的数据,请检查deviceInfo配置中心是否存在该IP的数据!");
|
}
|
}
|
|
}
|
/// <summary>
|
/// 叠盘机空托返回
|
/// </summary>
|
internal static void Traystacker(string loc, int qty, int type)
|
{
|
try
|
{
|
//上传数据
|
Traystacker result1 = new Traystacker() { station = loc, taskSource = 1, Qty = qty, dpType = type };
|
|
HttpHelper httpHelper = new HttpHelper();
|
Result result = new Result();
|
string date = JsonConvert.SerializeObject(result1);
|
var url = Settings.tableUrls.Find(a => a.id == 3);
|
if (url != null)
|
{
|
LogHelper.Info($"叠盘机空托返回:地址:{url.url},内容:{date}");
|
var r = httpHelper.WebPost(url.url, date);
|
result = JsonConvert.DeserializeObject<Result>(r);
|
if (result.code == "0")
|
{
|
|
LogHelper.Info($"叠盘机空托返回请求成功");
|
}
|
else
|
{
|
LogHelper.Info($"叠盘机空托返回请求失败=>msg:{result.msg}");
|
}
|
}
|
else
|
{
|
LogHelper.Info($"叠盘机空托:根据id=3,未找到配置链接,请检查配置文件");
|
}
|
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"叠盘机空托返回 Error=>{ex.ToString()}", ex);
|
}
|
}
|
|
/// <summary>
|
/// 原材料库agv叠盘回库
|
/// </summary>
|
internal static void Traffic()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
List<string> locs = new List<string>() { "LCDP-001", "BADPW-01" };
|
var location = db.Queryable<Location>().Where(a => locs.Contains(a.S_CODE)).ToList();
|
if (location.Count > 0)
|
{
|
string cntrcode = "";
|
foreach (var item in location)
|
{
|
|
if (item.N_CURRENT_NUM >= 6)
|
{
|
var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
|
if (cntr.Count > 0)
|
{
|
cntrcode = cntr.OrderBy(a=>a.T_CREATE).First().S_CNTR_CODE;
|
// cntrcode = string.Join(",", cntrcodes);
|
}
|
|
//创建过未完成的任务不发起请求
|
var mst = WCSHelper.GetTaskByStartloc(item.S_CODE);
|
if (mst == null)
|
{
|
AgvEmptyBack(item.S_CODE, cntrcode);
|
}
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 井松agv叠盘回库
|
/// </summary>
|
internal static void KjTraffic()
|
{
|
|
|
var db = new SqlHelper<object>().GetInstance();
|
List<string> locs = new List<string>() { "PMDDW-001" };
|
var location = db.Queryable<Location>().Where(a => locs.Contains(a.S_CODE)).ToList();
|
if (location.Count > 0)
|
{
|
// string cntrcode = "";
|
foreach (var item in location)
|
{
|
|
if (item.N_CURRENT_NUM >= 6)
|
{
|
//var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
|
//if (cntr.Count > 0)
|
//{
|
// var cntrcodes = cntr.Select(a => a.S_CNTR_CODE).ToArray();
|
// cntrcode = string.Join(",", cntrcodes);
|
//}
|
|
//创建过未完成的任务不发起请求
|
var mst = WCSHelper.GetTaskByStartloc(item.S_CODE);
|
if (mst == null)
|
{
|
Traystacker(item.S_CODE, item.N_CURRENT_NUM, 1);
|
}
|
}
|
}
|
}
|
}
|
|
|
public static Dictionary<string, DpjErrorInfo> DpjInfoDirectory = new Dictionary<string, DpjErrorInfo>();
|
/// <summary>
|
/// 井松叠盘机叠盘回库
|
/// </summary>
|
internal static void DpjTraffic()
|
{
|
var devices = Settings.deviceInfos.Where(a => a.deviceType == 1).ToList();
|
//var db = new SqlHelper<object>().GetInstance();
|
//var list = db.Queryable<Location>().Where(a => a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList();
|
try
|
{
|
if (devices.Count > 0)
|
{
|
foreach (var device in devices)
|
{
|
var IsDp = S7Helper.ReadDpj(device.address, 2001, S7.Net.VarType.Byte);
|
var value = S7Helper.ReadDpj(device.address, 2014, S7.Net.VarType.Int);
|
var ErrorCode = S7Helper.ReadDpj(device.address, 2016, S7.Net.VarType.Int);
|
//记录叠盘机报错信息
|
if (DpjInfoDirectory.ContainsKey(device.address))
|
{
|
DpjInfoDirectory[device.address].Address = device.address;
|
DpjInfoDirectory[device.address].DeviceName = device.deviceName;
|
var ErrorInfo = Settings.dpjErrorInfos.Where(a => a.ErrorCode == ErrorCode).First();
|
if (ErrorInfo != null)
|
{
|
DpjInfoDirectory[device.address].ErrorInfo = ErrorInfo.ErrorInfo;
|
}
|
}
|
else
|
{
|
string errorinfo = "";
|
var ErrorInfo = Settings.dpjErrorInfos.Where(a => a.ErrorCode == ErrorCode).First();
|
if (ErrorInfo != null)
|
{
|
errorinfo = ErrorInfo.ErrorInfo;
|
}
|
DpjInfoDirectory.Add(device.address, new DpjErrorInfo() { Address = device.address, DeviceName = device.deviceName, ErrorInfo = errorinfo });
|
}
|
if (value >= 1 && IsDp == 1)
|
{
|
//var cntr = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE.Trim() == item.S_CODE).ToList();
|
//if (cntr.Count > 0)
|
//{
|
// var cntrcodes = cntr.Select(a => a.S_CNTR_CODE).ToArray();
|
// cntrcode = string.Join(",", cntrcodes);
|
//}
|
|
//创建过未完成的任务不发起请求
|
var mst = WCSHelper.GetTaskByStartloc(device.TN_Location);
|
if (mst == null)
|
{
|
Traystacker(device.TN_Location, value, 2);
|
}
|
else
|
{
|
LogHelper.Info($"有执行中的叠盘回库任务{mst.S_CODE},不触发叠盘任务");
|
}
|
//var loc = LocationHelper.GetLocByLoc(device.TN_Location);
|
//if (loc != null)
|
//{
|
// if (loc.N_LOCK_STATE == 0) {
|
// Traystacker(device.TN_Location, value, 2);
|
// }
|
// else
|
// {
|
// LogHelper.Info($"设备起点:{device.TN_Location}有锁,不生成任务");
|
// }
|
//}
|
//else
|
//{
|
// LogHelper.Info($"根据设备:{device.deviceName},起点:{device.TN_Location},未找到货位");
|
//}
|
}
|
else
|
{
|
LogHelper.Info($"叠盘机数量:{value},叠盘信号:{IsDp},不触发叠盘任务");
|
}
|
Thread.Sleep(8000);
|
}
|
}
|
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Error($"ReadDpj DpjTraffic:{ex}", ex);
|
|
}
|
|
}
|
/// <summary>
|
/// 原材料库接口访问
|
/// </summary>
|
internal static void AgvEmptyBack(string loc, string cntrcode)
|
{
|
try
|
{
|
string partNumber = "";
|
//上传数据
|
Resultmobox<Traystackermobox> result1 = new Resultmobox<Traystackermobox>() { Name = "EmptyCntrReturn", Source = "HostToAgv" };
|
Traystackermobox traystacker = new Traystackermobox() { LocationCode = loc, CntrCode = cntrcode, PartNumber = partNumber, Qty = 6 };
|
result1.data = traystacker;
|
HttpHelper httpHelper = new HttpHelper();
|
//调用接口
|
Resultmobox result = new Resultmobox();
|
string date = JsonConvert.SerializeObject(result1);
|
string url = Settings.tableUrls.Find(a => a.id == 11).url;
|
LogHelper.Info($"空托返回:地址:{url},内容:{date}");
|
var r = httpHelper.WebPostycl(url, date);
|
result = JsonConvert.DeserializeObject<Resultmobox>(r);
|
if (result.err_code == "0")
|
{
|
|
LogHelper.Info($"空托返回请求成功");
|
}
|
else
|
{
|
LogHelper.Info($"空托返回请求失败=>msg:{result.err_msg}");
|
}
|
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Info($"空托返回 Error=>{ex.ToString()}");
|
}
|
}
|
|
public class DpjErrorInfo
|
{
|
|
public string Address { get; set; }
|
public string DeviceName { get; set; }
|
public string ErrorInfo { get; set; }
|
}
|
}
|
}
|