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