5235 lines
255 KiB
C#
5235 lines
255 KiB
C#
|
|
|
|||
|
|
using Common;
|
|||
|
|
using DevExpress.XtraEditors;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using System.Data;
|
|||
|
|
using System.Diagnostics;
|
|||
|
|
using System.Drawing;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Net;
|
|||
|
|
using System.Net.Sockets;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading;
|
|||
|
|
using System.Windows.Forms;
|
|||
|
|
using WCS.Properties;
|
|||
|
|
using Newtonsoft.Json;
|
|||
|
|
using Newtonsoft.Json.Linq;
|
|||
|
|
using DevExpress.XtraSplashScreen;
|
|||
|
|
using HslCommunication.Profinet.Siemens;
|
|||
|
|
using HslCommunication.Profinet.Inovance;
|
|||
|
|
using HslCommunication;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using WCS.Business.Dao;
|
|||
|
|
using System.Xml.Serialization;
|
|||
|
|
using DevExpress.Emf;
|
|||
|
|
using DevExpress.Utils.DirectXPaint;
|
|||
|
|
using System.Text.RegularExpressions;
|
|||
|
|
using DevExpress.XtraRichEdit.Model;
|
|||
|
|
using System.Reflection.Emit;
|
|||
|
|
using static Google.Protobuf.Reflection.SourceCodeInfo.Types;
|
|||
|
|
using DevExpress.XtraReports.UI;
|
|||
|
|
using DevExpress.Utils.Extensions;
|
|||
|
|
using DevExpress.XtraRichEdit.Import.Html;
|
|||
|
|
using DevExpress.Utils;
|
|||
|
|
using System.Web.UI;
|
|||
|
|
using DevExpress.XtraReports.Data;
|
|||
|
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
|
|||
|
|
using DevExpress.XtraBars.Docking2010.Views.Widget;
|
|||
|
|
using System.Collections;
|
|||
|
|
using static DevExpress.Data.Helpers.SyncHelper.ZombieContextsDetector;
|
|||
|
|
using DevExpress.XtraRichEdit.Services;
|
|||
|
|
using DevExpress.XtraRichEdit.Import.Doc;
|
|||
|
|
|
|||
|
|
namespace WCS
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
public partial class MainForm : DevExpress.XtraEditors.XtraForm
|
|||
|
|
{
|
|||
|
|
public List<string> stockerip = new List<string>();
|
|||
|
|
Dictionary<int, SiemensS7Net> plcModbus = new Dictionary<int, SiemensS7Net>();
|
|||
|
|
//SiemensS7Net SiemensPlcDDJ1 = new SiemensS7Net(SiemensPLCS.S1200, RfConfig.Create().ScanIp1);
|
|||
|
|
//SiemensS7Net SiemensPlcDDJ2 = new SiemensS7Net(SiemensPLCS.S1200, RfConfig.Create().WmsPort);
|
|||
|
|
//SiemensS7Net SiemensPlcSSJ = new SiemensS7Net(SiemensPLCS.S1200, RfConfig.Create().ScanIp2);
|
|||
|
|
private InovanceTcpNet inovanceH3UTcp = null;
|
|||
|
|
string MesIpPort = "";
|
|||
|
|
string modeType = "";
|
|||
|
|
string timeNum = "";
|
|||
|
|
string[] DDJRkStation = new string[] { "SSJ01", "SSJ03", "SSJ05", "SSJ07", "SSJ09", "SSJ11" };//堆垛机入库取货站台
|
|||
|
|
|
|||
|
|
string[] DDJ_Finish = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };//堆垛机入库取货站台
|
|||
|
|
|
|||
|
|
string[] BcrRkStation = new string[] { "SSJ96","SSJ50","SSJ53","SSJ56","SSJ81","SSJ84","SSJ88","SSJ91" };//托盘入库口 读取条码
|
|||
|
|
|
|||
|
|
string[] CkStation = new string[] { "102"};//堆垛机出库库放货站台
|
|||
|
|
string[] TwoSSJStation = new string[] { "21", "23", "24", "26" };
|
|||
|
|
Socket socketWeight, socketWeight2;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public MainForm()
|
|||
|
|
{
|
|||
|
|
InitializeComponent();
|
|||
|
|
ThreadExceptionDialog.CheckForIllegalCrossThreadCalls = false;
|
|||
|
|
DevExpress.Data.CurrencyDataController.DisableThreadingProblemsDetection = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 全局变量初始化
|
|||
|
|
|
|||
|
|
Dictionary<string, string> decFauleList = new Dictionary<string, string>();
|
|||
|
|
|
|||
|
|
Dictionary<string, string> ssjStationONE = new Dictionary<string, string>();
|
|||
|
|
Dictionary<string, string> ssjStationTHREE = new Dictionary<string, string>();
|
|||
|
|
List<string> rkStation = new List<string>();//入库站台
|
|||
|
|
|
|||
|
|
List<string> HKStation = new List<string>();//回库按钮检测
|
|||
|
|
|
|||
|
|
//string devControlMethod01 = "01";//定义设备1控制方式
|
|||
|
|
//string equipmentStatus01 = "01";//定义设备1状态
|
|||
|
|
//string ssj223 = "01";//223输送机是否有货
|
|||
|
|
//string ssj221 = "01";//221输送机是否有货
|
|||
|
|
//string plcid220 = "01";//220输送机任务号
|
|||
|
|
//string plcid222 = "01";//222输送机任务号
|
|||
|
|
|
|||
|
|
//string devControlMethod02 = "01";//定义设备2控制方式
|
|||
|
|
//string equipmentStatus02 = "01";//定义设备2状态
|
|||
|
|
|
|||
|
|
//string plcid210 = "01";//210输送机任务号
|
|||
|
|
//string plcid212 = "01";//212输送机任务号
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region PLC启动连接检测
|
|||
|
|
public bool Get_Siemens_ConnectToPlc()
|
|||
|
|
{
|
|||
|
|
//ServiceReference1.CUX_WS_COMMON_PKG_PortType ss;
|
|||
|
|
//ss.COMMON_IMPORT();
|
|||
|
|
|
|||
|
|
|
|||
|
|
//SiemensPlcDDJ1.SetPersistentConnection(); // 设置了长连接
|
|||
|
|
//OperateResult connect = SiemensPlcDDJ1.ConnectServer();
|
|||
|
|
//if (connect.IsSuccess)
|
|||
|
|
//{
|
|||
|
|
// AddText("堆垛机连接成功");
|
|||
|
|
// return true;
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// AddText("堆垛机连接失败");
|
|||
|
|
return false;
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
public bool Get_Siemens_ConnectToPlc2()
|
|||
|
|
{
|
|||
|
|
//SiemensPlcSSJ.SetPersistentConnection(); // 设置了长连接
|
|||
|
|
//OperateResult connect = SiemensPlcSSJ.ConnectServer();
|
|||
|
|
//if (connect.IsSuccess)
|
|||
|
|
//{
|
|||
|
|
// AddText("输送机连接成功");
|
|||
|
|
// return true;
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// AddText("输送机连接失败");
|
|||
|
|
return false;
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool Get_HuiChuangPlc()
|
|||
|
|
{
|
|||
|
|
inovanceH3UTcp?.ConnectClose();
|
|||
|
|
inovanceH3UTcp = new InovanceTcpNet(RfConfig.Create().ScanIp3, 502, 1);
|
|||
|
|
inovanceH3UTcp.AddressStartWithZero = true;
|
|||
|
|
//inovanceH3UTcp.Series = (InovanceSeries)comboBox4.SelectedItem;
|
|||
|
|
inovanceH3UTcp.DataFormat = HslCommunication.Core.DataFormat.ABCD;
|
|||
|
|
//ComboBox1_SelectedIndexChanged(null, new EventArgs()); // 设置数据服务
|
|||
|
|
inovanceH3UTcp.IsStringReverse = true;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
OperateResult connect = inovanceH3UTcp.ConnectServer();
|
|||
|
|
if (connect.IsSuccess)
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(HslCommunication.StringResources.Language.ConnectedFailed + connect.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(ex.Message);
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 文本框界面显示函数
|
|||
|
|
delegate void addTextCallback(string text);
|
|||
|
|
|
|||
|
|
public void AddText(string str)
|
|||
|
|
{
|
|||
|
|
if (this.txtMessage.InvokeRequired)//为了多线程间控件的安全调用
|
|||
|
|
{
|
|||
|
|
addTextCallback ad = new addTextCallback(AddText);
|
|||
|
|
this.Invoke(ad, new object[] { str });
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
txtMessage.Text += DateTime.Now.ToString() + ":" + str + "\r\n";
|
|||
|
|
this.txtMessage.Focus();
|
|||
|
|
this.txtMessage.Select(this.txtMessage.TextLength, 0);
|
|||
|
|
this.txtMessage.ScrollToCaret();
|
|||
|
|
WriteSysLog.SysLog(str);
|
|||
|
|
|
|||
|
|
if (this.txtMessage.TextLength > 10000)
|
|||
|
|
{
|
|||
|
|
txtMessage.Text = "";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (txtError.TextLength > 10000)
|
|||
|
|
{
|
|||
|
|
txtError.Text = "";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
private bool GetSocketCon11(string IP, int PORT)
|
|||
|
|
{
|
|||
|
|
bool sts = false;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
int port = PORT;
|
|||
|
|
string host = IP;
|
|||
|
|
///创建终结点EndPoint
|
|||
|
|
IPAddress ip = IPAddress.Parse(host);
|
|||
|
|
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndpoint实例
|
|||
|
|
///创建socket并连接到服务器
|
|||
|
|
socketWeight = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
|
|||
|
|
socketWeight.ReceiveTimeout = 5000;
|
|||
|
|
if (socketWeight.Connected == false)
|
|||
|
|
{
|
|||
|
|
socketWeight.Connect(ipe);//连接到服务器
|
|||
|
|
AddText(" 称重模块:" + IP + " 连接成功");
|
|||
|
|
sts = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("称重模块:" + IP + " 连接失败" + ex.Message);
|
|||
|
|
sts = false;
|
|||
|
|
}
|
|||
|
|
return sts;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool GetSocketCon12(string IP, int PORT)
|
|||
|
|
{
|
|||
|
|
bool sts = false;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
int port = PORT;
|
|||
|
|
string host = IP;
|
|||
|
|
///创建终结点EndPoint
|
|||
|
|
IPAddress ip = IPAddress.Parse(host);
|
|||
|
|
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndpoint实例
|
|||
|
|
///创建socket并连接到服务器
|
|||
|
|
socketWeight2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
|
|||
|
|
socketWeight2.ReceiveTimeout = 5000;
|
|||
|
|
if (socketWeight2.Connected == false)
|
|||
|
|
{
|
|||
|
|
socketWeight2.Connect(ipe);//连接到服务器
|
|||
|
|
AddText(" 称重模块2:" + IP + " 连接成功");
|
|||
|
|
sts = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("称重模块2:" + IP + " 连接失败" + ex.Message);
|
|||
|
|
sts = false;
|
|||
|
|
}
|
|||
|
|
return sts;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
private void GetTest()
|
|||
|
|
{
|
|||
|
|
//DataTable dt = DataClass.Instance().test1();
|
|||
|
|
//if (dt != null && dt.Rows.Count > 0)
|
|||
|
|
//{
|
|||
|
|
// for (int i = 0; i < dt.Rows.Count; i++)
|
|||
|
|
// {
|
|||
|
|
|
|||
|
|
// string strLOCATION_ID = dt.Rows[i]["LOCATION_ID"].ToString();
|
|||
|
|
// string strSORT= dt.Rows[i]["SORT"].ToString();
|
|||
|
|
|
|||
|
|
// if (DataClass.Instance().Updatetest(strSORT, strLOCATION_ID))
|
|||
|
|
// {
|
|||
|
|
// AddText("更新货位入库顺序成功");
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// AddText("更新货位入库顺序失败:"+ strLOCATION_ID);
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//AddText("更新货位完成");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region ConnectPLC
|
|||
|
|
private bool ConnectAll(ref string strMsg)
|
|||
|
|
{
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (plcModbus != null)
|
|||
|
|
{
|
|||
|
|
if (plcModbus.Count > 0)
|
|||
|
|
{
|
|||
|
|
plcModbus.Clear();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (int i = 0; i < stockerip.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (!ConnectPLC(i,ref errText))
|
|||
|
|
{
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
strMsg = errText;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// List<DecID> DecSts = new List<DecID>();
|
|||
|
|
private bool ConnectPLC(int i,ref string errText)
|
|||
|
|
{
|
|||
|
|
lock ("a")
|
|||
|
|
{
|
|||
|
|
string ip = string.Empty;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
SiemensS7Net modbusClient = new SiemensS7Net(SiemensPLCS.S1500);
|
|||
|
|
modbusClient.IpAddress = stockerip[i];
|
|||
|
|
ip = stockerip[i];
|
|||
|
|
OperateResult sslt = modbusClient.ConnectServer();
|
|||
|
|
if (sslt.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (plcModbus.Count(r => r.Key == i + 1) > 0)
|
|||
|
|
{
|
|||
|
|
plcModbus[i + 1] = modbusClient;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
plcModbus.Add(i + 1, modbusClient);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//AddText("PLC地址:" + stockerip[i] + ",连接异常:" + sslt.Message);
|
|||
|
|
errText = "PLC地址:" + stockerip[i] + ",连接异常:" + sslt.Message;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("PLC地址:"+ stockerip[i]+",连接异常:"+ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
private void MainForm_Load(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
textBox1.Text = "20";
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
|
|||
|
|
//DataClass.Instance().GetLOCATIONID("1", ref errText);
|
|||
|
|
|
|||
|
|
// http://ip:port/Camstar/PackStock.asmx/PackStockIn?pkwPackLot='"++"' &pCustPackId=''&pSubInventory='3001' &pLocation='3001-01051012'
|
|||
|
|
// http://10.50.223.1:8099/Camstar/PackStock.asmx/PackStockIn?pkwPackLot='BAG3-20241016003440'&pCustPackId=''&pSubInventory='3001' &pLocation='3001-01051012'
|
|||
|
|
string conveyorip1 = RfConfig.Create().ScanIp1; //堆垛机1
|
|||
|
|
string conveyorip2 = RfConfig.Create().ScanIp2; //堆垛机2
|
|||
|
|
string conveyorip3 = RfConfig.Create().ScanIp3; //堆垛机3
|
|||
|
|
string conveyorip4 = RfConfig.Create().ScanIp4; //输送机
|
|||
|
|
MesIpPort = RfConfig.Create().WmsSendIP;
|
|||
|
|
|
|||
|
|
|
|||
|
|
stockerip.Add(conveyorip1);
|
|||
|
|
stockerip.Add(conveyorip2);
|
|||
|
|
stockerip.Add(conveyorip3);
|
|||
|
|
stockerip.Add(conveyorip4);
|
|||
|
|
|
|||
|
|
ConnectAll(ref errText);
|
|||
|
|
if (errText.Length>0)
|
|||
|
|
{
|
|||
|
|
AddText(errText);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
decFauleList = DataClass.Instance().GetDictionary(ref errText);
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机故障代码与信息查询异常");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (decFauleList.Count <= 0)
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机故障代码与信息查询失败");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
new Thread((ThreadStart)delegate
|
|||
|
|
{
|
|||
|
|
//读取所有输送机状态
|
|||
|
|
DecConvertSts();
|
|||
|
|
}).Start();
|
|||
|
|
|
|||
|
|
|
|||
|
|
new Thread((ThreadStart)delegate
|
|||
|
|
{
|
|||
|
|
//出入库任务显示
|
|||
|
|
GetOnData();
|
|||
|
|
}).Start();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 堆垛机状态检测
|
|||
|
|
//Thread tr1 = new Thread(new ThreadStart(GetDevFault));//监控堆垛机故障
|
|||
|
|
//tr1.IsBackground = true;
|
|||
|
|
//tr1.Start();
|
|||
|
|
|
|||
|
|
Thread tr2 = new Thread(new ThreadStart(GetSysInfo)); //监控堆垛机 任务号、状态、控制方式、位置
|
|||
|
|
tr2.IsBackground = true;
|
|||
|
|
tr2.Start();
|
|||
|
|
|
|||
|
|
|
|||
|
|
Thread tr12 = new Thread(new ThreadStart(SSJ_STATUS));//输送机颜色显示
|
|||
|
|
tr12.IsBackground = true;
|
|||
|
|
tr12.Start();
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 入库线程 (状态:0未执行,1扫码完成写输送机,2写堆垛机成功,3堆垛机过账成功)
|
|||
|
|
|
|||
|
|
new Thread((ThreadStart)delegate
|
|||
|
|
{
|
|||
|
|
// 入库成功调用MES 入库接口回传
|
|||
|
|
WCS_To_MES_IN();
|
|||
|
|
}).Start();
|
|||
|
|
|
|||
|
|
|
|||
|
|
Thread tr8 = new Thread(new ThreadStart(Bcr_To_SSJ));//扫码器96位置读取到条码写输送机任务(路向1,3)
|
|||
|
|
tr8.IsBackground = true;
|
|||
|
|
tr8.Start();
|
|||
|
|
//MES_AGIN
|
|||
|
|
Thread tr19 = new Thread(new ThreadStart(MES_AGIN));//定时上报mes
|
|||
|
|
tr19.IsBackground = true;
|
|||
|
|
tr19.Start();
|
|||
|
|
|
|||
|
|
Thread tr10 = new Thread(new ThreadStart(TASK_UPDATE));//站台读取到托盘吗更新任务状态或删除任务
|
|||
|
|
tr10.IsBackground = true;
|
|||
|
|
tr10.Start();
|
|||
|
|
|
|||
|
|
//Thread tr13 = new Thread(new ThreadStart(TASK_UPDATE));//站台读取到托盘吗更新任务状态或删除任务
|
|||
|
|
//tr13.IsBackground = true;
|
|||
|
|
//tr13.Start();
|
|||
|
|
|
|||
|
|
Thread tr9 = new Thread(new ThreadStart(RkCK_DDJ));//读取入库站台是否有货写堆垛机任务 出库任务下发堆垛机
|
|||
|
|
tr9.IsBackground = true;
|
|||
|
|
tr9.Start();
|
|||
|
|
|
|||
|
|
//Thread tr13 = new Thread(new ThreadStart(STACKER_TASK));//读取入库站台是否有货写堆垛机任务 出库任务下发堆垛机
|
|||
|
|
//tr13.IsBackground = true;
|
|||
|
|
//tr13.Start();
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 出库线程 (状态:0未执行,1写堆垛机成功,3堆垛机过账成功)
|
|||
|
|
//Thread tr10 = new Thread(new ThreadStart(Set_CK_Task));//查询出库任务写堆垛机
|
|||
|
|
//tr10.IsBackground = true;
|
|||
|
|
//tr10.Start();
|
|||
|
|
|
|||
|
|
//////查询 成品搬运单完成接口表订单 查询出库表对应的订单 更改状态为10 扣除库存
|
|||
|
|
//Thread tr11 = new Thread(new ThreadStart(Get_MES_TO_WMS_CK_FINISH));
|
|||
|
|
//tr11.IsBackground = true;
|
|||
|
|
//tr11.Start();
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
Thread tr7 = new Thread(new ThreadStart(ClearAccount));//过账进程,用于处理PLC过账信息
|
|||
|
|
tr7.IsBackground = true;
|
|||
|
|
tr7.Start();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//if (!Get_Siemens_ConnectToPlc())
|
|||
|
|
//{
|
|||
|
|
// return;
|
|||
|
|
//}
|
|||
|
|
//if (!Get_Siemens_ConnectToPlc2())
|
|||
|
|
//{
|
|||
|
|
// return;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//if (!GetSocketCon11(RfConfig.Create().ScanIp3, 26))
|
|||
|
|
//{
|
|||
|
|
// return;
|
|||
|
|
//}
|
|||
|
|
//if (!GetSocketCon12(RfConfig.Create().ScanIp4, 26))
|
|||
|
|
//{
|
|||
|
|
// return;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
AddText("系统启动成功.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private static object cklock = new object();
|
|||
|
|
private void Get_MES_TO_WMS_CK_FINISH ()
|
|||
|
|
{
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
lock (cklock)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
DataTable dt = DataClass.Instance().Get_cux_wms_move_order_lot_itf_zh();
|
|||
|
|
if (dt != null)
|
|||
|
|
{
|
|||
|
|
if (dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string BarCode = dt.Rows[0]["out_bar_code"].ToString().Trim();
|
|||
|
|
|
|||
|
|
string INNER_BAR_CODE = dt.Rows[0]["INNER_BAR_CODE"].ToString().Trim();
|
|||
|
|
string request_number= dt.Rows[0]["request_number"].ToString().Trim();
|
|||
|
|
string line_number = dt.Rows[0]["line_number"].ToString().Trim();
|
|||
|
|
DataTable dtCK = DataClass.Instance().Get_T_CK_PICKINGWAVEGOODS_sts9(BarCode, INNER_BAR_CODE);
|
|||
|
|
if (dtCK != null && dtCK.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string pickingid = dtCK.Rows[0]["pickingid"].ToString();
|
|||
|
|
string CTL = dtCK.Rows[0]["CTL"].ToString();
|
|||
|
|
if (DataClass.Instance().UPDATE_T_CK_PICKINGWAVEGOODS_STS10(BarCode, pickingid))
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().UpdateT_MI_STOCK("10", CTL);
|
|||
|
|
DataClass.Instance().UPDATE_CUX_WMS_MOVE_ORDER_FSH_ITF_ZH_sts(request_number, line_number, 3);
|
|||
|
|
AddText("EBS出库完成WMS出库订单状态改10成功,内外箱条码:" + BarCode);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().UPDATE_CUX_WMS_MOVE_ORDER_FSH_ITF_ZH_sts(request_number, line_number, 2);
|
|||
|
|
AddText("EBS出库完成查询出库任务不存在,内外箱条码:" + BarCode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().UPDATE_CUX_WMS_MOVE_ORDER_FSH_ITF_ZH_sts(request_number, line_number, 2);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
//AddText("成品搬运单完成接口表订单处理异常:" + ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 监控堆垛机故障
|
|||
|
|
|
|||
|
|
private static object objGetDevFault = new object ();
|
|||
|
|
/// <summary>
|
|||
|
|
/// 堆垛机故障
|
|||
|
|
/// </summary>
|
|||
|
|
private void GetDevFault()
|
|||
|
|
{
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
lock (objGetDevFault)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//#region 堆垛机1故障
|
|||
|
|
|
|||
|
|
//for (int i = 1; i <= 2; i++)
|
|||
|
|
//{
|
|||
|
|
// OperateResult<short> opfhid = plcModbus[i].ReadInt16("DB90.22");
|
|||
|
|
// if (opfhid.IsSuccess)
|
|||
|
|
// {
|
|||
|
|
// string devFault1 = opfhid.Content.ToString();
|
|||
|
|
|
|||
|
|
// if (devFault1 == "0")
|
|||
|
|
// {
|
|||
|
|
// //DataClass.Instance().updateErrlist(i.ToString(), devFault1, ref errtext);
|
|||
|
|
// //DataClass.Instance().UpdateDevFault(i.ToString(), "设备正常");
|
|||
|
|
// if (i == 1)
|
|||
|
|
// {
|
|||
|
|
// groupBox1.BackColor = Color.Transparent;
|
|||
|
|
// //txtError.AppendText("");
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// groupBox2.BackColor = Color.Transparent;
|
|||
|
|
// //txtError.AppendText("");
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// OperateResult<short> opfhid1 = plcModbus[4].ReadInt16("DB90.22");
|
|||
|
|
// OperateResult<short> opfhid2 = plcModbus[4].ReadInt16("DB90.22");
|
|||
|
|
// if (opfhid1.Content.ToString() == "0" && opfhid2.Content.ToString() == "0")
|
|||
|
|
// {
|
|||
|
|
// txtError.AppendText("");
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// string msg = decFauleList[devFault1].ToString();
|
|||
|
|
// //DataClass.Instance().UpdateDevFault("1", msg);
|
|||
|
|
|
|||
|
|
// //DataClass.Instance().insertErrlist(i.ToString(), msg, devFault1, isok, plcid, ref errtext);
|
|||
|
|
// if (i == 1)
|
|||
|
|
// {
|
|||
|
|
// groupBox1.BackColor = Color.LightCoral;
|
|||
|
|
// txtErrorMsg("堆垛机1:" + msg);
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// groupBox2.BackColor = Color.LightCoral;
|
|||
|
|
// txtErrorMsg("堆垛机2:" + msg);
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// txtErrorMsg("堆垛机连接异常:" + opfhid.Message);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//#endregion
|
|||
|
|
|
|||
|
|
////输送机控制方式:1维修,2手动,5联机
|
|||
|
|
//OperateResult<short> m101 = plcModbus[4].ReadInt16("DB90.8");
|
|||
|
|
//if (m101.IsSuccess)
|
|||
|
|
//{
|
|||
|
|
// if(m101.Content.ToString()=="1")
|
|||
|
|
// {
|
|||
|
|
// labelControl19.Text = "输送机模式:维修";
|
|||
|
|
// labelControl19.ForeColor = Color.Red;
|
|||
|
|
// AddText("输送机模式:维修");
|
|||
|
|
// }
|
|||
|
|
// else if (m101.Content.ToString() == "2")
|
|||
|
|
// {
|
|||
|
|
// labelControl19.Text = "输送机模式:手动";
|
|||
|
|
// labelControl19.ForeColor = Color.Red;
|
|||
|
|
// AddText("输送机模式:手动");
|
|||
|
|
// }
|
|||
|
|
// else if (m101.Content.ToString() == "5")
|
|||
|
|
// {
|
|||
|
|
// labelControl19.Text = "输送机模式:联机";
|
|||
|
|
// labelControl19.ForeColor = Color.Blue;
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
Thread.Sleep(3000);
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机故障异常:" + ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 监控堆垛机控制方式/位置
|
|||
|
|
/// <summary>
|
|||
|
|
/// 监控堆垛机控制方式/状态/位置/任务号
|
|||
|
|
/// </summary>
|
|||
|
|
///
|
|||
|
|
|
|||
|
|
private static object objinfo = new object();
|
|||
|
|
private void GetSysInfo()
|
|||
|
|
{
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
lock (objinfo)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string errtext = "";
|
|||
|
|
string Plcid = "";
|
|||
|
|
string strCon = "";
|
|||
|
|
for (int i = 1; i < 4; i++)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
OperateResult<int> opfhidPLCID = plcModbus[i].ReadInt32("DB91.0");
|
|||
|
|
if (opfhidPLCID.IsSuccess)
|
|||
|
|
{
|
|||
|
|
Plcid = opfhidPLCID.Content.ToString();
|
|||
|
|
//任务号
|
|||
|
|
if (i == 1)
|
|||
|
|
{
|
|||
|
|
TxtPlcid1.Text = Plcid;
|
|||
|
|
}
|
|||
|
|
else if (i == 2)
|
|||
|
|
{
|
|||
|
|
//任务号
|
|||
|
|
TxtPlcid2.Text = Plcid;
|
|||
|
|
}
|
|||
|
|
else if (i == 3)
|
|||
|
|
{
|
|||
|
|
//任务号
|
|||
|
|
TxtPlcid3.Text = Plcid;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
txtErrorMsg("堆垛机连接异常:" + opfhidPLCID.Message);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OperateResult<short[]> opfhid = plcModbus[i].ReadInt16("DB91.4", 8);
|
|||
|
|
if (opfhid.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (i == 1)
|
|||
|
|
{
|
|||
|
|
//控制方式 DB91.4
|
|||
|
|
string kzfssts = opfhid.Content[0].ToString();//堆垛机控制方式 联机 脱机 手动
|
|||
|
|
switch (kzfssts)
|
|||
|
|
{
|
|||
|
|
case "0":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod01.Text = "待机";
|
|||
|
|
TxtEquipmenetControlMethod01.ForeColor = Color.Black;
|
|||
|
|
strCon = "待机";
|
|||
|
|
break;
|
|||
|
|
case "1":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod01.Text = "自学习";
|
|||
|
|
TxtEquipmenetControlMethod01.ForeColor = Color.Red;
|
|||
|
|
strCon = "自学习";
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod01.Text = "调试";
|
|||
|
|
TxtEquipmenetControlMethod01.ForeColor = Color.Red;
|
|||
|
|
strCon = "调试";
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod01.Text = "手动";
|
|||
|
|
TxtEquipmenetControlMethod01.ForeColor = Color.Red;
|
|||
|
|
strCon = "手动";
|
|||
|
|
break;
|
|||
|
|
case "4":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod01.Text = "自动";
|
|||
|
|
TxtEquipmenetControlMethod01.ForeColor = Color.Red;
|
|||
|
|
strCon = "自动";
|
|||
|
|
break;
|
|||
|
|
case "5":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod01.Text = "联机";
|
|||
|
|
TxtEquipmenetControlMethod01.ForeColor = Color.Black;
|
|||
|
|
strCon = "联机";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
strCon = "异常";
|
|||
|
|
TxtEquipmenetControlMethod01.Text = "异常";
|
|||
|
|
TxtEquipmenetControlMethod01.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//状态 DB91.6
|
|||
|
|
string kzControl = opfhid.Content[1].ToString();
|
|||
|
|
switch (kzControl)
|
|||
|
|
{
|
|||
|
|
case "1":
|
|||
|
|
TxtEquipmentStatus01.Text = "空闲";
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
TxtEquipmentStatus01.Text = "指令接收";
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
TxtEquipmentStatus01.Text = "取货移动";
|
|||
|
|
break;
|
|||
|
|
case "4":
|
|||
|
|
TxtEquipmentStatus01.Text = "取货中";
|
|||
|
|
break;
|
|||
|
|
case "5":
|
|||
|
|
TxtEquipmentStatus01.Text = "取货完成";
|
|||
|
|
break;
|
|||
|
|
case "6":
|
|||
|
|
TxtEquipmentStatus01.Text = "卸货移动";
|
|||
|
|
break;
|
|||
|
|
case "7":
|
|||
|
|
TxtEquipmentStatus01.Text = "卸货中";
|
|||
|
|
break;
|
|||
|
|
case "8":
|
|||
|
|
TxtEquipmentStatus01.Text = "出库卸货完成";
|
|||
|
|
break;
|
|||
|
|
case "9":
|
|||
|
|
TxtEquipmentStatus01.Text = "入库卸货完成";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
TxtEquipmentStatus01.Text = "脱机状态";
|
|||
|
|
//TxtEquipmentStatus01.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//位置DB91.10
|
|||
|
|
string EquipmenetRow = opfhid.Content[3].ToString();
|
|||
|
|
string EquipmenetList = opfhid.Content[4].ToString();
|
|||
|
|
string EquipmenetLayer = opfhid.Content[5].ToString();
|
|||
|
|
TBCEquipmentLocation1.Value = int.Parse(EquipmenetList);
|
|||
|
|
TxtEquipmentLocation1.Text = EquipmenetRow + "排" + EquipmenetList + "列" + EquipmenetLayer + "层";
|
|||
|
|
DataClass.Instance().UpdateDevControl("1", TxtEquipmenetControlMethod01.Text, TxtEquipmentStatus01.Text, TxtPlcid1.Text);
|
|||
|
|
}
|
|||
|
|
else if (i == 2)
|
|||
|
|
{
|
|||
|
|
//控制方式
|
|||
|
|
string kzfssts = opfhid.Content[0].ToString();//堆垛机控制方式 联机 脱机 手动
|
|||
|
|
switch (kzfssts)
|
|||
|
|
{
|
|||
|
|
case "0":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod02.Text = "待机";
|
|||
|
|
TxtEquipmenetControlMethod02.ForeColor = Color.Black;
|
|||
|
|
strCon = "待机";
|
|||
|
|
break;
|
|||
|
|
case "1":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod02.Text = "自学习";
|
|||
|
|
TxtEquipmenetControlMethod02.ForeColor = Color.Red;
|
|||
|
|
strCon = "自学习";
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
strCon = "调试";
|
|||
|
|
TxtEquipmenetControlMethod02.Text = "调试";
|
|||
|
|
TxtEquipmenetControlMethod02.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
strCon = "手动";
|
|||
|
|
TxtEquipmenetControlMethod02.Text = "手动";
|
|||
|
|
TxtEquipmenetControlMethod02.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
case "4":
|
|||
|
|
strCon = "自动";
|
|||
|
|
TxtEquipmenetControlMethod02.Text = "自动";
|
|||
|
|
TxtEquipmenetControlMethod02.ForeColor = Color.Red;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
case "5":
|
|||
|
|
strCon = "联机";
|
|||
|
|
TxtEquipmenetControlMethod02.Text = "联机";
|
|||
|
|
TxtEquipmenetControlMethod02.ForeColor = Color.Black;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
strCon = "异常";
|
|||
|
|
TxtEquipmenetControlMethod02.Text = "异常";
|
|||
|
|
TxtEquipmenetControlMethod02.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//状态
|
|||
|
|
string kzControl = opfhid.Content[1].ToString();
|
|||
|
|
switch (kzControl)
|
|||
|
|
{
|
|||
|
|
case "1":
|
|||
|
|
TxtEquipmentStatus02.Text = "空闲";
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
TxtEquipmentStatus02.Text = "指令接收";
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
TxtEquipmentStatus02.Text = "取货移动";
|
|||
|
|
break;
|
|||
|
|
case "4":
|
|||
|
|
TxtEquipmentStatus02.Text = "取货中";
|
|||
|
|
break;
|
|||
|
|
case "5":
|
|||
|
|
TxtEquipmentStatus02.Text = "取货完成";
|
|||
|
|
break;
|
|||
|
|
case "6":
|
|||
|
|
TxtEquipmentStatus02.Text = "卸货移动";
|
|||
|
|
break;
|
|||
|
|
case "7":
|
|||
|
|
TxtEquipmentStatus02.Text = "卸货中";
|
|||
|
|
break;
|
|||
|
|
case "8":
|
|||
|
|
TxtEquipmentStatus02.Text = "出库卸货完成";
|
|||
|
|
break;
|
|||
|
|
case "9":
|
|||
|
|
TxtEquipmentStatus02.Text = "入库卸货完成";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
TxtEquipmentStatus02.Text = "脱机状态";
|
|||
|
|
//TxtEquipmentStatus02.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//位置
|
|||
|
|
string EquipmenetRow = opfhid.Content[3].ToString();
|
|||
|
|
string EquipmenetList = opfhid.Content[4].ToString();
|
|||
|
|
string EquipmenetLayer = opfhid.Content[5].ToString();
|
|||
|
|
TBCEquipmentLocation2.Value = int.Parse(EquipmenetList);
|
|||
|
|
TxtEquipmentLocation2.Text = EquipmenetRow + "排" + EquipmenetList + "列" + EquipmenetLayer + "层";
|
|||
|
|
DataClass.Instance().UpdateDevControl("2", TxtEquipmenetControlMethod02.Text, TxtEquipmentStatus02.Text, TxtPlcid2.Text);
|
|||
|
|
}
|
|||
|
|
else if (i == 3)
|
|||
|
|
{
|
|||
|
|
//控制方式
|
|||
|
|
string kzfssts = opfhid.Content[0].ToString();//堆垛机控制方式 联机 脱机 手动
|
|||
|
|
switch (kzfssts)
|
|||
|
|
{
|
|||
|
|
case "0":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod03.Text = "待机";
|
|||
|
|
TxtEquipmenetControlMethod03.ForeColor = Color.Black;
|
|||
|
|
strCon = "待机";
|
|||
|
|
break;
|
|||
|
|
case "1":
|
|||
|
|
|
|||
|
|
TxtEquipmenetControlMethod03.Text = "自学习";
|
|||
|
|
TxtEquipmenetControlMethod03.ForeColor = Color.Red;
|
|||
|
|
strCon = "自学习";
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
strCon = "调试";
|
|||
|
|
TxtEquipmenetControlMethod03.Text = "调试";
|
|||
|
|
TxtEquipmenetControlMethod03.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
strCon = "手动";
|
|||
|
|
TxtEquipmenetControlMethod03.Text = "手动";
|
|||
|
|
TxtEquipmenetControlMethod03.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
case "4":
|
|||
|
|
strCon = "自动";
|
|||
|
|
TxtEquipmenetControlMethod03.Text = "自动";
|
|||
|
|
TxtEquipmenetControlMethod03.ForeColor = Color.Red;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
case "5":
|
|||
|
|
strCon = "联机";
|
|||
|
|
TxtEquipmenetControlMethod03.Text = "联机";
|
|||
|
|
TxtEquipmenetControlMethod03.ForeColor = Color.Black;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
strCon = "异常";
|
|||
|
|
TxtEquipmenetControlMethod03.Text = "异常";
|
|||
|
|
TxtEquipmenetControlMethod03.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//状态
|
|||
|
|
string kzControl = opfhid.Content[1].ToString();
|
|||
|
|
switch (kzControl)
|
|||
|
|
{
|
|||
|
|
case "1":
|
|||
|
|
TxtEquipmentStatus03.Text = "空闲";
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
TxtEquipmentStatus03.Text = "指令接收";
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
TxtEquipmentStatus03.Text = "取货移动";
|
|||
|
|
break;
|
|||
|
|
case "4":
|
|||
|
|
TxtEquipmentStatus03.Text = "取货中";
|
|||
|
|
break;
|
|||
|
|
case "5":
|
|||
|
|
TxtEquipmentStatus03.Text = "取货完成";
|
|||
|
|
break;
|
|||
|
|
case "6":
|
|||
|
|
TxtEquipmentStatus03.Text = "卸货移动";
|
|||
|
|
break;
|
|||
|
|
case "7":
|
|||
|
|
TxtEquipmentStatus03.Text = "卸货中";
|
|||
|
|
break;
|
|||
|
|
case "8":
|
|||
|
|
TxtEquipmentStatus03.Text = "出库卸货完成";
|
|||
|
|
break;
|
|||
|
|
case "9":
|
|||
|
|
TxtEquipmentStatus03.Text = "入库卸货完成";
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
TxtEquipmentStatus03.Text = "脱机状态";
|
|||
|
|
//TxtEquipmentStatus02.ForeColor = Color.Red;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//位置
|
|||
|
|
string EquipmenetRow = opfhid.Content[3].ToString();
|
|||
|
|
string EquipmenetList = opfhid.Content[4].ToString();
|
|||
|
|
string EquipmenetLayer = opfhid.Content[5].ToString();
|
|||
|
|
TBCEquipmentLocation3.Value = int.Parse(EquipmenetList);
|
|||
|
|
TxtEquipmentLocation3.Text = EquipmenetRow + "排" + EquipmenetList + "列" + EquipmenetLayer + "层";
|
|||
|
|
DataClass.Instance().UpdateDevControl("3", TxtEquipmenetControlMethod03.Text, TxtEquipmentStatus03.Text, TxtPlcid3.Text);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
txtErrorMsg("堆垛机连接异常:" + opfhid.Message);
|
|||
|
|
}
|
|||
|
|
OperateResult<short> opfhid2 = plcModbus[i].ReadInt16("DB91.22");
|
|||
|
|
if (opfhid2.IsSuccess)
|
|||
|
|
{
|
|||
|
|
string devFault1 = opfhid2.Content.ToString();
|
|||
|
|
|
|||
|
|
if (devFault1 == "0")
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().updateErrlist(i.ToString(), devFault1, ref errtext);
|
|||
|
|
//DataClass.Instance().UpdateDevFault(i.ToString(), "设备正常");
|
|||
|
|
if (i == 1)
|
|||
|
|
{
|
|||
|
|
groupBox1.BackColor = Color.Transparent;
|
|||
|
|
//txtError.AppendText("");
|
|||
|
|
}
|
|||
|
|
else if (i == 2)
|
|||
|
|
{
|
|||
|
|
groupBox2.BackColor = Color.Transparent;
|
|||
|
|
//txtError.AppendText("");
|
|||
|
|
}
|
|||
|
|
else if (i == 3)
|
|||
|
|
{
|
|||
|
|
groupBox5.BackColor = Color.Transparent;
|
|||
|
|
//txtError.AppendText("");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//OperateResult<short> opfhid11 = plcModbus[4].ReadInt16("DB91.22");
|
|||
|
|
|
|||
|
|
//if (opfhid11.Content.ToString() == "0")
|
|||
|
|
//{
|
|||
|
|
// txtError.Text="";
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string msg = decFauleList[devFault1].ToString();
|
|||
|
|
//DataClass.Instance().UpdateDevFault("1", msg);
|
|||
|
|
|
|||
|
|
DataClass.Instance().insertErrlist(i.ToString(), msg, devFault1, strCon, Plcid, ref errtext);
|
|||
|
|
if (i == 1)
|
|||
|
|
{
|
|||
|
|
groupBox1.BackColor = Color.LightCoral;
|
|||
|
|
txtErrorMsg("堆垛机1:" + msg);
|
|||
|
|
}
|
|||
|
|
else if (i == 2)
|
|||
|
|
{
|
|||
|
|
groupBox2.BackColor = Color.LightCoral;
|
|||
|
|
txtErrorMsg("堆垛机2:" + msg);
|
|||
|
|
}
|
|||
|
|
else if (i == 3)
|
|||
|
|
{
|
|||
|
|
groupBox5.BackColor = Color.LightCoral;
|
|||
|
|
txtErrorMsg("堆垛机3:" + msg);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
txtErrorMsg("堆垛机连接异常:" + opfhid.Message);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
//AddText("监控堆垛机任务号/控制方式/位置/异常:" + ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region agv入库放货完成,出来时通知WMS ,WMS给输送机写启动信号
|
|||
|
|
|
|||
|
|
public class Rootobject
|
|||
|
|
{
|
|||
|
|
public string reqCode { get; set; }
|
|||
|
|
public string reqTime { get; set; }
|
|||
|
|
public string clientCode { get; set; }
|
|||
|
|
public string tokenCode { get; set; }
|
|||
|
|
public string interfaceName { get; set; }
|
|||
|
|
public string wbCode { get; set; }
|
|||
|
|
public string podCode { get; set; }
|
|||
|
|
public string agvCode { get; set; }
|
|||
|
|
public string taskCode { get; set; }
|
|||
|
|
public string taskSeq { get; set; }
|
|||
|
|
public Nextpositioncode nextPositionCode { get; set; }
|
|||
|
|
public string data { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class Nextpositioncode
|
|||
|
|
{
|
|||
|
|
public string positionCode { get; set; }
|
|||
|
|
public string type { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class DataListAgv
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string carrierTyp { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string materialLot { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string materialCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string sysLotNum { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string podLotNum { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string lotStatus { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string includeScrap { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string podStatus { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class RootAGVrun
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string reqCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string reqTime { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string clientCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string tokenCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string taskTyp { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string sceneTyp { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string ctnrTyp { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string ctnrCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string wbCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public List<string> userCallCodePath { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string podCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string podDir { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string podTyp { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string materialLot { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string priority { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string agvCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string taskCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public DataListAgv data { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private object wmsData = new object();
|
|||
|
|
public string GetWmsData(string value, string sts)
|
|||
|
|
{
|
|||
|
|
lock (wmsData)
|
|||
|
|
{
|
|||
|
|
string retJson = "";
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
WriteSysLog.SysLog("WCS调用MES 入库接口:"+ value);
|
|||
|
|
string url = value;
|
|||
|
|
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
|
|||
|
|
req.ContentType = "text/html";
|
|||
|
|
|
|||
|
|
req.Method = "GET";
|
|||
|
|
req.Timeout = 3000;
|
|||
|
|
|
|||
|
|
HttpWebResponse response = req.GetResponse() as HttpWebResponse;
|
|||
|
|
using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
|
|||
|
|
{
|
|||
|
|
retJson = sr.ReadToEnd();
|
|||
|
|
WriteSysLog.SysLog("WCS调用MES 入库接口返回:" + retJson);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return retJson;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public string GetRequest(string url, string headerToken)
|
|||
|
|
{
|
|||
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
|
|||
|
|
request.Method = "GET";
|
|||
|
|
//request.ContentType = "text/html, application/xhtml+xml, */*";
|
|||
|
|
request.ContentType = "text/html";
|
|||
|
|
|
|||
|
|
//request.Headers["X-XTRA-AUTH-ID"] = headerToken; //添加头
|
|||
|
|
|
|||
|
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
|||
|
|
Stream rs = response.GetResponseStream();
|
|||
|
|
//StreamReader sr = new StreamReader(rs, encode);
|
|||
|
|
StreamReader sr = new StreamReader(rs, Encoding.UTF8);
|
|||
|
|
var result = sr.ReadToEnd();
|
|||
|
|
sr.Close();
|
|||
|
|
rs.Close();
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// WCS入库成功回传MES
|
|||
|
|
/// </summary>
|
|||
|
|
private void WCS_To_MES_IN ()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
string errText = String.Empty;
|
|||
|
|
|
|||
|
|
lock ("agv")
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//正式环境:10.50.220.1:8099
|
|||
|
|
// string strUUID = Guid.NewGuid().ToString("N");//32位
|
|||
|
|
// http://10.50.223.1:8099/Camstar/PackStock.asmx/PackStockIn?pkwPackLot='BAG3-20241016003440'&pCustPackId=''&pSubInventory='3001' &pLocation='3001-01051012'
|
|||
|
|
DataSet dtAgv = DataClass.Instance().Get_MES_TO_WMS_IN();
|
|||
|
|
if (dtAgv != null && dtAgv.Tables[0].Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < dtAgv.Tables[0].Rows.Count; i++)
|
|||
|
|
{
|
|||
|
|
string STORAGE_ID = dtAgv.Tables[0].Rows[i]["STORAGE_ID"].ToString(); //字库编号
|
|||
|
|
string LOCATION_ID = dtAgv.Tables[0].Rows[i]["LOCATION_ID"].ToString();
|
|||
|
|
string BARCODE = dtAgv.Tables[0].Rows[i]["BARCODE"].ToString();//外箱子 + 内箱子条码
|
|||
|
|
string CUSTOMER_ID= dtAgv.Tables[0].Rows[i]["CUSTOMER_ID"].ToString();//客户代码
|
|||
|
|
//下发AGV搬运
|
|||
|
|
//3001-WMS-00
|
|||
|
|
//string newLoc = STORAGE_ID + "-" + LOCATION_ID.Substring(0, 2) + "-" + LOCATION_ID;//+ "." + CUSTOMER_ID
|
|||
|
|
string newLoc = STORAGE_ID + "-WMS-00";
|
|||
|
|
|
|||
|
|
string strJsonRK = GetWmsData("http://" + MesIpPort + "/Camstar/PackStock.asmx/PackStockIn?pkwPackLot="+ BARCODE + "&pCustPackId=&pSubInventory="+ STORAGE_ID + "&pLocation="+ newLoc + "", "");
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入库成功{dtAgv.Tables[0].Rows[i]["CTL"].ToString()}回传MES异常:" + errText);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (strJsonRK.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("WCS入库成功回传MES返回:" + strJsonRK);
|
|||
|
|
|
|||
|
|
if (!strJsonRK.Contains("当前工位 '成品仓'") &&strJsonRK.Contains("Error"))
|
|||
|
|
{
|
|||
|
|
//间隔三秒再次调用mes
|
|||
|
|
AddText("WCS入库成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + "");
|
|||
|
|
Thread.Sleep(3000);
|
|||
|
|
string strJsonRK_agin = GetWmsData("http://" + MesIpPort + "/Camstar/PackStock.asmx/PackStockIn?pkwPackLot=" + BARCODE + "&pCustPackId=&pSubInventory=" + STORAGE_ID + "&pLocation=" + newLoc + "", "");
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入库成功{dtAgv.Tables[0].Rows[i]["CTL"].ToString()}回传MES异常:" + errText);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (strJsonRK.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入库成功{dtAgv.Tables[0].Rows[i]["CTL"].ToString()}回传MES返回:" + strJsonRK);
|
|||
|
|
if(strJsonRK.Contains("Error"))
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_MI_STOCK_STSEBS(LOCATION_ID, BARCODE, "9"))
|
|||
|
|
{
|
|||
|
|
AddText("WCS入库成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入库成功{dtAgv.Tables[0].Rows[i]["CTL"].ToString()}回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9失败");
|
|||
|
|
}
|
|||
|
|
AddText("WCS入库成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + "");
|
|||
|
|
//Thread.Sleep(3000);
|
|||
|
|
//string strJsonRK_agin2 = GetWmsData("http://" + MesIpPort + "/Camstar/PackStock.asmx/PackStockIn?pkwPackLot=" + BARCODE + "&pCustPackId=&pSubInventory=" + STORAGE_ID + "&pLocation=" + newLoc + "", "");
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//if (DataClass.Instance().Update_T_MI_STOCK_STSEBS(LOCATION_ID, BARCODE, "2"))
|
|||
|
|
//{
|
|||
|
|
// AddText("WCS入库成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态2成功");
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// AddText("WCS入库成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态2失败");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_MI_STOCK_STSEBS(LOCATION_ID, BARCODE, "1"))
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入库成功{dtAgv.Tables[0].Rows[i]["CTL"].ToString()}回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态2成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("WCS入库成功回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态1失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("异常:" + ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private string GetBcrRetCode (string bcrid)//读取u型线条码
|
|||
|
|
{
|
|||
|
|
string strValues = string.Empty;
|
|||
|
|
OperateResult<byte[]> read = plcModbus[4].Read(GetBarCodePlcAddress(bcrid), 20);
|
|||
|
|
{
|
|||
|
|
if (read.IsSuccess)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < 20; i++)
|
|||
|
|
{
|
|||
|
|
strValues += ((char)read.Content[i]).ToString();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return strValues.Trim();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ckPort = 50;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 使用枚举定义状态
|
|||
|
|
public enum StackerStatus { Offline = 0, Online = 5 }
|
|||
|
|
|
|||
|
|
public int[] GetAvailableStackers()
|
|||
|
|
{
|
|||
|
|
var availableStackers = new List<int>();
|
|||
|
|
|
|||
|
|
for (int stackerId = 1; stackerId <= 3; stackerId++)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
var opStatus = plcModbus[stackerId].ReadInt16("DB91.4", 2);
|
|||
|
|
var opfhid2 = plcModbus[stackerId].ReadInt16("DB91.22");
|
|||
|
|
|
|||
|
|
if (!opStatus.IsSuccess || !opfhid2.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText($"堆垛机{stackerId}读取状态失败");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (opStatus.Content.Length < 1)
|
|||
|
|
{
|
|||
|
|
AddText($"堆垛机{stackerId}状态数据长度不足");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查联机状态且无故障
|
|||
|
|
if ((StackerStatus)opStatus.Content[0] == StackerStatus.Online
|
|||
|
|
&& opfhid2.Content == 0)
|
|||
|
|
{
|
|||
|
|
availableStackers.Add(stackerId);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText($"堆垛机{stackerId}通讯异常: {ex.ToString()}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return availableStackers.ToArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用线程安全的访问方式
|
|||
|
|
private static readonly object _locker = new object();
|
|||
|
|
private static int _stackerId = 0;
|
|||
|
|
|
|||
|
|
public int STACKER_TASKNUM()
|
|||
|
|
{
|
|||
|
|
//
|
|||
|
|
string sql = "select * from T_ONGOODSSHELF where LOCATION_ID is not null and TASKTYPE=1";
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int GetNextAvailableStacker()
|
|||
|
|
{
|
|||
|
|
lock (_locker)
|
|||
|
|
{
|
|||
|
|
//int[] availableStackers = GetAvailableStackers();
|
|||
|
|
int[] availableStackers = { 1, 2, 3 };
|
|||
|
|
|
|||
|
|
if (availableStackers.Length == 0)
|
|||
|
|
{
|
|||
|
|
AddText("警告:没有可用的堆垛机!");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 从未选择过或当前选择不可用
|
|||
|
|
if (_stackerId == 0 || !availableStackers.Contains(_stackerId))
|
|||
|
|
{
|
|||
|
|
_stackerId = availableStackers[0];
|
|||
|
|
return _stackerId;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 环形选择下一个
|
|||
|
|
int currentIndex = Array.IndexOf(availableStackers, _stackerId);
|
|||
|
|
int nextIndex = (currentIndex +1) % availableStackers.Length; // 这里加了1
|
|||
|
|
_stackerId = availableStackers[nextIndex];
|
|||
|
|
return _stackerId;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 入库获取条码信息写输送机任务
|
|||
|
|
/// <summary>
|
|||
|
|
/// 入库
|
|||
|
|
/// </summary>
|
|||
|
|
public void Bcr_To_SSJ()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
string errText = String.Empty;
|
|||
|
|
string str = string.Empty;
|
|||
|
|
int bytes = 0;
|
|||
|
|
int weight = 100;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//OperateResult ru = plcModbus[4].Write("DB9.DBW1700", (short)1);
|
|||
|
|
// 扫码器96位置读取到条码写输送机任务(路向1,3)
|
|||
|
|
foreach (string bcrId in BcrRkStation )
|
|||
|
|
{
|
|||
|
|
string code = GetBcrRetCode(bcrId);
|
|||
|
|
code = code.Replace(" ", "").ToString();
|
|||
|
|
code = code.Replace("\0", "").ToString();
|
|||
|
|
code = code.Replace("\r", "").ToString();
|
|||
|
|
if (code.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("接收扫码器编号:" + bcrId + ",料箱号:" + code);
|
|||
|
|
if (code == "NoRead")
|
|||
|
|
{
|
|||
|
|
string port = "";
|
|||
|
|
if (bcrId == "SSJ50")
|
|||
|
|
{
|
|||
|
|
port = "99";
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ53")
|
|||
|
|
{
|
|||
|
|
port = "99";
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ56")
|
|||
|
|
{
|
|||
|
|
port = "56";
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ81")
|
|||
|
|
{
|
|||
|
|
port = "99";
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ84")
|
|||
|
|
{
|
|||
|
|
port = "99";
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ88")
|
|||
|
|
{
|
|||
|
|
port = "99";
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ91")
|
|||
|
|
{
|
|||
|
|
port = "99";
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ96")
|
|||
|
|
{
|
|||
|
|
port = "99";
|
|||
|
|
}
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse(port));//进入人工码盘位置
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",扫码失败!循环");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (bcrId == "SSJ96")//入库扫码器
|
|||
|
|
{
|
|||
|
|
//有出库任务直行
|
|||
|
|
DataTable dt_OUT = DataClass.Instance().Get_T_CK_PICKING_GOODS(code.Trim(), ref errText);
|
|||
|
|
if(dt_OUT!=null)
|
|||
|
|
{
|
|||
|
|
if (dt_OUT.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string plcId = dt_OUT.Rows[0]["PLCID"].ToString();
|
|||
|
|
//string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("99"));//进入人工码盘位置
|
|||
|
|
if (retPlcId96.IsSuccess && retLX96.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",有出库任务-直行,写入99");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//有入库任务,处理
|
|||
|
|
DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF_SSX(code.Trim(), ref errText);
|
|||
|
|
if (dt != null)
|
|||
|
|
{
|
|||
|
|
if (dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string decId = "";
|
|||
|
|
string inStand = "";
|
|||
|
|
//读
|
|||
|
|
string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
string CTL = dt.Rows[0]["ctl"].ToString().Trim();//托盘
|
|||
|
|
string STORAGE_AREA_ID = dt.Rows[0]["STORAGE_AREA_ID"].ToString().Trim();//子库编号
|
|||
|
|
string GOODSID = dt.Rows[0]["GOODSID"].ToString().Trim(); // 000000空料箱
|
|||
|
|
string TASKTYPE = dt.Rows[0]["TASKTYPE"].ToString().Trim();//1入立体库 2 直接到包装线10空箱入库
|
|||
|
|
string LOCATION_ID = dt.Rows[0]["LOCATION_ID"].ToString().Trim();
|
|||
|
|
if (TASKTYPE == "1" || TASKTYPE == "10")//入库
|
|||
|
|
{
|
|||
|
|
if (TASKTYPE == "1")
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().GetkcCtl(CTL))
|
|||
|
|
{
|
|||
|
|
AddText("托盘编号:" + CTL + "货架中已存在该托盘,请检查托盘编号是否重复");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//查询货位
|
|||
|
|
if (GOODSID == "000000"&& LOCATION_ID=="")
|
|||
|
|
{
|
|||
|
|
//判断产线是否有叫空箱的任务存在,存在先补产线 在入立体库
|
|||
|
|
string pickingid = DataClass.Instance().Get_CtlNullCX();
|
|||
|
|
if (pickingid.Length > 0)
|
|||
|
|
{
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("99"));//进入人工码盘位置
|
|||
|
|
if (retPlcId96.IsSuccess && retLX96.IsSuccess)
|
|||
|
|
{
|
|||
|
|
//删除入库任务
|
|||
|
|
DataClass.Instance().Del_T_CK_PICKINGWAVEGOODS_pickingid(pickingid);
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",任务号:" + plcId + "料箱号:" + CTL + ",PDA叫空料箱任务优先到产线");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
OperateResult<short> ssjsts = plcModbus[4].ReadInt16("DB10.DBW3162");
|
|||
|
|
if (ssjsts.IsSuccess && ssjsts.Content == 0)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
int STACKER = GetNextAvailableStacker();
|
|||
|
|
AddText($"当前空箱{bcrId}入库堆垛机编号是:{STACKER}");
|
|||
|
|
LOCATION_ID = DataClass.Instance().GetLOCATIONID_EMPTY("3035", STACKER, ref errText);
|
|||
|
|
DataTable dtInStand = DataClass.Instance().Get_T_BASE_STORAGE_AREA_LOCATION_InStand(LOCATION_ID);
|
|||
|
|
if (dtInStand != null && dtInStand.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
decId = dtInStand.Rows[0]["decid"].ToString().Trim();
|
|||
|
|
inStand = dtInStand.Rows[0]["instand"].ToString().Trim();
|
|||
|
|
}
|
|||
|
|
//DataTable dtLocation = DataClass.Instance().GetNullCtl(ref errText);
|
|||
|
|
//if (dtLocation != null)
|
|||
|
|
//{
|
|||
|
|
// if (dtLocation.Rows.Count > 0)
|
|||
|
|
// {
|
|||
|
|
// LOCATION_ID = dtLocation.Rows[0]["location_id"].ToString().Trim();
|
|||
|
|
// decId = dtLocation.Rows[0]["decid"].ToString().Trim();
|
|||
|
|
// inStand = dtLocation.Rows[0]["instand"].ToString().Trim();
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//优先进入人工码盘位置
|
|||
|
|
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("96"));//进入人工码盘位置
|
|||
|
|
if (retPlcId96.IsSuccess && retLX96.IsSuccess)
|
|||
|
|
{
|
|||
|
|
//删除入库任务
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(code);
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",任务号:" + plcId + ",货位:" + LOCATION_ID + ",料箱号:" + CTL);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if(LOCATION_ID=="")
|
|||
|
|
{
|
|||
|
|
//先比对三个堆垛机已分配的任务数量-分配给少的那台堆垛机
|
|||
|
|
int STACKER = GetNextAvailableStacker();
|
|||
|
|
if (STACKER == -1|| STACKER == 0) { AddText($"当前料箱{bcrId}无可入库堆垛机编号"); continue; }
|
|||
|
|
AddText($"当前料箱{bcrId}入库堆垛机编号是:{STACKER}");
|
|||
|
|
//需要测试语句是否正常?????????????????????????????????????
|
|||
|
|
LOCATION_ID = DataClass.Instance().GetLOCATIONID(STORAGE_AREA_ID, STACKER,ref errText);
|
|||
|
|
DataTable dtInStand = DataClass.Instance().Get_T_BASE_STORAGE_AREA_LOCATION_InStand(LOCATION_ID);
|
|||
|
|
if (dtInStand != null && dtInStand.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
decId = dtInStand.Rows[0]["decid"].ToString().Trim();
|
|||
|
|
inStand = dtInStand.Rows[0]["instand"].ToString().Trim();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("查询可用库位异常:" + errText);
|
|||
|
|
OperateResult LOC_NUMBER = plcModbus[4].Write("DB9.DBW1700", (short)1);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else if(LOCATION_ID != "")
|
|||
|
|
{
|
|||
|
|
//判断这个库为对应的堆垛机是否可用,如果不可用,更换入库航道
|
|||
|
|
|
|||
|
|
DataTable dtInStand = DataClass.Instance().Get_T_BASE_STORAGE_AREA_LOCATION_InStand(LOCATION_ID);
|
|||
|
|
|
|||
|
|
if (dtInStand != null && dtInStand.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
int[] STATUS = GetAvailableStackers();
|
|||
|
|
decId = dtInStand.Rows[0]["decid"].ToString().Trim();
|
|||
|
|
if (!STATUS.Contains(int.Parse(decId)))
|
|||
|
|
{
|
|||
|
|
AddText($"当前堆垛机编号{decId}不支持入库");
|
|||
|
|
if(DataClass.Instance().deleteRuKuLOCATION(plcId, code, LOCATION_ID))
|
|||
|
|
{
|
|||
|
|
AddText($"当前入库任务任务号:{plcId},箱号:{code},位置:{LOCATION_ID},重置任务状态成功");
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("99"));//zhixing
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + "-取消入库再次循环");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
inStand = dtInStand.Rows[0]["instand"].ToString().Trim();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
AddText("入库任务查找货位成功,料箱号:" + CTL + ",货位:" + LOCATION_ID + ",堆垛机编号:" + decId + ",入库站台:" + inStand);
|
|||
|
|
|
|||
|
|
string stradd = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra = stradd.Split(';');
|
|||
|
|
OperateResult retPlcId = plcModbus[4].Write(stra[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX = plcModbus[4].Write(stra[1], short.Parse(inStand));//入库口站台
|
|||
|
|
if (retPlcId.IsSuccess && retLX.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().UpdateRKTaskLocationPLCID(plcId, code, LOCATION_ID))
|
|||
|
|
{
|
|||
|
|
if (GOODSID == "000000")
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().UpdateDevFault(decId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",PLC任务号:" + plcId + ",入库站台" + inStand + ",货位:" + LOCATION_ID + ",料箱号:" + CTL + ",写输送机任务成功,更新数据库成功");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",PLC任务号:" + plcId + ",入库站台" + inStand + ",货位:" + LOCATION_ID + ",料箱号:" + CTL + ",写输送机任务成功,更新数据库失败!!!");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (TASKTYPE == "2")
|
|||
|
|
{
|
|||
|
|
//直接到装箱线体
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("99"));//进入人工码盘位置
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + "-装箱线任务");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("99"));//进入人工码盘位置
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + "-装箱线任务");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//异常箱子 :没有任务箱子进入96
|
|||
|
|
OperateResult<short> ssjsts = plcModbus[4].ReadInt16("DB10.DBW3162");
|
|||
|
|
if (ssjsts.IsSuccess && ssjsts.Content == 0)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("99"));//进入人工码盘位置
|
|||
|
|
if (retPlcId96.IsSuccess && retLX96.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",96已满,不需要空箱");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if(!DataClass.Instance().GetCKTaskCk_task(code.Trim()))
|
|||
|
|
{
|
|||
|
|
string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
string sta = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
|
|||
|
|
OperateResult retPlcId96 = plcModbus[4].Write(strb[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX96 = plcModbus[4].Write(strb[1], short.Parse("96"));//进入人工码盘位置
|
|||
|
|
if (retPlcId96.IsSuccess && retLX96.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",96可入空箱,移栽96");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
string lxid = "";
|
|||
|
|
if (bcrId == "SSJ81")
|
|||
|
|
{
|
|||
|
|
//查询有出库任务且没有物料号是000000的,如果有直行
|
|||
|
|
if (DataClass.Instance().GetCKTaskCk_task(code.Trim()) || DataClass.Instance().GetCKTaskRk_task(code.Trim()))
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else//
|
|||
|
|
{
|
|||
|
|
DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF_SSX(code.Trim(), ref errText);
|
|||
|
|
if (dt != null && dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string GOODSID = dt.Rows[0]["GOODSID"].ToString().Trim(); // 000000空料箱
|
|||
|
|
string LOCATION_ID = dt.Rows[0]["LOCATION_ID"].ToString().Trim();
|
|||
|
|
if (GOODSID == "000000"&&LOCATION_ID=="")
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3418");//SSJ106
|
|||
|
|
AddText($"当前82无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
lxid = "82";
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
DataClass.Instance().Del_T_CK_PICKINGWAVEGOODS(code.Trim());//空箱出库任务进入后删除
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(code);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3418");//SSJ106
|
|||
|
|
AddText($"当前82无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
lxid = "82";
|
|||
|
|
//lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ84")
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().GetCKTaskCk_task(code.Trim()) || DataClass.Instance().GetCKTaskRk_task(code.Trim()))
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF_SSX(code.Trim(), ref errText);
|
|||
|
|
if (dt != null && dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string GOODSID = dt.Rows[0]["GOODSID"].ToString().Trim(); // 000000空料箱
|
|||
|
|
string LOCATION_ID = dt.Rows[0]["LOCATION_ID"].ToString().Trim();
|
|||
|
|
if (GOODSID == "000000" && LOCATION_ID == "")
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3386");//SSJ105
|
|||
|
|
AddText($"当前84无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
lxid = "84";
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
DataClass.Instance().Del_T_CK_PICKINGWAVEGOODS(code.Trim());//空箱出库任务进入后删除
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(code);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3386");//SSJ105
|
|||
|
|
AddText($"当前84无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
//lxid = "99";
|
|||
|
|
lxid = "84";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ88")
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().GetCKTaskCk_task(code.Trim()) || DataClass.Instance().GetCKTaskRk_task(code.Trim()))
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF_SSX(code.Trim(), ref errText);
|
|||
|
|
if (dt != null && dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string GOODSID = dt.Rows[0]["GOODSID"].ToString().Trim(); // 000000空料箱
|
|||
|
|
string LOCATION_ID = dt.Rows[0]["LOCATION_ID"].ToString().Trim();
|
|||
|
|
if (GOODSID == "000000" && LOCATION_ID == "")
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3290");//SSJ102
|
|||
|
|
AddText($"当前89无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
lxid = "89";
|
|||
|
|
DataClass.Instance().Del_T_CK_PICKINGWAVEGOODS(code.Trim());//空箱出库任务进入后删除
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(code);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3290");//SSJ102
|
|||
|
|
AddText($"当前89无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
lxid = "89";
|
|||
|
|
//lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ91")
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().GetCKTaskCk_task(code.Trim())|| DataClass.Instance().GetCKTaskRk_task(code.Trim()))
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
//DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF(code.Trim(), "0", ref errText);
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF_SSX(code.Trim(), ref errText);//查询状态0和1的任务
|
|||
|
|
if (dt != null && dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string GOODSID = dt.Rows[0]["GOODSID"].ToString().Trim(); // 000000空料箱
|
|||
|
|
string LOCATION_ID = dt.Rows[0]["LOCATION_ID"].ToString().Trim();
|
|||
|
|
if (GOODSID == "000000" && LOCATION_ID == "")
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3258");//SSJ101
|
|||
|
|
AddText($"当前91无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
lxid = "91";
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
DataClass.Instance().Del_T_CK_PICKINGWAVEGOODS(code.Trim());//空箱出库任务进入后删除
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(code);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OperateResult<short> SSJ81 = plcModbus[4].ReadInt16("DB10.DBW3258");//SSJ101
|
|||
|
|
AddText($"当前91无尘室口状态{SSJ81.Content}");
|
|||
|
|
if (SSJ81.IsSuccess && SSJ81.Content == 1)//1需要空箱0不需要空箱
|
|||
|
|
{
|
|||
|
|
lxid = "91";
|
|||
|
|
//lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//装箱线出库口 50,53 平均分配---按需分配
|
|||
|
|
else if (bcrId == "SSJ50")
|
|||
|
|
{
|
|||
|
|
//查询出库表是否有
|
|||
|
|
string GOODID = "";
|
|||
|
|
string portCK = "";
|
|||
|
|
//有出库任务---装箱线的任务
|
|||
|
|
if (DataClass.Instance().GetCKTaskCkCount(code.Trim(),ref GOODID,ref portCK))
|
|||
|
|
{
|
|||
|
|
if (portCK == "50")//WMS指定装箱出库口
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
//读取1号线是否已满,如果已满就直行
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1626");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd50 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra50 = stradd50.Split(';');
|
|||
|
|
OperateResult retPlcId50 = plcModbus[4].Write(stra50[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX50 = plcModbus[4].Write(stra50[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId50.IsSuccess && retLX50.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string stradd50 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra50 = stradd50.Split(';');
|
|||
|
|
OperateResult retPlcId50 = plcModbus[4].Write(stra50[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX50 = plcModbus[4].Write(stra50[1], (short)50);//入库口站台
|
|||
|
|
if (retPlcId50.IsSuccess && retLX50.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道未满,WMS指定装箱口移栽进入:" + 50);
|
|||
|
|
//更新任务状态为9
|
|||
|
|
//if(DataClass.Instance().UPDATE_STATUS_9(code))
|
|||
|
|
//{
|
|||
|
|
// AddText("更新料箱号" + code + "状态9成功");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (portCK == "53")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else if (portCK == "56")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (GOODID == "000000")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//如果没有指定位置,没满就入,满了就直行
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1626");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd50 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra50 = stradd50.Split(';');
|
|||
|
|
OperateResult retPlcId50 = plcModbus[4].Write(stra50[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX50 = plcModbus[4].Write(stra50[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId50.IsSuccess && retLX50.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string stradd50 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra50 = stradd50.Split(';');
|
|||
|
|
OperateResult retPlcId50 = plcModbus[4].Write(stra50[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX50 = plcModbus[4].Write(stra50[1], (short)50);//入库口站台
|
|||
|
|
if (retPlcId50.IsSuccess && retLX50.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 50);
|
|||
|
|
}
|
|||
|
|
lxid = "50";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (DataClass.Instance().GetRKTaskCkCount(code.Trim(), ref GOODID))
|
|||
|
|
{
|
|||
|
|
if (GOODID == "000000")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//执行上报mes的操作-查询该箱子对应的数据
|
|||
|
|
DataSet dt = DataClass.Instance().Get_T_ONGOODSSHELF_SSX_MES(code.Trim(), ref errText);
|
|||
|
|
if (dt != null && dt.Tables[0].Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < dt.Tables[0].Rows.Count; i++)
|
|||
|
|
{
|
|||
|
|
string STORAGE_ID = dt.Tables[0].Rows[i]["STORAGE_AREA_ID"].ToString(); //字库编号
|
|||
|
|
string BARCODE = dt.Tables[0].Rows[i]["BARCODE"].ToString();//外箱子 + 内箱子条码
|
|||
|
|
string CUSTOMER_ID = dt.Tables[0].Rows[i]["CUSTOMER_ID"].ToString();//客户代码
|
|||
|
|
string newLoc = STORAGE_ID + "-WMS-00";
|
|||
|
|
|
|||
|
|
string strJsonRK = GetWmsData("http://" + MesIpPort + "/Camstar/PackStock.asmx/PackStockIn?pkwPackLot=" + BARCODE + "&pCustPackId=&pSubInventory=" + STORAGE_ID + "&pLocation=" + newLoc + "", "");
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入装箱线成功{dt.Tables[0].Rows[i]["CTL"].ToString()}回传MES异常:" + errText);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (strJsonRK.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("WCS入装箱线成功回传MES返回:" + strJsonRK);
|
|||
|
|
|
|||
|
|
if (!strJsonRK.Contains("当前工位 '成品仓'") && strJsonRK.Contains("Error"))
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_SSX_TASK(BARCODE, code.Trim(),"9"))
|
|||
|
|
{
|
|||
|
|
AddText("WCS入装箱线成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9(上报失败)成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入装箱线成功{dt.Tables[0].Rows[i]["CTL"].ToString()}回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9(上报失败)失败");
|
|||
|
|
}
|
|||
|
|
AddText("WCS入装箱线成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + "");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_SSX_TASK(BARCODE, code.Trim(), "1"))
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入装箱线成功{dt.Tables[0].Rows[i]["CTL"].ToString()}回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态1(上报成功)成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText($"WCS入装箱线成功{dt.Tables[0].Rows[i]["CTL"].ToString()}回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态1(上报成功,更新状态失败)失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1626");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd50 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra50 = stradd50.Split(';');
|
|||
|
|
OperateResult retPlcId50 = plcModbus[4].Write(stra50[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX50 = plcModbus[4].Write(stra50[1], (short)99);//入库口站台
|
|||
|
|
if (retPlcId50.IsSuccess && retLX50.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string stradd50 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra50 = stradd50.Split(';');
|
|||
|
|
OperateResult retPlcId50 = plcModbus[4].Write(stra50[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX50 = plcModbus[4].Write(stra50[1], (short)50);//入库口站台
|
|||
|
|
if (retPlcId50.IsSuccess && retLX50.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 50);
|
|||
|
|
//Thread.Sleep(1000);
|
|||
|
|
//DataClass.Instance().Ins_T_ONGOODSSHELF(code);
|
|||
|
|
//DataClass.Instance().Del_T_ONGOODSSHELF(code);//MES码盘到输送线后任务删除
|
|||
|
|
}
|
|||
|
|
lxid = "50";
|
|||
|
|
}
|
|||
|
|
//string port = DataClass.Instance().Get_T_CK_PORT();
|
|||
|
|
//if (int.Parse(port) == 50)
|
|||
|
|
//{
|
|||
|
|
// lxid = "50";
|
|||
|
|
// DataClass.Instance().Update_T_CK_PORT(port);
|
|||
|
|
// DataClass.Instance().Del_T_ONGOODSSHELF(code);//空箱入库任务进入后删除
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// lxid = "99";
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ53")
|
|||
|
|
{
|
|||
|
|
string GOODID = "";
|
|||
|
|
string portCK = "";
|
|||
|
|
if (DataClass.Instance().GetCKTaskCkCount(code.Trim(), ref GOODID, ref portCK))
|
|||
|
|
{
|
|||
|
|
if (portCK == "53")//WMS指定装箱出库口
|
|||
|
|
{
|
|||
|
|
//判断是否已满
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1722");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "53";
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], (short)53);//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 53);
|
|||
|
|
//更新任务状态为9
|
|||
|
|
//if (DataClass.Instance().UPDATE_STATUS_9(code))
|
|||
|
|
//{
|
|||
|
|
// AddText("更新料箱号" + code + "状态9成功");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (portCK == "56"|| portCK == "50")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (GOODID == "000000")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1722");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "53";
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], (short)53);//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 53);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
//string port = DataClass.Instance().Get_T_CK_PORT();
|
|||
|
|
//if (int.Parse(port) == 53)
|
|||
|
|
//{
|
|||
|
|
// lxid = "53";
|
|||
|
|
// DataClass.Instance().Update_T_CK_PORT(port);
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// lxid = "99";
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (DataClass.Instance().GetRKTaskCkCount(code.Trim(), ref GOODID))
|
|||
|
|
{
|
|||
|
|
if (GOODID == "000000")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1722");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "53";
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], (short)53);//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 53);
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
//DataClass.Instance().Ins_T_ONGOODSSHELF(code);
|
|||
|
|
//DataClass.Instance().Del_T_ONGOODSSHELF(code);//MES码盘到输送线后任务删除
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
//string port = DataClass.Instance().Get_T_CK_PORT();
|
|||
|
|
//if (int.Parse(port) == 53)
|
|||
|
|
//{
|
|||
|
|
|
|||
|
|
// lxid = "53";
|
|||
|
|
// DataClass.Instance().Update_T_CK_PORT(port);
|
|||
|
|
// DataClass.Instance().Del_T_ONGOODSSHELF(code);//空箱入库任务进入后删除
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// lxid = "99";
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else if (bcrId == "SSJ56")
|
|||
|
|
{
|
|||
|
|
string GOODID = "";
|
|||
|
|
string portCK = "";
|
|||
|
|
lxid = "99";
|
|||
|
|
if (DataClass.Instance().GetCKTaskCkCount(code.Trim(), ref GOODID, ref portCK))
|
|||
|
|
{
|
|||
|
|
if (portCK == "56")//WMS指定装箱出库口
|
|||
|
|
{
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1818");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "53";
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], (short)56);//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 56);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else if (portCK == "50" || portCK == "53")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (GOODID == "000000")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1818");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], (short)56);//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 56);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
//string port = DataClass.Instance().Get_T_CK_PORT();
|
|||
|
|
//if (int.Parse(port) == 53)
|
|||
|
|
//{
|
|||
|
|
// lxid = "53";
|
|||
|
|
// DataClass.Instance().Update_T_CK_PORT(port);
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// lxid = "99";
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (DataClass.Instance().GetRKTaskCkCount(code.Trim(), ref GOODID))
|
|||
|
|
{
|
|||
|
|
if (GOODID == "000000")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OperateResult<short> result_full = plcModbus[4].ReadInt16("DB10.1818");
|
|||
|
|
if (result_full.Content == 1)//通道已满,直行
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], short.Parse("99"));//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",通道已满,直行:" + 99);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string stradd53 = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra53 = stradd53.Split(';');
|
|||
|
|
OperateResult retPlcId53 = plcModbus[4].Write(stra53[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX53 = plcModbus[4].Write(stra53[1], (short)56);//入库口站台
|
|||
|
|
if (retPlcId53.IsSuccess && retLX53.IsSuccess)
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",WMS指定装箱口移栽进入:" + 56);
|
|||
|
|
DataClass.Instance().Ins_T_ONGOODSSHELF(code);
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(code);//MES码盘到输送线后任务删除
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
//string port = DataClass.Instance().Get_T_CK_PORT();
|
|||
|
|
//if (int.Parse(port) == 53)
|
|||
|
|
//{
|
|||
|
|
|
|||
|
|
// lxid = "53";
|
|||
|
|
// DataClass.Instance().Update_T_CK_PORT(port);
|
|||
|
|
// DataClass.Instance().Del_T_ONGOODSSHELF(code);//空箱入库任务进入后删除
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// lxid = "99";
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//AddText("扫码器编号:" + bcrId + ",出库口:" + ckPort);
|
|||
|
|
if (lxid == ""&& bcrId!="SSJ50")
|
|||
|
|
{
|
|||
|
|
lxid = "99";
|
|||
|
|
}
|
|||
|
|
string stradd = GetWCSTOSSJ(bcrId);
|
|||
|
|
string[] stra = stradd.Split(';');
|
|||
|
|
OperateResult retPlcId = plcModbus[4].Write(stra[0], int.Parse(plcId));////任务号
|
|||
|
|
OperateResult retLX = plcModbus[4].Write(stra[1], short.Parse(lxid));//入库口站台
|
|||
|
|
if (retPlcId.IsSuccess && retLX.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (lxid == "99")
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",产线料箱已满或有任务,直行");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("扫码器编号:" + bcrId + ",料箱号:" + code + ",产线料箱未满-移栽进入:" + lxid);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
Thread.Sleep(500);
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("扫码线程异常:" + ex.Message+",代码行:"+ ex.StackTrace);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private void MES_AGIN()
|
|||
|
|
{
|
|||
|
|
while(true)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(500);
|
|||
|
|
DateTime now = DateTime.Now;
|
|||
|
|
|
|||
|
|
// 计算今天早上6点和晚上6点的时间
|
|||
|
|
DateTime am6 = now.Date.AddHours(6);
|
|||
|
|
DateTime pm6 = now.Date.AddHours(18);
|
|||
|
|
|
|||
|
|
// 计算下次执行时间
|
|||
|
|
DateTime nextRun;
|
|||
|
|
if (now < am6)
|
|||
|
|
{
|
|||
|
|
nextRun = am6;
|
|||
|
|
}
|
|||
|
|
else if (now < pm6)
|
|||
|
|
{
|
|||
|
|
nextRun = pm6;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
nextRun = am6.AddDays(1); // 明天早上6点
|
|||
|
|
}
|
|||
|
|
// 计算需要等待的时间
|
|||
|
|
TimeSpan waitTime = nextRun - now;
|
|||
|
|
|
|||
|
|
// 等待到下次执行时间
|
|||
|
|
if (waitTime > TimeSpan.Zero)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(waitTime);
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string errText = "";
|
|||
|
|
DataSet dt = DataClass.Instance().SELECTT_MI_STOCK_9(ref errText);
|
|||
|
|
if (dt != null && dt.Tables[0].Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < dt.Tables[0].Rows.Count; i++)
|
|||
|
|
{
|
|||
|
|
string STORAGE_ID = dt.Tables[0].Rows[i]["STORAGE_ID"].ToString(); //字库编号
|
|||
|
|
string LOCATION_ID = dt.Tables[0].Rows[i]["LOCATION_ID"].ToString();
|
|||
|
|
string BARCODE = dt.Tables[0].Rows[i]["BARCODE"].ToString();//外箱子 + 内箱子条码
|
|||
|
|
string CUSTOMER_ID = dt.Tables[0].Rows[i]["CUSTOMER_ID"].ToString();//客户代码
|
|||
|
|
string newLoc = STORAGE_ID + "-WMS-00";
|
|||
|
|
|
|||
|
|
string strJsonRK = GetWmsData("http://" + MesIpPort + "/Camstar/PackStock.asmx/PackStockIn?pkwPackLot=" + BARCODE + "&pCustPackId=&pSubInventory=" + STORAGE_ID + "&pLocation=" + newLoc + "", "");
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES异常:" + errText);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (strJsonRK.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES返回:" + strJsonRK);
|
|||
|
|
|
|||
|
|
if (!strJsonRK.Contains("当前工位 '成品仓'") && strJsonRK.Contains("Error"))
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_MI_STOCK_STSEBS(LOCATION_ID, BARCODE, "9"))
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9(上报失败)成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9(上报失败)失败");
|
|||
|
|
}
|
|||
|
|
AddText("WCS定时上报mes成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + "");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_MI_STOCK_STSEBS(LOCATION_ID,BARCODE, "1"))
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态1(上报成功)成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态1(上报成功,更新状态失败)失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public void EMPTY_NUM()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string sql = @"select * from T_MI_STOCK where GOODS_ID='000000'";
|
|||
|
|
DataTable dataTable=OracleHelper.ExecuteDataTable(sql);
|
|||
|
|
if(dataTable.Rows.Count<40)
|
|||
|
|
{
|
|||
|
|
OperateResult ru = plcModbus[4].Write("DB9.DBW1714", (short)1);//SSJ106
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText($"异常{ex}");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void TASK_UPDATE()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(500);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
OperateResult<string> SSJ74 = plcModbus[4].ReadString("DB10.DBW2368", 8);//SSJ106
|
|||
|
|
OperateResult<int> SSJ74_TaskId = plcModbus[4].ReadInt32("DB10.DBW2390");//SSJ106
|
|||
|
|
if (SSJ74.Content.Trim() != ""&& SSJ74_TaskId.Content != null)
|
|||
|
|
{
|
|||
|
|
OperateResult ru = plcModbus[4].Write("DB9.DBW1042", (short)1);//SSJ106
|
|||
|
|
string CTL = SSJ74.Content.Trim();int TaskId = SSJ74_TaskId.Content;
|
|||
|
|
//AddText($"56装箱线口写入移动指令1,托盘号:{CTL}");
|
|||
|
|
if (DataClass.Instance().UPDATE_STATUS_9(CTL, TaskId.ToString()))
|
|||
|
|
{
|
|||
|
|
AddText("更新料箱号" + CTL + "状态9成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//输送线任务,直接备份删除
|
|||
|
|
DataClass.Instance().Ins_T_ONGOODSSHELF(CTL);
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(CTL);//MES码盘到输送线后任务删除
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
OperateResult<string> SSJ72 = plcModbus[4].ReadString("DB10.DBW2304", 8);//SSJ106
|
|||
|
|
OperateResult<int> SSJ72_TaskId = plcModbus[4].ReadInt32("DB10.DBW2326");//SSJ106
|
|||
|
|
if (SSJ72.Content.Trim() != "")
|
|||
|
|
{
|
|||
|
|
OperateResult ru = plcModbus[4].Write("DB9.DBW1014", (short)1);//SSJ106
|
|||
|
|
string CTL = SSJ72.Content.Trim(); int TaskId = SSJ72_TaskId.Content;
|
|||
|
|
//AddText($"53装箱线口写入移动指令1,托盘号:{CTL}");
|
|||
|
|
if (DataClass.Instance().UPDATE_STATUS_9(CTL, TaskId.ToString()))
|
|||
|
|
{
|
|||
|
|
AddText("更新料箱号" + CTL + "状态9成功");
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//输送线任务,直接备份删除
|
|||
|
|
DataClass.Instance().Ins_T_ONGOODSSHELF(CTL);
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(CTL);//MES码盘到输送线后任务删除
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
OperateResult<string> SSJ70 = plcModbus[4].ReadString("DB10.DBW2240", 8);//SSJ106
|
|||
|
|
OperateResult<int> SSJ70_TaskId = plcModbus[4].ReadInt32("DB10.DBW2262");//SSJ106
|
|||
|
|
if (SSJ70.Content.Trim() != "")
|
|||
|
|
{
|
|||
|
|
OperateResult ru = plcModbus[4].Write("DB9.DBW986", (short)1);//SSJ106
|
|||
|
|
string CTL = SSJ70.Content.Trim(); int TaskId = SSJ70_TaskId.Content;
|
|||
|
|
//AddText($"50装箱线口写入移动指令1,托盘号:{CTL}");
|
|||
|
|
if (DataClass.Instance().UPDATE_STATUS_9(CTL,TaskId.ToString()))
|
|||
|
|
{
|
|||
|
|
AddText("更新料箱号" + CTL + "状态9成功");
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//输送线任务,直接备份删除
|
|||
|
|
DataClass.Instance().Ins_T_ONGOODSSHELF(CTL);
|
|||
|
|
DataClass.Instance().Del_T_ONGOODSSHELF(CTL);//MES码盘到输送线后任务删除
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// OperateResult<string> SSJ61 = plcModbus[4].ReadString("DB10.DBW1952", 8);//SSJ106
|
|||
|
|
// //更新堆垛机出库任务状态为9或者备份删除输送线任务
|
|||
|
|
// if (SSJ61.Content.Trim() != "")
|
|||
|
|
// {
|
|||
|
|
// string CTL= SSJ61.Content.Trim();
|
|||
|
|
// if (DataClass.Instance().UPDATE_STATUS_9_2(CTL))
|
|||
|
|
// {
|
|||
|
|
// AddText("更新料箱号" + CTL + "状态9成功");
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// //输送线任务,直接备份删除
|
|||
|
|
// DataClass.Instance().Ins_T_ONGOODSSHELF(CTL);
|
|||
|
|
// DataClass.Instance().Del_T_ONGOODSSHELF(CTL);//MES码盘到输送线后任务删除
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// OperateResult<string> SSJ64 = plcModbus[4].ReadString("DB10.DBW2048", 8);//SSJ106
|
|||
|
|
// if (SSJ64.Content.Trim() != "")
|
|||
|
|
// {
|
|||
|
|
// string CTL = SSJ64.Content.Trim();
|
|||
|
|
// if (DataClass.Instance().UPDATE_STATUS_9_2(CTL))
|
|||
|
|
// {
|
|||
|
|
// AddText("更新料箱号" + CTL + "状态9成功");
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// //输送线任务,直接备份删除
|
|||
|
|
// DataClass.Instance().Ins_T_ONGOODSSHELF(CTL);
|
|||
|
|
// DataClass.Instance().Del_T_ONGOODSSHELF(CTL);//MES码盘到输送线后任务删除
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// OperateResult<string> SSJ67 = plcModbus[4].ReadString("DB10.DBW2144", 8);//SSJ106
|
|||
|
|
// if (SSJ67.Content.Trim() != "")
|
|||
|
|
// {
|
|||
|
|
// string CTL = SSJ67.Content.Trim();
|
|||
|
|
// if (DataClass.Instance().UPDATE_STATUS_9_2(CTL))
|
|||
|
|
// {
|
|||
|
|
// AddText("更新料箱号" + CTL + "状态9成功");
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// //输送线任务,直接备份删除
|
|||
|
|
// DataClass.Instance().Ins_T_ONGOODSSHELF(CTL);
|
|||
|
|
// DataClass.Instance().Del_T_ONGOODSSHELF(CTL);//MES码盘到输送线后任务删除
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
catch(Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText($"异常{ex}");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region 查询入库站台任务写堆垛机
|
|||
|
|
|
|||
|
|
|
|||
|
|
//public bool outTask(int? stackerId)
|
|||
|
|
//{
|
|||
|
|
// //查询出库任务下发
|
|||
|
|
// string errText = "";
|
|||
|
|
// DataTable dt = DataClass.Instance().GetOUTTask(stackerId.ToString(), ref errText);
|
|||
|
|
// if()
|
|||
|
|
// return false;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 移库执行方法
|
|||
|
|
/// </summary>
|
|||
|
|
private bool ExecuteMoveTask(string decId)
|
|||
|
|
{
|
|||
|
|
//查询堆垛机是否空闲
|
|||
|
|
OperateResult<short[]> opfhidYK = plcModbus[int.Parse(decId)].ReadInt16("DB91.4", 2);
|
|||
|
|
if(opfhidYK.IsSuccess)
|
|||
|
|
{
|
|||
|
|
string DevStatus = opfhidYK.Content[1].ToString();//堆垛机状态 1空闲
|
|||
|
|
if (DevStatus != "1") return false;
|
|||
|
|
//查询是否有未下发的移库任务
|
|||
|
|
bool YKTask= DataClass.Instance().SELECT_YK(decId);
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
private object TASK = new object();
|
|||
|
|
public void STACKERTASK()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
lock (TASK)
|
|||
|
|
{
|
|||
|
|
//查找可用的设备--堆垛机是联机且无故障
|
|||
|
|
int[] STATUS_decide = GetAvailableStackers();
|
|||
|
|
if (STATUS_decide == null || STATUS_decide.Length == 0)
|
|||
|
|
{
|
|||
|
|
// 数组为 null 或空的处理逻辑
|
|||
|
|
AddText("无可用堆垛机");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
//轮询堆垛机
|
|||
|
|
foreach (var decid in STATUS_decide)
|
|||
|
|
{
|
|||
|
|
//移库任务
|
|||
|
|
bool exeMoveTask = ExecuteMoveTask(decid.ToString());
|
|||
|
|
if (exeMoveTask) continue;
|
|||
|
|
//出库任务
|
|||
|
|
//bool exeoutTask = outTask(decid);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
List<string> declist = new List<string>();
|
|||
|
|
declist.Add("1");
|
|||
|
|
declist.Add("2");
|
|||
|
|
declist.Add("3");
|
|||
|
|
//轮询三台堆垛机状态
|
|||
|
|
foreach (var decid in declist)
|
|||
|
|
{
|
|||
|
|
OperateResult<short[]> ddjControl = plcModbus[int.Parse(decid)].ReadInt16("DB91.4", 2);//
|
|||
|
|
OperateResult<short> opfhid2 = plcModbus[int.Parse(decid)].ReadInt16("DB91.22");
|
|||
|
|
if (ddjControl.IsSuccess && opfhid2.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (ddjControl.Content[0].ToString() == "5" || int.Parse(opfhid2.Content.ToString()) > 0)//堆垛机控制模式,单机 联机/堆垛机故障
|
|||
|
|
{
|
|||
|
|
if (ddjControl.Content[1].ToString() == "1" && opfhid2.Content.ToString() == "0")//堆垛机运行状态:空闲 且正常
|
|||
|
|
{
|
|||
|
|
OperateResult<short> number = plcModbus[4].ReadInt16("DB10.DBW4192");
|
|||
|
|
if (number.Content < 30)//线体数量小于30下发出库
|
|||
|
|
{
|
|||
|
|
if (Set_CK_Task())
|
|||
|
|
{
|
|||
|
|
//优先执行出库任务
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
string[] DDJRkStation = { };
|
|||
|
|
switch (decid)
|
|||
|
|
{
|
|||
|
|
case "1":
|
|||
|
|
DDJRkStation = new string[] { "SSJ01", "SSJ03" };//堆垛机入库取货站台
|
|||
|
|
break;
|
|||
|
|
case "2":
|
|||
|
|
DDJRkStation = new string[] { "SSJ05", "SSJ07" };//堆垛机入库取货站台
|
|||
|
|
break;
|
|||
|
|
case "3":
|
|||
|
|
DDJRkStation = new string[] { "SSJ09", "SSJ11" };//堆垛机入库取货站台
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
foreach (string rkstand in DDJRkStation)//1,3,5,7,9,11
|
|||
|
|
{
|
|||
|
|
//查询入库口是否有任务
|
|||
|
|
OperateResult<int> ssjsts = plcModbus[4].ReadInt32(Get_SSJ_PlcId(rkstand));
|
|||
|
|
if (ssjsts.IsSuccess && ssjsts.Content > 0)
|
|||
|
|
{
|
|||
|
|
string code = "";
|
|||
|
|
DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF_instand(ssjsts.Content.ToString(), "1", ref errText);
|
|||
|
|
if (dt != null)
|
|||
|
|
{
|
|||
|
|
if (dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string PLCID = dt.Rows[0]["PLCID"].ToString().Trim();//任务号
|
|||
|
|
string CTL = dt.Rows[0]["CTL"].ToString().Trim();//托盘
|
|||
|
|
|
|||
|
|
string LOCATION_ID = dt.Rows[0]["LOCATION_ID"].ToString().Trim();
|
|||
|
|
string LOCATION_ID_PLC = dt.Rows[0]["LOCATION_ID_PLC"].ToString().Trim();
|
|||
|
|
string DECID = dt.Rows[0]["DECID"].ToString().Trim();
|
|||
|
|
string INSTAND = dt.Rows[0]["INSTAND"].ToString().Trim();
|
|||
|
|
string TASKTYPE = dt.Rows[0]["TASKTYPE"].ToString().Trim();
|
|||
|
|
if (TASKTYPE == "1")
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().GetkcCtl(CTL))
|
|||
|
|
{
|
|||
|
|
AddText("托盘编号:" + CTL + "货架中已存在该托盘,请检查托盘编号是否重复");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (LOCATION_ID.Length > 0)
|
|||
|
|
{
|
|||
|
|
//LOCATION_ID_PLC 03132012 03排132列 01层 2 深货位
|
|||
|
|
|
|||
|
|
string row = LOCATION_ID_PLC.Substring(0, 2);
|
|||
|
|
string cln = LOCATION_ID_PLC.Substring(2, 3);
|
|||
|
|
string layer = LOCATION_ID_PLC.Substring(5, 2);
|
|||
|
|
string DEPTH = LOCATION_ID_PLC.Substring(7, 1);
|
|||
|
|
if (WritePlcTaskRK(PLCID, row, Convert.ToString(int.Parse(cln) + 1).PadLeft(2, '0'), layer, DEPTH, DECID, "1", CTL, rkstand))
|
|||
|
|
{
|
|||
|
|
AddText("入库任务写堆垛机成功,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
|
|||
|
|
if (DataClass.Instance().UPDATE_T_ONGOODSSHELF(PLCID, "2"))
|
|||
|
|
{
|
|||
|
|
//DataClass.Instance().UpdateDevFault(DECID);
|
|||
|
|
|
|||
|
|
AddText("入库任务更新入库表状态及货位状态成功,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("入库任务写堆垛机成功更新状态2失败,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("入库任务写堆垛机失败,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",请检查网络和任务是否异常。" + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("入库站台:" + rkstand + ",货位查询异常:" + LOCATION_ID);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 查询入库站台任务写堆垛机
|
|||
|
|
/// </summary>
|
|||
|
|
///
|
|||
|
|
private object objlock = new object();
|
|||
|
|
public void RkCK_DDJ()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
lock (objlock)
|
|||
|
|
{
|
|||
|
|
string errText = "";
|
|||
|
|
if (Set_CK_Task())
|
|||
|
|
{
|
|||
|
|
//优先执行出库任务
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//根据AGV送达信号 查询对应的任务
|
|||
|
|
foreach (string rkstand in DDJRkStation)//1,3,5,7,9,11
|
|||
|
|
{
|
|||
|
|
//遍历入库站台 是否有托盘
|
|||
|
|
|
|||
|
|
//查询任务号
|
|||
|
|
OperateResult<int> ssjsts = plcModbus[4].ReadInt32(Get_SSJ_PlcId(rkstand));
|
|||
|
|
if (ssjsts.IsSuccess && ssjsts.Content > 0)
|
|||
|
|
{
|
|||
|
|
string code = "";
|
|||
|
|
DataTable dt = DataClass.Instance().Get_T_ONGOODSSHELF_instand(ssjsts.Content.ToString(), "1", ref errText);
|
|||
|
|
if (dt == null || dt.Rows.Count < 1)
|
|||
|
|
{
|
|||
|
|
OperateResult ru = plcModbus[4].Write("DB9.DBW8", short.Parse(rkstand.Substring(3,2)));
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OperateResult ru = plcModbus[4].Write("DB9.DBW8", (short)0);
|
|||
|
|
}
|
|||
|
|
if (dt != null)
|
|||
|
|
{
|
|||
|
|
if (dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
string PLCID = dt.Rows[0]["PLCID"].ToString().Trim();//任务号
|
|||
|
|
string CTL = dt.Rows[0]["CTL"].ToString().Trim();//托盘
|
|||
|
|
|
|||
|
|
string LOCATION_ID = dt.Rows[0]["LOCATION_ID"].ToString().Trim();
|
|||
|
|
string LOCATION_ID_PLC = dt.Rows[0]["LOCATION_ID_PLC"].ToString().Trim();
|
|||
|
|
string DECID = dt.Rows[0]["DECID"].ToString().Trim();
|
|||
|
|
string INSTAND = dt.Rows[0]["INSTAND"].ToString().Trim();
|
|||
|
|
string TASKTYPE = dt.Rows[0]["TASKTYPE"].ToString().Trim();
|
|||
|
|
if (TASKTYPE == "1")
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().GetkcCtl(CTL))
|
|||
|
|
{
|
|||
|
|
AddText("托盘编号:" + CTL + "货架中已存在该托盘,请检查托盘编号是否重复");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (LOCATION_ID.Length > 0)
|
|||
|
|
{
|
|||
|
|
//LOCATION_ID_PLC 03132012 03排132列 01层 2 深货位
|
|||
|
|
|
|||
|
|
string row = LOCATION_ID_PLC.Substring(0, 2);
|
|||
|
|
string cln = LOCATION_ID_PLC.Substring(2, 3);
|
|||
|
|
string layer = LOCATION_ID_PLC.Substring(5, 2);
|
|||
|
|
string DEPTH = LOCATION_ID_PLC.Substring(7, 1);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
OperateResult<short[]> ddjControl = plcModbus[int.Parse(DECID)].ReadInt16("DB91.4", 2);//
|
|||
|
|
if (ddjControl.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (ddjControl.Content[0].ToString() == "5")//堆垛机控制模式,单机 联机
|
|||
|
|
{
|
|||
|
|
if (ddjControl.Content[1].ToString() == "1")//堆垛机运行状态:空闲 ,运行中
|
|||
|
|
{
|
|||
|
|
if (WritePlcTaskRK(PLCID, row, Convert.ToString(int.Parse(cln) + 1).PadLeft(2, '0'), layer, DEPTH, DECID, "1", CTL, rkstand))
|
|||
|
|
{
|
|||
|
|
AddText("入库任务写堆垛机成功,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
|
|||
|
|
if (DataClass.Instance().UPDATE_T_ONGOODSSHELF(PLCID, "2"))
|
|||
|
|
{
|
|||
|
|
//DataClass.Instance().UpdateDevFault(DECID);
|
|||
|
|
|
|||
|
|
AddText("入库任务更新入库表状态及货位状态成功,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("入库任务写堆垛机成功更新状态2失败,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("入库任务写堆垛机失败,任务号:" + PLCID + ",库位:" + LOCATION_ID + ",请检查网络和任务是否异常。" + ",入库站台:" + rkstand + ",堆垛机编号:" + DECID);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机:" + DECID + "单机模式,请选择联机模式");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("入库站台:" + rkstand + ",货位查询异常:" + LOCATION_ID);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
Thread.Sleep(3000);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
txtErrorMsg(ex.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Thread.Sleep(1500);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
public void GetOnData()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string errText = "";
|
|||
|
|
|
|||
|
|
DataTable iningtask = DataClass.Instance().GetiningGoodsDecidOhp();
|
|||
|
|
if (iningtask != null)
|
|||
|
|
{
|
|||
|
|
if (gridControl2.InvokeRequired)
|
|||
|
|
{
|
|||
|
|
// 如果当前线程不是UI线程,则使用Invoke在UI线程上调用此方法
|
|||
|
|
gridControl2.Invoke(new MethodInvoker(delegate
|
|||
|
|
{
|
|||
|
|
gridControl2.DataSource = iningtask;
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 如果当前线程已经是UI线程,则直接设置DataSource
|
|||
|
|
gridControl2.DataSource = iningtask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DataTable outingtask = DataClass.Instance().GetOutingGoodsDecidOhp();
|
|||
|
|
if (iningtask != null)
|
|||
|
|
{
|
|||
|
|
if (gridControl3.InvokeRequired)
|
|||
|
|
{
|
|||
|
|
// 如果当前线程不是UI线程,则使用Invoke在UI线程上调用此方法
|
|||
|
|
gridControl3.Invoke(new MethodInvoker(delegate
|
|||
|
|
{
|
|||
|
|
gridControl3.DataSource = outingtask;
|
|||
|
|
}));
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 如果当前线程已经是UI线程,则直接设置DataSource
|
|||
|
|
gridControl3.DataSource = outingtask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//labelControl1.Invoke(new MethodInvoker(delegate
|
|||
|
|
//{
|
|||
|
|
// string num1 = DataClass.Instance().GetLOCATIONID2("1", ref errText);
|
|||
|
|
// labelControl1.Text = num1.ToString();
|
|||
|
|
// if (int.Parse(num1) <= 5)
|
|||
|
|
// {
|
|||
|
|
// labelControl1.ForeColor = Color.Red;
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// labelControl1.ForeColor = Color.Blue;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
|
|||
|
|
//}));
|
|||
|
|
|
|||
|
|
//labelControl2.Invoke(new MethodInvoker(delegate
|
|||
|
|
//{
|
|||
|
|
// int num2 = DataClass.Instance().Get_T_BASE_STORAGE_AREA_LOCATION_NullCount("非样板");
|
|||
|
|
// labelControl2.Text = num2.ToString();
|
|||
|
|
// if (num2 <= 20)
|
|||
|
|
// {
|
|||
|
|
// labelControl2.ForeColor = Color.Red;
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// labelControl2.ForeColor = Color.Blue;
|
|||
|
|
// }
|
|||
|
|
//}));
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("查询出入库任务异常:" + ex.Message);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
Thread.Sleep(3000);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 输送机是否有货
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="station"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public string Get_SSJ_STS(string station)
|
|||
|
|
{
|
|||
|
|
lock ("ssd")
|
|||
|
|
{
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
case "101":
|
|||
|
|
return "DB35.19.0";
|
|||
|
|
case "102":
|
|||
|
|
return "DB35.19.1";
|
|||
|
|
//case "03":
|
|||
|
|
// return "DB90.88";
|
|||
|
|
//case "04":
|
|||
|
|
// return "DB90.128";
|
|||
|
|
//case "05":
|
|||
|
|
// return "DB90.168";
|
|||
|
|
//case "06":
|
|||
|
|
// return "DB90.208";
|
|||
|
|
//case "07":
|
|||
|
|
// return "DB90.248";
|
|||
|
|
//case "08":
|
|||
|
|
// return "DB90.288";
|
|||
|
|
//case "09":
|
|||
|
|
// return "DB90.328";
|
|||
|
|
//case "10":
|
|||
|
|
// return "DB90.368";
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public string Get_PLC_FINISH (string station)
|
|||
|
|
{
|
|||
|
|
lock ("ssd")
|
|||
|
|
{
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
case "1":
|
|||
|
|
return "DB70.DBD0;DB70.DBW4";
|
|||
|
|
case "2":
|
|||
|
|
return "DB70.DBD6;DB70.DBW10";
|
|||
|
|
case "3":
|
|||
|
|
return "DB70.DBD12;DB70.DBW16";
|
|||
|
|
case "4":
|
|||
|
|
return "DB70.DBD18;DB70.DBW22";
|
|||
|
|
case "5":
|
|||
|
|
return "DB70.DBD24;DB70.DBW28";
|
|||
|
|
case "6":
|
|||
|
|
return "DB70.DBD30;DB70.DBW34";
|
|||
|
|
case "7":
|
|||
|
|
return "DB70.DBD36;DB70.DBW40";
|
|||
|
|
case "8":
|
|||
|
|
return "DB70.DBD42;DB70.DBW46";
|
|||
|
|
case "9":
|
|||
|
|
return "DB70.DBD48;DB70.DBW52";
|
|||
|
|
case "10":
|
|||
|
|
return "DB70.DBD54;DB70.DBW58";
|
|||
|
|
case "11":
|
|||
|
|
return "DB70.DBD60;DB70.DBW64";
|
|||
|
|
case "12":
|
|||
|
|
return "DB70.DBD66;DB70.DBW70";
|
|||
|
|
case "13":
|
|||
|
|
return "DB70.DBD72;DB70.DBW76";
|
|||
|
|
case "14":
|
|||
|
|
return "DB70.DBD78;DB70.DBW82";
|
|||
|
|
case "15":
|
|||
|
|
return "DB70.DBD84;DB70.DBW88";
|
|||
|
|
case "16":
|
|||
|
|
return "DB70.DBD90;DB70.DBW94";
|
|||
|
|
case "17":
|
|||
|
|
return "DB70.DBD96;DB70.DBW100";
|
|||
|
|
case "18":
|
|||
|
|
return "DB70.DBD102;DB70.DBW106";
|
|||
|
|
case "19":
|
|||
|
|
return "DB70.DBD108;DB70.DBW112";
|
|||
|
|
case "20":
|
|||
|
|
return "DB70.DBD114;DB70.DBW118";
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string WCS_TO_PLC_DEL(string station)
|
|||
|
|
{
|
|||
|
|
lock ("ssd")
|
|||
|
|
{
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
case "1":
|
|||
|
|
return "DB71.DBD0";
|
|||
|
|
case "2":
|
|||
|
|
return "DB71.DBD4";
|
|||
|
|
case "3":
|
|||
|
|
return "DB71.DBD8";
|
|||
|
|
case "4":
|
|||
|
|
return "DB71.DBD12";
|
|||
|
|
case "5":
|
|||
|
|
return "DB71.DBD16";
|
|||
|
|
case "6":
|
|||
|
|
return "DB71.DBD20";
|
|||
|
|
case "7":
|
|||
|
|
return "DB71.DBD24";
|
|||
|
|
case "8":
|
|||
|
|
return "DB71.DBD28";
|
|||
|
|
case "9":
|
|||
|
|
return "DB71.DBD32";
|
|||
|
|
case "10":
|
|||
|
|
return "DB71.DBD36";
|
|||
|
|
case "11":
|
|||
|
|
return "DB71.DBD40";
|
|||
|
|
case "12":
|
|||
|
|
return "DB71.DBD44";
|
|||
|
|
case "13":
|
|||
|
|
return "DB71.DBD48";
|
|||
|
|
case "14":
|
|||
|
|
return "DB71.DBD52";
|
|||
|
|
case "15":
|
|||
|
|
return "DB71.DBD56";
|
|||
|
|
case "16":
|
|||
|
|
return "DB71.DBD60";
|
|||
|
|
case "17":
|
|||
|
|
return "DB71.DBD64";
|
|||
|
|
case "18":
|
|||
|
|
return "DB71.DBD68";
|
|||
|
|
case "19":
|
|||
|
|
return "DB71.DBD72";
|
|||
|
|
case "20":
|
|||
|
|
return "DB71.DBD76";
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 入库写输送机任务号+路向
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="station"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private string Get_SSJ_PlcId(string station)
|
|||
|
|
{
|
|||
|
|
lock ("dss")
|
|||
|
|
{
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
case "SSJ01":
|
|||
|
|
return "DB10.DBD54";
|
|||
|
|
case "SSJ03":
|
|||
|
|
return "DB10.DBD118";
|
|||
|
|
case "SSJ05":
|
|||
|
|
return "DB10.DBD182";
|
|||
|
|
case "SSJ07":
|
|||
|
|
return "DB10.DBD246";
|
|||
|
|
case "SSJ09":
|
|||
|
|
return "DB10.DBD310";
|
|||
|
|
case "SSJ11":
|
|||
|
|
return "DB10.DBD374";
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private string Get_SSJ_PlcId_Del (string station)
|
|||
|
|
{
|
|||
|
|
lock ("dss")
|
|||
|
|
{
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
case "01":
|
|||
|
|
return "DB101.0";
|
|||
|
|
|
|||
|
|
case "05":
|
|||
|
|
return "DB101.80";
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public string GetBarCodePlcAddress(string station)
|
|||
|
|
{
|
|||
|
|
// 04:DB90.400
|
|||
|
|
// 07:DB90.420
|
|||
|
|
// 09:DB90.440
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
case "SSJ50":
|
|||
|
|
return "DB10.DBW1600";
|
|||
|
|
case "SSJ53":
|
|||
|
|
return "DB10.DBW1696";
|
|||
|
|
case "SSJ56":
|
|||
|
|
return "DB10.DBW1792";
|
|||
|
|
case "SSJ81":
|
|||
|
|
return "DB10.DBW2592";
|
|||
|
|
case "SSJ84":
|
|||
|
|
return "DB10.DBW2688";
|
|||
|
|
case "SSJ88":
|
|||
|
|
return "DB10.DBW2816";
|
|||
|
|
case "SSJ91":
|
|||
|
|
return "DB10.DBW2912";
|
|||
|
|
case "SSJ96":
|
|||
|
|
return "DB10.DBW3072";
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string GetWCSTOSSJ (string station)
|
|||
|
|
{
|
|||
|
|
// 04:DB90.400
|
|||
|
|
// 07:DB90.420
|
|||
|
|
// 09:DB90.440
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
case "SSJ50":
|
|||
|
|
return "DB9.DBD700;DB9.DBW704";
|
|||
|
|
case "SSJ53":
|
|||
|
|
return "DB9.DBD742;DB9.DBW746";
|
|||
|
|
case "SSJ56":
|
|||
|
|
return "DB9.DBD784;DB9.DBW788";
|
|||
|
|
case "SSJ81":
|
|||
|
|
return "DB9.DBD1134;DB9.DBW1138";
|
|||
|
|
case "SSJ84":
|
|||
|
|
return "DB9.DBD1176;DB9.DBW1180";
|
|||
|
|
case "SSJ88":
|
|||
|
|
return "DB9.DBD1232;DB9.DBW1236";
|
|||
|
|
case "SSJ91":
|
|||
|
|
return "DB9.DBD1274;DB9.DBW1278";
|
|||
|
|
case "SSJ96":
|
|||
|
|
return "DB9.DBD1344;DB9.DBW1348";
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否有货
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="station"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public string GetTwoSSJPlcAddress (string station)
|
|||
|
|
{
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
case "21":
|
|||
|
|
return "DB90.56";
|
|||
|
|
case "22":
|
|||
|
|
return "DB90.136";
|
|||
|
|
case "23":
|
|||
|
|
return "DB90.176";
|
|||
|
|
case "24":
|
|||
|
|
return "DB90.56";
|
|||
|
|
case "25":
|
|||
|
|
return "DB90.136";
|
|||
|
|
case "26":
|
|||
|
|
return "DB90.176";
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 控制类型:1 入库,2 出库
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="station"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public string GetTwoSSJPlcAddressControl (string station)
|
|||
|
|
{
|
|||
|
|
switch (station)
|
|||
|
|
{
|
|||
|
|
case "21":
|
|||
|
|
return "DB90.56";
|
|||
|
|
case "22":
|
|||
|
|
return "DB90.136";
|
|||
|
|
case "23":
|
|||
|
|
return "DB90.176";
|
|||
|
|
case "24":
|
|||
|
|
return "DB90.56";
|
|||
|
|
case "25":
|
|||
|
|
return "DB90.136";
|
|||
|
|
case "26":
|
|||
|
|
return "DB90.176";
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 入库任务写堆垛机
|
|||
|
|
private object rkLock = new object ();
|
|||
|
|
/// <summary>
|
|||
|
|
/// 写PLC任务。
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="plcid">任务号</param>
|
|||
|
|
/// <param name="Getlocation">取货位置</param>
|
|||
|
|
/// <param name="SendLocation">卸货位置</param>
|
|||
|
|
/// <param name="TaskType">任务类型</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private bool WritePlcTaskRK(string plcid, string row, string cln, string layer, string DEPTH,
|
|||
|
|
string decid, string taskType, string code,string rkstand)
|
|||
|
|
{
|
|||
|
|
lock (rkLock)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string isok = string.Empty;
|
|||
|
|
string iserror = string.Empty;
|
|||
|
|
short[] values = new short[13];
|
|||
|
|
values[0] = short.Parse(taskType);//1:入库 2:出库 9移库
|
|||
|
|
values[1] = 1;// 取货站台
|
|||
|
|
values[2] = 1;///入库巷道号
|
|||
|
|
values[3] = 1;///出库巷道号
|
|||
|
|
values[4] = 1;//卸货站台号
|
|||
|
|
|
|||
|
|
//2,3,6,7,10,11 写PLC 1 取货排
|
|||
|
|
//1,4,5,8,9,12 写PLC 2取货排
|
|||
|
|
|
|||
|
|
if (row == "03" || row == "04" || row == "07" || row == "08" || row == "11" || row == "12")
|
|||
|
|
{
|
|||
|
|
values[5] = 1;//取货排
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[5] = 2;//取货排
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (row == "01" || row == "02" || row == "05" || row == "06" || row == "09" || row == "10")
|
|||
|
|
{
|
|||
|
|
values[6] = 1;///取货列
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[6] = 134;///取货列
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
values[7] = 1;//取货层
|
|||
|
|
|
|||
|
|
if (row == "01" || row == "04" || row == "05" || row == "08" || row == "09" || row == "12")
|
|||
|
|
{
|
|||
|
|
values[8] = 2;//卸货排
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[8] = 1;//卸货排
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
values[9] = short.Parse(cln);//卸货列
|
|||
|
|
values[10] = short.Parse(layer);//卸货层
|
|||
|
|
values[11] = 1;//取货深度
|
|||
|
|
values[12] = short.Parse(DEPTH);//卸货深度
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
OperateResult retWrite1 = plcModbus[int.Parse(decid)].Write("DB90.0", int.Parse(plcid));//任务号
|
|||
|
|
OperateResult retWrite2 = plcModbus[int.Parse(decid)].Write("DB90.4", values);//堆垛机坐标
|
|||
|
|
if (retWrite1.IsSuccess && retWrite2.IsSuccess)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(500);
|
|||
|
|
OperateResult writeXY = plcModbus[int.Parse(decid)].Write("DB90.80", (short)1);//校验
|
|||
|
|
if (writeXY.IsSuccess)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
OperateResult<int> ssjsts = plcModbus[int.Parse(decid)].ReadInt32("DB91.0");
|
|||
|
|
if (ssjsts.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (ssjsts.Content.ToString() == plcid)
|
|||
|
|
{
|
|||
|
|
AddText("接收PLC入库任务返回任务号成功:WCS写入任务号:" + plcid + ",读取PLC任务号:" + ssjsts.Content);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("接收PLC入库任务返回任务号失败:WCS写入任务号:" + plcid + ",读取PLC任务号:" + ssjsts.Content);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 出库写堆垛机PLC任务
|
|||
|
|
|
|||
|
|
private static readonly object lockwriteplc = new object();
|
|||
|
|
/// <summary>
|
|||
|
|
/// 写PLC任务。
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="plcid">任务号</param>
|
|||
|
|
/// <param name="Getlocation">取货位置</param>
|
|||
|
|
/// <param name="SendLocation">卸货位置</param>
|
|||
|
|
/// <param name="TaskType">任务类型</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private bool WritePlcTaskCK(string plcid, string row, string cln, string layer, string depth, string decid, string instand, string taskType,string ck_type )
|
|||
|
|
{
|
|||
|
|
lock (lockwriteplc)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string isok = string.Empty;
|
|||
|
|
string iserror = string.Empty;
|
|||
|
|
|
|||
|
|
short[] values = new short[13];
|
|||
|
|
values[0] = short.Parse(taskType);//1:入库 2:出库
|
|||
|
|
values[1] = 1;// 取货站台
|
|||
|
|
values[2] = 1;///入库巷道号
|
|||
|
|
values[3] = 1;///出库巷道号
|
|||
|
|
values[4] = 1;//卸货站台号
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (row == "02" || row == "03" || row == "06" || row == "07" || row == "10" || row == "11")
|
|||
|
|
{
|
|||
|
|
values[5] = 1;//取货排
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[5] = 2;//取货排
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
values[6] = short.Parse(cln);//取货列
|
|||
|
|
values[7] = short.Parse(layer);//取货层
|
|||
|
|
|
|||
|
|
if (row == "01" || row == "02" || row == "05" || row == "06" || row == "09" || row == "10")
|
|||
|
|
{
|
|||
|
|
values[8] = 1;//卸货排
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[8] = 2;//卸货排
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (row == "01" || row == "02" || row == "05" || row == "06" || row == "09" || row == "10")
|
|||
|
|
{
|
|||
|
|
values[9] = 1;///卸货列
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[9] = 134;///卸货列
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
values[10] = 1;//卸货层
|
|||
|
|
values[11] = short.Parse(depth);//取货深度
|
|||
|
|
values[12] = 1;//卸货深度
|
|||
|
|
|
|||
|
|
OperateResult<int> ssjstsID = plcModbus[int.Parse(decid)].ReadInt32("DB91.0");
|
|||
|
|
if (ssjstsID.IsSuccess && ssjstsID.Content == 0)
|
|||
|
|
{
|
|||
|
|
OperateResult retstsPlcid = plcModbus[int.Parse(decid)].Write("DB90.0", int.Parse(plcid));
|
|||
|
|
OperateResult retsts = plcModbus[int.Parse(decid)].Write("DB90.4", values);
|
|||
|
|
if (retsts.IsSuccess && retstsPlcid.IsSuccess)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(500);
|
|||
|
|
|
|||
|
|
OperateResult writeXY = plcModbus[int.Parse(decid)].Write("DB90.80", (short)1);//校验
|
|||
|
|
if (writeXY.IsSuccess)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
OperateResult<int> ssjsts = plcModbus[int.Parse(decid)].ReadInt32("DB91.0");
|
|||
|
|
if (ssjsts.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (ssjsts.Content.ToString() == plcid)
|
|||
|
|
{
|
|||
|
|
AddText("接收PLC出库任务返回任务号成功:WCS写入任务号:" + plcid + ",读取PLC任务号:" + ssjsts.Content);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("接收PLC出库任务返回任务号失败:WCS写入任务号:" + plcid + ",读取PLC任务号:" + ssjsts.Content);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 移库写堆垛机任务
|
|||
|
|
private bool WritePlcTaskMove(string plcid, string start_row, string start_cln, string start_layer, string start_depth,
|
|||
|
|
string end_row, string end_cln, string end_layer, string end_depth, string decid)
|
|||
|
|
{
|
|||
|
|
lock (lockwriteplc)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string isok = string.Empty;
|
|||
|
|
string iserror = string.Empty;
|
|||
|
|
|
|||
|
|
short[] values = new short[13];
|
|||
|
|
values[0] = 9;//1:入库 2:出库;9移库
|
|||
|
|
values[1] = 1;// 取货站台
|
|||
|
|
values[2] = 1;///入库巷道号
|
|||
|
|
values[3] = 1;///出库巷道号
|
|||
|
|
values[4] = 1;//卸货站台号
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (start_row == "02" || start_row == "03" || start_row == "06" || start_row == "07" || start_row == "10" || start_row == "11")
|
|||
|
|
{
|
|||
|
|
values[5] = 1;//取货排
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[5] = 2;//取货排
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
values[6] = short.Parse(start_cln);//取货列
|
|||
|
|
values[7] = short.Parse(start_layer);//取货层
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (end_row == "02" || end_row == "03" || end_row == "06" || end_row == "07" || end_row == "10" || end_row == "11")
|
|||
|
|
//if (end_row == "01" || end_row == "02" || end_row == "05" || end_row == "06" || end_row == "09" || end_row == "10")
|
|||
|
|
{
|
|||
|
|
values[8] = 1;//卸货排
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
values[8] = 2;//卸货排
|
|||
|
|
}
|
|||
|
|
values[9] = short.Parse(end_cln);///卸货列
|
|||
|
|
values[10] = short.Parse(end_layer);//卸货层
|
|||
|
|
|
|||
|
|
|
|||
|
|
values[11] = short.Parse(start_depth);//取货深度
|
|||
|
|
values[12] = short.Parse(end_depth);//卸货深度
|
|||
|
|
|
|||
|
|
|
|||
|
|
OperateResult retstsPlcid = plcModbus[int.Parse(decid)].Write("DB90.0", int.Parse(plcid));
|
|||
|
|
OperateResult retsts = plcModbus[int.Parse(decid)].Write("DB90.4", values);
|
|||
|
|
if (retsts.IsSuccess && retstsPlcid.IsSuccess)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(800);
|
|||
|
|
|
|||
|
|
OperateResult writeXY = plcModbus[int.Parse(decid)].Write("DB90.80", (short)1);//校验
|
|||
|
|
if (writeXY.IsSuccess)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
OperateResult<int> ssjsts = plcModbus[int.Parse(decid)].ReadInt32("DB91.0");
|
|||
|
|
if (ssjsts.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (ssjsts.Content.ToString() == plcid)
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 查询出库任务写堆垛机
|
|||
|
|
private static readonly object locksettask = new object();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 发送任务
|
|||
|
|
/// </summary>
|
|||
|
|
private bool Set_CK_Task()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
bool retsts=false;
|
|||
|
|
|
|||
|
|
List<string> declist = new List<string>();
|
|||
|
|
declist.Add("1");
|
|||
|
|
declist.Add("2");
|
|||
|
|
declist.Add("3");
|
|||
|
|
//while (true)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
//lock (locksettask)
|
|||
|
|
{
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
|
|||
|
|
//空箱出库任务?
|
|||
|
|
DataTable dtCtlNull = DataClass.Instance().GetCKTaskNullBoX(ref errText);
|
|||
|
|
if (dtCtlNull != null && dtCtlNull.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string pickingid = dtCtlNull.Rows[0]["pickingid"].ToString();
|
|||
|
|
|
|||
|
|
string decIdCTL = DataClass.Instance().GetBoxNumDecId();
|
|||
|
|
if (decIdCTL.Length > 0)
|
|||
|
|
{
|
|||
|
|
DataTable dtbox = DataClass.Instance().GetCK_TASK_NULLBOX(decIdCTL);
|
|||
|
|
if (dtbox != null && dtbox.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
|
|||
|
|
string location_id = dtbox.Rows[0]["location_id"].ToString();
|
|||
|
|
string CTL = dtbox.Rows[0]["ctl"].ToString();
|
|||
|
|
|
|||
|
|
//string GOODS_ID = dtbox.Rows[0]["goods_id"].ToString();
|
|||
|
|
//string PUTIN_ID = "CK" + DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (DataClass.Instance().UpdateCKTaskPLCID(plcId,CTL, location_id, pickingid))
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().Update_T_MI_STOCK("1", CTL, location_id);
|
|||
|
|
AddText("空托盘出库任务查找货位成功,任务号:" + plcId + "出库库位:" + location_id + "料箱号:" + CTL);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
foreach (string decid in declist)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
//查询出库任务
|
|||
|
|
DataTable dt = DataClass.Instance().GetCKTask(decid, ref errText);
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("WCS获取WMS出库任务发生异常" + errText);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (dt != null && dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
//foreach(var TASK in dt.Rows)
|
|||
|
|
//{
|
|||
|
|
// if (dt.Rows[0]["GOOD_ID"].ToString().Trim() == "000000" && dt.Rows[0]["TYPESTS"].ToString() != "3")
|
|||
|
|
// {
|
|||
|
|
// continue;
|
|||
|
|
// }
|
|||
|
|
// else if(dt.Rows[0]["GOOD_ID"].ToString().Trim() != "000000" && dt.Rows[0]["TYPESTS"].ToString() != "3")
|
|||
|
|
// {
|
|||
|
|
// OperateResult<short> number = plcModbus[4].ReadInt16("DB10.DBW4192");
|
|||
|
|
// OperateResult<short> STATUS = plcModbus[4].ReadInt16("DB10.DBW3930");
|
|||
|
|
// if (number.Content < int.Parse(textBox1.Text) && STATUS.Content == 0)//线体数量小于20下发出库
|
|||
|
|
// {
|
|||
|
|
// AddText($"当前数量{number.Content},可以下发料箱出库任务");
|
|||
|
|
// continue;
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// continue;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
//如果不是空箱出库
|
|||
|
|
if (dt.Rows[0]["GOOD_ID"].ToString().Trim() != "000000" && dt.Rows[0]["TYPESTS"].ToString() != "3")
|
|||
|
|
{
|
|||
|
|
OperateResult<short> number = plcModbus[4].ReadInt16("DB10.DBW4192");
|
|||
|
|
OperateResult<short> STATUS = plcModbus[4].ReadInt16("DB10.DBW3930");
|
|||
|
|
if (number.Content < int.Parse(textBox1.Text) && STATUS.Content == 0)//线体数量小于20下发出库
|
|||
|
|
{
|
|||
|
|
AddText($"当前数量{number.Content},可以下发料箱出库任务");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
retsts = true;
|
|||
|
|
|
|||
|
|
#region
|
|||
|
|
|
|||
|
|
string plcID = dt.Rows[0]["plcId"].ToString().Trim();
|
|||
|
|
string GOOD_ID = dt.Rows[0]["GOOD_ID"].ToString().Trim();//000000空料箱
|
|||
|
|
string decId = dt.Rows[0]["decId"].ToString().Trim();
|
|||
|
|
string locationID = dt.Rows[0]["LOC_ID"].ToString().Trim();//起始货位
|
|||
|
|
string LOCATION_ID_PLC = dt.Rows[0]["location_id_plc"].ToString().Trim();//PLC的货位
|
|||
|
|
string inline= dt.Rows[0]["inline"].ToString().Trim();//双深货位 相邻的货位
|
|||
|
|
|
|||
|
|
string outstand = dt.Rows[0]["outstand"].ToString().Trim();
|
|||
|
|
string to_loc = dt.Rows[0]["TOWHSELOC"].ToString().Trim();//移库任务目的货位
|
|||
|
|
string typests = dt.Rows[0]["typests"].ToString().Trim();// 1,出库,3,移库
|
|||
|
|
|
|||
|
|
//string[] strCid = locationID.Split('-');
|
|||
|
|
|
|||
|
|
string row = LOCATION_ID_PLC.Substring(0, 2);
|
|||
|
|
string cln = LOCATION_ID_PLC.Substring(2, 3);//起始地址
|
|||
|
|
string layer = LOCATION_ID_PLC.Substring(5, 2);
|
|||
|
|
string depth = LOCATION_ID_PLC.Substring(7, 1);
|
|||
|
|
|
|||
|
|
//if (GOOD_ID == "000000" && locationID=="")//查找空托盘货位出库,3台堆垛机托盘最大出 空闲堆垛机出库
|
|||
|
|
//{
|
|||
|
|
// string decIdCTL = DataClass.Instance().GetBoxNumDecId();
|
|||
|
|
// if (decIdCTL.Length > 0)
|
|||
|
|
// {
|
|||
|
|
// DataTable dtbox = DataClass.Instance().GetCK_TASK_NULLBOX(decIdCTL);
|
|||
|
|
// if (dtbox != null && dtbox.Rows.Count > 0)
|
|||
|
|
// {
|
|||
|
|
// string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
|
|||
|
|
// string location_id = dtbox.Rows[0]["location_id"].ToString();
|
|||
|
|
// string CTL = dtbox.Rows[0]["ctl"].ToString();
|
|||
|
|
|
|||
|
|
// string GOODS_ID = dtbox.Rows[0]["goods_id"].ToString();
|
|||
|
|
// string PUTIN_ID = "CK" + DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
|||
|
|
|
|||
|
|
|
|||
|
|
// if (DataClass.Instance().insert_T_CK_PICKINGWAVEGOODS(plcId, PUTIN_ID, location_id, "0",
|
|||
|
|
// "0", CTL, "", "0", "1","", GOODS_ID, "") > 0)
|
|||
|
|
// {
|
|||
|
|
// AddText("生成空托盘出库任务,任务号:" + plcId + "出库库位:" + locationID + "料箱号:" + CTL);
|
|||
|
|
// continue;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// continue;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (depth == "2" && GOOD_ID!="000000")
|
|||
|
|
{
|
|||
|
|
//出2深度的货位 首先查询1深度是否有货,有货产生移库任务 在执行出库任务
|
|||
|
|
|
|||
|
|
DataTable dtonmis = DataClass.Instance().GetCKTaskHK(inline);//查询入库表 浅货位是否正在入库
|
|||
|
|
if (dtonmis != null)
|
|||
|
|
{
|
|||
|
|
if (dtonmis.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
retsts = false;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
DataTable dtmis = DataClass.Instance().GetCKTaskSTS(inline);//查询浅货位库存是否存在
|
|||
|
|
if (dtmis != null)
|
|||
|
|
{
|
|||
|
|
if (dtmis.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
DataTable dtonmisck = DataClass.Instance().GetCKTaskCk(inline);//查询出库表是否有浅货位的出库任务
|
|||
|
|
if (dtonmisck != null)
|
|||
|
|
{
|
|||
|
|
if (dtonmisck.Rows.Count == 0)
|
|||
|
|
{
|
|||
|
|
//string decId = dtmis.Rows[0]["decId"].ToString().Trim();
|
|||
|
|
string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
|
|||
|
|
string BARCODE = dtmis.Rows[0]["BARCODE"].ToString();
|
|||
|
|
string CTL = dtmis.Rows[0]["CTL"].ToString();
|
|||
|
|
string LOCATION_ID = dtmis.Rows[0]["LOCATION_ID"].ToString();
|
|||
|
|
string PICKING_NUM = dtmis.Rows[0]["SHELVES_NUM"].ToString();
|
|||
|
|
string SPECIFICATION = dtmis.Rows[0]["VERSION"].ToString();
|
|||
|
|
string GOODS_ID = dtmis.Rows[0]["GOODS_ID"].ToString();
|
|||
|
|
string PUTIN_ID = "YK" + DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
|||
|
|
|
|||
|
|
string TOWHSELOC = DataClass.Instance().GetLOCATIONID_MOVE(dtmis.Rows[0]["STORAGE_AREA_ID"].ToString(), LOCATION_ID, ref errText);
|
|||
|
|
if (TOWHSELOC.Trim().Length == 0)
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (DataClass.Instance().insert_T_CK_PICKINGWAVEGOODS(plcId, PUTIN_ID, LOCATION_ID, PICKING_NUM,
|
|||
|
|
BARCODE, CTL, "", "0", "3", SPECIFICATION, GOODS_ID, TOWHSELOC) > 0)
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_BASE_STORAGE_AREA_LOCATION_sts(TOWHSELOC))
|
|||
|
|
{
|
|||
|
|
AddText("生成移库任务号:" + plcID + "起始库位:" + locationID + "目的库位:" + TOWHSELOC + ",写入数据库成功");
|
|||
|
|
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("生成移库任务号:" + plcID + "起始库位:" + locationID + "目的库位:" + TOWHSELOC + ",更新数据库货位状态1成功");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
retsts = true;
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
retsts = true;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//DataTable dt2 = DataClass.Instance().GetCKTaskList(inline,ref errText);
|
|||
|
|
//if (dt2 != null)
|
|||
|
|
//{
|
|||
|
|
// if (dt2.Rows.Count > 0)
|
|||
|
|
// {
|
|||
|
|
// //浅货位有货 需要生成出库任务
|
|||
|
|
// string plcId = DataClass.Instance().GetPlcId();
|
|||
|
|
|
|||
|
|
// string BARCODE = dt2.Rows[0]["BARCODE"].ToString();
|
|||
|
|
// string CTL = dt2.Rows[0]["CTL"].ToString();
|
|||
|
|
// string LOCATION_ID = dt2.Rows[0]["LOCATION_ID"].ToString();
|
|||
|
|
// string PICKING_NUM = dt2.Rows[0]["SHELVES_NUM"].ToString();
|
|||
|
|
// string SPECIFICATION = dt2.Rows[0]["VERSION"].ToString();
|
|||
|
|
// string GOODS_ID = dt2.Rows[0]["GOODS_ID"].ToString();
|
|||
|
|
// string PUTIN_ID = "CK" + DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
|||
|
|
|
|||
|
|
// string TOWHSELOC = "";// DataClass.Instance().GetLOCATIONID("1", ref errText);
|
|||
|
|
// if (DataClass.Instance().insert_T_CK_PICKINGWAVEGOODS(plcId, PUTIN_ID, LOCATION_ID, PICKING_NUM,
|
|||
|
|
// BARCODE, CTL, "", "0", "3", SPECIFICATION, GOODS_ID, TOWHSELOC)>0)
|
|||
|
|
// {
|
|||
|
|
// AddText("生成移库任务号:" + plcID + "起始库位:" + locationID + "目的库位:" + TOWHSELOC + ",写入数据库成功");
|
|||
|
|
|
|||
|
|
// continue;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (typests == "3" && to_loc != "")
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
DataTable dtInStand = DataClass.Instance().Get_T_BASE_STORAGE_AREA_LOCATION_InStand(to_loc);
|
|||
|
|
if (dtInStand != null && dtInStand.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
decId = dtInStand.Rows[0]["decid"].ToString().Trim();
|
|||
|
|
to_loc = dtInStand.Rows[0]["location_id_plc"].ToString().Trim();//转换PLC 的坐标
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//string row = LOCATION_ID_PLC.Substring(0, 2);
|
|||
|
|
//string cln = LOCATION_ID_PLC.Substring(2, 3);//起始地址
|
|||
|
|
//string layer = LOCATION_ID_PLC.Substring(5, 2);
|
|||
|
|
//string depth = LOCATION_ID_PLC.Substring(7, 1);
|
|||
|
|
|
|||
|
|
|
|||
|
|
string end_row = to_loc.Substring(0, 2);
|
|||
|
|
string end_cln = to_loc.Substring(2, 3);
|
|||
|
|
string end_layer = to_loc.Substring(5, 2);
|
|||
|
|
string end_depth = to_loc.Substring(7, 1);
|
|||
|
|
|
|||
|
|
OperateResult<short[]> opfhidYK = plcModbus[int.Parse(decId)].ReadInt16("DB91.4", 2);
|
|||
|
|
if (opfhidYK.IsSuccess)
|
|||
|
|
{
|
|||
|
|
string kzfssts = opfhidYK.Content[0].ToString();//堆垛机控制方式 联机 脱机 手动
|
|||
|
|
string DevStatus = opfhidYK.Content[1].ToString();//堆垛机状态 1空闲
|
|||
|
|
if (kzfssts == "5")
|
|||
|
|
{
|
|||
|
|
if (DevStatus == "1")
|
|||
|
|
{
|
|||
|
|
bool retTF = WritePlcTaskMove(plcID, row, Convert.ToString(int.Parse(cln)+1), layer, depth, end_row, Convert.ToString(int.Parse(end_cln) + 1), end_layer, end_depth, decId);
|
|||
|
|
if (retTF)
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().UpdateCKTaskSts(plcID, "1"))
|
|||
|
|
{
|
|||
|
|
AddText("移库任务号:" + plcID + "起始库位:" + locationID + "目的库位:" + to_loc + ",移库任务写PLC成功,更新移库任务状态为1成功");
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("移库任务号:" + plcID + "起始库位:" + locationID + "目的库位:" + to_loc + ",移库任务写PLC成功,更新移库任务状态为1失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机:" + decId + "忙碌中!!!,等待移库任务写入");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
txtErrorMsg("堆垛机连接异常:" + opfhidYK.Message);
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
else if (typests == "1" || typests == "2" || typests == "")//零拣货或者整托出库
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
OperateResult<short[]> opfhid3 = plcModbus[int.Parse(decId)].ReadInt16("DB91.4", 2);
|
|||
|
|
if (opfhid3.IsSuccess)
|
|||
|
|
{
|
|||
|
|
string kzfssts = opfhid3.Content[0].ToString();//堆垛机控制方式 联机 脱机 手动
|
|||
|
|
string DevStatus = opfhid3.Content[1].ToString();//堆垛机状态 1空闲
|
|||
|
|
if (kzfssts == "5")
|
|||
|
|
{
|
|||
|
|
if (DevStatus == "1")
|
|||
|
|
{
|
|||
|
|
string retckstand = GetCkStand(row);
|
|||
|
|
OperateResult<short> retssjsts = plcModbus[4].ReadInt16(retckstand);
|
|||
|
|
if (retssjsts.IsSuccess && retssjsts.Content == 1)
|
|||
|
|
{
|
|||
|
|
if (WritePlcTaskCK(plcID, row, Convert.ToString(int.Parse(cln) + 1), layer, depth, decId, "0", "2", typests))
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().UpdateCKTaskSts(plcID, "1"))
|
|||
|
|
{
|
|||
|
|
//DataClass.Instance().UpdateDevFault(decId);
|
|||
|
|
|
|||
|
|
AddText("任务号:" + plcID + "库位:" + locationID + ",堆垛机:" + decId + ",出库任务写PLC成功,更新出库任务状态为1成功");
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("任务号:" + plcID + "库位:" + locationID + ",堆垛机:" + decId + "出库任务写PLC成功,更新出库任务状态为1失败!!!");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机:" + decId + ",写堆垛机出库指令失败...");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机:" + decId + ",出库排:" + row + ",不允许出库PLC地址:" + retckstand);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机:" + decId + ",非空闲模式等待出库...");
|
|||
|
|
//return retsts;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("堆垛机:" + decId + "非联机方式,请设置堆垛机控制方式");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
txtErrorMsg("堆垛机连接异常:" + opfhid3.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
retsts =false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
retsts = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return retsts;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
public string GetCkStand(string row)
|
|||
|
|
{
|
|||
|
|
string ckstand = "";
|
|||
|
|
if (row == "01" || row == "02")
|
|||
|
|
{
|
|||
|
|
ckstand = "DB10.DBW90";
|
|||
|
|
}
|
|||
|
|
else if (row == "03" || row == "04")
|
|||
|
|
{
|
|||
|
|
ckstand = "DB10.DBW154";
|
|||
|
|
}
|
|||
|
|
else if (row == "05" || row == "06")
|
|||
|
|
{
|
|||
|
|
ckstand = "DB10.DBW218";
|
|||
|
|
}
|
|||
|
|
else if (row == "07" || row == "08")
|
|||
|
|
{
|
|||
|
|
ckstand = "DB10.DBW282";
|
|||
|
|
}
|
|||
|
|
else if (row == "09" || row == "10")
|
|||
|
|
{
|
|||
|
|
ckstand = "DB10.DBW346";
|
|||
|
|
}
|
|||
|
|
else if (row == "11" || row == "12")
|
|||
|
|
{
|
|||
|
|
ckstand = "DB10.DBW410";
|
|||
|
|
}
|
|||
|
|
return ckstand;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 接收出库PLC条码 打印标签
|
|||
|
|
/// <summary>
|
|||
|
|
/// 入库
|
|||
|
|
/// </summary>
|
|||
|
|
private void CK_BCR()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
lock ("CKBCR")
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
inovanceH3UTcp.IsStringReverse = true;
|
|||
|
|
OperateResult<string> read = inovanceH3UTcp.ReadString("MW261", 10);//出库BCR读地址 MW261长度10 M275 写1 放行
|
|||
|
|
if (read.IsSuccess)
|
|||
|
|
{
|
|||
|
|
string barcode = read.Content;//PLC条码号
|
|||
|
|
|
|||
|
|
barcode = barcode.Replace(",", "");
|
|||
|
|
barcode = barcode.Replace("\n", "");
|
|||
|
|
barcode = barcode.Replace("\0", "");
|
|||
|
|
barcode = barcode.Replace("\r", "");
|
|||
|
|
barcode = barcode.Replace(" ", "");
|
|||
|
|
if (barcode != "" && barcode != "Noread")
|
|||
|
|
{
|
|||
|
|
AddText("接收出库PLC条码信息:" + barcode);
|
|||
|
|
if (barcode.Length == 20)
|
|||
|
|
{
|
|||
|
|
DataTable dt = DataClass.Instance().GetT_BASE_GOODS_BARCODE(barcode);
|
|||
|
|
if (dt != null)
|
|||
|
|
{
|
|||
|
|
if (dt.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
AddText("开始打印出库条码:" + barcode);
|
|||
|
|
XtraReport1 br = new XtraReport1();
|
|||
|
|
br.SetBindData(dt, "2");
|
|||
|
|
|
|||
|
|
OperateResult write3 = inovanceH3UTcp.Write("MW261", new short[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("批号查询失败,条码未入库无法打印:" + barcode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("接收PLC出库读码异常,批号:" + barcode);
|
|||
|
|
OperateResult write4 = inovanceH3UTcp.Write("MW261", new short[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OperateResult write2 = inovanceH3UTcp.Write("MW275", (short)1);
|
|||
|
|
}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// AddText("出库读码异常");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(ex.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 过账信息处理
|
|||
|
|
private static readonly object lockGuozhang = new object();
|
|||
|
|
private void ClearAccount()
|
|||
|
|
{
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(1000);
|
|||
|
|
|
|||
|
|
lock (lockGuozhang)
|
|||
|
|
{
|
|||
|
|
string Errtext = string.Empty;
|
|||
|
|
for (int i = 1; i < 4; i++)//遍历堆垛机
|
|||
|
|
{
|
|||
|
|
foreach (string rkstand in DDJ_Finish)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string sta = Get_PLC_FINISH(rkstand);
|
|||
|
|
string[] strb = sta.Split(';');
|
|||
|
|
OperateResult<int> retA = plcModbus[i].ReadInt32(strb[0]);
|
|||
|
|
if (retA.IsSuccess && retA.Content > 0)
|
|||
|
|
{
|
|||
|
|
string retPlcId = retA.Content.ToString();
|
|||
|
|
OperateResult<short> retB = plcModbus[i].ReadInt16(strb[1]);// 任务类型:1正常任务 2 删除任务
|
|||
|
|
|
|||
|
|
string retType = retB.Content.ToString();// 任务类型:1正常任务 2 删除任务
|
|||
|
|
if (retType == "1")//正常任务
|
|||
|
|
{
|
|||
|
|
if (int.Parse(retPlcId) > 0)
|
|||
|
|
{
|
|||
|
|
AddText("接收过账区任务号:" + retPlcId);
|
|||
|
|
//根据任务号对应的任务执行过账
|
|||
|
|
DataSet ds_ON = DataClass.Instance().SELECT_ON(retPlcId);//入库
|
|||
|
|
if (ds_ON.Tables[0].Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_ONGOODSSHELF(10, retPlcId))//入库任务
|
|||
|
|
{
|
|||
|
|
//正常过账入库
|
|||
|
|
AddText("接收过账区任务号:" + retPlcId + ",堆垛机入库放货完成,更新入库状态10成功");
|
|||
|
|
WriteSysLog.SysLog("接收过账区任务号:" + retPlcId + ",堆垛机入库放货完成,更新入库状态3成功");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
DataSet ds_OUT = DataClass.Instance().SELECT_OUT(retPlcId);//出库
|
|||
|
|
if (ds_OUT.Tables[0].Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
//判断移库3,料箱出库及空箱出库
|
|||
|
|
string GOODSID = ds_OUT.Tables[0].Rows[0]["GOOD_ID"].ToString();
|
|||
|
|
string TASKTYPE = ds_OUT.Tables[0].Rows[0]["TYPESTS"].ToString();
|
|||
|
|
if (GOODSID == "000000" && TASKTYPE != "3")//空箱出库
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().UpdateCKTaskStatus(retPlcId, "9");
|
|||
|
|
}
|
|||
|
|
else if (GOODSID != "000000" && TASKTYPE != "3")//料箱出库
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().UpdateCKTaskStatus(retPlcId, "6");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
DataClass.Instance().UpdateCKTaskStatus(retPlcId, "9");
|
|||
|
|
}
|
|||
|
|
AddText("接收过账区任务号:" + retPlcId + ",堆垛机放货完成,更新出库状态成功");
|
|||
|
|
WriteSysLog.SysLog("接收过账区任务号:" + retPlcId + ",堆垛机放货完成,更新出库状态成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//无用过账直接清除
|
|||
|
|
AddText("接收过账区任务号:" + retPlcId + ",任务号异常");
|
|||
|
|
WriteSysLog.SysLog("接收过账区任务号:" + retPlcId + ",任务号异常");
|
|||
|
|
}
|
|||
|
|
plcModbus[i].Write(WCS_TO_PLC_DEL(rkstand), int.Parse(retPlcId));
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
plcModbus[i].Write(WCS_TO_PLC_DEL(rkstand), int.Parse(retPlcId));
|
|||
|
|
AddText("任务号:" + retPlcId + " 堆垛机手动删除。");
|
|||
|
|
//无用过账直接清除
|
|||
|
|
WriteSysLog.SysLog("任务号" + retPlcId + "堆垛机手动删除");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (int.Parse(retType) == 2)
|
|||
|
|
{
|
|||
|
|
plcModbus[i].Write(WCS_TO_PLC_DEL(rkstand), int.Parse(retPlcId));
|
|||
|
|
AddText("任务号:" + retPlcId + " 堆垛机手动删除。");
|
|||
|
|
//无用过账直接清除
|
|||
|
|
WriteSysLog.SysLog("任务号" + retPlcId + "堆垛机手动删除");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception exp)
|
|||
|
|
{
|
|||
|
|
WriteSysLog.SysLog("过账数据处理错误,信息:" + exp.ToString());
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 清空指定过账区
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="i"></param>
|
|||
|
|
private void ClearGuoZhang(int i, int plcid)
|
|||
|
|
{
|
|||
|
|
PLCCommon.PlcFactory.Instance().WirtePlcContianer("过账确认" + i.ToString(), new object[] { plcid });
|
|||
|
|
// PLCCommon.PlcFactory.Instance().WirtePlcContianer("过账类型" + i.ToString(), new object[] { 0 });
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 出库完成通知AGV
|
|||
|
|
|
|||
|
|
public class RootobjectMod
|
|||
|
|
{
|
|||
|
|
public string reqCode { get; set; }
|
|||
|
|
public string reqTime { get; set; }
|
|||
|
|
public string clientCode { get; set; }
|
|||
|
|
public string tokenCode { get; set; }
|
|||
|
|
public string interfaceName { get; set; }
|
|||
|
|
public string taskTyp { get; set; }
|
|||
|
|
public string wbCode { get; set; }
|
|||
|
|
public Positioncodepath[] positionCodePath { get; set; }
|
|||
|
|
public string podCode { get; set; }
|
|||
|
|
public string podDir { get; set; }
|
|||
|
|
public string priority { get; set; }
|
|||
|
|
public string agvCode { get; set; }
|
|||
|
|
public string taskCode { get; set; }
|
|||
|
|
public string data { get; set; }
|
|||
|
|
|
|||
|
|
public string userCallCode { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class Positioncodepath
|
|||
|
|
{
|
|||
|
|
public string positionCode { get; set; }
|
|||
|
|
public string type { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
List<Positioncodepath> listP = new List<Positioncodepath>();
|
|||
|
|
|
|||
|
|
public static string MidStrEx_New(string sourse, string startstr, string endstr)
|
|||
|
|
{
|
|||
|
|
Regex rg = new Regex("(?<=(" + startstr + "))[.\\s\\S]*?(?=(" + endstr + "))", RegexOptions.Multiline | RegexOptions.Singleline);
|
|||
|
|
return rg.Match(sourse).Value;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 生成AGV调度任务单
|
|||
|
|
|
|||
|
|
public class RootSendAgvSchedulingTask
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string reqCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string reqTime { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string clientCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string tokenCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string taskTyp { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string userCallCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public List<string> userCallCodePath { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string podCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string podDir { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string priority { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string robotCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string taskCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string data { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
List<string> userCallCodePathList = new List<string>();
|
|||
|
|
|
|||
|
|
|
|||
|
|
private void SendAgvSchedulingTask (string reqCode,string podCode)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
//{
|
|||
|
|
// "reqCode": "",
|
|||
|
|
// "reqTime": "",
|
|||
|
|
// "clientCode": "",
|
|||
|
|
// "tokenCode": "",
|
|||
|
|
// "taskTyp": "",
|
|||
|
|
// "userCallCode": "",
|
|||
|
|
// "userCallCodePath": ["p01", "b01"],
|
|||
|
|
// "podCode": "100001",
|
|||
|
|
// "podDir": "0",
|
|||
|
|
// "priority": "1",
|
|||
|
|
// "robotCode": "",
|
|||
|
|
// "taskCode": "",
|
|||
|
|
// "data": ""
|
|||
|
|
//}
|
|||
|
|
//起点:位置点p01; 终点:位置点b01;
|
|||
|
|
userCallCodePathList.Add("p01");
|
|||
|
|
userCallCodePathList.Add("b01");
|
|||
|
|
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
RootSendAgvSchedulingTask rt = new RootSendAgvSchedulingTask();
|
|||
|
|
|
|||
|
|
rt.reqCode = DateTime.Now.ToString("yyyyMMddHHmmss");
|
|||
|
|
rt.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|||
|
|
rt.clientCode = "";//客户端编号 海康提供
|
|||
|
|
rt.tokenCode = "";//令牌号 海康提供
|
|||
|
|
rt.taskTyp = "";//任务类型,空托盘入库,使用字母, 海康提供
|
|||
|
|
rt.userCallCode = "";//接驳工位
|
|||
|
|
rt.userCallCodePath = userCallCodePathList; //起点:位置点p01; 终点:位置点b01;
|
|||
|
|
rt.podCode = "";//货架编号(和料箱号一样)
|
|||
|
|
rt.podDir = "";//“180”,”0”,”90”,”-90” 分别代表”左”,”右”,”上”,”下”
|
|||
|
|
rt.priority = "1";//优先级,从(1~5)级,最大优先级最高
|
|||
|
|
rt.robotCode = ""; //Agv编号(空)
|
|||
|
|
rt.taskCode = "";//任务单号,选填, 不填系统自动生成,必须为32位UUID
|
|||
|
|
rt.data = "";
|
|||
|
|
|
|||
|
|
string strJSON = JsonConvert.SerializeObject(rt);
|
|||
|
|
string strJsonRK = ApiPost("http://" + MesIpPort + "/genAgvSchedulingTask", strJSON,ref errText);
|
|||
|
|
RCKLIST.Clear();
|
|||
|
|
if (strJsonRK.Length > 0)
|
|||
|
|
{
|
|||
|
|
JObject strJo = (JObject)JsonConvert.DeserializeObject(strJsonRK);
|
|||
|
|
string returncode = strJo["code"].ToString();
|
|||
|
|
string returnmsg = strJo["message"].ToString();
|
|||
|
|
if (returncode == "0")
|
|||
|
|
{
|
|||
|
|
AddText("生成AGV调度任务单成功,reqCode=" + rt.reqCode);
|
|||
|
|
//if (DataClass.Instance().UpdateT_WMS_TO_WCS_WORK_OUT(2,3, plcid))
|
|||
|
|
//{
|
|||
|
|
// AddText("出库任务回传WMS成功,更新状态为2成功 workID=" + lkr.workID);
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// AddText("出库任务回传WMS成功,更新状态为2失败 workID=" + lkr.workID);
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("生成AGV调度任务单失败,异常:" + returnmsg);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 输送机状态显示
|
|||
|
|
private static object ssjlock = new object();
|
|||
|
|
|
|||
|
|
private void SSJ_STATUS()
|
|||
|
|
{
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
while (true)
|
|||
|
|
{
|
|||
|
|
lock (ssjlock)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
//设备状态:1空闲,2有载
|
|||
|
|
Control CT = groupBox6;
|
|||
|
|
if (CT != null)
|
|||
|
|
{
|
|||
|
|
foreach (Control ctl in CT.Controls)
|
|||
|
|
{
|
|||
|
|
if (ctl.Text.ToString() != "")
|
|||
|
|
{
|
|||
|
|
System.Text.RegularExpressions.Regex reg1 = new System.Text.RegularExpressions.Regex(@"^[-]?\d+[.]?\d*$");
|
|||
|
|
if (reg1.IsMatch(ctl.Text.Trim()))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (ctl.Text.Length == 3 && ctl.Name.Substring(0,3)=="lbl")//01
|
|||
|
|
{
|
|||
|
|
string ss = ctl.Text;
|
|||
|
|
OperateResult<bool> ontStation = plcModbus[4].ReadBool(Get_SSJ_STS(ss));
|
|||
|
|
if (ontStation.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (ontStation.Content)
|
|||
|
|
{
|
|||
|
|
ctl.BackColor = Color.Blue;
|
|||
|
|
}
|
|||
|
|
else if (ontStation.Content.ToString() == "1")
|
|||
|
|
{
|
|||
|
|
ctl.BackColor = Color.Transparent;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
txtErrorMsg("输送机状态显示堆垛机连接异常:" + ontStation.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//Control CT2 = panel2;
|
|||
|
|
//if (CT2 != null)
|
|||
|
|
//{
|
|||
|
|
// foreach (Control ctl2 in CT2.Controls)
|
|||
|
|
// {
|
|||
|
|
// if (ctl2.Text.ToString() != "")
|
|||
|
|
// {
|
|||
|
|
// System.Text.RegularExpressions.Regex reg1 = new System.Text.RegularExpressions.Regex(@"^[-]?\d+[.]?\d*$");
|
|||
|
|
// if (reg1.IsMatch(ctl2.Text.Trim()))
|
|||
|
|
// {
|
|||
|
|
// OperateResult<short> ontStation = plcModbus[4].ReadInt16(GetSSJ_STS(ctl2.Text));
|
|||
|
|
// if (ontStation.IsSuccess)
|
|||
|
|
// {
|
|||
|
|
// if (ontStation.Content.ToString() == "2")
|
|||
|
|
// {
|
|||
|
|
// ctl2.BackColor = Color.Blue;
|
|||
|
|
// }
|
|||
|
|
// else if (ontStation.Content.ToString() == "1")
|
|||
|
|
// {
|
|||
|
|
// ctl2.BackColor = Color.Transparent;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// txtErrorMsg("堆垛机连接异常:" + ontStation.Message);
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
catch (Exception ee)
|
|||
|
|
{ }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// //遍历循环 所有输送机的状态值(0,1)
|
|||
|
|
/// </summary>
|
|||
|
|
public void DecConvertSts()
|
|||
|
|
{
|
|||
|
|
string errText = string.Empty;
|
|||
|
|
DataTable tbWms = DataClass.Instance().GetConveyorStatus();
|
|||
|
|
if (tbWms != null && tbWms.Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < tbWms.Rows.Count; i++)
|
|||
|
|
{
|
|||
|
|
string decIndex = tbWms.Rows[i]["ConveyorID"].ToString();
|
|||
|
|
string plcdb = tbWms.Rows[i]["plcdb"].ToString();
|
|||
|
|
int lyn = int.Parse(tbWms.Rows[i]["lyn"].ToString());
|
|||
|
|
OperateResult<short[]> readD100 = plcModbus[lyn].ReadInt16("DB90." + plcdb, 3);
|
|||
|
|
if (readD100.IsSuccess)
|
|||
|
|
{
|
|||
|
|
short error = 0;
|
|||
|
|
string errtext = "";
|
|||
|
|
short[] cyData = readD100.Content;
|
|||
|
|
|
|||
|
|
short type = cyData[0];//作业类型:1入库,2出库
|
|||
|
|
short autol = cyData[1];//控制方式1维修,2手动,5联机
|
|||
|
|
string loadmode = cyData[2].ToString();////设备状态:1无货;2有货
|
|||
|
|
|
|||
|
|
int plcid = 0;
|
|||
|
|
string plcx = "DB90." + (int.Parse(plcdb) - 4);//任务号地址
|
|||
|
|
OperateResult<int> readload = plcModbus[lyn].ReadInt32(plcx);
|
|||
|
|
if (readload.IsSuccess)
|
|||
|
|
{
|
|||
|
|
if (readload.Content>0)
|
|||
|
|
{
|
|||
|
|
plcid = readload.Content;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
switch (error)
|
|||
|
|
{
|
|||
|
|
case 1:
|
|||
|
|
errtext = "输送超时";
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
errtext = "电机故障";
|
|||
|
|
break;
|
|||
|
|
case 4:
|
|||
|
|
errtext = "超宽";
|
|||
|
|
break;
|
|||
|
|
case 8:
|
|||
|
|
errtext = "超高";
|
|||
|
|
break;
|
|||
|
|
case 16:
|
|||
|
|
errtext = "重量错误";
|
|||
|
|
break;
|
|||
|
|
case 32:
|
|||
|
|
errtext = "高度货格不符";
|
|||
|
|
break;
|
|||
|
|
case 128:
|
|||
|
|
errtext = "后限位故障";
|
|||
|
|
break;
|
|||
|
|
case 256:
|
|||
|
|
errtext = "激光错误";
|
|||
|
|
break;
|
|||
|
|
case 512:
|
|||
|
|
errtext = "急停错误";
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
DataClass.Instance().UpStandNeedEnd(decIndex.ToString(), plcid.ToString(), autol.ToString(), errtext, loadmode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Thread.Sleep(2000);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region Api的post方法
|
|||
|
|
private static readonly object lockapi = new object();
|
|||
|
|
private string ApiPost(string url, string message,ref string errText)
|
|||
|
|
{
|
|||
|
|
lock (lockapi)
|
|||
|
|
{
|
|||
|
|
errText = string.Empty;
|
|||
|
|
string returnmessage = string.Empty;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
Encoding encoding = Encoding.UTF8;
|
|||
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
|
|||
|
|
request.Method = "POST";
|
|||
|
|
//request.Accept = "text/html, application/xhtml+xml, *";
|
|||
|
|
request.ContentType = "application/json";
|
|||
|
|
//request.ContentLength = buffer.Length;
|
|||
|
|
byte[] buffer = encoding.GetBytes(message);
|
|||
|
|
request.GetRequestStream().Write(buffer, 0, buffer.Length);
|
|||
|
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
|||
|
|
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
|
|||
|
|
{
|
|||
|
|
returnmessage = reader.ReadToEnd();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
errText = ex.Message;
|
|||
|
|
}
|
|||
|
|
WriteSysLog.SysLog("WCS发送:\r\n" + message + "\r\n AGV返回信息:\r\n" + returnmessage);
|
|||
|
|
return returnmessage;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 上方菜单栏按钮事件
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//查看日志按钮,打开文件夹
|
|||
|
|
private void ButtonScanLogs_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Process.Start("Log");
|
|||
|
|
}
|
|||
|
|
catch { XtraMessageBox.Show("打开日志失败,您可以手动打开文件夹,名称“SysLog”", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
//清除过账按钮
|
|||
|
|
private void ButClearGuoZhang_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
|||
|
|
{
|
|||
|
|
if (XtraMessageBox.Show("确定清空?数据可能存在异常", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) != DialogResult.OK)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
SplashScreenManager.ShowDefaultWaitForm("请稍后...", "正在清空...");
|
|||
|
|
string Errtext = string.Empty;
|
|||
|
|
//for (int i = 1; i <= 25; i++)
|
|||
|
|
//{
|
|||
|
|
// string plcid = PLCCommon.PlcFactory.Instance().ReadPlcDbValue("过账区" + i.ToString(), ref Errtext);
|
|||
|
|
// if (plcid != "0" && plcid != "" && plcid != "01")
|
|||
|
|
// {
|
|||
|
|
// ClearGuoZhang(i,int.p);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
SplashScreenManager.CloseForm();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 基本功能事件,一般不需要更改
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private void txtErrorMsg(string info)
|
|||
|
|
{
|
|||
|
|
//if (txtError.Text.Length > 1000)
|
|||
|
|
//{
|
|||
|
|
// txtError.BeginInvoke(new MethodInvoker(delegate { txtError.Text = SysInfo.Text.Substring(200); }));
|
|||
|
|
//}
|
|||
|
|
////添加文本
|
|||
|
|
//txtError.BeginInvoke(new MethodInvoker(delegate { txtError.Text += DateTime.Now.ToString("MM-dd HH:mm:ss") + " || " + info + "\r\n"; }));
|
|||
|
|
|
|||
|
|
////移动光标到最下面
|
|||
|
|
//txtError.BeginInvoke(new MethodInvoker(delegate { txtError.SelectionStart = SysInfo.Text.Length; }));
|
|||
|
|
//txtError.BeginInvoke(new MethodInvoker(delegate { txtError.ScrollToCaret(); }));
|
|||
|
|
|
|||
|
|
txtError.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + info + "\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 数据库连接检测
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool SqlIsConnected()
|
|||
|
|
{
|
|||
|
|
#region 数据库连接检测
|
|||
|
|
bool SqlConnect = DataClass.Instance().CheckSqlConnect();
|
|||
|
|
if (SqlConnect)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
Thread.Sleep(100);
|
|||
|
|
return false;
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region
|
|||
|
|
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
|||
|
|
{
|
|||
|
|
DialogResult dr = XtraMessageBox.Show("是否退出系统?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
|
|||
|
|
if (dr == DialogResult.Yes)
|
|||
|
|
{
|
|||
|
|
Process.GetCurrentProcess().Kill();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
e.Cancel = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
List<REQUEST_DATAItem> RCKLIST = new List<REQUEST_DATAItem>();
|
|||
|
|
List<REQUEST_DATAItem2> RCKLIST2 = new List<REQUEST_DATAItem2>();
|
|||
|
|
|
|||
|
|
public class REQUEST_DATAItem2
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string DATA_AUTH { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string LOT_NO { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string ITEM_CODE { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string CREATE_TIME { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 不良
|
|||
|
|
/// </summary>
|
|||
|
|
public string BAD_CAUSE { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
/// 检测工位
|
|||
|
|
/// </summary>
|
|||
|
|
public string WORK_STATION { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class REQUEST_DATAItem
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
public string DATA_AUTH { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string BUSINESS_TYPE { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string LOT_NO { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string ITEM_CODE { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string OPERATOR_TIME { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string OPERATOR_USER { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class RootRCK
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public List<REQUEST_DATAItem> REQUEST_DATA { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class RootRCK2
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public List<REQUEST_DATAItem2> REQUEST_DATA { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private string GetBcrUxt()//读取条码
|
|||
|
|
{
|
|||
|
|
string strValues = string.Empty;
|
|||
|
|
OperateResult<byte[]> read = inovanceH3UTcp.Read("MW210", 20);
|
|||
|
|
{
|
|||
|
|
if (read.IsSuccess)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < 20; i++)
|
|||
|
|
{
|
|||
|
|
strValues += ((char)read.Content[i]).ToString();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return strValues.Trim();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private void barButtonItem8_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Process.Start("Log");
|
|||
|
|
}
|
|||
|
|
catch { XtraMessageBox.Show("打开日志失败,您可以手动打开文件夹,名称“SysLog”", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private void barButtonItem9_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
|||
|
|
{
|
|||
|
|
FormBarCode frm = new FormBarCode();
|
|||
|
|
frm.Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
MySqlHelper msql = new MySqlHelper();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
private void button2_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
//int startStation = 104;
|
|||
|
|
//int endStation = 103;
|
|||
|
|
//int[] values = new int[5];
|
|||
|
|
//values[0] = int.Parse(textBox1.Text) + aa;//任务号
|
|||
|
|
//values[1] = 2;//任务类型 1入库 2 出库
|
|||
|
|
//values[2] = startStation;
|
|||
|
|
//values[3] = endStation;
|
|||
|
|
//values[4] = int.Parse(textBox1.Text.Trim());
|
|||
|
|
//OperateResult retWrite = plcModbus[4].Write("DB101.60", values);//写5位
|
|||
|
|
//aa++;
|
|||
|
|
}
|
|||
|
|
int aa = 5;
|
|||
|
|
private void button3_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
SendAgvSchedulingTask("", "TP001");
|
|||
|
|
}
|
|||
|
|
public static int GlobalNumber { get; set; } = 20;
|
|||
|
|
private void pictureBox3_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void barButtonItem10_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
|||
|
|
{
|
|||
|
|
//查询数据库堆垛机状态
|
|||
|
|
while(true)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void button1_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
DataTable iningtask = DataClass.Instance().GetiningGoodsDecidOhp();
|
|||
|
|
if (iningtask != null)
|
|||
|
|
{
|
|||
|
|
gridControl2.DataSource = iningtask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DataTable outingtask = DataClass.Instance().GetOutingGoodsDecidOhp();
|
|||
|
|
if (iningtask != null)
|
|||
|
|
{
|
|||
|
|
gridControl3.DataSource = outingtask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
AddText("查询出入库任务异常:" + ex.Message);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void button4_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
string errText = "";
|
|||
|
|
string LOCATION_ID = "";// DataClass.Instance().GetLOCATIONID("1", ref errText);
|
|||
|
|
AddText("入库货位:" + LOCATION_ID);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void TBCEquipmentLocation1_EditValueChanged(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void button5_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(
|
|||
|
|
$"当前软件线体允许数量为:{GlobalNumber}\n" +
|
|||
|
|
$"确认修改为:{int.Parse(textBox1.Text)}",
|
|||
|
|
"提示",
|
|||
|
|
MessageBoxButtons.OK,
|
|||
|
|
MessageBoxIcon.Information
|
|||
|
|
);
|
|||
|
|
GlobalNumber = int.Parse(textBox1.Text);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void button6_Click(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
string errText = "";
|
|||
|
|
DataSet dt = DataClass.Instance().SELECTT_MI_STOCK_9(ref errText);
|
|||
|
|
if (dt != null && dt.Tables[0].Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < dt.Tables[0].Rows.Count; i++)
|
|||
|
|
{
|
|||
|
|
string STORAGE_ID = dt.Tables[0].Rows[i]["STORAGE_ID"].ToString(); //字库编号
|
|||
|
|
string LOCATION_ID = dt.Tables[0].Rows[i]["LOCATION_ID"].ToString();
|
|||
|
|
string BARCODE = dt.Tables[0].Rows[i]["BARCODE"].ToString();//外箱子 + 内箱子条码
|
|||
|
|
string CUSTOMER_ID = dt.Tables[0].Rows[i]["CUSTOMER_ID"].ToString();//客户代码
|
|||
|
|
string newLoc = STORAGE_ID + "-WMS-00";
|
|||
|
|
|
|||
|
|
string strJsonRK = GetWmsData("http://" + MesIpPort + "/Camstar/PackStock.asmx/PackStockIn?pkwPackLot=" + BARCODE + "&pCustPackId=&pSubInventory=" + STORAGE_ID + "&pLocation=" + newLoc + "", "");
|
|||
|
|
if (errText.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES异常:" + errText);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (strJsonRK.Length > 0)
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES返回:" + strJsonRK);
|
|||
|
|
|
|||
|
|
if (!strJsonRK.Contains("当前工位 '成品仓'") && strJsonRK.Contains("Error"))
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_MI_STOCK_STSEBS(LOCATION_ID, BARCODE, "9"))
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态9失败");
|
|||
|
|
}
|
|||
|
|
AddText("WCS定时上报mes成功回传MES错误:编号:" + BARCODE + "," + strJsonRK + "");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (DataClass.Instance().Update_T_MI_STOCK_STSEBS(LOCATION_ID, BARCODE, "1"))
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态1成功");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AddText("WCS定时上报mes成功回传MES成功:编号:" + BARCODE + "," + strJsonRK + ",更新数据库状态1失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public class ModAgvArriveStation
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string reqCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string reqTime { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string clientCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string tokenCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string lot { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string materialCode { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string qty { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string carrier { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string taskCode { get; set; }
|
|||
|
|
|
|||
|
|
public string taskTyp { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public string posCode { get; set; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|