Здравствуйте, а макрос командного слова и слова состояния для связи ПР205 и ПЧВ3 М01 будет?
Вид для печати
Здравствуйте, а макрос командного слова и слова состояния для связи ПР205 и ПЧВ3 М01 будет?
Коллеги, помогите! Не могу скачать макрос из данного обсуждения! При нажатии на скачивание высвечивается черный экран с маленьким белым квадратом.
https://owen.ru/forum/showthread.php...5949#post85949
Самое первое сообщение (макрос универсальный управления двумя насосами). да и любой в принципе с этой страницы не скачивается. буду рад, если сможете скинуть мне архив на почту iehins@mail.ru
В 2016 при изучении Owen Logic и готовых примеров управления насосными группами скачал этот макрос.
Сейчас успешно открыл его из отправленного архива в OL 2.5.342.0.
Сегодня работоспособность не проверял.
Почему он не работает? Он изначально был некорректным? Тогда удалю его, чтобы не сбивать других...
Прошу прощения - именно загрузку из собственного сообщения не проверял.
Попробовал удалить и загрузить rar архив - не могу считать из сообщения.
Загрузил owl - и, о чудо, могу скачать из сообщения.
Обновил сообщение, теперь можно скачать
Видимо, это какая-то проблема форума.
Может, после исправления, и из исходного сообщения можно будет скачать этот и другие макросы...
Как-то не пришло в голову перепроверять прикреплённый файл на скачивание.
Спасибо.
смог) но было бы удобно. Еще то что оказывается есть старые и новые ПЧВ. В новых номера регистров иные и они ни в каких РЭ не прописаны. Благо что есть OPS сервер.
Вы не могли бы подсказать что означает - "статус не определен" в OPS когда пытаюсь считать регистры с ПР205. Хотя все выставлено верно. И пробовал разные варианты и настройки
Поделюсь макросом ПИ (урезанный ПИД) регулятора для привода с 3-позиционным управлением без обратной связи по положению.
Проверил его на одном объекте - регулировка температуры подачи теплосети при помощи смесительного клапана после гидравлического разделителя.
Т.е. процесс инерционный, время полного хода привода 60 с.
Понадобился такой, а на форуме предлагают или "аналоговый" ПИД с управлением по псевдо-обратной связи от математической модели привода или выход "аналогового" регулятора перерабатывают в ШИМ.
По формуле из РЭ ТРМ12 получил приращение выхода на каждом шаге пересчёта регулятора
Вложение 73828
Физический смысл приращения - доля (-1,0...+1,0) от времени полного хода для перемещения привода с учётом направления.
Tm - время пересчёта регулятора
При каждом пересчёте обновляю также и расчётное положение привода, т.е. суммирую перемещения
Вложение 73829
Сразу же ограничиваю "взвинчивание интегральной составляющей" значением в 20%, т.е. диапазоном (-1,2...+1,2). Этот параметр не выводил ко входам, а задал константой.
Для "отключения" интегральной, достаточно сделать время интегрирования менее 0,001, т.е. приравнять к 0.
алгоритм:
Также добавлено ограничение на паузу после реверса.
Кроме того, ввёл диагностику, останавливающую вычисления и выводящую сигнализацию на выход ФБ при некорректных входных параметрах.
Наверняка, можно расширить список проверок.
Входные параметры:
fPV — переменная процесса (process variable);
fSP — уставка (задание) процесса (setpoint);
fDeadBand — зона нечувствительности (dead band) - в каждую сторону, т.е. в итоге вся зона в два раза больше;
fKp — коэффициент пропорциональности, значение полосы пропорциональности Xp=1/Kp равно величине невязки (рассогласования) при котором регулятор сформирует импульс длительностью равный времени полного хода привода;
fTi — время интегрирования;
nTRecalc_[ms] — период пересчёта (квантования) значения выхода регулятора,
nTFullStroke_[ms] — время полного хода (full stroke);
nTPulseMin_[ms] — длительность минимального импульса;
nTPauseReverse_[ms] — минимальная длительность паузы между командами реверса;
bEnable - разрешение работы регулятора (при запрете не только останов, но и сброс накопленной интегральной составляющей)
bReset - задумывал, как установку "интегральной" в заданное со входа значение, но не реализовал, поэтому получил второй вход bEnablr, но инверсный
Выходные параметры:
bOpen - команда на привод "открыть" регулирующий орган;
bClose - команда на привод "закрыть" регулирующий орган;
bError - ошибка введённых параметров, вычисления остановлены.
Ошибка введённых параметров для случаев:
1. nTRecalc_[ms] < 1000 мс
2. nTPulseMin_[ms] < 200 мс
3. nTFullStroke_[ms] < 1000 мс
Для зоны нечувствительности покажу изображением
Вложение 73830
Вложение 73831
[09/03/2025] Сделаю дополнение.
Добавлю тестовую программу с ПИ регулятором и эмулятором объекта - для наглядности работоспособности этого макроса.
В примере незначительные изменения макроса - взвинчивание интегральной ограничено 0%, убран бесполезный вход Reset.
Вложение 82360
Сделаю ремарку по поводу параметров настройки.
Kp - тут всё просто, примерно в 6 раз меньше требуемого отклонения при регулировании Kp=1/(6*отклонение), размерность 1/[EU]
Ti - при такой формуле регулятора с независимыми друг от друга коэффициентами Kp и Ti, сами они зависят от диапазона изменения (в физических единицах) регулируемой величины. Размерность Ti - [EU]/[s]. Поэтому значение параметра fTi для наладчика (и для настройки поля ввода в HMI) может оказаться неожиданно большим или наоборот маленьким. Например, в тестовом примере получены значения fKp=0.0012 и Ti=65000. Но если привести Ti к размерности только времени, умножив на Kp - , то получим значение ( fTi ⋅ fKp=65000 ⋅ 0,0012=78 с) сопоставимое с максимальным временем апериодического звена модели объекта (150000 мс = 150 с).
Спасибо, 1exan
Ваше исправление на обратные связи убрало все предупреждения
ST для OL в январе оставался сырым продуктом, не позволяющем использовать внутри себя таймеры (без ввода времени извне), а также не позволяющий помещать полученный ФБ внутрь другого законченного макроса.
Ведь ФБ ПИД не является самоцелью, он потом помещается внутрь большего ФБ, чтобы на итоговом холсте для однотипных процессов (несколько контуров регулирования) была не рассыпуха, а несколько ФБ - отладка и исправление недочётов резко упрощаются. Так у меня используется один большой ФБ аналоговый ПИД с переходом в сон, плавным изменением уставки и ещё какими-то функциями - очень удобно, при очередном проекте обхожусь импортом вместо рисования.
Поэтому FBD - осмысленное решение, несмотря на большую однозначность последовательности выполнения операций в ST.
Сейчас возможности ST доработаны, рукастый желающий может воспроизвести алгоритм.
После сдачи работы, пока нет возможности проверить переработку в ST на реальном объекте как проверил с FBD, поэтому реализацию на ST отложу до следующего раза.
Работа отнюдь не титаническая - видно, что там всего лишь вычисления по двум формулам и потом условие включения и отключения триггера (разрешить перемещение). И условий установки-сброса триггера - по два-три. Вместе с отладкой сделал за два подхода вместе с изучением опыта на форуме.
Поделюсь макросом, помогающим экспортировать сетевые переменные из ПР205 в пенель оператора Weintek.
Макрос не совсем закончен, не совсем идеален, но резко сокращает время создания проекта в EasyBuilder для Овен ПР205.
У меня пока нет времени на его доводку, приведу то, что готово - может быть идея вдохновит на более законченные решения. Мне советовали использовать другой скриптовый язык - PowerShell, но со свободным временем для изучения пока туго...
Итак, поехали!
OL для сетевых Slave переменных имеет возможность экспорта тегов в файл формата csv в кодировке UTF-8.
Easy Builder для тегов также имеет возможность импорта и экспорта тегов файлом csv в кодировке UTF-8.
Файл OL содержит почти все необходимые данные для импорта в Easy Builder, нужно только переставить поля, заменить названия типов данных, добавить название устройства, под именем которого данная ПР описана в проекте Easy Builder. Что без проблем выполняется в Exel (MS Office) или Calc (LibreOffice) - вручную, долго.
Скрипт (пакетный файл - bat или cmd) отлаживался для ПР205. Для других ПР не уточнял, если последовательность первых 5 полей совпадает, то и для них возможно применить.
OL_PR205_to_Weintek.bat:
Используются утилиты из UNIX: sed или ssed - обе работают одинаково в данном случае.
https://sourceforge.net/projects/gnuwin32/files/
https://sed.sourceforge.io
Их установка - просто распаковка в какой-нибудь каталог. В случае gnuwin32 скачать и распаковать sed-4.2.1-dep.zip и sed-4.2.1-bin.zip
Утилиты пакета binutils очень распространены и чаще всего уже установлены с каким-нибудь пакетом программирования: WinAVR, Visual Studio и другими. Но при их отсутствии - легко скачиваются и устанавливаются.
Для работы нужно в скрипте уточнить:
- полный путь к sed (или ssed)
- название файла экспорта переменных из OL
- название итогового файла для Easy Builder
- после завершения работы скрипта нужно в текстовом редакторе открыть итоговый файл и заменить дефолтное название устройства "Owen_PR205" на то, которое задано в проекте EasyBuilder, иначе импорт будет невозможен.
Отдельное действие с названием устройства получилось из-за того, что не разобрался с кодировками.
Но и так, хорошо получилось - много быстрее, чем перенос руками.
В результате работы:
из файла экспорта OL 'ТестовыйПроект_Сетевые, Slave.csv':
Получаю
result.csv:
После замены в Блокноте второго поля "Owen_PR205" на название устройства из "системных параметров" получаю готовый файл импорта.
Импорт в Easy Builder настраивается двумя опциями:
- удалить старые теги (нужно снять выбор, т.к. иначе удалятся и необходимые системные теги)
- заменить существующие теги на новые (установить выбор и заменять, обновлять теги).
возможно есть по проще вариант и кроссплатформенный, на питоне
Код:import pandas as pd
import numpy as np
fnamesrc = 'Slave.csv'
fnamedst = 'result.csv'
spisok = {'Целые':'16-bit Unsigned','Вещественные':'32-bit Float'}
def load_ds(fnamesrc,fnamedst):
df = pd.read_csv(fnamesrc, delimiter=';')
stuff0 = df[['Имя переменной']].to_numpy()
stuff3 = df[['Адрес регистра']].to_numpy()
stuff4 = df[['Комментарий']].to_numpy()
stuff5 = df[['Путь к параметру']].to_numpy()
stuff1 = np.full(len(stuff0),'Owen_PR205')
stuff2 = np.full(len(stuff0),'3x')
frames = [pd.DataFrame(stuff0), pd.DataFrame(stuff1), pd.DataFrame(stuff2), pd.DataFrame(stuff3),pd.DataFrame(stuff4),pd.DataFrame(stuff5).rename(columns = {0:'type'})]
adf = pd.concat(frames, join = 'inner', axis = 1)
adf['type'] = adf['type'].map(spisok)
adf.to_csv(fnamedst, header = False, index = False)
load_ds(fnamesrc,fnamedst)
Класс!!!!!
Было бы итересно готовый продукт на питоне чтобы можно было пользоваться. Оч полезная бы была приблуда
Думаю, что в существующем виде это вполне законченный продукт - по-большому счёту GUI не требуется, т.к. в ходе работы и, особенно ПНР, в теле скрипта один раз заполняются исходные данные (входной и выходной файлы, название устройства), а потом просто кликом скрипт запускается, формируя обновлённый список тегов.
По крайней мере, для меня бОльшую ценность имеют консольные утилиты - после настройки их можно быстро многократно запускать без лишних диалогов выбора файла и прочего. И дополнительно, консольные утилиты быстрее создаются и используются, а применение - это исходная задача.
Поэтому, моё решение основано на bat и sed - на лично известных и освоенных инструментах.
Немного не закончил демонстрационную программу для 3-позиционного регулятора - хотел сделать FBD вариант и вместе их потестировать. Но время никак не выкрою... Может чуть позже завершу и заменю демку для этого объекта.
При разработке регулятора актуальным остаётся вопрос проверки и отладки алгоритма до начала ПНР на объекте.
Для регулятора с управлением исполнительным механизмом через аналоговый выход можно собрать макет из датчика температуры, твердотельного реле с регулируемым выходом, нагревательным элементом (лампой накаливания или керамическим резистором).
Для регулятора с трёхпозиционным исполнительным механизмом собрать простой макет уже затруднительно.
введение:
Предлагаю самостоятельные реализации эмуляторов для среды разработки OwenLogic, появившиеся благодаря идеям FB100, FB101. Каждый из эмуляторов реализован в двух вариантах - на языках программирования ST и FBD, что связано с неравноценной реализацией отсчёта времени и возможностей вложения полученных ФБ в другие ФБ в среде Owen Logic.
ЭМУЛЯТОР ОБЪЕКТА УПРАВЛЕНИЯ С "НЕПРЕРЫВНЫМ" УПРАВЛЕНИЕМ
Структура эмулятора объекта управления с "непрерывным" регулированием показана на рисунке
Вложение 79209
Для получения значения выхода эмулятора объекта нужно последовательно трижды найти численное решение дифференциального уравнения
алгоритм решения дифференциального уравнения:
Реализация эмулятора с "непрерывным" управляющим входом
на языке ST:
на языке FBD:
пример использования совместно с ФБ PID:
ЭМУЛЯТОР ОБЪЕКТА УПРАВЛЕНИЯ С ТРЁХПОЗИЦИОННЫМ УПРАВЛЕНИЕМ
ФБ будет состоять из двух частей: эмуляция привода с трёхпозиционным управлением (на вход которого поступают сигналы "открыть" и "закрыть", а выходе формируются сигналы положения регулирующего клапана и состояния концевых выключателей "открыт" и "закрыт") и эмуляция объекта управления с непрерывным управлением.
Имеется возможность эмулировать неидеальный клапан - с отличающимися временами полного хода при открытии и закрытии, временами выборки люфта при открытии и закрытии.
на языке ST:
На FBD не реализовывал - трудоёмко... Хотя для отладки ПИД регулятора "изнутри" при нынешних ограничениях на вложенность ФБ в OwenLogic, лучше бы и на FBD иметь.
ЛИТЕРАТУРА
1. Примеры программ для технологических функций. A5E00130042-01 (является частью документа 6ES7 398-8FA00-8AA0)
https://www.siemens-ru.com/doc/Primeri_programm.pdf
ПРИЛОЖЕНИЕ
1. Демонстрационная программа работы эмулятора объекта с "непрерывным" управлением
Вложение 79351
2. Демонстрационная программа работы эмулятора объекта с "3-позиционным" управлением
Вложение 79352
FPavel, здравствуйте!
Воспользовался Вашим регулятором с трехпозиционным управлением, огромное спасибо!
Проблема возникла, когда подал на вход уставки величину 3500. Ну и измеренную величину в том же масштабе. В итоге он регулировал без остановок. :)
Внес в ФБ очень небольшую поправку, предлагаю на суд автора. Вложение 79234
Спасибо, за обратную связь!
Тогда уж приводить не к уставке, а к диапазону измерений датчика - уставка может быть равной нулю (например, для уровня воды в котле).
Почему-то думал, что именно абсолютное значение PV и SP не будет влиять на регулирование, ведь можно пропорционально уменьшить Kp и увеличить Ti.
Если PV сильно зашумлён, то его можно дополнительно сгладить фильтром 1-го порядка (например, встроенным - свойства аналогового входа).
Обычно, при настройке ПИД регулятора подбираю Kp, Ti, период пересчёта и постоянную фильтра аналогового сигнала - они все взаимосвязаны.
Физический смысл полосы пропорциональности Xp = 1/Kp - величина невязки, при которой за счёт пропорциональной составляющей полностью откроется клапан. Брал его примерно как 3-4 допустимых диапазона отклонения при регулировании. Т.е. если при SP=3500 предполагается отклонения 50, то Xp=150-200 и Kp=1/200=0.005. Примерно, такой масштаб коэффициента Kp.
Вечером попробую проверить работу ПИД с эмулятором на уставках со значением порядка 3500.
В любом случае, спасибо - доработки означают, что Вы разобрались с логикой работы и по мере необходимости подстроите под конкретный случай.
P.S. Не могу уяснить источник проблемы (автоколебаний) - ведь сам ПИД регулятор не работает с абсолютными значениями, а только с невязкой (E=SP-PV), т.е. "смещение" в 3500 и 10000 не должно оказывать влияние...
Значения ошибки например между 35 и 37 и между 3500 и 3700 отличаются на два порядка. Для этого и предназначен коэффициент пропорциональности.
А если сделать приведение сигналов к диапазону измерения датчика, то при замене на датчик с другим диапазоном придётся менять и коэффициент пропорциональности
Проверил регулятор с уставкой 3500 вместе с эмулятором объекта.
Эмулятор объекта:
- время полного хода клапана 30 с,
- люфт клапана равен 1 с в обоих направлениях
- сам объект - апериодическое звено с постоянной времени 10 с, т.е. через 30 с от начала воздействия будет установлено стабильное состояние
- выход объекта равен 0 при полностью закрытом клапане (rPV_0 = 0)
- выход объекта равен 10000 при полностью открытом клапане (rGain = 100)
- положение клапана измеряется в процентах (rVLV_Min = 0, rVLV_Max = 100)
При Кп=0,0015, Ти=20000, Тм=5000 (время пересчёта), SP=3500, зоне=20 ПИД приводит объект к уставке, хотя и "подрабатывает" время от времени.
И это даже без компенсации люфта в регуляторе.
Т.е. всё-таки не могу принять, что регулятор не работает при уставках, сопоставимых с 3500.
Но, если заработало с делением - пусть работает. В данном случае, этот коэффициент просто перенесён как общий множитель за выражение ПИД регулятора.
Единственно, захотелось добавить слагаемое - дифференциал по времени значения Кп. И вместе с опцией разрешения этого слагаемого, возможно, добавлю.
UNIX_TIME + ПР100
Проблема: в симуляторе и фактически не совпадают значение регистра (в примере 575-й).
Ожидаемое значение: 47024
Фактическое: -17786
Вложение 79297
Прибавление 2000, реализовано в макросе. +2000 на входе в макрос- такой же результат.
Не понял, у меня по калькулятору ВА86 = 47750
Вложение 79309
Здравствуйте. Не могу найти для OL макросы как в FBD на максимум минимум. Сам сделать уже всю голову сломал. Мне нужно принять до 8 входных значений с точкой и выхода максимума и минимума (в идеале конечно с возможностью вычисления разницы между ними). Может кто подсказать? Я в программировании не силён, сам электрик поступил на АСУ ТП на заочку и ковыряюсь по-маленьку, изучаю.
Вложение 79366
Функции сможете добавить?
Код:function fMin: real;
var_input
x1, x2 : real;
end_var
fMin := x1; if x2 < fMin then fMin := x2; end_if
end_function
Или ФБ?Код:function fMax: real;
var_input
x1, x2 : real;
end_var
fMax := x1; if x2 > fMax then fMax := x2; end_if
end_function
Код:function_block f8MinMax
var_input
x1, x2, x3, x4, x5, x6, x7, x8 : real;
end_var
var_output
Min, Max, Delta : real;
end_var
Min := x1;
if x2 < Min then Min := x2; end_if
if x3 < Min then Min := x3; end_if
if x4 < Min then Min := x4; end_if
if x5 < Min then Min := x5; end_if
if x6 < Min then Min := x6; end_if
if x7 < Min then Min := x7; end_if
if x8 < Min then Min := x8; end_if
Max := x1;
if x2 > Max then Max := x2; end_if
if x3 > Max then Max := x3; end_if
if x4 > Max then Max := x4; end_if
if x5 > Max then Max := x5; end_if
if x6 > Max then Max := x6; end_if
if x7 > Max then Max := x7; end_if
if x8 > Max then Max := x8; end_if
Delta := Max - Min;
end_function_block
Так можно следить за сообщениями на форуме, это займёт не более 30 минут в день, в смысле, будете в курсе, а подобное уже делали:
Вложение 79367
Вложение 79369
https://owen.ru/forum/showthread.php?t=25067&page=70