MetcalManager.cs 6.9 KB
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TSA_V.Common;

namespace TSA_V.DeviceLibrary
{
    /// <summary>
    /// Metcal烙铁
    /// </summary>
    public class MetcalManager
    {
        private static string Temp_Addr = "P31";
        private static string Power_Addr = "P02";
        private static string PartNum_Addr = "P13";


        public delegate void  TempRevice();
        public delegate void PowerRevice();
        public static event TempRevice OnTempRevice;
        public static event PowerRevice OnPowerRevice;
        public static MetcalInfo MInfo = new MetcalInfo();
        private static Dictionary<string, SerialBean> serialBeanMap = new Dictionary<string, SerialBean>();
        private static object lockObj = new object();
        private static SerialBean GetSerialBean(string portName)
        {
            if (serialBeanMap.ContainsKey(portName))
            {
                return serialBeanMap[portName];
            }
            return null;
        }
        public static bool OpenPort(string portName)
        {
            try
            {
                lock (lockObj)
                {
                    if (serialBeanMap.ContainsKey(portName))
                    {
                        return true;
                    }
                    SerialBean bean = new SerialBean(portName, 115200, Parity.None, 8, StopBits.One);
                    bean.DataReceived += Bean_DataReceived;
                    bool result = bean.openPort();
                    if (!result)
                    {
                        LogUtil.info("打开串口【" + portName + "】失败");
                        return false;
                    }
                    MInfo.PortName = portName;
                    LogUtil.info("打开串口【" + portName + "】成功");

                    if (serialBeanMap.ContainsKey(portName))
                    {
                        serialBeanMap.Remove(portName);
                    }
                    serialBeanMap.Add(portName, bean); 
                    return true;
                } 
            }
            catch (Exception ex)
            {
                LogUtil.info("串口【" + portName + "】打开异常:" + ex.ToString());
                return false;
            } 
        }
        private static string spiltStr = ":";
        private static void Bean_DataReceived(string portName, object sender, SerialDataReceivedEventArgs e, byte[] bits)
        {
            string msg = System.Text.Encoding.Default.GetString(bits);
            try
            {
                List<string> striparr = msg.Split(new string[] { "\r\n" }, StringSplitOptions.None).ToList();
                striparr = striparr.Where(s => !string.IsNullOrEmpty(s)).ToList();
                if (striparr.Count > 0)
                {
                    foreach (string str in striparr)
                    {
                        if (str.Equals(""))
                        {
                            continue;
                        }
                        LogUtil.MetcalDataInfo("端口【" + portName + "】收到数据:" + str);
                        if (str.StartsWith(Power_Addr))
                        {
                            string power = str.Replace(Power_Addr + spiltStr, "");
                            MInfo.LastPower = StrToDouble(power) / 10;
                            OnTempRevice?.Invoke();
                        }
                        else if (str.StartsWith(Temp_Addr))
                        {
                            string temp = str.Replace(Temp_Addr + spiltStr, "").Replace("C", "");
                            MInfo.LastTemp = StrToDouble(temp) ;
                            OnTempRevice?.Invoke();
                        }
                        else if (str.StartsWith(PartNum_Addr))
                        {
                            string pt = str.Replace(PartNum_Addr + spiltStr, "");
                            MInfo.PartNum = pt;
                        }
                    }
                }
            }catch(Exception ex)
            {
                LogUtil.error("端口【" + portName + "】收到数据:" + msg+"处理出错:"+ex.ToString());
            }
           
        }

        private static double StrToDouble(string str)
        {
            try
            {
                return Convert.ToDouble(str.Trim());
            }
            catch (Exception ex)
            {

            }
            return 0;
        }

        public static void ColsePort(string portName)
        {
            SerialBean bean = GetSerialBean(portName);
            if (bean == null)
            {
                LogUtil.info("串口【" + portName + "】未打开,不需要关闭");
                return;
            }
            //清理缓存
            bean.clearInBuffer();
            bean.clearOutBuffer();
            bean.closePort();

            if (serialBeanMap.ContainsKey(portName))
            {
                serialBeanMap.Remove(portName);
            }
        }

        public static void ColseAllPort()
        {
            List<SerialBean> beans = new List<SerialBean>(serialBeanMap.Values);
            foreach(SerialBean bean in beans)
            {
                ColsePort(bean.PortName);
            }
        }

    }

    public class MetcalInfo
    {
        /// <summary>
        /// 端口号
        /// </summary>
        public string PortName = ""; 
        /// <summary>
        /// 烙铁头型号
        /// </summary>
        public string PartNum = "";

        public string LotCode = "";

        private DateTime lastTempTime = DateTime.Now;
        /// <summary>
        /// 最后一次温度
        /// </summary>
        private  double lastTemp = 0;
        public double LastTemp
        {
            get
            {
                TimeSpan span = DateTime.Now - lastTempTime;
                if (span.TotalSeconds < 3)
                {
                    return lastTemp;
                }
                else
                {
                    return 0;
                }
            }
            set
            {
                lastTemp = value;
                lastTempTime = DateTime.Now;
            }
        }

        /// <summary>
        /// 最后一次功率
        /// </summary>
        private double lastPower = 0;
        private DateTime lastPowerTime = DateTime.Now;
        public double LastPower
        {
            get
            {
                TimeSpan span = DateTime.Now - lastPowerTime;
                if (span.TotalSeconds < 3)
                {
                    return lastPower;
                }
                else
                {
                    return 0;
                }
            }
            set
            {
                lastPower = value;
                lastPowerTime = DateTime.Now;
            }
        }
    }
}