Найти тему

С2000-ПП версия 2.0 Чтение событий

С2000-ПП версия 2.0 Чтение событий

В предыдущей статье

https://zen.yandex.ru/media/id/5f633ae42481686547ecafc2/s2000pp-chtenie-sobytii-5f90120a6dc8f92edacc1c66

был описан алгоритм опроса событий в преобразователе протоколов. Не всё прошло так гладко как бы хотелось, с опросом событий. поэтому ещё в далёком 2019 году была начата работа по модернизации С2000-ПП до версии 2.0. Новая версия получает другой процессор, новую память, оставаясь в том же формфакторе. При это верси не имеют обрабной совместимости - прошить С2000-ПП версии 2.0 прошивкой от версии 1.3хх и наоборот, старую версию новой прошивкой не получиться. При этом сохраняя старый алгоритм опроса событий был добавлен новый, более простой. И да, версия 2.0 тестируется уже достаточно долго, чтобы говорить о её скорейшем выходе в свет, ввиду чего и предлагается Упрощённый алгоритм. Если коротко, то размер событий теперь фиксированный, отдельные значения всегда на своих местах. квитирование происходит при чтении регистра 3600.

А если более подробно, то Алгоритм следующий :

"Признаком появления новых событий является ненулевые значения "самого старого" [регистр 46160] и "самого нового" [регистр 46161] события.

Для начала в линию отправляется запрос на чтение регистра 3584 ("Самое старое событие").

Ответ направляется в парсер.

Парсер событий С2000-ПП (прошивка 2.00 и выше)

// 0xE00(3584)..0xE0F(3599), 0xE10(3600) - признак чтения
// пакет из 35 байт (30 байт данных и 5 байт протокола modbus)
// если длина modbus-пакета меньше 35 байт, то можно его отбрасывать как сбойный

 Bytes - modbus-пакет (массив байт)

 Addr := Bytes[0]; // адрес slave
 Func := Bytes[1]; // функция модбас
 Count := Bytes[2]; // счётчик байт

 Code := UInt16(Bytes[4], Bytes[3]);    // 0xE00 - код события

 Если Code равен нулю, тогда:
  Выход


 Index := Целое без знака из (Bytes[6] + Bytes[5]);   // 0xE01 - номер события
 Zone := Целое без знака из (Bytes[8] + Bytes[7]);    // 0xE02 - номер зоны (КЭ)
 ID := Целое без знака из (Bytes[10] + Bytes[9]);      // 0xE03 - идентификатор  раздела
 User := Целое без знака из (Bytes[12] + Bytes[11]);    // 0xE04 - номер пользователя

 RelayStatus := Bytes[13];    // 0xE05 - состояние реле(если есть в событии)
 RelayNum := Bytes[14];    // 0xE05 - номер реле

 Year := Bytes[15];    // 0xE06 - год
 Month := Bytes[16];    // 0xE06 - месяц
 Day := Bytes[17];    // 0xE07 - дни
 Hour := Bytes[18];    // 0xE07 - часы
 Min := Bytes[19];    // 0xE08 - минуты
 Sec := Bytes[20];    // 0xE08 - секунды

// Тип описания определяет номер чего находится в  0xE0A:  0x1-ШС (вход),  0x2-РЕЛЕ (выход),  0x3-СЧИТЫВАТЕЛЬ
// Также в типе описания может быть установлен старший бит 0x81, 0x82, 0x83 - это значит включен режим прямой
// трансляции событий (ПП все события от пульта кладет непосредственно в буфер и ничего не ищет в своих таблицах)

 Tip := Bytes[21];    // 0xE09 - тип описания
 AddrOrion := Bytes[22];    // 0xE09 - адрес прибора на линии ОРИОН

 ElemNum := Bytes[23];   // 0xE0A - номер элемента в приборе (ШС/реле/считыватель)
 CodeAdemco := Bytes[24];   // 0xE0B - код ADEMCO

// 0xE0C - 0xE0F - 4 регистра (8 байт) код ключа

 Key := Строка из 8 байт ([Bytes[25], Bytes[26], Bytes[27], Bytes[28],
                           Bytes[29], Bytes[30], Bytes[31], Bytes[32]]);

Регистр 0xE10(3600) - "признак чтения"
Его нужно
ПРОЧИТАТЬ после завершения всех операций с текущим событием
С2000-ПП таким образом поймёт, что текущее событие прочитано и заменит его на следующее

"