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

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

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


Пример. Текст управляющей ПП с использованием функции-ядра.

Задача управления состоит из редактирования N физических параметров типа "статус". Каждый физический параметр составлен из M значений.

#include <stdio.h>
#include "/prg/prglib.h"
#define N 5                        /* количество управляющих физических
                                      параметров в данной задаче */
#define M 20                       /* количество значений управляющих физических 
                                      параметров в данной задаче */
unsigned short int pp_value[N][2]; /* семафоры результата и семафоры управления
                                            управляющих физических параметров */
short int pp_id=0;        /* идентификатор PASSPORT-таблицы описания управляющих
                                  физических параметров */
short int pd_id=0;       /* идентификатор DATA-таблиц значений управляющих
                                  физических параметров */
unsigned char pd_value[M][N]; /* значения управляющих физических параметров
                                  типа "статус" */

/*****************************************************************************
  функция выполняет чтение семафоров управляющих физических параметров и
   определяет команду пользователя
*/
int Test_Command(unsigned short int *cmd)
{
  int i;
  /* чтение семафоров управляющих физических параметров */
  prg_tcoord[0]=prg_tcoord[1]=1;
  prg_tcoord[2]=1;  prg_tcoord[3]=N;
  prg_tcoord[4]=1;  prg_tcoord[5]=2;  prg_tcoord[6]=1;
  if ((prg_err=PrgDBa_rw(0,pp_value,4*N,prg_tcoord,&pp_id))!=0) return 1;

 /* определение команды пользователя из семафоров управления */
  for (i=0; i<N; i++) if ((*cmd=pp_value[i][1])!=CMD_NOTHING) break;
  return 0;
}
/*****************************************************************************
   функция выполняет запись результата выполнения алгоритма управления в
   семафоры управляющих физических параметров:
   семафор результата: код ошибки,
   семафор управления: 0
*/
int Test_Result(unsigned short int code)
{
  int i;
  /* формирование семафоров результата и семафоров управления физических параметров */
  for (i=0; i<N; i++) PrgSem_SetResult(code,&pp_value[i][0],&pp_value[i][1]);
  
 /* запись семафоров результата и семафоров управления физических параметров в таблицу */
  prg_tcoord[2]=1;  prg_tcoord[3]=N;
  prg_tcoord[4]=1;  prg_tcoord[5]=2;  prg_tcoord[6]=1;
  prg_tcoord[0]=prg_tcoord[1]=1;
  if ((prg_err=PrgDBa_rw(1,pp_value,N*2*sizeof(short int),prg_tcoord,&pp_id))!=0) return 1;
  return 0;
}
/*****************************************************************************
функция будет вызвана для выполнения командs "новые данные",
т.е. при выполнении пользователем:
  1) редактирования физических параметров
  2) чтения физических параметров из архива:
функция выполняет:
   a) чтение новых значений физических параметров, введенных пользователем
      или прочитанных Диалоговой Программой из архива с номером narc
   b) в этой задаче - выделение цветом при выводе статусных перменных
   с) запись этих значений в "горячую копию"
*/
int Test_Edit(void)
{
  int i, j;
  /* чтение новых значений физических параметров,
     введенных пользователем */
  prg_tcoord[0]=prg_tcoord[1]=2;
  prg_tcoord[2]=1;  prg_tcoord[3]=M;
  prg_tcoord[4]=1;  prg_tcoord[5]=N;  prg_tcoord[6]=1;
  if ((prg_err=PrgDBa_rw(0,pd_value,N*M*sizeof(char),prg_tcoord,&pd_id))!=0) return 1;
  
  /* выделить цветом при выводе, если значение параметра равно 0 */
  for (i=0; i<M;i++)
    for (j=0; j<N; j++)
      if (!(pd_value[i][j] & ~PRG_COLOR_VAR))
            pd_value[i][j] |= PRG_COLOR_VAR;
      else  pd_value[i][j] &=~PRG_COLOR_VAR;
  
  /* запись значений физических параметров в "горячую копию" */
  prg_tcoord[0]=prg_tcoord[1]=1;
  if ((prg_err=PrgDBa_rw(1,pd_value,N*M*sizeof(char),prg_tcoord,&pd_id))!=0) return 1;
  return 0;
}
/*****************************************************************************
   функция выполняет инициализацию физических и технологических параметров задачи:
   открытие соответствующих таблиц в Глобальной БД ССУДА
*/
int Test_Ini(int narg, char *sarg[])
{
  int i;
  char tname[TBL_LEN_TABLE];
  /* инициализация семафоров физических параметров */
  for (i=0; i<N; i++) { pp_value[i][0]=pp_value[i][1]=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;
  return 0;
}
/*****************************************************************************
   функция выполняет действия, завершающие работу ПП:
   закрытие таблиц в Глобальной БД ССУДА
*/
void Test_End(void)
{
  PrgDBa_closeAll();
}
/*****************************************************************************
   main-функция управляющей ПП СУ
*/
int main(int narg, char *sarg[])
{
  return
    PrgCntr_Make(narg, sarg,
                 Test_Ini, Test_Command, Test_Result,
                 Test_Edit, NULL, NULL, NULL, NULL, NULL, NULL,
                 Test_End, 0);
}
Пример. Компиляция и сборка управляющей программы (файл name.c).
  cc name.c /prg/prglib.a /prg/bmplib.a /usr/usera/voevodin/rt-data/ccydalib/ccydalib.a

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