Состояние Data — финальное состояние установки соединения FSoE, в котором соединение проводит всё остальное время своего существования. Оно следует за состоянием Parameter. В отличие от предыдущих состояний, где число циклов FSoE было фиксировано протоколом, состояние Data выполняется непрерывно — циклы FSoE передаются до возникновения ошибки связи или локальной остановки узла FSoE. В каждом цикле FSoE Master отправляет SafeOutputs на FSoE Slave, а FSoE Slave подтверждает, возвращая SafeInputs обратно Master.
В состоянии Data используются две команды:
- ProcessData — используется, когда безопасные данные корректны.
- FailSafeData — используется, когда узел локально обнаруживает, что его безопасные данные недостоверны или должны быть переведены в безопасное состояние.
В этой статье разобраны все четыре PDU состояния Data, определённые в ETG.5100 S (D) V1.2.0, §8.2.2.6, на каноническом примере спецификации — 4 октета безопасных данных.
Примечание — количество байтов безопасных данных фиксировано для каждого направления. Каждое соединение FSoE имеет фиксированную длину безопасных данных (Master→Slave и Slave→Master), одинаково настроенную на обоих узлах. Допустимые длины: 1, 2, 4, 6 или 8 октетов. Фактическая длина для конкретного соединения зависит от устройства FSoE Slave и берётся из документации Slave или файла описания устройства (ESI/EEPROM). Примеры ниже используют 4 октета, как в спецификации; байтовое представление для других длин показано в FSoE Reset PDU: Master and Slave Structure.
Когда выполняется вход в состояние Data и выход из него?
Состояние Data вводится, когда Master покидает состояние Parameter, отправляя Safety Master PDU с командой ProcessData (или FailSafeData). После входа в состояние Data соединение остаётся в нём неограниченно долго:
| Направление | Условие |
|---|---|
| Master остаётся в Data | Master циклически отправляет ProcessData или FailSafeData PDU до возникновения ошибки связи или локальной остановки. |
| Slave остаётся в Data | Slave подтверждает каждый PDU Master и отправляет ProcessData или FailSafeData обратно до возникновения ошибки связи или локальной остановки. |
Оба узла немедленно выходят из состояния Data при обнаружении ошибки связи FSoE — в этом случае они возвращаются в состояние Reset.
Команда ProcessData (корректные данные)
Safety Master PDU (FSoE Master → Slave)
Master отправляет этот PDU для передачи SafeOutputs на Slave. Это Таблица 23 спецификации ETG.5100 S (D) V1.2.0 для 4 октетов безопасных данных.
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| ProcessData Октет 0 | SafeOutputs, байт 1 Октет 1 | SafeOutputs, байт 2 Октет 2 | CRC_0_Lo Октет 3 | CRC_0_Hi Октет 4 | SafeOutputs, байт 3 Октет 5 | SafeOutputs, байт 4 Октет 6 | CRC_1_Lo Октет 7 | CRC_1_Hi Октет 8 | Connection Id, мл. Октет 9 | Connection Id, ст. Октет 10 |
Ключевые моменты:
- Command (октет 0) —
ProcessData. - SafeData[0..3] несут SafeOutputs — фактические безопасные выходные данные от Master к Slave. Байты располагаются по порядку: SafeData[0] — 1-й октет, SafeData[1] — 2-й и так далее.
- Conn_Id (октеты 9 и 10) несёт Connection ID, как и в состояниях Connection и Parameter.
- CRC_0 и CRC_1 передаются как 16-битные little-endian значения. Наследование CRC активно на всех циклах состояния Data, связывая каждый PDU с предыдущим.
Safety Slave PDU (FSoE Slave → Master)
Slave подтверждает PDU ProcessData от Master и отправляет SafeInputs обратно Master. Это Таблица 24 спецификации ETG.5100 S (D) V1.2.0.
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| ProcessData Октет 0 | SafeInputs, байт 1 Октет 1 | SafeInputs, байт 2 Октет 2 | CRC_0_Lo Октет 3 | CRC_0_Hi Октет 4 | SafeInputs, байт 3 Октет 5 | SafeInputs, байт 4 Октет 6 | CRC_1_Lo Октет 7 | CRC_1_Hi Октет 8 | Connection Id, мл. Октет 9 | Connection Id, ст. Октет 10 |
Обратите внимание на асимметрию с предыдущими состояниями: в состоянии Data Slave не возвращает безопасные данные Master. Вместо этого он отправляет собственные SafeInputs — безопасные входные данные от Slave к Master. Master отправляет SafeOutputs, Slave отвечает SafeInputs; каждое направление несёт собственную независимую полезную нагрузку.
Команда FailSafeData (безопасное состояние)
Если FSoE Master локально обнаруживает, что SafeOutputs недостоверны или должны быть переведены в безопасное состояние, он отправляет команду FailSafeData вместо ProcessData. То же относится к FSoE Slave: если он локально обнаруживает, что SafeInputs недостоверны или должны быть переведены в безопасное состояние, он отправляет FailSafeData вместо ProcessData.
Safety Master PDU с FailSafeData (FSoE Master → Slave)
Это Таблица 25 спецификации ETG.5100 S (D) V1.2.0 для 4 октетов безопасных данных.
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| FailSafeData Октет 0 | 0 Октет 1 — fail-safe данные | 0 Октет 2 — fail-safe данные | CRC_0_Lo Октет 3 | CRC_0_Hi Октет 4 | 0 Октет 5 — fail-safe данные | 0 Октет 6 — fail-safe данные | CRC_1_Lo Октет 7 | CRC_1_Hi Октет 8 | Connection Id, мл. Октет 9 | Connection Id, ст. Октет 10 |
Ключевые моменты:
- Command (октет 0) —
FailSafeData. - Все октеты SafeData установлены в 0 — fail-safe данные не несут полезной нагрузки; они сигнализируют, что отправитель перевёл свои выходы в безопасное состояние.
- Поля Conn_Id и CRC ведут себя точно так же, как в PDU ProcessData. CRC по-прежнему вычисляется и должен проходить проверку — безопасное состояние является определённым рабочим состоянием, а не ошибкой связи.
Safety Slave PDU с FailSafeData (FSoE Slave → Master)
Это Таблица 26 спецификации ETG.5100 S (D) V1.2.0 для 4 октетов безопасных данных.
| Command | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| FailSafeData Октет 0 | 0 Октет 1 — fail-safe данные | 0 Октет 2 — fail-safe данные | CRC_0_Lo Октет 3 | CRC_0_Hi Октет 4 | 0 Октет 5 — fail-safe данные | 0 Октет 6 — fail-safe данные | CRC_1_Lo Октет 7 | CRC_1_Hi Октет 8 | Connection Id, мл. Октет 9 | Connection Id, ст. Октет 10 |
ProcessData и FailSafeData выбираются независимо
Ключевое свойство состояния Data — выбор между ProcessData и FailSafeData независим в каждом направлении и зависит только от локальных условий, а не от команды, полученной от второй стороны:
- Master отправляет ProcessData, если его SafeOutputs корректны, или FailSafeData, если нет.
- Slave отправляет ProcessData, если его SafeInputs корректны, или FailSafeData, если нет.
Это означает, что совершенно нормально, когда в одном цикле одно направление несёт ProcessData, а другое — FailSafeData. Например, если SafeOutputs Master корректны, а SafeInputs Slave — нет, Master отправляет ProcessData, а Slave отвечает FailSafeData. Ни одной стороне не нужно ждать перехода другой на другую команду; решение принимается исключительно локально.
Сведение воедино: обмен в состоянии Data
Состояние Data — непрерывный циклический обмен:
- Master → Slave: Safety Master PDU с
Command = ProcessData(несущий SafeOutputs) илиCommand = FailSafeData(все SafeData = 0). - Slave → Master: Safety Slave PDU с
Command = ProcessData(несущий SafeInputs) илиCommand = FailSafeData(все SafeData = 0).
Этот цикл повторяется неограниченно. Команда в каждом направлении выбирается независимо на основе локальной достоверности безопасных данных. Если любая из сторон обнаруживает ошибку связи FSoE (см. FSoE: List of all communication error codes), оба узла возвращаются в состояние Reset, и установка соединения начинается заново.
Итоги
В состоянии Data FSoE Safety PDU наконец-то несёт пользовательские безопасные данные: Master отправляет SafeOutputs, а Slave отвечает SafeInputs, каждый с командой ProcessData. Если безопасные данные любой из сторон недостоверны или должны быть переведены в безопасное состояние, она отправляет команду FailSafeData вместо ProcessData, со всеми октетами SafeData, установленными в 0. Выбор между двумя командами независим в каждом направлении и зависит только от локальных условий. Состояние Data выполняется непрерывно до возникновения ошибки связи (вызывающей возврат в Reset) или локальной остановки узла. Наследование CRC связывает каждый PDU с предыдущим на протяжении всего состояния Data, поэтому любое искажение, потеря или переупорядочивание немедленно обнаруживается.
Ссылки на стандарт
- ETG.5100 S (D) V1.2.0, §8.2.2.6 Data state, Таблицы 23–26.
Связанные статьи
Обзор и основы
- What does the FSoE abbreviation actually mean? — что означает аббревиатура FSoE
- FSoE frame structure explained by examples — общая структура Safety PDU
- All the states of the FSoE state machine — пять состояний FSoE и их переходы
- FSoE: Safety PDU command table — полный список команд FSoE
Структуры PDU по состояниям
- FSoE Reset State PDU: Master and Slave Structure — структура PDU и коды ошибок для состояния Reset
- FSoE Session PDU: Master and Slave Structure — структура PDU для состояния Session
- FSoE Connection PDU: Master and Slave Structure — структура PDU для состояния Connection
- FSoE Parameter PDU: Master and Slave Structure — структура PDU для состояния Parameter
- FSoE Reset PDU: Master and Slave Structure — байтовые структуры для всех длин безопасных данных
CRC
- FSoE CRC: Which polynomial does it use? — 17-битный полином, лежащий в основе CRC FSoE
- How are the FSoE CRC tables constructed? — как генерируются таблицы CRC
- FSoE: How does CRC inheritance work? — как цепочка CRC связывает последовательные PDU
- How to compute the CRC checksum for FSoE PDUs? — алгоритм побайтового вычисления CRC
Коды ошибок и формат данных
- FSoE: List of all communication error codes — все коды ошибок связи FSoE
- FSoE: Is data transmitted little-endian or big-endian? — порядок байтов многобайтовых полей