#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);
}
|