Beispiel #1
0
        public bool Open()
        {
            if (mTcpClient != null)
            {
                return(false);
            }

            try
            {
                mTcpClient = new TcpClient(mUrl, mPort)
                {
                    Client         = { Blocking = true },
                    ReceiveTimeout = ReadTimeout,
                    SendTimeout    = ReadTimeout
                };

                if (mConnection != null)
                {
                    mConnection.Dispose();
                }

                mConnection = ModbusIpMaster.CreateIp(mTcpClient);
                //mJournal.Warning("Create connection " + mUrl + ":" + mPort);
                mIsFirstError = true;
                return(true);
            }
            catch (ArgumentNullException)
            {
                if (mIsFirstError)
                {
                    if (mJournal != null)
                    {
                        mJournal.Error("Не могу уст. соединение с " + mUrl + ":" + mPort + ": ArgumentNullException", MessageLevel.System);
                    }
                }

                mTcpClient    = null;
                mIsFirstError = false;
            }
            catch (SocketException)
            {
                if (mIsFirstError)
                {
                    if (mJournal != null)
                    {
                        mJournal.Error("Не могу уст. соединение с " + mUrl + ":" + mPort + ": SocketException", MessageLevel.System);
                    }
                }

                mTcpClient    = null;
                mIsFirstError = false;
            }

            return(false);
        }
Beispiel #2
0
 private int CheckSdcardStatus()
 {
     if (System.IO.File.Exists("/mnt/sdcard/journal.flg"))
     {
         return(1);
     }
     else
     {
         journal.Error("Карта памяти не найдена или не примонтирована", MessageLevel.System);
         journal.Error("Все настройки системы и журнал временные", MessageLevel.System);
     }
     return(0);
 }
Beispiel #3
0
        private void UpdateSystemCode(SystemStateCodes.State code)
        {
            if (mState == SystemState.Failure)
            {
                mJournal.Error(string.Format("Состояние (защита) {0} уст. в {1}", mState, code), MessageLevel.System);
            }
            else
            {
                mJournal.Info(string.Format("Состояние {0} уст. в {1}", mState, code), MessageLevel.System);
            }


            mSystemCode.Update((uint)code);
        }
Beispiel #4
0
        private static void OnErrorCaller(SystemStateCodes.Alarm signal)
        {
            mJournal.Error(string.Format("{0}", signal), MessageLevel.System);

            if (OnError != null)
            {
                OnError(signal);
            }

            mState.Update((uint)EquipmentState.Failure);
        }
Beispiel #5
0
        public bool Open()
        {
            if (mPort != null)
            {
                return(false);
            }

            try
            {
                mPort = new SerialPort(mPortName, mBaudrate, Parity.None, 8, StopBits.One)
                {
                    ReadTimeout = ReadTimeout
                };
                mPort.Open();

                if (mPort.IsOpen)
                {
                    mConnection = mIsRtu ? ModbusSerialMaster.CreateRtu(mPort) : ModbusSerialMaster.CreateAscii(mPort);
                    mConnection.Transport.Retries     = Retries; // 0,  was 1
                    mConnection.Transport.ReadTimeout = ReadTimeout;

                    mIsFirstError = true;
                    return(true);
                }
            }
            catch (IOException)
            {
                if (mIsFirstError)
                {
                    mJournal.Error("Не могу открыть посл. порт " + mPortName, MessageLevel.System);
                }

                if (mPort != null)
                {
                    if (mPort.IsOpen)
                    {
                        mPort.Close();
                    }
                }

                mPort         = null;
                mIsFirstError = false;
            }
            catch (ArgumentException)
            {
                if (mIsFirstError)
                {
                    mJournal.Error("Не могу открыть посл. порт " + mPortName, MessageLevel.System);
                }

                if (mPort != null)
                {
                    if (mPort.IsOpen)
                    {
                        mPort.Close();
                    }
                }

                mPort         = null;
                mIsFirstError = false;
            }
            catch (UnauthorizedAccessException)
            {
                if (mIsFirstError)
                {
                    mJournal.Error("Не хватает прав для записи в посл. порт " + mPortName, MessageLevel.System);
                }

                if (mPort != null)
                {
                    if (mPort.IsOpen)
                    {
                        mPort.Close();
                    }
                }

                mPort         = null;
                mIsFirstError = false;
            }
            catch (NullReferenceException)
            {
                if (mIsFirstError)
                {
                    mJournal.Error("Не указано имя посл. порта", MessageLevel.System);
                }

                if (mPort != null)
                {
                    if (mPort.IsOpen)
                    {
                        mPort.Close();
                    }
                }

                mPort         = null;
                mIsFirstError = false;
            }

            return(false);
        }
Beispiel #6
0
 public void Error(string message, MessageLevel level = MessageLevel.User)
 {
     mJournal.Error(message, level);
 }
Beispiel #7
0
        public SystemContol(IJournal journal, ISignalsFactory signals, bool isdebug = false)
        {
            debug    = isdebug;
            mJournal = journal;

            mSystemCode        = signals.GetSignal("derivative.system.code");
            mBlockedByPassword = signals.GetSignal("derivative.system.authorize");
            if (debug)
            {
                mBlockedByPassword.OnChange += signal => Console.WriteLine("derivative.system.authorize: {0}", signal.ValueAsInt);
                mSystemCode.OnChange        += signal => Console.WriteLine("system.code: {0}", signal.ValueAsInt);
            }


            SetState(SystemState.Init, SystemStateCodes.State.Initialization);

            Pedals.Init(signals);
            SoundAlarm.Init(mJournal, signals);

            Pump.Init(mJournal, signals);
            Pump.OnError += code =>
            {
                // TODO: отверить процедуру отключения по ошибке насоса (в теории, выключается все сразу)
                mJournal.Error(string.Format("Защита по маслостанции: {0}", mState), MessageLevel.System);
                SetState(SystemState.Failure, code);

                Engine.SetMode(EngineMode.Deactivate);
                Pump.Stop();
            };

            Pump.OnWarning += code => SetState(mState, code);

            switch (Environment.OSVersion.Platform)
            {
            case PlatformID.Unix:
                Engine.Init(journal, signals, "/dev/ttySP0", 19200);
                break;

            default:
                Engine.Init(journal, signals, "COM1", 19200);
                break;
            }

            //Engine.Init(journal, signals, "/dev/ttySP1", 38400); // last worked
            //Engine.Init(journal, signals, "/dev/ttySP1", 57600);
            //Engine.Init(journal, signals, "COM38", 38400);

            // ошибки частотников, ошибки кордов, ошибки реле kv1, kv8, kv8
            Engine.OnError += code =>
            {
                mJournal.Error(string.Format("Защита по частотникам, кордам, реле: {0}", mState), MessageLevel.System);
                SetState(SystemState.Failure, code);
                Engine.SetMode(EngineMode.Deactivate);
            };

            Pump.OnStop += signal => Engine.SetMode(EngineMode.Deactivate);

            KeyboardInit();

            mThread = new Thread(Update);
            mThread.Start();
        }
Beispiel #8
0
        /// <summary>
        /// Считываем состояние частотника
        /// </summary>
        /// <returns></returns>
        public bool Update()
        {
            //Console.WriteLine("{0}: Get Update Id: {1}", DateTime.Now.ToString("HH:mm:ss.fff"), mModbusId);
            bool rv = ReadModbus(); // 256 (40256)

            if (rv == false)
            {
                // TODO: только для тестов
                //mJournal.Debug(String.Format("Bad engine transfer from {0}", Id), MessageLevel.System);
                mError.Update(float.NaN);  // статус неизвестен
            }

            #region interpretate response
            if (float.IsNaN(mState.Value))
            {
                // TODO: не инициализирован - не было обмена с частотником
            }
            else
            {
                switch (mState.ValueAsInt) //режим работы, 1 - стоп, 2 - работа, 3 - авария, 4 - запуск
                {
                case 1:                    // stop
                {
                    if (Status != EngineStatus.Stopped)
                    {
                        mJournal.Debug(string.Format("{0} остановлен", Id), MessageLevel.System);
                    }

                    Status = EngineStatus.Stopped;
                }
                break;

                case 2:     // active
                {
                    if (Status != EngineStatus.Activated)
                    {
                        mJournal.Debug(string.Format("{0} активирован", Id), MessageLevel.System);
                    }

                    Status = EngineStatus.Activated;
                }
                break;

                case 3:     // fault
                {
                    if (Status != EngineStatus.Failure)
                    {
                        // первый вход в режим
                        mJournal.Debug(string.Format("{0} уст. код защиты {1}", Id, mError.ValueAsInt), MessageLevel.System);

                        mJournal.Debug(string.Format("{0} уст. причина защиты {1}", Id, mLastStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Часы {1}", Id, mHourStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Минуты {1}", Id, mMinuteStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Дни {1}", Id, mDayStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Месяц {1}", Id, mMonthStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Год {1}", Id, mYearStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Fzad {1}", Id, mFzadStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Fpracy {1}", Id, mFpracyStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Ud {1}", Id, mUdStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. Iskut {1}", Id, mIskutStop.ValueAsInt), MessageLevel.System);
                        mJournal.Debug(string.Format("{0} уст. TermSens {1}", Id, mTermSensStop.ValueAsInt), MessageLevel.System);

                        if (OnError != null)
                        {
                            OnError(mError);
                        }
                    }

                    Status = EngineStatus.Failure;
                }
                break;

                case 4:     // pre-active
                {
                    if (Status != EngineStatus.Prelaunched)
                    {
                        mJournal.Debug(string.Format("{0} уст. презапуск", Id), MessageLevel.System);
                    }

                    Status = EngineStatus.Prelaunched;
                }
                break;

                default:
                {
                    mJournal.Error(string.Format("{0}: неверный режим {1}", Id, mState.Value), MessageLevel.System);
                }
                break;
                }
            }

            #endregion

            return(rv);
        }
Beispiel #9
0
        private static void InternalLogic()
        {
            try
            {
                #region рабочее тело

                switch (State)
                {
                case SystemState.Init:
                {
                    Stop();

                    // TODO: проверяем, все ли готово для перехода в рабочий режим (SystemState.Ready)
                    if (IsCharged())
                    {
                        mKv1.On();

                        if (IsActive())
                        {
                            SetState(SystemState.Ready);
                        }
                    }
                    else
                    {
                        // по сути это режим выключенной насосной станции - поэтому корректное выключение двигателей под вопросом

                        // сбрасываем уставку скорости до начальной и указываем режим ожидание
                        SetMode(EngineMode.Deactivate);

                        // все частотники остановлены (защита или штатный останов)
                        if (Invertors.Count(s => (s.Status == EngineStatus.Stopped) || (s.Status == EngineStatus.Failure)) == Invertors.Count)
                        {
                            // mJournal.Warning(string.Format("|| {0}", Invertors.Count(s => (s.Status == EngineStatus.Stopped) || (s.Status == EngineStatus.Failure))));
                            // защита
                            mKv1.Off();
                            //mKv8.Off();
                            //mKv9.Off();
                        }
                    }
                }
                break;

                //
                case SystemState.Ready:
                {
                    Stop();

                    if (!IsActive())
                    {
                        SetState(SystemState.Init);         // упс, что то пошло не так
                        break;
                    }

                    switch (Mode)
                    {
                    case EngineMode.Deactivate:
                    {
                        // Это или режим ожидания или режим, после выключения одного из рабочих состояний
                        // все частотники остановлены (защита или штатный останов)
                        if (Invertors.Count(s => (s.Status == EngineStatus.Stopped) || (s.Status == EngineStatus.Failure)) == Invertors.Count)
                        {
                            // защита
                            //mKv8.Off(); // EngineMode.Motion
                            //mKv9.Off(); // EngineMode.Conveyor
                        }
                    }
                    break;

                        /*
                         * case EngineMode.Motion:
                         *  {
                         *      mKv8.On();
                         *  }
                         *  break;
                         *
                         * case EngineMode.Conveyor:
                         *  {
                         *      mKv9.On();
                         *  }
                         *  break;
                         */
                    }

                    if (IsMotionReady() && !Pedals.IsPressed)
                    {
                        SetState(SystemState.Active);
                    }
                }
                break;

                // можем быть тут и в режиме хода и в режиме конвейера
                case SystemState.Active:
                {
                    //mJournal.Debug("\tinternal logic: 2", MessageLevel.System);
                    if (!IsMotionReady())
                    {
                        SetState(SystemState.Ready);         // упс, что то пошло не так
                        break;
                    }

                    switch (Mode)
                    {
                    case EngineMode.Motion:
                    {
                        if (Pedals.IsUnlock)
                        {
                            Start(Pedals.Forward);
                        }
                        else
                        {
                            // педали отпущены - останавливаемся
                            Stop();
                        }
                    }
                    break;

                        /*
                         * case EngineMode.Conveyor:
                         *  {
                         *      // педалями фактически можно притормаживать работу конвейера - Стебнев "не надо"
                         *      if (Pedals.IsPressed)
                         *      {
                         *          // педали нажата - плавно понижаем частоту инвертора uz5
                         *          //Stop();
                         *          if (mConveyor.Status != EngineStatus.Activated)
                         *          {
                         *              // TODO: Если мы до этого еще не включались - надо заблокировать дальнейщее включение или нет?
                         *          }
                         *      }
                         *      else
                         *      {
                         *          Start(true);
                         *      }
                         *  }
                         *  break;
                         */
                    }
                    //mJournal.Debug("\tinternal logic: 3", MessageLevel.System);
                }
                break;

                case SystemState.Failure:
                {
                    string fn = "";
                    if (fisrtstart == true)
                    {
                        mJournal.Error("Режим защиты. Сброс и запуск системы.", MessageLevel.System);
                    }

                    if ((DateTime.Now.AddMinutes(-5) > lastFailDateTime) || fisrtstart)
                    {
                        fn = mSignals.WriteInfo("");
                        lastFailDateTime = DateTime.Now;
                        fisrtstart       = false;
                    }

                    if (fn.Length > 0)
                    {
                        mJournal.Info("Снимок сигналов лежит в файле " + fn, MessageLevel.System);
                    }
                    //else
                    //    mJournal.Error("Снимок сигналов не удалось записать (защита или множественные защиты)", MessageLevel.System);

                    if (mIsNeedResetFault)
                    {
                        // аппаратный сброс сетевого выпрямителя
                        mRectifierReset.On();
                        Thread.Sleep(500);
                        mRectifierReset.Off();
                        Thread.Sleep(500);

                        foreach (var invertor in Invertors)
                        {
                            // записываем команду на сброс
                            invertor.ResetFault();
                            Thread.Sleep(50);

                            // обновляем значения с частотника
                            ((FNTGZ60)invertor).Update();
                        }

                        // заходим в этот блок единожды на каждое нажатие кнопки
                        mIsNeedResetFault = false;
                    }

                    // блокировка по кордам снята
                    if (Cords.Count(s => !s.IsNormal) > 0)
                    {
                        break;
                    }

                    // все двигателя сброшены из состояния ошибки
                    if (Invertors.Count(s => s.Status == EngineStatus.Stopped) != Invertors.Count)
                    {
                        break;
                    }

                    // переходим в стартовый режим и пробуем запустится штатно
                    SetState(SystemState.Init);
                    fisrtstart = true;
                    mJournal.Info("Запуск после ухода в защиту произведен", MessageLevel.System);
                }
                break;
                }
                #endregion
            }
            catch (Exception ex)
            {
                // что то очень не штатное - так быть не должно
                mJournal.Error(ex.ToString(), MessageLevel.System);
            }
        }