PLCnext Engineer에서 C++ 단순/복합 데이터 타입 마스터하기
안녕하세요,
이 블로그 포스트에서는 PLCnext Engineer에서 C++의 단순 및 복합 데이터 타입을 탐구합니다. 단순 예제와 복합 예제 두 부분으로 구성됩니다.
이 튜토리얼은 C++과 PLCnext Engineer에 대한 어느 정도 경험이 있다고 가정합니다.
준비물
작업에 적합한 도구가 필요합니다: C++ 에디터, PLCnext Engineer 소프트웨어, 실행할 Phoenix Contact PLC. 사용한 자료는 다음과 같습니다:
- 펌웨어 버전 2021.0.3의 AXC F 2152
- PLCnext Engineer 버전 2021.0.2
- Visual Studio 2019 Community 버전 16.9.4
개인적으로 Visual Studio를 C++ 에디터로 선택했지만 Eclipse도 사용 가능합니다. 튜토리얼 링크:
PLCnext Engineer는 웹사이트에서 다운로드할 수 있습니다.
단순 예제
첫 예제로 PLC에서 올바른 숫자가 전송되는지 확인하는 작은 애플리케이션을 만듭니다. 새 C++ 프로젝트를 생성합니다. 헤더 파일([프로젝트명].hpp)로 이동합니다. [프로젝트명]component.hpp 파일도 있지만 사용하지 않습니다. 헤더 파일에 코드가 많이 있지만 걱정하지 마세요. 단순합니다. 먼저 포트를 정의합니다: 하나 IN, 하나 OUT. 단순 데이터 타입에만 해당됩니다:
//#port
//#attributes(input)
//#name(InputTest)
int64 InputTest = 0;
//#port
//#attributes(Output)
//#name(outputTest)
int64 OutputTest = 0;
다음 파일([프로젝트명].cpp)로 이동해 실제 코딩을 합니다. 별 내용 없겠지만 곧 바뀝니다. If문이나 switch case로 숫자 확인 코드를 추가합니다. 여기서는 if 구조를 사용했습니다:
void PLMProjectReadInputProgram::Execute() {
if (InputTest == 1) {
OutputTest = 15;
}
if (InputTest == 2) {
OutputTest = 150;
}
if (InputTest == 3) {
OutputTest = 1500;
}
if (InputTest == 4) {
OutputTest = 15000;
}
}
PLCnext Engineer로 넘어가기 전에 이 C++ 프로젝트를 PLC가 이해할 수 있는 라이브러리로 빌드해야 합니다. 화면 상단의 빌드 버튼을 클릭하면 됩니다. 잠시 실행 후 라이브러리 완료를 알립니다. 이 단계가 불명확하면 위에 링크된 튜토리얼을 확인하세요.

컴포넌트 탭의 '프로그래밍' 폴더 아래 'Local'의 메인 프로그램으로 이동한 후 메인 화면에서 '변수'를 선택해 PLC의 변수를 확인합니다. 여기서 이름, 데이터 타입, 용도를 선택할 수 있습니다. PLCnext Engineer의 데이터 타입은 C++ 프로그램과 동일해야 합니다. 타입과 대응표는 여기에서 확인 가능합니다. 용도는 변수가 로컬인지 외부 프로그램/변수와 데이터를 주고받을 수 있는지 정의합니다.

새 라이브러리를 추가한 후 변수를 연결합니다. 만든 라이브러리는 프로젝트의 bin 폴더에 있으며, 이를 PLCnext Engineer 라이브러리 폴더에 복사합니다. 위치는 대략:
C:\Users\Public\Documents\PLCnext Engineer\Libraries
PLCnext Engineer로 돌아가 라이브러리를 프로그램에 추가합니다. 컴포넌트 탭 → 라이브러리 박스 열기 → 라이브러리 우클릭 → '사용자 라이브러리 추가' → 앞서 간 라이브러리 폴더로 이동 → 사용할 라이브러리 선택 → 계속.

프로그램을 태스크에 추가해야 합니다. 왼쪽 플랜트 영역에서 PLCnext를 더블클릭. 중앙에 열리면 '태스크 및 이벤트' 탭으로 이동해 MainInstance 뒤에 새 프로그램 추가. 'PLCnext Components & Programs' 아래에서 프로그램 타입 선택하거나 드래그 앤 드롭으로 추가.

'태스크 및 이벤트' 탭 옆 '포트 리스트' 탭을 열면 C++과 PLCnext의 모든 변수가 표시됩니다.

모든 것을 올바르게 했다면 PLC의 OUT 포트를 C++ 프로그램의 IN 포트에 연결할 수 있고, 반대 방향도 가능합니다. 작동하지 않으면 데이터 타입을 확인하세요.

더미 값을 변수에 추가하려면 컴포넌트 탭의 메인 프로그램 → 메인 화면에서 '코드' 선택 → 코드 확인 후 직접 추가. 나가는 변수를 숫자 값(이 경우 1)으로 설정합니다.

이제 프로젝트를 PLC에 배포하면 C++ 코드에서 15라는 응답을 받아야 합니다. 이전 '포트 리스트'에서 변수를 확인할 수 있습니다.
복합 예제
이 예제에서는 구조체 배열을 PLC와 주고받는 작은 애플리케이션을 만듭니다. 새 C++ 프로젝트 생성. 헤더 파일([프로젝트명].hpp)로 이동. [프로젝트명]component.hpp는 사용하지 않습니다. 헤더 파일에 코드가 많지만 단순합니다. 먼저 이 예제용 구조체(자동차)를 만듭니다:
public: // typedefs
struct StrCar {
StaticString<80> sbrand;
int16 iHorsepower;
int16 iYear;
boolean xInsured;
};
중요! C++과 PLCnext Engineer의 이름과 타입이 동일해야 합니다! 데이터 타입은 여기에서 확인 가능합니다.
포트 정의: IN 하나, OUT 하나. 데이터 리스트이므로 리스트로 만듭니다. '자동차' 리스트로 만드는 것도 중요합니다:
//#port
//#attributes(Input)
//#name(CarIn)
StrCar CarToC[2];
//#port
//#attributes(Output)
//#name(CarOut)
StrCar CarFromC[2];
다음 파일([프로젝트명].cpp)로 이동해 실제 코딩. 자동차 1과 2의 값을 변경합니다:
// 첫 번째 멤버를 PLC에서 온 두 번째 자동차와 동일하게 설정
CarFromC[0].sbrand = CarToC[1].sbrand;
CarFromC[0].iHorsepower = CarToC[1].iHorsepower;
CarFromC[0].iYear = CarToC[1].iYear;
CarFromC[0].xInsured = CarToC[1].xInsured;
// 두 번째 멤버에 더미 값 추가
CarFromC[1].sbrand = CarToC[0].sbrand;
CarFromC[1].iHorsepower = CarToC[0].iHorsepower;
CarFromC[1].iYear = CarToC[0].iYear;
CarFromC[1].xInsured = CarToC[0].xInsured;
PLCnext Engineer로 넘어가기 전에 C++ 프로젝트를 라이브러리로 빌드합니다. 화면 상단 빌드 클릭. 완료 메시지 확인.

PLCnext Engineer에서 변수를 만들기 전에 자체 데이터 타입(구조체 자동차, 자동차 리스트)을 생성해야 합니다. 데이터 타입 파일은 여기서 찾고 생성할 수 있습니다:

파일을 열면(이미 열려 있지 않다면) 자체 구조체를 다음과 같이 만듭니다:
TYPE
StrCar:
STRUCT
sBrand: STRING;
iHorsepower: INT;
iYear: INT;
xInsured: BOOL;
END_STRUCT
END_TYPE
중요! C++과 PLCnext Engineer의 이름과 타입이 동일해야 합니다! 데이터 타입은 여기에서 확인 가능합니다.
구조체 생성 후 같은 파일에서 이 타입의 배열을 만듭니다:
TYPE
carList: ARRAY[0..1] OF StrCar;
END_TYPE
'carList' 타입으로 변수 생성: 컴포넌트 탭의 '프로그래밍' → 'Programs' 폴더 → 메인 화면에서 '변수' 선택 → PLC의 변수 확인. 이름, 데이터 타입(우리가 만든 커스텀 타입 선택), 용도 설정.

새 라이브러리 추가 후 변수 연결(단순 예제와 동일). 라이브러리 복사 → PLCnext Engineer 라이브러리 폴더 → '사용자 라이브러리 추가' → 라이브러리 선택.

프로그램을 태스크에 추가(단순 예제와 동일). 플랜트 영역에서 PLCnext 더블클릭 → '태스크 및 이벤트' 탭 → MainInstance 뒤에 새 프로그램 추가.

'포트 리스트' 탭에서 C++과 PLCnext의 모든 변수 확인.

올바르게 했다면 PLC의 OUT 포트를 C++ 프로그램의 IN 포트에 연결 가능. 반대 방향도 가능. 작동 안 하면 데이터 타입과 변수 이름 확인.

더미 값 추가: 메인 프로그램 → '코드' 선택 → 코드 확인 후 직접 추가. 나가는 변수에 자동차 세부사항 설정. 데이터 타입에 맞게 선택(문자열 쓴 곳에 문자열 등).
CarToC[0].sBrand := 'Audi';
CarToC[0].iHorsepower := 200;
CarToC[0].iYear := 2020;
CarToC[0].xInsured := TRUE;
CarToC[1].sBrand := 'Mazda';
CarToC[1].iHorsepower := 120;
CarToC[1].iYear := 2001;
CarToC[1].xInsured := FALSE;
이 예제를 배포하면 나가는 리스트가 들어오는 리스트에서 스왑된 것을 볼 수 있습니다. 이전 '포트 리스트'에서 변수 확인 가능.