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

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

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


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

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

Задача одинаково реализуется в каждом режиме работы ускорительного комплекса. Возможно одновременное управление в нескольких режимах (связанные режимы).

#include <stdio.h>
#include "/prg/prglib.h"
#define N 5                        /* количество управляющих физических и 
                                      технологических параметров в данной задаче */
#define M 20                       /* количество значений управляющих физических и 
                                      технологических параметров в данной задаче */
unsigned short int pp_value[N][2]; /* семафоры результата и семафоры управления
                                            управляющих физических параметров */
unsigned short int tp_value[N];    /* семафоры результата управляющих
                                            технологических параметров */
short int pp_id0=0;       /* идентификатор PASSPORT-таблицы описания управляющих
                                  физических параметров для базового режима */
short int pp_id=0;        /* идентификатор PASSPORT-таблицы описания управляющих
                                  физических параметров для всех режимов */
short int pd_id0=0;       /* идентификатор DATA-таблиц значений управляющих
                                  физических параметров для базового режима */
short int pd_id[PRG_NUM_REGIME1];/* идентификаторы DATA-таблиц значений управляющих
                                  физических параметров для всех режимов */
short int tp_id=0;        /* идентификатор PASSPORT-таблицы описания управляющих
                                  технологических параметров */
short int td_id=0;        /* идентификатор DATA-таблицы значений управляющих
                                  технологических параметров */
short int tr_id=0;        /* идентификатор DATA-таблицы значений семафоров готовности
                             технологических параметров для ПП в Контроллере Оборудования */
double pd_value[M][N];   /* значения управляющих физических параметров */
short int td_value[M][N]; /* значения управляющих технологических параметров */
char pp_name[]="B_PP_TEST";  /* имя PASSPORT-таблицы описания управляющих
                                  физических параметров */
char pd_name[]="B_PD_TEST_"; /* скелет имени DATA-таблицы значений управляющих
                                  физических параметров */
char tname[TBL_LEN_TABLE];   /* буфер для имени таблицы */

/*****************************************************************************
  функция выполняет чтение семафоров управляющих физических параметров и
   определяет команду пользователя
*/
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_id0))!=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/* в таблицу для базового режима */
  prg_tcoord[0]=prg_tcoord[1]=1;
  if ((prg_err=PrgDBa_rw(1,pp_value,N*2*sizeof(short int),prg_tcoord,&pp_id0))!=0) return 1;
 /* в таблицу для связанных режимов */
  if (prg_treg_flag) /* если есть связанные режимы */
    for (i=0; i<PRG_NUM_REGIME1; i++)
      if (prg_treg_list[i])
      {
        prg_tcoord[0]=prg_tcoord[1]=i+1;
        if ((prg_err=PrgDBa_rw(1,pp_value,N*2*sizeof(short int),prg_tcoord,&pp_id))!=0) return 1;
      }
  return 0;
}
/*****************************************************************************
   функция будет вызвана для выполнения команды пользователя "execute"
   (в этой задаче - это запись данных в Контроллер Оборудования):
   1) преобразование физических параметров в технологические
   2) запись технологических параметров в таблицу, расположенную
      на диске Рабочей Станции и в памяти Контроллере Оборудования
   3) запись семафоров результата технологических параметров
*/
int Test_Put(void)
{
  int i, j;
  short int tinterface=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]=1;
  if ((prg_err=PrgDBa_rw(0,pd_value,N*M*sizeof(double),prg_tcoord,&pd_id0))!=0) return 1;
  
  /* запись значений физических параметров для связанных режимов */
  if (prg_treg_flag) /* если есть связанные режимы */
    for (i=0; i<PRG_NUM_REGIME1; i++)
      if (prg_treg_list[i])
        if ((prg_err=PrgDBa_rw(1,pd_value,N*M*sizeof(double),prg_tcoord,&pd_id[i]))!=0) return 1;

  /* преобразование значений физических параметров в технологические */
  for (i=0; i<M; i++) for (j=0; j<N; j++) td_value[i][j]=(short int)pd_value[i][j];
  
  /* запись технологических параметров в таблицу для базового и связанных режимов */
  prg_tcoord[2]=1;  prg_tcoord[3]=M;  prg_tcoord[4]=1;  prg_tcoord[5]=N;
  for (i=0; i<PRG_NUM_REGIME1; i++)
    if (prg_treg_list[i])
    {
      prg_tcoord[0]=prg_tcoord[1]=i+1;
      prg_tcoord[6]=1; /* запись в таблицу, расположенную на диске Рабочей Станции */
      if ((prg_err=PrgDBa_rw(1,td_value,N*M*sizeof(short int),prg_tcoord,&td_id))!=0) return 1;
      prg_tcoord[6]=3; /* запись в таблицу, расположенную в памяти Контроллера Оборудования */
      if (!prg_debug)
      if ((prg_err=PrgDBa_rw(1,td_value,N*M*sizeof(short int),prg_tcoord,&td_id))!=0) return 1;
  }
  /* формирование семафоров результата технологических параметров */
  for (i=0; i<N; i++) PrgSem_SetResult(0,&tp_value[i],NULL);

  /* запись семафоров результата технологических параметров
     в таблицу для базового и связанных режимов */
  prg_tcoord[2]=1;  prg_tcoord[3]=N;
  prg_tcoord[4]=1;  prg_tcoord[5]=1;  prg_tcoord[6]=1;
  for (i=0; i<PRG_NUM_REGIME1; i++)
    if (prg_treg_list[i])
    {
      prg_tcoord[0]=prg_tcoord[1]=i+1;
      if ((prg_err=PrgDBa_rw(1,tp_value,N*sizeof(short int),prg_tcoord,&tp_id))!=0) return 1;
    }
  
  /* запись семафоров готовности технологических параметров для ПП в Контроллере Оборудования
     в таблицу для базового и связанных режимов */
  prg_tcoord[2]=1;  prg_tcoord[3]=1;  prg_tcoord[4]=1;  prg_tcoord[5]=1;
  for (i=0; i<PRG_NUM_REGIME1; i++)
    if (prg_treg_list[i])
    {
      prg_tcoord[0]=prg_tcoord[1]=i+1;
      /* запись в таблицу, расположенную на диске Рабочей Станции */
      prg_tcoord[6]=1;
      if ((prg_err=PrgDBa_rw(1,&tinterface,sizeof(short int),prg_tcoord,&tr_id))!=0) return 1;
      /* запись в таблицу, расположенную в памяти Контроллера Оборудования */
      prg_tcoord[6]=3;
      if (!prg_debug)
      if ((prg_err=PrgDBa_rw(1,&tinterface,sizeof(short int),prg_tcoord,&tr_id))!=0) return 1;
  }
  return 0;
}
/*****************************************************************************
функция будет вызвана для выполнения команды "новые данные",
т.е. при выполнении пользователем:
  1) редактирования физических параметров
  2) чтения физических параметров из архива:
функция выполняет:
   a) чтение новых значений физических параметров, введенных пользователем
      или прочитанных Диалоговой Программой из архива с номером narc
   b) в этой задаче - без проверки на корректность
   с) запись этих значений в "горячую копию"
*/
int Test_Edit(void)
{
  /* чтение новых значений физических параметров для базового режима,
     введенных пользователем */
  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(double),prg_tcoord,&pd_id0))!=0) return 1;
  
  /* запись значений физических параметров в "горячую копию" для базового режима */
  prg_tcoord[0]=prg_tcoord[1]=1;
  if ((prg_err=PrgDBa_rw(1,pd_value,N*M*sizeof(double),prg_tcoord,&pd_id0))!=0) return 1;
  return 0;
}
/*****************************************************************************
функция будет вызвана для одновременного выполнения двух команд пользователя:
  1) команды "новые данные", т.е. при выполнении пользователем
     редактирования физических параметров или чтение значений параметров из архива
  2) команды "execute" 
     (в этой задаче - это запись данных в Контроллер Оборудования)
*/
int Test_EditPut(void)
{
  if (Test_Edit()) return 1;
  if (Test_Put()) return 1;
  return 0;
}
/*****************************************************************************
функция будет вызвана для выполнения команды "новые данные".
Функция выполняет:
   a) чтение новых значений физических параметров, 
      прочитанных Диалоговой Программой из архива с номером narc
   b) в этой задаче - без проверки на корректность
   с) запись этих значений в "горячую копию"
*/
int Test_Arc(short int narc)
{
  return Test_Edit();
}
/*****************************************************************************
функция будет вызвана для одновременного выполнения двух команд пользователя:
  1) команды "новые данные", т.е. при выполнении пользователем
     чтение значений параметров из архива с номером narc
  2) команды "execute" 
     (в этой задаче - это запись данных в Контроллер Оборудования)
*/
int Test_ArcPut(short int narc)
{
  return Test_EditPut();
}
/*****************************************************************************
функция будет вызвана для выполнения команды "новые данные",
т.е. при выполнении пользователем:
  1) редактирования физических параметров
  2) чтения физических параметров из архива:
функция выполняет:
   a) чтение новых значений физических параметров, введенных пользователем
      или прочитанных Диалоговой Программой из архива с номером narc
   b) в этой задаче - без проверки на корректность
   с) запись этих значений в "горячую копию"
*/
int Test_GetRegime(short int nregime)
{
  short int id=0;
  
  /* открытие DATA-таблицы физических параметров для указанного режима */
  sprintf(tname,"%s%d",pd_name,nregime);
  if ((prg_err=PrgDBa_open(&id,tname))!=0) 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]=1;
  if ((prg_err=PrgDBa_rw(0,pd_value,N*M*sizeof(double),prg_tcoord,&id))!=0) return 1;
  
  /* закрытие DATA-таблицы физических параметров для указанного режима */
  PrgDBa_close(&id);
  
  /* запись значений физических параметров в буфер для новых данных для базового режима */
  prg_tcoord[0]=prg_tcoord[1]=2;
  if ((prg_err=PrgDBa_rw(1,pd_value,N*M*sizeof(double),prg_tcoord,&pd_id0))!=0) return 1;
  return 0;
}
/*****************************************************************************
   функция выполняет инициализацию физических и технологических параметров задачи:
   открытие соответствующих таблиц в Глобальной БД ССУДА
*/
int Test_Ini(int narg, char *sarg[])
{
  int i;
  
  /* определение номера режима и списка связанных режимов */
  if (PrgConnectRegime_Get(narg,sarg)) return 1;
  if (!prg_treg_base) return 1; /* нет номера режима */
  
  /* инициализация семафоров физических параметров */
  for (i=0; i<N; i++) { pp_value[i][0]=pp_value[i][1]=0; }
  
  /* обнуление идентификаторов DATA-таблиц физических параметров */
  for (i=0; i<PRG_NUM_REGIME1; i++) pd_id[i]=0;
  
  /* открытие PASSPORT-таблиц физических параметров */
  if ((prg_err=PrgDBa_open(&pp_id,pp_name))!=0) return 1;
  if (!prg_treg_flag) pp_id0=pp_id;          /* работа в одном режиме */
  else                                       /* работа со связанными режимами */
  {
    sprintf(tname,"%s_T",pp_name);
    if ((prg_err=PrgDBa_open(&pp_id0,tname))!=0) return 1;
  }
  
  /* открытие DATA-таблиц физических параметров */
  for (i=0; i<PRG_NUM_REGIME1; i++)
    if (prg_treg_list[i])
    {
      sprintf(tname,"%s%d",pd_name,i+1);
      if ((prg_err=PrgDBa_open(&pd_id[i],tname))!=0) return 1;
    }
  if (!prg_treg_flag) pd_id0=pd_id[prg_treg_base-1]; /* работа в одном режиме */
  else                                       /* работа со связанными режимами */
  {
    sprintf(tname,"%s_T",pd_name);
    if ((prg_err=PrgDBa_open(&pd_id0,tname))!=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,"B_TD_TEST"))!=0) return 1;
  if ((prg_err=PrgDBa_open(&tr_id,"B_TD_READY"))!=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, Test_EditPut,
                 Test_Arc, Test_ArcPut,
                 Test_Put,
                 Test_GetRegime, NULL,
                 Test_End, 0);
}
Пример. Компиляция и сборка управляющей программы (файл name.c).
  cc name.c /prg/prglib.a /prg/bmplib.a /usr/usera/voevodin/rt-data/ccydalib/ccydalib.a

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