Esempio n. 1
0
        /// <summary>
        /// Обработчик события срабатывания межкадрового таймера
        /// </summary>
        /// <param name="sender">Отправитель события</param>
        /// <param name="e">Аргументы события</param>
        private void EventHandler_TmrInterFrameDelay_Elapsed(
            object sender, ElapsedEventArgs e)
        {
            Byte[]          message;
            Message.Message request;
            Timer           tmr = (Timer)sender;

            tmr.Stop();

            // Таймер сработал, значит сообщение (запрос)
            // принят полностью считаем CRC16
            message = new byte[_SerialPort.BytesToRead];
            _SerialPort.Read(message, 0, _SerialPort.BytesToRead);

            if (true == Modbus.OSIModel.DataLinkLayer.CRC16.VerefyCRC16(message))
            {
                // Запрос принят корректно
                Byte[] array = new byte[(message.Length - 4)];  //Данные в сообщениии
                Array.Copy(message, 2, array, 0, array.Length); // Выделили данные из сообщения

                request = new Message.Message(message[0], message[1], array);

                if (request.Address == 0)
                {
                    // Формируем событие приёма широковещаетельного запроса
                    _СurrentTransaction = new Transaction.Transaction(
                        TransactionType.BroadcastMode, request);
                    _СurrentTransaction.TransactionWasEnded +=
                        new EventHandler(EventHandler_СurrentTransaction_TransactionWasEnded);
                    _СurrentTransaction.Start(); // Стартуем транзакцию
                    OnRequestWasRecived(new MessageEventArgs(request));
                    // ??? Можно было бы запустить таймер задержки при широковещаетльном запросе
                    // Сейчас не реализовано. По этому, завершам транзакцию сразу.
                    _СurrentTransaction.Stop(null); // Завершает транзакцию
                }
                else
                {
                    _СurrentTransaction = new Transaction.Transaction(
                        TransactionType.UnicastMode, request);
                    _СurrentTransaction.TransactionWasEnded +=
                        new EventHandler(EventHandler_СurrentTransaction_TransactionWasEnded);
                    _СurrentTransaction.Start();
                    // Запускаем таймер таймаута ответа подчинённого устройства
                    _TimerTimeoutCurrentTransaction.Start();
                    // Формируем событие приёма адресованного запроса.
                    // Транзакция здесь продолжается до тех пор, покак не будет
                    // отправлен ответ.
                    OnRequestWasRecived(new MessageEventArgs(request));
                }
            }
            else
            {
                // Принят запрос с неверным CRC16
                OnErrorOccurred(new ErrorOccurredEventArgs
                                    (PortError.CheckSumError, "Принят запрос с неверным CRC16"));
            }
            return;
        }
Esempio n. 2
0
        public void SendResponse(Message.Message answer)
        {
            // Останавливаем таймер таймаута
            _TimerTimeoutCurrentTransaction.Stop();

            Byte[] array = answer.ToArray();
            // Отсылаем ответ
            _SerialPort.Write(array, 0, array.Length);
            // Останавливаем транзакцию
            _СurrentTransaction.Stop(answer);
            // Формирует событие
            OnResponseWasSent(new MessageEventArgs(answer));

            return;
        }
Esempio n. 3
0
        /// <summary>
        /// Обработчик события срабатывания межкадрового таймера 
        /// </summary>
        /// <param name="sender">Отправитель события</param>
        /// <param name="e">Аргументы события</param>
        private void EventHandler_TmrInterFrameDelay_Elapsed(
            object sender, ElapsedEventArgs e)
        {
            Byte[] message;
            Message.Message request;
            Timer tmr = (Timer)sender;
            tmr.Stop();

            // Таймер сработал, значит сообщение (запрос) 
            // принят полностью считаем CRC16            
            message = new byte[_SerialPort.BytesToRead];
            _SerialPort.Read(message, 0, _SerialPort.BytesToRead);

            if (true == Modbus.OSIModel.DataLinkLayer.CRC16.VerefyCRC16(message))
            {
                // Запрос принят корректно
                Byte[] array = new byte[(message.Length - 4)]; //Данные в сообщениии
                Array.Copy(message, 2, array, 0, array.Length); // Выделили данные из сообщения
                
                request = new Message.Message(message[0], message[1], array);
                
                if (request.Address == 0)
                {
                    // Формируем событие приёма широковещаетельного запроса
                    _СurrentTransaction = new Transaction.Transaction(
                        TransactionType.BroadcastMode, request);
                    _СurrentTransaction.TransactionWasEnded += 
                        new EventHandler(EventHandler_СurrentTransaction_TransactionWasEnded);
                    _СurrentTransaction.Start(); // Стартуем транзакцию
                    OnRequestWasRecived(new MessageEventArgs(request));
                    // ??? Можно было бы запустить таймер задержки при широковещаетльном запросе
                    // Сейчас не реализовано. По этому, завершам транзакцию сразу.
                    _СurrentTransaction.Stop(null); // Завершает транзакцию 
                }
                else
                {
                    _СurrentTransaction = new Transaction.Transaction(
                        TransactionType.UnicastMode, request);
                    _СurrentTransaction.TransactionWasEnded +=
                        new EventHandler(EventHandler_СurrentTransaction_TransactionWasEnded);
                    _СurrentTransaction.Start();
                    // Запускаем таймер таймаута ответа подчинённого устройства
                    _TimerTimeoutCurrentTransaction.Start();
                    // Формируем событие приёма адресованного запроса. 
                    // Транзакция здесь продолжается до тех пор, покак не будет
                    // отправлен ответ.
                    OnRequestWasRecived(new MessageEventArgs(request));
                }
            }
            else
            {
                // Принят запрос с неверным CRC16
                OnErrorOccurred(new ErrorOccurredEventArgs
                    (PortError.CheckSumError, "Принят запрос с неверным CRC16"));
            }
            return;
        }