C # SignalR - выход одного хаба влияет на выход другого. - PullRequest
0 голосов
/ 19 сентября 2018

Я использую SignalR для создания графиков волн и БПФ в режиме реального времени для анализа вибрационного мониторинга.Первоначальная идея состоит в том, чтобы отображать эти графики в реальном времени в среде ASP.NET, чтобы к этим актуальным тенденциям можно было обращаться через ряд веб-совместимых устройств, в конечном итоге перейдя к методам комплексной обработки событий и интеллектуального анализа данных с использованием машинного обучения.для более совершенных методов анализа.В настоящее время я использую генераторы случайных чисел в коде C # для имитации входящих потоков данных.У меня есть два центра, один для построения формы необработанной синусоидальной волны, а другой для построения быстрого преобразования Фурье.Оба они построены с использованием Plotly.JS.Однако, когда я пытаюсь получить доступ к обоим концентраторам одновременно, выходные данные одного концентратора (а именно FFT) перезаписывают выходные данные другого (необработанные синусоидальные данные).Ниже приведен мой код для концентраторов и javascript, который обращается к концентраторам на сервере с клиента:

Javascript:

function drawGraph(graph, graphType) {

Plotly.plot(graph, [{
    y: [1, 2, 3].map(rand),
    mode: graphType,
    line: { color: getRandomColor() }
}, {
    y: [1, 2, 3].map(rand),
    mode: graphType,
    line: { color: getRandomColor() }
    }], {
        xaxis: {
            autorange: true 
        }
    });


vibrationGraph(graph); 
generateFFT();
$.connection.hub.start(); 

}

function vibrationGraph(graph) {

    var systmr = $.connection.systemTime;

    systmr.client.logmessage = function (msg) {
        Plotly.extendTraces(graph, {
            y: [[msg], [msg * rand()]]
        }, [0, 1])
    };

}

function generateFFT() {

    var fastFourier = $.connection.fastFourier;

    fastFourier.client.displayResult = function (output) {

        var data = [
            {
                x: ['x'],
                y: [output],
                type: 'bar'
            }
        ];

        Plotly.newPlot('FFTGraph', data);
    }

} 

C # Код сзади:

public class SystemTime : Hub
    {

        public static readonly System.Timers.Timer _Timer = new System.Timers.Timer();

        static SystemTime()
        {
            Random rnd = new Random();
            generateWaveForm(rnd.Next(60, 300));
            _Timer.Interval = 500;
            _Timer.Elapsed += GenerateFFT;
            _Timer.Start();
        }

        static int count = 0;
        public static Complex[] sampleList = new Complex[1000];



        static void GenerateFFT(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (count < 1000)
            {
                var hub = GlobalHost.ConnectionManager.GetHubContext("SystemTime");
                hub.Clients.All.logMessage(sampleList[count].Real); 
                count++;
            }


        }

        static void generateWaveForm(double input)
        {

            double[] fundamental = Generate.Sinusoidal(1000, 2000, input, 10.0);

            for (int i = 0; i < sampleList.Length; i++)
            {
                sampleList[i] = new Complex(fundamental[i], 0); 
            }

        }

    }

public class FastFourier : Hub
{
    public static readonly System.Timers.Timer _Timer = new System.Timers.Timer();
    static int count = 0;
    static int numSamples = 1000;
    static int sampleRate = 2000;

    static FastFourier()
    {
        _Timer.Interval = 500;
        _Timer.Elapsed += GenerateWave;
        _Timer.Start();
    }

    static void GenerateWave(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (count < 1000)
        {
            var hub = GlobalHost.ConnectionManager.GetHubContext("FastFourier");
            //hub.Clients.All.logMessage(generateFFTData(count));
            hub.Clients.All.displayResult(generateFFTData(count));
            count++; 
        }


    }



    static double generateFFTData(int index)
    {
        Fourier.Forward(SystemTime.sampleList, FourierOptions.NoScaling);



        double mag = (2.0 / numSamples) * (Math.Abs(Math.Sqrt(Math.Pow(SystemTime.sampleList[count].Real, 2) +
                Math.Pow(SystemTime.sampleList[count].Imaginary, 2))));


        //double hzPerSample = 2000 / 1000;

        return mag;


        }
    }

Как бы я получить его, чтобы я мог иметь несколько концентраторов с несколькими уникальными потоками данных?

Любая помощь будет высоко ценится.

Большое спасибо,

Бен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...