Store PLCnext CommunityPLCnext on LinkedInPLCnext on Instagram  PLCnext on YouTube Github PLCnext CommunityStore PLCnext Community

 

 How to create a Blog Entry

How to define complex GDS Ports and connect them to GDS Port in IEC code

Abstract

In this article I will explain how to define complex GDS ports like data structures in C++ and connect them to GDS port in IEC code.

Data Structures

How to declare data structures. Lets look at 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

And in the Header of the programm class this type can now be defined as GDS Port.

#pragma once
...
#include "MyData.hpp"

namespace MyComponent
{

//#program
//#component(MyComponent::MyComponent)
class MyProgramm ...
{

...

public:
    //#port
    //#name(TheData)
    //#attributes(Input)
    MyData GdsPortMyData;

};

} // namespace MyComponent

To be able to connect the GDS Port to a GDS Port in IEC code the variable in the IEC code has to be of the same type. This means the IEC structure has to have same data layout as the C++ data type. In addition all element names have to match the elements in the C++ type.

TYPE

UDT_PROJECT_MY_DATA : STRUCT
    Valid BOOL;
    IntegerValue : INT;
    StringValue : STRING;
    Data : ARRAY [0..7] OF BYTE;
END_STRUCT;

END_TYPE

A GDS Out Port of the type UDT_PROJECT_MY_DATA can now be connected to the GDS In Port TheData of the C++ program.

Special note to STRING

A special note to STRING data type. Be aware that the IEC code for now is not aware of UTF-8 encoding. The string literals are using ISO-8859-1 encoding. So it may be necessary to convert them to UTF-8 before comparing them with string literals in C++ code. You can use the boost-locale library for converting between ISO-8859-1 to UTF-8 and back.

Arp::String toUtf8(const Arp::String& s)
{
    return boost::locale::conv::to_utf<char>(s.CStr(), "ISO-8859-1");
}