/// <summary> /// Установка параметров частотника для разных рамп (по рекомендации Дарека от 19.10.2015) // read before set new value // 40325 - value = 5 for conveyor mode or value = 0 for motion mode /// </summary> internal void SetInvertorMode() { if (Status != EngineStatus.Stopped) { return; } try { mConnection.Open(); if (!mConnection.IsOpen()) { return; } const ushort kConveyorModeSetting = 5; const ushort kMotionModeSetting = 0; #region read var rv = mConnection.ReadHoldings(mModbusId, 325, 1); if (rv == null) { return; } //if ((Engine.Mode == EngineMode.Conveyor && rv[0] != kConveyorModeSetting) || if (Engine.Mode == EngineMode.Motion && rv[0] != kMotionModeSetting)//) { return; var rampMode = kMotionModeSetting; //var rampMode = 0; //var rampMode = Engine.Mode == EngineMode.Conveyor ? kConveyorModeSetting : kMotionModeSetting; mJournal.Debug(string.Format("попытка Установки {0} в {1} по {2}", mModbusId, Engine.Mode, rampMode), MessageLevel.System); #region write //return; // запрещаем смену рамп if (mConnection.Write(mModbusId, 325, new[] { rampMode })) { mJournal.Debug(":: успешно", MessageLevel.System); //mJournal.Debug(string.Format("{0}: modbus success write", modbusId), MessageLevel.System); } else { mJournal.Debug(":: защита при смене рампы", MessageLevel.System); } #endregion } #endregion } catch (Exception e) { if (e is SocketException || e is TimeoutException || e is IOException) { mConnection.Close(); } else { throw; } } }
/// <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; } }