Вы можете открыть актуальную версию документа прямо сейчас.
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.
Приложение А
(справочное)
Дополнительная информация
для профилей коммуникаций, удовлетворяющих требованиям функциональной безопасности, CPF 1
А.1 Вычисление хэш функции
//
// Использование:
// crc32eth [infile]
// вычисляет Ethernet-CRC32 на основе содержания файла [infile]
//
// Компилировать:
// (этот источник должен компилироваться на любом компиляторе С++)
// g++ -Wall -о crc32eth crc32eth.cc #GNU-C++ под Linux
// g++ -Wall -mno-cygwin -о crc32eth.exe crc32eth.cc #with cygwin GNU-C++
//
// ----------------------------------------------------------------------
// вычисление CRC математически является оцениванием остатка полиноминального
// деления, где порождающий многочлен (полином) является делителем.
// Для Ethernet-CRC32 порождающий многочлен - это 0xedb88320, биты соответствуют
// (f.l.t.r.) коэффициентам fuer x^0, х^1 .. х^31, коэффициент для х^32 не является явно
// 1.
// Этот "неестественный" порядок битов (наименее значащий бит слева) также
// применяется к любому единичному октету блока ввода данных и к результату
// полиноминального деления.
// ----------------------------------------------------------------------
#include <iostream>
#include <iomanip>
#include <fstream>
// ----------------------------------------------------------------------
const unsigned long maCRC32Ether[256] = {
// Таблица для порождающего многочлена 0xedb88320
0x00000000, 0x77073096, 0хее0е612с, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0х5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
// GetCRC32Ether() вычисляет CRC для блока данных, расположенного по адресу
// [pStart] размером в [len] октет. GetCRC32Ether() работает с приращением, где
// результат последней части выполняет роль [предварительно установленного]
//значения для последующей части. Для первой части должно использоваться
// предварительно установленное значение, равное 0xffffffff (=CRC32ETHER_PRESET).
// GetCRC32Ether() реализует высокоэффективный табличный метод для вычисления
// CRC.
enum {CRC32ETHER_PRESET= 0xffffffff};
unsigned long GetCRC32Ether(const void* pStart,
size_t len,
unsigned long preset) {
size_t bytecount;
unsigned char * buf= (unsigned char *) pStart;
unsigned long crcword= preset;
for (bytecount= len; (bytecount > 0); bytecount-, buf++) {
- 62 - 61784-3-1 IEC:2010(E)
crcword= maCRC32Ether[(crcword ^ *buf) & 0x0ff] ^ (crcword >> 8L);
}
return crcword;
};
// ----------------------------------------------------------------------
enum {BUFSIZE= 1024}; //Groesse des Read-Buffers
int main(int argc, char * argv[]) {
if (argc != 2) {
std::cerr << "Usage:" << std::endl;
std::cerr << "" << argv[0] << " infile" << std::endl;
return 2;
}
std::ifstream infile;
infile.open(argv[1], std::ios_base::in | std::ios_base::binary);
if (!infile) {
std::cerr << "ERR: unable to open file " << argv[1] << std::endl;
exit(1);
}
char buf[BUFSIZE]; //буфер-считывания
size_t totalCount= 0; //Laenge в байтах
unsigned long sig= CRC32ETHER_PRESET; //Предварительное значение signatur
while (infile) {
infile.read(&buf[0], BUFSIZE);
size_t portionCount= infile.gcount();
totalCount+= portionCount;
sig= GetCRC32Ether(&buf[0], portionCount, sig);
}
if(!infile.eof()) {
std::cerr << "ERR: ошибка чтения файла" << argv[1] << std::endl;
exit(1);
}
infile.close();
std::cout << argv[0] << ": байты, считанные из файла " << argv[1] << ":" << totalCount << std::endl;
std::cout << argv[0] << ": CRC: 0x" << std::hex << std::setw(8) << std::setfill('0') << sig << std::endl; return 0;
}
A.2 Условия сбоев, возникающие за пределами функционального блока вывода
Когда средства диагностирования на устройстве вывода обнаруживают полевой сбой, возникающий за пределами функционального блока вывода или за пределами самого устройства, например в подсоединенном исполнительном устройстве, то предпринимаемое действие определено не в функциональном блоке вывода, а скорее в блоке преобразователя или в аппаратных средствах. При сбое устройства вывод переходит в обесточенное состояние так, как если бы было отключено питание у самого устройства. Некоторые устройства вывода могут использовать резервное питание для исполнительного устройства, и если эта возможность утрачена, то физическое устройство вывода переходит в обесточенное состояние. Так как эти сбои происходят вне функционального блока вывода, то конфигурация состояния сбоя не применима. В таблице А.1 представлено такое поведение.
Отказ устройства всегда завершается зафиксированным выводом, который пользователю потребуется перезапустить.
Таблица А.1 - Условия сбоя, возникающие за пределами функционального блока вывода
Условие |
Пример |
Комментарий |
Полевой сбой |
Отказ при испытании клапана при неполном ходе (сбой клапана или исполнительного устройства), разрыв обмотки или короткое замыкание в соленоиде |
Диагностические средства и действия, определенные блоком преобразователя и аппаратными средствами. Обратная связь через функциональный блок вывода |
Отказ резервного питания |
Потеря поступления воздуха, питания на шине или гидравлического давления |
Действие, определенное аппаратными средствами. Обратная связь через функциональный блок вывода |
Отказ устройства питания |
Питание шины или независимый источник питания утрачены |
Действие, определенное аппаратными средствами |
Отказ устройства |
Контроль сторожевым устройством сбоев памяти или работы центрального процессора |
Действие, определенное аппаратными средствами |
Таймер устаревания данных |
Сбой выполнения блока вывода или планирования |
Диагностические средства и действия, определенные блоком преобразователя и аппаратными средствами. Обратная связь через функциональный блок вывода |
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.