using BLL;
using BLL.DAL;
using Commom.DotNetDevices;
using ICSharpCode.SharpZipLib.Zip;
using Microsoft.AspNet.SignalR.Hosting;
using Model;
using Model.MessageModel;
using Newtonsoft.Json;
using NLog;
using System;
using System.Data;
using System.Text;
using wms.Controllers;
using wms.Task;
namespace wms.Task
{
public class PlcInteraction
{
///
/// 托盘输送线交互(自动模式) PlcIO plc,string ipStr
///
public void ConveyorsInteraction2(DataRow row, DataTable PlcInfoDt, PlcIO plc, PlcIO plcDj1, PlcIO plcDj2)
{
try
{
string plcStatus = "";
DALWcsMessage wcsMySql = new DALWcsMessage();
WSChatController wSChat = new WSChatController();
DataRow[] plcRows = PlcInfoDt.Select($"Level = '2' and PlcIP={row["Id"].ToString()} ");
foreach (DataRow plcRow in plcRows)
{
string PalletNo = "", EndLocat = "", TaskNo = "", plcValue = "";
// 读取工位流程字
string dbNumber = plcRow["DbNumber"].ToString();//DB块值
string posType = plcRow["PosType"].ToString();//流程字类型
string plcPos = plcRow["PlcPos"].ToString();//plc流程字值
string wcsPos = plcRow["WcsPos"].ToString();
string stationNum = plcRow["StationNum"].ToString();//工位
plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
// 无流程的工位跳出
if (plcValue == "0")
{
continue;
}
// 读取当前工位各偏移量值
DataTable posDt = wcsMySql.GetPlcPos(plcRow["Id"].ToString());
DataRow posRosPlcPallet = posDt.Select($"Name = 'PlcPalletNo' ")[0];// 托盘号
PalletNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRosPlcPallet["PosType"].ToString(), posRosPlcPallet["PlcPos"].ToString());
DataRow posRosPlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号
TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRosPlcTask["PosType"].ToString(), posRosPlcTask["PlcPos"].ToString());
WCSTasksMonitor tasksMonitor = new WCSTasksMonitor();
switch (plcValue)
{
case "820": // 申请储位
#region 入库取货工位
//LED屏幕显示申请信息
LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "申请储位", "托盘号:" + PalletNo);
string strMsg = "";
if (TaskAction.tuoji)
{
// 向WMS申请储位信息
strMsg = wcsMySql.GetLocations(PalletNo, stationNum, ref EndLocat, ref TaskNo);
}
else
{
//需判断一下是否为叠拖机工位
// WCS自申请储位
strMsg = wcsMySql.GetWcsLocations(PalletNo, stationNum, ref EndLocat, ref TaskNo);
}
if (strMsg.Contains("-1")) // 申请储位失败
{
var strMsg2 = strMsg.Substring(2);
//LED屏幕显示申请失败信息
LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "申请储位", "托盘号:" + PalletNo + "申请储位失败," + strMsg2 + " ");
//托盘号
var posRos103 = posDt.Select($"Name = 'PalletNo' ")[0];
var a10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos103["PosType"].ToString(), PalletNo, posRos103["PlcPos"].ToString());
if (a10)
{
plc.SetPlcDBValue(int.Parse(dbNumber), posType, "11", wcsPos, true);
}
break;
}
else // 申请储位成功
{
//修改任务状态为正在执行
wcsMySql.SetWCSTasks(PalletNo, "1", "", TaskNo);
// 写入起始工位
var posRos101 = posDt.Select($"Name = 'StartLocatNo' ")[0];
var a10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos101["PosType"].ToString(), stationNum, posRos101["PlcPos"].ToString());
// 写入目的工位
var posRos102 = posDt.Select($"Name = 'EndLocatNo' ")[0];
var b10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos102["PosType"].ToString(), EndLocat, posRos102["PlcPos"].ToString());
//写入托盘号
var posRos103 = posDt.Select($"Name = 'PalletNo' ")[0];// 托盘号
var c10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos103["PosType"].ToString(), PalletNo, posRos103["PlcPos"].ToString());
//写入任务号
var posRos104 = posDt.Select($"Name = 'TaskNo' ")[0];
var d10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos104["PosType"].ToString(), TaskNo, posRos104["PlcPos"].ToString());
if (a10 && b10 && c10 && d10)
{
// 写入wcs控制字流程10
bool inBl10 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "10", wcsPos, true);
if (inBl10)//判断是否写入成功
{
// 写入任务明细表
tasksMonitor.TaskNo = TaskNo;
tasksMonitor.StartLocat = stationNum;
tasksMonitor.InteractiveMsg = $"写入指令:{stationNum}====》{EndLocat}工位";
tasksMonitor.PalletNo = PalletNo;
tasksMonitor.EndLocat = EndLocat;
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());//工位ID
tasksMonitor.PlcName = plcRow["Text"].ToString(); //工位描述
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
//通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
// Led提示给客户
LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "入库中" + $"储位地址:{strMsg}", "托盘号:" + PalletNo);
}
}
}
#endregion
break;
case "860": // 到达出库口
#region 出库完成
DataTable dt20 = wcsMySql.GetWCSTasks("1", "1", "", "", TaskNo);
if (dt20 == null || dt20.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前托盘号不存在对应的任务", "跺机");
break;
}
// 判断任务类型
DataRow taskRow20 = dt20.Rows[0];
var posRosWcsTask = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号
var a20 = plc.SetPlcDBValue(int.Parse(dbNumber), posRosWcsTask["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRosWcsTask["PlcPos"].ToString());
if (a20)
{
//写入plc控制字
plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true);
wcsMySql.SetWCSTasks("", "2", "", TaskNo);
// 反馈给WMS
TaskReques taskReques = new TaskReques();
taskReques.taskNo = taskRow20["TaskNo"].ToString();
taskReques.TaskType = taskRow20["Type"].ToString();
taskReques.TaskStatus = taskRow20["Status"].ToString();
bool inBl20 = wcsMySql.RequestTasks(taskReques);
if (inBl20)
{
string roadway = taskRow20["StartRoadway"].ToString();
string num = ""; // 放货工位号
if (roadway == "R01")
{
num = "11"; //交互工位
}
else if (roadway == "R02")
{
num = "7"; //交互工位
}
//修改储位信息 任务类型 执行状态 起始位置 目标位置
wcsMySql.EditLocaetStatus("1", "2", taskRow20["StartLocat"].ToString(), "");
// 写入任务明细表
tasksMonitor.TaskNo = taskRow20["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());
tasksMonitor.PlcName = plcRow["Text"].ToString();
tasksMonitor.InteractiveMsg = $"任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = taskRow20["PalletNo"].ToString();
tasksMonitor.StartLocat = num;
tasksMonitor.EndLocat = taskRow20["EndLocat"].ToString();
tasksMonitor.Status = "2";
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
}
LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "出完成" + $"储位地址:{taskRow20["StartLocat"].ToString()}", "托盘号:" + taskRow20["PalletNo"].ToString());
}
#endregion
break;
case "100": // 堆垛机可以取货
case "320": // 组盘完成
// 读取托盘号
// 向WMS申请储位(带着托箱支关系)
// 向PLC写入流程字
; break;
#region 入库取货处理
// 查询当前托盘对应的任务
DataTable dt100 = wcsMySql.GetWCSTasks("1", "0", "", "", TaskNo);
if (dt100 == null || dt100.Rows.Count <= 0)
{
break;
}
DataRow taskRow100 = dt100.Rows[0];
string EndRoadway = taskRow100["EndRoadway"].ToString();
// 根据任务判断目标巷道确认跺机
string dJIP100 = "";
PlcIO plcDj = plcDj1;
if (EndRoadway == "R01")
{
dJIP100 = "192.168.21.30";
plcDj = plcDj1;
}
else if (EndRoadway == "R02")
{
dJIP100 = "192.168.21.40";
plcDj = plcDj2;
}
else
{
break;
}
var s = wcsMySql.GetPlcIps();
DataRow plcIp = s.Select($"IP = '{dJIP100}' ")[0];
DataRow plcIpRow = PlcInfoDt.Select($"Level = '0' and PlcIP={plcIp["Id"].ToString()} ")[0];
// 获取跺机当前状态
string djValue = plcDj.GetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), plcIpRow["PosType"].ToString(), plcIpRow["PlcPos"].ToString());
if (djValue != "10")
{
Logger logger = LogManager.GetLogger("LogFile1");
logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + taskRow100["TaskNo"].ToString() + "跺机有任务稍后执行!");
break;
}
DataTable posDjDt = wcsMySql.GetPlcPos(plcIpRow["Id"].ToString());
DataRow posDjRos1 = posDjDt.Select($"Name = 'TaskNo' ")[0];// 任务号
DataRow posDjRos2 = posDjDt.Select($"Name = 'PalletNo' ")[0];// 托盘号
DataRow posDjRos3 = posDjDt.Select($"Name = 'StartRow' ")[0];// 起始排
DataRow posDjRos4 = posDjDt.Select($"Name = 'StartColumn' ")[0];// 起始列
DataRow posDjRos5 = posDjDt.Select($"Name = 'StartLayer' ")[0];// 起始层
DataRow posDjRos6 = posDjDt.Select($"Name = 'EndRow' ")[0];// 目的排
DataRow posDjRos7 = posDjDt.Select($"Name = 'EndColumn' ")[0];// 目的层
DataRow posDjRos8 = posDjDt.Select($"Name = 'EndLayer' ")[0];// 目的层
string endLocat = taskRow100["EndLocat"].ToString();
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();
#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();
//}
//判断排数大于2
if (int.Parse(pai) > 2) //大于4
{
pai = (int.Parse(pai) - 2).ToString();
}
#endregion
// 向跺机写入任务号
var a100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos1["PosType"].ToString(), taskRow100["TaskNo"].ToString(), posDjRos1["PlcPos"].ToString());
// 向跺机写入托盘号
var b100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos2["PosType"].ToString(), taskRow100["PalletNo"].ToString(), posDjRos2["PlcPos"].ToString());
// 向跺机写入取货地址
var c100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos3["PosType"].ToString(), "2", posDjRos3["PlcPos"].ToString());
var d100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos4["PosType"].ToString(), "100", posDjRos4["PlcPos"].ToString());
var e100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos5["PosType"].ToString(), "1", posDjRos5["PlcPos"].ToString());
// 向跺机写入放货地址(储位地址)
var f100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos6["PosType"].ToString(), pai, posDjRos6["PlcPos"].ToString());
var g100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos7["PosType"].ToString(), lie, posDjRos7["PlcPos"].ToString());
var h100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos8["PosType"].ToString(), ceng, posDjRos8["PlcPos"].ToString());
if (a100 && b100 && c100 && d100 && e100 && f100 && g100 && h100)
{
// 向跺机写入控制流程字
var bl = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), plcIpRow["PosType"].ToString(), "10", plcIpRow["WcsPos"].ToString(), true);
if (bl)
{
// 写入任务明细
tasksMonitor.TaskNo = taskRow100["TaskNo"].ToString();
tasksMonitor.StartLocat = stationNum;
tasksMonitor.InteractiveMsg = $"写入指令:{stationNum}工位====》" + endLocat + "储位地址!";
tasksMonitor.PalletNo = taskRow100["PalletNo"].ToString();
tasksMonitor.EndLocat = endLocat;
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());//工位ID
tasksMonitor.PlcName = plcRow["Text"].ToString(); //工位描述
tasksMonitor.Status = "2";
wcsMySql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
}
}
#endregion
break;
case "120":// 扫描到箱码
; break;
case "130"://请求拆垛
//获取托盘信息
var cdpallno = posDt.Select($"Name = 'PalletNo' ")[0].ToString();//托盘号
DataTable cdinfo = wcsMySql.GetWCSTasks("", "", cdpallno, "", "");
var cdno = cdinfo.Rows[0]["拆垛箱数"].ToString();//拆垛箱数
var SkuNo = cdinfo.Rows[0]["SkuNo"].ToString();
var dx = wcsMySql.GetWCSDX(SkuNo);//垛型
//向PLC写入当前托盘需拆箱数和垛型
//……
//plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true);
//wcsMySql.SetWCSTasks("", "2", "", TaskNo);
break;
case "140":// 拆垛申请组盘回库
//流程未定
//获取托盘信息
var zppallno = posDt.Select($"Name = 'PalletNo' ")[0].ToString();//托盘号
DataTable zpinfo = wcsMySql.GetWCSTasks("", "", zppallno, "", "");
//回传WMS组盘完成
//……
//向PLC写入当前工位组盘完成信号
//……
; break;
case "150":// 拆垛成空托盘
//流程未定
//回传当前工位托盘组盘完成给WMS
//向PLC写入完成信号
//……
; break;
default:
if (plcValue != "11" && plcValue != "120")
{
throw new Exception("读取值异常");
}
break;
}
}
return;
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(ex.Message, "读写plc错误");
throw ex;
}
}
///
/// 件箱输送线交互(自动模式) PlcIO plc,string ipStr
///
public void BoxConveyorsInteraction2(DataRow row, DataTable PlcInfoDt, PlcIO plc)
{
try
{
string plcStatus = "";
DALWcsMessage wcsMySql = new DALWcsMessage();
WSChatController wSChat = new WSChatController();
Logger logger = LogManager.GetCurrentClassLogger();
DataRow[] plcRows = PlcInfoDt.Select($"Level = '2' and PlcIP={row["Id"].ToString()} ");
foreach (DataRow plcRow in plcRows)
{
string PalletNo = "", EndLocat = "", TaskNo = "", plcValue = "";
// 读取工位流程字
string dbNumber = plcRow["DbNumber"].ToString();//DB块值
string posType = plcRow["PosType"].ToString();//流程字类型
string plcPos = plcRow["PlcPos"].ToString();//plc流程字值
string wcsPos = plcRow["WcsPos"].ToString();//wcs流程字值
string stationNum = plcRow["StationNum"].ToString();//工位
string boxNo = plcRow["boxNo"].ToString();//箱码
plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
// 无流程的工位跳出
if (plcValue == "0")
{
continue;
}
// 读取当前工位各偏移量值
DataTable posDt = wcsMySql.GetPlcPos(plcRow["Id"].ToString());
DataRow posRosPlcPallet = posDt.Select($"Name = '箱码' ")[0];// 托盘号
PalletNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRosPlcPallet["PosType"].ToString(), posRosPlcPallet["PlcPos"].ToString());
WCSTasksMonitor tasksMonitor = new WCSTasksMonitor();
switch (plcValue)
{
case "10":// 箱码读到信号——扫码分道
if (TaskAction.Demo)
{
//演示模式直接随机下发分道
Random random = new Random();
int daohao = random.Next(0, 4);
}
// 向赋码系统获取箱码信息 接口
var GetLine = wcsMySql.GetBarcodeAndRoute(plcValue);
switch (GetLine)
{
case "0":
//成功后的处理
break;
case "1":
//未获取到该品种码垛规则,需要人工维护
logger.Error("未获取到该品种码垛规则,需要人工维护", "件箱线");
break;
case "2":
//码垛工位已满
logger.Error("码垛工位已满", "件箱线");
break;
case "3":
//写入任务失败
logger.Error("写入任务失败", "件箱线");
break;
case "4":
//更改任务状态为预结批失败
logger.Error("更改任务状态为预结批失败", "件箱线");
break;
case "5":
//新箱码,需要从赋码系统中获取箱支关系
logger.Error("获取赋码系统箱支关系失败", "件箱线");
break;
}
break;
case "20": // 件箱到达抓取位——机器人抓箱插码
if (TaskAction.Demo)
{
//演示模式直接给PLC成功信号
}
// 判断到达的箱数
var GetIN = wcsMySql.GetBarcodeIN(plcValue, PalletNo);
switch (GetIN)
{
case "0":
//成功后的处理
// 向PLC写入可以抓取流程字……
break;
case "1":
//托盘号错误
logger.Error("托盘号错误", "件箱线");
break;
case "2":
//箱码重复
logger.Error("检测到箱码重复", "件箱线");
break;
case "3":
//修改插码状态失败
logger.Error("修改插码状态失败", "件箱线");
break;
}
break;
case "30": // 完成抓取——箱码组盘(建立托盘号与箱码关系)
// 读取托盘号 和 完成抓取的箱码号
if (TaskAction.Demo)
{
//演示模式下的组盘申请储位
}
if (wcsMySql.GroupPallno(stationNum, PalletNo))
{
//组盘成功后的处理
// 向PLC写入下一步流程字
}
break;
case "120":// 扫描到箱码(分拣出库)
//1、向WMS请求箱码信息
//2、通过箱码信息查询当前绑定分道
//3、向PLC写入当前箱码对应分拣道号
; break;
default:
if (plcValue != "11" && plcValue != "120")
{
throw new Exception("读取值异常");
}
break;
}
}
return;
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error(ex.Message, "读写plc错误");
throw ex;
}
}
///
/// 跺机业务处理
///
///
///
///
public void StackersInteraction2(DataRow row, DataTable PlcInfoDt, PlcIO plc, PlcIO conveyorPLC)
{
try
{
string plcStatus = "";
DALWcsMessage wcsSql = new DALWcsMessage();
WSChatController wSChat = new WSChatController();
DataRow[] plcRows = PlcInfoDt.Select($"Level = '0' and PlcIP={row["Id"].ToString()} ");
foreach (DataRow plcRow in plcRows)
{
string PalletNo = "", StartLocat = "", EndLocat = "", TaskNo = "", pai, lie, ceng, shen;
// 读取跺机流程字
string dbNumber = plcRow["DbNumber"].ToString();
string posType = plcRow["PosType"].ToString();
string plcPos = plcRow["PlcPos"].ToString();
string wcsPos = plcRow["WcsPos"].ToString();
string stationNum = plcRow["StationNum"].ToString();
string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
// 无流程的跺机跳出
if (plcValue == "0")
{
continue;
}
// 读取当前工位各偏移量值
DataTable posDt = wcsSql.GetPlcPos(plcRow["Id"].ToString());
WCSTasksMonitor tasksMonitor = new WCSTasksMonitor();
switch (plcValue)
{
case "820":
#region 出库任务 (请求任务)
// 获取当前跺机对应的出库任务 0 入库任务 1 出库任务 2 移库任务 3 PLC申请入库
DataTable dt10 = wcsSql.GetWCSTasks("0", "1", "", stationNum, "", "");
if (dt10 == null || dt10.Rows.Count <= 0)
{
break;
}
StartLocat = dt10.Rows[0]["StartLocat"].ToString(); // 起始工位
EndLocat = dt10.Rows[0]["EndLocat"].ToString(); // 目标工位
PalletNo = dt10.Rows[0]["PalletNo"].ToString(); // 托盘号
TaskNo = dt10.Rows[0]["TaskNo"].ToString(); // 任务号
// 根据跺机号确认放货工位
string outStationNum = "0";
string endPai = "", endLie = "", endCeng = "";
switch (stationNum)
{
case "R01":
outStationNum = "11";
endPai = "1";
endLie = "100";
endCeng = "1";
break;
case "R02":
outStationNum = "7";
endPai = "1";
endLie = "100";
endCeng = "1";
break;
default: break;
}
// 读取放货工位状态
DataRow[] rows = PlcInfoDt.Select("Level = '2' and StationNum = '" + outStationNum + "'");
// 交互plc
string conveyorValue = conveyorPLC.GetPlcDBValue(int.Parse(rows[0]["dbNumber"].ToString()), rows[0]["PosType"].ToString(), rows[0]["PlcPos"].ToString());
if (conveyorValue == "120") // 放货工位空闲 可放货
{
if (int.Parse(outStationNum) > 0)
{
pai = int.Parse(StartLocat.Substring(0, 2)).ToString();
lie = int.Parse(StartLocat.Substring(2, 2)).ToString();
ceng = int.Parse(StartLocat.Substring(4, 2)).ToString();
shen = int.Parse(StartLocat.Substring(6, 2)).ToString();
if (int.Parse(pai) > 2) //大于4
{
pai = (int.Parse(pai) - 2).ToString();
}
}
else
{
// 起始储位地址为空,跳过 写入任务明细表
tasksMonitor.StartLocat = "";
tasksMonitor.InteractiveMsg = "起始储位为空!";
tasksMonitor.PalletNo = PalletNo;
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
break;
}
// 任务号
DataRow posRos10Task = posDt.Select($"Name = 'TaskNo' ")[0];
string palletNoPos = posRos10Task["PlcPos"].ToString(); // 任务号偏移量
string palletNoPosType = posRos10Task["PosType"].ToString(); // 任务号类型
var a10 = plc.SetPlcDBValue(int.Parse(dbNumber), palletNoPosType, TaskNo, palletNoPos);
// 托盘号
DataRow posRos10Pln = posDt.Select($"Name = 'PalletNo' ")[0];
var taskNoPos = posRos10Pln["PlcPos"].ToString(); // 托盘号偏移量
var taskNoPosType = posRos10Pln["PosType"].ToString(); // 托盘号类型
var b10 = plc.SetPlcDBValue(int.Parse(dbNumber), taskNoPosType, PalletNo, taskNoPos);
// 起始排
DataRow posRos10StartPai = posDt.Select($"Name = 'StartRow' ")[0];
var sPaiPos = posRos10StartPai["PlcPos"].ToString(); // 偏移量
var sPaiPosType = posRos10StartPai["PosType"].ToString(); // 类型
var c10 = plc.SetPlcDBValue(int.Parse(dbNumber), sPaiPosType, pai, sPaiPos);
// 起始列
DataRow posRos10StartLie = posDt.Select($"Name = 'StartColumn' ")[0];
var sLiePos = posRos10StartLie["PlcPos"].ToString(); // 偏移量
var sLiePosType = posRos10StartLie["PosType"].ToString(); // 类型
var d10 = plc.SetPlcDBValue(int.Parse(dbNumber), sLiePosType, lie, sLiePos);
// 起始层
DataRow posRos10StartCeng = posDt.Select($"Name = 'StartLayer' ")[0];
var sCengPos = posRos10StartCeng["PlcPos"].ToString(); // 偏移量
var sCengPosType = posRos10StartCeng["PosType"].ToString(); // 类型
var e10 = plc.SetPlcDBValue(int.Parse(dbNumber), sCengPosType, ceng, sCengPos);
// 目标放货工位
DataRow posRos10EndPai = posDt.Select($"Name = 'EndRow' ")[0];
var ePaiPos = posRos10EndPai["PlcPos"].ToString(); // 偏移量
var ePaiPosType = posRos10EndPai["PosType"].ToString(); // 类型
var f10 = plc.SetPlcDBValue(int.Parse(dbNumber), ePaiPosType, endPai, ePaiPos);
DataRow posRos10EndLie = posDt.Select($"Name = 'EndColumn' ")[0];
var eLiePos = posRos10EndLie["PlcPos"].ToString(); // 偏移量
var eLiePosType = posRos10EndLie["PosType"].ToString(); // 类型
var g10 = plc.SetPlcDBValue(int.Parse(dbNumber), eLiePosType, endLie, eLiePos);
DataRow posRos10EndCeng = posDt.Select($"Name = 'EndLayer' ")[0];
var eCengPos = posRos10EndCeng["PlcPos"].ToString(); // 偏移量
var eCengPosType = posRos10EndCeng["PosType"].ToString(); // 类型
var h10 = plc.SetPlcDBValue(int.Parse(dbNumber), eCengPosType, endCeng, eCengPos);
if (a10 && b10 && c10 && d10 && e10 && f10 && g10 && h10)
{
// 写入跺机任务下发完成
plc.SetPlcDBValue(int.Parse(dbNumber), posType, "10", wcsPos, true);
//判断是出库还是移库(与plc对接时修改
if (true)
{
//修改储位信息 任务类型 执行状态 起始位置 目标位置
wcsSql.EditLocaetStatus("1", "1", StartLocat, "");
}
else if (true)
{
//修改储位信息 任务类型 执行状态 起始位置 目标位置
wcsSql.EditLocaetStatus("2", "1", StartLocat, EndLocat);
}
// 将出库任务待执行改为正在执行
wcsSql.SetWCSTasks(PalletNo, "1", "", TaskNo);
// 插入任务明细
// 任务明细实体类
tasksMonitor.TaskNo = dt10.Rows[0]["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());
tasksMonitor.PlcName = plcRow["Text"].ToString();
tasksMonitor.InteractiveMsg = $"写入指令:{StartLocat}储位====》{outStationNum}工位";
tasksMonitor.PalletNo = PalletNo;
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = StartLocat; //起始位置
tasksMonitor.EndLocat = outStationNum; //目标工位
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and StationNum = '{EndLocat}'")[0];
LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
}
}
#endregion
; break;
case "20":
#region 取货完成
DataRow posRos20PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号
DataRow posRos20Task = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号
TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos20PlcTask["PosType"].ToString(), posRos20PlcTask["PlcPos"].ToString());
DataTable dt20 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo);
if (dt20.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前托盘号不存在对应的任务", "跺机");
break;
}
// 判断任务类型
DataRow taskRow20 = dt20.Rows[0];
switch (taskRow20["Type"].ToString())
{
case "0": // 入库任务
#region 入库任务
// 向跺机写入控制流程字
var a20 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos20Task["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRos20Task["PlcPos"].ToString());
// 向跺机写入控制流程字
plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true);
// 根据跺机号确认取货工位
string outStationNum20r = "0";
switch (stationNum)
{
case "R01":
outStationNum20r = "10";
break;
case "R02":
outStationNum20r = "6";
break;
default: break;
}
// 读取取货工位状态
DataRow[] rows2 = PlcInfoDt.Select("Level = '2' and StationNum = '" + outStationNum20r + "'");
DataTable posDt20 = wcsSql.GetPlcPos(rows2[0]["Id"].ToString());//获取工位偏移量
DataRow posRos20gwTask = posDt20.Select($"Name = 'TaskNo' ")[0];// 工位任务号
// 向取货工位写入任务号
conveyorPLC.SetPlcDBValue(int.Parse(rows2[0]["dbNumber"].ToString()), posRos20gwTask["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRos20gwTask["PlcPos"].ToString());
// 向取货工位写入流程控制字
var bl = conveyorPLC.SetPlcDBValue(int.Parse(rows2[0]["dbNumber"].ToString()), rows2[0]["PosType"].ToString(), "100", rows2[0]["WcsPos"].ToString(), true);
// 写入任务明细表
tasksMonitor.TaskNo = taskRow20["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(rows2[0]["Id"].ToString());
tasksMonitor.PlcName = rows2[0]["Text"].ToString();
tasksMonitor.InteractiveMsg = $"跺机取货完成!";
tasksMonitor.PalletNo = taskRow20["PalletNo"].ToString();
tasksMonitor.StartLocat = outStationNum20r;
tasksMonitor.EndLocat = taskRow20["EndLocat"].ToString();
tasksMonitor.Status = "2";
wcsSql.AddWCSTasksMonitor(tasksMonitor);
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
#endregion
break;
case "1": // 出库任务
#region 出库任务
// 向跺机写入控制流程字
var a20c = plc.SetPlcDBValue(int.Parse(dbNumber), posRos20Task["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRos20Task["PlcPos"].ToString());
if (!a20c)
{
break;
}
// 向跺机写入控制流程字
var b20c = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true);
if (!b20c)
{
break;
}
// 根据跺机号确认取货工位
string outStationNum20c = "0";
switch (stationNum)
{
case "R01":
outStationNum20c = "11";
break;
case "R02":
outStationNum20c = "7";
break;
default: break;
}
tasksMonitor.TaskNo = taskRow20["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());
tasksMonitor.PlcName = plcRow["Text"].ToString();
tasksMonitor.InteractiveMsg = $"跺机取货完成!";
tasksMonitor.PalletNo = taskRow20["PalletNo"].ToString();
tasksMonitor.StartLocat = taskRow20["StartLocat"].ToString();
tasksMonitor.EndLocat = outStationNum20c;
tasksMonitor.Status = "2";
wcsSql.AddWCSTasksMonitor(tasksMonitor);
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
#endregion
break;
default: break;
}
#endregion
break;
case "30":
#region 操作完成(放货完成)
DataRow posRos30PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号
TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos30PlcTask["PosType"].ToString(), posRos30PlcTask["PlcPos"].ToString());
DataTable dt30 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo);
if (dt30.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前托盘号不存在对应的任务", "跺机");
break;
}
// 判断任务类型
DataRow taskRow30 = dt30.Rows[0];
TaskReques taskReques = new TaskReques();
switch (taskRow30["Type"].ToString())
{
case "0": // 入库任务
case "3": // plc申请
#region 入库任务
DataRow posRos30Taskr = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号
//写入plc任务号
var a30 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos30Taskr["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30Taskr["PlcPos"].ToString());
if (!a30)
{
break;
}
//写入plc控制字
var b30 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "30", wcsPos, true);
if (!b30)
{
break;
}
wcsSql.SetWCSTasks("", "2", "", TaskNo);
// 反馈给WMS
taskReques.taskNo = taskRow30["TaskNo"].ToString();
taskReques.TaskType = taskRow30["Type"].ToString();
taskReques.TaskStatus = taskRow30["Status"].ToString();
bool bl = wcsSql.RequestTasks(taskReques);
if (bl)
{
//修改储位信息 任务类型 执行状态 起始位置 目标位置
wcsSql.EditLocaetStatus("0", "2", "", taskRow30["EndLocat"].ToString());
// 写入任务明细表
tasksMonitor.TaskNo = taskRow30["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());
tasksMonitor.PlcName = plcRow["Text"].ToString();
tasksMonitor.InteractiveMsg = $"任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = taskRow30["PalletNo"].ToString();
tasksMonitor.StartLocat = taskRow30["StartLocat"].ToString();
tasksMonitor.EndLocat = taskRow30["EndLocat"].ToString();
tasksMonitor.Status = "2";
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
}
DataRow ConveyorsRow30r = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow30["StartLocat"].ToString()}'")[0];
LedDisplay(ConveyorsRow30r["LedIP"].ToString(), "工位:" + taskRow30["StartLocat"].ToString(), "入库完成 " + $"储位地址:{taskRow30["EndLocat"].ToString()}", "托盘号:" + taskRow30["PalletNo"].ToString());
#endregion
#region 垛机入库不空跑
//入库任务完成后检测是否有同巷道出库任务
//获取当前巷道是否有未执行的出库任务
DataTable ot = wcsSql.GetWCSTasks("0", "1", "", taskRow30["EndRoadway"].ToString(), "");
if (ot.Rows.Count != 0)
{
if (int.Parse(ot.Select("StartLocat").ToString().Substring(6,2)) == 1)
{
//外侧储位:执行此储位出库任务
}
else
{
//判断此储位对应的外储位是否无任务
DataTable otn = wcsSql.GetLocateTasks(ot.Select("StartLocat").ToString().Substring(0,6)+"01","");
if (ot.Rows.Count == 0)
{
//执行此内侧库位出库任务
}
}
}
#endregion
break;
case "1": // 出库任务
#region 出库任务
// 从出库任务获取巷道号
string roadway = taskRow30["StartRoadway"].ToString();
string num = ""; // 放货工位号
if (roadway == "R01")
{
num = "11"; //交互工位
}
else if (roadway == "R02")
{
num = "7"; //交互工位
}
// 根据目标口获取目标工位
string outCode = taskRow30["EndLocat"].ToString();
// 根据工位号获取工位信息
DataRow ConveyorsRow30c = PlcInfoDt.Select($"Level = '2' and StationNum = '{num}'")[0];
// 读取当前工位各偏移量值
DataTable posDt30 = wcsSql.GetPlcPos(ConveyorsRow30c["Id"].ToString());
if (string.IsNullOrWhiteSpace(outCode))
{
outCode = "-1";
}
// 任务号
var posRos30GwTask = posDt30.Select($"Name = 'TaskNo' ")[0];
var a30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30GwTask["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30GwTask["PlcPos"].ToString());
// 托盘号
var posRos30Pln = posDt30.Select($"Name = 'PalletNo' ")[0];
var b30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30Pln["PosType"].ToString(), taskRow30["PalletNo"].ToString(), posRos30Pln["PlcPos"].ToString());
// 起始工位
var posRos30StartGw = posDt30.Select($"Name = 'StartLocatNo' ")[0];
var c30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30StartGw["PosType"].ToString(), num, posRos30StartGw["PlcPos"].ToString());
// 目标工位
var posRos30EndGw = posDt30.Select($"Name = 'EndLocatNo' ")[0];
var d30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30EndGw["PosType"].ToString(), outCode, posRos30EndGw["PlcPos"].ToString());
if (!a30c || !b30c || !c30c || !d30c)
{
break;
}
// 写入工位wcs控制字
var e30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), ConveyorsRow30c["PosType"].ToString(), "120", ConveyorsRow30c["WcsPos"].ToString(), true); //对应出库口输送线开始执行
if (!e30c)
{
break;
}
//写入plc任务号
var posRos30Taskc = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号
var inBl30 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos30Taskc["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30Taskc["PlcPos"].ToString());
if (!inBl30)
{
break;
}
// 写入跺机wcs控制字流程30 返回垛机执行完成
bool inBl = plc.SetPlcDBValue(int.Parse(plcRow["DbNumber"].ToString()), plcRow["PosType"].ToString(), "30", plcRow["WcsPos"].ToString(), true);
if (!inBl)
{
break;
}
// 写入任务明细表
tasksMonitor.TaskNo = taskRow30["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(ConveyorsRow30c["Id"].ToString());
tasksMonitor.PlcName = ConveyorsRow30c["Text"].ToString();
tasksMonitor.InteractiveMsg = $"写入指令:收到跺机放货完成;放货{num}工位===》{outCode}出库口";
tasksMonitor.PalletNo = taskRow30["PalletNo"].ToString();
tasksMonitor.Status = "2";
tasksMonitor.StartLocat = num; //起始位置
tasksMonitor.EndLocat = outCode; //目标工位
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
#endregion
#region 垛机出库不空跑
//出库完成后判断当前巷道是否存在入库任务
DataTable it = wcsSql.GetWCSTasks("0", "0", "", taskRow30["EndRoadway"].ToString(), "");
if (it.Rows.Count != 0)
{
//判断任务目的货位内外侧
if (int.Parse(it.Select("StartLocat").ToString().Substring(6, 2)) == 1)
{
//外侧储位:执行此储位入库任务
}
else
{
//判断此托盘目标库位外侧库位是否存在任务
DataTable otn = wcsSql.GetLocateTasks("",it.Select("StartLocat").ToString().Substring(0, 6) + "01");
if (it.Rows.Count == 0)
{
//执行此储位入库任务
//
}
}
}
#endregion
break;
case "2": // 移库任务
#region 移库任务
DataRow posRos30Tasky = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号
//写入plc任务号
var a30y = plc.SetPlcDBValue(int.Parse(dbNumber), posRos30Tasky["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30Tasky["PlcPos"].ToString());
if (!a30y)
{
break;
}
//写入plc控制字
var b30y = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "30", wcsPos, true);
if (!b30y)
{
break;
}
wcsSql.SetWCSTasks("", "2", "", TaskNo);
// 反馈给WMS
taskReques.taskNo = taskRow30["TaskNo"].ToString();
taskReques.TaskType = taskRow30["Type"].ToString();
taskReques.TaskStatus = taskRow30["Status"].ToString();
bool onbl = wcsSql.RequestTasks(taskReques);
if (onbl)
{
//修改储位信息 任务类型 执行状态 起始位置 目标位置
wcsSql.EditLocaetStatus("2", "2", taskRow30["StartLocat"].ToString(), taskRow30["EndLocat"].ToString());
// 写入任务明细表
tasksMonitor.TaskNo = taskRow30["TaskNo"].ToString();
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());
tasksMonitor.PlcName = plcRow["Text"].ToString();
tasksMonitor.InteractiveMsg = $"任务完成,返回给WMS任务完成!";
tasksMonitor.PalletNo = taskRow30["PalletNo"].ToString();
tasksMonitor.StartLocat = taskRow30["StartLocat"].ToString();
tasksMonitor.EndLocat = taskRow30["EndLocat"].ToString();
tasksMonitor.Status = "2";
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
}
DataRow ConveyorsRow30y = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow30["StartLocat"].ToString()}'")[0];
LedDisplay(ConveyorsRow30y["LedIP"].ToString(), "工位:" + taskRow30["StartLocat"].ToString(), "入库完成 " + $"储位地址:{taskRow30["EndLocat"].ToString()}", "托盘号:" + taskRow30["PalletNo"].ToString());
#endregion
break;
default: break;
}
#endregion
break;
case "100":
#region 空取货异常
DataRow posRos100PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号
DataRow posRos100Task = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号
TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos100PlcTask["PosType"].ToString(), posRos100PlcTask["PlcPos"].ToString());
// 向跺机写入控制流程字
var a100 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos100Task["PosType"].ToString(), TaskNo, posRos100Task["PlcPos"].ToString());
if (!a100)
{
break;
}
// 向跺机写入控制流程字
var b100 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "100", wcsPos, true);
if (!b100)
{
break;
}
DataTable dt100 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo);
if (dt100.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前任务号不存在对应的任务", "跺机");
break;
}
DataRow taskRow100 = dt100.Rows[0];
TaskReques taskReques100 = new TaskReques();
taskReques100.taskNo = taskRow100["TaskNo"].ToString();
// 写入log日志
Logger logger2 = LogManager.GetCurrentClassLogger();
//wcs任务变更为异常结束
var s = wcsSql.SetWCSTasks("", "3", "", TaskNo);
logger2.Error("wcs任务变更空取异常:" + s.ToString(), "跺机");
// 向WMS反馈任务空取异常
bool bl100 = wcsSql.RequestEmptyException(taskReques100);
logger2.Error("反馈WMS任务空取异常:" + bl100.ToString(), "跺机");
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
if (!string.IsNullOrWhiteSpace(taskRow100["EndLocat"].ToString()) && taskRow100["EndLocat"].ToString() != "-1")
{
DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow100["EndLocat"].ToString()}'")[0];
LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库空取异常 " + $"储位地址:{taskRow100["StartLocat"].ToString()}", "托盘号:" + taskRow100["PalletNo"].ToString());
}
#endregion
break;
case "101":
#region 满放货异常
DataRow posRos101PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号
DataRow posRos101Task = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号
DataRow posRos101Pln = posDt.Select($"Name = 'PalletNo' ")[0];// 托盘号
TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos101PlcTask["PosType"].ToString(), posRos101PlcTask["PlcPos"].ToString());
DataTable dt101 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo);
if (dt101.Rows.Count == 0)
{
// 写入log日志
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("当前任务号不存在对应的任务", "跺机");
break;
}
DataRow taskRow101 = dt101.Rows[0];
//wcs任务变更为异常结束
wcsSql.SetWCSTasks("", "3", "", TaskNo);
PalletNo = taskRow101["PalletNo"].ToString();
TaskReques taskReques101 = new TaskReques();
taskReques101.taskNo = taskRow101["TaskNo"].ToString();
taskReques101.PalletNo = taskRow101["PalletNo"].ToString();
// 向WMS反馈任务满入异常
string strMsg = wcsSql.RequestFullException(taskReques101, taskRow101["StartLocat"].ToString(), ref TaskNo);
if (strMsg.Contains("-1"))//失败
{
DataRow ConveyorsRow30r = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow101["StartLocat"].ToString()}'")[0];
LedDisplay(ConveyorsRow30r["LedIP"].ToString(), "工位:" + taskRow101["StartLocat"].ToString(), "入库满入异常: " + $"储位地址:{taskRow101["EndLocat"].ToString()} 满入异常,未获取到其他空储位", "托盘号:" + taskRow101["PalletNo"].ToString());
}
else //成功
{
//修改任务为正在执行
wcsSql.SetWCSTasks("", "1", "", TaskNo);
DataRow posDjRos3 = posDt.Select($"Name = 'StartRow' ")[0];// 起始排
DataRow posDjRos4 = posDt.Select($"Name = 'StartColumn' ")[0];// 起始列
DataRow posDjRos5 = posDt.Select($"Name = 'StartLayer' ")[0];// 起始层
DataRow posDjRos6 = posDt.Select($"Name = 'EndRow' ")[0];// 目的排
DataRow posDjRos7 = posDt.Select($"Name = 'EndColumn' ")[0];// 目的层
DataRow posDjRos8 = posDt.Select($"Name = 'EndLayer' ")[0];// 目的层
string endLocat = strMsg;
string pai101 = int.Parse(endLocat.Substring(0, 2)).ToString();
string lie101 = int.Parse(endLocat.Substring(2, 2)).ToString();
string ceng101 = int.Parse(endLocat.Substring(4, 2)).ToString();
//判断排数大于2
if (int.Parse(pai101) > 2) //大于4
{
pai = (int.Parse(pai101) - 2).ToString();
}
// 向跺机写入任务号
var a101 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos101Task["PosType"].ToString(), TaskNo, posRos101Task["PlcPos"].ToString());
// 向跺机写入托盘号
var b101 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos101Pln["PosType"].ToString(), PalletNo, posRos101Pln["PlcPos"].ToString());
// 向跺机写入取货地址
var c101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos3["PosType"].ToString(), "2", posDjRos3["PlcPos"].ToString());
var d101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos4["PosType"].ToString(), "100", posDjRos4["PlcPos"].ToString());
var e101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos5["PosType"].ToString(), "1", posDjRos5["PlcPos"].ToString());
// 向跺机写入放货地址(储位地址)
var f101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos6["PosType"].ToString(), pai101, posDjRos6["PlcPos"].ToString());
var g101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos7["PosType"].ToString(), lie101, posDjRos7["PlcPos"].ToString());
var h101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos8["PosType"].ToString(), ceng101, posDjRos8["PlcPos"].ToString());
if (a101 && b101 && c101 && d101 && e101 && f101 && g101 && h101)
{
// 向跺机写入控制流程字
var bl101 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "101", wcsPos, true);
if (bl101)
{
// 写入任务明细
tasksMonitor.TaskNo = TaskNo;
tasksMonitor.StartLocat = stationNum;
tasksMonitor.InteractiveMsg = $"写入指令:{stationNum}工位====》" + endLocat + "储位地址!";
tasksMonitor.PalletNo = PalletNo;
tasksMonitor.EndLocat = endLocat;
tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());//工位ID
tasksMonitor.PlcName = plcRow["Text"].ToString(); //工位描述
tasksMonitor.Status = "2";
wcsSql.AddWCSTasksMonitor(tasksMonitor);
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
DataRow ConveyorsRow30r = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow101["StartLocat"].ToString()}'")[0];
LedDisplay(ConveyorsRow30r["LedIP"].ToString(), "工位:" + taskRow101["StartLocat"].ToString(), "入库位置变更: " + $"储位地址:{taskRow101["EndLocat"].ToString()} 满入异常,变更储位:为{endLocat}", "托盘号:" + taskRow101["PalletNo"].ToString());
}
}
}
// 通知任务界面任务已存在更新 请更新界面
if (TaskAction.refresh)
{
wSChat.AlarmInformation("1");
}
#endregion
break;
default:
if (plcValue != "11" && plcValue != "12" && plcValue != "21" && plcValue != "22")
{
throw new Exception("读取值异常");
}
break;
}
}
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("读写:" + ex.Message, "读写plc错误");
throw ex;
}
}
///
/// 跺机位置监控
///
public void StackersAddreInteraction(DataRow row, DataTable PlcInfoDt, PlcIO plc, PlcIO conveyorPLC)
{
try
{
string plcStatus = "";
DALWcsMessage wcsSql = new DALWcsMessage();
WSChatController wSChat = new WSChatController();
DataRow[] plcRows = PlcInfoDt.Select($"Level = '0' and PlcIP={row["Id"].ToString()} ");
foreach (DataRow plcRow in plcRows)
{
string PalletNo = "", StartLocat = "", EndLocat = "", TaskNo = "", pai, lie, ceng, shen;
// 读取跺机流程字
string dbNumber = plcRow["DbNumber"].ToString();
string posType = plcRow["PosType"].ToString();
string plcPos = plcRow["PlcPos"].ToString();
string wcsPos = plcRow["WcsPos"].ToString();
string stationNum = plcRow["StationNum"].ToString();
// 获取跺机位置
string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos);
// 无流程的跺机跳出
if (plcValue == "0")
{
continue;
}
//读取到垛机定位
else if (plcValue == "99")
{
// 发送到前端更新设备位置--设备
DeviceMessage message = new DeviceMessage();
message.Message = "垛机实时";
message.Position = 30; //垛机所在绝对位置 在前端根据平均数进行相除
message.Row = 0; //排
message.Column = 0; //列
message.Layer = 0; //层
bool IsMessage = true;
switch (row["IP"].ToString())
{
case "192.168.21.30": //一号垛机
message.RoadwayNo = "R01";
break;
case "192.168.21.40": //二号垛机
message.RoadwayNo = "R02";
break;
case "192.168.21.50": //三号垛机
message.RoadwayNo = "R03";
break;
case "192.168.21.60": //四号垛机
message.RoadwayNo = "R04";
break;
case "192.168.21.70": //五号垛机
message.RoadwayNo = "R05";
break;
case "192.168.21.80": //六号垛机
message.RoadwayNo = "R06";
break;
case "192.168.21.90": //七号垛机
message.RoadwayNo = "R07";
break;
default: //其它(不发送
IsMessage = false;
break;
}
if (IsMessage)
{
var a = JsonConvert.SerializeObject(message);
wSChat.AlarmInformation(a);
}
}
}
}
catch (Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
logger.Error("读写:" + ex.Message, "读写plc错误");
throw ex;
}
}
#region 服务方法
///
/// 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 { }
}
#endregion
}
}