Link Search Menu Expand Document

External Task - Tutorial


본 튜터리얼은 enuSpace for jupiter version 기반으로 작성되었습니다.

reference c-task code : https://github.com/EXPNUNI/enuSpace-Article/blob/master/sample_task/c_task/Task/CoreTask/CoreTask/CoreTask.cpp

reference fortran-task code1 : https://github.com/EXPNUNI/enuSpace-Article/blob/master/sample_task/fortran_task/Task/CoreTaskF/CoreTask/CoreTask.cpp

reference fotran_task code2 : https://github.com/EXPNUNI/enuSpace-Article/blob/master/sample_task/fortran_task_x64/Task/CoreTaskF/CoreTask/CoreTask.cpp

Mixed language - C and Fortran Task

https://github.com/EXPNUNI/enuSpace-Article/tree/master/sample_task/fortran_task 다운

Project Open

fortran_task.enup 프로젝트를 오픈합니다.

Database Tag 추가

데이터베이스 Tag를 추가합니다.

프로젝트 닫기를 수행하고 코드를 수정합니다.

연동 코드 수정

fortran_task\Task\CoreTaskF\CoreTask\CoreTask.vcproj 파일 오픈

FortranModule 프로젝트 내의 Calculation.f 파일을 수정합니다.

추가된 enuSpace Tag의 값을 취득하고 값을 설정하기 위하여 아래와 같이 코드를 추가합니다.

      SUBROUTINE MAIN_PROC()

      USE globals                       
      REAL*8 DATA_VALUE 
      REAL*8 ARRAY_VALUE(3,3)

      CALL GetValue('@CORE.analog', DATA_VALUE)
      IF (DATA_VALUE .GT. 1.0) THEN
        DATA_VALUE = 0
      ELSE
        DATA_VALUE = DATA_VALUE+0.01
      ENDIF
      CALL SetValue('@CORE.analog', DATA_VALUE)      

      CALL Message('Call Main Proc')
      END

빌드 수행시 enuSpace 64bit를 이용하는 경우, 64bit 환경으로 컴파일 및 빌드를 수행합니다.

FortranModule 프로젝트 빌드를 수행합니다.

FortranModule.lib 파일이 정상적으로 생성되었는지 확인합니다.

CoreTask 프로젝트 빌드를 수행합니다.

fortran_task\Task\CoreTaskF\CoreTaskF.dll 파일이 정상적으로 생성되었는지 확인합니다.

Array 변수값에 대한 연동

데이터베이스의 Tag정보를 배열 변수 double 형 @CORE.flux[3][3] 등록하였다면, GetArrayValue()함수와 SetArrayValue()함수를 통하여 데이터를 연동할 수 있다.

GetArrayValue()함수는 하나의 배열 변수에 대하여 값을 취득하며, SetArrayValue()함수는 주어진 형의 사이즈만큼 전달을 수행한다.

이때 Fortran의 배열의 메모리 인덱스 와 C배열의 메모리 인덱스가 다르다.

예)

fortran ARRAY__VALUE(1,1) => C ARRAY__VALUE[0][0]

fortran ARRAY__VALUE(2,1) => C ARRAY__VALUE[0][1]

fortran ARRAY__VALUE(3,1) => C ARRAY__VALUE[0][2]

      SUBROUTINE MAIN_PROC()

      USE globals                       
      REAL*8 DATA_VALUE 
      REAL*8 ARRAY_VALUE(3,3)

      ARRAY_VALUE(1,1) = 0
      ARRAY_VALUE(1,2) = 0
      ARRAY_VALUE(1,3) = 0      
      CALL GetArrayValue('@CORE.flux[0][0]', ARRAY_VALUE(1,1))
      CALL GetArrayValue('@CORE.flux[0][1]', ARRAY_VALUE(2,1))
      CALL GetArrayValue('@CORE.flux[0][2]', ARRAY_VALUE(3,1))

      ARRAY_VALUE(1,1) = ARRAY_VALUE(1,1) + 0.1
      ARRAY_VALUE(1,2) = ARRAY_VALUE(1,2) + 0.1
      ARRAY_VALUE(1,3) = ARRAY_VALUE(1,3) + 0.1

      CALL SetArrayValue('@CORE.flux[0][0]', ARRAY_VALUE(1,1), 2, 3*3);

      END

SetArrayValue()함수의 세번째 파라미터는 정의된 아래의 타입정보를 입력한다.

#define DEF_INT                0
#define DEF_FLOAT            1
#define DEF_DOUBLE            2
#define DEF_BOOL            3

Data Sizes (Fortran And C)

FORTRANC
INTEGER Xint x
INTERGER*4 Xint x
REAL Xfloat x
REAL*4 Xfloat x
REAL*8 Xdouble x

연동 테스트

프로젝트를 오픈하여 Task를 기동합니다.

추가된 Database Tag 변수 @CORE.analog의 값이 변경되는지 확인합니다.