

DE 10 2004 044 764.0 | [SI] | und Automatisierungssystem zum Einsatz eines solchen ![]() |
EP 05 733 921.0 | [SI] | Sicherheitssteuerung |
[SI] | Beckhoff Automation GmbH Eiserstrasse 5, 33415 Verl GERMANY |
Сокращение | Полное выражение | Источник |
CP | Профиль коммуникаций | [МЭК 61784-1] |
CPF | Семейство профилей коммуникации | [МЭК 61784-1] |
CRC | Циклический контроль избыточности | - |
DLL | Уровень канала данных | [ИСО/МЭК 7498-1] |
DLPDU | Блок данных протокола канала передачи данных | - |
ЭМС | Электромагнитная совместимость | - |
УО | Управляемое оборудование | [МЭК 61508-4:2010] |
Э/Э/ПЭ | Электрические/электронные/программируемые электронные | [МЭК 61508-4:2010] |
FAL | Прикладной уровень полевой шины (Fieldbus Application Layer) | [МЭК 61158-5] |
FCS | Последовательность проверки кадра | - |
ФБ | Функциональная безопасность | - |
FSCP | Профиль коммуникации, удовлетворяющий требованиям функциональной безопасности | - |
MTBF | Среднее время между отказами | - |
MTTF | Среднее время до отказа | - |
PDU | Блок данных протокола | [ИСО/МЭК 7498-1] |
PELV | Защитное сверхнизкое напряжение | - |
PhL | Физический уровень | [ИСО/МЭК 7498-1] |
PL | Уровень эффективности защиты | [ИСО 13849-1] |
PLC | Программируемый логический контроллер | - |
SCL | Коммуникационный уровень безопасности | - |
SELV | Безопасное сверхнизкое напряжение | - |
УПБ | Уровень полноты безопасности | [МЭК 61508-4:2010] |
Сокращение | Полное выражение |
ASIC | Специализированная интегральная схема |
FSoE | Отказоустойчивость по CPF 12 |
ID | Идентификатор |
UML | Унифицированный язык моделирования |
Переход | Условие | Действие | Следующее состояние |

Ошибки коммуникаций | Меры обеспечения безопасности | ||||
Порядковый номер (см. 7.1.3.4) | Сообщение обратной связи (см. 7.2.1) | Обеспечение целостности данных (см. 7.1.3) | |||
Искажение | x | ||||
Непреднамеренное повторение | x | x | |||
Неверная последовательность | x | x | |||
Потеря | x | x | x | x | |
Недопустимая задержка | x | x | x | ||
Внесение | x | x | |||
Подмена | x | x | x | ||
Адресация | x | ||||
Периодически повторяющие отказы памяти в коммутаторах | x | x | |||




Октет | Название | Описание |
0 | Command | Команда |
1 | SafeData[0] | данные безопасности, октет 0 |
2 | SafeData[1] | данные безопасности, октет 1 |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовый CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовый CRC_0 |
5 | SafeData[2] | данные безопасности, октет 2 |
6 | SafeData[3] | данные безопасности, октет 3 |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовый CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовый CRC_1 |
... | ... | |
(n - 1) x 2 - 1 | SafeData[n-2] | данные безопасности, октет n - 2 |
(n - 1) x 2 | SafeData[n-1] | данные безопасности, октет n - 1 |
(n - 1) x 2 + 1 | CRC_(n-2)/2_Lo | младший октет (биты 0 - 7) 16-битовый CRC_(n-2)/2 |
(n - 1) x 2 + 2 | CRC_(n-2)/2_Hi | старший октет (биты 8 - 15) 16-битовый CRC_(n-2)/2 |
(n - 1) x 2 + 3 | Conn_Id_Lo | уникальный Id соединения, младший октет |
(n - 1) x 2 + 4 | Conn_Id_Hi | уникальный Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | Команда |
1 | SafeData[0] | данные безопасности, октет 0 |
2 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовый CRC_0 |
3 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовый CRC_0 |
4 | Conn_Id_Lo | уникальный Id соединения, младший октет |
5 | Conn_Id_Hi | уникальный Id соединения, старший октет |
Команда | Описание |
0x36 | ProcessData (ДанныеПроцесса) |
0x2A | Reset (Перезапуск) |
0x4E | Session (Сеанс) |
0x64 | Connection (Соединение) |
0x52 | Parameter (Параметр) |
0x08 | FailSafeData (ОтказоустойчивыеДанные) |
Шаг | Аргумент |
1 | полученный CRC_0 (бит 0 - 7) |
2 | полученный CRC_0 (бит 8-15) |
3 | ConnID (бит 0 - 7) |
4 | ConnID (бит 8 - 15) |
5 | Sequence_Number (бит 0 - 7) |
6 | Sequence_Number (бит 8 - 15) |
7 | Command |
8 | SafeData[0] |
9 | SafeData[1] |
10 | 0 |
11 | 0 |
12 | 0 |
Шаг | Аргумент |
1 | полученный CRC_0 (бит 0 - 7) |
2 | полученный CRC_0 (бит 8 - 15) |
3 | ConnID (бит 0 - 7) |
4 | ConnID (бит 8 - 15) |
5 | Sequence_Number (бит 0 - 7) |
6 | Sequence_Number (бит 8 - 15) |
7 | Command |
8 | Индекс i (bit 0 - 7) |
9 | Индекс i (bit 8 - 15) |
10 | SafeData[0] |
11 | SafeData[1] |
12 | 0 |
13 | 0 |
14 | 0 |
Цикл FSoE | Ведущее устройство FSoE | Ведомое устройство FSoE | ||
старый CRC_0 | новый CRC_0 | старый CRC_0 | новый CRC_0 | |
j - 1 | CRC_0 (2 x j - 3) | CRC_0 (2 x j - 2) | CRC_0 (2 x j - 2) | CRC_0 (2 x j - 1) |
j | CRC_0 (2 x j - 1) | CRC_0 (2 x j) | CRC_0 (2 x j) | CRC_0 (2 x j + 1) |
j + 1 | CRC_0 (2 x j + 1) | CRC_0 (2 x j + 2) | CRC_0 (2 x j + 2) | CRC_0 (2 x j + 3) |
Октет | Название | Описание |
0 | Command | Команда |
1 | SafeData[2] | данные безопасности, октет 2 |
2 | SafeData[3] | данные безопасности, октет 3 |
3 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовый CRC_1 |
4 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовый CRC_1 |
5 | SafeData[0] | данные безопасности, октет 0 |
6 | SafeData[1] | данные безопасности, октет 1 |
7 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовый CRC_0 |
8 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовый CRC_0 |
9 | Conn_Id_Lo | младший октет (биты 0 - 7) уникального Id соединения |
10 | Conn_Id_Hi | старший октет (биты 8 - 15) уникального Id соединения |

Октет | Название | Описание |
0 | Command | Reset (сброс) |
1 | SafeData[0] | код ошибки (бит 0 - 7), 0 для перезапуска |
2 | SafeData[1] | не используется (=0) |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовый CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовый CRC_0 |
5 | SafeData[2] | не используется (=0) |
6 | SafeData[3] | не используется (=0) |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовый CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовый CRC_1 |
9 | Conn_Id_Lo | не используется (=0) |
10 | Conn_Id_Hi | не используется (=0) |
Октет | Название | Описание |
0 | Command | Reset (сброс) |
1 | SafeData[0] | 0 |
2 | SafeData[1] | 0 |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовый CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовый CRC_0 |
5 | SafeData[2] | не используется (=0) |
6 | SafeData[3] | не используется (=0) |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовый CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовый CRC_1 |
9 | Conn_Id_Lo | не используется (=0) |
10 | Conn_Id_Hi | не используется (=0) |
Октет | Название | Описание |
0 | Command | Reset (сброс) |
1 | SafeData[0] | код ошибки (бит 0 - 7), 0 для сброса |
2 | SafeData[1] | не используется (=0) |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовый CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовый CRC_0 |
5 | SafeData[2] | не используется (=0) |
6 | SafeData[3] | не используется (=0) |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовый CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовый CRC_1 |
9 | Conn_Id_Lo | не используется (=0) |
10 | Conn_Id_Hi | не используется (=0) |
Октет | Название | Описание |
0 | Command | Session (сеанс) |
1 | SafeData[0] | Id Сеанса ведущего устройства, октет 0 |
2 | SafeData[1] | Id Сеанса ведущего устройства, октет 1 |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовый CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовый CRC_0 |
5 | SafeData[2] | не используется (=0) |
6 | SafeData[3] | не используется (=0) |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовый CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовый CRC_1 |
9 | Conn_Id_Lo | не используется (=0) |
10 | Conn_Id_Hi | не используется (=0) |
Октет | Название | Описание |
0 | Command | Session (сеанс,) |
1 | SafeData[0] | Id Сеанса ведомого устройства, октет 0 |
2 | SafeData[1] | Id Сеанса ведомого устройства, октет 1 |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | не используется (=0) |
6 | SafeData[3] | не используется (=0) |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | не используется (=0) |
10 | Conn_Id_Hi | не используется (=0) |
Октет данных безопасности | Описание |
0 | младший октет (биты 0 - 7) ID соединения |
1 | старший октет (биты 8 - 15) ID соединения |
2 | младший октет (биты 0 - 7) Адреса ведомого устройства FSoE |
3 | старший октет (биты 8 - 15) Адреса ведомого устройства FSoE |
Октет | Название | Описание |
0 | Command | Connection (соединение,) |
1 | SafeData[0] | Id Соединения, младший октет |
2 | SafeData[1] | Id Соединения, старший октет |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | Адреса ведомого устройства FSoE, младший октет |
6 | SafeData[3] | Адреса ведомого устройства FSoE, старший октет |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | Connection (соединение) |
1 | SafeData[0] | Id соединения, младший октет |
2 | SafeData[1] | Id соединения, старший октет |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | Адреса ведомого устройства FSoE, младший октет |
6 | SafeData[3] | Адреса ведомого устройства FSoE, старший октет |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет данных безопасности | Описание |
0 | младший октет (биты 0 - 7) длина параметров коммуникации в октетах (=2) |
1 | старший октет (биты 8 - 15) длина параметров коммуникации в октетах (=0) |
2 | младший октет (биты 0 - 7) сторожевого таймера FSoE (в мс) |
3 | старший октет (биты 8 - 15) сторожевого таймера FSoE (в мс) |
4 | младший октет (биты 0 - 7) длина параметров приложения в октетах |
5 | старший октет (биты 8 - 15) длина параметров приложения в октетах |
6 | 1-й октет параметра приложения, связанного с безопасностью |
... | |
n + 5 | n-й октет параметра приложения, связанного с безопасностью |
Октет | Название | Описание |
0 | Command | Parameter (параметр) |
1 | SafeData[0] | младший октет (биты 0 - 7) длина параметров коммуникации в октетах (=2) |
2 | SafeData[1] | старший октет (биты 8 - 15) длина параметров коммуникации в октетах (=0) |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | младший октет (биты 0 - 7) сторожевого таймера FSoE (в мс) |
6 | SafeData[3] | старший октет (биты 8 - 15) сторожевого таймера FSoE (в мс) |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | Parameter (параметр) |
1 | SafeData[0] | младший октет (биты 0 - 7) длина параметров коммуникации в октетах (=2) |
2 | SafeData[1] | старший октет (биты 8 - 15) длина параметров коммуникации в октетах (=0) |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | младший октет (биты 0 - 7) сторожевого таймера FSoE (в мс) |
6 | SafeData[3] | старший октет (биты 8 - 15) сторожевого таймера FSoE (в мс) |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | Parameter (параметр) |
1 | SafeData[0] | младший октет (биты 0 - 7) длина параметров приложения в октетах (=2) |
2 | SafeData[1] | старший октет (биты 8 - 15) длина параметров приложения в октетах (=0) |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | 1-й октет параметра приложения, связанного с безопасностью |
6 | SafeData[3] | 2-й октет параметра приложения, связанного с безопасностью |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | Parameter (параметр) |
1 | SafeData[0] | младший октет (биты 0 - 7) длина параметров приложения в октетах (=2) |
2 | SafeData[1] | старший октет (биты 8 - 15) длина параметров приложения в октетах (=0) |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | 1-й октет параметра приложения, связанного с безопасностью |
6 | SafeData[3] | 2-й октет параметра приложения, связанного с безопасностью |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | ProcessData (данные процесса) |
1 | SafeData[0] | 1-й октет SafeOutputs |
2 | SafeData[1] | 2-й октет SafeOutputs |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | 3-й октет SafeOutputs |
6 | SafeData[3] | 4-й октет SafeOutputs |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | ProcessData (данные процесса) |
1 | SafeData[0] | 1-й октет SafeInputs |
2 | SafeData[1] | 2-й октет SafeInputs |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | 3-й октет SafeInputs |
6 | SafeData[3] | 4-й октет SafeInputs |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | FailSafeData |
1 | SafeData[0] | Отказоустойчивые данные = 0 |
2 | SafeData[1] | Отказоустойчивые данные = 0 |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | Отказоустойчивые данные = 0 |
6 | SafeData[3] | Отказоустойчивые данные = 0 |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Октет | Название | Описание |
0 | Command | FailSafeData |
1 | SafeData[0] | Отказоустойчивые данные = 0 |
2 | SafeData[1] | Отказоустойчивые данные = 0 |
3 | CRC_0_Lo | младший октет (биты 0 - 7) 16-битовой CRC_0 |
4 | CRC_0_Hi | старший октет (биты 8 - 15) 16-битовой CRC_0 |
5 | SafeData[2] | Отказоустойчивые данные = 0 |
6 | SafeData[3] | Отказоустойчивые данные = 0 |
7 | CRC_1_Lo | младший октет (биты 0 - 7) 16-битовой CRC_1 |
8 | CRC_1_Hi | старший октет (биты 8 - 15) 16-битовой CRC_1 |
9 | Conn_Id_Lo | Id соединения, младший октет |
10 | Conn_Id_Hi | Id соединения, старший октет |
Ошибка | Описание |
Неожиданная команда | Полученная команда не допускается в данном состоянии |
Неизвестная команда | Полученная команда не определена |
ID неправильного соединения | ID соединения не соответствует ID соединения, переданному в состоянии соединения |
Ошибка CRC | Хотя бы один из полученных CRC_i не соответствует вычисленному CRC_i |
Сторожевой таймер истек | За время сторожевого таймера не было получено ни одного действительного PDU безопасности |
Недействительный адрес ведомого устройства FSoE | Адрес ведомого устройства FSoE, переданный в состоянии соединения, не соответствует локальному адресу, установленному на ведомом устройстве FSoE |
Недействительные SafeData | Данные безопасности, возвращенные ведомым устройством FSoE в состояниях сеанса, соединения и параметров, не соответствуют ожидаемым значениям |
Неисправные SafePara | SafePara, отправленные ведомому устройству FSoE в параметрическом состоянии, не действительны |
Недопустимая длина параметров коммуникаций | Неправильная длина параметра коммуникаций |
Недопустимый коммуникационный параметр | Неправильное содержание параметра коммуникаций |
Недопустимая длина параметра приложения | Неправильная длина параметра приложения |
Недопустимый параметр приложения | Неправильное содержание параметра приложения |
Октет | Описание |
0 | Локальный сброс или подтверждение команды сброса |
1 | Неожиданная команда (INVALID_CMD) |
2 | Неизвестная команда (UNKNOWN_CMD) |
3 | Недействительное соединение (INVALID_CONNID) |
4 | Ошибка CRC (INVALID_CRC) |
5 | Сторожевой таймер истек (WD_EXPIRED) |
6 | Недействительный адрес ведомого устройства FSoE (INVALID_ADDRESS) |
7 | Недействительные данные безопасности (INVALID_DATA) |
8 | Недопустимая длина параметра коммуникаций (INVALID_COMMPARALEN) |
9 | Недействительные данные параметра коммуникаций (INVALID_COMPARA) |
10 | Недопустимая длина параметра приложения (INVALID_USERPARALEN) |
11 | Недействительные данные параметра приложения (INVALID_USERPARA) |
0x80-0xFF | Недействительные SafePara (зависит от устройства) |
Состояние | Описание |
Сброс | Соединение FSoE сброшено (выводы в безопасном состоянии) |
Сеанс | Передается ID сеанса (выводы в безопасном состоянии) |
Соединение | Передается ID соединения (выводы в безопасном состоянии) |
Параметры | Передаются параметры (выводы в безопасном состоянии) |
Данные | Передаются данные процесса или отказоустойчивые данные (выводы активны, только если получена команда ProcessData) |

Событие | Описание |
Получен кадр | Был получен PDU безопасности, т.е. хотя бы один бит в PDU безопасности был изменен. Параметры: Frame - полученный PDU безопасности; Frame.Command - команда полученного PDU безопасности; Frame.Crc0 - CRC_0 полученного PDU безопасности; Frame.ConnId - ID соединения полученного PDU безопасности; Frame.SafeData - данные безопасности полученного PDU безопасности |
Истек сторожевой таймер | Истек сторожевой таймер FSoE, т.е. за время сторожевого таймера не было получено никаких PDU безопасности. Параметры: нет |
Сброс Соединения | Запрос посредством локального интерфейса на сброс соединения FSoE. Данное событие должно возникать при включении питания для запуска коммуникаций с ведомым устройством FSoE. Параметры: нет |
Команда Set Data | Запрос посредством локального интерфейса на переключение SafeOutputs в состояние безопасности или на выход из состояния безопасности. Параметры: DataCmd - FailSafeData или ProcessData |
Функция | Описание |
SendFrame(cmd, safeData, lastCrc, connId, seqNo, old-Crc, bNew) | Отправлен кадр ведущего устройства FSoE. Параметры: cmd - команда кадра: SafeData - ссылка на данные безопасности, отправленные с кадром; lastCrc - CRC_0 последнего PDU ведомого устройства безопасности, включенный в вычисление CRC для кадра; connId - ID соединения, которое необходимо ввести в кадр и включить в вычисление CRC; seqNo - Указатель на Порядковый номер ведущего устройства, включенный в вычисление CRC для кадров. Возвращается увеличенный (возможно неоднократно) seqNo; oldCrc: указатель на CRC_0 последнего отправленного PDU ведущего устройства безопасности. Возвращается вычисленный CRC_0.; bNew: если bNew = TRUE и oldCrc равен вычисленному crc, то вычисление CRC повторяется с приращенным seqNo до тех пор, пока вычисленный crc не станет равен oldCrc (процедура соответствует 7.1.3.4) |
Состояние | Описание |
LastCrc | CRC_0 последнего отправленного PDU ведущего устройства безопасности (инициализируется значением 0 при включении питания) |
OldMasterCrc | CRC_0 последнего отправленного PDU ведущего устройства безопасности (инициализируется значением 0 при включении питания) |
OldSlaveCrc | CRC_0 последнего полученного PDU ведомого устройства безопасности (инициализируется значением 0 при включении питания) |
MasterSeqNo | Порядковый номер ведущего устройства для использования в CRC для следующего PDU ведущего устройства безопасности (инициализируется значением 0 при включении питания) |
SlaveSeqNo | Ожидаемый порядковый номер ведомого устройства для использования в CRC следующего PDU ведомого устройства безопасности (инициализируется значением 0 при включении питания) |
SessionId | Произвольно генерируемый ID сеанса (инициализируется значением 0 при включении питания) |
DataCommand | Указывает на то, какая из команд ProcessData или FailSafeData отправлена в состоянии данных. Инициализируется с помощью FailSafeData при включении питания |
BytesToBeSent | Если несколько PDU блоков безопасности должно быть отправлено в состоянии сеанса, соединения или параметров, то эта переменная указывает на то, сколько еще октетов должно быть отправлено (инициализируется значением 0 при включении питания) |
ConnData | ConnData состоит из ID соединения и адреса ведомого устройства FSoE. Инициализируется конфигуратором безопасности при включении питания в соответствии с конфигурацией ConnData.ConnId: ConnectionId соединения FSoE |
SafePara | SafePara состоит из параметров коммуникаций безопасности и приложения безопасности. Инициализируется конфигуратором безопасности при включении питания в соответствии с конфигурацией SafePara.Watchdog: сторожевой таймер FSoE |
SafeParaSize | Указывает на длину SafePara. Инициализируется конфигуратором безопасности при включении питания в соответствии с данными конфигурации |
SafeOutputs | Содержит значения процесса выводов безопасности, отправленное ведомому устройству FSoE. Инициализируется с помощью FS_VALUE (Fail-safe Data = 0) при включении питания |
SafeInputs | Содержит значения процесса вводов безопасности, полученных ведомым устройством FSoE. Инициализируется с помощью FS_VALUE (Fail-safe Data = 0) при включении питания |
CommFaultReason | Указывает на код ошибки в случае события возникновения коммуникационной ошибки |
SecondSessionFrameSent | Если два блока PDU безопасности должны быть отправлены в состоянии Сеанса, то эта переменная указывает на то, был ли уже отправлен второй PDU. Данная переменная устанавливается в значение FALSE макрокомандой CREATE_SESSION_ID |
Функция | Описание |
IS_CRC_CORRECT(frame, lastCrc, seqNo, oldCrc, bNew) | Эта макрокоманда проверяет корректны ли CRC коды полученного PDU ведомого устройства безопасности. Параметры: Frame - принятый кадр; lastCrc - CRC_0 последнего отправленного PDU ведущего устройства безопасности, включенное в вычисления CRC для принятого PDU; seqNo - порядковый номер ведомого устройства включается в вычисления CRC для принятого кадра. Возвращается приращенный (возможно неоднократно) seqNo; oldCrc: указатель на CRC_0 последнего принятого PDU ведомого устройства безопасности. Возвращается CRC_0 полученной телеграммы; bNew: если bNew = TRUE и oldCrc равняется вычисленному crc, то вычисление CRC повторяется с приращенным seqNo до тех пор, пока вычисленный crc не перестанет быть равным oldCrc (процедура выполняется согласно 7.1.3.4) |
UPDATE_BYTES_TO_BE_SENT (bytesSent) | Данная макрокоманда проверят, сколько еще октетов в состояниях сеанса, соединения и параметров необходимо отправить перед изменением состояния. Параметры: bytesSent - число октетов, ждущих отправления |
IS_SAFEDATA_CORRECT (frame, expectedData, bytesSent) | Данная макрокоманда проверяет, совпадает ли SafeData полученного PDU ведомого устройства безопасности с ожидаемыми данными. Параметры: Frame - принятый кадр; expectedData - ссылка на ожидаемые данные; bytesSent - число отправленных октетов |
START_WD (watchdog) | Данная макрокоманда перезапускает сторожевой таймер и запускает контролирующий таймер. Параметры: Watchdog - время контроля (мониторинга) в мс |
CREATE_SESSION_ID | Данная макрокоманда генерирует произвольный ID сеанса. Переменная SecondSessionFrameSent (отправленный кадр второго сеанса) сбрасывается в значение FALSE |
ADR | Данная макрокоманда генерирует ссылку (указатель) на переменную |
Переход | Условие | Действие | Следующее состояние |
RESET_OK | Frame.Command = Reset | SessionId := CREATE_SESSION_ID(); SendFrame(Session, ADR(SessionId), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); LastCrc = SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_BE_ SENT (2); START_WD (SafePara.Watchdog); | Session (Сеанс) |
RESET_STAY1 | Frame.Command <> Reset | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
RESET_WD | Истек сторожевой таймер | SessionId := CREATE_SESSION_ID(); SendFrame(Session, ADR(SessionId), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); LastCrc = SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_BE_ SENT (2); START_WD(SafePara.Watchdog); | Session (Сеанс) |
Переход | Условие | Действие | Следующее состояние |
RESET_START | Истек сторожевой таймер | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara. Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
RESET_STAY2 | DataCommand := DataCmd; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
SESSION_OK | Frame.Command = Session AND BytesToBeSent = 0 AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | LastCrc := Frame.Crc0; SendFrame(Connection, ADR(ConnData), LastCrc, ConnData.ConnId, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_ TO_BE_SENT(4); START_WD(SafePara.Watchdog); | Connection (Соединение) |
SESSION_FAIL1 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = FALSE AND SecondSessionFrameSent = TRUE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
SESSION_STAY2 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = FALSE AND SecondSessionFrameSent = FALSE | START_WD(SafePara.Watchdog); | Session (Сеанс) |
SESSION_STAY1 | Frame.Command = Session AND BytesToBeSent <> 0 AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | LastCrc := Frame.Crc0; SendFrame(Session, ADR(SessionId [2-BytesToBeSent]), Frame. Crc0, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_ TO_BE_SENT( BytesToBeSent); SecondSessionFrameSent := TRUE; START_WD(SafePara.Watchdog); | Session (Сеанс) |
SESSION_RESET1 | Frame.Command = Reset | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; SessionId := CREATE_SESSION_ID(); DataCommand := FailSafeData; SendFrame(Session, ADR(SessionId), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); LastCrc = SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_ TO_BE_SENT(2); START_WD(SafePara.Watchdog); | Session (Сеанс) |
SESSION_FAIL3 | Frame.Command = Connection OR Frame.Command = Parameter OR Frame.Command = ProcessData OR Frame.Command = FailSafeData | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommfaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
SESSION_FAIL4 | Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> ProcessData AND Frame.Command <> FailSafeData | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE) MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
SESSION_WD | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := WD_EXPIRED; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara. Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
SESSION_RESET2 | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
SESSION_STAY2 | DataCommand := DataCmd; | Session (Сеанс) |
Переход | Условие | Действие | Следующее состояние |
CONN_OK | Frame.Command = Connection AND BytesToBeSent = 0 AND Frame.ConnId = ConnData. ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR(ConnData), 4-BytesToBeSent) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | LastCrc := Frame.Crc0; SendFrame(Parameter, ADR(SafePara), Frame.Crc0, ConnData. ConnId, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_ BYTES_TO_BE_SENT( SafeParaSize); START_ WD(SafePara.Watchdog); | Parameter (Параметры) |
CONN_FAIL1 | Frame.Command = Connection AND Frame.ConnId = ConnData. ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR(ConnData), 4-BytesToBeSent) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = FALSE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD (SafePara.Watchdog); | Reset (Сброс) |
CONN_FAIL2 | Frame.Command = Connection AND Frame.ConnId = ConnData.ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR(ConnData), 4-BytesToBeSent) = FALSE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ DATA; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
CONN_FAIL3 | Frame.Command = Connection AND Frame.ConnId <> ConnData. ConnId | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ CONNID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
CONN_STAY1 | Frame.Command = Connection AND BytesToBeSent <> 0 AND Frame.ConnId = ConnData. ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR (ConnData), 4-BytesToBeSent) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | LastCrc := Frame.Crc0; SendFrame(Connection, ADR(ConnData[4- BytesToBeSent]), Frame.Crc0, ConnData. ConnId, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_ BYTES_TO_BE_SENT( BytesToBeSent); START_ WD(SafePara.Watchdog); | Connection (Соединение) |
CONN_RESET1 | Frame.Command = Reset | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SessionId := CREATE_SESSION_ ID(); SendFrame(Session, ADR(SessionId), LastCRC, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); LastCrc = SendFrame.Crc0 BytesToBeSent := UPDATE_ BYTES_TO_BE_SENT(2); START_WD(SafePara.Watchdog); | Session (Сеанс) |
CONN_FAIL4 | Frame.Command = Session OR Frame.Command = Parameter OR Frame.Command = ProcessData OR Frame.Command = FailSafeData | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
CONN_FAIL5 | Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> ProcessData AND Frame.Command <> FailSafeData | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason. := UNKNOWN_ CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
CONN_WD | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := WD_EXPIRED; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
CONN_RESET2 | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
CONN_STAY2 | DataCommand := DataCmd; | Connection (Соединение) |
Переход | Условие | Действие | Следующее состояние |
PARA_OK | Frame.Command = Parameter AND BytesToBeSent = 0 AND Frame.ConnId = ConnData. ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR(SafePara), SafeParaSize- BytesToBeSent) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | LastCrc := Frame.Crc0; SendFrame(DataCommand, ADR(SafeOutputs), Frame. Crc0, ConnData.ConnId, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; START_WD(SafePara.Watchdog); | Data (Данные) |
PARA_FAIL1 | Frame.Command = Parameter AND Frame.ConnId = ConnData. ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR(SafePara), SafeParaSize- BytesToBeSent) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = FALSE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
PARA_FAIL2 | Frame.Command = Parameter AND Frame.ConnId = ConnData. ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR(SafePara), SafeParaSize- BytesToBeSent) = FALSE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FaiISafeData; CommFaultReason := INVALID_ DATA; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
PARA_FAIL3 | Frame.Command = Parameter AND Frame.ConnId <> ConnData.ConnId | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ CONNID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
PARA_STAY1 | Frame.Command = Parameter AND BytesToBeSent <> 0 AND Frame.ConnId = ConnData. ConnId AND IS_SAFEDATA_CORRECT(Frame, ADR(SafePara), SafeParaSize- BytesToBeSent) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | LastCrc := Frame.Crc0; SendFrame( Parameter, ADR(SafePara[SafeParaSize- BytesToBeSent]), Frame.Crc0, ConnData.ConnId, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_ TO_BE_SENT( BytesToBeSent); START_ WD(SafePara.Watchdog); | Parameter (Параметры) |
PARA_RESET 1 | Frame.Command = Reset | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SessionId := CREATE_SESSION_ ID(); SendFrame(Session, ADR(SessionId), LastCRC, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); LastCrc = SendFrame.Crc0 BytesIoBeSent := UPDATE_BYTES_ TO_BE_SENT(2); START_WD(SafePara.Watchdog); | Session (Сеанс) |
PARA_FAIL4 | Frame.Command = Session OR Frame.Command = Connection OR Frame.Command = ProcessData OR Frame.Command = FailSafeData | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
PARA_FAIL5 | Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> ProcessData AND Frame.Command <> FailSafeData | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
PARA_WD | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := WD_EXPIRED; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara. Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
PARA_RESET2 | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
PARA_STAY2 | DataCommand := DataCmd; | Parameter (Параметры) |
Переход | Условие | Действие | Следующее состояние |
DATA_OK1 | Frame.Command = ProcessData AND Frame.ConnId = ConnData. ConnId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | SafeInputs := Frame.SafeData; LastCrc := Frame.Crc0; SendFrame(DataCommand, ADR(SafeOutputs), Frame.Crc0, ConnData.ConnId, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; START_ WD(SafePara.Watchdog); | Data (Данные) |
DATA_OK2 | Frame.Command = FailSafeData AND Frame.ConnId = ConnData. ConnId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = TRUE | SafeInputs := FS_VALUE; LastCrc := Frame.Crc0; SendFrame(DataCommand, ADR(SafeOutputs), Frame.Crc0, ConnData.ConnId, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE); LastCrc := SendFrame.Crc0; START_ WD(SafePara.Watchdog); | Data (Данные) |
DATA_FAIL1 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND Frame.ConnId = ConnData. ConnId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE) = FALSE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeInputs := FS_VALUE; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
DATA_FAIL2 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND Frame.ConnId <> ConnData. ConnId | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeInputs := FS_VALUE; CommFaultReason := INVALID_CONNID SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara.Watchdog); | Reset (Сброс) |
DATA_RESET1 | Frame.Command = Reset | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeInputs := FS_VALUE; SessionId := CREATE_SESSION_ID(); SendFrame(Session, ADR(SessionId), LastCRC, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); LastCrc = SendFrame.Crc0 BytesToBeSent := UPDATE_BYTES_TO_ BE_SENT(2); START_WD(SafePara.Watchdog); | Session (Сеанс) |
DATA_FAIL3 | Frame.Command = Session OR Frame.Command = Connection OR Frame.Command = Parameter | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ CMD; SafeInputs := FS_VALUE; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_ WD(SafePara.Watchdog); | Reset (Сброс) |
DATA_FAIL4 | Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> ProcessData AND Frame.Command <> FailSafeData | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeInputs := FS_VALUE; CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara.Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
DATA_WD | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeInputs := FS_VALUE; CommFaultReason := WD_EXPIRED SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara. Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
DATA_RESET2 | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeInputs := FS_VALUE; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE); MasterSeqNo := 1; START_WD(SafePara. Watchdog); | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
DATA_STAY | DataCommand := DataCmd; | Data (Данные) |
Состояние | Описание |
Сброс | Соединение FSoE сброшено (выводы в безопасном состоянии) |
Сеанс | Передается ID сеанса (выводы в безопасном состоянии) |
Соединение | Передается ID соединения (выводы в безопасном состоянии) |
Параметры | Передаются параметры (выводы в безопасном состоянии) |
Данные | Передаются данные процесса или отказоустойчивые данные (выводы активны, только если получена команда ProcessData) |

Событие | Описание |
Получен кадр | Был получен PDU безопасности, т.е. хотя бы один бит в PDU безопасности был изменен. Параметры: Frame - полученный PDU безопасности; Frame.Command - команда полученного PDU безопасности; Frame.Crc0 - CRC_0 полученного PDU безопасности; Frame.ConnId - ID соединения полученного PDU безопасности; Frame.SafeData - данные безопасности полученного PDU безопасности |
Истек сторожевой таймер | Истек сторожевой таймер FSoE, т.е. за время сторожевого таймера не было получено никаких PDU безопасности. Параметры: нет |
Сброс Соединения | Запрос посредством локального интерфейса на сброс Соединения FSoE. Параметры: нет |
Команда Set Data | Запрос посредством локального интерфейса на переключение SafeInputs в состояние безопасности или на выход из состояния безопасности. Параметры: DataCmd - FailSafeData или ProcessData |
Функция | Описание |
SendFrame(cmd, safeData, lastCrc, connId, seqNo, oldCrc, bNew) | Отправлен кадр ведомого устройства FSoE. Параметры: Cmd - команда кадра; SafeData - ссылка на данные безопасности, отправленные с кадром; lastCrc - CRC_0 последнего PDU ведущего устройства безопасности, включенный в вычисление CRC для кадра; connId - ID соединения, которое необходимо ввести в кадр и включить в вычисление CRC; seqNo - указатель на порядковый номер ведомого устройства, включенный в вычисление CRC для кадров. Возвращается приращенный (возможно неоднократно) seqNo; oldCrc - указатель на CRC_0 последнего отправленного PDU ведомого устройства безопасности. Возвращается вычисленный CRC_0.; bNew - если bNew = TRUE и oldCrc равен вычисленному crc, то вычисление CRC повторяется с приращенным seqNo до тех пор, пока вычисленный crc не станет равен oldCrc (процедура соответствует 7.1.3.4) |
Переменная | Описание |
LastCrc | CRC_0 последнего PDU ведомого устройства безопасности (инициализируется значением 0 при включении питания) |
OldMasterCrc | CRC_0 последнего полученного PDU ведущего устройства безопасности (инициализируется значением 0 при включении питания) |
OldSlaveCrc | CRC_0 последнего отправленного PDU ведомого устройства безопасности (инициализируется значением 0 при включении питания) |
MasterSeqNo | Ожидаемый порядковый номер ведущего устройства для использования в CRC для следующего PDU ведущего устройства безопасности (инициализируется значением 0 при включении питания) |
SlaveSeqNo | Порядковый номер ведомого устройства для использования в CRC следующего PDU ведомого устройства безопасности (инициализируется значением 0 при включении питания) |
InitSeqNo | Переменная, содержащая порядковый номер инициализации 1 |
DataCommand | Указывает на то, какая из команд ProcessData или FailSafeData отправлена в состоянии Данных. Инициализируется с помощью FailSafeData при включении питания |
BytesToBeSent | Если несколько PDU блоков безопасности должно быть отправлено в состоянии сеанса, соединения или параметров, то эта переменная указывает на то, сколько еще октетов должно быть отправлено (инициализируется значением 0 при включении питания) |
ConnectionId | В состоянии соединения ConnectionID принимается ведущим устройством FSoE (инициализируется значением 0 при включении питания) |
ConnectionData | В состоянии соединения ConnectionData принимается ведущим устройством FSoE (инициализируется значением 0 при включении питания) |
SlaveAddress | Адрес ведомого устройства FSoE инициализируется посредством локального интерфейса при включении питания (как правило, внешний переключатель адресов) |
SafePara | SafePara принимаются ведущим устройством FSoE в состоянии параметров и инициализируется в зависимости от устройства. SafePara.Watchdog: сторожевой таймер FSoE (инициализируется значением 0 при включении питания) |
ExpectedSafeParaSize | Указывает на длину ожидаемого SafePara |
SafeOutputs | Содержит значения процесса выводов безопасности, полученные ведущим устройством FSoE. Инициализируется с помощью FS_VALUE (Fail-safe Data = 0) при включении питания |
SafeInputs | Содержит значения процесса вводов безопасности, отправленных ведущему устройству FSoE. Инициализируется с помощью FS_VALUE (Fail-safe Data = 0) при включении питания |
CommFaultReason | Указывает на код ошибки в случае события возникновения коммуникационной ошибки |
Функция | Описание |
IS_CRC_CORRECT(frame, lastCrc, seqNo, oldCrc, bNew) | Эта макрокоманда проверяет, корректны ли CRC коды полученного PDU ведущего устройства безопасности. Параметры: Frame - принятый кадр; lastCrc - CRC_0 последнего отправленного PDU ведомого устройства безопасности, включенное в вычисления CRC для принятого PDU; seqNo - указатель на порядковый номер ведущего устройства, используемый в вычислении CRC для принятого кадра. Возвращается приращенный (возможно неоднократно) seqNo; oldCrc - указатель на CRC_0 последнего принятого PDU ведущего устройства безопасности. Возвращается CRC_0 полученной телеграммы; bNew - если bNew = TRUE и oldCrc равняется вычисленному crc, то вычисление CRC повторяется с приращенным seqNo до тех пор, пока вычисленный crc не перестанет быть равным oldCrc (процедура выполняется согласно 7.1.3.4) |
UPDATE_BYTES_TO_BE_SENT (bytesSent) | Данная макрокоманда проверят, сколько еще октетов в состояниях сеанса, соединения и параметров необходимо отправить перед изменением состояния. Параметры: safePara: указатель на полученные SafePara |
IS_SAFE_PARA_CORRECT (safePara) | Данная макрокоманда проверяет корректны ли SafePara полученные в состоянии параметров. Параметры: Frame - принятый кадр; expectedData - ссылка на ожидаемые данные; bytesSent - число отправленных октетов |
STORE_DATA(dst, src) | Данная макрокоманда хранит полученные данные безопасности PDU безопасности. Параметры: Dst - указатель на целевой адрес; Src - указатель на адрес источника |
GET_PARA_FAULT() | Данная макрокоманда возвращает код ошибки, если SafePara не действителен |
START_WD (watchdog) | Данная макрокоманда перезапускает (сбрасывает) сторожевой таймер и запускает контролирующий таймер с указанным сторожевым таймером. Параметры: Watchdog - время контроля (мониторинга) в мс |
STOP_WD() | Данная макрокоманда останавливает контролирующий таймер и сбрасывает сторожевой таймер |
ADR | Данная макрокоманда генерирует ссылку (указатель) на переменную |
Переход | Условие | Следующее состояние | |
RESET_OK | Frame.Command = Session AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := Frame.Crc0; SessionId := CREATE_SESSION_ID(); SendFrame(Session, ADR(SessionId), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_BE_SENT(2); | Session (Сеанс) |
RESET_FAIL1 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
RESET_STAY1 | Frame.Command = Reset | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
RESET_FAIL2 | (Frame.Command = Connection OR Frame.Command = Parameter OR Frame.Command = ProcessData OR Frame.Command = FailSafeData) | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
RESET_FAIL3 | (Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> ProcessData AND Frame.Command <> FailSafeData) | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
RESET_START | Frame.Command = Session AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := 0 OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
RESET_STAY2 | DataCommand := DataCmd; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
SESSION_OK | STORE_DATA(ADR(ConnectionData), ADR(Frame.SafeData)); ConnectionId := Frame.ConnId; LastCrc Frame. Crc0; SendFrame(Connection, ADR(Frame.SafeData), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_BE_SENT(4); | Connection (Соединение) | |
SESSION_FAIL1 | Frame.Command = Connection AND BytesToBeSent = 0 AND Frame.ConnId <> 0 AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
SESSION_FAIL2 | Frame.Command = Connection AND BytesToBeSent = 0 AND Frame.ConnId = 0 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CONNID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
SESSION_FAIL3 | Frame.Command = Connection AND BytesToBeSent <> 0 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo: = 1; SlaveSeqNo := 1 DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
SESSION_STAY1 | Frame.Command = Session AND BytesToBeSent <> 0 AND IS_CRC_ CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | LastCrc := Frame.Crc0; SendFrame(Session, ADR(SessionId[2- BytesToBeSent]), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTE5_TO_ BE_SENT( BytesToBeSent); | Session (Сеанс) |
SESSION_STAY2 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := Frame.Crc0; MasterSeqNo := InitSeqNo; InitSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SessionId := CREATE_SESSION_ID(); SendFrame(Session, ADR(SessionID), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_ BE_SENT(2); | Session (Сеанс) |
SESSION_FAIL4 <a> | Frame.Command = Session AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = FALSE AND IS_CRC_ CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
SESSION_FAIL5 <a> | Frame.Command = Session AND BytesToBeSent = 0 AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE AND IS_CRC_ CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
SESSION_RESET1 | Frame.Command = Reset AND IS_CRC_ CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); | Reset (Сброс) |
SESSION_FAIL6 | Frame.Command = Reset AND IS_CRC_ CORRECT(Frame, 0, ADR(Init SeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
SESSION_FAIL7 | Frame.Command = Parameter OR Frame.Command = ProcessData OR Frame.Command = FailSafeData | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo: = 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
SESSION_FAIL8 | (Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> ProcessData AND Frame.Command <> FailSafeData) | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
<a> Два состояния SESSION_FAIL4 и SESSION_FAIL5 являются единственными состояниями, в которых должны вычисляться две проверки CRC. Единственное отличие заключается в другом CommFaultReason, т.е. только диагностическая информация, не информация важная для безопасности. Разрешается сокращать эти состояния до одного; в этом состоянии только условие "IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(Old-MasterCrc), FALSE) = FALSE" должно проверяться с помощью CommFaultReason := INVALID_CRC. | |||
Переход | Условие | Действие | Следующее состояние |
SESSION_RESET2 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
SESSION_STAY3 | DataCommand := DataCmd; | Session (Сеанс) |
Переход | Условие | Действие | Следующее состояние |
CONN_OK | Frame.Command = Parameter AND BytesToBeSent = 0 AND Frame.ConnId = ConnectionId AND ConnectionData. ConnectionId = ConnectionId AND ConnectionData. SlaveAddress = SlaveAddress AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | STORE_DATA(ADR(SafePara), ADR(Frame.SafeData)); LastCrc := Frame.Crc0; SendFrame(Parameter, ADR(Frame.SafeData), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_ TO_BE_SENT( ExpectedSafeParaSize); | Parameter (Параметры) |
CONN_FAIL1 | Frame.Command = Parameter AND BytesToBeSent = 0 AND Frame.ConnId = ConnectionId AND ConnectionData. ConnectionId = ConnectionId AND ConnectionData. SlaveAddress = SlaveAddress AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL2 | Frame.Command = Parameter AND BytesToBeSent = 0 AND Frame.ConnId = ConnectionId AND ConnectionData. ConnectionId = ConnectionId AND ConnectionData. SlaveAddress <> SlaveAddress | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ ADDR; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL3 | Frame.Command = Parameter AND BytesToBeSent = 0 AND (Frame.ConnId <> ConnectionId OR ConnectionData. ConnectionId <> ConnectionId) | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ CONNID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL4 | Frame.Command = Parameter AND BytesToBeSent <> 0 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_STAY1 | Frame.Command = Connection AND BytesToBeSent <> 0 AND Frame.ConnId = ConnectionId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | STORE_DATA( ADR(Connection[4- BytesToBeSent]), ADR(Frame.SafeData)); LastCrc := Frame.Crc0; SendFrame(Connection, ADR(Frame.SafeData), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_ TO_BE_SENT( BytesToBeSent); | Connection (Соединение) |
CONN_FAIL5 | Frame.Command = Connection AND BytesToBeSent <> 0 AND Frame.ConnId = ConnectionId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL6 | Frame.Command = Connection AND BytesToBeSent <> 0 AND Frame.ConnId <> ConnectionId | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_ CONID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL7 | Frame.Command = Connection AND BytesToBeSent = 0 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_RESET1 | Frame.Command = Reset AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL8 | Frame.Command = Reset AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_RESET2 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := Frame.Crc0; MasterSeqNo := 2; InitSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SessionId := CREATE_SESSION_ ID(); SendFrame(Session, ADR(SessionID), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_ TO_BE_SENT(2); | Session (Сеанс) |
CONN_FAIL9 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL10 | Frame.Command = ProcessData OR Frame.Command = FailSafeData | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame (Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
CONN_FAIL11 | (Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> ProcessData AND Frame.Command <> FailSafeData) | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
CONN_RESET3 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
CONN_STAY2 | DataCommand := DataCmd; | Connection (Соединение) |
Переход | Условие | Действие | Следующее состояние |
PARA_OK1 | Frame.Command = ProcessData AND BytesToBeSent = 0 AND Frame.ConnId = ConnectionId AND IS_SAFE_PARA_CORRECT( SafePara) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | Watchdog := SafePara.Watchdog; SafeOutputs := Frame.SafeData; LastCrc := Frame.Crc0; SendFrame(DataCommand, ADR(SafeInputs), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; START_ WD(Watchdog); | Data (Данные) |
PARA_OK2 | Frame.Command = FailSafeData AND BytesToBeSent = 0 AND Frame.ConnId = ConnectionId AND IS SAFE PARA CORRECT( SafePara) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | Watchdog := SafePara.Watchdog; SafeOutputs := FS_VALUE; LastCrc := Frame.Crc0; SendFrame(DataCommand, ADR(SafeInputs), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; START_ WD(Watchdog); | Data (Данные) |
PARA_FAIL1 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND BytesToBeSent = 0 AND Frame.ConnId = ConnectionId AND IS_SAFE_PARA_CORRECT( SafePara) = TRUE AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL2 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND BytesToBeSent = 0 AND Frame.ConnId = ConnectionId AND IS_SAFE_PARA_CORRECT( SafePara) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := GET_PARA_FAULT; SendFrame(Reset, ADR(CommFault.Reason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL3 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND BytesToBeSent = 0 AND Frame.ConnId <> ConnectionId | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CONNID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL4 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND BytesToBeSent <> 0 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_STAY1 | Frame.Command = Parameter AND BytesToBeSent <> 0 AND Frame.ConnId = ConnectionId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | STORE_DATA( ADR(SafePara[ExpectedSafeParaSize- BytesToBeSent]), ADR(Frame. SafeData)); LastCrc := Frame.Crc0; SendFrame(Parameter, ADR(Frame.SafeData), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_BE_ SENT( BytesToBeSent); | Parameter (Параметр) |
PARA_FAIL5 | Frame.Command = Parameter AND BytesToBeSent <> 0 AND Frame.ConnId = ConnectionId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL6 | Frame.Command = Parameter AND BytesToBeSent <> 0 AND Frame.ConnId <> ConnectionId | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CONNID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL7 | Frame.Command = Parameter AND BytesToBeSent = 0 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_RESET1 | Frame.Command = Reset AND IS_CRC_ CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL8 | Frame.Command = Reset AND IS_CRC_ CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), SlaveSeqNo := 1; | Reset (Сброс) |
PARA_RESET2 | Frame.Command = Session AND IS_CRC_CORRECT (Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := Frame.Crc0; MasterSeqNo := 2; InitSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SessionId := CREATE_SESSION_ID(); SendFrame(Session, ADR(SessionID), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_BE_ SENT (2); | Session (Сеанс) |
PARA_FAIL9 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL10 | Frame.Command = Connection | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
PARA_FAIL11 | (Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> FailSafeData AND Frame.Command <> ProcessData) | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
PARA_RESET3 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
PARA_STAY2 | DataCommand := DataCmd; | Parameter (Параметры) |
Переход | Условие | Действие | Следующее состояние |
DATA_OK1 | Frame.Command = ProcessData AND Frame.ConnId = ConnectionId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | SafeOutputs := Frame.SafeData; LastCrc := Frame.Crc0; SendFrame(DataCommand, ADR(SafeInputs), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; START_ WD(Watchdog); | Data (Данные) |
DATA_OK2 | Frame.Command = FailSafeData AND Frame.ConnId = ConnectionId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = TRUE | SafeOutputs := FS_VALUE; LastCrc := Frame.Crc0; SendFrame(DataCommand, ADR(SafeInputs), LastCrc, ConnectionId, ADR(SlaveSeqNo), ADR(OldSlaveCrc), TRUE); LastCrc := SendFrame.Crc0; START_ WD(Watchdog); | Data (Данные) |
DATA_FAIL1 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND Frame.ConnId = ConnectionId AND IS_CRC_CORRECT(Frame, LastCrc, ADR(MasterSeqNo), ADR(OldMasterCrc), TRUE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
DATA_FAIL2 | (Frame.Command = ProcessData OR Frame.Command = FailSafeData) AND Frame.ConnId <> ConnectionId | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); CommFaultReason := INVALID_ CONNID; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
DATA_RESET1 | Frame.Command = Reset AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
DATA_FAIL3 | Frame.Command = Reset AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
DATA_RESET2 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = TRUE | LastCrc := Frame.Crc0; MasterSeqNo := 2; InitSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); SessionId := CREATE_SESSION_ID(); SendFrame(Session, ADR(SessionID), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); LastCrc := SendFrame.Crc0; BytesToBeSent := UPDATE_BYTES_TO_ BE_SENT(2); | Session (Сеанс) |
DATA_FAIL4 | Frame.Command = Session AND IS_CRC_CORRECT(Frame, 0, ADR(InitSeqNo), ADR(OldMasterCrc), FALSE) = FALSE | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; InitSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); CommFaultReason := INVALID_CRC; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
DATA_FAIL5 | Frame.Command = Connection OR Frame.Command = Parameter | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo : = 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); CommFaultReason := INVALID_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
DATA_FAIL6 | (Frame.Command <> Reset AND Frame.Command <> Session AND Frame.Command <> Connection AND Frame.Command <> Parameter AND Frame.Command <> FailSafeData AND Frame.Command <> ProcessData) | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_ WD(); CommFaultReason := UNKNOWN_CMD; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
DATA_WD | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_WD(); CommFaultReason := WD_EXPIRED; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
DATA_RESET3 | LastCrc := 0; OldMasterCrc := 0; OldSlaveCrc := 0; MasterSeqNo := 1; SlaveSeqNo := 1; DataCommand := FailSafeData; SafeOutputs := FS_VALUE; STOP_WD(); CommFaultReason := 0; SendFrame(Reset, ADR(CommFaultReason), LastCrc, 0, ADR(SlaveSeqNo), ADR(OldSlaveCrc), FALSE); SlaveSeqNo := 1; | Reset (Сброс) |
Переход | Условие | Действие | Следующее состояние |
DATA_STAY | DataCommand := DataCmd; | Data (Данные) |
Название | Тип данных | Диапазон | Описание |
ID Сеанса FSoE | UINT16 | 0 .. 216 | Произвольно генерируемый ID сеанса FSoe |
ID соединения FSoE | UINT16 | 1 ... 216 | Уникальный ID соединения между ведущим устройством FSoE и ведомым устройством FSoE |
Порядковый номер FSoE | UINT16 | Init: 0 1 ... 216 | Увеличивается в каждом цикле FSoE |
Адрес ведомого устройства FSoE | UINT16 | 1 ... 216 | Уникальный адрес ведомого устройства FSoE для каждого устройства FSoE |
Время сторожевого таймера FSoE | UINT16 | 1 ... 216 | Время сторожевого таймера для соединения FSoE в мс |
Состояние индикатора | Определение |
включен | Индикатор должен быть постоянно включен |
выключен | Индикатор должен быть постоянно выключен |
единичная вспышка | Одно короткое мерцание индикатора (50 мс), за которым следует фаза "выключен" длительностью минимум 200 мс |
мерцание | Индикатор должен включаться и выключаться через равные интервалы с частотой в 10 Гц, т.е. 50 мс включен и 50 мс выключен |
мигание | Индикатор должен включаться и выключаться через равные интервалы с частотой в 2,5 Гц, т.е. 200 мс включен и 200 мс выключен |
мерцание с 1 вспышкой | Сначала индикатор должен мерцать 500 мс, затем одна фаза "выключен" (500 мс), затем короткая вспышка (200 мс), за которой следует длинная фаза "выключен" (1 000 мс) |
мерцание с 2 вспышками | Сначала индикатор должен мерцать 500 мс, затем одна фаза "выключен" (500 мс), затем последовательность из двух коротких вспышек (200 мс), разделенных фазой "выключен" (200 мс), за которой следует длинная фаза "выключен" (1 000 мс) |
мерцание с n вспышками | Сначала индикатор должен мерцать 500 мс, затем одна фаза "выключен" (500 мс), затем последовательность из n коротких вспышек (200 мс), разделенных фазой "выключен" (200 мс), за которой следует длинная фаза "выключен" (1 000 мс) |

Состояние индикатора | Определение | Состояние FSoE |
выключен | Осуществляется инициализация | Перед сбросом (Pre-Reset) |
мигает | Готов к параметризации | Сброс, сеанс, соединение, параметры |
включен | Нормальное функционирование | Данные Процесса |
единичная вспышка | Отказоустойчивые данные | Отказоустойчивые данные |
мерцание | Неустановленная ошибка в соединении FSoE | Все |
мерцание с 1 вспышкой | Ошибка в F-параметре | Параметры |
мерцание с 2 вспышками | Ошибка в параметре приложения | Параметры |
мерцание с 3 вспышками | Неверный адрес безопасности | Соединение |
мерцание с 4 вспышками | Неверная команда | Все |
мерцание с 5 вспышками | Ошибка сторожевого таймера | Все |
мерцание с 6 вспышками | CRC-Ошибка | Все |

Время | Название | Описание |
T_SFR | Время реакции функции безопасности | Время реакции функции безопасности от физического ввода до реакции на исполнительном устройстве |
T_InCon | Время соединения ввода | Время передачи сигнала физического ввода в логический узел безопасности |
T_OutCon | Время соединения вывода | Время передачи рассчитанного сигнала вывода от логического узла безопасности исполнительному устройству |
T_S | Время датчика | Время преобразования на датчике безопасности |
T_I | Время ввода | Время задержки вводного устройства безопасности |
T_Com | Время коммуникаций | Время коммуникационного цикла для коммуникационной сети |
T_L | Время логического узла | Время задержки логического узла (цикл) |
T_O | Время вывода | Время задержки выводного устройства безопасности |
T_A | Время исполнительного устройства | Время преобразования на исполнительном устройстве безопасности |
T_WD_In | Время сторожевого таймера ввода | Время сторожевого таймера FSoE для соединения ввода |
T_WD_Out | Время сторожевого таймера вывода | Время сторожевого таймера FSoE для соединения вывода |
запас времени сторожевого таймера | Дополнительный запас времени для минимального сторожевого таймера |

T_WD_In | ![]() | (1) |
. |
T_WD_Out | ![]() | (2) |
. |

T_InConn | = T_S_wc + T_I_wc + T_Com_wc + T_L_wc | (3) |
= 2 x T_S + 2 x T_I + 2 x T_Com + 2 x T_L. |
T_InConn_wc | = T_S_wc + T_WD_In | (4) |
= 2 x T_S + T_WD_In. |
T_InConn | = T_L_wc + T_Com_wc + T_O_wc + T_A_wc | (5) |
= 2 x T_L + 2 x T_Com + 2 x T_O + 2 x T_A. |
T_OutConn_wc | = T_L_wc + T_WD_Out + T_A_wc | (6) |
= 2 x T_L + T_WD_Out + 2 x T_A. |
T_SFR_wc | = max{T_InConn_wc + T_OutConn; T_OutConn_wc + T_InConn}. | (7) |


Обозначение ссылочного международного стандарта | Степень соответствия | Обозначение и наименование соответствующего национального стандарта |
IEC 60204-1 | IDT | ГОСТ Р МЭК 60204-1-2007 "Безопасность машин. Электрооборудование машин и механизмов. Часть 1. Общие требования" |
IEC 61000-6-2 | MOD | ГОСТ Р 51317.6.2-2007 (МЭК 61000-6-2-2005) "Совместимость технических средств электромагнитная. Устойчивость к электромагнитным помехам технических средств, применяемых в промышленных зонах. Требования и методы испытаний" |
IEC 61131-2 | IDT | ГОСТ IEC 61131-2-2012 "Контроллеры программируемые. Часть 2. Требования к оборудованию и испытания" |
IEC 61158-2 | - | |
IEC 61158-3-12 | - | |
IEC 61158-4-12 | - | |
IEC 61158-5-12 | - | |
IEC 61158-5-10 | - | |
IEC 61158-6-12 | - | |
IEC 61326-3-1 | - | |
IEC 61326-3-2 | - | |
IEC 61508 (все части) | IDT | ГОСТ Р МЭК 61508-2012 (все части). "Функциональная безопасность систем электрических, электронных, программируемых электронных, связанных с безопасностью" |
IEC 61784-2 | - | |
IEC 61784-3 | - | |
IEC 61918 | - | |
<*> Соответствующий национальный стандарт отсутствует. До его утверждения рекомендуется использовать перевод на русский язык данного международного стандарта. Примечание - В настоящей таблице использованы следующие условные обозначения степени соответствия стандартов: - IDT - идентичные стандарты; - MOD - модифицированный стандарт. | ||
[1] | IEC 60050 (all parts), International Electrotechnical Vocabulary |
Примечание - См. также IEC Multilingual Dictionary -- Electricity, Electronics and Telecommunications (доступен на CD-ROM и no адресу <http://www.electropedia.org>). | |
[2] | IEC/TS 61000-1-2, Electromagnetic compatibility (EMC) - Part 1-2: General Methodology for the achievement of the functional safety of electrical and electronic equipment with regard to electromagnetic phenomena |
[3] | IEC 61131-6, Programmable controllers - Part 6: Functional safety |
[4] | IEC 61158 (all parts), Industrial communication networks - Fieldbus specifications |
[5] | IEC 61496 (all parts), Safety of machinery - Electro-sensitive protective equipment |
[6] | IEC 61508-1:2010, Functional safety of electrical/electronic/programmable electronic safety-related systems - Part 1: General requirements |
[7] | IEC 61508-4:2010, Functional safety of electrical/electronic/programmable electronic safety-related systems - Part 4: Definitions and abbreviations |
[8] | IEC 61508-5:2010, Functional safety of electrical/electronic/programmable electronic safety-related systems - Part 5: Examples of methods for the determination of safety integrity levels |
[9] | IEC 61511 (all parts), Functional safety - Safety instrumented systems for the process industry sector |
[10] | IEC 61784-1, Industrial communication networks - Profiles - Part 1: Fieldbus profiles |
[11] | IEC 61784-4, Industrial communication networks - Profiles - Part 4: Secure communications for fieldbuses |
[12] | IEC 61784-5 (all parts), Industrial communication networks - Profiles - Part 5: Installation of fieldbuses - Installation profiles for CPF x |
[13] | IEC 61800-5-2, Adjustable speed electrical power drive systems - Part 5-2: Safety requirements - Functional |
[14] | IEC/TR 62059-11, Electricity metering equipment - Dependability - Part 11: General concepts |
[15] | IEC 62061, Safety of machinery - Functional safety of safety-related electrical, electronic and programmable electronic control systems |
[16] | IEC/TR 62210, Power system control and associated communications - Data and communication security |
[17] | IEC 62280-1, Railway applications - Communication, signalling and processing systems - Part 1: Safety-related communication in closed transmission systems |
[18] | IEC 62280-2, Railway applications - Communication, signalling and processing systems - Part 2: Safety-related communication in open transmission systems |
[19] | IEC 62443 (all parts), Industrial communication networks - Network and system security |
[20] | ISO/IEC Guide 51:1999, Safety aspects - Guidelines for their inclusion in standards |
[21] | ISO/IEC 2382-14, Information technology - Vocabulary - Part 14: Reliability, maintainability and availability |
[22] | ISO/IEC 2382-16, Information technology - Vocabulary - Part 16: Information theory |
[23] | ISO/IEC 7498 (all parts), Information technology - Open Systems Interconnection - Basic Reference Model |
[24] | ISO/IEC 19501, Information technology - Open Distributed Processing - Unified Modeling Language (UML) Version 1.4.2 |
[25] | ISO 10218-1, Robots for industrial environments - Safety requirements - Part 1: Robot |
[26] | ISO 12100-1, Safety of machinery - Basic concepts, general principles for design - Part 1: Basic terminology, methodology |
[27] | ISO 13849-1, Safety of machinery - Safety-related parts of control systems - Part 1: General principles for design |
[28] | ISO 13849-2, Safety of machinery - Safety-related parts of control systems - Part 2: Validation |
[29] | ISO 14121, Safety of machinery - Principles of risk assessment |
[30] | EN 954-1:1996, Safety of machinery - Safety related parts of control systems - General principles for design |
[31] | ANSI/ISA-84.00.01-2004 (all parts), Functional Safety: Safety Instrumented Systems for the Process Industry Sector |
VDI/VDE 2180 (all parts), Safeguarding of industrial process plants by means of process control engineering | |
GS-ET-26, Grundsatz und Zertifizierung von Bussystemen sicherheitsrelevanter Nachrichten, May 2002. HVBG, Gustav-Heinemann-Ufer 130, D-50968 | |
ANDREW S. TANENBAUM, Computer Networks, 4th Edition, Prentice Hall, N.J., ISBN-10:0130661023, ISBN-13: 978-0130661029 | |
W. WESLEY PETERSON, Error-Correcting Codes, 2nd Edition 1981, MIT-Press, ISBN 0-262-16-039-0 | |
[36] | BRUCE P. DOUGLASS, Doing Hard Time, 1999, Addison-Wesley, ISBN 0-201-49837-5 |
[37] | New concepts for safety-related bus systems, 3rd International Symposium "Programmable Electronic Systems in Safety Related Applications", May 1998, from Dr. Michael |
[38] | DIETER CONRADS, Datenkommunikation, 3rd Edition 1996, Vieweg, ISBN 3-528-245891 |
[39] | German IEC subgroup DKE AK 767.0.4: EMC and Functional Safety, Spring 2002 |
[40] | NFPA79 (2002), Electrical Standard for Industrial Machinery |
[41] | GUY E. CASTAGNOLI, On the Minimum Distance of Long Cyclic Codes and Cyclic Redundancy-Check Codes, 1989, Dissertation No. 8979 of ETH Zurich, Switzerland |
[42] | GUY E. CASTAGNOLI, STEFAN , and MARTIN HERRMANN, Optimization of Cyclic Redundancy-Check Codes with 24 and 32 Parity Bits, June 1993, IEEE Transactions On Communications, Volume 41, No. 6 |
[43] | SCHILLER F and MATTES T: An Efficient Method to Evaluate CRC-Polynomials for Safety-Critical Industrial Communication, Journal of Applied Computer Science, Vol. 14, No 1, pp. 57 - 80, Technical University Press, |
[44] | SCHILLER F and MATTES T: Analysis of CRC-polynomials for Safety-critical Communication by Deterministic and Stochastic Automata, 6th IFAC Symposium on Fault Detection, Supervision and Safety for Technical Processes, SAFEPROCESS 2006, pp. 1003 - 1008, Beijing, China, 2006 |
УДК 62-783:614.8:331.454:006.354 | ОКС 13.110 | Т51 |
Ключевые слова: промышленные сети, профили, функциональная безопасность полевых шин, спецификации для CPF 12 | ||