❓ Программа на 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] ) |