PDA

Просмотр полной версии : Медианный фильтр, ФБ C#



Igor V
03.04.2019, 07:24
Добрый день!

Разработал медианный фильтр, проверил его алгоритм в Matlab,
однако при переносе в ФБ C# возникает проблемы при работе - спустя несколько значений фильтр перестает работать.

Вот пример:

using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using FB.FBAttributes;
using System.Linq;

[FBRetain]
public partial class ФБ : ScriptBase
{
public static int count=0;//счетчик
public static int order=15;//порядок-количество чисел в окне
public static double data;
public bool flag=false;
public double temp=0;
public double[] buffer=new double[15];// size = order
public int index=8;
public int num=0;

public override void Start()
{
for(int i=0;i<order;i++)
{
buffer[i]=0;
}
}
public override void Execute()
{
if(flag==true)
{
for(int i=0;i<order-1;i++)//0 1
{
buffer[i]=buffer[i+1];
}
if(u.HasValue)
{
buffer[order-1]=Convert.ToDouble(u);
}
sort();
data=buffer[index];// buffer median val
}

if((count==order)&&(flag==false))
{
flag=true;
sort();
data=buffer[index];// buffer median val
}

if ((count<order)&&(flag==false))
{
if(u.HasValue)
{
buffer[count]=Convert.ToDouble(u);
count++;
}
}


y=data;
num++;
Параметр1=num;

}// end of execute

public void sort()
{
double temp=0;
for(int i=0;i<order-1;i++)//0 1
{
if(buffer[i]>buffer[i+1])
{
temp=buffer[i+1];
buffer[i+1]=buffer[i];
buffer[i]=temp;
}
;
}
}
} // end of FB

Кто сталкивался с такой проблемой? Опрос ФБ настроен на изменение входов.

SCADAMaster
03.04.2019, 09:30
Возможно происходит падение скрипта - посмотрите нет ли сообщений в окне, открываемом красной кнопкой в правом нижнем углу скады.
Также вы можете поставить Visuyal Studio и подцепиться отладчиком:
https://insat.ru/blog/fb-skript-c-i-ego-ispolzovanie-v-masterscada-otladka-skriptov/

Ну а сортировка... Посмотрите коллекции List и сортировку методом Sort

Igor V
06.04.2019, 10:14
Возможно происходит падение скрипта - посмотрите нет ли сообщений в окне, открываемом красной кнопкой в правом нижнем углу скады.
Также вы можете поставить Visuyal Studio и подцепиться отладчиком:
https://insat.ru/blog/fb-skript-c-i-ego-ispolzovanie-v-masterscada-otladka-skriptov/

Ну а сортировка... Посмотрите коллекции List и сортировку методом Sort

Проверил все что вы предложили, запускал в VS в отладчике, менял массив на List. Значения в листе не обновляются по неизвестной причине. Рабочего результата так и не получил, значения перестают передаваться на выход спустя какое то время после запуска.

Каким образом еще можно реализовать фильтр от импульсных помех в MasterSCADA ? (фильтр 1-го порядка не подходит)

SCADAMaster
06.04.2019, 14:16
значения перестают передаваться на выход спустя какое то время после запуска.

Как они перестают передаваться? Вы пишите значение на выход, а на выходе их нет?
Ну такого же не может быть. Пройдитесь по шагам в отладчике - посмотрите что происходит.


Проверил все что вы предложили, запускал в VS в отладчике, менял массив на List. Значения в листе не обновляются по неизвестной причине. Рабочего результата так и не получил, значения перестают передаваться на выход спустя какое то время после запуска.

Пришлите последнюю версию проекта.

Igor V
08.04.2019, 07:40
Как они перестают передаваться? Вы пишите значение на выход, а на выходе их нет?
Ну такого же не может быть. Пройдитесь по шагам в отладчике - посмотрите что происходит.


Пришлите последнюю версию проекта.

Приложил последнюю версию проекта.

SCADAMaster
08.04.2019, 09:16
Вот здесь ошибка:
for(int i=0;i<order-1;i++)
{
buffer[i]=buffer[i+1];
}
Посмотрите например эту тему
http://www.cyberforum.ru/csharp-beginners/thread1294539.html
И смотрите под отладчиком что происходит. Остановилось выполнение - точку останова и смотрите. Ошибка находится у вас на раз.

Igor V
08.04.2019, 10:47
Вот здесь ошибка:
for(int i=0;i<order-1;i++)
{
buffer[i]=buffer[i+1];
}
Посмотрите например эту тему
http://www.cyberforum.ru/csharp-beginners/thread1294539.html
И смотрите под отладчиком что происходит. Остановилось выполнение - точку останова и смотрите. Ошибка находится у вас на раз.

Спасибо за ответ. Извиняюсь, но не могли бы вы объяснить в чем здесь ошибка? Выхода за предел массива нет. Предложенную тему посмотрел, там похожий принцип, только значения сдвигаются вправо.

SCADAMaster
08.04.2019, 11:43
Когда значения доходят до максимума, у вас массив время заполняется последними максимальными значениями, а не новыми.
Встаньте отладчиком, и когда значения перестанут обновляться поставьте точку останова - сами все увидите