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 stockerip = new List(); Dictionary plcModbus = new Dictionary(); //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 decFauleList = new Dictionary(); Dictionary ssjStationONE = new Dictionary(); Dictionary ssjStationTHREE = new Dictionary(); List rkStation = new List();//入库站台 List HKStation = new List();//回库按钮检测 //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 DecSts = new List(); 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 (); /// /// 堆垛机故障 /// private void GetDevFault() { string errText = string.Empty; while (true) { lock (objGetDevFault) { try { //#region 堆垛机1故障 //for (int i = 1; i <= 2; i++) //{ // OperateResult 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 opfhid1 = plcModbus[4].ReadInt16("DB90.22"); // OperateResult 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 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 监控堆垛机控制方式/位置 /// /// 监控堆垛机控制方式/状态/位置/任务号 /// /// 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 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 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 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 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 { /// /// /// public string carrierTyp { get; set; } /// /// /// public string materialLot { get; set; } /// /// /// public string materialCode { get; set; } /// /// /// public string sysLotNum { get; set; } /// /// /// public string podLotNum { get; set; } /// /// /// public string lotStatus { get; set; } /// /// /// public string includeScrap { get; set; } /// /// /// public string podStatus { get; set; } } public class RootAGVrun { /// /// /// public string reqCode { get; set; } /// /// /// public string reqTime { get; set; } /// /// /// public string clientCode { get; set; } /// /// /// public string tokenCode { get; set; } /// /// /// public string taskTyp { get; set; } /// /// /// public string sceneTyp { get; set; } /// /// /// public string ctnrTyp { get; set; } /// /// /// public string ctnrCode { get; set; } /// /// /// public string wbCode { get; set; } /// /// /// public List userCallCodePath { get; set; } /// /// /// public string podCode { get; set; } /// /// /// public string podDir { get; set; } /// /// /// public string podTyp { get; set; } /// /// /// public string materialLot { get; set; } /// /// /// public string priority { get; set; } /// /// /// public string agvCode { get; set; } /// /// /// public string taskCode { get; set; } /// /// /// 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; } /// /// WCS入库成功回传MES /// 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 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(); 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 入库获取条码信息写输送机任务 /// /// 入库 /// 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 SSJ74 = plcModbus[4].ReadString("DB10.DBW2368", 8);//SSJ106 OperateResult 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 SSJ72 = plcModbus[4].ReadString("DB10.DBW2304", 8);//SSJ106 OperateResult 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 SSJ70 = plcModbus[4].ReadString("DB10.DBW2240", 8);//SSJ106 OperateResult 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 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 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 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; //} /// /// 移库执行方法 /// private bool ExecuteMoveTask(string decId) { //查询堆垛机是否空闲 OperateResult 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 declist = new List(); declist.Add("1"); declist.Add("2"); declist.Add("3"); //轮询三台堆垛机状态 foreach (var decid in declist) { OperateResult ddjControl = plcModbus[int.Parse(decid)].ReadInt16("DB91.4", 2);// OperateResult 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 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 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 { } } } /// /// 查询入库站台任务写堆垛机 /// /// 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 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 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); } } /// /// 输送机是否有货 /// /// /// 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; } } /// /// 入库写输送机任务号+路向 /// /// /// 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; } /// /// 是否有货 /// /// /// 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; } /// /// 控制类型:1 入库,2 出库 /// /// /// 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 (); /// /// 写PLC任务。 /// /// 任务号 /// 取货位置 /// 卸货位置 /// 任务类型 /// 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 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(); /// /// 写PLC任务。 /// /// 任务号 /// 取货位置 /// 卸货位置 /// 任务类型 /// 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 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 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 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(); /// /// 发送任务 /// private bool Set_CK_Task() { bool retsts=false; List declist = new List(); 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 number = plcModbus[4].ReadInt16("DB10.DBW4192"); // OperateResult 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 number = plcModbus[4].ReadInt16("DB10.DBW4192"); OperateResult 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 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 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 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条码 打印标签 /// /// 入库 /// private void CK_BCR() { while (true) { lock ("CKBCR") { try { Thread.Sleep(1000); string errText = string.Empty; inovanceH3UTcp.IsStringReverse = true; OperateResult 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 retA = plcModbus[i].ReadInt32(strb[0]); if (retA.IsSuccess && retA.Content > 0) { string retPlcId = retA.Content.ToString(); OperateResult 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; } } } } } } /// /// 清空指定过账区 /// /// 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 listP = new List(); 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 { /// /// /// public string reqCode { get; set; } /// /// /// public string reqTime { get; set; } /// /// /// public string clientCode { get; set; } /// /// /// public string tokenCode { get; set; } /// /// /// public string taskTyp { get; set; } /// /// /// public string userCallCode { get; set; } /// /// /// public List userCallCodePath { get; set; } /// /// /// public string podCode { get; set; } /// /// /// public string podDir { get; set; } /// /// /// public string priority { get; set; } /// /// /// public string robotCode { get; set; } /// /// /// public string taskCode { get; set; } /// /// /// public string data { get; set; } } List userCallCodePathList = new List(); 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 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 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 /// /// //遍历循环 所有输送机的状态值(0,1) /// 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 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 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"); } /// /// 数据库连接检测 /// /// 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 RCKLIST = new List(); List RCKLIST2 = new List(); public class REQUEST_DATAItem2 { /// /// /// public string DATA_AUTH { get; set; } /// /// /// public string LOT_NO { get; set; } /// /// /// public string ITEM_CODE { get; set; } /// /// /// public string CREATE_TIME { get; set; } /// /// 不良 /// public string BAD_CAUSE { get; set; } /// /// 检测工位 /// public string WORK_STATION { get; set; } } public class REQUEST_DATAItem { public string DATA_AUTH { get; set; } /// /// /// public string BUSINESS_TYPE { get; set; } /// /// /// public string LOT_NO { get; set; } /// /// /// public string ITEM_CODE { get; set; } /// /// /// public string OPERATOR_TIME { get; set; } /// /// /// public string OPERATOR_USER { get; set; } } public class RootRCK { /// /// /// public List REQUEST_DATA { get; set; } } public class RootRCK2 { /// /// /// public List REQUEST_DATA { get; set; } } private string GetBcrUxt()//读取条码 { string strValues = string.Empty; OperateResult 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 { /// /// /// public string reqCode { get; set; } /// /// /// public string reqTime { get; set; } /// /// /// public string clientCode { get; set; } /// /// /// public string tokenCode { get; set; } /// /// /// public string lot { get; set; } /// /// /// public string materialCode { get; set; } /// /// /// public string qty { get; set; } /// /// /// public string carrier { get; set; } /// /// /// public string taskCode { get; set; } public string taskTyp { get; set; } /// /// /// public string posCode { get; set; } } } }