네이티브 함수 블록에서 사용자 정의 배열 정의: 실용 가이드
이 포스트를 작성한 이유
사실 이 포스트는 네이티브 함수 블록을 개발할 때 사용자 정의 구조체의 배열을 사용하는 것이 불가능하다는 것을 발견했기 때문에 작성되었습니다. 달리 말하면, PLCnext의 공식 GitHub에 이런 유형의 튜토리얼이 없다는 것이 아쉽습니다. C# 튜토리얼을 사용해 네이티브 함수 블록에서 사용자 정의 배열을 만들려고 하면 성공적으로 컴파일되지 않거나, PLCnext Engineer에서 배열 값을 설정해도 반응이 없습니다. 이 예제의 경우 데이터베이스와 관련된 것뿐입니다.
데모 설명
- 다음 예제는 plcncli 툴체인을 사용해 네이티브 함수 블록으로 PLCnext Engineer와 함께 사용할 사용자 정의 배열 인터페이스를 생성합니다.
- 배열은 21개 요소로 구성되며, 각 요소는 구조체입니다. 구조체는 두 개의 IecString80과 하나의 열거형을 포함합니다. 다음 다이어그램과 같습니다.
https://github.com/Leeable/UserDefineArray_NativeFB/tree/Master
요구 사항
- ToolChain 버전이 23.0 이상인지 확인하세요. 이 예제는 23.6 ToolChain을 사용해 시연합니다.
- 네이티브 함수 블록 생성 기본 프로세스에 익숙해야 합니다.
- ToolChain 애드인 플러그인이 설치된 Visual Studio 2019 또는 2022
$ plcncli --version plcncli 23.6.0.1450 (23.6.0.1450)
1단계
- Visual Studio를 사용해 새 프로젝트를 생성하고, "Shared Native Function Block" 프로젝트 유형을 선택하고, 프로젝트 이름을 "ArrayTest"로 지정합니다.
- 그런 다음 Visual Studio의 ArrayTest 프로젝트 내에서 "ArrayCplus"라는 새 네이티브 함수 블록을 생성합니다.
2단계
-
해당 코드를 ArrayCplus.cs에 복사합니다.
-
소스 코드를 직접 포함하면 & 및 > 등의 표시 문제가 발생하므로 링크를 제공했습니다.
-
예를 들어 &는 이 HTML에서 &로 인코딩됩니다.....
ArrayCplus.cs
3단계
ArrayTestCpp 폴더에서 터미널을 열고 다음을 입력합니다.
$ plcncli generate code
코드 생성 후 src 디렉토리에서 ArrayTest-cli32.h 및 ArrayTest-cli64.h 파일을 찾아 #error가 표시된 부분을 찾습니다.
주석을 제거하고 코드를 개선해야 합니다. InArrayFB-cli.cpp로 이동해 구현을 수정합니다.
IntArrayFB-cli.cpp
4단계
ArrayCplus.cpp에 다음 코드를 입력합니다. 문자열을 포함하는 내용은 Init 영역이 아닌 Process 과정에서 초기화해야 합니다. Init 영역에서 초기화하면 작동하지 않아 Engineer를 통해 sName과 sAttribute에 값을 쓸 수 없습니다.
ArrayCplus-cli.cpp
5단계
ArrayTestCpp 폴더에서 터미널을 열고 다음을 입력합니다.
$ plcncli build all $ plcncli deploy
6단계
PLCnext Engineer를 열고 ArrayTest.pcwlx를 로드한 다음 ArrayTest에 arr이라는 변수를 추가합니다.
이제 작동합니다.
질문
- 이 방법이 실제로 작동하지만, IecString 또는 사용자 정의 String을 포함하는 콘텐츠를 void PInvoke ArrayTest::ArrayCplus::Process()에서 초기화해야 하고 void PInvoke ArrayTest::ArrayCplus::Init()에서 하면 안 되는 이유는 무엇입니까? Init()에 코드를 넣으면 작동하지 않습니다.
- GitHub에 네이티브 함수 블록용 사용자 정의 배열 튜토리얼이 분명히 없습니다. 누군가 보완하고 개선해 줄 수 있습니까? (C# 사용자 정의 배열 방식은 네이티브 함수 블록에서 작동하지 않습니다.)
- 마지막으로 혼란스러운 점은, IecString, 사용자 정의 String, IecStringEx* 중 무엇을 사용하든 문자열을 포함하는 경우 네이티브 함수 블록으로 사용할 때 C# 코드에서 【InOut】 형태여야 하는 이유는 무엇입니까?
참고:
Makers Blog는 Phoenix Contact에서 테스트하거나 검토하지 않은 커뮤니티 구성원의 애플리케이션과 사용자 스토리를 보여줍니다. 자신의 책임 하에 사용하세요.