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); }
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); }
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); }
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); }
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); }
public void Error(string message, MessageLevel level = MessageLevel.User) { mJournal.Error(message, level); }
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(); }
/// <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); }
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); } }