Я использую 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;
}
}
Как бы я получить его, чтобы я мог иметь несколько концентраторов с несколькими уникальными потоками данных?
Любая помощь будет высоко ценится.
Большое спасибо,
Бен.