Инструменты пользователя

Инструменты сайта


filt

Это старая версия документа!


Работа с фильтрами

В системах автоматизации зачастую приходится работать с аналоговыми величинами - показаниями каких либо датчиков. Показания таких датчиков, сколь они качественными ни были, не могут быть идеальными, всегда присутствует небольшая погрешность, из-за чего выдаваемые показания всегда колеблются вокруг истинного значения. Если колебания незначительные, то их можно сгладить, получив значения, максимально приближенные к истинным. Однако такие колебания могут быть достаточно значительными, вплоть до того, что становится сложно определить истинные показания совсем. Такая ситуация может возникнуть при многих факторах, таких как некачественные датчики, плохой монтаж, нестабильное питание и тд. Во всех подобных ситуациях, если не удается устранить первопричину колебаний, используют алгоритмы фильтрации сигнала. Важно понимать, что любая фильтрация - это искажение исходного сигнала, и она может негативно сказаться на работе системы автоматизации. В случае небольших колебаний, ее использование вполне оправдано, но если колебания значительные, нужно стараться избавиться от их первопричины, фильтрацию использовать как последний шанс исправить ситуацию. Так же фильтрация сигнала, в зависимости от ее глубины, затормаживает время получения истинного сигнала, что так же негативно сказывается на времени реакции систем автоматизации, которые работают по показаниям таких датчиков. Тем не менее, такие ситуации, где другого варианта, кроме как использовать фильтры, встречаются достаточно часто, в связи с этим системы автоматизации обязательно должны поддерживать алгоритмы фильтрации. Библиотека функций скриптов DevelSCADA поддерживает работу с популярными алгоритмами фильтрации данных, такими как:

  • среднеарифметический;
  • медианный;
  • огибающий (по минимальному и максимальному значению).

Рассмотрим несколько примеров для работы с данными алгоритмами. Для удобства восприятия данных, будем их отображать в виде графика. Для этого разместим в рабочей области элемент График данных. В свойстве Конфигурация зададим ему следующие настройки:

{
	type: 'line',
	data: {
		labels: [],
		datasets: [
			{
				label: 'Исходный',
				borderWidth: 1,
				borderColor: '#FF4444',
				tension: 0,
				data: [],
				yAxisID: 'sig1',
			},
			{
				label: 'Обработанный',
				borderWidth: 4,
				borderColor: '#8888FF',
				tension: 0,
				data: [],
				yAxisID: 'sig2',
			},
		],
	},
	options: {
		maintainAspectRatio: false,
		scales: {
			x: {},
			sig1: {
				title: {
					display: true,
					text: 'Исходный',
				},
				ticks: {
					color: '#FF4444',
				},
				position: 'left',
				beginAtZero: true,
				min: 0,
				max: 100,
			},
			sig2: {
				title: {
					display: true,
					text: 'Обработанный',
				},
				ticks: {
					color: '#8888FF',
				},
				position: 'left',
				beginAtZero: true,
				min: 0,
				max: 100,
			},
		},
		elements: {
			point: {
				radius: 0,
			},
		},
		plugins: {
			legend: {
				display: false,
			},
		},
	},
}

В результате получим элемент графика, на котором будем отображать две кривые: исходный сигнал и обработанный фильтром.

Далее в свойстве экрана, в событии Запуск зададим скрипт, который будет создавать значения, якобы полученные с нашего датчика, и над которыми будем проводить эксперименты. Для примера выведем обычную синусоиду.

async function main() {
    let pointList = []; // список точек графика
    for (let i = 0; i < 300; i++) {
 
        // создаем точки в рабочей области графика
        let val = Math.sin(i / 30) * 40 + 50;
 
        // пока выведем точки только исходного графика
	pointList.push([ i, val]);
    }
 
    // выведем созданный список точек на график
    await ds.objCall('График данных 1', 'addPointList', pointList);
}

После чего запустим проект на исполнение, и увидим результат работы нашего испытательного стенда.

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

filt.1772184621.txt.gz · Последнее изменение: 2026/02/27 12:30 — root