4.3.3 Системные вызовы для доступа к ВВ-переменным
В SNDA разработаны специальные подпрограммы для доступа пользовательских SA-процедур к текущим значениям BB-переменных c целью чтения и/или модификации. Все локальные BB-переменные должны быть объявлены в скрипте. В этом нет необходимости, если SA-процедура взаимодействует с sys и snd глобальными переменными. Для доступа к BB-переменным предусмотрено 5 системных подпрограмм:
bbvc, bbvc1 - для доступа к целым и действительным BB-переменным;
bbvir, bbvir1 - для доступа к символьным BB-переменным;
bbvm - для доступа к элементам BB-массивов.
Порядок использования этих подпрограмм приведен ниже. Отметим, что в фортран программе имена переменных должны быть объявлены, как символьные строки. При обновлении переменных SA-процедура должна назначать необходимые значения, передаваемые в подпрограмму.
Единственное отличие между двумя вышеуказанными модификациями подпрограммы заключается в наличии (или отсутствии) кода возврата. Программы bbvc и bbvir не предусматривают его, так что если будет обнаружена ошибочная ситуация (например, отсутствие запрошенных переменных), задача выдает диагностику и завершается аварийно. Наоборот программы bbvc1 и bbvir1 снабжены кодом возврата, который может быть проанализирован вызывающей программой.
Подпрограмма bbvir может читать (писать) произвольное количество BB-переменных. Обращение к подпрограмме bbvir (писать/читать целое или действительное значение) должно быть оформлено следующим образом: CALL BBVIR (STACK,ACT,TYPE,NAMES,VALUES,NUMBER)
где:
INTEGER STACK(*)
| Системный параметр, передаваемый в SA-процедуру из внешней программы
| CHARACTER ACT
| Символ, определяющий операцию: R -чтение, W - запись
| CHARACTER TYPE
| Символ, определяющий тип ВВ-переменной: I - integer, F - real
| CHARACTER*10 NAMEI()
| Массив имен переменных
| INTEGER/REAL VALUES()
| Массив значений переменных
| INTEGER NUMBER
| Количество переменных
|
Подпрограмма bbvir1 имеет еще один параметр - RC: CALL BBVIR1 (STACK,ACT,TYPE,NAMES,VALUES,NUMBER,RC) INTEGER RC - код ошибки:
0 - нормальное завершение;
1 - неверен тип данных;
2 - BB-переменная не определена;
3 - неадекватный тип данных;
4 - неверен код операции; Подпрограмма bbvc может читать (писать) только одну символьную переменную. Обращение к подпрограмме М (писать/читать символьную переменную) должно быть оформлено следующим образом: CALL BBVC (STACK,ACT,NAME,VALUE,LEN)
где:
INTEGER STACK(*)
| Системный параметр, передаваемый в SA-процедуру из внешней программы
| CHARACTER ACT
| Символ, определяющий операцию: R -чтение, W - запись
| CHARACTER*10 NAMEI
| Имя переменной
| CHARACTER() VALUE()
| значение переменной либо поле для приема этого значения
| INTEGER len
| Длина ВВ-переменной (приемного поля)
|
Подпрограмма bbvc1 имеет еще один параметр - RC:
CALL BBVC1 (STACK,ACT,NAME,VALUE,LEN, RC) INTEGER RC - код ошибки:
0 - нормальное завершение;
2 - BB-переменная не определена;
3 - неадекватный тип данных;
4 - неверен код операции; Для тестирования вышеописанных системных подпрограмм доступа к BB-переменным разработана программа TESTBB. Она может быть использована в качестве шаблона при разработке пользовательских SA-процедур. SUBROUTINE TESTBB (STACK) INTEGER STACK(*)
C --- STACK - SYSTEM VARYABLE, transmitted from main C-program
C--------------------------INEGERS BB-VARIABLES --------------------------
CHARACTER*10 NAMEI(3)
INTEGER*4 INTS(3)
C-------------------------REAL BB-VARIABLES -----------------------------
CHARACTER*10 NAMEF(3)
REAL FLOATS(3)
C-----------------------STRING BB-VARIABLE ------------------------------
CHARACTER*24 SS11
C--------------------------------------------------------------------------------------
PRINT *,'FORTRAN TESTBB STARTED'
C--------------------- READ FROM BLACK-BOARD ------------------------
NAMEI(1) = 'aa11'
NAMEI(2) = 'AA22'
NAMEI(3) = 'AA33'
CALL BBVIR (STACK,'R','I',NAMEI,INTS,3)
PRINT *,'aa11=',INTS(1), ' AA22=',INTS(2), ' AA33=',INTS(3)
NAMEF(1) = 'BB11'
NAMEF(2) = 'BB22'
NAMEF(3) = 'BB33'
CALL BBVIR (STACK,'R','F',NAMEF,FLOATS,3)
PRINT *,'BB11=',FLOATS(1),' BB22=',FLOATS(2),' BB33=',FLOATS(3)
CALL BBVC (STACK,'R','SS11',SS11,24)
PRINT *,'SS11=', SS11
C----------------------- WRITE TO BLACK-BOARD -------------------------
INTS(1) = INTS(1) +70
INTS(2) = INTS(2) +70
INTS(3) = INTS(3) +70
CALL BBVIR (STACK,'W','I',NAMEI,INTS,3)
FLOATS(1) = FLOATS(1) +70
FLOATS(2) = FLOATS(2) +70
FLOATS(3) = FLOATS(3) +70
CALL BBVIR (STACK,'W','F',NAMEF,FLOATS,3)
CALL BBVC (STACK,'W','SS11', 'XXXXXXXXXX YYYYYYYY',24)
PRINT *,'FORTRAN TESTBB ENDED'
END Подпрограмма bbvm может читать (писать) один элемент BB-массива. Отметим, что обработка BB-массива возможна только в рамках скрипта.
Обращение к подпрограмме bbvm (писать/читать элемент BB-массива) должно быть оформлено следующим образом: CALL BBVM (STACK,ACT,TYPE,NAME,INDEX,VALUE,RC)
где:
INTEGER STACK(*)
| Системный параметр, передаваемый в SA-процедуру из внешней программы
| CHARACTER ACT
| Cимвол, определяющий операцию: R -чтение, W - запись
| CHARACTER TYPE
| Cимвол, определяющий тип ВВ-переменной: I - integer, F - real
| CHARACTER*10 NAMEI
| Имя массива
| INTEGER/REAL/CHARACTER VALUE
| Значение переменной
| INTEGER RC
| Код возврата (см. ниже)
|
RC - код возврата:
0 - нормальное завершение;
2 - BB-массив не определен;
3 - неадекватный тип данных;
4 - неверен код операции;
5 - неверен индекс; Для тестирования системной подпрограммы BBVM разработаны специальный скрипт bbm и фортран программа testbbm.f. Программа может быть использована в качестве шаблона при разработке пользовательских SA-процедур. Ниже представлены тексты скрипта, программы и протокол их исполнения. echo Example of BBV array interface with FORTRAN
. int aa[3]
. float bb[3]
. char cc[3][15]
. aa[0] = 0
. aa[1] = 1
. aa[2] = 2
. bb[0] = 0
. bb[1] = 1.11
. bb[2] = 2.22
. cc[0] = "0000000000aaa "
. cc[1] = "1111111111bbb "
. cc[2] = "2222222222ccc "
. varlist
testbbm
echo arrays after modification by FORTRAN program
. varlist
end
C-----------------------------------------------------------------------------------------
SUBROUTINE TESTBBM (STACK)
INTEGER STACK(*)
C --- STACK - SYSTEM VARYABLE, transmitted from main C-program
C---------------------------ARRAY BB-VARIABLES ----------------------------
INTEGER*4 AA(3)
REAL BB(3)
CHARACTER*15 CC(3)
INTEGER RC
PRINT *,'AA:', AA
PRINT *,'BB:', BB
PRINT *,'CC:', CC
C----------------------- READ ARRAYS FROM BLACK BOARD ----------------------
DO 11 i=1, 3
CALL BBVM (STACK,'R','I','aa ', I, AA(I),RC)
CALL BBVM (STACK,'R','F','bb ', I, BB(I),RC)
CALL BBVM (STACK,'R','C','cc ', I, CC(I),RC)
11 CONTINUE
PRINT *,'AA:', AA
PRINT *,'BB:', BB
PRINT *,'CC:', CC
C------------ MODIFY AND WRITE ARRAYS TO BLACK BOARD -------------
DO 22 i=1, 3
AA(I) =AA(I) +70
CALL BBVM (STACK,'W','I','aa ', I, AA(i),RC)
BB(I) =BB(I) +70.0
CALL BBVM (STACK,'W','F','bb ', I, BB(i),RC)
CC(I) (1:3) = 'NEW'
CALL BBVM (STACK,'W','C','cc ', I, CC(i),RC)
22 CONTINUE
PRINT *,'AA:', AA
PRINT *,'BB:', BB
PRINT *,'CC:', CC
END
C-------------------------------- END OF PROGRAM ---------------------------------
The protocol of the script performance is shown below
************** script bbm **************
2)echo Example of BBV interface with Fortran
7). aa[0] = 0
8). aa[1] = 1
9). aa[2] = 2
11). bb[0] = 0
12). bb[1] = 1.11
13). bb[2] = 2.22
15). cc[0] = "0000000000aaa "
16). cc[1] = "1111111111bbb "
17). cc[2] = "2222222222ccc "
19). varlist
--- LIST OF LOCAL BB VARIABLES ---
int aa[0] = 0
int aa[1] = 1
int aa[2] = 2
float bb[0] = 0.000000
float bb[1] = 1.110000
float bb[2] = 2.220000
char cc[0] = "0000000000aaa "
char cc[1] = "1111111111bbb "
char cc[2] = "2222222222ccc "
-------------- END OF LIST ------------
20)testbbm
**** testbbm ***
AA: 0 0 0
BB: 0. 0. 0.
CC:
AA: 0 1 2
BB: 0. 1.11000 2.22000
CC:0000000000aaa 1111111111bbb 2222222222ccc
AA: 70 71 72
BB: 70.0000 71.1100 72.2200
CC:NEW0000000aaa NEW1111111bbb NEW2222222ccc
21)echo arrays after modification by FORTRAN program
22). varlist
--- LIST OF LOCAL BB VARIABLES ---
int aa[0] = 70
int aa[1] = 71
int aa[2] = 72
float bb[0] = 70.000000
float bb[1] = 71.110001
float bb[2] = 72.220001
char cc[0] = "NEW0000000aaa "
char cc[1] = "NEW1111111bbb "
char cc[2] = "NEW2222222ccc "
------------------------ END OF LIST ---------------------
23) end
************** END OF SCRIPT **************
|