## Использование PhAB приложения в качестве модуля RTWin

### Общие сведения

RTWin предоставляет возможность интеграции в проект PhAB приложения в качестве модуля. На модульной схеме он показывается серым цветом и рассматривается как особого вида объект. Как и другие объекты, он имеет входы и выходы и может быть соединен с другими модулями проекта.

Предполагается использование PhAB версии не ниже 1.10. Для приложений, созданных в более ранних версиях PhAB, необходимо выполнить операцию Appication/Convert to Multiplatform. При этом если ранее в файле Makefile в директории src/ PhAB приложения были добавлены вручную имена файлов в строки

MYSRC =

MYOBJ =

MYHDR =

то теперь их следует перенести в файлы indSfiles, indOfiles и indHfiles соответственно.

Пример использования PhAB приложения в качестве объекта содержится в директории /usr/rtw/apps/phapp, где находится немного измененное PhAB приложение rebound и проект rtwinph, использующий rebound в качестве объекта.

| PhAB приложение и RTWin-проект всегда должны находиться на одном и том же узле сети.

### Порядок действий

1. Открыть (создать) в PhAB желаемое приложение и указать функцию инициализации RTWin_init. Для этого в окне диалога "Application Startup Information" ( пункт меню Application / Startup Info/Modules). В строке с названием Initialization Function ввести: RTWin_init
2. В PhAB выполнить пункт Application / Build+Run / Generate.
3. Открыть (создать) в RTWin проект и создать в редакторе объектов новый объект, задать требуемые входы и выходы. Данный объект может содержать любые блок-функции, никаких ограничений нет. Все его отличие от "нормального" объекта состоит в том, что он будет составлять вместе с PhAB приложением единую программу.
4. В редакторе объектов RTWin выполнить операцию Program/Generate.
5. В редакторе схем RTWin вставить созданный объект на модульную схему как объект- PhAB приложение. Для этого в окне Object Insertion нажать кнопку Photon Application и указать директорию PhAB приложения.
6. В редакторе схем RTWin выполнить пункт Application/Make.

После этого PhAB приложение "превратится" в объект RTWin проекта и уже не будет запускаться самостоятельно.

| В PhAB теперь не следует выполнять операцию Application/Build+Run/Make. При необходимости выполняйте в PhAB операцию Application/Build+Run/Generate, а затем в редакторе схем RTWin пункт меню Application/ Make.

### Как работать с входами объекта - PhAB приложения

В объект поместите блок типа С-функция. Если вход этого блока связать с выходом блока типа Input, то внутри самой функции можно использовать приходящие в объект данные. Чтобы использовать Ap* или Pt* функции и имена виджетов ABW_* , в начало файла, содержащего текст С-функции, необходимо добавить строки:

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

#include "abimport.h"

Пример:

/* Standard headers */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <math.h>

/* Local headers */

#include <Ph.h> //----------------

#include <Pt.h> //Добавьте

#include <Ap.h> //эти строки

#include "abimport.h" //----------------

#ifdef RTDEF_draw_ph

void

draw_ph( __draw_ph *ts_ptr )

{

PtArg_t args[2];

char buf[10];

sprintf(buf,"%d",RID(cnt));

PtSetArg(&args[0],Pt_ARG_TEXT_STRING,buf,0);

PtSetResources(ABW_WriteCh,1,&args);

//eliminate "not referenced" warning:

ts_ptr=ts_ptr;

}

#endif

### Как работать с выходами объекта - PhAB приложения

Из любой функции ( например, callback-функции) PhAB приложения можно осуществить запись данных в выходной канал объекта. Для этого следует:

1. Присвоить значения входам блока типа Output
2. Осуществить запись в канал

Присвоить значения входам блока типа Output можно с помощью макросов вида: _RID(ИмяБлока, ИмяВхода). Для каждого выхода объекта генерируется функция с именем _write_[ИмяВыхода](), осуществляющая запись в канал. Чтобы использовать макросы _RID(...) и функции _write_*, в начало файла необходимо добавить строку:

#include "import_[ИмяОбъекта].h"

Обратите внимание, что здесь используется имя объекта, присвоенное в редакторе объектов, а не имя модуля на схеме.

Пример:

/* Local headers */

#include "abimport.h"

#include "proto.h"

#include "import_Obj_CP.h" // Добавьте эту строку

int

WriteChan( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )

{

> /* eliminate 'unreferenced' warnings */

> widget = widget, apinfo = apinfo, cbinfo = cbinfo;

> _RID(Out_Num_1,element_1)++;

> _write_Out_Num_1();

> return( Pt_CONTINUE );

> }