Авторы:
Олейников В.С.
Гуськов К.С.
Для того чтобы начать рассматривать идею расширения функционала мы разобьем задачу на несколько подзадач. Дело в том, что ОВЕН ПЛК200 имеет больше памяти, а значит он способен хранить информацию в большем объеме. На данном преимуществе мы и будем расширять наш функционал. То есть наша задача будет состоять в том, чтобы хранить данные в ПЛК и с помощью WEB-технологий в любой момент времени ее просматривать. Таким образом мы сможем, не выезжая на место, где установлен шкаф, просматривать информацию сделанную ПЛК и в тоже время делать выводы о достоверной работе системы.
Сначала перед тем, как выводить информацию на экран, нам нужно ее архивировать. Поэтому первой подзадачей нашей основной цели будет являться архивация. Чтобы настроить ПЛК архивировать данные нам, нужно его запрограммировать. А значит начнем с написания программы для ПЛК.
Весь алгоритм будет реализован в “CodeSyS V3.5 patch 3”, так как ПЛК версии 200 взаимодействует именно с данной версией программы. Начнем с создания проекта и выберем в качестве устройства ПЛК200:
После того как мы нажали “ОК”, будет создан проект, в котором нам понадобиться настроить библиотеку для работы с архивами. Данная библиотека называется “OwenArchiver”, которая представляет собой архиватор, настраиваемый через дерево проекта. Созданный архив представляет собой файл формата “.csv”.
В изначальной библиотеке ее нет и поэтому, нам нужно скачать данный пакет с официального сайта “OWEN.ru”. Как только мы скачаем конфигуратор, в CodeSyS нам необходимо его установить и добавить в программу. Для этого открываем вкладку “Инструменты” и выбираем пункт “Менеджер пакетов”, после чего указываем путь к файлу пакета и нажимаем кнопку установить. После чего в окне менеджера появиться файл с архиватором:
Далее после того, как архиватор был успешно установлен, нам необходимо добавить его в проект. Для этого мы нажимаем на узел Device и добавляем компонент “OwenArchiever”, расположенный во вкладке “Разн.”:
Как только мы добавили данную библиотеку в проект, она у нас стала отображаться в конфигураторе задач. Данные файлы нам не стоит изменять или как-то настраивать.
После того как все было сделано верно, мы переходим к настройке компонента OwenArchiever. Данная настройка состоит из четырех вкладок, но нам понадобиться только две первых:
Каждое из параметров во вкладке “PCI-шина Конфигурация” обозначает следующее:
1) Имя архива- должно быть уникальным в рамках проекта. В данном случае оставим имя каталога такое же.
2) Режим архивирования — это по какому условию будет добавлена запись в архив. Состоит из:
a. Периодически – записи будет добавляться циклически с периодом, определяемым параметром период архивации;
b. По команде – запись будет добавлять по переднему фронту заданной логической переменной, но не чаще раза в секунду;
c. По изменению – записи будут добавляться при изменении значения любой из переменных архива, но не чаще периода архивации
Здесь мы оставим режим периодически так как нам нужное непрерывное измерение данных.
3) Период активации позволяет выбрать время замеров параметров, в данном случае поставим раз в 5 минут, то есть ставим 300 секунд.
4) Максимальный размер ставим в зависимости от вместимости хранилища ПЛК. Пока ставим 300 Мб.
5) Десятичный разделитель оставляем таким же.
6) Устройство для введения архива ставим директория CodeSys. Архив будет вестись во внутреннюю память контроллера (в рабочий каталог в папку /archives/<имя_архива>);
7) Последнее оставляем FALSE так как нас она не интересует.
Теперь переходим на вторую вкладку и начинаем настраивать ее:
Здесь мы выбираем переменные, которые будут влиять на работу архива. Как мы можем видеть в столбце “Канал” что каждая переменная делает. А тип нам помогает определить саму переменную. Таким образом мы создаем соответственно переменные с текущими типами и уже в визуализации мы можем влиять на эти параметры либо в самой программе мы можем также менять состояние переменных.
После того как настроили данное поле, мы переходим во вкладку формата, находящуюся в иерархии настроек и там мы настраиваем периодичность создания файлов с данными:
Здесь в области “значение” мы задаем формат изменения смены файлов.
Данная надстройка включает в себя три пункта:
- Непрерывный архив – все данные будут записываться в один файл. По достижению его максимального размера будет создан новый файл, а по достижению максимального размера нового файла – первый файл будет удален. Таким образом, фактически архив состоит из двух файлов – текущего (в который записываются данные) и предыдущего;
- Год/Месяц/День – архив за каждые сутки будет записываться в отдельный файл (название – номер дня), файлы за каждый месяц будут сохранены в папке (название – номер месяца), папки за каждый год будут сохранены в корневой папке (название – номер года). По достижению максимального размера архива самые старые файлы будут последовательно удаляться. Если в результате удаление файлов папка какого-либо месяца окажется пустой, то она будет удалена;
- Год/Месяц_День – архив за каждые сутки будет записываться в отдельный файл (название – номер месяца_номер дня), файлы за каждый год будут сохранены в корневой папке (название – номер года).
Здесь мы выбираем “Год/Месяц/День”, так как нужна сводка по каждому дню работы системы. Далее нам остается настроить лишь сами данные, которые будут записываться в архив. На данном этапе мы будем записывать только время, температуру на улице и текущее состояние системы. Значит наш файл будет состоять из трех элементов. Для этого мы создадим эти элементы нажав правую кнопку мыши на конфигуратор архива и выбрав опцию “Добавить устройство”:
Соответственно нам понадобиться тип данных “REAL”, и “STRING”. Как только мы добавили эти элементы их нужно настроить. Открываем конфигуратор элемента и начинаем настройку:
В первом поле мы указываем название столбца формируемого файла, данная надпись “Температура” будет выводиться в начале каждого файла в соответствующем столбце. Вторая конфигурация позволяет нам регулировать точность переменной. В данном случае оставим 2. Теперь перейдём во вторую вкладку и настроим там переменную:
В этой настройке нам нужно выбрать какая переменная из программы будет являться аргументов в выводе значения в файл. Так как здесь мы настраиваем тип “REAL”, то выбираем переменную, отвечающую за температуру. Таким образом проделываем все тоже самое и с остальными переменными.
После всего вышеизложенного наш архив будет формироваться в контроллер и хранить файлы в формате .csv, где будут храниться значения температуры улицы, времени и состояния задвижки системы. Ниже приведена пример сформировавшегося файла:
Теперь после того, как мы смогли архивировать данные ПЛК, то мы можем приступать к формированию WEB-интерфейса для просмотра данных в файлах. Для этого создадим объект в том же проекте под названием “Визуализация” (Правой кнопки нажимаем на каталог программы-> далее добавить объект-> Визуализация):
После чего нажимаем на кнопку добавить и у нас в каталоге появляется вкладка с названием WEB-визуализация:
Но для начала заходим во вкладку “Visualization” и там нам нужно создать интерфейс для программы, чтобы выводить данные. После того как мы перешли на данную вкладку у нас открывается окно, в котором присутствует поле, где мы создаем интерфейс, и поле элементов:
Теперь создадим предварительный интерфейс для того, чтобы просматривать каталоги, созданные архиватором:
Для того чтобы выводить содержимое каталогов нам нужно создать структуру, состоящую из имени, типа, размера и даты изменения. Структура объявляется следующим образом:
- Нажимаем правой кнопкой мыши на корневой элемент “Application” и там нажимаем добавить элемент, после выбираем “DUT…”. Потом в высветившемся окне выбираем “Структура” и нажимаем кнопку “Добавить”. Сам объект мы назовем “DirectInfo”.
- Как только элемент открылся, мы вписываем туда все переменные:
После того как мы сформировали структуру, нам необходимо объявить все переменные для работы с каталогами в главной программе:
Далее опишем работу функционального блока DIR_INFO. Данный блок по переднему фронту на входе xExecute начинается получение информации о каталоге, расположенному по пути RootDir.
- На шаге OPEN выполняется открытие каталога с помощью функционально блока FILE.DirOpen. Если каталог успешно открыт, то происходит переход на шаг READ.
- На шаге READ начинается получение информации о вложенных файлах/каталогах с помощью ФБ FILE.DirList. Полученные данные записываются на выход astDirInfo, который представляет собой массив структур типа FILE.FILE_DIR_ENTRY. Если число полученных данных превышает размер массива, то массив перезаписывается с нулевой записи. Далее переходим к шагу CLOSE.
- На шаге CLOSE каталог закрывается.
Ниже приведен Листинг программы DIR_INFO:
Теперь переходим к основной программе и опишем алгоритм работы программы. Далее приведем листинг главной программы PLC_PRG:
Теперь опишем алгоритм работы программы:
- При загрузке проекта однократно (с помощью переменной xFirstStart) происходит запуск ФБ fbDirInfo для получения информации о корневом каталоге выбранного устройства (по умолчанию – памяти контроллера).
- Если выделить каталог, то можно просмотреть его содержимое, нажав кнопку Открыть каталог. Для возвращения в предыдущий каталог следует нажать кнопку На уровень выше. В случае выделения файла кнопка Открыть каталог должна быть неактивной. В рамках этой программы нам запрещено работать с этими каталогами. Логическая переменная xHideUp, характеризующая неактивность кнопки, будет принимать значение TRUE в вышеописанных случаях.
- По команде (xDown) происходит формирование пути к следующему вложенному каталогу (выбранному с помощью выделения строки таблицы на экране визуализации) и запуск ФБ fbDirInfo, который получит информацию о данном каталоге.
- По команде (xUp) происходит формирование пути к родительскому каталогу (расположенному на уровень выше по отношению к текущему) и запуск ФБ DirInfo, который получит информацию о данном каталоге. У нас нет возможности перейти на уровень выше относительно корневого каталога.
- Программа обрабатывает информацию, полученную от блока fbDirInfo – в частности, преобразовывает размер вложенных каталогов/файлов в строковый вид с помощью функции BYTE_SIZE_TO_WSTRING и метки времени последнего изменения каталога/файла в форматированную строку с помощью ФБ SPLIT_DT_TO_FSTRINGS.
Теперь, когда мы привели основную часть программы и подключили переменные к соответствующим объектам визуализации, то при запуске программы мы получим следующую работу программы:
Таким образом если мы подключим архиватор и данную визуализацию, то мы сможем контролировать запись файлов, в каталогах и следить за правильностью работы программы. На данном этапе мы выполнили визуализацию проекта. И нам остается лишь загрузить данную программу в ПЛК200 и запустить ее. А чтобы просматривать данную программу удаленно нам необходимо подключиться к web-интерфейсу.
Для этого мы узнаем IP-адрес контроллера и номер порта подключения. После чего в поисковой строке вводим этот адрес и через двоеточие порт подключения, потом ставим слэш и пишем название нашей программы (в данном случае это “Web-interface”) и прописываем “.htm”. После чего наша программа будет выдана через контроллер с помощью web-сервиса.