Сохранить много одновременных событий в FRAM
Задачка (не АВОК), которая привела меня в ступор (железо: SMH2G+FRAM, тик 200 ms).
Только суть:
Есть N переменных типа int (сейчас - 82, может быть до 140), при изменении нужно сохранить новое значение с меткой времени (метка упакована в int) в энергонезависимую память для обработки в будущем (в том числе после периода обесточивания контроллера).
Проблема в том, что за один тик могут измениться все переменные (то есть надо будет записать до 140 переменных int+int по состоянию на конкретный тик системы), при этом возможно 4-кратное изменение значений с интервалом 2-3 секунды (но вероятность более 4 изменений в любые 10 минут времени пренебрежимо мала).
Вариант доступа к сохраненным данным в формате сквозного FIFO буфера (или его имитации) кажется идеальным, т.к. для вычитки верхним уровнем можно использовать единственный двойной регистр Modbus/TCP (int+int), при каждом обращении вычитывающий новые "строчки" (или это невозможно?)
Вариант с записью каждой переменной в свой FBD-блок EEPROM нужной глубины и вычитка методом R/W (внешний контроллер записывает адрес переменной, а SMH мультиплексором выбирает нужный EEPROM и отвечает) - у меня вызывает опасения из-за задержки ответа минимум на один тик (то есть верхнему уровню придется сперва вычитать переменную, а потом записать адрес новой и подождать минимум тик. Особенно это печально в связи с быстродействием локальной сети).
Вариант с "выстаскиванием" выходов EEPROM всех переменных на отдельные адреса в карте памяти Modbus выглядит очень привлекательно, но пугает риск нарваться на ограничения SMH2G с модулем Ethernet (или ему вычитка внешним мастером 280 modbus-регистров не проблема? Для инфы: по RS485 уже используется около 90 запросов; верхний уровень может вычитать одним запросом до 243 байт, т.е. порядка 60 двойных переменных int+int).
Есть у гуру SMLogix идеи?
UPD: пока склоняюсь к последнему варианту, но это не снимает вопроса кэширования записи в FRAM
Последний раз редактировалось ailcat, 20.06.2018 в 00:56
|