HumitureController.cs 13.0 KB
using OnlineStore.Common;
using log4net;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Reflection;
using System.Text; 

namespace OnlineStore.DeviceLibrary
{
    /// <summary>
    /// 壁挂王字壳温湿度变送器(485型)
    /// </summary>
    public class HumitureController
    {
        //public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    

        private static int bautRate = 4800;//波特率
        private static Parity parity = Parity.None;//校验位
        private static int dataBits = 8;//数据位
        private static StopBits stopBits = StopBits.One; //停止位
   
        private static string LogName = "";
        private static Dictionary<string, AcSerialBean> serialBeanMap = new Dictionary<string, AcSerialBean>();
         public static int HumitureControllerType = ConfigAppSettings.GetIntValue(Setting_Init.HumitureControllerType);
        public static bool Init(string port)
        {
            if (serialBeanMap.ContainsKey(port))
            {
                return true;
            }

            LogName = "温湿度传感器[" + port + "]"; 
            AcSerialBean sb = null;
            if (HumitureControllerType.Equals(1))
            {
                bautRate = 9600;//波特率
            }
            sb = new AcSerialBean(port, bautRate, parity, dataBits, stopBits); 
            try
            {
                if (sb.openPort())
                {
                    serialBeanMap.Add(port, sb);
                    var ht = HumitureController.QueryData(port);
                    LogUtil.info(LogName + "串口" + port + "打开成功!温度:"+ ht.Temperate+",湿度:"+ht.Humidity);
                    return true;
                }
                else
                {
                    LogUtil.error( LogName + "串口" + port + "打开失败!");
                    return false;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("串口" + port + "打开失败:" + ex.ToString());  
            }
            return true;
        }
        /// <summary>
        /// 释放资源
        /// </summary>
        public static void CloseAllPort()
        {
            List<string> kes = new List<string>(serialBeanMap.Keys);
            foreach (string key in kes)
            {
                ClosePort(key);
            }
        }
        private static void ClosePort(string portName)
        {
            AcSerialBean bean = GetSerialBean(portName);
            if (bean == null)
            {
                LogUtil.info("串口【" + portName + "】未打开,不需要关闭");
                return;
            }
            //清理缓存
            bean.clearInBuffer();
            bean.clearOutBuffer();
            bean.closePort();

            if (serialBeanMap.ContainsKey(portName))
            {
                serialBeanMap.Remove(portName);
            }
            LogUtil.info("温湿度控制器 关闭串口【" + portName + "】 ");
        }
        private static AcSerialBean GetSerialBean(string portName)
        {
            if (serialBeanMap.ContainsKey(portName))
            {
                return serialBeanMap[portName];
            }
            return null;
        }
     //   public static  ASTemperateParam LastData = new ASTemperateParam(0, 0);
        public static HumitureParam QueryData(string port)
        {
            HumitureParam param = new HumitureParam(0, 0,0);
            List<double> data = queryData(port );
            if (data.Count.Equals(3))
            {
                double humidityadjust = (double)ConfigAppSettings.GetNumValue(Setting_Init.humidityadjust);
                double humiditylimited = (double)ConfigAppSettings.GetNumValue(Setting_Init.humiditylimited);
                if (humidityadjust != 0 && humiditylimited != 0)
                {
                    if (data[0] + humidityadjust < humiditylimited)
                    {
                        data[0] = humiditylimited;
                    }
                    else
                        data[0] += humidityadjust;
                }
                param = new HumitureParam(data[1], data[0], data[2]);
            } 
            return param;
        }
        /// <summary>
        /// 返回温度和湿度
        /// </summary>
        /// <returns></returns>
        private static List<double> queryData(string port)
        {
            // 温度计算:
            //当温度低于 0 ℃ 时温度数据以补码的形式上传。 
            //温度:FF9B H(十六进制)= -101 => 温度 = -10.1℃
            //湿度计算:
            //湿度:292 H(十六进制) = 658 => 湿度 = 65.8 % RH
            AcSerialBean sb = GetSerialBean(port);
            if (sb == null)
            {
                return new List<double>();
            }
            byte[] sendData = new byte[8];
            sendData[0] = 0x01;
            if (HumitureControllerType.Equals(1))
            {
                sendData[1] = 0x04; 
            }
            else
            {
                sendData[1] = 0x03;
            }
            sendData[2] = 0x00;
            sendData[3] = 0x00;
            sendData[4] = 0x00;
            sendData[5] = 0x03;
            sendData[6] = 0x00;
            sendData[7] = 0x00;
            sendData = buildCheckData(sendData, sendData.Length - 2);
            string str = AcSerialBean.byteToHexStr(sendData);
            LogUtil.debug("温湿度控制器发送数据:" + str);
            byte[] reviceData = new byte[9];
            bool isOk = false;
            sb.SendCommand(sendData, ref reviceData, 100, out isOk);
            return getReviceData(reviceData);
        }

       
        public static int QueryHistoryCount(string port)
        {
            AcSerialBean sb = GetSerialBean(port);
            if (sb == null||  HumitureControllerType.Equals(2).Equals(false))
            {
                return -1;
            } 
            byte[] sendData = new byte[8];
            sendData[0] = 0x01;
            sendData[1] = 0x04;
            sendData[2] = 0x20;
            sendData[3] = 0x00;
            byte[] addrByte = AcSerialBean.StringToByte("2000");
            if (addrByte.Length == 1)
            {
                sendData[2] = 0x00;
                sendData[3] = addrByte[0];
            }
            else if (addrByte.Length == 2)
            {
                sendData[3] = addrByte[1];
                sendData[2] = addrByte[0];
            }
            sendData[4] = 0x00;
            sendData[5] = 0x02;
            sendData[6] = 0x00;
            sendData[7] = 0x00;
            sendData = buildCheckData(sendData, sendData.Length - 2);
            string str = AcSerialBean.byteToHexStr(sendData);
            LogUtil.debug("温湿度控制器发送数据:" + str);
            byte[] reviceData = new byte[9];
            bool isOk = false;
            sb.SendCommand(sendData, ref reviceData, 100, out isOk);
            return getReviceIntData(reviceData);
        }
        public static int QueryCurrCount(string port)
        {
            AcSerialBean sb = GetSerialBean(port);
            if (sb == null || HumitureControllerType.Equals(2).Equals(false))
            {
                return -1;
            }
            byte[] sendData = new byte[8];
            sendData[0] = 0x01;
            sendData[1] = 0x04;
            sendData[2] = 0x20;
            sendData[3] = 0x02;
            sendData[4] = 0x00;
            sendData[5] = 0x02;
            sendData[6] = 0x00;
            sendData[7] = 0x00;
            sendData = buildCheckData(sendData, sendData.Length - 2);
            string str = AcSerialBean.byteToHexStr(sendData);
            LogUtil.debug("温湿度控制器发送数据:" + str);
            byte[] reviceData = new byte[9];
            bool isOk = false;
            sb.SendCommand(sendData, ref reviceData, 100, out isOk);
            return getReviceIntData(reviceData);
        }
        public static List<object> QueryHistory(string port)
        {
            List<object> list = new List<object>();
            AcSerialBean sb = GetSerialBean(port);
            if (sb == null || HumitureControllerType.Equals(2).Equals(false))
            {
                return list;
            }
            byte[] sendData = new byte[8];
            sendData[0] = 0x01;
            sendData[1] = 0x04;
            sendData[2] = 0x20;
            sendData[3] = 0x04;
            sendData[4] = 0x00;
            sendData[5] = 0x05;
            sendData[6] = 0x00;
            sendData[7] = 0x00;
            sendData = buildCheckData(sendData, sendData.Length - 2);
            string str = AcSerialBean.byteToHexStr(sendData);
            LogUtil.debug("温湿度控制器发送数据:" + str);
            byte[] reviceData = new byte[15];
            bool isOk = false;
            sb.SendCommand(sendData, ref reviceData, 100, out isOk);

            try
            {
                if (reviceData != null && reviceData.Length >= 9)
                {

                    string temp = String.Format("{0:X2}", reviceData[3]) + String.Format("{0:X2}", reviceData[4]);
                    string hum = String.Format("{0:X2}", reviceData[5]) + String.Format("{0:X2}", reviceData[6]);
                    double tempV = (double)Convert.ToInt32(temp, 16) / 10;
                    double humV = (double)Convert.ToInt32(hum, 16) / 10;

                    int year = Convert.ToInt32(String.Format("{0:X2}", reviceData[7]), 16);
                    int mouth = Convert.ToInt32(String.Format("{0:X2}", reviceData[8]), 16);
                    int day = Convert.ToInt32(String.Format("{0:X2}", reviceData[9]), 16);
                    int hour = Convert.ToInt32(String.Format("{0:X2}", reviceData[10]), 16);
                    int minute = Convert.ToInt32(String.Format("{0:X2}", reviceData[11]), 16);
                    int second = Convert.ToInt32(String.Format("{0:X2}", reviceData[12]), 16);

                    DateTime time = new DateTime(year, mouth, day, hour, minute, second);
                    list.Add(tempV);
                    list.Add(humV);
                    list.Add(time);
                }
            }
            catch (Exception ex)
            {
                LogUtil.info(LogName + "转换出错:" + ex.ToString());
            }
            return list;
        }

        
        private static byte[] buildCheckData(byte[] sendData, int length)
        {
            ushort pChecksum = 0;
            AcSerialBean.CalculateCRC(sendData, length, out pChecksum);
            string checkStr = Convert.ToString(pChecksum, 16);
            byte[] checkByte = AcSerialBean.StringToByte(checkStr);

            if (checkByte.Length == 1)
            {
                sendData[length] = checkByte[0];
                sendData[length + 1] = 0x00;
            }
            else
            {
                sendData[length + 1] = checkByte[0];
                sendData[length] = checkByte[1];
            } 
            return sendData;
        }

        private static int getReviceIntData(byte[] dataArray)
        {
            List<double> list = new List<double>();
            try
            {
                if (dataArray == null)
                {
                    return -1;
                }
                if (dataArray.Length >= 9)
                {
                    string data = String.Format("{0:X2}", dataArray[5]) + String.Format("{0:X2}", dataArray[6]+String.Format("{0:X2}", dataArray[3]) + String.Format("{0:X2}", dataArray[4])  );
                    int tempV = Convert.ToInt32(data, 16);
                    return tempV;
                }
            }
            catch (Exception ex)
            {
                LogUtil.info(LogName + "转换出错:" + ex.ToString());
            }
            return -1;
        }

        private static List<double> getReviceData(byte[] dataArray)
        {
            List<double> list = new List<double>(); 
            try
            {
                if (dataArray == null)
                {
                    return list;
                }
                if (dataArray.Length >= 9)
                {
                    string temp = String.Format("{0:X2}", dataArray[3]) + String.Format("{0:X2}", dataArray[4]);
                    string hum = String.Format("{0:X2}", dataArray[5]) + String.Format("{0:X2}", dataArray[6]);
                    string Oxygen = String.Format("{0:X2}", dataArray[7]) + String.Format("{0:X2}", dataArray[8]);
                    double tempV = (double)Convert.ToInt32(temp, 16) / 10;
                    double humV = (double)Convert.ToInt32(hum, 16) / 10;
                    double OxygenV = (double)Convert.ToInt32(Oxygen, 16) / 10;
                    list.Add(tempV);
                    list.Add(humV);
                    list.Add(OxygenV);
                }
            }
            catch (Exception ex)
            {
                LogUtil.info(LogName + "转换出错:" + ex.ToString());
            }
            return list;
        }
         
    }
}