#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "/prg/prg.h"
#include "/prg/prgclass.h"
#include "/prg/prgclasv.h"
/***************************************************************************
*/
class AppMeas : public ApplicationMeasure
{
//-----------------------физические параметры - коэффициенты преобразования
class classPDtable PD_coef_tbl; // таблица коэффициентов преобразования
double *pd_coef; // коэффициенты преобразования кода в ток
//---------------------- физические измеряемые параметры - токи источников
class classPPmeasure *PP_meas_tbl; // таблица описаний
class classPDmeasure *PD_meas_tbl; // таблица значений
double *pd_meas; // значения измеренных токов источников
//------- технологические измеряемые параметры - коды токов источников
class classTPmeasure *TP_meas_tbl; // таблица описаний
class classTDmeasure *TD_meas_tbl; // таблица значений
unsigned short int *td_meas; // значения измеренных кодов аппаратуры
//------- методы
int FunIni( int narg, char *sarg[] );
void FunEnd( void );
int FunModel( void );
int FunMake( 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 AppMeas::FunIni( int narg, char *sarg[] )
{
//-----------------------физические параметры - коэффициенты преобразования
//..... инициализация объекта
if (PD_coef_tbl.Ini( "B_PD_COEF", // имя таблицы
1, // номер начального столбца
1, // номер конечного столбца
20, // кол. строк
0, // нет редактирования
1 ) // горизонтальное расположение
) return 1;
if (!(pd_coef=(double*)PD_coef_tbl.GetAdrParam( 1 ))) goto Merr;
//---------------------- физические измеряемые параметры - токи источников
//..... создание объектов
if (!(PP_meas_tbl=NewPPmeasure())) return 1;
if (!(PD_meas_tbl=NewPDmeasure())) return 1;
// PP_meas_tbl->SetTrace( 1 );
// PD_meas_tbl->SetTrace( 1 );
if (AdrPar.SetPar( PP_meas_tbl, PD_meas_tbl ) == -1) return 1; // парный
//..... инициализация объектов
if (PP_meas_tbl->Ini( "B_PD_MEAS", // имя таблицы
1, // номер начальной строки
5 ) // номер конечной строки
) return 1;
if (PD_meas_tbl->Ini( "B_PD_MEAS", // имя таблицы
1, // номер начального столбца
5, // номер конечного столбца
20, // кол. строк
1 ) // горизонтальное расположение
) return 1;
//------- технологические измеряемые параметры - коды токов источников
//..... создание объектов
if (!(TP_meas_tbl=NewTPmeasure())) return 1;
if (!(TD_meas_tbl=NewTDmeasure())) return 1;
// TP_meas_tbl->SetTrace( 1 );
// TD_meas_tbl->SetTrace( 1 );
if (AdrPar.SetPar( TP_meas_tbl, TD_meas_tbl ) == -1) return 1; // парный
//..... инициализация объектов
if (TP_meas_tbl->Ini( "B_TP_MEAS", // имя таблицы
1, // номер начальной строки
5 ) // номер конечной строки
) return 1;
if (TD_meas_tbl->Ini( "B_TD_MEAS", // имя таблицы
1, // номер начального столбца
5, // номер конечного столбца
1, // номер начальной строки
20, // номер конечной строки
1 ) // горизонтальное расположение
) return 1;
//------------------------------------------------------------------- end
if (PrgDB_cmt()) PrgFile_WriteAlarm( "AppMeas::FunIni: Ok\n" );
return 0;
Merr:
prg_err=RC_ERLOAD;
if (PrgDB_cmt())
PrgFile_WriteAlarm( "AppMeas::FunIni: get adr error=%04x\n", prg_err );
return 1;
}
/***************************************************************************
конец работы программы - обнуление измеренных значений токов
*/
void AppMeas::FunEnd( void )
{
memset( PD_meas_tbl->GetAdrData(), 0, PD_meas_tbl->GetSize() );
}
/***************************************************************************
моделирование кодов измерительной аппаратуры
*/
int AppMeas::FunModel( void )
{
int i, j;
int natt=TD_meas_tbl->GetNatt(); // кол. параметров
int ntup=TD_meas_tbl->GetNtup(); // кол. значений каждого параметра
if (!prg_debug) return 0;
//------------------------------------------------------------- make data
for (i=0; i<natt; i++)
{
td_meas=(unsigned short int *)TD_meas_tbl->GetAdrParam( i+1 );
for (j=0; j<ntup; j++) td_meas[j]=100*j;
}
//--------------------------------------------------- сжатие, спасение
if (TD_meas_tbl->DataSaveCompress( 0 )) return 1;
return 0;
}
/***************************************************************************
обработка измерений
*/
int AppMeas::FunMake(
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;
int natt=TD_meas_tbl->GetNatt(); // кол. параметров
int ntup=TD_meas_tbl->GetNtup(); // кол. значений каждого параметра
if (!fl_meas_active || // процесс измерения не активен
!fl_meas_ready || // процесс измерения не готов
fl_meas_error // процесс измерения имеет ошибку
) return 0;
//------------------------------------------------- чтение коэффициентов
if (PD_coef_tbl.DataRead( 1 )) return 1;
//------------------------------------------------- преобразование
for (i=0; i<natt; i++)
{
td_meas=(unsigned short int *)TD_meas_tbl->GetAdrParam( i+1 );
pd_meas=(double *)PD_meas_tbl->GetAdrParam( i+1 );
for (j=0; j<ntup; j++) pd_meas[j]=pd_coef[j]*td_meas[j];
}
return 0;
}
/***************************************************************************
*/
int main( int narg, char *sarg[] )
{
AppMeas Ap;
return Ap.MakeRun( narg, sarg );
}
/***************************************************************************
*/
|