- - recipe (глава 24. Recipe editor) - это RW регистры
- recipe database (глава 24.3 Recipe Database) - это база данных рецептов (на основе SQLite).
В данном топике речь про базу данных рецептов.
Механизм рецептов очень удобен для хранения наборов уставок.
Рецепты могут пригодиться в таких процессах как испытания различных устройств и механизмов, различная обработка чего либо в разных режимах и т.д.
В проекте представлено два набора рецептов для двух различных (вымышленных) процессов: термообработка (thermo) и электрические испытания (electric)
В проекте используется два экрана:
1) предназначен для работы с базой рецептов (просмотр, добавление, удаление, обновления) рецептов и записи конкретного рецепты в переменные устройства
2) предназначен для импорта/экспорта самой базы данных рецептов для сохранения и редактирования на ПК.
На первом экране можно выделить три блока: рецепты, уставки в HMI. таблицы с с рецептами.
В первом блоке отображаются значения полей выбранного в соответствующей таблице.
В блоке следующие элементы:
1) № выбранной строки - номер текущей строки в таблице рецепта (нумерация с 0)
2) Количество строк в рецепте - общее количество строк в рецепте (полезный индикатор, потому что таблица не отображает этого)
3) Кнопки команд: Добавить (добавляет новую строку в таблице рецепта), Удалить (удаляет текущую строку в таблице), Удалить все (удаляет все строки в таблице), Обновить (необходимо нажимать после каждой операции по удалению или добавлению для переноса изменений из таблицы в базу рецептов)
4) Результат - результат выполнения операций с таблицей (удачно или нет)
5) Значения соответствующих полей в текущей строке таблицы
В результате выполнения операций со строками могут быть ошибки. Список ошибок приведен на рисунке ниже
В одном блоке собраны данные от двух таблиц.
Для предотвращения свободного редактирования значений текущего рецепта предусмотрена блокировка - кнопка со значком замка.
Для отображения результат операций со строками в таблице использован объект "Список опций"
Во втором блоке отображаются значения уставок в устройстве (для простоты в данном случае это регистры HMI, но могут быть сразу теги ПЛК).
Кнопка Копировать в панель - вызывает макрос, который копирует значения полей текущей строки в соответствующие регистры панели.
- Код: Выделить всё
- macro_command main()
short temper1, temper2
unsigned short time
float press1, press2
float lw200
lw200 = 123.456
SetData(lw200, "Local HMI", LW, 200, 1)
GetData(temper1, "Local HMI", RECIPE, "thermo.temper1")
SetData(temper1, "Local HMI", LW, 0, 1)
GetData(temper2, "Local HMI", RECIPE, "thermo.temper2")
SetData(temper2, "Local HMI", LW, 1, 1)
GetData(press1, "Local HMI", RECIPE, "thermo.press1")
SetData(press1, "Local HMI", LW, 2, 1)
GetData(press2, "Local HMI", RECIPE, "thermo.press2")
SetData(press2, "Local HMI", LW, 4, 1)
GetData(time, "Local HMI", RECIPE, "thermo.time")
SetData(time, "Local HMI", LW, 6, 1)
end macro_command
В третьем блоке сами таблицы рецептов.
В проекте даны текстовые метки регистрам, используемых для получения имен файла, папки и полного пути к файлу экспорта базы рецептов.
В база данных рецептов создаем две таблицы : thermo и electric .
Для отображения таблиц рецепта в окно необходимо добавить объект "Просмотрщик рецептов"
Чтобы работали кнопки импорта/экспорта базы рецептов в текстовый файл *.csv необходимо сконфигурировать соответствующие регистры
Для выбора папки для экспортируемого файла на носителе (в данном случае SD карте) в проекте использован объект Проводник
Макрос генерирующий имя файла экспорта вызывается циклически пока открыта окно "Импорт/экспорт базы рецептов"
- Код: Выделить всё
macro_command main()
// объявляем переменные
short iSecond, iMinute, iHour, iDay, iMonth, iYear
char sSecond[2], sMinute[2], sHour[2], sDay[2], sMonth[2], sYear[4]
char filename[100] // имя файла в виде thermo_2020-05-28_18-55-34.csv (40 символов)
char foldername[100]
char fullpath[100]
// считываем регистры
GetData(iSecond, "Local HMI", LW, 9017, 1)
GetData(iMinute, "Local HMI", LW, 9018, 1)
GetData(iHour, "Local HMI", LW, 9019, 1)
GetData(iDay, "Local HMI", LW, 9020, 1)
GetData(iMonth, "Local HMI", LW, 9021, 1)
GetData(iYear, "Local HMI", LW, 9022, 1)
StringGet(foldername[0], "Local HMI", "receipe_foldername", 40)
// конвертируем числа в текст
DEC2ASCII(iSecond, sSecond[0], 2)
DEC2ASCII(iMinute, sMinute[0], 2)
DEC2ASCII(iHour, sHour[0], 2)
DEC2ASCII(iDay, sDay[0], 2)
DEC2ASCII(iMonth, sMonth[0], 2)
DEC2ASCII(iYear, sYear[0], 4)
// склеиваем имя файла
StringCat("thermo_", filename[0]) // thermo_
StringCat(sYear[0], filename[0]) // thermo_2020
StringCat("-", filename[0]) // thermo_2020-
StringCat(sMonth[0], filename[0]) // thermo_2020-05
StringCat("-", filename[0]) // thermo_2020-05-
StringCat(sDay[0], filename[0]) // thermo_2020-05-28
StringCat("_", filename[0]) // thermo_2020-05-28_
StringCat(sHour[0], filename[0]) // thermo_2020-05-28_18
StringCat("-", filename[0]) // thermo_2020-05-28_18-
StringCat(sMinute[0], filename[0]) // thermo_2020-05-28_18-55
StringCat("-", filename[0]) // thermo_2020-05-28_18-55-
StringCat(sSecond[0], filename[0]) // thermo_2020-05-28_18-55-34
StringCat(".csv", filename[0]) // thermo_2020-05-28_18-55-34.csv
StringCat(foldername[0], fullpath[0]) // склеиваем полный путь=имя_папки + имя_файла
StringCat("/", fullpath[0])
StringCat(filename[0], fullpath[0]) // копируем имя файла в полный путь
// записываем значения в регистры
StringSet(foldername[0], "Local HMI", "receipe_foldername", 100)
StringSet(filename[0], "Local HMI", "recipe_filename", 100)
StringSet(fullpath[0], "Local HMI", "receipe_fullpath", 100)
// ощищаем переменну "путь к файлу" для следующего цикла
StringCopy("", filename[0])
StringCopy("", fullpath[0])
end macro_command
В данном случае нет необходимости в имя файла вставлять текущую дату, это сделано как демонстрация возможностей панелей, которая может пригодиться в другом случае.
Для экспорта таблицы в текстовый файл необходимо в проводнике выбрать необходимую папку и нажать соответствующую кнопку экспорта.
Файлы экспорта отображаются сразу же.
Забрать их можно подключившись к панели по ftp
Смотрим файл в текстовом редакторе - все верно
Саму базу рецептов можно взять по ftp в папке recipe и открыть SQLite редактором
Проект для ознакомления прикреплен.