Розробка програмного субмодуля контролю струму ЕГП



 

Розробка алгоритму контролю струму ЕГП

 

Програмний модуль контролю струму ЕГП входить до складу програмного забезпечення швидкодіючого контуру керування. Його призначенням є безупинний контроль значення струму ЕГП. Оскільки струм ЕГП є вихідним аналоговим сигналом, то для його контролю необхідно реалізувати схему зворотного зв'язку між виходом каналу ЕГП і обчислювальною машиною.

 

 


Рис. 5.1 Блок-схема алгоритму контролю струму ЕГП

 

Алгоритм контролю струму ЕГП повинен забезпечувати відключення каналу при появі струму, непідтвердженого вхідними вимогами, такими як спрацювання каналу релейного форсування, диференціатора, попереднього захисту блоку (команда РТА 3).

Алгоритм контролю струму ЕГП складається з наступних кроків:

1. Виробляється перевірка контрольного струму ЕГП на знак. Значення знаку струму ЕГП зберігається в інформаційному масиві «DUOTC», порядковий номер комірки в масиві – «3», тобто адреса комірки позначається як «DOUTC+3». У випадку позитивного знака в дану комірку буде записаний код «00H», у випадку негативного знака буде записаний код «0FFH».

2. Якщо знак струму ЕГП позитивний, то порівнюємо його з уставкою «+75 МА», у випадку негативного знака робимо порівняння з уставкою «-75 МА». Значення струму ЕГП зберігається в інформаційному масиві «DUOTC» за адресою «DOUTC+2».

3. У випадку перевищення струмом значення уставки, виробляється перевірка чим викликана поява струму ЕГП. Перевірка виробляється зчитуванням з інформаційних масивів кодів, що сигналізують про спрацювання команд РФ, ДИФ, РТА3. Коди для релейного форсування і диференціатора зберігаються в інформаційному масиві «IC», по адресах «IC+84» для «РФ» і «IC+12» для «ДИФ» відповідно. Код для команди «РТА3» зберігається у інформаційному масиві «SEC» за адресою «SEC+12». Ознакою спрацьовування каналу є код «0FFH», у противному випадку в комірці буде знаходитися код «00H».

Перевірка виробляється в наступному порядку:

а) перевіряється спрацювання каналу «релейної форсировки»;

б) перевіряється поява режиму «РОТА3»;

в) перевіряється спрацьовування каналу «диференціатора».

4. Якщо спрацював, який-небудь з каналів, то виробляється запис у масив найважливіших параметрів турбіни, таких як потужність турбіни, частота обертання, тиск свіжої пари в головному паровому колекторі і т.д. При цьому також визначається величина неузгодженості (розбіжності) між струмом ЕГП і контрольним струмом ЕГП. У випадку розбіжності вище визначеного значення, відключається канал ЕГП (якщо машина ведуча).

5. Якщо поява струму ЕГП не викликана спрацьовуванням РФ, ДИФ, РТА3, то відключається канал ЕГП записом в інформаційний масив «IC» коду «0FFH» за адресою «IC+132».

Програма написана мовою асемблера, тому що дана мова програмування дозволяє генерувати високоефективний код при мінімальному його розмірі.

 

Лістінг програми контролю струму ЕГП

 

На основі вище приведеного алгоритму розроблена блок-схема самої програми (рис. 5.2).

Рисунок 5.2 Блок-схема програми контролю струму ЕГП

 

Лістінг програми контролю струму ЕГП приведений в таблиці 5.1

 

Таблиця 5.1 Лістінг програми контролю струму ЕГП

Мітка Оператор Операнд Коментар
CONTMP: LDA DOUTC+3 Зчитуємо знак струму ЕГП
  RAL   Перевіряємо чи позитивний знак струму ЕГП
  LC M1 Якщо негативний, то переходимо до порівняння струму з уставкою «-50 МА»
  LHLD DOUTC+2 Завантажуємо в реєстрову пару «HL» значення контрольного струму ЕГП
  LXI D, 20H Завантажуємо в реєстрову пару «HL» значення уставки рівне «+50 МА»
  CALL RAZN2F Порівнюємо значення контрольного струму з уставкою, викликом підпрограми порівняння
  JNC M2 Якщо значення струму більше уставки, то переходимо до аналізу причини появи струму
  JMP M3 Інакше переходимо до підпрограми підготовки масиву для запису параметрів
M1: LHLD DOUTC+2 Завантажуємо в реєстрову пару «HL» значення контрольного струму ЕГП
  LXI D, 0FFE0H Завантажуємо в реєстрову пару «HL» значення уставки рівне «-50 МА»
  CALL RAZN2F Порівнюємо значення контрольного струму з уставкою, викликом підпрограми порівняння
  JC M2 Якщо значення струму більше уставки, то переходимо до аналізу причини появи струму
  JMP M3 Інакше переходимо до підпрограми підготовки масиву для запису параметрів
M2; LDA IC+84

Перевірка роботи каналу РФ

  CPI 0FFH
  JZ 01F5AH Якщо РФ, то переходимо до підпрограми запису параметрів в масив
  LDA SEC+12

Перевірка роботи каналу РТА3

  CPI 0FFH
  JZ 01F5AH Якщо РТА3, то переходимо до підпрограми запису параметрів в масив
  LD IC+12

Перевірка роботи каналу ДИФ

  CPI 0FFH
  JZ 01F5AH Якщо ДИФ, то переходимо до підпрограми запису параметрів в масив
  JMP 01F4DH Інакше переходимо до підпрограми відключення каналу ЕГП
M4: LDA FLAGMP Завантажуємо в регістр «А» лічильник циклу запису параметрів в масив
  CPI 05H Перевіряємо, чи досяг лічильник значення «5»
  JC M5 Якщо досяг, то переходимо до підготовки масиву для запису параметрів
  LHLD ADRTEK Запам'ятовуємо в пам'яті адрес масиву параметрів
  LDA DAN02+0 Зчитуємо значення потужності турбіни з масиву «DAN02»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DAN02+1 Зчитуємо значення потужності турбіни з масиву «DAN02»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DANOUT+4 Зчитуємо значення частоти турбіни з масиву «DANOUT»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DANOUT+5 Зчитуємо значення частоти турбіни з масиву «DANOUT»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DAN01+0 Зчитуємо значення тиску свіжої пари в ЦПК із масиву «DAN01»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DAN01+1 Зчитуємо значення тиску свіжої пари в ЦПК із масиву «DAN01»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DAN01+36 Зчитуємо значення тиску керуючого масла з масиву «DAN01»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DAN01+37 Зчитуємо значення тиску керуючого масла з масиву «DAN01»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DOUTC+2 Зчитуємо значення струму ЕГП з масиву «DOUTC»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DOUTC+3 Зчитуємо значення струму ЕГП з масиву «DOUTC»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DAN02+2 Зчитуємо значення контрольного струму ЕГП з масиву «DAN02»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  LDA DAN02+3 Зчитуємо значення контрольного струму ЕГП з масиву «DAN02»
  MOV M, A Заносимо в «наш» масив
  INX H Збільшуємо адресу масиву на одиницю
  INX H Збільшуємо адресу масиву на одиницю
  INX H Збільшуємо адресу масиву на одиницю
  LDA IC+84 Зчитуємо з масиву «IC» ознаку спрацювання релейної форсировки
  ANI 01 Виділяємо нульовий біт шляхом логічного множення
  MOV B, A Зберігаємо число в регістрі «B»
  LDA SEC+12 Зчитуємо з масиву «SEC» ознаку спрацювання РТА3
  ANI 02 Виділяємо перший біт шляхом логічного множення
  ORA B Логічно сумуємо з регістром B
  MOV B, A Зберігаємо число в регістрі «B»
  LDA DIN+13 Зчитуємо з масиву «DIN» ознаку спрацювання диференціатора
  ANI 04 Виділяємо другий біт шляхом логічного множення
  ORA B Логічно сумуємо з регістром B
  MOV M, A Записуємо в масив зборку дискретних команд (РФ, РТА3, ДИФ)
  INX H Збільшуємо адресу масиву на одиницю
  INX H Збільшуємо адресу масиву на одиницю
  SHLD ADRTEK Запам'ятовуємо поточний адрес (індекс) масиву в комірці пам'яті
  XRA A Обнуляємо лічильник числа циклів запису параметрів в масив
  STA FLAGMP Зберігаємо його в комірці пам'яті
  JMP M6 Переходимо до визначення ведучої ЕОМ і обчислення неузгодженості між контрольним струмом і струмом ЕГП
M5: LXI H, FLAGMP Заносимо в реєстрову пару «HL» адрес лічильника числа повторень циклу запису параметрів у масив
  INR M Збільшуємо значення лічильника по цій адресі
  LHLD ADRTEK Зчитуємо поточний адрес індексування масиву параметрів
  LXI D, 0AC00H Заносимо в реєстрову пару «DE» адресу закінчення масиву параметрів
  CALL RAZN2F Перевіряємо, чи досягнутий індекс кінця масиву
  JC M6 Якщо так, то переходимо до обчислення значення неузгодженості, інакше
  XRA A обнуляємо лічильник числа повторень циклу запису параметрів у масив
  STA FLAGMP запам'ятовуємо його в комірці пам'яті
  JMP M6 і переходимо до обчислення значення неузгодженості
M3: MVI A, 5 Заносимо число в лічильник числа повторень циклу запису параметрів
  STA FLAGMP Запам'ятовуємо його в пам'яті
  LXI H, 0A800H Заносимо в реєстрову пару «HL» адресу початку масиву параметрів
  JMP 01F68H Переходимо до запису параметрів
M6: IN 0B8H Перевіряємо чи є дана ЕОМ ведучою (основною)
  RAR   Якщо резервна,
  RNC   то виходимо в основну програму, інакше переходимо до обчислення значення неузгодженості
  LHLD DOUTC+2 Завантажуємо в реєстрову пару «HL» значення струму ЕГП
  XCHG   Змінюємо місцями вміст регістрів «HL» і «DE»
  LHLD DAN02+2 Завантажуємо в реєстрову пару «HL» значення контрольного струму ЕГП
  DAD H Обчислюємо
  DAD H величину
  DAD D неузгодженості
  MOV A, H Перевіряємо
  RAL   «характер» неузгодженості
  JNC M7 Якщо неузгодженість позитивна, то безпосередньо переходимо до порівняння величини неузгодженості, інакше
  CALL INVERC приводимо значення неузгодженості до позитивного числа, перетворенням коду в додатковий за допомогою виклику підпрограми перетворення в додатковий код
M7: MOV A, H Перевіряємо чи неузгоджені між собою значення струму ЕГП і контрольного струму ЕГП
  CPI 00 Якщо так,
  JNZ M8 то викликаємо підпрограму відключення каналу ЕГП
  MOV A, L Якщо ні,
  CPI 40H то
  JC M10 переходимо до підпрограми обнулення лічильника числа входжень у програму
M8: LDA FLAG+20 Завантажуємо в регістр «А» лічильник числа входжень у програму
  CPI 6 Якщо число входжень у програму менше ніж «6», то
  JC M9 переходимо до підпрограми збільшення лічильника числа входжень у програму на «1»
  MVI A, 0FFH Заносимо в регістр «А» код відключення каналу ЕГП
  STA IC+132 Записуємо в масив код для відключення каналу ЕГП
  RET   Повертаємося в основну програму
M9: INR A Збільшуємо на одиницю лічильник числа входжень в програму
  STA FLAG+20H Запам'ятовуємо лічильник у масиві
  RET   Повертаємося в основну програму
M10: XRA A Обнуляємо лічильник числа входжень в програму
  STA FLAG+20H Запам'ятовуємо лічильник у масиві
  RET   Повертаємося в основну програму
  PUBLIC CONTP Кінець
  END   основної програми
  NAME RAZN2F Підпрограма вирахування двобайтних чисел і їхнє порівняння з виробленням ознак. Входи: HL – зменшуване; DE – від'ємник. Виходи: HL – різниця (HL – DE); PSW – ознаки (HL=DE Z=1) (HL>DE Carry=0) (HL<DE Carry=1)
  CSEG    
RAZN2F: MOV A, D Заносимо в регістр «А» старший байт «зменшуваного»
  CMA   Обчислюємо «зворотній код»
  MOV D, A Повертаємо в регістр «D» старший байт від'ємника в «зворотному коді»
  MOV A, E Заносимо в регістр «А» молодший байт «зменшуваного»
  CMA   Обчислюємо «зворотній код»
  MOV E, A Повертаємо в регістр «E» молодший байт «віднімається» у «зворотному коді»
  INX D Збільшуємо «від'ємник» на «1», одержуючи в такий спосіб «додатковий код» від'ємника
  DAD D Підсумовуємо «зменшуване» з «відємником» в «додатковому коді», що рівносильно їх відніманню у прямому коді. Результат віднімання в регістрі «HL»
  MOV A, H Заносимо в регістр «А» старший байт результату і логічно підсумовуємо
  ORA L з молодшим байтом результату. Якщо результат був «0» (два числа рівні), то прапор «Z» (прапор «нуля») встановиться в «1»
  MOV A, H Заносимо в регістр «А» старший байт результату
  RAL   і зсуваємо на один розряд уліво. Якщо «зменшуване» було більше від'ємника, то прапор «Carry» (прапор «переносу») встановиться в «0», інакше встановиться в «1»
  RET   Повертаємося в точку виклику підпрограми
  PUBLIC RAZN2F Кінець
  END   підпрограми
  NAME INVERC Підпрограма представлення двобайтного числа в додатковому коді Входи: HL – число; Виходи: HL – число в додатковому коді
  CSEG    
RAZN2F: MOV A, H Заносимо в регістр «А» старший байт числа
  CMA   Обчислюємо «зворотній код»
  MOV H, A Повертаємо в регістр «H» старший байт числа в «зворотному коді»
  MOV A, L Заносимо в регістр «А» молодший байт числа
  CMA   Обчислюємо «зворотній код»
  MOV L, A Повертаємо в регістр «L» молодший байт числа в «зворотному коді»
  INX H Збільшуємо число в «зворотному коді» на «1», одержуючи в такий спосіб «додатковий код» від'ємника
  RET   Повертаємося в точку виклику підпрограми
  PUBLIC INVERC Кінець
  END   Підпрограми

 


Дата добавления: 2019-09-02; просмотров: 103; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!