Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Системы контроля состояния подсистем танкера, с использованием современной элементной базы.rtf
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
37.82 Mб
Скачать

Приложения Приложение 1

Листинг MatLab-программы для моделирования сигналов с датчиков.

F = 500;

Ngroup = 21;

Nvar =9;

mox = 21;

sigma = sqrt( 0.01 * (9+5)^2 );

Apom = 20*mox;

Akz = 25*mox;

Aobr = 0;

x = mox + sigma*randn(1, F);

D0 = cov(x);

subplot(5, 1, 1)

plot(x)

grid on

ylim([mox-sigma*10 mox+sigma*10])

text(1, mox-sigma*10+1, strcat('Дисперсия погрешности измерений:', num2str(D0)))

legend('Сигнал датчика');

pomnum = F/50; %кол-во импульсных помех с амплитудой Apom

for m = 1:pomnum

t = round(3 + (F-3) * rand(1)); %индекс элемента массива, где будет помеха. Лежит в интервале [3;F];

x(t) = Apom;

end

t = round(3 + (F-5) * rand(1)); %индекс элемента массива, где будет короткое замыкание. Лежит в интервале [3;F-2];

x(t) = Akz;

x(t+1) = Akz;

x(t+2) = Akz;

t = round(3 + (F-5) * rand(1)); %индекс элемента массива, где будет обрыв. Лежит в интервале [3;F-2];

x(t) = Aobr;

x(t+1) = Aobr;

x(t+2) = Aobr;

%D1 = cov(x);

subplot(5, 1, 2)

plot(x)

grid on

ylim([mox-sigma*10 mox+sigma*10])

legend('Сигнал в канале измерений');

%проверка на достоверность

errorcount = 0; %счетчик нарушений

j = 3;

XB = mox + (Nvar+2);

XH = mox - (Nvar+2);

last = x(1); %последнее достоверное значение

for k = j:F

if x(k)<XH | x(k)>XB

errorcount = errorcount + 1;

if errorcount == 3

razn = x(k)-x(k-j);

if razn < 0

obr = k;

else

kz = k;

end

errorcount = 0; %так как программа продолжает выполнение

x(k)=last;

else

x(k) = last;

end

else

errorcount = 0;

last = x(k);

end

end

D2 = cov(x);

subplot(5, 1, 3)

plot(x)

grid on

ylim([mox-sigma*10 mox+sigma*10])

text(1, mox-sigma*10+1, strcat('Дисперсия:', num2str(D2), '; КЗ на отсчете:', int2str(kz), '; Обрыв в канале на отсчете:', int2str(obr)))

legend('Сигнал после проверки на достоверность');

% Algoritmi sglajivaniya

Nzad = 10;

sigmazad = 0.00001;

% Sglajivaniye "skolzashego srednego"

M = ceil(Nzad);

for t = 1:M

xc(t) = x(t);

end

for k = M:F

sum = 0;

for j = k-M+1:k-M+M

sum = sum + x(j);

end

sum = sum / M;

xc(k) = sum;

end

xcd = xc(M:F);

D3 = cov(xcd);

subplot(5, 1, 4)

plot(xc)

grid on

ylim([mox-sigma*10 mox+sigma*10])

text(1, mox-sigma*10+1, strcat('Дисперсия:', num2str(D3), '; Коэфф. ослабления :', num2str(D2/D3), '; Тск.ср.=', int2str(M), '*Tопр'))

legend('Скользящее сглаживание');

% Exponencialnoye sglajivaniye

alpha = 2/(Nzad+1);

xe(1)=alpha*x(1);

for k = 2:F

xe(k) = xe(k-1) + alpha*(x(k)-xe(k-1));

end

Teks = 0.5*log(sigmazad)/log(1-alpha);

xed = xe(ceil(Teks):F);

D4 = cov(xed);

subplot(5, 1, 5)

plot(xe)

grid on

ylim([mox-sigma*10 mox+sigma*10])

text(1, mox-sigma*10+1, strcat('Дисперсия:', num2str(D4), '; Коэфф. ослабления :', num2str(D2/D4), '; Тэкс.сгл.=', num2str(Teks), '*Tопр'))

legend('Экспоненциальное сглаживание');

Программный модуль для реализации функции аналогового ввода сигналов от датчиков.

//измерение температуры

begin

open "com1: 9600, n, 8, 1, rs, cs, cd, ds" as #1;

writeln "конфигурация, ждите";

cmd: = "%01020е0600";

writeln #1,cmd;

result:=input(4,#1);

temp:=mid(result,1,3);

if temp<>"102" then goto ent;

delay = 7 goto dela;

vver:

cmd:= "@02lo+140.00";

writeln #1,cmd;

results:=inputs (4, #1);

temps:= mto(result,1,3);

if tempo"102" then goto vver;

delay:= 2 goto dela;

cmd:= "@02еам";

vver2:

writeln #1,cmd;

results:=inputs (4, #1);

temp:= mid(temp,1,3);

if temp<>"102" then goto vver2

delay = 2: goto dela

writeln " температура: °";

writeln " *контрольная температура:";

writeln " * сигнал управления:";

writeln " текущее время:";

while true do

begin

cmd:= "#02";

writeln #1,cmd;

temps;= inputs (9, #1);

temps:= mid(temp,2,7);

writeln temps;

writeln times;

cmos:= "@02d1";

writeln #1,cmd;

alarms:= inputs (9, #1);

alarms:= mid( alarm,6,1);

if (alarms ="2" or alarms ="3") then writeln "on"

else writeln "off";

end;

dela:

//"процедура временной задержки"

begin

start:= int(timer)

while delay>-1 do

begin

if (startoint(timer)) then delay = delay-1

end;

end;

end;