public void AddSctuEvent(SctuHwState state, SctuTestResults results) { m_ActionQueue.Enqueue(delegate { //if (Cache.Main.mainFrame.Content.Equals(Cache.UserTest)) // Cache.UserTest.SetDVdtWarning(Warning); //else Cache.SctuPage.SetResults(state, results); }); }
private void FiredSctuEvent(SctuHwState state, SctuTestResults result) { var message = string.Format("Sctu test state {0}", state); if (state == SctuHwState.WaitTimeOut) { message = string.Format("Sctu test result - Voltage: {0}, Current: {1}, Gain: {2} ", result.VoltageValue, result.CurrentValue, result.MeasureGain); } SystemHost.Journal.AppendLog(ComplexParts.Sctu, LogMessageType.Info, message); _broadcastCommunication.PostSctuEvent(state, result); }
internal void SCTUWaitReady() { //после импульса тока SCTU довольно долго заряжает свои батареи конденсаторов //чтобы иметь возможность опустить пресс сразу после импульса тока - ожидание перехода SCTU в состояние готовности вынесено из реализации измерения в данную реализацию if (_isSctuEmulation) { _deviseState = SctuHwState.Ready; FiredSctuEvent(_deviseState, _testResults); return; } else { SctuHwState state = WaitForReady(); FiredSctuEvent(state, _testResults); } }
public void SetResults(SctuHwState state, SctuTestResults results) { switch (state) { //данные готовы при состоянии SCTU WaitTimeOut case SctuHwState.WaitTimeOut: labelResultVoltage.Content = results.VoltageValue; //((double)results.VoltageValue / 1000).ToString("0.00"); labelResultCurrent.Content = results.CurrentValue; labelMeasureGain.Content = Math.Round(results.MeasureGain, 3).ToString(); //выводим графики тока и напряжения Plot(@"I", m_XGreen.Color, results.CurrentData); Plot(@"U", m_XOrange.Color, results.VoltageData); break; case SctuHwState.Ready: StartButtonEnabled(true); break; } }
public void PostSctuEvent(SctuHwState state, SctuTestResults results) { EnumerateClients(client => client.SctuHandler(state, results)); }
private void MeasurementLogicRoutine(IOClamping clamping, IOGateway gateway) { try { FiredSctuEvent(SctuHwState.InProcess, _testResults); //пишем младшую 16-ти битную половину значения ударного тока WriteRegister(REG_SC_VALUE_L, UshortByNum(_testParameters.Value, false)); //пишем старшую 16-ти битную половину значения ударного тока WriteRegister(REG_SC_VALUE_H, UshortByNum(_testParameters.Value, true)); WriteRegister(REG_DUT_TYPE, (ushort)_testParameters.Type); WriteRegister(REG_R_SHUNT, (ushort)_testParameters.ShuntResistance); WriteRegister(REG_WAVEFORM_TYPE, (ushort)_testParameters.WaveFormType); if (_testParameters.WaveFormType == SctuWaveFormType.Trapezium) { WriteRegister(REG_TRAPEZE_EDGE_TIME, _testParameters.TrapezeEdgeTime); } if (_isSctuEmulation) { _deviseState = SctuHwState.WaitTimeOut; _testResults.CurrentValue = 200; _testResults.VoltageValue = 1000; _testResults.MeasureGain = (double)912 / 1000; if (_ReadGraph) { //эмуляция графика тока for (int i = 1; i <= 11000; i++) { _testResults.CurrentData.Add(10); } //эмуляция графика напряжения for (int i = 1; i <= 11000; i++) { _testResults.VoltageData.Add(30); } } FiredSctuEvent(_deviseState, _testResults); } else { //чтобы пресс не занимал шину CAN - запрещаем ему опрашивать температуры его столика clamping.SetPermissionToScan(false); try { CallAction(ACT_SC_PULSE_CONFIG); Thread.Sleep(3000); var devState = WaitForPulseConfig(); if (devState == SctuHwState.PulseConfigReady) { CallAction(ACT_SC_PULSE_START); WaitForTestEnd(); //ожидаем состояние SctuHwState.WaitTimeOut devState = WaitForTimeOut(); //чтобы на время чтения результатов теста шина CAN была максимально свободной gateway.SetPermissionToScan(false); try { //читаем результаты _testResults.VoltageValue = ReadRegister(REG_DUT_U); //читаем младшие 16 бит измеренного значения ударного тока ushort DutIL = ReadRegister(REG_DUT_I_L); //читаем старшие 16 бит измеренного значения ударного тока ushort DutIH = ReadRegister(REG_DUT_I_H); //формируем из двух прочитанных 16-ти битных значений int значение ударного тока _testResults.CurrentValue = IntByUshorts(DutIL, DutIH); //читаем значение коэффициента усиления. его надо разделить на 1000, показывать с 3-мя знаками после запятой _testResults.MeasureGain = (double)ReadRegister(REG_INFO_K_SHUNT_AMP) / 1000; if (_ReadGraph) { //ожидаем готовность данных для построения графиков и только после этого их читаем WaitForGraphDataReady(); //читаем массивы данных тока и напряжения для построения графиков тока и напряжения ReadArrays(_testResults); } FiredSctuEvent(devState, _testResults); } finally { //разрешаем опрос Gateway gateway.SetPermissionToScan(true); } } } finally { //разрешаем опрос Clamping clamping.SetPermissionToScan(true); } } } catch (Exception ex) { _deviseState = SctuHwState.Fault; FiredSctuEvent(_deviseState, _testResults); FireExceptionEvent(ex.Message); throw; } }
internal DeviceConnectionState Initialize(bool isEnable, int timeOut = 25000) { _timeout = timeOut; _isSctuEmulation = _isSctuEmulationHard || !isEnable; _deviceConnectionState = DeviceConnectionState.ConnectionInProcess; switch (_isNeedSctuInitialization) { case (false): FireConnectionEvent(_deviceConnectionState, "Sctu skip initializing"); break; default: FireConnectionEvent(_deviceConnectionState, "Sctu initializing"); break; } if (_isSctuEmulation) { _deviceConnectionState = DeviceConnectionState.ConnectionSuccess; _deviseState = SctuHwState.Ready; FireConnectionEvent(_deviceConnectionState, "Sctu initialized"); return(_deviceConnectionState); } try { if (!_isNeedSctuInitialization) { //если включить SCTU - начнут загружаться сразу оба рабочих места и каждый из них будет пытаться инициализировать установку ударного тока, а инициализировать её можно только один раз, т.е. только одно рабочее место может выполнять инициализацию. именно для решения этого вопроса создан параметр 'NeedSctuInitialization' в конфигурационном файле //чтобы гарантированно дождаться уже инициализированное SCTU - спим в течении времени ChargeTimeout + 5 секунд для страховки Thread.Sleep(ChargeTimeout + 5000); var deviceState = (SctuHwState)ReadRegister(REG_DEV_STATE); if (deviceState == SctuHwState.Ready) { FiredSctuEvent(deviceState, _testResults); _deviceConnectionState = DeviceConnectionState.ConnectionSuccess; FireConnectionEvent(_deviceConnectionState, "Sctu initialization skipped"); } //инициализируем значение статуса активации - сразу после инициализации рабочее место свободно WriteRegister16(_ThisControlUnitBoardNode, REG_WORKPLACE_ACTIVATION_STATUS, (ushort)SctuWorkPlaceActivationStatuses.WORKPLACE_IS_FREE); return(_deviceConnectionState); } var timeStamp = Environment.TickCount + ChargeTimeout; ClearWarning(); var devState = (SctuHwState)ReadRegister(REG_DEV_STATE); if (devState != SctuHwState.Ready) { if (devState == SctuHwState.Fault) { ClearFault(); Thread.Sleep(100); devState = (SctuHwState)ReadRegister(REG_DEV_STATE); if (devState == SctuHwState.Fault) { throw new Exception(string.Format("Sctu is in fault state, reason: {0}", ReadRegister(REG_FAULT_REASON))); } } if (devState == SctuHwState.Disabled) { throw new Exception("Sctu is in disabled state"); } if (devState != SctuHwState.BatteryChargeStart) { CallAction(ACT_BAT_START_CHARGE); } } while (Environment.TickCount < timeStamp) { Thread.Sleep(500); //100 devState = (SctuHwState)ReadRegister(REG_DEV_STATE); if (devState == SctuHwState.Ready) { FiredSctuEvent(devState, _testResults); break; } if (devState == SctuHwState.Fault) { throw new Exception(string.Format("Sctu is in fault state, reason: {0}", ReadRegister(REG_FAULT_REASON))); } if (devState == SctuHwState.Disabled) { throw new Exception("Sctu is in disabled state"); } } if (Environment.TickCount > timeStamp) { throw new Exception("Timeout while waiting for device to power up"); } //инициализируем значение статуса активации - сразу после инициализации рабочее место свободно WriteRegister16(_ThisControlUnitBoardNode, REG_WORKPLACE_ACTIVATION_STATUS, (ushort)SctuWorkPlaceActivationStatuses.WORKPLACE_IS_FREE); _deviceConnectionState = DeviceConnectionState.ConnectionSuccess; FireConnectionEvent(_deviceConnectionState, "Sctu initialized"); } catch (Exception ex) { _deviceConnectionState = DeviceConnectionState.ConnectionFailed; FireConnectionEvent(_deviceConnectionState, string.Format("Sctu initialization error: {0}", ex.Message)); } return(_deviceConnectionState); }