using BLL.DAL;
using Commom.DotNetDevices;
using Common;
using FastReport.Export.Email;
using Microsoft.Extensions.Logging;
using Microsoft.JScript;
using Model;
using Model.WmsModel;
using Newtonsoft.Json;
using NLog;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics.Eventing.Reader;
using System.IO;
using System.Linq;
using System.Net.WebSockets;
using System.Security.Policy;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using wms.Controllers;
namespace wms.Task
{
public static class Global
{
public static string statusReady = "1";
public static string statusRuning = "2";
public static string statusEnd = "3";
}
public static class TaskAction
{
// WCS标准版本代码
private static bool IsRunTast = true;
private static bool IsRunConveyor = true;
private static bool IsRunStacker = true;
private static bool IsRunAlarm = true;
private static DataTable PlcInfoDt; // 获取所有设备
private static DataTable AlarmDt; // 获取多有报警信息
private static int PlcSsxNums; //输送线
private static int PlcDjNums; //垛机
private static int TaskTypeCount70; //拆桶任务数量
private static int TaskYouxian; //出入库优先级 1出库 2入库
// 参考定义,标准版弄通后删除掉
private static bool m_bRuning = true;
//private static DataTable AlarmDt;
private static string plcSatu = string.Empty;
private static string plcDjSatu = string.Empty;
private static string LedTopStr = string.Empty; // Led上面多文本区域
private static string LedFootStr = string.Empty; // Led下面字幕区域
private static readonly WSChatController _chat;
static TaskAction()
{
_chat = new WSChatController();
// WCS标准版本代码 执行一次
DALWcsMessage wcsSql = new DALWcsMessage();
PlcInfoDt = wcsSql.GetPlcInfos("", "", "");
AlarmDt = wcsSql.GetWcsAlarmInfo();
// 参考定义,标准版本弄通后删除掉
//DALWcsMessage wcsSql = new DALWcsMessage();
//AlarmDt = wcsSql.GetErrorInfor();
}
///
/// PLC读写测试
///
///
///
public static void TestPlc(object source, System.Timers.ElapsedEventArgs e)
{
try
{
if (IsRunTast)
{
IsRunTast = false;
Logger logger = LogManager.GetCurrentClassLogger();
//logger.Error("在运行" + "执行该方法:", "iis自动回收机制");
//连接测试
//string plcStatus = "";
//PlcIO plc = new PlcIO("192.168.8.40", 1, ref plcStatus);
//if (plcStatus.Length > 0)
//{
// // 连接失败
//}
//string plcValue = "";
//plcValue = plc.GetPlcDBValue(1101, "String", "40.0");
//plcValue = plc.GetPlcDBValue(1101, "String", "360.0");
//led灯相应位置显示
// 提示LED选择执行批次
// LedDisplay(row["LedIP"].ToString(), "38工位", "入库前,请操作执行批次信息!", "停止入库\t");
//LedDisplay("192.168.8.55", "38工位 C1口", "空闲中D", "整托空桶/重桶入库分拣交互工位38"); //D口
//LedDisplay("192.168.8.51", "28工位 C口", "空闲中C1", "人工处理/整托袋子入库交互工位28"); //C1口
//LedDisplay("192.168.8.52", "24工位 B口", "空闲中C", "托袋子入库交互工位24"); //C口
//LedDisplay("192.168.8.54", "18工位 A口", "空闲中B", "吨袋入库B口 交互工位18"); //B口
//LedDisplay("192.168.8.53", "13工位 D口", "空闲中A", "桶类出入库A口 交互工位13"); //A口
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口
////LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理交互工位28"); //C1口
//LedDisplay("192.168.8.52", "24工位 C口", "空闲中", "托袋子入库交互工位24"); //C口
//LedDisplay("192.168.8.54", "18工位 B口", "空闲中", "吨袋入库B口 交互工位18"); //B口
//LedDisplay("192.168.8.53", "13工位 A口", "空闲中", "桶类出入库A口 交互工位13"); //A口
//LedDisplay("192.168.8.55", "38工位 D口", "空闲中", "整托空桶/重桶入库分拣交互工位38"); //D口
//return;
//// 手动设置各工位状态
//plc.SetPlcDBValue(1101, "Int", "100", "420.0"); // PLC控制流程字
//var aa = plc.SetPlcDBValue(1101, "String", "T2300001", "400.0"); // 托盘号
//plc.SetPlcDBValue(1101, "Int", "70", "424.0"); // 任务类型 70满桶子母托入 80满桶母托入
//plc.SetPlcDBValue(1101, "Int", "60", "426.0"); // 物料类型 60:满桶字母托盘 70:满桶母托盘
//plc.SetPlcDBValue(1101, "Byte", "1", "428.0"); // 目标工位号
//plc.SetPlcDBValue(1101, "Byte", "1", "429.0"); // 字母托盘状态 0无 1有
//plc.SetPlcDBValue(1101, "Byte", "1", "430.0"); // 物料数量
//plc.SetPlcDBValue(1101, "Real", "200", "432.0"); // 物料重量
//plc.SetPlcDBValue(1101, "Byte", "0", "431.0"); // 拆跺数量
// 读取
//string plcValue = "";
//plcValue = plc.GetPlcDBValue(1101, "String", "400.0");
//plc.SetPlcDBValue(1101, "String", "T2300001", "10.0");
//plcValue = plc.GetPlcDBValue(1101, "Int", "420.0");
////plc.SetPlcDBValue(1101, "Int", "99", "22.0");
//plcValue = plc.GetPlcDBValue(1101, "Int", "424.0");
////plc.SetPlcDBValue(1101, "Int", "99", "24.0");
//plcValue = plc.GetPlcDBValue(1101, "Int", "426.0");
////plc.SetPlcDBValue(1101, "Int", "99", "26.0");
//plcValue = plc.GetPlcDBValue(1101, "Byte", "428.0");
////plc.SetPlcDBValue(1101, "Byte", "99", "28.0");
//plcValue = plc.GetPlcDBValue(1101, "Byte", "429.0");
////plc.SetPlcDBValue(1101, "Byte", "99", "29.0");
//plcValue = plc.GetPlcDBValue(1101, "Byte", "430.0");
////plc.SetPlcDBValue(1101, "Byte", "99", "30.0");
//plcValue = plc.GetPlcDBValue(1101, "Byte", "431.0");
////plc.SetPlcDBValue(1101, "Byte", "99", "31.0");
//plcValue = plc.GetPlcDBValue(1101, "Real", "432.0");
////plc.SetPlcDBValue(1101, "Real", "99", "32.0");
// LED显示屏连接测试
//LedDll Led = new LedDll();
//Led.LEDstr("192.168.8.55", "最上方", "中间多文本区域!", "最下方区域 ");
// 接口测试
//WCSPalletBind model = new WCSPalletBind();
//model.PalletNo = "T2300001";
//model.TaskType = "001";
//model.SubPallet = "0";
//model.SkuQty = 10;
//model.SkuWeight = "235";
//model.SkuType = "001";
//model.LotNo = "2305190";
//model.SupplierLot = "";
//DALWcsMessage wcsMySql = new DALWcsMessage();
//string endLocat = ""; // 取货工位号
//string strMsg = wcsMySql.GetLocation("T2300001", model, ref endLocat);
//plc.ClosePlc();
IsRunTast = true;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//IsRunTast = true;
}
}
///
/// 获取当前工位交互流程字为多少
///
public static string GetPlcOrWcsPos(string Ip, string Stat, string Plcpos)
{
#region 与PLC交互逻辑
DataRow[] iProws = null;
string type = "0";
//判断是输送线连接还是垛机连接
if (Ip == "192.168.8.40")
{
type = "1";
// 获取运输线交互IP集合
iProws = PlcInfoDt.Select("Level = '0' and Type = '1' ");
}
else
{
// 获取跺机交互IP集合
iProws = PlcInfoDt.Select("Level = '0' and Type = '0' ");
}
// 连接运输线PlC
//string plcIp = ipRow["PlcIP"].ToString();
string plcStatus = ""; // PLC连接状态
PlcIO plc = new PlcIO(Ip, 1, ref plcStatus);
if (plcStatus.Length > 0)
{
return "连接垛机或输送线异常!";
}
//else
//{
//if (type == "1")
//{
// //输送线
// PlcCounts(1, 0, "获取工位流程字 连接");
//}
//else
//{
// //垛机
// PlcCounts(0, 1, "获取工位流程字 连接");
//}
//}
try
{
// 循环连接运输线设备
foreach (DataRow ipRow in iProws)
{
// 循环各跺机与PLC进行交互
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '{type}' and PlcIP='{Ip}' ");
//rows.Select(a=>a.)
rows = PlcInfoDt.Select($"StationNum = '{Stat}' and PlcPos = '{Plcpos}'");
foreach (DataRow row in rows)
{
// 读取工位流程字
string dbNumber = row["DbNumber"].ToString();
string posType = row["PosType"].ToString();
string plcPos = row["PlcPos"].ToString();
string wcsPos = row["WcsPos"].ToString();
string stationNum = row["StationNum"].ToString();
string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
//判断工位号
if (stationNum == Stat)
{
if (plcValue == "0" || plcValue == "10" || plcValue == "20" || plcValue == "21" || plcValue == "22" || plcValue == "100" || plcValue == "110" || plcValue == "120" || plcValue == "130" || plcValue == "140" || plcValue == "200" || plcValue == "210" || plcValue == "290" || plcValue == "300" || plcValue == "310" || plcValue == "320")
{
// 关闭设备连接
plc.ClosePlc();
//if (type == "1")
//{
// //输送线
// PlcCounts(-1, 0, "获取工位流程字 断开");
//}
//else
//{
// //垛机
// PlcCounts(0, -1, "获取工位流程字 断开");
//}
return plcValue;
}
else
{
continue;
}
}
else
{
continue;
}
}
}
}
catch
{
// 关闭设备连接
plc.ClosePlc();
//if (type == "1")
//{
// //输送线
// PlcCounts(-1, 0, "获取工位流程字(异常处) 断开");
//}
//else
//{
// //垛机
// PlcCounts(0, -1, "获取工位流程字(异常处) 断开");
//}
}
// 关闭设备连接
plc.ClosePlc();
//if (type == "0")
//{
// //输送线
// PlcCounts(-1, 0, "获取工位流程字 断开");
//}
//else
//{
// //垛机
// PlcCounts(0, -1, "获取工位流程字 断开");
//}
return null;
#endregion
}
///
/// 运输线
///
public static void Conveyors(object source, System.Timers.ElapsedEventArgs e)
{
try
{
if (IsRunConveyor)
{
Logger logger = LogManager.GetCurrentClassLogger();
IsRunConveyor = false;
#region 与PLC交互逻辑
// 获取运输线交互IP集合
DataRow[] iProws = PlcInfoDt.Select("Level = '0' and Type = '1' ");
string plcStatus = ""; // PLC连接状态
PlcIO plc = new PlcIO("192.168.8.40", 1, ref plcStatus);
int a = 0;
// 循环连接运输线设备
foreach (DataRow ipRow in iProws)
{
if (plcStatus.Length > 0)
{
// 通知前端设备监控画面连接PLC失败
WSChatController wSChat = new WSChatController();
wSChat.AlarmInformation("连接设备失败:" + ipRow["Name"].ToString(), "");
// LED显示连连接失败
LedDll Led = new LedDll();
Led.LEDstr(ipRow["LedIP"].ToString(), "提示", "连接不上PLC,请检查网络连接!", ipRow["Name"].ToString());
break;
}
//else
//{
// //输送线
// PlcCounts(1, 0, "运输线连接处 连接348");
//}
// 循环各工位与PLC进行交互
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and PlcIP='192.168.8.40' ");
foreach (DataRow row in rows)
{
// 读取工位流程字
string dbNumber = row["DbNumber"].ToString();
string posType = row["PosType"].ToString();
string plcPos = row["PlcPos"].ToString();
string wcsPos = row["WcsPos"].ToString();
string stationNum = row["StationNum"].ToString();
string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
// 判断该工位是否有任务
if (plcValue == "0" || plcValue == "10")
{
continue;
}
else if (plcValue == "20" || plcValue == "21" || plcValue == "22" || plcValue == "100" || plcValue == "110" || plcValue == "120" || plcValue == "130" || plcValue == "140" || plcValue == "200" || plcValue == "210" || plcValue == "290" || plcValue == "300" || plcValue == "310" || plcValue == "320" || plcValue == "330")
{
try
{
BllHandler(plc, plcValue, row);
}
catch
{
}
}
else
{
continue;
}
}
}
// 关闭设备连接
plc.ClosePlc();
//PlcCounts(-1, 0, "运输线连接处 断开388");
//logger.Error("是否进入?"+a.ToString());
IsRunConveyor = true;
#endregion
}
}
catch (Exception ex)
{
IsRunConveyor = true;
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("输送线异常消息:" + ex.Message, "输送线定时器错误");
}
}
///
/// 堆垛机
///
public static void Stackers(object source, System.Timers.ElapsedEventArgs e)
{
try
{
if (IsRunStacker)
{
//Logger logger = LogManager.GetCurrentClassLogger();
//var logStr = $@".\LogFile\WCS连接输送线、垛机\接收垛机连接成功" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
//logger.Error("垛机定时进入成功", logStr);
IsRunStacker = false;
#region 与PLC交互逻辑
// 获取跺机交互IP集合
DataRow[] iProws = PlcInfoDt.Select("Level = '0' and Type = '0' ");
//string plcStatus1 = ""; // PLC连接状态
//string plcStatus2 = ""; // PLC连接状态
//string plcStatus3 = ""; // PLC连接状态
//PlcIO plc1 = new PlcIO("192.168.8.10", 1, ref plcStatus1);
//PlcIO plc2 = new PlcIO("192.168.8.20", 1, ref plcStatus2);
//PlcIO plc3 = new PlcIO("192.168.8.30", 1, ref plcStatus3);
// 循环连接跺机设备
foreach (DataRow ipRow in iProws)
{
// 连接跺机PlC
string plcIp = ipRow["PlcIP"].ToString();
string plcStatus = ""; // PLC连接状态
PlcIO plc = new PlcIO(plcIp, 1, ref plcStatus);
if (plcStatus.Length > 0)
//if (plcStatus1.Length > 0 || plcStatus2.Length > 0 || plcStatus3.Length >0)
{
// 通知前端设备监控画面连接PLC失败
WSChatController wSChat = new WSChatController();
wSChat.AlarmInformation("连接跺机失败:" + ipRow["Name"].ToString(), "");
// LED显示连连接失败
LedDll Led = new LedDll();
Led.LEDstr(ipRow["LedIP"].ToString(), "提示", "连接不上跺机,请检查网络连接!", ipRow["Name"].ToString());
break;
}
//else
//{
// PlcCounts(0, 1, "垛机处 连接449");
//}
// 循环各跺机与PLC进行交互
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '0' and PlcIP='{plcIp}' ");
foreach (DataRow row in rows)
{
// 读取工位流程字
string dbNumber = row["DbNumber"].ToString();
string posType = row["PosType"].ToString();
string plcPos = row["PlcPos"].ToString();
//string plcValue = "";
//if (plcIp == "192.168.8.10")
//{
// plcValue = plc1.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
//}else if (plcIp == "192.168.8.20")
//{
// plcValue = plc2.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
//}else if (plcIp == "192.168.8.30")
//{
// plcValue = plc3.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
//}
string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
if (plcValue == "0")
{
continue;
}
else if (plcValue == "10" || plcValue == "20" || plcValue == "30" || plcValue == "40" || plcValue == "50" || plcValue == "100")
{
//if (plcIp == "192.168.8.10")
//{
// BllHandlerDj(plc1, plcValue, row);
//}
//else if (plcIp == "192.168.8.20")
//{
// BllHandlerDj(plc2, plcValue, row);
//}
//else if (plcIp == "192.168.8.30")
//{
// BllHandlerDj(plc3, plcValue, row);
//}
try
{
BllHandlerDj(plc, plcValue, row);
}
catch
{
}
//BllHandlerDj(plc, plcValue, row);
}
else
{
continue;
}
}
// 关闭设备连接
plc.ClosePlc();
//PlcCounts(0, -1, "垛机处 断开511");
}
#endregion
IsRunStacker = true;
}
}
catch (Exception ex)
{
IsRunStacker = true;
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("堆垛机异常消息:" + ex.Message, "堆垛机定时器错误");
}
}
///
/// 报警
///
public static void Alarms(object source, System.Timers.ElapsedEventArgs e)
{
try
{
if (IsRunAlarm)
{
IsRunAlarm = false;
DataRow[] iProws = PlcInfoDt.Select("Level = '0'");
// 循环连接运输线设备
foreach (DataRow ipRow in iProws)
{
// 获取所有设备IP地址
string plcIp = ipRow["PlcIP"].ToString();
string plcStatus = ""; // PLC连接状态
PlcIO plc = new PlcIO(plcIp, 1, ref plcStatus);
if (plcStatus.Length > 0)
{
continue;
}
DataRow[] rows = AlarmDt.Select($"PlcIP = '{plcIp}'");
Parallel.For(0, rows.Length, item =>
{
string value = plc.GetPlcMBValue("Bit", rows[item]["AlarmCode"].ToString());
if (value == "True")
{
// 改变报警信息表数据
//if ()
//{
//}
}
else
{
// 改变报警信息表数据
}
});
}
//foreach (DataRow row in AlarmDt.Rows)
//{
// // 改为for的并循环
// string Mstr = string.Empty;
// string vluestr = string.Empty;
// switch (row["IPAddre"].ToString())
// {
// case "跺机":
// vluestr = plcDJ.GetPlcMBValue("Bit", row["M"].ToString());
// if (vluestr == "True")
// {
// plcDjBl = true;
// // 发送到LED屏幕运行状态区域
// Mstr = row["AlarmStr"].ToString();
// string AccessCode = row["AccessCode"].ToString();
// Led.SetMstrLeds(AccessCode, Mstr);
// // 将报警信息存储到Table
// wcsSql.SetErrorMessage("跺机报警", row["M"].ToString(), Mstr);
// // 读取M点报警信息;通知前端刷新
// WSChatController wSChat = new WSChatController();
// wSChat.AlarmInformation("跺机报警:" + Mstr);
// };
// break;
// case "输送线":
// vluestr = plc.GetPlcMBValue("Bit", row["M"].ToString());
// if (vluestr == "True")
// {
// plcBl = true;
// // 发送到LED屏幕运行状态区域
// Mstr = row["AlarmStr"].ToString();
// string AccessCode = row["AccessCode"].ToString();
// Led.SetMstrLeds(AccessCode, Mstr);
// // 将报警信息存储到Table
// wcsSql.SetErrorMessage("输送线报警", row["M"].ToString(), Mstr);
// // 读取M点报警信息;通知前端刷新
// //WSChatController wSChat = new WSChatController();
// //wSChat.AlarmInformation("输送线报警:" + Mstr);
// };
// break;
// default:; break;
// }
//}
// 开始交互逻辑
// 开始交互逻辑
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "测试运行时间");
IsRunAlarm = true;
}
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 清除log日志
///
public static void DeleteNlogFile(object source, System.Timers.ElapsedEventArgs e)
{
try
{
// 时 分 秒
// 得到 hour minute second 如果等于某个值就开始执行某个程序。
int intHour = e.SignalTime.Hour;
int intMinute = e.SignalTime.Minute;
//int intSecond = e.SignalTime.Second;
// 定制时间; 比如 在10:30 :00 的时候执行某个函数
int iHour = 00;
int iMinute = 05;
//int iSecond = 00;
// 设置 在每天晚上的23点50执行
//if (intHour == iHour && intMinute == iMinute && intSecond == iSecond)
if (intHour == iHour && intMinute == iMinute)
{
int count = 0;
string[] files = Directory.GetFiles("E:\\server\\WcsServer\\LogFile");
//string[] files = Directory.GetFiles("D:\\WMS\\JC08Wcs\\WCS-V1.0\\wms\\LogFile");
foreach (string file in files)
{
FileInfo fi = new FileInfo(file);
var a = fi.Name.Split('.');
a[0].ToDate();
if (a[0].ToDate() < DateTime.Now.AddMonths(-1))
{
count += 1;
fi.Delete();
}
}
Logger logger = LogManager.GetCurrentClassLogger();
if (count > 0)
{
logger.Error("清除WCS日志消息:清除成功");
//调用WMS清除日志接口
var response = Utility.Extra.HttpHelper.DoPost("http://192.168.220.137:8081/api/DownAPi/DeleteNlogFile", null);
if (response != "清除成功")
{
logger.Error("清除WMS日志消息:清除成功");
}
}
}
//else if (intHour == 03 && intMinute == 00)
//{
// var response = Utility.Extra.HttpHelper.DoPost("http://192.168.220.137:8081/api/DownAPi/UptTaskYouxian", null);
// BLLYouxian("出库任务优先");
//}
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("清除日志异常消息:" + ex.Message, "清除日志定时器错误");
}
}
public static void BLLYouxian(string str)
{
//判断优先级
if (str == "出库任务优先")
{
TaskYouxian = 1;
//return "";
}
else if (str == "入库任务优先")
{
TaskYouxian = 2;
//return "";
}
}
///
/// 运输线业务处理函数
///
/// PLC连接
/// PLC控制字
/// 工位信息
private static void BllHandler(PlcIO plc, string plcValue, DataRow row)
{
try
{
//WebStocket发送消息
WSChatController wSChat = new WSChatController();
DALWcsMessage wcsMySql = new DALWcsMessage();
DataTable dt = wcsMySql.GetWCSConveyorInfo();
TaskReques taskReques = new TaskReques();
string palletNo = ""; // 托盘号
string taskType = ""; // 任务类型
string skuType = ""; // 物料类型
string subPallet = ""; // 有无子托盘 0无 1有
string skuQty = ""; // 物料数量
string disQty = ""; // 拆跺数量
string skuWeight = ""; // 物料重量
string packagingStatus = ""; //打包状态
string wrappedStatus = ""; //缠膜状态
// 托盘绑定实体类
WCSPalletBind model = new WCSPalletBind();
// 任务明细实体类
WCSTasksMonitor tasksMonitor = new WCSTasksMonitor();
tasksMonitor.TaskNo = "";
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.Status = "2"; // 执行完成
switch (row["StationNum"].ToString())
{
#region 申请储位工位
case "13":
#region A口 子托盘跺 母托盘跺
if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
palletNo = plc.GetPlcDBValue(1101, "String", "240.0"); // 托盘号
// Led提示给客户
LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:申请储位", "桶类出入库A口 交互工位13"); //A口
taskType = plc.GetPlcDBValue(1101, "Int", "264.0"); // 任务类型
skuType = plc.GetPlcDBValue(1101, "Int", "266.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "269.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "270.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "272.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "274.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "278.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "279.0"); //缠膜状态
// 获取当前口批次信息
DataRow conRow = null;
var aa = dt;
if (skuType != "10" && skuType != "20" && skuType != "21")
{
conRow = dt.Select("Conveyor = 'A'")[0];
}
// 将托盘绑定信息插存储到组托表
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.StationNum = "13";
if (skuType != "10" && skuType != "20" && skuType != "21")
{
//model.SkuType = conRow["SkuType"].ToString();
model.LotNo = conRow["LotNo"].ToString();
model.SupplierLot = conRow["SupplierLot"].ToString();
model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString());
}
model.PlcId = row["Id"].ToString();
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "268.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:13工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:入库中", "桶类出入库A口 交互工位13"); //A口
}
}
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "240.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "268.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "13";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
LedDisplay("192.168.8.53", "13工位 A口", "空闲中", "桶类出入库A口 交互工位13"); //A口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:申请储位失败", "桶类出入库A口 交互工位13"); //A口
}
else if (plcValue == "140")
{
// 不用管
break;
}
else if (plcValue == "320")
{
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "240.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "268.0"); // 目标地址
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
if (dt3.Rows.Count == 0)
{
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:出库完成", "桶类出入库A口 交互工位13"); //A口
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "13");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = "13";
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
}
}
LedDisplay("192.168.8.53", "13工位 A口", "空闲中", "桶类出入库A口 交互工位13"); //A口
break;
}
#endregion
break;
case "18":
#region B口 子托盘跺 母托盘跺
if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
palletNo = plc.GetPlcDBValue(1101, "String", "280.0"); // 托盘号
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", $"{palletNo}:申请储位", "吨袋入库B口 交互工位18"); //B口
taskType = plc.GetPlcDBValue(1101, "Int", "304.0"); // 任务类型
skuType = plc.GetPlcDBValue(1101, "Int", "306.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "309.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "310.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "312.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "314.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "318.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "319.0"); //缠膜状态
// 获取当前口批次信息
DataRow conRow = dt.Select("Conveyor = 'B'")[0];
// 将托盘绑定信息插存储到组托表
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.StationNum = "18";
//model.SkuType = conRow["SkuType"].ToString();
model.LotNo = conRow["LotNo"].ToString();
model.SupplierLot = conRow["SupplierLot"].ToString();
model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString());
model.PlcId = row["Id"].ToString();
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "308.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:18工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", $"{palletNo}:入库中", "吨袋入库B口 交互工位18"); //B口
}
}
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "280.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "308.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "18";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "空闲中", "吨袋入库B口 交互工位18"); //B口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "申请储位失败", "吨袋入库B口 交互工位18"); //B口
}
else if (plcValue == "140")
{
// 不用管
break;
}
else if (plcValue == "320")
{
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "出库完成", "吨袋入库B口 交互工位18"); //B口
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "280.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "308.0"); // 目标地址
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
if (dt3.Rows.Count == 0)
{
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "18");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = "18";
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
}
}
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "空闲中", "吨袋入库B口 交互工位18"); //B口
break;
}
#endregion
break;
case "24":
#region C口 500kg吨袋入库 子托盘跺 母托盘跺
if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
palletNo = plc.GetPlcDBValue(1101, "String", "320.0"); // 托盘号
LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:申请储位", "整托袋子入库交互工位24"); //C口
taskType = plc.GetPlcDBValue(1101, "Int", "344.0"); // 任务类型
skuType = plc.GetPlcDBValue(1101, "Int", "346.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "349.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "350.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "352.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "354.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "358.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "359.0"); //缠膜状态
// 获取当前口批次信息
DataRow conRow = dt.Select("Conveyor = 'C'")[0];
// 将托盘绑定信息插存储到组托表
//WCSPalletBind model = new WCSPalletBind();
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.LotNo = conRow["LotNo"].ToString();
model.SupplierLot = conRow["SupplierLot"].ToString();
model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString());
model.StationNum = "24";
model.PlcId = row["Id"].ToString();
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "348.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:24工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
// Led提示给客户
LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:入库中", "整托袋子入库交互工位24"); //C口
}
}
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "320.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "348.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "24";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.52", "24工位 C口", "空闲中", "整托袋子入库交互工位24"); //C口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:申请储位失败", "整托袋子入库交互工位24"); //C口
}
else if (plcValue == "140")
{
// 不用管
break;
}
else if (plcValue == "320")
{
// Led提示给客户
LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:出库完成", "整托袋子入库交互工位24"); //C口
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "320.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "348.0"); // 目标地址
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
if (dt3.Rows.Count == 0)
{
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "24");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = "24";
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
}
}
// Led提示给客户
LedDisplay("192.168.8.52", "24工位 C口", "空闲中", "整托袋子入库交互工位24"); //C口
break;
}
#endregion
break;
case "28":
#region C1口 25kg袋子入库 子托盘跺 母托盘跺
if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
palletNo = plc.GetPlcDBValue(1101, "String", "360.0"); // 托盘号
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位", "人工处理/整托袋子入库交互工位28"); //C1口
taskType = plc.GetPlcDBValue(1101, "Int", "384.0"); // 任务类型
skuType = plc.GetPlcDBValue(1101, "Int", "386.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "389.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "390.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "392.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "394.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "398.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "399.0"); //缠膜状态
// 获取当前口批次信息
DataRow conRow = null;
var aa = dt;
if (skuType != "10" && skuType != "20" && skuType != "21")
{
conRow = dt.Select("Conveyor = 'C1'")[0];
}
// 将托盘绑定信息插存储到组托表
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
if (skuType != "10" && skuType != "20" && skuType != "21")
{
model.LotNo = conRow["LotNo"].ToString();
model.SupplierLot = conRow["SupplierLot"].ToString();
model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString());
}
model.StationNum = "28";
model.PlcId = row["Id"].ToString();
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "388.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:28工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:入库中", "人工处理/整托袋子入库交互工位28"); //C1口
}
}
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "360.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "388.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "28";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位失败", "人工处理/整托袋子入库交互工位28"); //C1口
}
else if (plcValue == "140")
{
// 不用管
break;
}
else if (plcValue == "320")
{
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:出库完成", "人工处理/整托袋子入库交互工位28"); //C1口
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "360.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "388.0"); // 目标地址
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
if (dt3.Rows.Count == 0)
{
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "28");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
tasksMonitor.EndLocat = "28";
tasksMonitor.Status = "2";
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
}
}
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口
break;
}
#endregion
break;
case "38":
#region D口 桶类(塑料空桶 铁空桶 重桶)物料入库
palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号
taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库
skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "432.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "434.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "438.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "439.0"); //缠膜状态
// 绑定托盘实体类
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.StationNum = "38";
model.PlcId = row["Id"].ToString();
if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
// Led提示给客户
LedDisplay("192.168.8.55", "38工位 D口", $"{palletNo}:申请储位", "整托空桶/重桶入库分拣交互工位38"); //D口
// 获取当前口批次信息
DataRow[] conRows = dt.Select("Conveyor = 'D'");
if (conRows.Length <= 0)
{
// 提示LED选择执行批次
LedDisplay(row["LedIP"].ToString(), "38工位 D口", $"{palletNo}:入库前,请操作执行批次信息!", "停止入库\t");
break;
}
else
{
// 提示LED正在入库
LedDisplay(row["LedIP"].ToString(), "38工位 D口", $"{palletNo}:正在入库,请误进行其他操作!", "停止操作\t");
}
DataRow conRow = conRows[0];
// 将托盘绑定信息插存储到组托表
model.LotNo = conRow["LotNo"].ToString();
model.SupplierLot = conRow["SupplierLot"].ToString();
model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString());
//model.SkuType = conRow["SkuType"].ToString(); // 桶类的PLC无法确认物料类型
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//TaskMonitorManager.ToolBar();
//WebSocket socket = ("Wcs/");
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "428.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = "写入指令:38工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
// Led提示给客户
LedDisplay("192.168.8.55", "38工位 D口", $"{palletNo}:入库中", "整托空桶/重桶入库分拣交互工位38"); //D口
}
}
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "428.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "38";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.55", "38工位 D口", "空闲中", "整托空桶/重桶入库分拣交互工位38"); //D口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.55", "38工位 D口", $"{palletNo}:申请储位失败", "整托空桶/重桶入库分拣交互工位38"); //D口
}
else if (plcValue == "140")
{
// 不用管
break;
}
else if (plcValue == "320")
{
// Led提示给客户
LedDisplay("192.168.8.55", "38工位 D口", "{palletNo}:出库完成", "整托空桶/重桶入库分拣交互工位38"); //D口
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "428.0"); // 目标地址
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
if (dt3.Rows.Count == 0)
{
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "38");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = "38";
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo);
//_chat.Get();
}
}
// Led提示给客户
LedDisplay("192.168.8.55", "38工位 D口", "空闲中", "整托空桶/重桶入库分拣交互工位38"); //D口
break;
}
#endregion
break;
case "23":
#region 23号工位(物料、空托盘垛)物料入库
palletNo = plc.GetPlcDBValue(1101, "String", "440.0"); // 托盘号
taskType = plc.GetPlcDBValue(1101, "Int", "464.0"); // 任务类型 10 入库 其它为出库
skuType = plc.GetPlcDBValue(1101, "Int", "466.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "469.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "470.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "472.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "474.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "478.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "479.0"); //缠膜状态
// 绑定托盘实体类
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.StationNum = "23";
model.PlcId = row["Id"].ToString();
if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务
{
//向WMS申请塑料子托盘垛
string endLocat = "23"; // 送货工位号
string skulinshi = "100098"; //子托盘塑料 - 蓝色
if (model.SkuType == "22")
{
skulinshi = "100096"; //子托盘塑料 - 黑色
}
string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, skulinshi, endLocat);
if (string.IsNullOrEmpty(strMsg))
{
break;
}
//向WMS申请空托盘信息
else if (strMsg.Contains("-1")) // 申请空托盘失败
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo1}:申请空托盘失败!";
tasksMonitor.PalletNo = palletNo1;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo1);
}
else // 申请空托盘成功
{
//收到申请后给plc返回20
plc.SetPlcDBValue(1101, "Int", "20", "462.0", palletNo1);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo1);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo1}:申请空托盘", "人工处理/整托袋子入库交互工位28"); //C1口
}
}
else if (plcValue == "21")
{
// 不用管 plc处理中
break;
}
else if (plcValue == "22")
{
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:出库完成", "人工处理/整托袋子入库交互工位28"); //C1口
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "440.0"); // 托盘号
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "23");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
//收到22后 为plc确认货物到41工位 在任务明细中加入空托出库完成
// 写入wcs流程控制字 21
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请空托出库完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
tasksMonitor.EndLocat = "23";
tasksMonitor.Status = "2";
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口
}
}
}
else if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位", "人工处理/整托袋子入库交互工位28"); //C1口
//// 获取当前口批次信息
//DataRow[] conRows = dt.Select("Conveyor = 'D'");
//if (conRows.Length <= 0)
//{
// // 提示LED选择执行批次
// //LedDisplay(row["LedIP"].ToString(), "23工位", "入库前,请操作执行批次信息!", "停止入库\t");
// break;
//}
//DataRow conRow = conRows[0];
//// 将托盘绑定信息插存储到组托表
//model.LotNo = conRow["LotNo"].ToString();
//model.SupplierLot = conRow["SupplierLot"].ToString();
//model.SkuType = conRow["SkuType"].ToString(); // 桶类的PLC无法确认物料类型
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "468.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:23工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
}
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:入库中", "人工处理/整托袋子入库交互工位28"); //C1口
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "440.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "468.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "23";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位失败", "人工处理/整托袋子入库交互工位28"); //C1口
}
else if (plcValue == "140")
{
// 不用管
break;
}
#endregion
break;
case "33":
#region 33号工位(物料、空托盘垛)物料入库
palletNo = plc.GetPlcDBValue(1101, "String", "480.0"); // 托盘号
taskType = plc.GetPlcDBValue(1101, "Int", "504.0"); // 任务类型 10 入库 其它为出库
skuType = plc.GetPlcDBValue(1101, "Int", "506.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "509.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "510.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "512.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "514.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "518.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "519.0"); //缠膜状态
// 绑定托盘实体类
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.StationNum = "33";
model.PlcId = row["Id"].ToString();
if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务
{
//向WMS申请塑料子托盘垛
string endLocat = "33"; // 送货工位号
string skulinshi = "100097"; //子托盘木制 - 单面
if (model.SkuType == "23")
{
skulinshi = "100095"; //子托盘木制 - 双面
}
string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, skulinshi, endLocat);
if (string.IsNullOrEmpty(strMsg))
{
break;
}
//向WMS申请空托盘信息
else if (strMsg.Contains("-1")) // 申请空托盘失败
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo1}:申请空托盘失败!";
tasksMonitor.PalletNo = palletNo1;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo1);
}
else // 申请空托盘成功
{
//收到申请后给plc返回20
plc.SetPlcDBValue(1101, "Int", "20", "502.0", palletNo);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo1);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo1}:申请空托盘", "人工处理/整托袋子入库交互工位28"); //C1口
}
}
else if (plcValue == "21")
{
// 不用管 plc处理中
break;
}
else if (plcValue == "22")
{
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:出库完成", "人工处理/整托袋子入库交互工位28"); //C1口
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "480.0"); // 托盘号
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "33");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
//收到22后 为plc确认货物到41工位 在任务明细中加入空托出库完成
// 写入wcs流程控制字 21
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请空托出库完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
tasksMonitor.EndLocat = "33";
tasksMonitor.Status = "2";
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口
}
}
}
else if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位", "人工处理/整托袋子入库交互工位28"); //C1口
//// 获取当前口批次信息
//DataRow[] conRows = dt.Select("Conveyor = 'D'");
//if (conRows.Length <= 0)
//{
// // 提示LED选择执行批次
// LedDisplay(row["LedIP"].ToString(), "28工位 C1口", "入库前,请操作执行批次信息!", "停止入库\t");
// break;
//}
//DataRow conRow = conRows[0];
//// 将托盘绑定信息插存储到组托表
//model.LotNo = conRow["LotNo"].ToString();
//model.SupplierLot = conRow["SupplierLot"].ToString();
//model.SkuType = conRow["SkuType"].ToString(); // 桶类的PLC无法确认物料类型
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "508.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:33工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:入库中", "人工处理/整托袋子入库交互工位28"); //C1口
}
}
//LedDisplay(row["LedIP"].ToString(), "23工位", ledStr, row["Name"].ToString());
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "480.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "508.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "33";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位失败", "人工处理/整托袋子入库交互工位28"); //C1口
}
else if (plcValue == "140")
{
// 不用管
break;
}
#endregion
break;
case "41":
#region 41号工位(物料、空托盘垛)物料入库
palletNo = plc.GetPlcDBValue(1101, "String", "520.0"); // 托盘号
taskType = plc.GetPlcDBValue(1101, "Int", "544.0"); // 任务类型 10 入库 其它为出库
skuType = plc.GetPlcDBValue(1101, "Int", "546.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "549.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "550.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "552.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "554.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "558.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "559.0"); //缠膜状态
// 绑定托盘实体类
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.StationNum = "41";
model.PlcId = row["Id"].ToString();
model.SkuType = skuType;
if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务
{
//向WMS申请塑料子托盘垛
string endLocat = "41"; // 送货工位号
string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, "100099", endLocat);
if (string.IsNullOrEmpty(strMsg))
{
// 关闭设备连接
plc.ClosePlc();
break;
}
//向WMS申请空托盘信息
else if (strMsg.Contains("-1")) // 申请空托盘失败
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo1}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo1;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo1);
//_chat.Get();
// 关闭设备连接
plc.ClosePlc();
}
else // 申请空托盘成功
{
//收到申请后给plc返回20
plc.SetPlcDBValue(1101, "Int", "20", "542.0", palletNo1);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo1);
}
}
else if (plcValue == "21")
{
//收到申请后给plc返回20
//plc.SetPlcDBValue(1101, "Int", "0", "542.0");
// 不用管 plc处理中
break;
}
else if (plcValue == "22")
{
//物料到达出库位置 进行处理
palletNo = plc.GetPlcDBValue(1101, "String", "520.0"); // 托盘号
//获取出库任务
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo);
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
if (taskRow["Type"].ToString() == "1")
{
//修改任务状态 出库成功
wcsMySql.SetWCSTasks(palletNo, "2", "41");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsMySql.RequestTasks(taskReques);
if (bl)
{
//收到22后 为plc确认货物到41工位 在任务明细中加入空托出库完成
// 写入wcs流程控制字 21
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请空托出库完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
tasksMonitor.EndLocat = "41";
tasksMonitor.Status = "2";
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
}
}
else if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "548.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:41工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
}
//LedDisplay(row["LedIP"].ToString(), "41工位", ledStr, row["Name"].ToString());
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "520.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "548.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "41";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
else if (plcValue == "140")
{
// 不用管
break;
}
#endregion
break;
case "20":
#region 20号工位 物料入库
if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定
{
palletNo = plc.GetPlcDBValue(1101, "String", "560.0"); // 托盘号
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B1口", $"{palletNo}:申请储位", "吨袋入库B口 交互工位18"); //B口
taskType = plc.GetPlcDBValue(1101, "Int", "584.0"); // 任务类型
skuType = plc.GetPlcDBValue(1101, "Int", "586.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "589.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "590.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "592.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "594.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "598.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "599.0"); //缠膜状态
// 获取当前口批次信息
DataRow conRow = null;
var aa = dt;
if (skuType != "10" && skuType != "20" && skuType != "21")
{
conRow = dt.Select("Conveyor = 'B'")[0];
}
// 将托盘绑定信息插存储到组托表
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SkuType = skuType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus; //打带
model.WrappedStatus = wrappedStatus; //缠膜
model.IsBale = wrappedStatus; //裹包
model.IsBelt = packagingStatus; //打带
model.StationNum = "18";
if (skuType != "10" && skuType != "20" && skuType != "21")
{
//model.SkuType = conRow["SkuType"].ToString();
model.LotNo = conRow["LotNo"].ToString();
model.SupplierLot = conRow["SupplierLot"].ToString();
model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString());
}
model.PlcId = row["Id"].ToString();
// 向WMS申请储位信息
string endLocat = ""; // 取货工位号
string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat);
string ledStr = strMsg;
if (strMsg.Contains("-1")) // 申请储位失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(palletNo, "1", "");
// 写入目的工位
plc.SetPlcDBValue(1101, "Byte", endLocat, "588.0", palletNo);
// 写入wcs控制字流程100
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
if (inBl)
{
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:18工位====》" + endLocat + "工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B1口", $"{palletNo}:入库中", "吨袋入库B口 交互工位18"); //B口
//_chat.Get();
}
}
//LedDisplay(row["LedIP"].ToString(), "41工位", ledStr, row["Name"].ToString());
}
else if (plcValue == "110")
{
//读取托盘号
palletNo = plc.GetPlcDBValue(1101, "String", "560.0"); // 托盘号
//读取目标地址
string endLocat = plc.GetPlcDBValue(1101, "Byte", "588.0"); // 目标地址
// 写入wcs流程控制字 110
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo);
// 写入任务明细表
tasksMonitor.StartLocat = "18";
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B1口", "空闲中", "吨袋入库B口 交互工位18"); //B口
}
else if (plcValue == "120")
{
// 不用管 流程控制字为120时,代表输送线将托盘运往入库口;
break;
}
else if (plcValue == "130")
{
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo);
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B1口", $"{palletNo}:申请储位失败", "吨袋入库B口 交互工位18"); //B口
//_chat.Get();
}
else if (plcValue == "140")
{
// 不用管
break;
}
#endregion
break;
#endregion
#region 入库取货工位
case "2":
#region 1号跺机
if (plcValue == "200" || plcValue == "210")
{
// 获取任务信息
DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo);
palletNo = plc.GetPlcDBValue(1101, "String", "0.0"); // 托盘号
string plcStatus = "";
PlcIO plcDj = new PlcIO("192.168.8.10", 1, ref plcStatus);
if (plcStatus.Length > 0)
{
// 连接跺机失败 写入任务明细表
//tasksMonitor.StartLocat = "2";
//tasksMonitor.InteractiveMsg = "1号跺机连接失败!";
//tasksMonitor.PalletNo = palletNo;
//wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 连接剁机失败 写入log日志
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "1号跺机连接失败!");
break;
}
//else
//{
// PlcCounts(0, 1, "1号垛机 入库取货工位 连接2586");
//}
try
{
// 获取跺机当前状态
string djValue = plcDj.GetPlcDBValue(1101, "Int", "0.0");
if (djValue != "10")
{
//string djendLocat = dtdj.Rows[0]["EndLocat"].ToString();
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "1号跺机有任务稍后执行!");
// 跺机占用 写入任务明细表
//tasksMonitor.StartLocat = "2";
//tasksMonitor.InteractiveMsg = "1号跺机有任务稍后执行!";
//tasksMonitor.PalletNo = palletNo;
//tasksMonitor.EndLocat = djendLocat;
//wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "1号垛机 入库取货工位 断开2606");
break;
}
// 获取任务信息
DataTable dt02 = wcsMySql.GetWCSTasks("1", "0", palletNo);
if (plcValue == "220")
{
dt02 = wcsMySql.GetWCSTasks("1", "0", "");
}
if (dt02 == null || dt02.Rows.Count <= 0)
{
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "1号垛机 入库取货工位 断开2619");
break;
}
string endLocat = dt02.Rows[0]["EndLocat"].ToString();
//[] locats = endLocat.Split('-');
string pai = int.Parse(endLocat.Substring(0, 2)).ToString();
string lie = int.Parse(endLocat.Substring(2, 2)).ToString();
string ceng = int.Parse(endLocat.Substring(4, 2)).ToString();
string shen = int.Parse(endLocat.Substring(6, 2)).ToString();
#region 放货工位算法
//判断排是否为单数
if (int.Parse(pai) % 2 == 0) //双数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是双数 深度为1 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
else if (shen == "2") //深度为2
{
//排数是双数 深度为2 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
}
//判断是否为双数
else//单数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是单数 深度为1 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
else if (shen == "2") //深度为2
{
//排数是单数 深度为2 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
}
//判断是否大于8
if (int.Parse(pai) > 8)
{
pai = (int.Parse(pai) - 8).ToString();
}
//判断排数大于4
if (int.Parse(pai) > 4) //大于4
{
pai = (int.Parse(pai) - 4).ToString();
}
#endregion
// 向跺机写入托盘号
plcDj.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo);
// 向跺机写入取货地址
plcDj.SetPlcDBValue(1101, "Int", "2", "24.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", "28", "26.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", "13", "28.0", palletNo);
// 向跺机写入放货地址(储位地址)
plcDj.SetPlcDBValue(1101, "Int", pai, "30.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", lie, "32.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", ceng, "34.0", palletNo);
// 向跺机写入控制流程字
plcDj.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo);
// 向取货2工位写入流程控制字
plc.SetPlcDBValue(1101, "Int", "200", "22.0", palletNo);
if (plcValue == "200")
{
// 写入任务明细
tasksMonitor.StartLocat = "2";
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:2工位====》" + endLocat + "储位地址!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
//if (djValue == "0")
//{
// // 写入任务明细
// tasksMonitor.StartLocat = "2";
// tasksMonitor.InteractiveMsg = "垛机因异常停止重新下发任务";
// tasksMonitor.PalletNo = palletNo;
// tasksMonitor.EndLocat = endLocat;
// wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// // 通知任务界面任务已存在更新 请更新界面
// wSChat.AlarmInformation("1");
//}
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "1号垛机 入库取货工位 断开2709");
}
catch
{
plcDj.ClosePlc();
//PlcCounts(0, -1, "1号垛机 入库取货工位 断开2714");
}
}
#endregion
break;
case "6":
#region 2号跺机
if (plcValue == "200" || plcValue == "210")
{
//获取任务信息
DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo);
palletNo = plc.GetPlcDBValue(1101, "String", "80.0");
string plcStatus = "";
PlcIO plcDj = new PlcIO("192.168.8.20", 1, ref plcStatus);
if (plcStatus.Length > 0)
{
// 连接跺机失败 写入任务明细表
//tasksMonitor.StartLocat = "6";
//tasksMonitor.InteractiveMsg = "2号跺机连接失败!";
//tasksMonitor.PalletNo = palletNo;
//wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 连接剁机失败 写入log日志
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "2号跺机连接失败!");
break;
}
else
{
//PlcCounts(0, 1, "2号垛机 入库取货工位 连接2746");
}
try
{
// 获取跺机当前状态
string djValue = plcDj.GetPlcDBValue(1101, "Int", "0.0");
if (djValue != "10")
{
//string djendLocat = dtdj.Rows[0]["EndLocat"].ToString();
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "2号跺机有任务稍后执行!");
// 获取任务信息
//DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo);
//string djendLocat = dtdj.Rows[0]["EndLocat"].ToString();
//// 跺机占用 写入任务明细表
//tasksMonitor.StartLocat = "6";
//tasksMonitor.InteractiveMsg = "2号跺机有任务稍后执行!";
//tasksMonitor.PalletNo = palletNo;
//tasksMonitor.EndLocat = djendLocat;
//wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "2号垛机 入库取货工位 断开2772");
break;
}
DataTable dt02 = wcsMySql.GetWCSTasks("1", "0", palletNo);
if (plcValue == "220")
{
dt02 = wcsMySql.GetWCSTasks("1", "0", "");
}
if (dt02 == null || dt02.Rows.Count <= 0)
{
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "2号垛机 入库取货工位 断开2784");
break;
}
string endLocat = dt02.Rows[0]["EndLocat"].ToString();
//[] locats = endLocat.Split('-');
string pai = int.Parse(endLocat.Substring(0, 2)).ToString();
string lie = int.Parse(endLocat.Substring(2, 2)).ToString();
string ceng = int.Parse(endLocat.Substring(4, 2)).ToString();
string shen = int.Parse(endLocat.Substring(6, 2)).ToString();
#region 放货工位算法
//判断排是否为单数
if (int.Parse(pai) % 2 == 0) //双数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是双数 深度为1 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
else if (shen == "2") //深度为2
{
//排数是双数 深度为2 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
}
//判断是否为双数
else//单数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是单数 深度为1 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
else if (shen == "2") //深度为2
{
//排数是单数 深度为2 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
}
//判断是否大于8
if (int.Parse(pai) > 8)
{
pai = (int.Parse(pai) - 8).ToString();
}
//判断排数大于4
if (int.Parse(pai) > 4) //大于4
{
pai = (int.Parse(pai) - 4).ToString();
}
#endregion
// 向跺机写入托盘号
plcDj.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo);
// 向跺机写入取货地址
plcDj.SetPlcDBValue(1101, "Int", "2", "24.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", "28", "26.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", "13", "28.0", palletNo);
// 向跺机写入储位地址
// 向跺机写入放货地址(储位地址)
plcDj.SetPlcDBValue(1101, "Int", pai, "30.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", lie, "32.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", ceng, "34.0", palletNo);
// 向跺机写入控制流程字
plcDj.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo);
// 向取货工位写入流程控制字
plc.SetPlcDBValue(1101, "Int", "200", "102.0", palletNo);
if (plcValue == "200")
{
// 写入任务明细
tasksMonitor.StartLocat = "6";
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:6工位====》" + endLocat + "储位地址!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "2号垛机 入库取货工位 断开2877");
}
catch
{
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "2号垛机 入库取货工位 断开2884");
}
}
#endregion
break;
case "10":
#region 3号跺机
if (plcValue == "200" || plcValue == "210")
{
//获取任务信息
DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo);
palletNo = plc.GetPlcDBValue(1101, "String", "160.0");
string plcStatus = "";
PlcIO plcDj = new PlcIO("192.168.8.30", 1, ref plcStatus);
if (plcStatus.Length > 0)
{
// 连接跺机失败 写入任务明细表
//tasksMonitor.StartLocat = "10";
//tasksMonitor.InteractiveMsg = "3号跺机连接失败!";
//tasksMonitor.PalletNo = palletNo;
//wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 连接剁机失败 写入log日志
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "3号跺机连接失败!");
break;
}
//else
//{
// PlcCounts(0, 1, "3号垛机 入库取货工位 连接2918");
//}
try
{
// 获取跺机当前状态
string djValue = plcDj.GetPlcDBValue(1101, "Int", "0.0");
if (djValue != "10")
{
// 获取任务信息
//DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo);
//string djendLocat = dtdj.Rows[0]["EndLocat"].ToString();
//// 跺机占用 写入任务明细表
//tasksMonitor.StartLocat = "10";
//tasksMonitor.InteractiveMsg = "3号跺机有任务稍后执行!";
//tasksMonitor.PalletNo = palletNo;
//tasksMonitor.EndLocat = djendLocat;
//wcsMySql.AddWCSTasksMonitor(tasksMonitor);
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "3号跺机有任务稍后执行!");
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "3号垛机 入库取货工位 断开2944");
break;
}
DataTable dt02 = wcsMySql.GetWCSTasks("1", "0", palletNo);
if (plcValue == "220")
{
dt02 = wcsMySql.GetWCSTasks("1", "0", "");
}
if (dt02 == null || dt02.Rows.Count <= 0)
{
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "3号垛机 入库取货工位 断开2955");
break;
}
string endLocat = dt02.Rows[0]["EndLocat"].ToString();
//[] locats = endLocat.Split('-');
string pai = int.Parse(endLocat.Substring(0, 2)).ToString();
string lie = int.Parse(endLocat.Substring(2, 2)).ToString();
string ceng = int.Parse(endLocat.Substring(4, 2)).ToString();
string shen = int.Parse(endLocat.Substring(6, 2)).ToString();
#region 放货工位算法
//判断排是否为单数
if (int.Parse(pai) % 2 == 0) //双数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是双数 深度为1 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
else if (shen == "2") //深度为2
{
//排数是双数 深度为2 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
}
//判断是否为双数
else//单数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是单数 深度为1 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
else if (shen == "2") //深度为2
{
//排数是单数 深度为2 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
}
//判断是否大于8
if (int.Parse(pai) > 8)
{
pai = (int.Parse(pai) - 8).ToString();
}
//判断排数大于4
if (int.Parse(pai) > 4) //大于4
{
pai = (int.Parse(pai) - 4).ToString();
}
#endregion
// 向跺机写入托盘号
plcDj.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo);
// 向跺机写入取货地址
plcDj.SetPlcDBValue(1101, "Int", "2", "24.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", "28", "26.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", "13", "28.0", palletNo);
// 向跺机写入储位地址
// 向跺机写入放货地址(储位地址)
plcDj.SetPlcDBValue(1101, "Int", pai, "30.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", lie, "32.0", palletNo);
plcDj.SetPlcDBValue(1101, "Int", ceng, "34.0", palletNo);
// 向跺机写入控制流程字
plcDj.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo);
// 向取货工位写入流程控制字
plc.SetPlcDBValue(1101, "Int", "200", "182.0", palletNo);
if (plcValue == "200")
{
// 写入任务明细
tasksMonitor.StartLocat = "10";
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:10工位====》" + endLocat + "储位地址!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.EndLocat = endLocat;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
}
// 关闭设备连接
plcDj.ClosePlc();
//PlcCounts(0, -1, "3号垛机 入库取货工位 断开3047");
}
catch
{
plcDj.ClosePlc();
//PlcCounts(0, -1, "3号垛机 入库取货工位 断开3053");
}
}
#endregion
break;
#endregion
#region 出库放货工位
case "3":
string palletNo2 = "";
if (plcValue == "290")
{
// 获取托盘号
string readPallet = plc.GetPlcDBValue(1101, "String", "40.0");
palletNo2 = readPallet;
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", readPallet);
if (dt3.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error($"{readPallet}:当前托盘号不存在对应的任务", "跺机");
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
switch (taskRow["Type"].ToString())
{
case "1":
#region 出库任务
string num = ""; // 放货工位号
string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb, IsBeltDb, IsBaleDb;
DataTable dt4 = wcsMySql.GetWCSTasks("2", "0", readPallet, "", "111");
// 判断任务类型
DataRow taskRow1 = dt4.Rows[0];
num = "3"; //交互工位
palletDb = "50.0"; //托盘号
taskDb = "64.0"; //任务类型
skuTypeDb = "66.0"; //物料类型
isPalletNoDb = "69.0"; //子母托状态
skuNumDb = "70.0"; //物料数量
qtyDb = "72.0"; //拆垛数量
IsBeltDb = "78.0"; //打包状态
IsBaleDb = "79.0"; //缠膜状态
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'");
#region 判断物料信息
//获取绑定托盘信息
var paller = wcsMySql.GetWcsPalletBind(taskRow["PalletNo"].ToString());
paller["TaskType"] = "30";
//拆盘任务 母、木子、塑子托盘垛
if (paller["SkuType"].ToString() == "10" || paller["SkuType"].ToString() == "20" || paller["SkuType"].ToString() == "21" || paller["SkuType"].ToString() == "22" || paller["SkuType"].ToString() == "23")
{
paller["TaskType"] = "20";
}
//且不为拆盘任务
if (paller["TaskType"].ToString() != "20")
{
//不缠膜
if (taskRow["IsBale"].ToString() == "0")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61")
{
//判断托盘信息是否为未打包缠膜状态
if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口
paller["TaskType"] = "70";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//判断托盘明细是否存在打包状态
if (paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口
paller["TaskType"] = "50";
}
}
}
//缠膜
else if (taskRow["IsBale"].ToString() == "1")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
//缠膜不打包
//判断托盘信息是否为已缠膜
if (paller["IsBale"].ToString() == "0")
{
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//缠膜打包任务
///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜
if (paller["IsBale"].ToString() == "1")
{
//直接出库
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
else
{
//判断是否已打包
if (paller["IsBelt"].ToString() == "1")
{
//已打包 未缠膜 去缠膜出库
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
//未打包缠膜 去打包缠膜
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "60";
}
}
}
}
}
//判断目标工位是否为28
if (taskRow["EndLocat"].ToString() == "28")
{
paller["TaskType"] = "30";
}
//判断其它物料类型
//if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63")
//{
// paller["TaskType"] = "80"; //其它物料类型出库任务
//}
//判断其它物料类型
if (paller["skuType"].ToString() == "99")
{
paller["TaskType"] = "30"; //其它物料类型出库任务
}
//拆桶
else if (paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61" || paller["SkuType"].ToString() == "50")
{
//判断托盘信息是否为未打包缠膜状态
if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0")
{
paller["TaskType"] = "70";
}
}
//判断
if (!string.IsNullOrWhiteSpace(taskRow["IsStacking1"].ToString()))
{
if (paller["TaskType"].ToString() == "70" && taskRow["IsStacking1"].ToString() == "0")
{
paller["TaskType"] = "30";
}
}
if (paller["TaskType"].ToString() == "70" && taskRow1["StartLocat"].ToString() != "38")
{
paller["TaskType"] = "30";
}
#endregion
// 写入输送线放货工位指令
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb, readPallet); // 托盘号
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb, readPallet); // 任务类型
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb, readPallet); // 物料类型
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb, readPallet); // 是否字母托盘
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb, readPallet); // 物料数量
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBelt"].ToString(), IsBeltDb, readPallet); // 打包状态
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBale"].ToString(), IsBaleDb, readPallet); // 缠膜状态
//判断是否为拆桶任务
if (paller["TaskType"].ToString() == "70")
{
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb, readPallet); // 拆跺数量
}
bool inBl = plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString(), readPallet); //对应出库口输送线开始执行
if (inBl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{readPallet}:写入指令:当前工位正在输送到出库口;放货{num}工位===》出库口";
tasksMonitor.PalletNo = readPallet;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置
tasksMonitor.EndLocat = num; //目标工位
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", readPallet);
}
#endregion
break;
default:
break;
}
}
else if (plcValue == "300")
{
//收到300后给plc返回310
plc.SetPlcDBValue(1101, row["PosType"].ToString(), "310", "62.0", palletNo2);
break;
}
else if (plcValue == "310")
{
//不处理
break;
}
break;
case "7":
string palletNo3 = "";
if (plcValue == "290")
{
// 获取托盘号
string readPallet = plc.GetPlcDBValue(1101, "String", "120.0");
palletNo3 = readPallet;
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", readPallet);
if (dt3.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error($"{readPallet}:当前托盘号不存在对应的任务", "跺机");
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
switch (taskRow["Type"].ToString())
{
case "1":
#region 出库任务
string num = ""; // 放货工位号
string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb, IsBeltDb, IsBaleDb;
DataTable dt4 = wcsMySql.GetWCSTasks("2", "0", readPallet, "", "111");
// 判断任务类型
DataRow taskRow1 = dt4.Rows[0];
num = "7"; //交互工位
palletDb = "130.0"; //托盘号
taskDb = "144.0"; //任务类型
skuTypeDb = "146.0"; // 物料类型
isPalletNoDb = "149.0"; //子母托状态
skuNumDb = "150.0"; //物料数量
qtyDb = "152.0"; //拆垛数量
IsBeltDb = "158.0"; //打包状态
IsBaleDb = "159.0"; //缠膜状态
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'");
#region 判断物料信息
//获取绑定托盘信息
var paller = wcsMySql.GetWcsPalletBind(taskRow["PalletNo"].ToString());
paller["TaskType"] = "30";
//拆盘任务 母、木子、塑子托盘垛
if (paller["SkuType"].ToString() == "10" || paller["SkuType"].ToString() == "20" || paller["SkuType"].ToString() == "21" || paller["SkuType"].ToString() == "22" || paller["SkuType"].ToString() == "23")
{
paller["TaskType"] = "20";
}
//且不为拆盘任务
if (paller["TaskType"].ToString() != "20")
{
//不缠膜
if (taskRow["IsBale"].ToString() == "0")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61")
{
//判断托盘信息是否为未打包缠膜状态
if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口
paller["TaskType"] = "70";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//判断托盘明细是否存在打包状态
if (paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口
paller["TaskType"] = "50";
}
}
}
//缠膜
else if (taskRow["IsBale"].ToString() == "1")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
//缠膜不打包
//判断托盘信息是否为已缠膜
if (paller["IsBale"].ToString() == "0")
{
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//缠膜打包任务
///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜
if (paller["IsBale"].ToString() == "1")
{
//直接出库
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
else
{
//判断是否已打包
if (paller["IsBelt"].ToString() == "1")
{
//已打包 未缠膜 去缠膜出库
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
//未打包缠膜 去打包缠膜
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "60";
}
}
}
}
}
//判断目标工位是否为28
if (taskRow["EndLocat"].ToString() == "28")
{
paller["TaskType"] = "30";
}
//判断其它物料类型
//if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63")
//{
// paller["TaskType"] = "80"; //其它物料类型出库任务
//}
//判断其它物料类型
if (paller["skuType"].ToString() == "99")
{
paller["TaskType"] = "30"; //其它物料类型出库任务
}
//拆桶
else if (paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61" || paller["SkuType"].ToString() == "50")
{
//判断托盘信息是否为未打包缠膜状态
if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0")
{
paller["TaskType"] = "70";
}
}
//判断
if (!string.IsNullOrWhiteSpace(taskRow["IsStacking1"].ToString()))
{
if (paller["TaskType"].ToString() == "70" && taskRow["IsStacking1"].ToString() == "0")
{
paller["TaskType"] = "30";
}
}
if (paller["TaskType"].ToString() == "70" && taskRow1["StartLocat"].ToString() != "38")
{
paller["TaskType"] = "30";
}
#endregion
// 写入输送线放货工位指令
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb, readPallet); // 托盘号
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb, readPallet); // 任务类型
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb, readPallet); // 物料类型
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb, readPallet); // 是否字母托盘
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb, readPallet); // 物料数量
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBelt"].ToString(), IsBeltDb, readPallet); // 打包状态
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBale"].ToString(), IsBaleDb, readPallet); // 缠膜状态
//判断是否为拆桶任务
if (paller["TaskType"].ToString() == "70")
{
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb, readPallet); // 拆跺数量
}
bool inBl = plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString(), readPallet); //对应出库口输送线开始执行
if (inBl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{readPallet}:写入指令:当前工位正在输送到出库口;放货{num}工位===》出库口";
tasksMonitor.PalletNo = readPallet;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置
tasksMonitor.EndLocat = num; //目标工位
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", readPallet);
}
#endregion
break;
default:
break;
}
}
else if (plcValue == "300")
{
//收到300后给plc返回310
plc.SetPlcDBValue(1101, row["PosType"].ToString(), "310", "142.0", palletNo3);
break;
}
else if (plcValue == "310")
{
//不处理
break;
}
break;
case "11":
string palletNo4 = "";
if (plcValue == "290")
{
// 获取托盘号
string readPallet = plc.GetPlcDBValue(1101, "String", "200.0");
palletNo4 = readPallet;
DataTable dt3 = wcsMySql.GetWCSTasks("1", "", readPallet);
if (dt3.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error($"{readPallet}:当前托盘号不存在对应的任务", "跺机");
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
switch (taskRow["Type"].ToString())
{
case "1":
#region 出库任务
string num = ""; // 放货工位号
string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb, IsBeltDb, IsBaleDb;
DataTable dt4 = wcsMySql.GetWCSTasks("2", "0", readPallet, "", "111");
// 判断任务类型
DataRow taskRow1 = dt4.Rows[0];
num = "11"; //交互工位
palletDb = "210.0"; //托盘号
taskDb = "224.0"; //任务类型
skuTypeDb = "226.0"; // 物料类型
isPalletNoDb = "229.0"; //子母托状态
skuNumDb = "230.0"; //物料数量
qtyDb = "232.0"; //拆垛数量
IsBeltDb = "238.0"; //打包状态
IsBaleDb = "239.0"; //缠膜状态
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'");
#region 判断物料信息
//获取绑定托盘信息
var paller = wcsMySql.GetWcsPalletBind(taskRow["PalletNo"].ToString());
paller["TaskType"] = "30";
//拆盘任务 母、木子、塑子托盘垛
if (paller["SkuType"].ToString() == "10" || paller["SkuType"].ToString() == "20" || paller["SkuType"].ToString() == "21" || paller["SkuType"].ToString() == "22" || paller["SkuType"].ToString() == "23")
{
paller["TaskType"] = "20";
}
//且不为拆盘任务
if (paller["TaskType"].ToString() != "20")
{
//不缠膜
if (taskRow["IsBale"].ToString() == "0")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61")
{
//判断托盘信息是否为未打包缠膜状态
if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口
paller["TaskType"] = "70";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//判断托盘明细是否存在打包状态
if (paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口
paller["TaskType"] = "50";
}
}
}
//缠膜
else if (taskRow["IsBale"].ToString() == "1")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
//缠膜不打包
//判断托盘信息是否为已缠膜
if (paller["IsBale"].ToString() == "0")
{
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//缠膜打包任务
///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜
if (paller["IsBale"].ToString() == "1")
{
//直接出库
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
else
{
//判断是否已打包
if (paller["IsBelt"].ToString() == "1")
{
//已打包 未缠膜 去缠膜出库
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
//未打包缠膜 去打包缠膜
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "60";
}
}
}
}
}
//判断目标工位是否为28
if (taskRow["EndLocat"].ToString() == "28")
{
paller["TaskType"] = "30";
}
//判断其它物料类型
//if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63")
//{
// paller["TaskType"] = "80"; //其它物料类型出库任务
//}
//判断其它物料类型
if (paller["skuType"].ToString() == "99")
{
paller["TaskType"] = "30"; //其它物料类型出库任务
}
//拆桶
else if (paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61" || paller["SkuType"].ToString() == "50")
{
//判断托盘信息是否为未打包缠膜状态
if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0")
{
paller["TaskType"] = "70";
}
}
//判断
//判断
if (!string.IsNullOrWhiteSpace(taskRow["IsStacking1"].ToString()))
{
if (paller["TaskType"].ToString() == "70" && taskRow["IsStacking1"].ToString() == "0")
{
paller["TaskType"] = "30";
}
}
if (paller["TaskType"].ToString() == "70" && taskRow1["StartLocat"].ToString() != "38")
{
paller["TaskType"] = "30";
}
#endregion
// 写入输送线放货工位指令
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb, readPallet); // 托盘号
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb, readPallet); // 任务类型
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb, readPallet); // 物料类型
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb, readPallet); // 是否字母托盘
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb, readPallet); // 物料数量
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBelt"].ToString(), IsBeltDb, readPallet); // 打包状态
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBale"].ToString(), IsBaleDb, readPallet); // 缠膜状态
//判断是否为拆桶任务
if (paller["TaskType"].ToString() == "70")
{
plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb, readPallet); // 拆跺数量
}
bool inBl = plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString(), readPallet); //对应出库口输送线开始执行
if (inBl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{readPallet}:写入指令:当前工位正在输送到出库口;放货{num}工位===》出库口";
tasksMonitor.PalletNo = readPallet;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置
tasksMonitor.EndLocat = num; //目标工位
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", readPallet);
}
#endregion
break;
default:
break;
}
}
else if (plcValue == "300")
{
//收到300后给plc返回310
plc.SetPlcDBValue(1101, row["PosType"].ToString(), "310", "222.0",palletNo4);
break;
}
else if (plcValue == "310")
{
//不处理
break;
}
break;
#endregion
case "":
break;
default:
break;
}
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(ex.Message, "定时器错误");
throw ex;
}
}
///
/// 跺机业务处理
///
///
///
///
private static void BllHandlerDj(PlcIO plc, string plcValue, DataRow row)
{
try
{
//WebStocket发送消息
WSChatController wSChat = new WSChatController();
DALWcsMessage wcsSql = new DALWcsMessage();
WCSTasksMonitor tasksMonitor = new WCSTasksMonitor();
TaskReques taskReques = new TaskReques();
string palletNo = string.Empty;
string TargetAddre = string.Empty;
string InitialAddre = string.Empty;
string pai, lie, ceng, shen;
switch (plcValue)
{
case "10":
#region 出/移库
// 获取当前巷道所有任务
string stationNum = row["StationNum"].ToString();
DataTable dt2 = wcsSql.GetWCSTasks("0,5", "1,2", "", stationNum);
// 判断任务类型
//判断是否存在任务
if (dt2 == null || dt2.Rows.Count == 0)
{
// 写入log日志
//Logger logger = LogManager.GetCurrentClassLogger();
//logger.Error(stationNum + "当前巷道无出/移库", stationNum);
break;
}
DataRow taskRow1 = dt2.Rows[0];
switch (taskRow1["Type"].ToString())
{
//出库任务
case "1":
#region 出库任务
TargetAddre = dt2.Rows[0]["StartLocat"].ToString(); // 起始工位
//InitialAddre = dt2.Rows[0]["EndLocat"].ToString(); // 目标工位
palletNo = dt2.Rows[0]["PalletNo"].ToString(); // 托盘号
// 根据跺机号确认放货工位
string outStationNum = "3";
switch (stationNum)
{
case "R11":
outStationNum = "3";
break;
case "R12":
outStationNum = "7";
break;
case "R13":
outStationNum = "11";
break;
default: break;
}
// 读取放货工位状态
string plcStatus = "";
DataRow[] rows = PlcInfoDt.Select("Level = '2' and Type = '1' and StationNum = '" + outStationNum + "'");
PlcIO conveyorPLC = new PlcIO(rows[0]["PlcIP"].ToString(), 1, ref plcStatus);
if (plcStatus.Length > 0)
{
break;
}
//else
//{
// PlcCounts(1, 0, "出库任务 10 连接3187");
//}
try
{
// 交互plc
string conveyorValue = conveyorPLC.GetPlcDBValue(int.Parse(rows[0]["dbNumber"].ToString()), rows[0]["PosType"].ToString(), rows[0]["PlcPos"].ToString());
if (conveyorValue == "00" || conveyorValue == "10") // 放货工位空闲 可放货
{
if (int.Parse(outStationNum) > 0)
{
pai = int.Parse(TargetAddre.Substring(0, 2)).ToString();
lie = int.Parse(TargetAddre.Substring(2, 2)).ToString();
ceng = int.Parse(TargetAddre.Substring(4, 2)).ToString();
shen = int.Parse(TargetAddre.Substring(6, 2)).ToString();
#region 取货工位算法
//判断排是否为单数
if (int.Parse(pai) % 2 == 0) //双数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是双数 深度为1 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
else if (shen == "2") //深度为2
{
//排数是双数 深度为2 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
}
//判断是否为双数
else//单数
{
//判断深度为1 还是2
if (shen == "1") //深度为1
{
//排数是单数 深度为1 排数*2
pai = (int.Parse(pai) * 2).ToString();
}
else if (shen == "2") //深度为2
{
//排数是单数 深度为2 排数 * 2 - 1
pai = ((int.Parse(pai) * 2) - 1).ToString();
}
}
//判断是否大于8
if (int.Parse(pai) > 8)
{
pai = (int.Parse(pai) - 8).ToString();
}
//判断排数大于4
if (int.Parse(pai) > 4) //大于4
{
pai = (int.Parse(pai) - 4).ToString();
}
#endregion
}
else
{
// 起始储位地址为空,跳过 写入任务明细表
tasksMonitor.StartLocat = "";
tasksMonitor.InteractiveMsg = $"{palletNo}:起始储位为空!";
tasksMonitor.PalletNo = palletNo;
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//关闭连接
conveyorPLC.ClosePlc();
//PlcCounts(-1, 0, "出库任务 10 断开3261");
break;
}
// 写入托盘号
plc.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo);
// 起始 储位
plc.SetPlcDBValue(1101, "Int", pai, "24.0", palletNo);
plc.SetPlcDBValue(1101, "Int", lie, "26.0", palletNo);
plc.SetPlcDBValue(1101, "Int", ceng, "28.0", palletNo);
// 目标放货工位
plc.SetPlcDBValue(1101, "Int", "3", "30.0", palletNo);
plc.SetPlcDBValue(1101, "Int", "28", "32.0", palletNo);
plc.SetPlcDBValue(1101, "Int", "13", "34.0", palletNo);
// 写入跺机任务下发完成
plc.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo);
// 将出库任务待执行改为正在执行
wcsSql.SetWCSTasks(palletNo, "5", "");
//关闭连接
conveyorPLC.ClosePlc();
//PlcCounts(-1, 0, "出库任务 10 断开3285");
// 插入任务明细
// 任务明细实体类
tasksMonitor.TaskNo = dt2.Rows[0]["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}写入指令:{TargetAddre}储位====》{outStationNum}工位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = TargetAddre; //起始位置
tasksMonitor.EndLocat = outStationNum; //目标工位
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
////关闭连接
//conveyorPLC.ClosePlc();
//PlcCounts(-1, 0, "出库任务 10 断开3301");
}
else
{
//关闭连接
conveyorPLC.ClosePlc();
//PlcCounts(-1, 0, "出库任务 10 断开3311");
}
}
catch
{
conveyorPLC.ClosePlc();
//PlcCounts(-1, 0, "出库任务 10 断开3307");
}
#endregion
break;
//移库任务
case "2":
#region 移库任务
TargetAddre = dt2.Rows[0]["StartLocat"].ToString(); // 起始工位
InitialAddre = dt2.Rows[0]["EndLocat"].ToString(); // 目标工位
palletNo = dt2.Rows[0]["PalletNo"].ToString(); // 托盘号
#region 取货工位算法
string qpai = int.Parse(TargetAddre.Substring(0, 2)).ToString();
string qlie = int.Parse(TargetAddre.Substring(2, 2)).ToString();
string qceng = int.Parse(TargetAddre.Substring(4, 2)).ToString();
string qshen = int.Parse(TargetAddre.Substring(6, 2)).ToString();
//判断排是否为单数
if (int.Parse(qpai) % 2 == 0) //双数
{
//判断深度为1 还是2
if (qshen == "1") //深度为1
{
//排数是双数 深度为1 排数 * 2 - 1
qpai = ((int.Parse(qpai) * 2) - 1).ToString();
}
else if (qshen == "2") //深度为2
{
//排数是双数 深度为2 排数*2
qpai = (int.Parse(qpai) * 2).ToString();
}
}
//判断是否为双数
else//单数
{
//判断深度为1 还是2
if (qshen == "1") //深度为1
{
//排数是单数 深度为1 排数*2
qpai = (int.Parse(qpai) * 2).ToString();
}
else if (qshen == "2") //深度为2
{
//排数是单数 深度为2 排数 * 2 - 1
qpai = ((int.Parse(qpai) * 2) - 1).ToString();
}
}
//判断是否大于8
if (int.Parse(qpai) > 8)
{
qpai = (int.Parse(qpai) - 8).ToString();
}
//判断排数大于4
if (int.Parse(qpai) > 4) //大于4
{
qpai = (int.Parse(qpai) - 4).ToString();
}
#endregion
#region 放货工位算法
string fpai = int.Parse(InitialAddre.Substring(0, 2)).ToString();
string flie = int.Parse(InitialAddre.Substring(2, 2)).ToString();
string fceng = int.Parse(InitialAddre.Substring(4, 2)).ToString();
string fshen = int.Parse(InitialAddre.Substring(6, 2)).ToString();
//判断排是否为单数
if (int.Parse(fpai) % 2 == 0) //双数
{
//判断深度为1 还是2
if (fshen == "1") //深度为1
{
//排数是双数 深度为1 排数 * 2 - 1
fpai = ((int.Parse(fpai) * 2) - 1).ToString();
}
else if (fshen == "2") //深度为2
{
//排数是双数 深度为2 排数*2
fpai = (int.Parse(fpai) * 2).ToString();
}
}
//判断是否为双数
else//单数
{
//判断深度为1 还是2
if (fshen == "1") //深度为1
{
//排数是单数 深度为1 排数*2
fpai = (int.Parse(fpai) * 2).ToString();
}
else if (fshen == "2") //深度为2
{
//排数是单数 深度为2 排数 * 2 - 1
fpai = ((int.Parse(fpai) * 2) - 1).ToString();
}
}
//判断是否大于8
if (int.Parse(fpai) > 8)
{
fpai = (int.Parse(fpai) - 8).ToString();
}
//判断排数大于4
if (int.Parse(fpai) > 4) //大于4
{
fpai = (int.Parse(fpai) - 4).ToString();
}
#endregion
// 写入托盘号
plc.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo);
// 起始 储位
plc.SetPlcDBValue(1101, "Int", qpai, "24.0", palletNo);
plc.SetPlcDBValue(1101, "Int", qlie, "26.0", palletNo);
plc.SetPlcDBValue(1101, "Int", qceng, "28.0", palletNo);
// 目标放货工位
plc.SetPlcDBValue(1101, "Int", fpai, "30.0", palletNo);
plc.SetPlcDBValue(1101, "Int", flie, "32.0", palletNo);
plc.SetPlcDBValue(1101, "Int", fceng, "34.0", palletNo);
// 写入跺机任务下发完成
plc.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo);
// 将移库任务待执行改为正在执行
wcsSql.SetWCSTasks(palletNo, "5", "");
// 插入任务明细
// 任务明细实体类
tasksMonitor.TaskNo = dt2.Rows[0]["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:{TargetAddre}储位====》{InitialAddre}储位";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = TargetAddre; //起始位置
tasksMonitor.EndLocat = InitialAddre; //目标位置
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
#endregion
break;
default:
break;
}
//出库任务
if (dt2.Rows.Count != 0)
{
}
//空托盘出库
else
{
//DataTable dt4 = wcsSql.GetWCSSupallTasks("2", "0", "");
}
#endregion
break;
case "20": // 跺机正在执行任务 wcs不做处理
break;
case "30": // 跺机空取异常
#region 跺机空取异常
// 读取跺机托盘号
palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0");
if (string.IsNullOrWhiteSpace(palletNo))
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error($"{palletNo}:跺机空取异常,托盘号为空!", "跺机");
break;
}
// 写入流程控制字,结束当前任务
plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "30", "12.0", palletNo);
// 将当前任务状态标记为异常结束 并且调用WNS任务反馈接口
#endregion
break;
case "40": // 入库放货时 重放异常
#region 入库放货时 重放异常
// 读取跺机托盘号
palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0");
if (string.IsNullOrWhiteSpace(palletNo))
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error($"{palletNo}:跺机满入异常,托盘号为空!", "跺机");
break;
}
// 写入流程控制字,WCS收到堆垛机双重放货,正在重新分配任务
plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "40", "12.0", palletNo);
// 将当前任务状态标记为异常结束
// 并且调用WNS任务反馈接口获取新任务
// 插入到任务表
#endregion
break;
case "50": // 重放后 重新分配入库储位
#region 重放后 重新分配入库储位
palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0");
// 获取当前托盘新的任务
WCSPalletBind model = new WCSPalletBind();
// 获取重新分配的任务
string strMsg = wcsSql.GetLocation(palletNo, model, ref TargetAddre);
if (strMsg.Contains("-1"))
{
break;
}
// 重新写入
if (TargetAddre.Length > 0)
{
string[] addre = TargetAddre.Split('-');
pai = int.Parse(addre[1]).ToString();
lie = int.Parse(addre[2]).ToString();
ceng = int.Parse(addre[3]).ToString();
}
else
{
// 目标储位地址为空,跳过;
break;
}
// 重新写入目标放货工位
plc.SetPlcDBValue(100, "Int", pai, "30.0", palletNo);
plc.SetPlcDBValue(100, "Int", lie, "32.0", palletNo);
plc.SetPlcDBValue(100, "Int", ceng, "34.0", palletNo);
plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "50", "12.0", palletNo);
#endregion
break;
case "100": // 跺机任务完成
// 获取当天托盘对应的任务
palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0");
DataTable dt3 = wcsSql.GetWCSTasks("1,5", "", palletNo);
if (dt3.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(palletNo + ":当前托盘号不存在对应的任务", "跺机");
break;
}
// 判断任务类型
DataRow taskRow = dt3.Rows[0];
switch (taskRow["Type"].ToString())
{
case "0": // 入库任务
#region 入库任务
plc.SetPlcDBValue(1101, "Int", "100", "12.0", palletNo);
wcsSql.SetWCSTasks(palletNo, "2", "");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bl = wcsSql.RequestTasks(taskReques);
if (bl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString();
tasksMonitor.EndLocat = taskRow["EndLocat"].ToString();
tasksMonitor.Status = "2";
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
#endregion
break;
case "1": // 出库任务
#region 出库任务
// 从跺机获取巷道号
string roadway = taskRow["StartRoadway"].ToString();
string num = ""; // 放货工位号
//string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb;
//bool palletBool, taskBool, skuTypeBool, isPalletBool, skuNumBool, qtyBool, wcsBool;
//string readPallet, readTask, readSkuType, readIsPallet, readSkuNum, readQty, readWcs;
if (roadway == "R11")
{
num = "3"; //交互工位
//palletDb = "50.0"; //托盘号
//taskDb = "64.0"; //任务类型
//skuTypeDb = "66.0"; //物料类型
//isPalletNoDb = "69.0"; //子母托状态
//skuNumDb = "70.0"; //物料数量
//qtyDb = "72.0"; //拆垛数量
}
else if (roadway == "R12")
{
num = "7"; //交互工位
//palletDb = "130.0"; //托盘号
//taskDb = "144.0"; //任务类型
//skuTypeDb = "146.0"; // 物料类型
//isPalletNoDb = "149.0"; //子母托状态
//skuNumDb = "150.0"; //物料数量
//qtyDb = "152.0"; //拆垛数量
}
else
{
num = "11"; //交互工位
//palletDb = "210.0"; //托盘号
//taskDb = "224.0"; //任务类型
//skuTypeDb = "226.0"; // 物料类型
//isPalletNoDb = "229.0"; //子母托状态
//skuNumDb = "230.0"; //物料数量
//qtyDb = "232.0"; //拆垛数量
}
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'");
//string cStatus = "";
//PlcIO cPlc = new PlcIO(rows[0]["PlcIP"].ToString(), 1, ref cStatus);
//if (cStatus.Length > 0)
//{
// break;
//}
//else
//{
// //PlcCounts(1, 0, "出库任务 100 连接3638");
//}
try
{
#region 判断物料信息
/*
//获取绑定托盘信息
var paller = wcsSql.GetWcsPalletBind(taskRow["PalletNo"].ToString());
paller["TaskType"] = "30";
//拆盘任务 母、木子、塑子托盘垛
if (paller["SkuType"].ToString() == "10")
{
paller["TaskType"] = "20";
}
if (paller["SkuType"].ToString() == "20")
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "叠托机出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "20";
}
if (paller["SkuType"].ToString() == "21")
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "叠托机出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "20";
}
//且不为拆盘任务
if (paller["TaskType"].ToString() != "20")
{
//不缠膜
if (taskRow["IsBale"].ToString() == "0")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61")
{
//判断托盘信息是否为未打包缠膜状态
if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口
paller["TaskType"] = "70";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//判断托盘明细是否存在打包状态
if (paller["IsBelt"].ToString() == "0")
{
// Led提示给客户
//LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口
paller["TaskType"] = "50";
}
}
}
//缠膜
else if (taskRow["IsBale"].ToString() == "1")
{
//不打包
if (taskRow["IsBelt"].ToString() == "0")
{
//缠膜不打包
//判断托盘信息是否为已缠膜
if (paller["IsBale"].ToString() == "0")
{
// Led提示给客户
LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
}
//打包
if (taskRow["IsBelt"].ToString() == "1")
{
//缠膜打包任务
///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜
if (paller["IsBale"].ToString() == "1")
{
//直接出库
// Led提示给客户
//LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口
paller["TaskType"] = "30";
}
else
{
//判断是否已打包
if (paller["IsBelt"].ToString() == "1")
{
//已打包 未缠膜 去缠膜出库
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "40";
}
else
{
//未打包缠膜 去打包缠膜
// Led提示给客户
//LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口
paller["TaskType"] = "60";
}
}
}
}
}
//判断目标工位是否为28
if (taskRow["EndLocat"].ToString() == "28")
{
paller["TaskType"] = "30";
}
//判断其它物料类型
if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63")
{
paller["TaskType"] = "80"; //其它物料类型出库任务
}
//判断其它物料类型
//if (paller[skuType].ToString() == "99")
//{
// paller["TaskType"] = "30"; //其它物料类型出库任务
//}
//拆桶
else if (paller["SkuType"].ToString() == "51" && paller["SkuType"].ToString() == "61" && paller["SkuType"].ToString() == "50")
{
// Led提示给客户
LedDisplay("192.168.8.55", "38工位", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口
paller["TaskType"] = "70";
}*/
#endregion
/* // 写入输送线放货工位指令
palletBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb); // 托盘号
taskBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb); // 任务类型
skuTypeBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb); // 物料类型
isPalletBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb); // 是否字母托盘
skuNumBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb); // 物料数量
//判断是否为拆桶任务
if (paller["TaskType"].ToString() == "70")
{
qtyBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb); // 拆跺数量
//拆桶数量是否写入成功
if (qtyBool) { }
else
{
}
}*/
//wcsBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString()); //对应出库口输送线开始执行
#region 物料信息是否写入成功
/* //托盘号是否写入成功
if (palletBool) { }
else
{
//关闭连接
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前出库口托盘号写入失败");
cPlc.ClosePlc();
PlcCounts(-1, 0, "出库任务 100 断开3815");
break;
}
//任务类型是否写入成功
if (taskBool) { }
else
{
//关闭连接
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前出库口任务类型写入失败");
cPlc.ClosePlc();
PlcCounts(-1, 0, "出库任务 100 断开3815");
break;
}
//物料类型是否写入成功
if (skuTypeBool) { }
else
{
//关闭连接
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前出库口物料类型写入失败");
cPlc.ClosePlc();
PlcCounts(-1, 0, "出库任务 100 断开3815");
break;
}
//是否子母托是否写入成功
if (isPalletBool) { }
else
{
//关闭连接
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前出库口是否子母托写入失败");
cPlc.ClosePlc();
PlcCounts(-1, 0, "出库任务 100 断开3815");
break;
}
//物料数量是否写入成功
if (skuNumBool) { }
else
{
//关闭连接
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前出库口物料数量写入失败");
cPlc.ClosePlc();
PlcCounts(-1, 0, "出库任务 100 断开3815");
break;
}
//验证300是否写入成功
if (wcsBool) { }
else
{
//关闭连接
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前出库口300写入失败");
cPlc.ClosePlc();
PlcCounts(-1, 0, "出库任务 100 断开3815");
break;
}*/
#endregion
// 写入跺机wcs控制字流程100 返回垛机执行完成
bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo);
wcsSql.SetWCSTasks(palletNo, "1", "");
//关闭连接
//cPlc.ClosePlc();
//PlcCounts(-1, 0, "出库任务 100 断开3829");
if (inBl)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}写入指令:收到跺机放货完成;放货{num}工位===》出库口";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置
tasksMonitor.EndLocat = num; //目标工位
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
}
catch
{
//cPlc.ClosePlc();
//PlcCounts(-1, 0, "出库任务 100 断开3855");
}
#endregion
break;
case "2": // 移库任务
#region 移库任务
plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "100", "12.0", palletNo);
//修改任务状态
wcsSql.SetWCSTasks(palletNo, "2", "");
// 反馈给WMS
taskReques.taskNo = taskRow["TaskNo"].ToString();
taskReques.TaskType = taskRow["Type"].ToString();
taskReques.TaskStatus = taskRow["Status"].ToString();
bool bll = wcsSql.RequestTasks(taskReques);
if (bll)
{
// 写入任务明细表
tasksMonitor.TaskNo = taskRow["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = palletNo;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置
tasksMonitor.EndLocat = taskRow["EndLocat"].ToString(); //目标工位
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
wSChat.AlarmInformation("1", palletNo);
//_chat.Get();
}
#endregion
break;
default: break;
}
break;
default:
break;
}
}
catch (Exception ex)
{
throw ex;
}
}
///
/// Led屏展示信息
///
/// 地址
/// 上方区域
/// 中间区域
/// 底部区域
private static void LedDisplay(string ip, string top, string content, string foot)
{
try
{
LedDll Led = new LedDll();
Led.LEDstr(ip, top, content, foot);
}
catch { }
}
///
/// 定时器委托任务 调用的方法
///
///
///
public static void SetContent(object source, System.Timers.ElapsedEventArgs e)
{
if (m_bRuning)
{
//return; // Parallel.For 并行for
m_bRuning = false;
PlcIO plc = new PlcIO("10.8.115.209", 1, ref plcSatu); // 输送线
PlcIO plcDJ = new PlcIO("10.8.115.200", 1, ref plcDjSatu); // 跺机
try
{
LedDll Led = new LedDll();
DALWcsMessage wcsSql = new DALWcsMessage();
if (wcsSql.GetIsWcsAutoDB1()) // 自动模式 两个服务器连接程序切换
{
if (plcSatu.Length > 0 && plcDjSatu.Length > 0)
{
LedTopStr = "连接PLC失败,请检查网络状态!";
LedFootStr = "网络故障! ";
Led.SetOnlyLed("ABC", "提示", LedTopStr, LedFootStr);
return; // 连接失败,结束
}
string Palno = "";
string FromPai = "", FromLie = "", FromCeng = "";
string EndPai = "", EndLie = "", EndCeng = "";
#region 入库
// 读取三个入库口;判断是否有托盘;判断当前口是否有正在执行的出库任务
#region A口
// 申请工位
string plc2Values = plc.GetPlcDBValue(600, "Int", "30.0");
switch (plc2Values)
{
case "0":
// 恢复默认状态;
plc.SetPlcDBValue(600, "Int", "0", "32.0","");
break;
case "100": // 申请入库
Palno = plc.GetPlcDBValue(600, "String", "46.0");
if (Palno != null)
{
// 向plc写入已读取到托盘码
plc.SetPlcDBValue(600, "Int", "110", "32.0", "");
// 读取托盘高度
string height = plc.GetPlcDBValue(600, "Int", "36.0");
if (height == "799")
{
if (!Palno.Contains("A1"))
{
height = "0";
Led.SetOnlyLed("A1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 ");
}
}
else if (height == "801")
{
string heightType = Palno.Substring(0, 2);
switch (heightType)
{
case "A2":
height = "1499";
break;
case "A3":
height = "1999";
break;
default:
height = "0";
Led.SetOnlyLed("A1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 ");
break;
}
}
if (height == "0")
{
break;
}
// 调用wms接口获取储位地址,并将入库任务存储到任务表
string str = wcsSql.GetLocation(Palno, height, "01");
LedTopStr = str;
LedFootStr = "正常运行 ";
if (str.Contains("-S1"))
{
LedFootStr = "托盘退回 ";
// 申请储位错误,向plc写入退回指令 liudl
plc.SetPlcDBValue(600, "Int", "131", "32.0", "");
}
Led.SetOnlyLed("A1", "申请库位", LedTopStr, LedFootStr);
}
break;
case "120":
// if 查询任务表,判断是否存在当前口的出库任务
DataTable dt = wcsSql.GetWmsTasks("1", "out");
if (dt != null)
{
// 若存在出库或有退回的托盘跳过;
// 等待出库任务完成或非法托盘退回后再执行入库任务。
if (dt.Rows[0]["InitialAddre"].ToString() == "1")
{
break;
}
}
else
{
DataTable dt1 = wcsSql.GetWmsTasks("0", "in");
if (dt1 != null)
{
// 判断wms是否分配储位
if (dt1.Rows[0]["TargetAddre"].ToString().Length > 0)
{
// 是
// 向PLC写入任务 托盘由01位到04位 改变流程字
plc.SetPlcDBValue(600, "Int", "2", "42.0", "");
plc.SetPlcDBValue(600, "Int", "4", "44.0", "");
plc.SetPlcDBValue(600, "Int", "130", "32.0", "");
// 将入库任务由等待执行改为正在执行;
wcsSql.SetWmsTasks(dt1.Rows[0]["Palno"].ToString(), "1");
Led.SetOnlyLed("A1", "执行入库", LedTopStr, LedFootStr);
}
}
else
{
// 否
// 向plc写入wms流程字131
plc.SetPlcDBValue(600, "Int", "131", "32.0", "");
Led.SetOnlyLed("A1", "执行退回", LedTopStr, LedFootStr);
}
};
break;
case "140":
// 任务交互完毕 向plc写入wms流程字 0
plc.SetPlcDBValue(600, "Int", "0", "32.0", "");
break;
case "141":
// 任务交互完毕 向plc写入wms流程字 0
plc.SetPlcDBValue(600, "Int", "0", "32.0", "");
break;
default:
break;
}
// 取货工位
string plc4Values = plc.GetPlcDBValue(600, "Int", "90.0");
switch (plc4Values)
{
case "200":
// 恢复默认状态;
plc.SetPlcDBValue(600, "Int", "0", "92.0", "");
break;
case "150":
Palno = plc.GetPlcDBValue(600, "String", "106.0");
DataTable dt2 = wcsSql.GetWmsTasks("1", "in", Palno);
string pai = "", lie = "", ceng = "";
if (dt2 != null)
{
string addrestr = dt2.Rows[0]["TargetAddre"].ToString();
if (addrestr.Length > 0)
{
string[] addre = addrestr.Split('-');
pai = int.Parse(addre[1]).ToString();
lie = int.Parse(addre[2]).ToString();
ceng = int.Parse(addre[3]).ToString();
}
else
{
// 目标储位地址为空,跳过;
break;
}
}
else
{
break;
}
string djtype = plcDJ.GetPlcDBValue(100, "Int", "0.0");
if (djtype == "820") // 判断跺机是否空闲
{
// 向跺机写入库任务
plcDJ.SetPlcDBValue(100, "Int", "10", "4.0", ""); // 任务类型
plcDJ.SetPlcDBValue(100, "Int", "1", "6.0", ""); // 取货口 1=A口 2=B口 3=C口
// 起始
plcDJ.SetPlcDBValue(100, "Int", "2", "12.0", "");
plcDJ.SetPlcDBValue(100, "Int", "1", "14.0","");
plcDJ.SetPlcDBValue(100, "Int", "1", "16.0","");
// 目标
plcDJ.SetPlcDBValue(100, "Int", pai, "18.0", "");
plcDJ.SetPlcDBValue(100, "Int", lie, "20.0","");
plcDJ.SetPlcDBValue(100, "Int", ceng, "22.0", "");
Palno = dt2.Rows[0]["Palno"].ToString(); ;
plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", "");
// 向plc写入WMS流程字
plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", "");
plc.SetPlcDBValue(600, "Int", "160", "92.0", "");
}
;
break;
default: break;
}
#endregion
#region B口
// 申请工位
string plc11Values = plc.GetPlcDBValue(600, "Int", "300.0");
switch (plc11Values)
{
case "0":
// 恢复默认状态;
plc.SetPlcDBValue(600, "Int", "0", "302.0", "");
break;
case "100": // 申请入库
Palno = plc.GetPlcDBValue(600, "String", "316.0");
if (Palno != null)
{
// 向plc写入已读取到托盘码
plc.SetPlcDBValue(600, "Int", "110", "302.0", "");
// 读取托盘高度
string height = plc.GetPlcDBValue(600, "Int", "306.0");
if (height == "799")
{
if (!Palno.Contains("A1"))
{
height = "0";
Led.SetOnlyLed("B1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 ");
}
}
else if (height == "801")
{
string heightType = Palno.Substring(0, 2);
switch (heightType)
{
case "A2":
height = "1499";
break;
case "A3":
height = "1999";
break;
default:
height = "0";
Led.SetOnlyLed("B1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 ");
break;
}
}
if (height == "0")
{
break;
}
// 先判断当前托盘是否已生成入库任务
string lstr = wcsSql.IsTaskMonitor(Palno);
if (lstr != "")
{
wcsSql.SetWmsTasks(Palno, "0");
LedTopStr = lstr;
LedFootStr = "正常运行 ";
Led.SetOnlyLed("B1", "再次申请库位", LedTopStr, LedFootStr);
break;
}
// 调用wms接口获取储位地址,并将入库任务存储到任务表
string str = wcsSql.GetLocation(Palno, height, "02");
LedTopStr = str;
LedFootStr = "正常运行 ";
if (str.Contains("-S1"))
{
// 申请储位错误,向plc写入退回指令 liudl
plc.SetPlcDBValue(600, "Int", "131", "302.0", "");
LedFootStr = "托盘退回 ";
}
Led.SetOnlyLed("B1", "申请库位", LedTopStr, LedFootStr);
}
break;
case "120":
// if 查询任务表,判断是否存在当前口的出库任务
DataTable dt = wcsSql.GetWmsTasks("1", "out");
if (dt != null)//|| plc03 != "0" || plc04 != "200")
{
// 若存在出库或有退回的托盘跳过;等待出库任务完成或非法托盘退回后在执行入库任务。
if (dt.Rows[0]["InitialAddre"].ToString() == "2")
{
break;
}
}
else
{
DataTable dt1 = wcsSql.GetWmsTasks("0", "in");
if (dt1 != null)
{
// 判断wms是否分配储位
if (dt1.Rows[0]["TargetAddre"].ToString().Length > 0)
{
// 是
// 向PLC写入任务 托盘由11工位到12工位 改变流程字
plc.SetPlcDBValue(600, "Int", "11", "342.0", "");
plc.SetPlcDBValue(600, "Int", "12", "344.0","");
plc.SetPlcDBValue(600, "Int", "130", "302.0", "");
// 将入库任务由等待执行改为正在执行;
wcsSql.SetWmsTasks(dt1.Rows[0]["Palno"].ToString(), "1");
Led.SetOnlyLed("B1", "执行入库", LedTopStr, LedFootStr);
}
}
else
{
// 否
// 向plc写入wms流程字131
plc.SetPlcDBValue(600, "Int", "131", "302.0", "");
Led.SetOnlyLed("B1", "执行退回", LedTopStr, LedFootStr);
}
};
break;
case "140":
// 任务交互完毕 向plc写入wms流程字 0
plc.SetPlcDBValue(600, "Int", "0", "302.0", "");
break;
case "141":
// 任务交互完毕 向plc写入wms流程字 0
plc.SetPlcDBValue(600, "Int", "0", "302.0", "");
break;
default:
break;
}
// 取货工位
string plc12Values = plc.GetPlcDBValue(600, "Int", "330.0");
switch (plc12Values)
{
case "200":
// 恢复默认状态;
plc.SetPlcDBValue(600, "Int", "0", "332.0", "");
break;
case "150":
Palno = plc.GetPlcDBValue(600, "String", "346.0");
DataTable dt2 = wcsSql.GetWmsTasks("1", "in", Palno);
string pai = "", lie = "", ceng = "";
if (dt2 != null)
{
string addrestr = dt2.Rows[0]["TargetAddre"].ToString();
if (addrestr.Length > 0)
{
string[] addre = addrestr.Split('-');
pai = int.Parse(addre[1]).ToString();
lie = int.Parse(addre[2]).ToString();
ceng = int.Parse(addre[3]).ToString();
}
else
{
// 目标储位地址为空,跳过;
break;
}
}
else
{
break;
}
string djtype = plcDJ.GetPlcDBValue(100, "Int", "0.0");
if (djtype == "820") // 判断跺机是否空闲
{
// 向跺机写入库任务
plcDJ.SetPlcDBValue(100, "Int", "10", "4.0", ""); // 任务类型
plcDJ.SetPlcDBValue(100, "Int", "2", "6.0", ""); // 取货口 1=A口 2=B口 3=C口
// 起始
plcDJ.SetPlcDBValue(100, "Int", "2", "12.0", "");
plcDJ.SetPlcDBValue(100, "Int", "43", "14.0", "");
plcDJ.SetPlcDBValue(100, "Int", "1", "16.0", "");
// 目标
plcDJ.SetPlcDBValue(100, "Int", pai, "18.0", "");
plcDJ.SetPlcDBValue(100, "Int", lie, "20.0", "");
plcDJ.SetPlcDBValue(100, "Int", ceng, "22.0", "");
Palno = dt2.Rows[0]["Palno"].ToString();
plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", "");
// 向plc写入WMS流程字
plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", "");
plc.SetPlcDBValue(600, "Int", "160", "332.0", "");
};
break;
default: break;
}
#endregion
#region C口
// 取货工位
string plc19Values = plc.GetPlcDBValue(600, "Int", " 540.0");
switch (plc19Values)
{
case "0":
// 恢复默认状态;
plc.SetPlcDBValue(600, "Int", "0", "542.0", "");
break;
case "100": // 申请入库
Palno = plc.GetPlcDBValue(600, "String", "556.0");
if (Palno != null)
{
// 向plc写入已读取到托盘码
plc.SetPlcDBValue(600, "Int", "110", "542.0", "");
// 读取托盘高度
string height = plc.GetPlcDBValue(600, "Int", "546.0");
if (height == "799")
{
if (!Palno.Contains("C1"))
{
height = "0";
Led.SetOnlyLed("C1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 ");
}
}
else if (height == "801")
{
string heightType = Palno.Substring(0, 2);
switch (heightType)
{
case "A2":
height = "1499";
break;
case "A3":
height = "0";
Led.SetOnlyLed("C1", "申请库位", "禁止进入2米托盘,请从别的口进!", "停止申请库位 ");
break;
default:
height = "0";
Led.SetOnlyLed("C1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 ");
break;
}
}
if (height == "0")
{
break;
}
// 调用wms接口获取储位地址,并将入库任务存储到任务表
string str = wcsSql.GetLocation(Palno, height, "01");
LedTopStr = str;
LedFootStr = "正常运行 ";
if (str.Contains("-S1"))
{
LedFootStr = "托盘退回 ";
// 申请储位错误,向plc写入退回指令 liudl
plc.SetPlcDBValue(600, "Int", "131", "542.0", "");
}
Led.SetOnlyLed("C1", "申请库位", LedTopStr, LedFootStr);
}
break;
case "120":
// if 查询任务表,判断是否存在当前口的出库任务
DataTable dt = wcsSql.GetWmsTasks("3", "out");
if (dt != null)
{
// 若存在出库或有退回的托盘跳过;
// 等待出库任务完成或非法托盘退回后再执行入库任务。
if (dt.Rows[0]["InitialAddre"].ToString() == "3")
{
break;
}
}
else
{
DataTable dt1 = wcsSql.GetWmsTasks("0", "in");
if (dt1 != null)
{
// 判断wms是否分配储位
if (dt1.Rows[0]["TargetAddre"].ToString().Length > 0)
{
// 是
// 向PLC写入任务 托盘由01位到04位 改变流程字
plc.SetPlcDBValue(600, "Int", "19", "552.0", "");
plc.SetPlcDBValue(600, "Int", "14", "554.0", "");
plc.SetPlcDBValue(600, "Int", "130", "572.0", "");
// 将入库任务由等待执行改为正在执行;
wcsSql.SetWmsTasks(dt1.Rows[0]["Palno"].ToString(), "1");
Led.SetOnlyLed("C1", "执行入库", LedTopStr, LedFootStr);
}
}
else
{
// 否
// 向plc写入wms流程字131
plc.SetPlcDBValue(600, "Int", "131", "542.0", "");
Led.SetOnlyLed("C1", "执行退回", LedTopStr, LedFootStr);
}
};
break;
case "140":
// 任务交互完毕 向plc写入wms流程字 0
plc.SetPlcDBValue(600, "Int", "0", "542.0", "");
break;
case "141":
// 任务交互完毕 向plc写入wms流程字 0
plc.SetPlcDBValue(600, "Int", "0", "542.0", "");
break;
default:
break;
}
// 取货工位
string plc14Values = plc.GetPlcDBValue(600, "Int", "390.0");
switch (plc14Values)
{
case "200":
// 恢复默认状态;
plc.SetPlcDBValue(600, "Int", "0", "392.0", "");
break;
case "150":
Palno = plc.GetPlcDBValue(600, "String", "406.0");
DataTable dt2 = wcsSql.GetWmsTasks("1", "in", Palno);
string pai = "", lie = "", ceng = "";
if (dt2 != null)
{
string addrestr = dt2.Rows[0]["TargetAddre"].ToString();
if (addrestr.Length > 0)
{
string[] addre = addrestr.Split('-');
pai = int.Parse(addre[1]).ToString();
lie = int.Parse(addre[2]).ToString();
ceng = int.Parse(addre[3]).ToString();
}
else
{
// 目标储位地址为空,跳过;
break;
}
}
else
{
break;
}
string djtype = plcDJ.GetPlcDBValue(100, "Int", "0.0");
if (djtype == "820") // 判断跺机是否空闲
{
// 向跺机写入库任务
plcDJ.SetPlcDBValue(100, "Int", "10", "4.0", ""); // 任务类型
plcDJ.SetPlcDBValue(100, "Int", "3", "6.0", ""); // 取货口 1=A口 2=B口 3=C口
// 起始
plcDJ.SetPlcDBValue(100, "Int", "1", "12.0", "");
plcDJ.SetPlcDBValue(100, "Int", "29", "14.0", "");
plcDJ.SetPlcDBValue(100, "Int", "1", "16.0", "");
// 目标
plcDJ.SetPlcDBValue(100, "Int", pai, "18.0", "");
plcDJ.SetPlcDBValue(100, "Int", lie, "20.0", "");
plcDJ.SetPlcDBValue(100, "Int", ceng, "22.0", "");
Palno = dt2.Rows[0]["Palno"].ToString(); ;
plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", "");
// 向plc写入WMS流程字
plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", "");
plc.SetPlcDBValue(600, "Int", "160", "392.0", "");
}
;
break;
default: break;
}
#endregion
#endregion
#region 跺机
string DJValues = plcDJ.GetPlcDBValue(100, "Int", "0.0");
string taskTyoe = plcDJ.GetPlcDBValue(100, "Int", "4.0"); // 获取任务类型
switch (DJValues)
{
case "820":
#region 出库
// 获取待执行出库任务
DataTable dt2 = wcsSql.GetWmsTasks("0", "out");
if (dt2 != null)
{
// 根据任务出库口判断目标出库口是否存在入库任务
string TargetAddre = dt2.Rows[0]["TargetAddre"].ToString(); // 目标出库口
string InitialAddre = dt2.Rows[0]["InitialAddre"].ToString(); // 起始储位
Palno = dt2.Rows[0]["Palno"].ToString(); // 托盘号
// 获取取货工位是否空闲 非空闲跳出
if (TargetAddre == "01") // A口
{
string plc4Value = plc.GetPlcDBValue(600, "Int", "90.0");
string plc02 = plc.GetPlcDBValue(600, "Int", "30.0");
string plc03 = plc.GetPlcDBValue(600, "Int", "60.0");
if (plc4Value != "200" || plc02 != "0" || plc03 != "0")
{
break;
}
EndPai = "2"; EndLie = "1"; EndCeng = "1";
LedTopStr = "托盘号:" + Palno + "由库位:" + InitialAddre + "运至:A口;";
LedFootStr = "执行取货! ";
Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr);
}
else if (TargetAddre == "02") // B口
{
string plc12Value = plc.GetPlcDBValue(600, "Int", "330.0");
if (plc12Value != "200")
{
break;
}
EndPai = "2"; EndLie = "43"; EndCeng = "1";
LedTopStr = "托盘号:" + Palno + "由库位:" + InitialAddre + "运至:B口;";
LedFootStr = "执行取货! ";
Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr);
}
else if (TargetAddre == "03") // C口
{
string plc14Value = plc.GetPlcDBValue(600, "Int", "390.0");
if (plc14Value != "200")
{
break;
}
EndPai = "1"; EndLie = "29"; EndCeng = "1";
LedTopStr = "托盘号:" + Palno + "由库位:" + InitialAddre + "运至:C口;";
LedFootStr = "执行取货! ";
Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr);
}
bool bl = wcsSql.GetTasks(TargetAddre, "in"); // 获取指定出库口入库任务
if (bl) // 没有入库任务
{
string pai1 = "", lie1 = "", ceng1 = "";
if (InitialAddre.Length > 0)
{
string[] addre = InitialAddre.Split('-');
pai1 = int.Parse(addre[1]).ToString();
lie1 = int.Parse(addre[2]).ToString();
ceng1 = int.Parse(addre[3]).ToString();
}
else
{
// 起始储位地址为空,跳过;
break;
}
// 向跺机下发任务
// 向跺机写入库任务
plcDJ.SetPlcDBValue(100, "Int", "11", "4.0", ""); // 10:入库 11:出库
plcDJ.SetPlcDBValue(100, "Int", int.Parse(TargetAddre).ToString(), "6.0", ""); // 取货口 1=A口 2=B口 3=C口
// 起始
plcDJ.SetPlcDBValue(100, "Int", pai1, "12.0", "");
plcDJ.SetPlcDBValue(100, "Int", lie1, "14.0","");
plcDJ.SetPlcDBValue(100, "Int", ceng1, "16.0", "");
// 目标
plcDJ.SetPlcDBValue(100, "Int", EndPai, "18.0", "");
plcDJ.SetPlcDBValue(100, "Int", EndLie, "20.0","");
plcDJ.SetPlcDBValue(100, "Int", EndCeng, "22.0", "");
plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", "");
//// 向plc写入WMS流程字
plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", "");
if (TargetAddre == "01") // A口
{
plc.SetPlcDBValue(600, "Int", "210", "92.0", "");
}
else if (TargetAddre == "02") // B口
{
plc.SetPlcDBValue(600, "Int", "210", "332.0", "");
}
else if (TargetAddre == "03") // C口
{
plc.SetPlcDBValue(600, "Int", "210", "392.0", "");
}
// 将出库任务待执行改为正在执行
wcsSql.SetWmsTasks(Palno, "1");
}
}
#endregion
; break;
case "840": // 跺机通知cs取货完成
switch (taskTyoe)
{
case "10": // 入库
string quhuokou = plcDJ.GetPlcDBValue(100, "Int", "6.0");
if (quhuokou == "1")
{
string pclvalue = plc.GetPlcDBValue(600, "Int", "90.0");
if (pclvalue == "170")
{
plc.SetPlcDBValue(600, "Int", "180", "92.0", "");
}
}
else if (quhuokou == "2")
{
// 验证输送线上一个流程字
string pclvalue = plc.GetPlcDBValue(600, "Int", "330.0");
if (pclvalue == "170")
{
plc.SetPlcDBValue(600, "Int", "180", "332.0", "");
}
}
else if (quhuokou == "3")
{
string pclvalue = plc.GetPlcDBValue(600, "Int", "390.0");
if (pclvalue == "170")
{
plc.SetPlcDBValue(600, "Int", "180", "392.0", "");
}
};
// 给跺机写入取货完成
plcDJ.SetPlcDBValue(100, "Int", "850", "2.0", "");
break;
case "11": // 出库
plcDJ.SetPlcDBValue(100, "Int", "850", "2.0", "");
LedFootStr = "取货完成! ";
Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr);
break;
}
break;
case "860": // 跺机通知cs放货完成
switch (taskTyoe)
{
case "10": // 入库
// 更改入库任务状态;
Palno = plcDJ.GetPlcDBValue(100, "String", "24.0"); // 获取托盘号
string pai = plcDJ.GetPlcDBValue(100, "Int", "18.0"); // 获取目标排
string lie = plcDJ.GetPlcDBValue(100, "Int", "20.0"); // 获取目标列
string ceng = plcDJ.GetPlcDBValue(100, "Int", "22.0"); // 获取目标层
if (wcsSql.SetWmsTasks(Palno, "3"))
{
// 调用wms接口上架完成
wcsSql.WcsinWms(Palno, "QH-" + pai + "-" + lie.PadLeft(2, '0') + "-" + ceng.PadLeft(2, '0'), "1");
plcDJ.SetPlcDBValue(100, "Int", "880", "2.0", "");
LedFootStr = "入库完成! ";
string rukukou = plcDJ.GetPlcDBValue(100, "Int", "6.0");
string acd = "";
if (rukukou == "1")
{
acd = "A1";
}
else if (rukukou == "2")
{
acd = "B1";
}
else if (rukukou == "3")
{
acd = "C1";
};
Led.SetOnlyLed(acd, "入库任务", "托盘号:" + Palno + "\n目标库位:QH-" + pai + "-" + lie.PadLeft(2, '0') + "-" + ceng.PadLeft(2, '0'), LedFootStr);
}
; break;
case "11": // 出库
Palno = plcDJ.GetPlcDBValue(100, "String", "24.0"); // 获取托盘号
FromPai = plcDJ.GetPlcDBValue(100, "Int", "12.0"); // 获取起始排
FromLie = plcDJ.GetPlcDBValue(100, "Int", "14.0"); // 获取起始列
FromCeng = plcDJ.GetPlcDBValue(100, "Int", "16.0"); // 获取起始层
// 通知输送线卸货完成
string quhuokou = plcDJ.GetPlcDBValue(100, "Int", "6.0");
if (quhuokou == "1")
{
plc.SetPlcDBValue(600, "Int", "230", "92.0", "");
}
else if (quhuokou == "2")
{
plc.SetPlcDBValue(600, "Int", "230", "332.0", "");
}
else if (quhuokou == "3")
{
plc.SetPlcDBValue(600, "Int", "230", "392.0", "");
};
if (wcsSql.SetWmsTasks(Palno, "3"))
{
// 调用wms接口 出库完成
wcsSql.WcsinWms(Palno, "QH-" + FromPai + "-" + FromLie.PadLeft(2, '0') + "-" + FromCeng.PadLeft(2, '0'), "2");
string logStr = $"托盘号:{Palno};库位地址:QH-{FromPai}-{FromLie.PadLeft(2, '0')}-{FromCeng.PadLeft(2, '0')}";
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(logStr, "记录log:");
// 跺机状态写入卸货完成
plcDJ.SetPlcDBValue(100, "Int", "880", "2.0", "");
LedFootStr = "出库完成! ";
Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr);
}; break;
}; break;
case "902": // 取货不可执行(取内库位,外库位有货)
// led屏幕显示报警信息
;
break;
case "903": // 卸货不可执行 满入
// led屏幕显示报警信息
;
break;
case "904": // 取货不可执行 空取
// led屏幕显示报警信息
;
break;
default:
break;
}
#endregion
#region 通知/报警
// 循环读取所有报警信息
bool plcDjBl = false;
bool plcBl = false;
try
{
bool[] djBls = plcDJ.GetPlcMBValues("3000.0"); // 读取垛机报警信息
bool[] Bls = plc.GetPlcMBValues("3000.0"); // 读取输送线报警信息
DataRow[] djRows = AlarmDt.Select("IPAddre = '跺机'");
for (int i = 0; i < djRows.Length; i++)
{
if (djBls[i] == true)
{
plcDjBl = true;
// 验证当前报警信息是否已存在
if (wcsSql.GetErrorMessage(djRows[i]["M"].ToString()))
{
continue;
}
// 发送到LED屏幕运行状态区域
string Mstr = djRows[i]["AlarmStr"].ToString();
//string AccessCode = djRows[i]["AccessCode"].ToString();
//Led.SetMstrLeds(AccessCode, Mstr);
//try
//{
// //Led.SetOnlyLed("ABC", "报警", LedTopStr, "跺机报警");
//}
//catch { }
// 将报警信息存储到Table
wcsSql.SetErrorMessage("跺机报警", djRows[i]["M"].ToString(), Mstr);
// 读取M点报警信息;通知前端刷新
WSChatController wSChat = new WSChatController();
wSChat.AlarmInformation("跺机报警:" + Mstr, "");
}
}
DataRow[] ssxRows = AlarmDt.Select("IPAddre = '输送线'");
for (int i = 0; i < Bls.Length; i++)
{
if (Bls[i] == true)
{
plcBl = true;
// 验证当前报警信息是否已存在
if (wcsSql.GetErrorMessage(ssxRows[i]["M"].ToString()))
{
continue;
}
// 发送到LED屏幕运行状态区域
string Mstr = ssxRows[i]["AlarmStr"].ToString();
string AccessCode = ssxRows[i]["AccessCode"].ToString();
//Led.SetMstrLeds(AccessCode, Mstr);
try
{
//if (LedFootStr.Contains("A"))
//{
// Led.SetOnlyLed("A1", "消息", LedTopStr, AccessCode + "口输送线报警!");
// Led.SetOnlyLed("A2", "消息", LedTopStr, AccessCode + "口输送线报警!");
//}
//else if (LedFootStr.Contains("B"))
//{
// Led.SetOnlyLed("B1", "消息", LedTopStr, AccessCode + "口输送线报警!");
//}
//else if (LedFootStr.Contains("C"))
//{
// Led.SetOnlyLed("C1", "消息", LedTopStr, AccessCode + "口输送线报警!");
// Led.SetOnlyLed("C2", "消息", LedTopStr, AccessCode + "口输送线报警!");
//}
}
catch { }
// 将报警信息存储到Table
wcsSql.SetErrorMessage("输送线报警", ssxRows[i]["M"].ToString(), Mstr);
// 读取M点报警信息;通知前端刷新
WSChatController wSChat = new WSChatController();
wSChat.AlarmInformation("输送线报警:" + Mstr, "");
}
}
if (!plcDjBl && !plcBl)
{
// 删除所有报警信息
wcsSql.DelErrorMessage();
if (LedFootStr.Contains("报警"))
{
//Led.SetOnlyLed("ABC", "报警恢复", "", "");
}
}
}
catch { }
#endregion
}
else // 手动模式
{
}
#region 单个报警信息 liudl Edit 效率太低放弃
//foreach (DataRow row in AlarmDt.Rows)
//{
// // 改为for的并循环
// string Mstr = string.Empty;
// string vluestr = string.Empty;
// switch (row["IPAddre"].ToString())
// {
// case "跺机":
// vluestr = plcDJ.GetPlcMBValue("Bit", row["M"].ToString());
// if (vluestr == "True")
// {
// plcDjBl = true;
// // 发送到LED屏幕运行状态区域
// Mstr = row["AlarmStr"].ToString();
// string AccessCode = row["AccessCode"].ToString();
// Led.SetMstrLeds(AccessCode, Mstr);
// // 将报警信息存储到Table
// wcsSql.SetErrorMessage("跺机报警", row["M"].ToString(), Mstr);
// // 读取M点报警信息;通知前端刷新
// WSChatController wSChat = new WSChatController();
// wSChat.AlarmInformation("跺机报警:" + Mstr);
// };
// break;
// case "输送线":
// vluestr = plc.GetPlcMBValue("Bit", row["M"].ToString());
// if (vluestr == "True")
// {
// plcBl = true;
// // 发送到LED屏幕运行状态区域
// Mstr = row["AlarmStr"].ToString();
// string AccessCode = row["AccessCode"].ToString();
// Led.SetMstrLeds(AccessCode, Mstr);
// // 将报警信息存储到Table
// wcsSql.SetErrorMessage("输送线报警", row["M"].ToString(), Mstr);
// // 读取M点报警信息;通知前端刷新
// //WSChatController wSChat = new WSChatController();
// //wSChat.AlarmInformation("输送线报警:" + Mstr);
// };
// break;
// default:; break;
// }
//}
//if (!plcDjBl && !plcBl)
//{
// // 删除所有报警信息
// wcsSql.DelErrorMessage();
//}
#endregion
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(ex.Message, "定时器错误");
}
finally
{
// 关闭连接
plc.ClosePlc();
plcDJ.ClosePlc();
m_bRuning = true;
}
}
}
///
/// 应用池回收的时候调用的方法
///
public static void SetContent(string type)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(type + "执行该方法:", "iis自动回收机制");
}
///
/// 空托盘垛出入库输送线
///
///
///
public static void TrayConveyor(object source, System.Timers.ElapsedEventArgs e)
{
try
{
if (IsRunConveyor)
{
IsRunConveyor = false;
#region 与PLC交互逻辑
// 获取运输线交互IP集合
DataRow[] iProws = PlcInfoDt.Select("Level = '0' and Type = '1' ");
// 循环连接运输线设备
foreach (DataRow ipRow in iProws)
{
// 连接运输线PlC
string plcIp = ipRow["PlcIP"].ToString();
string plcStatus = ""; // PLC连接状态
PlcIO plc = new PlcIO(plcIp, 1, ref plcStatus);
if (plcStatus.Length > 0)
{
// 通知前端设备监控画面连接PLC失败
WSChatController wSChat = new WSChatController();
wSChat.AlarmInformation("连接设备失败:" + ipRow["Name"].ToString(), "");
// LED显示连连接失败
LedDll Led = new LedDll();
Led.LEDstr(ipRow["LedIP"].ToString(), "提示", "连接不上PLC,请检查网络连接!", ipRow["Name"].ToString());
}
// 循环各工位与PLC进行交互
DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and PlcIP='{plcIp}' ");
foreach (DataRow row in rows)
{
// 读取工位流程字
string dbNumber = row["DbNumber"].ToString();
string posType = row["PosType"].ToString();
string plcPos = row["PlcPos"].ToString();
string wcsPos = row["WcsPos"].ToString();
string stationNum = row["StationNum"].ToString();
string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
//判断工位是否为23、33、41
if (stationNum == "23" || stationNum == "33" || stationNum == "41")
{
// 判断该工位是否有任务 0 空闲 为20申请空托盘
if (plcValue == "0")
{
continue;
}
else
{
TrayConveyorHandler(plc, plcValue, row);
}
}
}
// 关闭设备连接
plc.ClosePlc();
}
IsRunConveyor = true;
#endregion
}
}
catch (Exception ex)
{
IsRunConveyor = true;
throw ex;
}
}
///
/// 空托盘垛申请运输线业务处理函数
///
/// PLC连接
/// PLC控制字
/// 工位信息
private static void TrayConveyorHandler(PlcIO plc, string plcValue, DataRow row)
{
try
{
DALWcsMessage wcsMySql = new DALWcsMessage();
DataTable dt = wcsMySql.GetWCSConveyorInfo();
string palletNo = ""; // 托盘号
string taskType = ""; // 任务类型
string skuType = ""; // 物料类型
string subPallet = ""; // 有无子托盘 0无 1有
string skuQty = ""; // 物料数量
string disQty = ""; // 拆跺数量
string skuWeight = ""; // 物料重量
string packagingStatus = ""; //打包状态
string wrappedStatus = ""; //缠膜状态
// 托盘绑定实体类
WCSPalletBind model = new WCSPalletBind();
// 任务明细实体类
WCSTasksMonitor tasksMonitor = new WCSTasksMonitor();
tasksMonitor.TaskNo = "";
tasksMonitor.PlcId = int.Parse(row["Id"].ToString());
tasksMonitor.PlcName = row["Name"].ToString();
tasksMonitor.Status = "2"; // 执行完成
switch (row["StationNum"].ToString())
{
#region 申请空托盘垛
case "23":
#region 23工位申请空托盘垛出库
//palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号
//taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库
//skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型
//subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有
//skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量
//disQty = plc.GetPlcDBValue(1101, "Byte", "431.0"); // 拆跺数量
//skuWeight = plc.GetPlcDBValue(1101, "Real", "432.0"); // 物料重量
//packagingStatus = plc.GetPlcDBValue(1101, "Byte", "436.0"); //打包状态
//wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "437.0"); //缠膜状态
//// 绑定托盘实体类
//model.PalletNo = palletNo;
//model.TaskType = taskType;
//model.SubPallet = subPallet;
//model.SkuQty = int.Parse(skuQty);
//model.SkuWeight = skuWeight;
//model.PackagingStatus = packagingStatus;
//model.WrappedStatus = wrappedStatus;
//model.IsBale = packagingStatus;
//model.IsBelt = wrappedStatus;
//model.StationNum = "23";
//model.PlcId = row["Id"].ToString();
if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务
{
//向WMS申请塑料子托盘垛
string endLocat = "23"; // 送货工位号
string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, "100098", endLocat);
string ledStr = strMsg;
//向WMS申请空托盘信息
if (strMsg.Contains("-1")) // 申请空托盘失败
{
// 写入wcs控制字流程120
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), "");
// 写入任务明细表
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = $"{palletNo1}:申请库内空托盘失败!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
}
else // 申请空托盘成功
{
//收到申请后给plc返回20
plc.SetPlcDBValue(1101, "Int", "20", "462.0", "");
var arr = strMsg.Split(',');
//string duoji = "0";
}
}
else if (plcValue == "21")
{
// 不用管 plc处理中
break;
}
else if (plcValue == "22")
{
//收到22后 为plc确认货物到23工位 在任务明细中加入空托出库完成
// 写入wcs流程控制字 130
plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), "");
tasksMonitor.StartLocat = model.StationNum;
tasksMonitor.InteractiveMsg = "PLC接收到申请空托出库完成!";
tasksMonitor.PalletNo = palletNo;
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
}
#endregion
break;
case "33":
#region 33工位申请空托盘垛出库
palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号
taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库
skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "431.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "432.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "436.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "437.0"); //缠膜状态
// 绑定托盘实体类
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus;
model.WrappedStatus = wrappedStatus;
model.IsBale = packagingStatus;
model.IsBelt = wrappedStatus;
model.StationNum = "33";
model.PlcId = row["Id"].ToString();
#endregion
break;
case "41":
#region 41工位申请空托盘垛出库
palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号
taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库
skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型
subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有
skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量
disQty = plc.GetPlcDBValue(1101, "Byte", "431.0"); // 拆跺数量
skuWeight = plc.GetPlcDBValue(1101, "Real", "432.0"); // 物料重量
packagingStatus = plc.GetPlcDBValue(1101, "Byte", "436.0"); //打包状态
wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "437.0"); //缠膜状态
// 绑定托盘实体类
model.PalletNo = palletNo;
model.TaskType = taskType;
model.SubPallet = subPallet;
model.SkuQty = int.Parse(skuQty);
model.SkuWeight = skuWeight;
model.PackagingStatus = packagingStatus;
model.WrappedStatus = wrappedStatus;
model.IsBale = packagingStatus;
model.IsBelt = wrappedStatus;
model.StationNum = "41";
model.PlcId = row["Id"].ToString();
#endregion
break;
#endregion
}
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(ex.Message, "定时器错误");
throw ex;
}
}
///
/// 垛机输送线连接次数
///
/// 输送线
/// 垛机
/// 错误位置
private static void PlcCounts(int SsxNum, int DjNum, string mes)
{
try
{
Logger logger = LogManager.GetCurrentClassLogger();
if (SsxNum != 0)
{
PlcSsxNums += SsxNum;
if (SsxNum == 1)
{
logger.Error("当前PLC输送线连接数:" + PlcSsxNums.ToString() + ",连接位置:" + mes);
}
else if (SsxNum == -1)
{
logger.Error("当前PLC输送线连接数:" + PlcSsxNums.ToString() + ",断开位置:" + mes);
}
}
else if (DjNum != 0)
{
PlcDjNums += DjNum;
if (DjNum == 1)
{
logger.Error("当前PLC垛机连接数:" + PlcDjNums.ToString() + ",连接位置:" + mes);
}
else if (DjNum == -1)
{
logger.Error("当前PLC垛机连接数:" + PlcDjNums.ToString() + ",断开位置:" + mes);
}
}
//if (Num == -1)
//{
// logger.Error("当前PLC断开连接:" + PlcSsxNums.ToString());
// logger.Error("当前PLC连接数:" + PlcSsxNums.ToString());
//}
//else
//{
// logger.Error("当前PLC连接成功:" + PlcSsxNums.ToString());
//}
}
catch
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前PLC输送线连接数(异常):" + PlcSsxNums.ToString() + ",异常位置:" + mes);
logger.Error("当前PLC垛机连接数(异常):" + PlcDjNums.ToString() + ",异常位置:" + mes);
}
}
}
}