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
|
{
|
/// <summary>
|
/// 托盘输送线交互(自动模式) PlcIO plc,string ipStr
|
/// </summary>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 件箱输送线交互(自动模式) PlcIO plc,string ipStr
|
/// </summary>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 跺机业务处理
|
/// </summary>
|
/// <param name="plc"></param>
|
/// <param name="plcValue"></param>
|
/// <param name="row"></param>
|
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;
|
}
|
}
|
|
|
/// <summary>
|
/// 跺机位置监控
|
/// </summary>
|
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 服务方法
|
/// <summary>
|
/// Led屏展示信息
|
/// </summary>
|
/// <param name="ip">地址</param>
|
/// <param name="top">上方区域</param>
|
/// <param name="content">中间区域</param>
|
/// <param name="foot">底部区域</param>
|
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
|
}
|
}
|