SerialPortSetting.cs 7.6 KB
//´æ´¢ÁË´®¿ÚµÄ³õʼ»¯µÄÉèÖÃÊý¾Ý,ÒÔ¼°·â×°ÁË´®¿ÚµÄÒ»²¿·Ö·½·¨

using System;
using System.IO.Ports;
using System.Windows.Forms;
using System.Timers;
using System.Collections.Generic;
using System.Reflection;
using log4net;
using Dal;
namespace MachineDll
{
    public class SerialPortSetting
    {
        public static string PortName;
        public static int BautRate = 9600;
        public static int DataBits = 8;
        public static Parity Parity = Parity.None;
        public static StopBits StopBits = StopBits.One;

        private SerialPort _ItsSerialPort;
        private string Message;

        public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        public string TestConnection()
        {
            string port="";
            for (int i = 1; i < 9;i++ )
            {
                _ItsSerialPort = new SerialPort("COM"+i.ToString(), BautRate, Parity, DataBits, StopBits);
                try
                {
                    _ItsSerialPort.Open();
                    port = "COM" + i.ToString() + " "+port;
                    _ItsSerialPort.Close();
                }
                catch(Exception es)
                {
                    //MessageBox.Show(_ItsSerialPort.PortName + "¶Ë¿ÚÒѾ­±»ÆäËû³ÌÐòËùÕ¼ÓÃ");
                }
            }
            return port;
            
        }
        public bool StartConnection()
        {
            _ItsSerialPort = new SerialPort(PortName, BautRate, Parity, DataBits, StopBits);
            _ItsSerialPort.ErrorReceived += new SerialErrorReceivedEventHandler(SerialPort_ErrorReceived);
            _ItsSerialPort.RtsEnable = true;
            try
            {
                _ItsSerialPort.Open();
                return true;
            }
            catch(Exception ex)
            {
                MessageBox.Show(_ItsSerialPort.PortName + "端口已经被其他程序所占用\r\n"+ ex);
                return false;
            }
        }
         private void SerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
         {
             this.Message = e.ToString();
         }


        public bool PortIsOpen()
        {
            return _ItsSerialPort.IsOpen;
        }

        public void CloseConnection()
        {
            try
            {
                if (PortIsOpen())
                {
                    _ItsSerialPort.Close();
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("关闭连接失败");
                LOGGER.Error("CloseConnection", ex);
            }
        }

        public Byte[] ReadByte()
        {
            Byte[] data=new Byte[1];
            try
            {
                data = new Byte[_ItsSerialPort.BytesToRead];
                _ItsSerialPort.Read(data, 0, _ItsSerialPort.BytesToRead);
            }
            catch
            { }
            return data;
        }

        public void SendByteNew(byte[] s)
        {
            try
            {
                _ItsSerialPort.Write(s, 0, 1);
            }
            catch
            {
            }
        }

        public void SendByte(string s)
        {
            _ItsSerialPort.Write(s);
        }
        public void SendString(string s)
        {
            byte[] btAppend = { 0x0D };
            _ItsSerialPort.Write(s);
            _ItsSerialPort.Write(btAppend, 0, btAppend.Length);
        }
        public void SendIOString(string s)
        {
            try
            {
                string[] stringData = s.Split(' ');
                byte[] byteData = new byte[stringData.Length];
                //_ItsSerialPort.Write(s);
                int i = 0;
                foreach (string data in stringData)
                {
                    byteData[i++] = Convert.ToByte(data, 16);
                }

                _ItsSerialPort.Write(byteData, 0, byteData.Length);
            }
            catch (Exception ex)
            {
                LOGGER.Error("SendIOString", ex);
            }
        }
        
        public double ReadAIString(string s)
        {
            //LOGGER.Debug("serialPortSetting into readAIString");
            string[] dataString = s.Split(' ');
            byte slaveID = byte.Parse(dataString[0], System.Globalization.NumberStyles.HexNumber);//485地址
            byte fuctionType = byte.Parse(dataString[1], System.Globalization.NumberStyles.HexNumber);//功能码
            ushort registerAdd = ushort.Parse(dataString[2] + dataString[3], System.Globalization.NumberStyles.HexNumber);//寄存器地址
            ushort registerQty = ushort.Parse(dataString[4] + dataString[5], System.Globalization.NumberStyles.HexNumber);//寄存器个数
            byte[] values = new byte[registerQty];

            Modbus mb = new Modbus(_ItsSerialPort);
            //LOGGER.Debug("serialPortSetting ,before into sendFuction");
            //while (!mb.SendFuction(slaveID, fuctionType, registerAdd, registerQty, ref values)) ;
            var re = mb.SendFuction(slaveID, fuctionType, registerAdd, registerQty, ref values);

            byte[] doubleBytes =
            {
                values[4], values[3],values[6],values[5]
            };
            float dataToFloat = BitConverter.ToSingle(doubleBytes, 0);
            var dataConvert = CurrentConversion(dataToFloat);

            LOGGER.Debug($"IO Return: {re}, org:{dataToFloat},cov:{dataConvert},");

            ////AI1通道
            //string data = values[1].ToString("X").PadLeft(4,'0') + "" + values[0].ToString("X").PadLeft(4,'0');
            ////AI2通道
            ////string data = values[3].ToString("X").PadLeft(4, '0') + "" + values[2].ToString("X").PadLeft(4, '0');

            //float dataToFloat = StringToFloat(data);
            return dataConvert;
            //return dataToFloat;

        }
        
        private double CurrentConversion(float dataToFloat)
        {
            /**
             * returnValue = (IO返回数据-4000)/16000*1
             * IO的量程为4000-20000,跳线设置量程为0-1
             * (IO返回数据-IO起始数据)/(量程一共分为多少格)*跳线设置量程
             */

            //LOGGER.Debug("IO Value: " + dataToFloat);
            if (dataToFloat < 4000)
                dataToFloat = 4000;
            Fuction fuction = new Fuction();

            double liangcheng = double.Parse(fuction.GetParameterByParaName("liangcheng", "currency"), System.Globalization.CultureInfo.InvariantCulture); 
            double returnValue = (dataToFloat - 4000) / 16000 * liangcheng;
            //LOGGER.Info(returnValue + " = (" + dataToFloat + " - 4000) / 16000 * " + liangcheng);
            return returnValue;
        }

        public static float StringToFloat(String data)
        {
            if (data.Length < 8 || data.Length > 8)
            {
                //throw new NotEnoughDataInBufferException(data.length(), 8);
                return 0;
            }
            else
            {
                byte[] intBuffer = new byte[4];
                // 将16进制串按字节逆序化(一个字节2个ASCII码)
                for (int i = 0; i < 4; i++)
                {
                    intBuffer[i] = Convert.ToByte(data.Substring((3 - i) * 2, 2), 16);
                }
                return BitConverter.ToSingle(intBuffer, 0);
            }
        }

        public string ReadExisting()
        {
            _ItsSerialPort.DiscardInBuffer();
            _ItsSerialPort.DiscardOutBuffer();
            return _ItsSerialPort.ReadExisting();
        }
    }
}