BaoKai_202508-Wcs-Jingwang..../WCSIce/MainForm.cs
2025-08-24 12:51:29 +08:00

5235 lines
255 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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