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); }
/// <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; } }