IEC 프로그래밍에서 복잡한 GDS 포트 정의 및 연결 마스터하기
요약
이 문서에서는 C++에서 데이터 구조 같은 복잡한 GDS 포트를 정의하고 이를 IEC 코드의 GDS 포트에 연결하는 방법을 설명합니다.
데이터 구조
데이터 구조를 선언하는 방법. C++을 살펴보겠습니다.
#pragma once
#include "Arp/System/Core/Arp.h"
#include "Arp/Plc/Commons/PlcTypes.h"
namespace MyComponent {
class MyData {
public:
MyData() = default;
~MyData() = default;
public:
Arp::boolean Valid = false;
Arp::int16 IntegerValue = 0;
Arp::Plc::Commons::Gds::StaticString<80> StringValue = "";
Arp::uint8 Data[8] = {0x00};
};
} // namespace MyComponent
그리고 프로그램 클래스 헤더에서 이 타입을 GDS 포트로 정의할 수 있습니다.
#pragma once
...
#include "MyData.hpp"
namespace MyComponent {
//#program
//#component(MyComponent::MyComponent)
class MyProgramm ...
{
...
public:
//#port
//#name(TheData)
//#attributes(Input)
MyData GdsPortMyData;
};
} // namespace MyComponent
GDS 포트를 IEC 코드의 GDS 포트에 연결하려면 IEC 코드의 변수가 동일한 타입이어야 합니다. 이는 IEC 구조체가 C++ 데이터 타입과 동일한 데이터 레이아웃을 가져야 함을 의미합니다. 또한 모든 요소 이름이 C++ 타입의 요소와 일치해야 합니다.
TYPE UDT_PROJECT_MY_DATA : STRUCT
Valid BOOL;
IntegerValue : INT;
StringValue : STRING;
Data : ARRAY [0..7] OF BYTE;
END_STRUCT;
END_TYPE
UDT_PROJECT_MY_DATA 타입의 GDS 아웃 포트를 C++ 프로그램의 GDS 인 포트 TheData에 연결할 수 있습니다.
STRING에 대한 특별 참고 사항
STRING 데이터 타입에 대한 특별 참고 사항. 현재 IEC 코드는 UTF-8 인코딩을 인식하지 못합니다. 문자열 리터럴은 ISO-8859-1 인코딩을 사용합니다. 따라서 C++ 코드의 문자열 리터럴과 비교하기 전에 UTF-8로 변환해야 할 수 있습니다. boost-locale 라이브러리를 사용하여 ISO-8859-1과 UTF-8 간 변환할 수 있습니다.
Arp::String toUtf8(const Arp::String& s) {
return boost::locale::conv::to_utf<char>(s.CStr(), "ISO-8859-1");
}