AHTC/RGD/RGD.WCS/FrmMain.cs
2025-05-19 09:22:33 +08:00

601 lines
25 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

using 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();
/// <summary>
/// 打开命令开关
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}
/// <summary>
/// 关闭命令开关
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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
/// <summary>
/// 指令队列管理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MIAltMonitor_Click(object sender, EventArgs e)
{
FrmModifyMonitor.FormInstance.ShowDialog();
}
/// <summary>
/// 调度任务管理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MIAltManange_Click(object sender, EventArgs e)
{
FrmModifyManage.FormInstance.ShowDialog();
}
/// <summary>
/// 单一设备指令
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
FrmHandCommand.FormInstance.ShowDialog();
}
private void MIManageShow_Click(object sender, EventArgs e)
{
FrmAutoCommand.FormInstance.ShowDialog();
}
/// <summary>
/// 叠盘机缓存管理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MIdp_Click(object sender, EventArgs e)
{
FrmStackerCache.FormInstance.ShowDialog();
}
/// <summary>
/// 清除任务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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");
}
}
/// <summary>
/// 浏览黑匣子文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
/// <summary>
/// 设备状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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();
}
/// <summary>
/// 监听客户端连接
/// </summary>
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<getInStackLocation.DATA>(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<getInOutCheckInfo.DATA>(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<getInOutCheckInfo.DATA>(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();
}
}
}