Логика СПТ961 (мод. 961.2) [11/18] Контрольные коды

Логика СПТ961 (мод. 961.2) [11/18] Контрольные коды
Магистральный протокол СПСеть 11
Все поля от DAD до ETX включительно подвергаются DLE-стаффингу, то есть к каждому обнару-
женному символу DLE добавляется еще один. Затем формируется контрольная информация. Получен-
ные два байта записываются за ETX без стаффинга.
Стаффинг применяется всегда, вне зависимости от того является ли сообщение двоичным или сим-
вольным.
3.3 Контрольные коды
Контрольные коды насчитывается с байта, следующего за SOH, поскольку два первых байта DLE
и SOH проверяются явно при выделении начала сообщения. Контрольные коды охватывают все байты,
включая ETX и все стаффинг символы в этом промежутке. Алгоритм расчета циклического контроль-
ного кода приведен ниже, в виде функции на языке С. Функция возвращает 16-ти разрядное целое
число, старший байт которого CRC1, а младший CRC2. Если приписать эти байты к сообщению и
повторно выполнить функцию, включая в промежуток обработки и эти байты, то результатом должен
быть нулевым.
3.4 Указатели и информация при символьном обмене
При осуществлении символьного обмена между абонентами данные DataSet разделяются на две ка-
тегории: указатели и информацию. Каждая категория представляет собой последовательность сим-
вольных полей, начинающихся с кода горизонтальной табуляции HT (09h). Последовательность полей
завершается разделителем FF (0Сh) - подача формы. Таким образом, структура категорий одинакова.
Различается их назначение.
К указателям относятся номера каналов, параметров, массивов и т.п. К информации - значения па-
раметров, единицы измерения, временные метки и т.д.
При обработке сообщения абонент первоначально интерпретирует указатели. Если указатель не со-
держит ошибок, то он копируется в ответное сообщение. Если обнаружена ошибка, то вместо копии
указателя в ответное сообщение помещается диагностический текст, причем он начинается с раздели-
теля HT, а заканчивается FF. Дальнейший разбор прекращается, и формирование ответа заканчивается.
Ответ, содержащий диагностику, отсылается источнику запроса.
Ниже при описании каждого вида обмена структура указателей и информации уточняется.
////////////////////////////////////////////////////////
//Функция вычисляет и возвращает циклический код для
//последовательности из len байтов, указанной *msg.
//Используется порождающий полином:
//(X в степени 16)+(X в степени 12)+(X в степени 5)+1.
//Полиному соответствует битовая маска 0x1021.
//
int CRCode (char *msg, int len)
{
int j, crc = 0;
while ( len-- > 0 )
{
crc = crc ^ (int) *msg++ << 8;
for ( j=0; j < 8; j++ )
{
if(crc & 0x8000) crc = (crc << 1) ^ 0x1021;
else crc <<= 1;
}
}
return crc;
}

Похожие устройства