Обозначение

Описание
Блок предназначен для создания универсальных протоколов.
Назначение входов и выходов
| Входы | Тип | Описание |
| cnc | cnc | Интерфейс передачи данных. |
| enable | uns | Работа разрешена. |
| exec | b | Фронт отправки запроса. |
| period | u32 | Период работы (мс). Если стоит, например, 1000 мс, то блок будет работать раз в 1000 мс. 0 - отключено. |
| timeout | i32 | Таймаут ожидания ответа (мс). 0 - отключено. |
| retries | u16 | Число повторных попыток. Используется, если таймаут не равен нулю. |
| request | arr_uint8 | Буфер запроса. Перед работой требует инициализации. |
| request_size | u32 | Размер буфера запроса. 0 - сброс блока. |
| response | arr_uint8 | Буфер ответа. Перед работой требует инициализации. |
| response_size | u32 | Размер буфера ответа. |
| expected | u32 | Ожидаемый размер ответа. 0 - отключено. |
| stop_char | u16 | Стоп-символы протокола. 0 - отключено. |
| cfg | u32 | Конфигурация. В данный момент не используется. |
| Выходы | Тип | Описание |
| have_response | b | Пришёл ответ. |
| rsts | i32 | Статус получения ответа. |
| wsts | i32 | Статус отправки запроса. |
| sts | i32 | Статус работы блока. |
| vld | b | Валидность. |
Статусы блока
| Статусы получения ответа | Описание |
| -4 | Сработал таймаут. |
| -3 | Пришёл некорректный стоп-символ. |
| -2 | Ожидаемый размер не совпадает. |
| -1 | Размер ответа больше, чем размер буфера ответа. |
| 0 | Ожидание ответа. |
| 1 | Ответ получен. |
| Статусы отправки запроса | Описание |
| -1 | Размер запроса больше, чем размер буфера запроса. |
| 0 | Ожидание запроса. |
| 1 | Запрос отправлен. |
| Статусы работы блока | Описание |
| -6 | Сработал таймаут. |
| -5 | Пришёл некорректный стоп-символ. |
| -4 | Ожидаемый размер не совпадает. |
| -3 | Размер ответа больше, чем размер буфера ответа. |
| -2 | Размер запроса больше, чем размер буфера запроса. |
| -1 | Соединение отсутствует. |
| 0 | Ожидание фронта. |
| 1 | Блок работает корректно. |
Алгоритм
Ниже приведены возможные сценарии использования блока.
Пример реализации клиента (мастера):
Самое главное - помнить о том, что в рамках работы блока ProtocolAdapter request - это то, что блок отправляет, а response - это то, что блок получает.
Следовательно, запрос от клиента будет приходить в буфер response, а ответ клиенту будет отправляться через буфер request.
Пример реализации сервера (слейва):
Пример реализации клиента (мастера):
- На вход блока cnc подключается выход cnc блока клиента (мастера). Например, блок TcpIpClA или SerialPort.
- На вход блока request подключается буфер запроса. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
- На вход блока response подключается буфер ответа. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
- Задаются параметры протокола, такие как: таймаут ожидания, ожидаемый размер ответа и др. Они зависят от реализуемого протокола.
- Заполняется буфер запроса.
- Запрос отправляется по фронту (вход exec).
- После отправки фронт нужно сбросить (вход exec).
- Если ответ не требуется, то таймаут ожидания ответа выставляется равным нулю. Блок снова готов к отправке запроса.
- При получении ответа взводится выход have_response.
- После прочтения ответа из буфера ответа необходимо сбросить блок. Для этого нужно отправить запрос нулевого размера.
- После отправки запроса нулевого размера фронт нужно сбросить (вход exec).
- Блок снова готов к отправке запроса.
Самое главное - помнить о том, что в рамках работы блока ProtocolAdapter request - это то, что блок отправляет, а response - это то, что блок получает.
Следовательно, запрос от клиента будет приходить в буфер response, а ответ клиенту будет отправляться через буфер request.
Пример реализации сервера (слейва):
- На вход блока cnc подключается выход cnc блока сервера (слейва). Например, блок TcpIpSrA или SerialPort.
- На вход блока request подключается буфер запроса. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
- На вход блока response подключается буфер ответа. Он создаётся с помощью блока CreateArrayUInt8 или через ЯП C++/ST.
- Задаются параметры протокола, такие как: таймаут ожидания (для сервера (слейва) равен нулю. В противном случае сервер (слейв) будет ожидать запроса от клиента), ожидаемый размер запроса и др. Они зависят от реализуемого протокола.
- При получении запроса от клиента (для блока это буфер response), взводится выход have_response.
- После прочтения запроса из буфера ответа происходит отправка ответа из буфера запроса. Для этого нужно заполнить буфер запроса и взвести фронт отправки запроса (exec).
- После отправка ответа из буфера запроса необходимо сбросить блок. Для этого нужно отправить ответ нулевого размера.
- Блок снова готов к обработке запроса.
Тестовый проект
Тестовый проект находится в разделе "Ссылки".
Здесь приведено его описание.
Тестовый проект содержит в себе два составных блока, написанных на ЯП C++: TestClient и TestServer.
Данные блоки реализиют клиентскую и серверную части выдуманного протокола соответственно.
Алгоритм работы:
Здесь приведено его описание.
Тестовый проект содержит в себе два составных блока, написанных на ЯП C++: TestClient и TestServer.
Данные блоки реализиют клиентскую и серверную части выдуманного протокола соответственно.
Алгоритм работы:
- Блок TestClient отправляет серверу запрос, содержащий значение со схода send_val, при срабатывании фронта send. В начале пакета он формирует заголовок запроса, в которую записывает текущую метку времени в формате Unix Epoch.
- Блок TestServer получает запрос и считывает заголовок со значением. В качестве ответа сервер отправляет полученную метку времени, а также инвертированное значение. На выход get_val он помещает полученное от клиента значение.
- Блок TestClient получает ответ и обрабатывает его. На выход get_val он получает полученное от сервера значение.
Важно!
Для удобства восприятия TestServer и ProtocolAdapter, с которым он взаимодействует, имеют инвертированные имена и комментарии.
Например, выход have_response блока ProtocolAdapter имеет комментарий "пришёл запрос" вместо стандартного "пришёл ответ".
Для удобства восприятия TestServer и ProtocolAdapter, с которым он взаимодействует, имеют инвертированные имена и комментарии.
Например, выход have_response блока ProtocolAdapter имеет комментарий "пришёл запрос" вместо стандартного "пришёл ответ".