|
<< Click to Display Table of Contents >> Navigation: API MasterSCADA 4D > Функции, ФБ, Протоколы на С++ > API для ФБ и протоколов > Разработка протоколов > Разработка простого протокола > Реализация простого протокола в C++ |
Пример реализации подключен к Examples.sln как mplc_simple_test_protocol:

Для разработки своих собственных протоколов нужно открыть пример и изменить те части проекта, которые отвечают за логику работы. Вспомогательные файлы, служащие для взаимодействия с исполнительной системой, редактировать не требуется.
В случае протокола наследоваться надо от класса ScadaProtocol. Также как и с ФБ, необходимы макросы регистрации класса MPLC_OBJECT(SimpleTestProtocol) в секции public. Также переопределению подлежат чисто виртуальные методы Execute() и Creatе(), которые отвечают за создание каналов и логику их хранения в самом классе протокола. Метод Connect() отвечает за подключение к устройству.
Для этого в примере был создан заголовочный файл simple_test_protocol.h:

Содержимое файла:
Скриншот |
Текст |
|
#pragma once #include <mplc/api.h>
#include "emulator.h"
class SimpleTestProtocol final : public mplc::api::ScadaProtocol { private: std::vector<mplc::api::ScadaChannel*> channels; Emulator *emulator; bool connected{false}; bool Connect();
public: MPLC_OBJECT(SimpleTestProtocol); SimpleTestProtocol(); ~SimpleTestProtocol(); void Execute() override; mplc::api::ScadaChannel* Create(const mplc::vm::Channel* channel) override; void Init() override; };
|
Протокол и его свойства надо зарегистрировать в файлах исходных кодов макросом MPLC_PROTOCOL_TYPE.
Для этого в примере был создан файл реализации для протокола simple_test_protocol.cpp:

Содержимое файла:
Скриншот |
Текст |
|
#include "simple_test_protocol.h"
SimpleTestProtocol::SimpleTestProtocol() { emulator = new Emulator(); }
SimpleTestProtocol::~SimpleTestProtocol() { emulator->close(); delete emulator; }
bool SimpleTestProtocol::Connect() { if (connected) { return true; } if (!emulator->connect()) { return false; } connected = true; SetFaultState(false, ""); return true; }
void SimpleTestProtocol::Init() { emulator->init(); }
void SimpleTestProtocol::Execute() { if (!isConnect()) { return; } if (!Connect()) { SetFaultState(true, "Failed to connect"); return; } if (!isExecute()) { return; }
std::string buff;
for (auto ch : channels) { // Read value from emulator and write to ScadaChannel buff = emulator->read(); ch->InVar.Update(buff);
// Read value from ScadaChannel and write to emulator if (ch->OutVar.Changed()) { buff = ch->OutVar.Get<std::string>(""); emulator->write(buff); } } AcknowledgeAllChanges(); }
mplc::api::ScadaChannel* SimpleTestProtocol::Create(const mplc::vm::Channel* channel) { auto ch = new mplc::api::ScadaChannel(); channels.push_back(ch); ch->BaseInit(channel); Register(ch); return ch; }
MPLC_PROTOCOL_TYPE(SimpleTestProtocol, SimpleTestProtocol); |
В методе Execute() желательно выполнять проверки условий исполнения. Проверка isConnect() является приоритетной, поэтому должна выполняться первой. Затем проверка наличия подключения или его осуществление через метод Connect(). Последним выполняется проверка разрешения на выполнение методом isExecute().
В случае возникновения какой либо ошибки при подключении к устройству желательно выставлять методом SetFaultState(bool state, std::string err_text).
Каналы после создания необходимо проинициализировать методом BaseInit(), а затем зарегистрировать методом Register().
У каналов имеется несколько методов для получения и установки значений. Для проверки изменения значения можно использовать метод Changed(), который выдаёт TRUE, если значение было изменено из редактора. Для получения самого значения имеется метод Get<typename T>(T def_val);. Для записи значения в канал так же есть два метода: Set() и Update(). Метод Update() устанавливает значение только в случае, если оно изменилось. Метод Set() в свою очередь вне зависимости от того, изменилось значение или нет, устанавливает его.
В конце выполнения метода Execute() необходимо вызывать метод AcknowledgeAllChanges(), что завершит все необходимые обновления в каналах.
Ввод и вывод данных из каналов модулей происходит методами Read и Write класса ScadaChannel. ch - это указатель на класс ScadaChannel.
Важно! Метод Read выдаёт ошибку и не возвращает значение, пока заменяется на комбинацию методов.
Далее можно компилировать проект.
Для компиляции проекта на ОС Windows нужно выполнить команду Build в контекстном меню проекта:

Скомпилированные файлы появятся в папке проекта: C:\mplc\api\platform\x64\bin\Release (адрес действителен, если название папок, которые делал разработчик, совпадают с названиями, которые давались в этой инструкции).
Чтобы произвести сборку под Linux платформы, нужно сохранить проект и перенести все файлы из папки C:\mplc\api (адрес действителен, если название папок, которые делал разработчик, совпадают с названиями, которые давались в этой инструкции) в созданный каталог на компьютере с ОС Linux. Подробнее смотрите в разделе Сборка под Linux платформы.
После сборки можно приступать к тестированию созданного ФБ.