Ejemplo n.º 1
0
 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);
     });
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        internal void SCTUWaitReady()
        {
            //после импульса тока SCTU довольно долго заряжает свои батареи конденсаторов
            //чтобы иметь возможность опустить пресс сразу после импульса тока - ожидание перехода SCTU в состояние готовности вынесено из реализации измерения в данную реализацию
            if (_isSctuEmulation)
            {
                _deviseState = SctuHwState.Ready;
                FiredSctuEvent(_deviseState, _testResults);

                return;
            }
            else
            {
                SctuHwState state = WaitForReady();
                FiredSctuEvent(state, _testResults);
            }
        }
Ejemplo n.º 4
0
        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;
            }
        }
Ejemplo n.º 5
0
 public void PostSctuEvent(SctuHwState state, SctuTestResults results)
 {
     EnumerateClients(client => client.SctuHandler(state, results));
 }
Ejemplo n.º 6
0
        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;
            }
        }
Ejemplo n.º 7
0
        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);
        }