using DotNetSAPI; using RGD.Common; using RGD.DataService; using RGD.DBUtility; using RGD.ZhiQianAPI; using RGD.MdsAPI; using RGD.MdsAPI.WMS; using System; using System.Data; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; using System.Xml; namespace RGD.WCS { public partial class FrmMain : Form { #region 窗体显示 [System.Runtime.InteropServices.DllImport("user32")] private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags); private const int AW_HOR_POSITIVE = 0x0001;//自左向右显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志 private const int AW_HOR_NEGATIVE = 0x0002;//自右向左显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志 private const int AW_VER_POSITIVE = 0x0004;//自顶向下显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志 private const int AW_VER_NEGATIVE = 0x0008;//自下向上显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志该标志 private const int AW_CENTER = 0x0010;//若使用了AW_HIDE标志,则使窗口向内重叠;否则向外扩展 private const int AW_HIDE = 0x10000;//隐藏窗口 private const int AW_ACTIVE = 0x20000;//激活窗口,在使用了AW_HIDE标志后不要使用这个标志 private const int AW_SLIDE = 0x40000;//使用滑动类型动画效果,默认为滚动动画类型,当使用AW_CENTER标志时,这个标志就被忽略 private const int AW_BLEND = 0x80000;//使用淡入淡出效果 private static FrmMain _formInstance; #endregion 窗体显示 private static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); private static byte[] result = new byte[1024]; public static int taskId = 0; public static int taskCount = 0; public static FrmMain FormInstance { get { if (_formInstance == null) { _formInstance = new FrmMain(); } return _formInstance; } set { _formInstance = value; } } private SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; public SpVoice Voice = new SpVoice(); public FrmMain() { InitializeComponent(); _formInstance = this; //黑匣子文件 文件清理 RGD.Common.CCarryConvert.NeatenDarkCasket(); #region 系统配置文件初始化 ////路径搜索方式 //CStaticClass.RouteSearchMode = CommonClassLib.AppSettings.GetValue("RouteSearchMode"); ////双叉关联任务允许等待的时间 //CStaticClass.DoubleForkWaitTime = CommonClassLib.AppSettings.GetValue("DoubleForkWaitTime"); ////AGV是否允许单叉动作 //CStaticClass.AGVAllowSingleFork = CommonClassLib.AppSettings.GetValue("AGVAllowSingleFork"); ////日志黑匣子保存时间 //CStaticClass.SaveDays = CommonClassLib.AppSettings.GetValue("SaveDays"); ////移动设备是否被提前触发将取 //CStaticClass.MovedDeviceAheadTrigger = CommonClassLib.AppSettings.GetValue("MovedDeviceAheadTrigger"); ////堆垛机出库是否检测目标输送机空闲和有物 //CStaticClass.OutDetectArrowIdleGoods = CommonClassLib.AppSettings.GetValue("OutDetectArrowIdleGoods"); ////设备发生故障自动变更路径 //CStaticClass.DeviceErrorAutoModifyRoutePath = CommonClassLib.AppSettings.GetValue("DeviceErrorAutoModifyRoutePath"); #endregion 系统配置文件初始化 //初始化管理和调度交互状态 IOControlService.AddIOControlStatus(); ////初始化错误信息 BaseDeviceService.AddDeviceErrors(); //加载全局站台信息 CConfig.LoadConfig(); //初始化设备静态信息 BaseDeviceService.AddDeviceInfo(); //虚拟设备 PLC_DB2交互数据 CStaticClass.devinfo28 = BaseDeviceService.GetDeviceInfo(65534); #region 界面布局 //主控 FrmControlMonitor.FormInstance.Show(this.dockPanel1); FrmControlMonitor.FormInstance.DockTo(this.dockPanel1, DockStyle.Fill); //任务列表窗口 FrmTaskList Frmlist = new FrmTaskList(); Frmlist.Show(this.dockPanel1); Frmlist.DockTo(this.dockPanel1, DockStyle.Bottom); Frmlist.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockBottom; Frmlist.AutoHidePortion = 0.28;//(double)Frmlist.Height / (double)this.dockPanel1.Height; Frmlist.CloseButton = false; //运行异常窗口 FrmErrorMessage frmErrorMessage = new FrmErrorMessage(); frmErrorMessage.Show(this.dockPanel1); frmErrorMessage.DockTo(this.dockPanel1, DockStyle.Bottom); frmErrorMessage.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockBottomAutoHide; frmErrorMessage.CloseButton = false; //帮助信息窗口 FrmHelp frmHelp = new FrmHelp(); frmHelp.Show(this.dockPanel1); frmHelp.DockTo(this.dockPanel1, DockStyle.Bottom); frmHelp.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockBottomAutoHide; frmHelp.CloseButton = false; #endregion 界面布局 //检测是否登录 if (FrmLogin.FormInstance.ShowDialog() != DialogResult.OK) return; //dzf 调试时注释掉 CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "成功登录系统", "", ""); this.DoubleBuffered = true; SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.DoubleBuffer, true); this.UpdateStyles(); } private void FrmMain_Load(object sender, EventArgs e) { //SocketService(); } #region 命令开关 接口服务 private CControl cc = new CControl(); private CListenPLCAsk cplc = new CListenPLCAsk(); /// /// 打开命令开关 /// /// /// private void MITurnOn_Click(object sender, EventArgs e) { try { MMDarketManage.Enabled = true; MMUserManage.Enabled = true; MIUserInfoManage.Enabled = true; CStaticClass.Order = true; MITurnOff.Enabled = true; MITurnOn.Enabled = false; MITurnOff.Checked = false; MITurnOn.Checked = true; //执行自动命令 CStaticClass.ReConnect(); MMDarketManage.Checked = true; MMUserManage.Checked = false; MIUserInfoManage.Checked = false; this.Text = "瑞吉德自动化物流监控调度系统" + "--【正在执行自动命令!】"; FrmControlMonitor.FormInstance.FlashPanit("tsStatus", "", false); //单次调用 与opc通信 取数据存放于CStaticClass.AllReturns LogUtil.WriteLog("", "打开命令开关-获取opc数据"); CStaticClass.GetAllReturns(); CConfig.StartAll(); //后台独立线程 循环 解析plc读取的数据 CStaticClass.AllReturns 300ms 更新到设备内存中 LogUtil.WriteLog("", "打开命令开关-启动opcAllReturns数据解析"); CParsePLCData.StartListen(); //AGV相关服务启动 HttpServer.start(); //终端socket启动 } catch (Exception ex) { MessageBox.Show(":" + ex.Message, "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); } } /// /// 关闭命令开关 /// /// /// private void MITurnOff_Click(object sender, EventArgs e) { if (MessageBox.Show("您确认要“关闭命令开关”吗?如果“关闭命令开关”将导致调度计算机与所有设备通讯中断!", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK) { return; } CStaticClass.Order = false; MITurnOff.Enabled = false; MITurnOn.Enabled = true; MITurnOn.Checked = false; MITurnOff.Checked = true; HttpServer.close(); this.Text = "瑞吉德自动化物流监控调度系统"; //getAllReturnTimer.Enabled = false; //getAllReturnTimer.Stop(); CConfig.StopAll(); CParsePLCData.EndListen(); } #endregion 命令开关 接口服务 #region 按钮事件 /// /// 指令队列管理 /// /// /// private void MIAltMonitor_Click(object sender, EventArgs e) { FrmModifyMonitor.FormInstance.ShowDialog(); } /// /// 调度任务管理 /// /// /// private void MIAltManange_Click(object sender, EventArgs e) { FrmModifyManage.FormInstance.ShowDialog(); } /// /// 单一设备指令 /// /// /// private void toolStripMenuItem1_Click(object sender, EventArgs e) { FrmHandCommand.FormInstance.ShowDialog(); } private void MIManageShow_Click(object sender, EventArgs e) { FrmAutoCommand.FormInstance.ShowDialog(); } /// /// 叠盘机缓存管理 /// /// /// private void MIdp_Click(object sender, EventArgs e) { FrmStackerCache.FormInstance.ShowDialog(); } /// /// 清除任务 /// /// /// private void MIClearTask_Click(object sender, EventArgs e) { DialogResult dr = MessageBox.Show("是否清除调度系统收到的任务信息?", "警告", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) { DbHelperSQL.ExecuteSql("update t_warehouse set f_task_no='',f_task_type='',f_task_status='FREE',f_equip_type='',F_IO_WH_SORT_CODE='',F_LASTBOX_REACH_FLAG=0"); DbHelperSQL.ExecuteSql("delete t_manage_task"); DbHelperSQL.ExecuteSql("delete t_monitor_task"); } } /// /// 浏览黑匣子文件 /// /// /// private void MISeeDarket_Click(object sender, EventArgs e) { FrmBrowseDarkCasket.FormInstance.ShowDialog(); } private void MIAbout_Click(object sender, EventArgs e) { new FrmAboutBox().ShowDialog(); } private void MMExitSystem_Click(object sender, EventArgs e) { DialogResult dr = MessageBox.Show("真的要退出系统?", "提示", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) { this.Close(); } } private void DeviceStatusSearchMenuItem_Click(object sender, EventArgs e) { FrmDeviceErrorLog.FormInstance.ShowDialog(); } /// /// 设备状态 /// /// /// private void MIDeviceState_Click(object sender, EventArgs e) { FrmDeviceInfoEdit.FormInstance.ShowDialog(); } #endregion 按钮事件 private void MonitorDataBackUpMenuItem_Click(object sender, EventArgs e) { try { string localFilePath; string saveFilepath = "E:\\"; saveFileDialog1.Title = "备份调度系统数据库..."; saveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddHHmmss") + "DBBak"; saveFileDialog1.Filter = "所有文件(*.*)|*.*"; if (System.IO.Directory.Exists(saveFilepath))//文件目录是否存在 { saveFileDialog1.InitialDirectory = saveFilepath; } saveFileDialog1.RestoreDirectory = true; //saveFileDialog1.CheckFileExists = true; saveFileDialog1.CheckPathExists = true; saveFileDialog1.OverwritePrompt = true; if (this.saveFileDialog1.ShowDialog() == DialogResult.OK) { localFilePath = saveFileDialog1.FileName.ToString(); string sql = string.Format("Backup database AHFY_WCS to disk = '{0}'", localFilePath); //MyTest为远程数据库名称,也可以改成用变量传入 DbHelperSQL.ExecuteSql(sql); //下面判断文件是否生成来确定是否备份成功 if (System.IO.File.Exists(localFilePath)) { MessageBox.Show("数据库备份成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } else { MessageBox.Show("数据库备份失败!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); } //还原是一样的.只是sql改成"RESTORE FILELISTONLY FROM DISK ='路径'" } } catch (Exception err) { MessageBox.Show(err.Message); } } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.TopMost = true; this.Visible = true; this.TopMost = false; this.WindowState = FormWindowState.Maximized; } private void notifyIcon1_BalloonTipShown(object sender, EventArgs e) { try { //Voice.Speak("123", SpFlags); //Voice.Speak(notifyIcon1.BalloonTipText, SpFlags); } catch (Exception ex) { } } private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("您确认要退出瑞吉德自动化物流监控调度系统吗?", "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { CParsePLCData.EndListen(); CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "退出系统", "", ""); System.Diagnostics.Process.GetCurrentProcess().Kill(); } else { e.Cancel = true; } } private void SocketService() { string IP = AppSettings.GetValue("AndroidIP"); int port = int.Parse(AppSettings.GetValue("Port")); socket.Bind(new IPEndPoint(IPAddress.Parse(IP), port)); socket.Listen(10); Thread myThread = new Thread(ListenClientConnect); myThread.Start(); } /// /// 监听客户端连接 /// private static void ListenClientConnect() { while (true) { Socket clientSocket = socket.Accept(); //System.Console.WriteLine("客户的本地端口是:" + clientSocket.LocalEndPoint.ToString()); //System.Console.WriteLine("客户端是:" + clientSocket.RemoteEndPoint.ToString()); System.Console.WriteLine(clientSocket.Connected); Thread receiveThread = new Thread(ReceiveMessage); System.Console.WriteLine(clientSocket.Connected); receiveThread.Start(clientSocket); } } private static void ReceiveMessage(object clientSocket) { Socket myClientSocket = (Socket)clientSocket; //System.Console.WriteLine(myClientSocket.Connected+"1"); while (true) { //System.Console.WriteLine(myClientSocket.Connected + "2"); try { //System.Console.WriteLine(myClientSocket.Connected + "3"); if (myClientSocket.Connected && myClientSocket != null) { //通过clientSocket接收数据 int receiveNumber = myClientSocket.Receive(result); if (receiveNumber == 0) { return; } Console.WriteLine(myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber)); string receiveData = Encoding.UTF8.GetString(result, 0, receiveNumber); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(receiveData); XmlNode nodeRoot = xmlDoc.SelectSingleNode("DataFromZD"); string method = nodeRoot.SelectSingleNode(@"Method").InnerText; XmlNodeList xnlBOX_BARCODE = nodeRoot.SelectNodes(@"BoxsCodes"); string sBOX_BARCODE = string.Empty; foreach (XmlNode nBOX_BARCODE in xnlBOX_BARCODE) { sBOX_BARCODE += nBOX_BARCODE.InnerText + ","; } string[] boxs = Regex.Split(sBOX_BARCODE, "(?<=\\G.{12})"); if (boxs.Length > 1) { Array.Resize(ref boxs, boxs.Length - 1); } sBOX_BARCODE = string.Empty; foreach (string box in boxs) { sBOX_BARCODE += box + ","; } sBOX_BARCODE = sBOX_BARCODE.TrimEnd(','); XmlNodeList xnlGOODS_BARCODE = nodeRoot.SelectNodes(@"GoodsCodes"); string sGOODS_BARCODE = string.Empty; foreach (XmlNode nGOODS_BARCODE in xnlGOODS_BARCODE) { sGOODS_BARCODE += nGOODS_BARCODE.InnerText + ","; } string[] goods = Regex.Split(sGOODS_BARCODE, "(?<=\\G.{22})"); if (goods.Length > 1) { Array.Resize(ref goods, goods.Length - 1); } sGOODS_BARCODE = string.Empty; foreach (string good in goods) { sGOODS_BARCODE += good + ","; } sGOODS_BARCODE = sGOODS_BARCODE.TrimEnd(','); DataView dvt = DbHelperSQL.Query("select F_TASK_NO,F_TASK_TYPE,F_EQUIP_TYPE from T_WareHouse").Tables[0].DefaultView; string sResult = string.Empty; bool bResult; switch (method) { case "boxsin": bResult = (new getInStackLocation()).Notify(dvt[0]["F_TASK_NO"].ToString(), sBOX_BARCODE, "", out sResult); getInStackLocation.DATA outData = (new Base()).DeSerialize(sResult); if (bResult) { new ManageTaskService().CreateMove(dvt[0]["F_TASK_NO"].ToString(), "1", "12001", outData.LOC_NO, sBOX_BARCODE, out sResult); sResult = outData.LOC_NO; } else { sResult = outData.ERROR_INFO; } break; case "goodsin": bResult = (new getInOutCheckInfo()).Notify(dvt[0]["F_TASK_NO"].ToString(), "02", "", sBOX_BARCODE, sGOODS_BARCODE, out sResult); getInOutCheckInfo.DATA op = (new Base()).DeSerialize(sResult); if (bResult) { sResult = "true"; } else { sResult = op.ERROR_INFO; } break; case "outdetail": bResult = (new getInOutCheckInfo()).Notify(dvt[0]["F_TASK_NO"].ToString(), "01", string.Empty, sBOX_BARCODE, string.Empty, out sResult); if (bResult) { getInOutCheckInfo.DATA info = (new Base()).DeSerialize(sResult); if (info.OUT_MODE.Equals("1")) { sResult = "true"; } else if (info.OUT_MODE.Equals("2")) { sResult = "back"; } else if (info.OUT_MODE.Equals("3")) { sResult = info.REPICK_ARRAY; } } else { sResult = "false"; } break; case "gettask": DataView dv = DbHelperSQL.Query("select * from t_warehouse").Tables[0].DefaultView; sResult = dv[0]["f_task_no"].ToString(); break; case "login": Object o = DbHelperSQL.GetSingle("select * from t_base_users where f_password='" + sBOX_BARCODE + "'"); if (o != null) { sResult = "true"; } else { sResult = "false"; } break; } byte[] bs = Encoding.UTF8.GetBytes(sResult); myClientSocket.Send(bs, bs.Length, 0); myClientSocket.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); myClientSocket.Shutdown(SocketShutdown.Both); myClientSocket.Close(); break; } } } private void 海柔测试ToolStripMenuItem_Click(object sender, EventArgs e) { TEST1.FormInstance.ShowDialog(); } private void 接口恢复ToolStripMenuItem_Click(object sender, EventArgs e) { FrmInterfaceRestart.FormInstance.ShowDialog(); } private void FrmMain_FormClosed(object sender, FormClosedEventArgs e) { System.Diagnostics.Process.GetCurrentProcess().Kill(); } private void MIHandShow_Click(object sender, EventArgs e) { FrmHandCommand.FormInstance.ShowDialog(); } } }