Пример #1
0
        private static IInvertor InitInvertor(byte channel)
        {
            var rv = new FNTGZ60(mJournal, mSignals, mConnection, channel);

            Invertors.Add(rv);
            mJournal.Info(string.Format("Инвертор #{0} запускается", channel), MessageLevel.System);

            rv.OnError += signal =>
            {
                SetState(SystemState.Failure);

                foreach (var invertor in Invertors)
                {
                    invertor.Off(true);
                }

                OnErrorWrapper(GetInvertorCode(channel));
            };

            return(rv);
        }
Пример #2
0
        /// <summary>
        /// Обновляем информацию по частотникам (modbus)
        /// </summary>
        private static void Update()
        {
            mJournal.Info("Обработчик инверторов запущен", MessageLevel.System);
            int RS485TimeOutms = 5;

            //var elapsed = new Stopwatch();
            try
            {
                while (true)
                {
                    try
                    {
                        //Console.WriteLine("lap: {0} ms", elapsed.ElapsedMilliseconds);
                        //const int kPeriod = 100;
                        //Thread.Sleep((int)(elapsed.ElapsedMilliseconds > kPeriod ? 0 : kPeriod - elapsed.ElapsedMilliseconds));
                        //elapsed.Restart();

                        // внутренняя логика работы - в том числе и запись в регистры
                        InternalLogic();

                        #region cчитываем текущее состояние частотников

                        // чтение параметров
                        foreach (var invertor in Invertors)
                        {
                            ((FNTGZ60)(invertor)).Update();
                            Thread.Sleep(RS485TimeOutms); // pause for RS485 channel
                        }

                        // запись параметров управления

                        /*
                         * if (Mode == EngineMode.Conveyor)
                         * {
                         *  // TODO: записывает все три управляющих байта !!!
                         *  ((FNTGZ60)(mConveyor)).WriteConveyorState();
                         * }
                         * else
                         */
                        {
                            foreach (var invertor in Invertors)
                            {
                                // TODO: записывает ТОЛЬКО ДВА управляющих байта частоты и направления - запуск и остановка по броадкасту !!!
                                ((FNTGZ60)(invertor)).WriteState();
                                Thread.Sleep(RS485TimeOutms); // pause for RS485 channel
                            }

                            FNTGZ60.WriteBroadcast();
                        }

                        Thread.Sleep(10);

                        mUz2State.Update((uint)GetState(mUz2.Status));
                        mUz3State.Update((uint)GetState(mUz3.Status));
                        mUz4State.Update((uint)GetState(mUz4.Status));
                        mUz5State.Update((uint)GetState(mUz5.Status));

                        if (mConveyorState.ValueAsInt != (uint)EquipmentState.Failure)
                        {
                            mConveyorState.Update(mIsConveyorActive ? (uint)EquipmentState.Active : (uint)EquipmentState.Stop);
                        }

                        /*
                         * if (Mode == EngineMode.Conveyor)
                         *  mConveyorState.Update((uint)GetState(mUz4.Status));
                         * else
                         *  mConveyorState.Update((uint)EquipmentState.Stop);
                         *
                         *
                         * // установка правильной рампы по рекомендации Дарека
                         * ((FNTGZ60)mConveyor).SetInvertorMode();
                         */

                        #endregion
                    }
                    catch (Exception e)
                    {
                        if (e is TimeoutException ||
                            e is IOException)
                        {
                            mConnection.Close();
                        }
                        else
                        {
                            throw;
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
                mConnection.Close();
                mJournal.Info("Обработчик инверторов остановлен (защита)", MessageLevel.System);
            }
            catch (Exception e)
            {
                mConnection.Close();
                mJournal.Fatal(e.ToString(), MessageLevel.System);

                throw;
            }
        }