С2000-ПП версия 2.0 Чтение событий
В предыдущей статье
был описан алгоритм опроса событий в преобразователе протоколов. Не всё прошло так гладко как бы хотелось, с опросом событий. поэтому ещё в далёком 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-ПП таким образом поймёт, что текущее событие прочитано и заменит его на следующее
"