Обозначение


Описание

Блок предназначен для создания универсальных протоколов.

Назначение входов и выходов

ВходыТипОписание
cnccncИнтерфейс передачи данных.
enableunsРабота разрешена.
execbФронт отправки запроса.
periodu32Период работы (мс).
Если стоит, например, 1000 мс, то блок будет работать раз в 1000 мс.
0 - отключено.
timeouti32Таймаут ожидания ответа (мс).
0 - отключено.
retriesu16Число повторных попыток.
Используется, если таймаут не равен нулю.
requestarr_uint8Буфер запроса.
Перед работой требует инициализации.
request_sizeu32Размер буфера запроса.
0 - сброс блока.
responsearr_uint8Буфер ответа.
Перед работой требует инициализации.
response_sizeu32Размер буфера ответа.
expectedu32Ожидаемый размер ответа.
0 - отключено.
stop_charu16Стоп-символы протокола.
0 - отключено.
cfgu32Конфигурация. В данный момент не используется.
ВыходыТипОписание
have_responsebПришёл ответ.
rstsi32Статус получения ответа.
wstsi32Статус отправки запроса.
stsi32Статус работы блока.
vldbВалидность.

Статусы блока

Статусы получения ответаОписание
-4Сработал таймаут.
-3Пришёл некорректный стоп-символ.
-2Ожидаемый размер не совпадает.
-1Размер ответа больше, чем размер буфера ответа.
0Ожидание ответа.
1Ответ получен.
Статусы отправки запросаОписание
-1Размер запроса больше, чем размер буфера запроса.
0Ожидание запроса.
1Запрос отправлен.
Статусы работы блокаОписание
-6Сработал таймаут.
-5Пришёл некорректный стоп-символ.
-4Ожидаемый размер не совпадает.
-3Размер ответа больше, чем размер буфера ответа.
-2Размер запроса больше, чем размер буфера запроса.
-1Соединение отсутствует.
0Ожидание фронта.
1Блок работает корректно.

Алгоритм

Ниже приведены возможные сценарии использования блока.

Пример реализации клиента (мастера):
  1. На вход блока cnc подключается выход cnc блока клиента (мастера). Например, блок TcpIpClA или SerialPort.
  2. На вход блока request подключается буфер запроса. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
  3. На вход блока response подключается буфер ответа. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
  4. Задаются параметры протокола, такие как: таймаут ожидания, ожидаемый размер ответа и др. Они зависят от реализуемого протокола.
  5. Заполняется буфер запроса.
  6. Запрос отправляется по фронту (вход exec).
  7. После отправки фронт нужно сбросить (вход exec).
  8. Если ответ не требуется, то таймаут ожидания ответа выставляется равным нулю. Блок снова готов к отправке запроса.
  9. При получении ответа взводится выход have_response.
  10. После прочтения ответа из буфера ответа необходимо сбросить блок. Для этого нужно отправить запрос нулевого размера.
  11. После отправки запроса нулевого размера фронт нужно сбросить (вход exec).
  12. Блок снова готов к отправке запроса.
Сервер (слейв) реализуется похожим образом, но понятия запроса и ответа для него инвертированы.
Самое главное - помнить о том, что в рамках работы блока ProtocolAdapter request - это то, что блок отправляет, а response - это то, что блок получает.
Следовательно, запрос от клиента будет приходить в буфер response, а ответ клиенту будет отправляться через буфер request.
Пример реализации сервера (слейва):
  1. На вход блока cnc подключается выход cnc блока сервера (слейва). Например, блок TcpIpSrA или SerialPort.
  2. На вход блока request подключается буфер запроса. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
  3. На вход блока response подключается буфер ответа. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
  4. Задаются параметры протокола, такие как: таймаут ожидания (для сервера (слейва) равен нулю. В противном случае сервер (слейв) будет ожидать запроса от клиента), ожидаемый размер запроса и др. Они зависят от реализуемого протокола.
  5. При получении запроса от клиента (для блока это буфер response), взводится выход have_response.
  6. После прочтения запроса из буфера ответа происходит отправка ответа из буфера запроса. Для этого нужно заполнить буфер запроса и взвести фронт отправки запроса (exec).
  7. После отправка ответа из буфера запроса необходимо сбросить блок. Для этого нужно отправить ответ нулевого размера.
  8. Блок снова готов к обработке запроса.

Тестовый проект

Тестовый проект находится в разделе "Ссылки".
Здесь приведено его описание.

Тестовый проект содержит в себе два составных блока, написанных на ЯП C++: TestClient и TestServer.
Данные блоки реализиют клиентскую и серверную части выдуманного протокола соответственно.
Алгоритм работы:
  1. Блок TestClient отправляет серверу запрос, содержащий значение со схода send_val, при срабатывании фронта send. В начале пакета он формирует заголовок запроса, в которую записывает текущую метку времени в формате Unix Epoch.
  2. Блок TestServer получает запрос и считывает заголовок со значением. В качестве ответа сервер отправляет полученную метку времени, а также инвертированное значение. На выход get_val он помещает полученное от клиента значение.
  3. Блок TestClient получает ответ и обрабатывает его. На выход get_val он получает полученное от сервера значение.
Важно!
Для удобства восприятия TestServer и ProtocolAdapter, с которым он взаимодействует, имеют инвертированные имена и комментарии.
Например, выход have_response блока ProtocolAdapter имеет комментарий "пришёл запрос" вместо стандартного "пришёл ответ".

Ссылки