BaoKai_202508-Wcs-Jingwang..../WCSIce/MainForm.cs

5235 lines
255 KiB
C#
Raw Normal View History

2025-08-24 12:51:29 +08:00

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; }
}
}
}