Skip to content

직접변수 매니저

직접변수(Direct Variable)는 STEP에서 Shared Memory를 통해 메모리를 직접 읽고 쓸수 있는 변수입니다. Shared Memory 뿐만 아니라 Conty 및 다른 통신에서도 직접변수에 접근 가능하여, 같은 주소의 직접변수는 서로 공유되기 때문에 이를 통해 통신 등 다양한 활용이 가능합니다.

Direct Variable Manager는 직접변수에 쉽게 접근하기 위한 함수들을 제공하는 클래스입니다.

  • Namespace : NRMKIndy::SharedData

  • Header : NRMKFramework/Indy/SharedMemory/DirectVariable.h

직접변수 타입 및 주소

직접변수의 타입은 7가지 (Byte, Word, DWord, LWord, Float, DFloat, Modbus)가 있습니다. 여기서 Modbus Type은 ModbusTCP 통신에서 사용되는 직접변수로, Shared Memory가 아닌 Modbus Master(Client)를 통해서 접근할 수 있으므로 설명에서 제외합니다.

각 타입별 직접변수는 1000개씩 제공되며, 주소값을 이용해 변수를 표현합니다. 주소는 000~999로, 세 자리 수로 표현됩니다. 아래 표는 각 직접변수 타입별 바이트와 데이터 타입입니다.

Direct Variable Type Address Representation Data Type
BYTE (B) B000 ~ B999 1 Byte, Unsigned Integer
WORD (W) W000 ~ W999 2 Byte, Integer
DWORD (I) I000 ~ I999 4 Byte, Integer
LWORD (L) L000 ~ L999 8 Byte, Integer
LWORD (L) L000 ~ L999 4 Byte, Floating Point (real number)
DFLOAT (D) D000 ~ D999 8 Byte, Floating Point (real number)

예를 들어 4byte integer 타입의 변수 10개를 사용하려 하고, 110번 주소부터 연속적으로 사용 할 경우, I110 ~ I119 주소의 변수를 사용합니다. 100 이하의 주소에 접근 할 경우에도 W002와 같이 앞에 0을 넣어 세자리 수로 표현해야 합니다.

직접변수 읽기 및 쓰기

데이터 구조

1
2
3
4
5
6
7
8
union DirectVariableVal {
    uint8_t byteVal;
    int16_t wordVal;
    int32_t dwordVal;
    int64_t lwordVal;
    float floatVal;
    double dfloatVal;
}

데이터타입은 Union으로, "W001", "D024" 등 직접변수 주소를 통해 그 값을 읽을 때, 함수는 반환 타입을 알 수 없으므로 union을 사용하여 반환합니다. 주의할 점은 값을 읽은 주소와 union에서 사용할 변수의 타입이 일치해야 한다는 것입니다.

uint8_t byteVal : BYTE 타입 변수일 때 사용

int16_t wordVal : WORD 타입 변수일 때 사용

int32_t dwordVal : DWORD 타입 변수일 때 사용

int64_t lwordVal: LWORD 타입 변수일 때 사용

float floatVal : FLOAT 타입 변수일 때 사용

double dfloatVal : DFLOAT 타입 변수일 때 사용

함수

  • Constructor
1
DirectVariableManager (NRMKFramework::ShmemManager & indyShm)
  • NRMKFramework::ShmemManager & indyShm : Indy Shared Memory와 연결된 Shared Memory Manager

  • Get Specific Type Direct Varialbe as Reference with Address Num

1
2
3
4
5
6
uint8_t & byteVar(int addr);
int16_t & wordVar(int addr);
int32_t & dwordVar(int addr);
int64_t & lwordVar(int addr);
float & floatVar(int addr);
double & dfloatVar(int addr);

파라미터는 0~999로, 직접변수 주소를 표현하는 "W000"식이 아닌, 주소값만을 입력받습니다. 예를들어 "B019" 직접변수를 얻고 싶다면 byteVar(19)를 호출하면 됩니다.

  • Get Direct Variable's Value with Name
1
DirectVariable getVar(const std::string & strAddr);

파라미터로 "W000", "D437"과 같이 주소값을 포함한 직접변수 이름을 사용합니다. union인 DirectVariable 을 리턴하기 때문에, union내에서 지정된 직접변수에 알맞은 변수 타입을 사용해야 합니다.

  • Set Direct Variable's Value
1
2
3
4
5
6
void setVar(const std::string & strAddr, uint8_t val);
void setVar(const std::string & strAddr, int16_t val);
void setVar(const std::string & strAddr, int32_t val);
void setVar(const std::string & strAddr, int64_t val);
void setVar(const std::string & strAddr, float val);
void setVar(const std::string & strAddr, double val);

"W000", "D437"과 같이 주소값을 포함한 직접변수 이름과, 해당하는 직접변수에 쓸 값을 파라미터로 받습니다. 직접변수 이름에 대한 직접변수 타입과, 직접변수에 쓸 값의 타입이 일치해야 합니다.