ГНЦ ИФВЭ
ОУ У-70
Система Управления комплекса У-70  

Программирование на Верхнем Уровне СУ

Библиотеки программных объектов СУ

Пример диагностической измерительной ПП

Текст диагностической измерительной ПП (Супервизора), которая выполняет следующие функции:

контроль состояния аппаратно-программного комплекса:
 
Контроллер Оборудования (КО) включен или выключен;
 
состояние MIL 1553B;
 
состояние БД ССУДА в КО;
 
функционирование Общей Таймерной Системы;
 
работоспособность интерфейсной электроники;
 
работоспособность программы в КО;
 
состояние процессов управления и измерения в КО;
чтение и обработка измеренных значений токов источников питания.

ПП использует следующие таблицы БД ССУДА:

Имя таблицы Тип таблицы Тип
параметров
Кол.
плоскостей
Кол.
строк
Кол.
столбцов
Номер копии
B_PP_MEAS  PASSPORT Физические 1 5 стандарт 1
B_PD_MEAS DATA Физические 33 20 5 1
B_TP_MEAS PASSPORT Технологи-
ческие
2 5 стандарт 1
B_TD_MEAS DATA Технологи-
ческие
1 20 5 1, 3
B_TD_MEAS1 DATA Технологи-
ческие
30 20 5 1
B_TP_ALARM PASSPORT Технологи-
ческие
8 2 стандарт 1
B_TD_ALARM DATA Технологи-
ческие
8 16 2 1, 3
U70_TP_RESIDENT PASSPORT Технологи-
ческие
5 32 стандарт 1
U70_TD_RESIDENT DATA Технологи-
ческие
5 32 32 1
U70_TM_RESIDENT MAIN Технологи-
ческие
5 32 стандарт для 32 параметров 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "/prg/prg.h"
#include "/prg/prgclass.h"
#include "/prg/prgclasv.h"
    
/***************************************************************************
*/
class AppMeas : public ApplicationMeasure
{
  //-----------------------физические параметры - коэффициенты преобразования

    class classPDtable PD_coef_tbl;    // таблица коэффициентов преобразования
    double *pd_coef;                   // коэффициенты преобразования кода в ток

  //---------------------- физические измеряемые параметры - токи источников

    class classPPmeasure *PP_meas_tbl; // таблица описаний
    class classPDmeasure *PD_meas_tbl; // таблица значений
    double *pd_meas;                   // значения измеренных токов источников
 
  //------- технологические измеряемые параметры - коды токов источников

    class classTPmeasure *TP_meas_tbl; // таблица описаний
    class classTDmeasure *TD_meas_tbl; // таблица значений
    unsigned short int *td_meas;       // значения измеренных кодов аппаратуры

  //------- методы

    int FunIni( int narg, char *sarg[] );
    void FunEnd( void );
    int FunModel( void );
    int FunMake( int fl_cntr_active, int fl_cntr_ready, int fl_cntr_error,
                 int fl_meas_active, int fl_meas_ready, int fl_meas_error );
};
/***************************************************************************
создание и нициализация объектов
*/
int AppMeas::FunIni( int narg, char *sarg[] )
{
  //-----------------------физические параметры - коэффициенты преобразования

  //..... инициализация объекта
  if (PD_coef_tbl.Ini( "B_PD_COEF", // имя таблицы
	                1,          // номер начального столбца
			1,          // номер конечного столбца
	                20,         // кол. строк
	                0,          // нет редактирования
	                1 )         // горизонтальное расположение
	              ) return 1;
  if (!(pd_coef=(double*)PD_coef_tbl.GetAdrParam( 1 ))) goto Merr;

  //---------------------- физические измеряемые параметры - токи источников

  //..... создание объектов
  if (!(PP_meas_tbl=NewPPmeasure())) return 1;
  if (!(PD_meas_tbl=NewPDmeasure())) return 1;
//  PP_meas_tbl->SetTrace( 1 );
//  PD_meas_tbl->SetTrace( 1 );
  if (AdrPar.SetPar( PP_meas_tbl, PD_meas_tbl ) == -1) return 1; // парный
  
  //..... инициализация объектов
  if (PP_meas_tbl->Ini( "B_PD_MEAS", // имя таблицы
			1,           // номер начальной строки
			5 )          // номер конечной строки
		      ) return 1;
  if (PD_meas_tbl->Ini( "B_PD_MEAS", // имя таблицы
	                1,           // номер начального столбца
			5,           // номер конечного столбца
	                20,          // кол. строк
	                1 )          // горизонтальное расположение
	              ) return 1;
 
  //------- технологические измеряемые параметры - коды токов источников

  //..... создание объектов
  if (!(TP_meas_tbl=NewTPmeasure())) return 1;
  if (!(TD_meas_tbl=NewTDmeasure())) return 1;
//  TP_meas_tbl->SetTrace( 1 );
//  TD_meas_tbl->SetTrace( 1 );
  if (AdrPar.SetPar( TP_meas_tbl, TD_meas_tbl ) == -1) return 1; // парный

  //..... инициализация объектов
  if (TP_meas_tbl->Ini( "B_TP_MEAS", // имя таблицы
			1,           // номер начальной строки
			5 )          // номер конечной строки
		      ) return 1;
  if (TD_meas_tbl->Ini( "B_TD_MEAS", // имя таблицы
	                1,           // номер начального столбца
			5,           // номер конечного столбца
			1,           // номер начальной строки
			20,          // номер конечной строки
	                1 )          // горизонтальное расположение
	              ) return 1;
  //------------------------------------------------------------------- end
  if (PrgDB_cmt()) PrgFile_WriteAlarm( "AppMeas::FunIni: Ok\n" );
  return 0;
Merr:
  prg_err=RC_ERLOAD;
  if (PrgDB_cmt())
    PrgFile_WriteAlarm( "AppMeas::FunIni: get adr error=%04x\n", prg_err );
  return 1;
}
/***************************************************************************
конец работы программы - обнуление измеренных значений токов
*/
void AppMeas::FunEnd( void )
{
  memset( PD_meas_tbl->GetAdrData(), 0, PD_meas_tbl->GetSize() );
}
/***************************************************************************
моделирование кодов измерительной аппаратуры
*/
int AppMeas::FunModel( void )
{
  int i, j;
  int natt=TD_meas_tbl->GetNatt();  // кол. параметров
  int ntup=TD_meas_tbl->GetNtup();  // кол. значений каждого параметра

  if (!prg_debug) return 0;
  //------------------------------------------------------------- make data
  for (i=0; i<natt; i++)
  {
    td_meas=(unsigned short int *)TD_meas_tbl->GetAdrParam( i+1 );
    for (j=0; j<ntup; j++) td_meas[j]=100*j;
  }
  //--------------------------------------------------- сжатие, спасение
  if (TD_meas_tbl->DataSaveCompress( 0 )) return 1;
  return 0;
}
/***************************************************************************
обработка измерений
*/
int AppMeas::FunMake(
  int fl_cntr_active, // активность процесса управления в КО (не используется)
  int fl_cntr_ready,  // готовность процесса управления в КО (не используется)
  int fl_cntr_error,  // ошибка процесса управления в КО (не используется)
  int fl_meas_active, // активность процесса измерения в КО
  int fl_meas_ready,  // готовность процесса измерения в КО
  int fl_meas_error ) // ошибка процесса измерения в КО
{
  int i, j;
  int natt=TD_meas_tbl->GetNatt();  // кол. параметров
  int ntup=TD_meas_tbl->GetNtup();  // кол. значений каждого параметра

  if (!fl_meas_active || // процесс измерения не активен
      !fl_meas_ready ||  // процесс измерения не готов
       fl_meas_error     // процесс измерения имеет ошибку
     ) return 0;
  //------------------------------------------------- чтение коэффициентов
  if (PD_coef_tbl.DataRead( 1 )) return 1;
  //------------------------------------------------- преобразование
  for (i=0; i<natt; i++)
  {
    td_meas=(unsigned short int *)TD_meas_tbl->GetAdrParam( i+1 );
    pd_meas=(double *)PD_meas_tbl->GetAdrParam( i+1 );
    for (j=0; j<ntup; j++) pd_meas[j]=pd_coef[j]*td_meas[j];
  }
  return 0;
}
/***************************************************************************
*/
int main( int narg, char *sarg[] )
{
  AppMeas Ap;
  return Ap.MakeRun( narg, sarg );
}
/***************************************************************************
*/
Компиляция и сборка диагностической измерительной ПП (Супервизора) (файл name.c)
Ldb=/usr/usera/voevodin/rt-data/ccydalib/ccydalib.a
Llib=/prg/prgclasv.a /prg/sv_lib.a /prg/prgclass.a /prg/prg.a /prg/bmplib.a
Lobj=name.o
name: $(Lobj)
	g++ -o name $(Lobj) $(Llib) $(Ldb) -lm
	strip -s name
	ls -l name
name.o: /prg/prg.h /prg/sv_lib.h /prg/prgclasv.h name.cc
	g++ -c name.cc

Автор © Клименков Е.В.