/PyRtuTrends

Программа на PyQt5, позволяющая записывать данные с регистров, получаемые по протоколу Modbus, в виде графиков, а потом сохранять их и импортировать с привязкой по времени и логами.

Primary LanguagePython

📈PyRtuTrends

❓ Программа на PyQt5, позволяющая записывать данные с регистров, получаемые по протоколу Modbus, в виде графиков, а потом сохранять их и импортировать с привязкой по времени и логами.

💥Преимущества связаны с настройками:

  • все они (как и файлы сохранения) хранятся в легко читаемом формате в отдельном файле, который можно быстро отредактировать под нужное Modbus-устройство
  • изменения сохраняются и загружаются в несколько кликов
  • настроек много: цвета графиков, их названия и обозначения входов, формат хранения значений в регистрах (среди них: 32- и 64-битные float, 16-битные int, float в виде int, дискретные входы/выходы)

Заметьте, что данные для подключения из настроек просто являются значениями полей ввода по умолчанию, подключение и изменение настроек связи проводится в программе, это редактировать не обязательно. Подключение можно осуществить по Modbus TCP и Modbus RTU.

📁 Автосохранение

Присутствует возможность автосохранения каждые несколько часов (помогает избежать потери несохранённых данных и разделить график на части). Для этого надо создать в текущей директории папку Autosave

В файле settings.json, который загружается по умолчанию и поэтому не должен быть удалён, хранятся примеры всех настроек, но для понимания стоит изучить следующее:

Хранение Формат записи Пример
Целое число адрес регистра как число или строка 14874 или "V35032" или "H3A1A" - результат один
Дробь в виде целого числа, которое надо разделить на 1000 (16 бит) [адрес, " / 1000"] [14874, " / 1000"]
Дробное число в 2 или 4 регистрах (32 или 64 бита вместо 16) [адрес, кол-во регистров] [14874, 2] - это 14874 и 14875
Дискреты (1 из 16 битов в регистре) [адрес регистра, номер бита, значение-если-0, значение-если-1] пусть в регистре 14874 записано 0000000000000001, тогда [14874, 0, 1, 2] прочитает 1, но так как приложение связано с построением графиков, они не должны наслаиваться друг на друга из-за одних и тех же возможных значений (0 и 1), поэтому их надо заменить на другие, в данном случае - 1 и 2 (например, если один график по оси Y лежит на [1, 2], следующий можно вынести на [3, 4])