Modbus logger в базу данных и стратегию обработки массивов - PullRequest
4 голосов
/ 08 августа 2010

Я обнаружил, что чтение 64 смежных областей памяти (элементов) с использованием Modbus является наиболее эффективным способом получения информации по Modbus с использованием библиотеки rmodbus.

Моя цель - записать информацию о прочтении в простую базу данных, которую можно добывать для создания графиков и таблиц данных на веб-странице и сохранять самое последнее значение в переменной экземпляра.

данные считываются в массив библиотекой rmodbus, где индекс каждого элемента представляет адрес элемента.Тем не менее, я хотел бы преобразовать индекс в восьмеричное значение, так как это соответствует схеме адресации элементов, с которой пользователи уже знакомы, и было бы легче ссылаться в интерфейсе.

редактировать, добавлять детали и уточнять : В данный момент я работаю со следующей схемой:

create_table "elements", :force => true do |t|
    t.string   "name"
    t.integer  "modbus_connection_id"
    t.string   "address"
    t.string   "eng_unit"
    t.integer  "base"
    t.string   "wiring"
    t.text     "note"
    t.boolean  "log"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "events", :force => true do |t|
    t.integer  "element_id"
    t.string   "value"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "modbus_connections", :force => true do |t|
    t.string   "name"
    t.string   "ip_address"
    t.integer  "port"
    t.integer  "client"
    t.text     "note"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

Идея состоит в том, что фоновый процесс, вероятно, будет опрашивать Modbus и сравнивать себя для изменений перед регистрацией толькоЭлементы, которые были изменены и были запрошены для входа.Элементы, вероятно, должны храниться как в БД, так и в переменных, которые уже масштабированы, поэтому интерфейсу не нужно беспокоиться об этом.Те, которые не зарегистрированы, все еще хранятся в переменных экземпляра для мониторинга типов отображения полу-в реальном времени.Затем зарегистрированные элементы в их таблице событий будут анализироваться для графиков и таблиц только по запросу пользовательского интерфейса.

Первый вопрос: (наконец-то!). Имеет ли смысл жить с данными в массиве и применять слой, который обрабатывает преобразование индекса (и, как это происходит, соответствующий элемент?)также значение, которое я использую v.collect{|i| i.to_s(16)} для преобразования) или лучше перенести все в хэш, где индекс и значение могут жить долго и счастливо в их наиболее удобной форме?

Первый вопрос edit: Учитывая решение / эволюцию моего вопроса в сторону регистрации только изменений данных в простой sqlite db, и что мне нужно будет отслеживать изменения для элементов, чтобы определить, какие из них изменились между чтениями Modbus, выполняет ли массив или хэшсделать сравнение более эффективно?Должен ли я вообще волноваться?

Второй вопрос: В Rails, принимая во внимание интервал регистрации в одну минуту, будет ли лучше хранить около тысячи точек данных в независимых полях, или я должен оставить их в64 элемента фрагментов и анализ информации о пути к интерфейсу?

Редактирование второго вопроса : Запуск большого количества неизмененных данных в одноминутный «ряд» базы данных кажется очень плоским.Кроме того, он не позволяет легко динамически выбирать элементы для регистрации.Казалось бы, гораздо более уместно делать события «регистратора», а не интервалы.Что довольно неплохо означает, что Первый Вопрос здесь более важный, так как он, вероятно, также станет механизмом проверки состояния.

Полагаю, я без необходимости заново изобретаю колесо с таким откровением, как этостановится очень похоже на существующие «регистраторы».Чтение вокруг SO показывает, что это старый вопрос о входе в БД против FS.Поскольку сам журнал является основой приложения, я склонен входить в БД, скорее всего, из-за прочитанного.

Второй вопрос снова отредактирован : Теперь это вопрос нормализации, все, что я читаю, говорит о том, что для «масштабируемости» требуется денормализация.Моя зарегистрированная таблица «События» будет относительно простой, отметки времени, значения и идентификатор элемента.Должен ли он также денормализовать наиболее распространенные атрибуты из таблицы «Элементы» или объединение нормально в этом относительно небольшом масштабе?1037 *

Ответы [ 2 ]

1 голос
/ 15 августа 2010

Я не думаю, что на этот вопрос ответили в другом месте :) Вы можете быть единственным человеком на SO, использующим Rails и Modbus. У меня есть опыт работы с Rails и Modbus, за исключением того, что мой опыт работы с Modbus связан с nmodbus на .net compact framework. Я не знаю, что у меня есть для вас конкретные ответы, но я могу поделиться подходом, который я использовал.

Когда мы опрашиваем устройство, мы немедленно применяем любой анализ, масштабирование или преобразование данных (но у нас нет 1000 значений). Затем данные заносятся в базу данных. Теперь любые клиенты, которые хотят использовать базу данных, не имеют никакого представления о Modbus, и им все равно; проблема переходит от знания Modbus к тому, что приложение действительно заботится (напряжение!). В вашем сценарии я бы попытался полностью отделить это приложение опроса от вашего приложения Rails.

Теперь, почему разъединение может быть невозможным - 1000 точек данных. Это проблема. Ради аргументов, даже если вы смогли нормализовать эти данные в 50 таблиц, это 50 таблиц с 20 столбцами в каждой ... хм. Я не знаю простого способа регистрации 1000 точек данных, но построение постоянной хеш-таблицы может не сработать.

Плохая часть необходимости требовать, чтобы Rails знал, как анализировать значения регистров, заключается в том, что теперь ваше Rails-приложение знает о Modbus (не на уровне регистров чтения, а на уровне синтаксического анализа). Также, если вы хотите использовать клиент, отличный от Rails, это приложение также нуждается в знании синтаксического анализа. Может быть, в этом весь смысл вашего Rails-приложения? Приложение Rails знает, как разрезать и нарезать кубики показаний Modbus, и предоставляет пользователям / клиентам приятный пользовательский интерфейс / веб-сервисы для работы.

Это хорошие вопросы, но трудно дать конкретный совет, не имея больше знаний о том, что вы строите. Что касается нормализации - методом проб и ошибок. Попробуй оба пути. Я не могу сказать такие вещи, как «если у вас есть более 40 столбцов в вашей таблице sqlite, она развалится» - такие вещи, что вам просто нужно столкнуться с ...

0 голосов
/ 09 августа 2011

В ответ на контрольный вопрос № 2. Вместо использования кусков из 64 слов я использовал простой алгоритм для получения оптимального количества запросов на передачу.

Алгоритм довольно прост, вы начинаете с адреса 1 (при условии, что выиспользуют ПЛК), а затем найдите, нужно ли опрашивать этот регистр в этом случае, используйте его в качестве начального адреса и увеличивайте длину, пока она не достигнет 125 (что является максимумом Modbus).Если нет, то перейдите к следующему элементу и посмотрите, нужно ли это опросить, и повторите процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...