Frm_Main.xaml.cs 6.96 KB
using HHWCS.Model;
using HHWCSHost.Controls;
using OPCHelper;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Threading;
using System.Timers;
using System.Windows;
using System.Windows.Controls;

namespace HHWCSHost.View
{
    /// <summary>
    /// Frm_Main.xaml 的交互逻辑
    /// </summary>
    public partial class Frm_Main : Window
    {
        #region 属性

        //所有子窗口
        Dictionary<string, Window> windows = new Dictionary<string, Window>();
        private System.Timers.Timer timer = new System.Timers.Timer();
        int inTimer = 0;

        //OPC相关
        /// <summary>
        /// OPC地址
        /// </summary>
        public string PLCIP { get; set; }
        public OPCHelp plc { get; set; }
        /// <summary>
        /// 创建item后返回的索引值,需要用到这个去进行数据读取
        /// </summary>
        public int[] serverHandle { get; set; }

        //堆垛机
        public StockerMonitor[] stockerMonitors { get; set; }

        #endregion

        public Frm_Main()
        {
            InitializeComponent();
            InitMenu();
            InitStatusBar();
            SetTimer();
            InitOPC();
            InitStockerMonitor(2);
        }

        private void InitStockerMonitor(int count)
        {
            stockerMonitors = new StockerMonitor[2];
            stockerMonitors[0] = new StockerMonitor(20, false, true,1500,800);
            stockerMonitors[0].SetValue(Grid.RowProperty, 1);
            stockerMonitors[0].SetValue(Grid.ColumnProperty, 0);
            stockerMonitors[0].SetValue(Grid.ColumnSpanProperty, 2);
            stockerMonitors[0].SetStocker(1, 3);
            stockerMonitors[0].SetLocation(5, 0, 2);
            stockerMonitors[0].SetLocation(12, 2, 1);
            grid.Children.Add(stockerMonitors[0]);

            stockerMonitors[1] = new StockerMonitor(20, false, true, 1500, 800);
            stockerMonitors[1].SetValue(Grid.RowProperty, 2);
            stockerMonitors[1].SetValue(Grid.ColumnProperty, 0);
            stockerMonitors[1].SetValue(Grid.ColumnSpanProperty, 2);
            grid.Children.Add(stockerMonitors[1]);
        }

        private void InitOPC()
        {
            try
            {
                PLCIP = ConfigurationManager.AppSettings["OPCServerIP"];
                plc = new OPCHelp("192.168.10.100");
            }
            catch (Exception ex)
            {
                MessageBox.Show("未能获取到OPC的IP配置,请检查。","注意",MessageBoxButton.OK,MessageBoxImage.Error);
            }
        }

        private void InitStatusBar()
        {
            statusBar.Items.Add("欢迎:"+AppCommon.User.UserName+" 登录时间:"+DateTime.Now.ToString());
        }

        private void InitMenu()
        {
            //构建菜单
            //系统
            MenuItem menu_sys = new MenuItem();
            menu_sys.Header = "系统";
            MenuItem menu_sys_exit = new MenuItem();
            menu_sys_exit.Header = "退出";
            menu_sys_exit.Click += Menu_sys_exit_Click;
            menu_sys.Items.Add(menu_sys_exit);

            //设备
            MenuItem menu_device = new MenuItem();
            menu_device.Header = "设备管理";
            MenuItem menu_device_info = new MenuItem();
            menu_device_info.Header = "设备信息管理";
            menu_device_info.Click += Menu_device_info_Click;
            menu_device.Items.Add(menu_device_info);
            MenuItem menu_device_OPCTest = new MenuItem();
            menu_device_OPCTest.Header = "OPC测试";
            menu_device_OPCTest.Click += Menu_device_OPCTest_Click;
            menu_device.Items.Add(menu_device_OPCTest);

            //任务
            MenuItem menu_task = new MenuItem();
            menu_task.Header = "任务管理";
            MenuItem menu_task_info = new MenuItem();
            menu_task_info.Header = "任务查看";
            menu_task_info.Click += Menu_task_info_Click;
            menu_task.Items.Add(menu_task_info);


            menu.Items.Add(menu_sys);
            menu.Items.Add(menu_device);
            menu.Items.Add(menu_task);
        }

        private void SetTimer()
        {
            timer.Interval = 3000; //3秒触发一次
            timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
            timer.AutoReset = true;//每到指定时间Elapsed事件是到时间就触发
            timer.Enabled = true; //指示 Timer 是否应引发 Elapsed 事件。
        }

        /// <summary>
        /// 程序主时钟
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnTimedEvent(object sender, ElapsedEventArgs e)
        {
            //同步线程防止重入
            if(Interlocked.Exchange(ref inTimer, 1) == 0)
            {
                //todo:...

                Interlocked.Exchange(ref inTimer, 0);
            }
        }

        private void Menu_device_OPCTest_Click(object sender, RoutedEventArgs e)
        {
            Frm_OPCTest frm_OPCTest = (Frm_OPCTest)windows.FirstOrDefault(t => t.Key == "frm_OPCTest").Value;
            if (frm_OPCTest == null)
            {
                frm_OPCTest = new Frm_OPCTest();
                windows.Add("frm_OPCTest", frm_OPCTest);
            }
            frm_OPCTest.Show();
            if (frm_OPCTest.WindowState == WindowState.Minimized)
                frm_OPCTest.WindowState = WindowState.Normal;
            frm_OPCTest.Activate();
        }

        private void Menu_task_info_Click(object sender, RoutedEventArgs e)
        {
            Frm_TaskInfo frm_TaskInfo =(Frm_TaskInfo)windows.FirstOrDefault(t => t.Key == "frm_taskinfo").Value;
            if (frm_TaskInfo == null)
            {
                frm_TaskInfo = new Frm_TaskInfo();
                windows.Add("frm_taskinfo", frm_TaskInfo);
            }
            frm_TaskInfo.Show();
            if (frm_TaskInfo.WindowState == WindowState.Minimized)
                frm_TaskInfo.WindowState = WindowState.Normal;
            frm_TaskInfo.Activate();

        }

        private void Menu_device_info_Click(object sender, RoutedEventArgs e)
        {
            Frm_DeviceInfo frm_DeviceInfo = (Frm_DeviceInfo)windows.FirstOrDefault(t => t.Key == "frm_DeviceInfo").Value;
            if (frm_DeviceInfo == null)
            {
                frm_DeviceInfo = new Frm_DeviceInfo();
                windows.Add("frm_DeviceInfo", frm_DeviceInfo);
            }
            frm_DeviceInfo.Show();
            if (frm_DeviceInfo.WindowState == WindowState.Minimized)
                frm_DeviceInfo.WindowState = WindowState.Normal;
            frm_DeviceInfo.Activate();
        }

        private void Menu_sys_exit_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            Application.Current.Shutdown();
        }
    }
}