Example #1
0
 //----------------------------------------------------------------------------
 /// <summary>
 /// Устанавливает режим транзакции запрос-ответ
 /// </summary>
 private void StartTransaction(
     Modbus.OSIModel.Transaction.TransactionType type)
 {
     if (_transaction == TransactionType.Undefined)
     {
         if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information)
         {
             Trace.TraceInformation("{0}: Поток ID: {1} : Старт транзакции",
                                    DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId);
         }
         //_incomingBuffer.Clear();
         _serialPort.DiscardInBuffer();
         _serialPort.DiscardOutBuffer();
         _transaction = type;
         _error       = RequestError.NoError;
     }
     else
     {
         if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information)
         {
             Trace.TraceError("{0}: Поток ID: {1} : Попытка начать новую транзакцию во время текущей транзакции",
                              DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId);
         }
         throw new Exception("Попытка начать новую транзакцию во время текущей транзакции");
     }
     return;
 }
Example #2
0
 //----------------------------------------------------------------------------
 /// <summary>
 /// Устанавливает режим ожидания.
 /// </summary>
 private void StopTransaction()
 {
     if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information)
     {
         Trace.TraceInformation("{0}: Поток ID: {1} : Окончание транзакции",
                                DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId);
     }
     _serialPort.DiscardOutBuffer();
     _serialPort.DiscardInBuffer();
     _transaction = TransactionType.Undefined;
     return;
 }
Example #3
0
        //----------------------------------------------------------------------------
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="portName">Имя COM-порта</param>
        /// <param name="baudRate">Скорость соединения</param>
        /// <param name="parity">Наличие паритета данных</param>
        /// <param name="dataBits">Количество бит в символе</param>
        /// <param name="stopBits">Количество стоп-бит</param>
        /// <param name="timeOut">Время таймаута ответа, в мсек</param>
        /// <param name="aroundDelay">Интервал временной задержки при широковещаетльном запросе, мсек</param>
        /// <param name="eventLogEnable">Разрешение вести журнал</param>
        /// <param name="filterLogMessage">Фильт сообщений записываемых в журнал</param>
        /// <param name="PathToLogFile">Путь к файлу журнала, если пустая строка, то по умолчанию в директории приложения</param>
        public ComPort(string portName, int baudRate, Parity parity,
                       int dataBits, StopBits stopBits, int timeOut, int aroundDelay,
                       Boolean eventLogEnable, TypeOfMessageLog filterLogMessage, String pathToLogFile)
        {
            _EventLogEnable   = eventLogEnable;
            _MaskOfMessageLog = filterLogMessage;
            if (pathToLogFile == String.Empty)
            {
                _PathToLogFile = Environment.CurrentDirectory + @"\SerialPort.log";
            }
            else
            {
                _PathToLogFile = pathToLogFile;
            }

            if (_EventLogEnable)
            {
                // Создаём журнал
                // По умолчанию ищем файл в папке приложения
                if (_PathToLogFile == String.Empty)
                {
                    // По умолчанию сохраняем в папку приложения
                    _PathToLogFile = Environment.CurrentDirectory + @"\datalink.log";
                }

                CreateLog();
            }
            else
            {
                Trace.Listeners.Clear();
            }

            // Таймер определения интервала между сообщениями
            _tmrInterFrameDelay = new System.Timers.Timer();
            // Если скорость передачи выше 19200 бит/сек, то устанавливаем
            // интервал 1.750mc, иначе 3,5*Tсимвола
            // !!! К сожалению следовать протоколу в винде не получается
            // Если ставить задержку меньше 20, пакет принимается не полностью
            // и выскакивает ошибка CRC.
            _tmrInterFrameDelay.Interval = 150; //20
            //if (Settings.BaudRate >= 19200)
            //{
            //    tmrInterFrameDelay.Interval = 1.750;
            //}
            //else
            //{
            //    tmrInterFrameDelay.Interval = Convert.ToDouble(1000 * 3.5 * 11 / Settings.BaudRate);
            //}
            _tmrInterFrameDelay.AutoReset = false;
            _tmrInterFrameDelay.Elapsed  += new ElapsedEventHandler(_tmrInterFrameDelay_Elapsed);
            _tmrInterFrameDelay.Stop();

            _serialPort =
                new System.IO.Ports.SerialPort(portName, baudRate, parity,
                                               dataBits, stopBits);

            // Настраиваем события от COM-порта
            _serialPort.ErrorReceived +=
                new SerialErrorReceivedEventHandler(ComPort_ErrorReceived);
            _serialPort.DataReceived +=
                new SerialDataReceivedEventHandler(ComPort_DataReceived);
            _serialPort.ReceivedBytesThreshold = 1;

            //_serialPort.ReadBufferSize = 512;

            if (_serialPort.IsOpen)
            {
                _serialPort.Close();
            }

            _ValueTimeOut         = timeOut;
            _ValueTurnAroundDelay = aroundDelay;

            _timeOut = new EventWaitHandle(false,
                                           EventResetMode.AutoReset);

            _incomingBuffer = new List <byte>();
            _incomingBuffer.Clear();

            _transaction = TransactionType.Undefined;
        }
Example #4
0
 //----------------------------------------------------------------------------
 /// <summary>
 /// Устанавливает режим ожидания.
 /// </summary>
 private void StopTransaction()
 {
     if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information)
     {
         Trace.TraceInformation("{0}: Поток ID: {1} : Окончание транзакции",
             DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId);
     }
     _serialPort.DiscardOutBuffer();
     _serialPort.DiscardInBuffer();
     _transaction = TransactionType.Undefined;
     return;
 }
Example #5
0
 //----------------------------------------------------------------------------
 /// <summary>
 /// Устанавливает режим транзакции запрос-ответ
 /// </summary>
 private void StartTransaction(
     Modbus.OSIModel.Transaction.TransactionType type)
 {
     if (_transaction == TransactionType.Undefined)
     {
         if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information)
         {
             Trace.TraceInformation("{0}: Поток ID: {1} : Старт транзакции",
                 DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId);
         }
         //_incomingBuffer.Clear();
         _serialPort.DiscardInBuffer();
         _serialPort.DiscardOutBuffer();
         _transaction = type;
         _error = RequestError.NoError;
     }
     else
     {
         if ((_MaskOfMessageLog & TypeOfMessageLog.Information) == TypeOfMessageLog.Information)
         {
             Trace.TraceError("{0}: Поток ID: {1} : Попытка начать новую транзакцию во время текущей транзакции",
                 DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId);
         }
         throw new Exception("Попытка начать новую транзакцию во время текущей транзакции");
     }
     return;
 }
Example #6
0
        //----------------------------------------------------------------------------
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="portName">Имя COM-порта</param>
        /// <param name="baudRate">Скорость соединения</param>
        /// <param name="parity">Наличие паритета данных</param>
        /// <param name="dataBits">Количество бит в символе</param>
        /// <param name="stopBits">Количество стоп-бит</param>
        /// <param name="timeOut">Время таймаута ответа, в мсек</param>
        /// <param name="aroundDelay">Интервал временной задержки при широковещаетльном запросе, мсек</param>
        /// <param name="eventLogEnable">Разрешение вести журнал</param>
        /// <param name="filterLogMessage">Фильт сообщений записываемых в журнал</param>
        /// <param name="PathToLogFile">Путь к файлу журнала, если пустая строка, то по умолчанию в директории приложения</param>
        public ComPort(string portName, int baudRate, Parity parity,
            int dataBits, StopBits stopBits, int timeOut, int aroundDelay, 
            Boolean eventLogEnable, TypeOfMessageLog filterLogMessage, String pathToLogFile)
        {
            _EventLogEnable = eventLogEnable;
            _MaskOfMessageLog = filterLogMessage;
            if (pathToLogFile == String.Empty)
            {
                _PathToLogFile = Environment.CurrentDirectory + @"\SerialPort.log";
            }
            else
            {
                _PathToLogFile = pathToLogFile;
            }

            if (_EventLogEnable)
            {
                // Создаём журнал
                // По умолчанию ищем файл в папке приложения
                if (_PathToLogFile == String.Empty)
                {
                    // По умолчанию сохраняем в папку приложения
                    _PathToLogFile = Environment.CurrentDirectory + @"\datalink.log";
                }

                CreateLog();
            }
            else
            {
                Trace.Listeners.Clear();
            }

            // Таймер определения интервала между сообщениями
            _tmrInterFrameDelay = new System.Timers.Timer();
            // Если скорость передачи выше 19200 бит/сек, то устанавливаем
            // интервал 1.750mc, иначе 3,5*Tсимвола
            // !!! К сожалению следовать протоколу в винде не получается
            // Если ставить задержку меньше 20, пакет принимается не полностью
            // и выскакивает ошибка CRC.
            _tmrInterFrameDelay.Interval = 150; //20
            //if (Settings.BaudRate >= 19200)
            //{
            //    tmrInterFrameDelay.Interval = 1.750;
            //}
            //else
            //{
            //    tmrInterFrameDelay.Interval = Convert.ToDouble(1000 * 3.5 * 11 / Settings.BaudRate);
            //}
            _tmrInterFrameDelay.AutoReset = false;
            _tmrInterFrameDelay.Elapsed += new ElapsedEventHandler(_tmrInterFrameDelay_Elapsed);
            _tmrInterFrameDelay.Stop();

            _serialPort = 
                new System.IO.Ports.SerialPort(portName, baudRate, parity,
                dataBits, stopBits);

            // Настраиваем события от COM-порта
            _serialPort.ErrorReceived += 
                new SerialErrorReceivedEventHandler(ComPort_ErrorReceived);
            _serialPort.DataReceived += 
                new SerialDataReceivedEventHandler(ComPort_DataReceived);
            _serialPort.ReceivedBytesThreshold = 1;

            //_serialPort.ReadBufferSize = 512;
            
            if (_serialPort.IsOpen)
            {
                _serialPort.Close();
            }

            _ValueTimeOut = timeOut;
            _ValueTurnAroundDelay = aroundDelay;
                    
            _timeOut = new EventWaitHandle(false, 
                EventResetMode.AutoReset);

            _incomingBuffer = new List<byte>();
            _incomingBuffer.Clear();

            _transaction = TransactionType.Undefined;
        }