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");
}
Leave a Reply
You must be logged in to post a comment.