Стан Connection іде за станом Session у процедурі встановлення з’єднання FSoE. Його призначення — передати 16-бітний Connection ID — унікальний ідентифікатор, який генерує safety-конфігуратор FSoE Master — разом із 16-бітною FSoE Slave Address від Master до Slave. Slave підтверджує, відлунюючи ті самі safety-дані у зворотному напрямку. Від цього моменту Connection ID переноситься у полі Conn_Id кожного наступного Safety PDU, тож обидва вузли можуть перевіряти, чи телеграма насправді адресована їм.
Ця стаття детально розбирає два PDU стану Connection, визначені в ETG.5100 S (D) V1.2.0, §8.2.2.4, на канонічному прикладі специфікації з 4 октетами safety-даних.
Примітка — кількість байтів safety-даних є фіксованою для кожного напрямку. Кожне з’єднання FSoE має фіксовану довжину safety-даних (Master→Slave і Slave→Master), однаково налаштовану на обох вузлах. Дозволені довжини — 1, 2, 4, 6 або 8 октетів. Фактична довжина для конкретного з’єднання залежить від FSoE Slave-пристрою і має бути взята з документації Slave або файлу опису пристрою (ESI/EEPROM). Приклади нижче використовують 4 октети, як у специфікації; байтове розташування для інших довжин показано у FSoE Reset PDU: Master and Slave Structure.
Примітка — релевантні байти даних — це Connection ID і FSoE Slave Address. У кожному PDU стану Connection чотири октети SafeData переносять два 16-бітних значення:
SafeData[0..1](октети 1 і 2) — Connection ID (молодший октет, старший октет). Це унікальне 16-бітне значення, згенероване safety-конфігуратором;0x0000не дозволено, тож у одній системі зв’язку можуть співіснувати до 65 535 з’єднань FSoE.SafeData[2..3](октети 5 і 6) — FSoE Slave Address (молодший октет, старший октет). Це унікальна адреса, задана на відповідному FSoE Slave-пристрої.На відміну від станів Reset і Session, поле
Conn_Id(октети 9 і 10) більше не дорівнює 0 — тепер воно переносить фактичний Connection ID, як і в кожному наступному Safety PDU після встановлення з’єднання. Поля CRC все одно передаються і мають збігатися; вони обчислюються від початкового стану reset, успадкованого від попереднього стану Reset (див. FSoE: How does CRC inheritance work? і How to compute the CRC checksum for FSoE PDUs?).
Коли входять у стан Connection і коли виходять із нього?
Стан Connection входять, коли Master залишає стан Session, надсилаючи Safety Master PDU з командою Connection. Переходи дзеркальні до переходів стану Session:
| Напрямок | Умова |
|---|---|
| Master виходить із Connection | Передав повний Connection ID і FSoE Slave Address та отримав відповідне підтвердження від Slave, надсилає Safety PDU з командою Data (входячи в циклічний обмін даними). |
| Slave виходить із Connection | Отримує Safety PDU з командою Data від Master. |
Обидва вузли також негайно виходять зі стану Connection, якщо виявляють помилку зв’язку FSoE — у цьому випадку вони повертаються до стану Reset.
Safety-дані, що передаються в стані Connection
Перш ніж розглянути повне розташування PDU, варто зосередитися саме на частині safety-даних. Таблиця 15 ETG.5100 S (D) V1.2.0 визначає, які байти передаються:
| Октет SafetyData | Опис |
|---|---|
| 0 | молодший октет (біти 0–7) Connection ID |
| 1 | старший октет (біти 8–15) Connection ID |
| 2 | молодший октет (біти 0–7) FSoE Slave Address |
| 3 | старший октет (біти 8–15) FSoE Slave Address |
Connection ID і FSoE Slave Address кожен мають ширину 16 біт, тож разом вони займають рівно 4 октети SafeData. Це має важливий наслідок для кількості циклів FSoE, необхідних для передачі:
| Довжина safety-даних | Цикли на передачу Connection ID + Slave Address | Причина |
|---|---|---|
| 4 октети | 1 цикл | Усі 4 октети вміщуються в один PDU. |
| 2 октети | 2 цикли | Лише 2 октети SafeData за цикл. |
| 1 октет | 4 цикли | Лише 1 октет SafeData за цикл. |
Саме тому приклади специфікації використовують 4 октети safety-даних: за 4 октетів увесь Connection ID і FSoE Slave Address передаються за один цикл FSoE.
Master Connection PDU (FSoE Master → Slave)
Master надсилає цей PDU для передачі Connection ID і FSoE Slave Address. Приклад нижче — Таблиця 16 ETG.5100 S (D) V1.2.0 для 4 октетів safety-даних.
| Команда | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Connection Октет 0 | Connection Id, молодший октет Октет 1 | Connection Id, старший октет Октет 2 | CRC_0_Lo Октет 3 | CRC_0_Hi Октет 4 | FSoE Slave Address, молодший октет Октет 5 | FSoE Slave Address, старший октет Октет 6 | CRC_1_Lo Октет 7 | CRC_1_Hi Октет 8 | Connection Id, молодший октет Октет 9 | Connection Id, старший октет Октет 10 |
Ключові моменти:
- Command (октет 0) —
Connection. - SafeData[0..1] (октети 1 і 2) переносять 16-бітний Connection ID (little-endian). Це те саме значення, що тепер також фігурує в полі
Conn_Id. - SafeData[2..3] (октети 5 і 6) переносять 16-бітну FSoE Slave Address (little-endian). Це унікальна адреса, налаштована на Slave-пристрої.
- Conn_Id (октети 9 і 10) переносить Connection ID — він більше не дорівнює 0, як у станах Reset і Session. Починаючи з цього PDU, поле
Conn_Idзаповнене в кожному Safety PDU. - CRC_0 і CRC_1 передаються як 16-бітні little-endian значення, обчислені від початкового стану reset, успадкованого від попереднього стану Reset.
Slave Connection PDU (FSoE Slave → Master, підтвердження)
Slave підтверджує команду Connection, надсилаючи назад ті самі safety-дані — тобто відлунюючи Connection ID і FSoE Slave Address, які надіслав Master. Це Таблиця 17 ETG.5100 S (D) V1.2.0.
| Команда | SafeData[0] | SafeData[1] | CRC_0 | SafeData[2] | SafeData[3] | CRC_1 | Conn_Id | |||
|---|---|---|---|---|---|---|---|---|---|---|
| Connection Октет 0 | Connection Id, молодший октет Октет 1 | Connection Id, старший октет Октет 2 | CRC_0_Lo Октет 3 | CRC_0_Hi Октет 4 | FSoE Slave Address, молодший октет Октет 5 | FSoE Slave Address, старший октет Октет 6 | CRC_1_Lo Октет 7 | CRC_1_Hi Октет 8 | Connection Id, молодший октет Октет 9 | Connection Id, старший октет Октет 10 |
На відміну від стану Session, де Slave відповідає власним незалежно згенерованим Slave Session ID, у стані Connection Slave відлунює Connection ID і FSoE Slave Address, які надіслав Master. Це спосіб Slave підтвердити, що він отримав і прийняв інформацію про адресування.
Чому передаються і Connection ID, і FSoE Slave Address?
Ці два значення виконують взаємодоповнювальні ролі в адресації:
- FSoE Slave Address є унікальною в системі зв’язку і задається на відповідному FSoE Slave-пристрої. Передаючи її разом із Connection ID, Slave може перевірити, чи до нього фактично звертаються — тож недійсна адресація буде виявлена.
- Connection ID також є унікальним у системі зв’язку (генерується safety-конфігуратором FSoE Master). Завдяки унікальності він надсилається в полі
Conn_Idкожного наступного Safety PDU, тож і FSoE Master, і FSoE Slave можуть виявити, чи звертаються до них у телеграмі.
Поєднання обох значень дає змогу Slave перевірити під час встановлення з’єднання, що він є цільовим вузлом (через FSoE Slave Address), а потім під час циклічної роботи обидва вузли можуть перевіряти кожну телеграму (через Connection ID у полі Conn_Id).
Скільки з’єднань FSoE можливе?
Connection ID — це 16-бітне значення, що номінально дозволяє 65 536 різних значень. Однак Connection ID = 0x0000 не дозволено, тож максимальна кількість з’єднань FSoE у системі зв’язку становить 65 535. Якщо в системі зв’язку наявні кілька FSoE Master, користувач має переконатися, що Connection ID, які використовують усі Master, є унікальними в межах усієї системи.
Усе разом: обмін у стані Connection
Стан Connection — це просте рукостискання з відлунням:
- Master → Slave: Safety Master PDU з
Command = Connection, що переносить Connection ID уSafeData[0..1], FSoE Slave Address уSafeData[2..3]і Connection ID у поліConn_Id. - Slave → Master: Safety Slave PDU з
Command = Connection, що відлунює ті самі Connection ID і FSoE Slave Address.
Після того, як Master передав повний Connection ID і FSoE Slave Address та отримав підтвердження від Slave, він залишає стан Connection, надсилаючи Safety PDU з командою Data — це переводить з’єднання в циклічний обмін даними. Якщо будь-який вузол виявляє помилку зв’язку FSoE під час обміну, обидва повертаються до стану Reset.
Підсумок
У стані Connection FSoE Safety PDU переносить два 16-бітних значення в полях SafeData: Connection ID (унікальний системний ідентифікатор, згенерований safety-конфігуратором) і FSoE Slave Address (унікальна адреса, задана на Slave-пристрої). Slave підтверджує, відлунюючи ці дані назад. На відміну від станів Reset і Session, поле Conn_Id тепер заповнене фактичним Connection ID — і залишається заповненим у кожному наступному Safety PDU, даючи змогу обом вузлам перевіряти, що кожна телеграма адресована їм. Оскільки Connection ID 0x0000 не дозволено, у одній системі зв’язку можуть співіснувати до 65 535 з’єднань FSoE.
Посилання на стандарт
- ETG.5100 S (D) V1.2.0, §8.2.2.4 Connection state, Таблиці 15–17.
Пов’язані статті
Огляд та основи
- 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 Parameter PDU: Master and Slave Structure — структура PDU для стану Parameter
- FSoE Data PDU: Master and Slave Structure — структура PDU для стану Data
- FSoE Reset PDU: Master and Slave Structure — байтові розташування для всіх довжин safety-даних
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? — порядок байтів багатобайтових полів