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

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

Библиотеки алгоритмов СУ


Пример Локального Супервизора

Эта ПП выполняет задачу диагностики и измерения параметров технологической подсистемы.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "/prg/sv_lib.h"
#include "/prg/prglib.h"
#include "/prg/bmplib.h"
#define N 5	/* количество измеряемых физических и 
		технологических параметров в данной задаче */
#define M 20	/* количество значений измеряемых физических и 
		технологических параметров в данной задаче */
unsigned short int pp_value[N]; /* семафоры результата
				измеряемых физических параметров */
unsigned short int tp_value[N]; /* семафоры результата
				измеряемых технологических параметров */
short int pp_id=0;	/* идентификатор PASSPORT-таблицы
			описания измеряемых физических параметров */
short int pd_id=0;	/* идентификатор DATA-таблиц
			значений измеряемых физических параметров */
short int tp_id=0;	/* идентификатор PASSPORT-таблицы
			описания измеряемых технологических параметров */
short int td_id[2]={0,0}; /* идентификатор DATA-таблиц
			значений измеряемых технологических параметров */
double pd_value[M][N];   /* значения измеряемых
			физических параметров */
short int td_value[M][N]; /* значения измеряемых
			технологических параметров */

char name_bmp[]="b_test.bmp"; /* имя bitmap-файла,
					создаваемого программой */
char name_task[]="Test task"; /* название задачи,
					решаемой программой */

/**********************************************************
  создание bitmap-файла
*/
void Test_BMP (void )
{
  int i, j;
  short int x1=0, x2, y1=0, y2, xw=400, yw=300;
  double cx=(double)xw/(double)M;
  double cy=(double)yw/(double)0x3fff;
  {
  if (BMP_Create (xw,yw,4,0)) { prg_err=RC_ERBMP;  return 1; }
  BMP_SetBkColor (BMP_color[BMP_C_GRAY][0]);
  BMP_SetColor (BMP_color[BMP_C_GRAY][1]);
  BMP_FullRectang (0,0,xw-1,yw-1);
  BMP_SetColor (BMP_color[BMP_C_YELLOW][1]);
  for (j=0; j<N; j++)
  {
    for (i=0; i<M; i++)
    {
      x2=(short int)(cx*i+0.5);
      y2=(short int)(yw-cy*pd_value[i][j]+0.5);
      if (i) BMP_Line (x1,y1,x2,y2);
      x1=x2;  y1=y2;
    }
  }
  if (BMP_SaveStdDat( "", prg_name_bmp[0], prg_name_task[0] ))
  {
    prg_err=RC_ERBMP;  return 1;
  }
  return 0;
}
/************************************************************
  моделирование значений технологических параметров
*/
void Test_Model (void )
{
  int i, j;
  for (i=0; i<M; i++)
    for (j=0; j<N; j++) td_value[i][j]=i*100+(random() & 0x000f);
}
/***********************************************************
  1) чтение технологических измеренных данных
	из таблицы в Контроллере Оборудования
  2) запись технологических измеренных данных
	в ту же таблицу на диск Рабочей Станции
  3) преобразование значений технологических параметров в физические
  4) запись в статистику измерений значений
	технологических и физических параметров
*/
int Test_Data (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;
  if (!fl_meas_active || /* если процесс измерения не ведется */
      !fl_meas_ready)    /* если результат процесса измерения */
			/* не готов в Контроллере Оборудования */
    return 1;

  /* чтение технологических параметров
	из таблицы в Контроллере Оборудования */
  prg_tcoord[0]=prg_tcoord[1]=1;
  prg_tcoord[2]=1;  prg_tcoord[3]=M;  prg_tcoord[4]=1;  prg_tcoord[5]=N;
  prg_tcoord[6]=3;
  if (prg_debug) Test_Model();  /* моделирование измерений */
  else
  if ((prg_err=
	PrgDBa_rw( 0, td_value,N*M*sizeof(short int),
		prg_tcoord, &td_id[0])) != 0) return 1;

  /* запись технологических параметров
	в таблицу на диск Рабочей Станции */
  prg_tcoord[6]=1;
  if ((prg_err=
	PrgDBa_rw( 1, td_value,N*M*sizeof(short int),
		prg_tcoord, &td_id[0])) != 0) return 1;

  /* Запись значений технологических параметров
	в "горячую" копию в статистику измерений */
  if ((PrgDBa_TDsave( 1, M, 1, N,
	td_value, N*M*sizeof(short int), &td_id[1])) != 0) return 1;

  PrgIni_StatPlane();  /* увеличить счетчик статистики измерений */

  /* Запись счетчика статистики в семафоры результата
	технологических параметров */
  for (i=0; i<N; i++) tp_value[i]=prg_stat_plane;
  prg_tcoord[0]=prg_tcoord[1]=1;
  prg_tcoord[2]=1;  prg_tcoord[3]=N;  prg_tcoord[4]=prg_tcoord[5]=1;
  prg_tcoord[6]=1;
  if ((prg_err=
	PrgDBa_rw( 1, tp_value,N*sizeof(short int),
		prg_tcoord, &tp_id)) !=0 ) return 1;
  prg_tcoord[0]=prg_tcoord[1]=2;
  if ((prg_err=
	PrgDBa_rw( 1, tp_value,N*sizeof(short int),
		prg_tcoord, &tp_id)) != 0) return 1;

  /* преобразование значений физических параметров в технологические */
  for (i=0; i<M; i++)
	for (j=0; j<N; j++) pd_value[i][j]=(double)td_value[i][j];

  /* Запись значений физических параметров в "горячую" копию
	и в статистику измерений */
  if ((PrgDBa_PDsave( 1, M, 1, N,
	pd_value,N*M*sizeof(double), &pd_id)) != 0) return 1;

  /* Запись счетчика статистики в семафоры результата
	физических параметров */
  for (i=0; i<N; i++) pp_value[i]=prg_stat_plane;
  prg_tcoord[0]=prg_tcoord[1]=1;
  prg_tcoord[2]=1;  prg_tcoord[3]=N;  prg_tcoord[4]=prg_tcoord[5]=1;
  prg_tcoord[6]=1;
  if ((prg_err=
	PrgDBa_rw( 1, pp_value,N*sizeof(short int),
		prg_tcoord, &pp_id)) !=0 ) return 1;
  return 0;
}
/*************************************************************
   функция выполняет инициализацию физических
	и технологических параметров задачи:
   открытие соответствующих таблиц в Глобальной БД ССУДА
*/
int Test_Ini(int narg, char *sarg[])
{
  int i;
  
  /* имена для bitmap */
  prg_name_bmp[0]=name_bmp;  prg_name_task[0]=name_task;
  
  /* инициализация семафоров физических и технологических параметров */
  for (i=0; i<N; i++) { pp_value[i]=tp_value[i]=0; }
  
  /* открытие PASSPORT-таблицы физических параметров */
  if ((prg_err=PrgDBa_open(&pp_id,"B_PP_TEST"))!=0) return 1;
  
  /* открытие DATA-таблицы физических параметров */
  if ((prg_err=PrgDBa_open(&pd_id,"B_PD_TEST"))!=0) return 1;
  
  /* открытие PASSPORT-таблицы технологических параметров */
  if ((prg_err=PrgDBa_open(&tp_id,"B_TP_TEST"))!=0) return 1;
  
  /* открытие DATA-таблиц технологических параметров */
  if ((prg_err=PrgDBa_open(&td_id[0],"B_TD_TEST"))!=0) return 1;
  if ((prg_err=PrgDBa_open(&td_id[1],"B_TD_TEST1"))!=0) return 1;
  return 0;
}
/****************************************************************
   функция выполняет действия, завершающие работу ПП:
   закрытие таблиц в Глобальной БД ССУДА
*/
void Test_End(void)
{
  PrgDBa_closeAll();
}
/****************************************************************
   main-функция измерительной ПП СУ
*/
int main( int narg, char *sarg[] )
{
  return SvKern_Master(narg, sarg, Test_Ini, Test_End, NULL, Test_Data, 1);
}
Пример. Компиляция и сборка Локального Супервизора (файл name.c).
Ldb=/usr/usera/voevodin/rt-data/ccydalib/ccydalib.a
Llib=/prg/sv_lib.a /prg/prglib.a /prg/bmplib.a
name: name.o
	cc -o name name.o $(Llib) $(Ldb) -lm
	strip -s name
name.o: /prg/prglib.h /prg/sv_lib.h name.c
	cc -c name.c

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