PDA

Просмотр полной версии : Библиотеки сторонних разработчиков



petera
24.12.2012, 12:46
Кроме упоминаемых на форуме бесплатных, с открытым кодом, OSCATовских библиотек OSCATBasic.
1. OSCATBasic http://www.oscat.de/component/jdownloads/category/2-oscat-basic.html (содержат массу полезных функций и блоков).
2. OSCATNetwork http://www.oscat.de/component/jdownloads/category/3-oscat-network.html
3. OSCATBuilding http://www.oscat.de/component/jdownloads/category/5-oscat-building.html (готовые функциональные блоки для управления инженерным оборудованием зданий - исполнительными механизмами, отоплением, вентиляцией, кондиционированием воздуха, управление жалюзи и шторами)
Нашел на сайте Пролога еще одну бесплатную библиотеку, то же с открытым кодом, описанием и несколькими примерами.
Это HBMutilities.lib http://extern.codesys.com/index.shtml?ru_ru_libs_forum

Полезные математические функции для вычисления сложных выражений (напр. гиперболические угловые функции, статистические функции и т.д.) В ZIP-файле есть примеры проектов CoDeSys.
Данная библиотека не содержит аппаратно-зависимых функций
Данная библиотека содержит не только это!

PUD.
Ссылка на HBMutilities.lib больше не работает. По этому выкладываю ее здесь

petera
24.12.2012, 13:04
Неоднократно поднимался вопрос о подсчете моточасов.
Для насоса следует обратить внимание на блок ACTUATOR_PUMP
12645
Входы
IN: BOOL (Сигнал управления насосом)
MANUAL : BOOL (Сигнал ручного управления)
RST : BOOL (Сигнал сброса)
Выходы
PUMP : BOOL (Сигнал управления насосом)
RUNTIME : REAL (Время наработки двигателя в часах)
CYCLES : REAL (Количество циклов включения / выключения насоса)
Настройки
MIN_ONTIME : TIME (Минимальное время работы двигателя)
MIN_OFFTIME : TIME (Минимальное время простоя двигателя)
RUN_EVERY : TIME (Время, по прошествии которого насос включается автоматически)

ACTUATOR_PUMP представляет собой интерфейс насоса со счетчиком часов наработки.
Насос может включаться входом IN либо MANUAL.
Переменные настроек MIN_ONTIME и MIN_OFFTIME задают минимальную периодичность включения и минимальную продолжительность работы.
Если вход IN установлен в TRUE меньшее, чем MIN_ONTIME время, то насос продолжает работать, пока не будет достигнута минимальная продолжительность его работы.
Если вход IN установлен в TRUE дольше, чем MIN_ONTIME, то насос работает, пока IN снова не станет FALSE.

Если насос нужно запустить снова через короткое время, блок ожидает, пока не истечет время MIN_OFFTIME, и только затем насос снова включается. С помощью настроечной переменной RUN_EVERY задается время простоя насоса, после которого он автоматически включается, чтобы предотвратить блокировку насоса. В этом случае после автоматического включения насос работает в течение времени MIN_ONTIME. Установкой RUN_EVERY = T#0s можно отключить автоматический запуск насоса.

Встроенный счетчик часов наработки подсчитывает время работы насоса в часах, а также количество циклов включения. Оба значения могут быть сброшены в ноль подачей TRUE на вход RST. Значение счетчика является реманентным и не теряется при потере питания или сбросе контроллера. И RUNTIME, и CYCLES являются значениями типа REAL, и поэтому не переполняются, как обычные TIME, после 50 дней.
Использует библиотеку Oscat Basic

petera
24.12.2012, 13:32
Блок HEAT_TEMP
Входы
T_EXT : REAL (Наружная температура)
T_INT : REAL (Заданная температура в помещении)
OFFSET : REAL (Понижение или повышение температуры в помещении)
T_REQ : REAL (Заявленная температура)
Выходы
TY : REAL (Температура теплоносителя в контуре отопления)
HEAT : BOOL (Запрос на включение отопления)
Настройки
TY_MAX : REAL (Максимальная температура в контуре отопления, 70°C)
TY_MIN : REAL (Минимальная температура в контуре отопления, 25°C)
TY_C : REAL (Расчётная температура, 70°C)
T_INT_C : REAL (Расчётная температура в помещении, 20°C)
T_EXT_C : REAL (T_EXT при расчётной температуре -15°C)
T_DIFF_C : REAL (Дифференциал подающей и обратной магистрали 10°C)
C : REAL (Постоянная системы отопления, DEFAULT = 1,33)
H : REAL (Порог для запроса на включение отопления 3°C)

HEAT_TEMP вычисляет температуру теплоносителя в зависимости от наружной температуры по следующей формуле:

TY = TR + T_DIFF / 2 * TX + (TY_Setup - T_DIFF / 2 - TR) * TX ^ (1 / C)

где: TR = T_INT + OFFSET

TX := (TR - T_EXT) / (T_INT_Setup - T_EXT_Setup);

Параметры температурного графика отопления задаются через настроечные переменные TY_C (расчетная температура теплоносителя), T_INT_C (температура в помещении в расчётной точке), T_EXT_C (наружная температура в расчётной точке) и T_DIFF_C (разность температур подаваемого и обратного теплоносителя в расчётной точке). При помощи входа OFFSET температурный график может настраиваться для снижения (отрицательное смещение) или повышения (положительное смещение) температуры в помещении. Настроечными переменными TY_MIN и TY_MAX температура теплоносителя может быть ограничена минимальным и максимальным значениями. Вход T_REQ служит для поддержки внешних запросов температуры, например, от бойлера. Если T_REQ больше, чем вычисленное по температурному графику значение TY, то TY будет установлено в соответствии с T_REQ. Ограничение по TY_MAX не распространяется на запрос через T_REQ. Настроечной переменной H определяется, начиная с какой наружной температуры будет вычисляться температурный график. Пока T_EXT + H >= T_INT + OFFSET, TY остается равным 0, а HEAT равным FALSE. Когда T_EXT + H < T_INT + OFFSET, HEAT устанавливается в TRUE, а TY становится равным вычисленной температуре теплоносителя. Настроечная переменная C определяет кривизну температурного графика. Кривизна зависит от применяемой системы отопления.

Конвекторы: C = 1.25 – 1.45

Панельные радиаторы: C = 1.20 – 1.30

Радиаторы: C = 1.30

Трубы: C = 1.25

Теплые полы: C = 1.1

Чем больше значение C, тем сильнее искривлен температурный график. Значение 1.0 задает температурный график в виде прямой. Для типичных систем отопления значение C лежит в пределах от 1.0 до 1.5.
http://www.wago.su/_/rsrc/1313599974960/oscat/building/heat_temp/heat_temp_kurve.gif

petera
24.12.2012, 19:07
Функция CRC_GEN тип DWORD
Входы
PT : POINTER TO ARRAY OF BYTE (Пакет данных)
SIZE : UINT (Размер массива)
Настройки
PL : UINT (Длина полинома)
PN : DWORD (Полином)
INIT : DWORD (Данные для инициализации)
REV_IN : BOOL (Переставлять местами биты в байтах на входе)
REV_OUT : BOOL (Переставлять местами биты в байтах на выходе)
XOR_OUT : DWORD (Последнее XOR результата)
Выходы
CRC_GEN: DWORD (Вычисленное значение CRC)

CRC_GEN генерирует контрольную сумму CRC для массива байтов произвольной длины. При вызове функции передаются указатель на обрабатываемый массив и его длина в байтах. В CoDeSys вызов производится как: CRC_GEN(ADR(Array), SIZEOF(Array),...), где Array - имя обрабатываемого массива. ADR является стандартной функцией, которая возвращает указатель на массив, а SIZEOF - стандартной функцией, вычисляющей размер массива. Полином PN может быть произвольным полиномом длиной максимум 32 бита.
Полином X&#179; + X&#178; + 1 представляется как 101 (1*X&#179; + 1*X&#178; + 0*X&#185; + 1* X⁰). Самый старший значащий бит, в данном случае 1*X&#179;, в полиноме не задается, поскольку он всегда равен единице. Могут обрабатываться полиномы до X&#179;&#178; (CRC 32). С помощью значения INIT можно задать для CR начальное значение, обычно это 0000 или FFFF. Применяемое начальное значение в литературе обычно называют „Direct Initial Value“. Вход XOR_OUT задаёт последовательность битов, с которой контрольная сумма комбинируется операцией XOR в конце. Входы REV_IN и REV_OUT задают последовательность битов данных. Когда REV_IN = TRUE, каждый байт обрабатывается, начиная с LSB, а при REV_IN = FALSE - начиная с MSB. REV_OUT=TRUE соответствующим образом переворачивает последовательность битов в контрольной сумме. Для работы блока необходимо минимум 4 байта входных данных, верхним пределом является максимальная длина массива.
Обыкновенно CRC_GEN вычисляет контрольную сумму, которая присоединеняется к оригинальному сообщению. Если теперь снова вычислить контрольную сумму сообщения вместе с присоединенной к нему контрольной суммой, то в результате получится 0.

Для некоторых особых CRC, для которых это правило не выполняется, после приёма сообщения можно вычислить заново контрольную сумму всех полезных байтов без присланной контрольной суммы и затем сравнить с присланной контрольной суммой.
Онлайн-вычисления для тестирования могут быть осуществлены следующей Java-утилитой: http://zorc.breitbandkatze.de/crc.html
Большая таблица Распространенные CRC и полиномы:

UPD
Вложение можно скачать здесь https://drive.google.com/open?id=0B1ENDtxOet_iREJjVkI5NUEwOVU

petera
04.08.2014, 16:39
Подскажите в библиотеки OSCAT есть ФБ DRIVER_4C нужно чтобы переключались Q1 и Q2 что надо прописать в настройках. Александр
Этот ФБ по каждому фронту на входе IN формирует на выходах Q1,Q2,Q3,Q4 комбинацию, заданную в массиве SX. По умолчанию 1(0001),3(0011),7(0111),15(1111). Эти комбинации нужно изменить, задав другие значения в массиве SX так, как требует логика работы выходов Q1 и Q2.
13904

http://www.owen.ru/forum/attachment.php?attachmentid=13903&d=1407155030

liga_blunt
04.08.2014, 21:02
Спасибо понял Но вот ротация идет через SN=0

Сема
25.08.2014, 17:42
Добрый день, а на русском языке таких плюшевых библиотек не предвидится?? А есть там какие нибудь готовый погодозависимые регуляторы?? Можете подсказать пожалуйста??

petera
26.08.2014, 10:34
Добрый день, а на русском языке таких плюшевых библиотек не предвидится?? А есть там какие нибудь готовый погодозависимые регуляторы?? Можете подсказать пожалуйста??
Не трудно догадаться, что погодозависимый регулятор получится если выход ФБ HEAT_TEMP (см. пост #3) использовать в качестве уставки для любого регулятора.

Сема
27.08.2014, 16:04
petera а если вас не затруднит, вы можете ещё рассказать о полезных функциональных блоках?? Просто мануал у них в лучшем случае на английском, сложно разобрать...

petera
27.08.2014, 17:19
petera а если вас не затруднит, вы можете ещё рассказать о полезных функциональных блоках?? Просто мануал у них в лучшем случае на английском, сложно разобрать...
Однако я немецкий изучал и то давно это было....

petera
27.08.2014, 17:26
Функция T_PLC_MS тип DWORD

Выход DWORD (Таймер ПЛК в миллисекундах)

T_PLC_MS возвращает текущее внутреннее время ПЛК в миллисекундах. Оно не имеет ничего общего с возможно имеющимися часами (блоком реального времени), а является значением внутреннего таймера ПЛК, которое используется в качестве опорного времени.
При нормальной работе блок считывает с помощью функции TIME() значение внутреннего таймера ПЛК и затем возвращает его. Внутренний таймер ПЛК имеет разрешение в 1 миллисекунду согласно стандарту IEC.

Другой особенностью T_PLC_MS является режим отладки, который позволяет тестировать переполнение внутреннего таймера ПЛК и проверять надежность работы разработанной программы в этом случае. Внутренний таймер каждого ПЛК переполняется через определенное время, независимо от производителя и типа его реализации. Это означает, что он достигает FF..FFFF (наибольшего значения, которое может храниться в переменной соответствующего типа), и затем начинает счет снова с 000..0000. Согласно стандарту, для таймеров ПЛК период переполнения составляет 2^32 -1 миллисекунд, что соответствует примерно 49,71 дням. Поскольку этот таймер реализован аппаратно, то его начальное значение нельзя установить, и после запуска ПЛК отсчет таймера всегда начинается с 0 и продолжается до достижения максимального значения. По достижении максимального значения возникает переполнение таймера, которое может вызвать фатальные последствия для приложения, однако проверить это крайне сложно.

T_PLC_MS предлагает несколько способов для проверки переполнения и зависящего от времени программного обеспечения. С помощью константы DEBUG может быть включен режим отладки, и затем при помощи констант N и OFFSET таймер может быть запущен с определенного значения, что позволяет протестировать переполнение, не дожидаясь 49 дней. При этом OFFSET задает число, которое добавляется к значению внутреннего таймера. С помощью постоянной N определяется, на сколько разрядов значение внутреннего таймера сдвигается влево, тем самым заполняя младшие N разрядов единицами. Таким образом, при помощи N скорость работы внутреннего таймера может быть увеличена в 2,4,8,16 и т.д. раз.

Таким образом, T_PLC_MS предоставляет все возможности для тестирования зависимого от времени программного обеспечения, как для проблемы переполнения, так и для очень продолжительных зависимых от времени функций.

Постоянные DEBUG, N и OFFSET специально реализованы не в виде входов функции, чтобы избежать случайного ошибочного использования.

См. также: T_PLC_US.

petera
27.08.2014, 17:30
Смотреть публикацию здесь http://www.prolog-plc.ru/art10

petera
27.08.2014, 17:49
Тип Функциональный блок

Входы
IN : BOOL (Входной сигнал)
RST : BOOL (Сброс)

Выходы
SECONDS : UDINT (Время работы в секундах)
CYCLES : UDINT (Количество циклов включений входа IN
14183

ONTIME представляет собой счетчик времени наработки. Он суммирует общее время, в течение которого сигнал IN с момента последнего сброса находился в состоянии TRUE. Кроме того, вычисляется общее количество циклов включения / выключения. Выходные значения имеют тип UDINT. При помощи входа RST выходные значения можно обнулить в любое время. Значения выходов сохраняются не во внутренних переменных блока, а размещаются извне и передаются через указатели. Решительное преимущество этого способа состоит в том, что по желанию пользователя переменные могут быть объявлены как RETAIN и/или PERSISTENT. Возможно также сохранить прежнее значение времени наработки, а затем восстановить его позднее.

Переменные на входах SECONDS и CYCLES должны быть определены как UDINT и могут быть объявлены как VAR, VAR RETAIN или VAR RETAIN PERSISTENT.

VAR RETAIN PERSISTENT
Betriebszeit_in_Sekunden : UDINT;
Zyklen : UDINT;
END_VAR
Следующая таблица объясняет действие ключевых слов RETAIN и PERSISTENT:


<tbody>
Онлайн команда
VAR
VAR RETAIN
VAR PERSISTENT
VAR RETAIN PERSISTENT


Сброс (Reset)
-
Значение сохраняется
-
Значение сохраняется


Холодный сброс (Reset Cold)
-
-
-
-


Сброс заводской (Reset Origin)
-
-
-
-


Загрузка (Download)
-
-
Значение сохраняется
Значение сохраняется


Горячее обновление (Online Change)
Значение сохраняется
Значение сохраняется
Значение сохраняется
Значение сохраняется



</tbody>
Переменные RETAIN и PERSISTENT сохраняют свои значения при загрузке программы, горячем обновлении и перезапуске. При холодном перезапуске или сбросе в оригинальное состояние, однако, эти переменные все равно теряют свои значения. Пользователь, тем не менее, может сохранить эти значения в файловой системе или в сети, чтобы восстановить их.
14184

жекон
27.08.2014, 20:43
petera почему все Вам забывают сказать спасибо, Вы молодец что столько времени уделяете начинающим, да и не только многие не знают англицкий язык и я в том числе, перевести я конечно могу даже с технического но это потребует некоторое количества времени гораздо проще открыть темку а там уже всё расписано, а еще проще было описание на OSCAT-овкую библиотеку на русском написать, я думаю что если каждый возьмет по ФБ,как раз и получиться

liga_blunt
27.08.2014, 22:18
Вот ссылка может кому пригодится
http://www.wago.su/oscat

Сема
29.08.2014, 11:09
petera спасибо огромное, что уделили внимание и время, нам, простым смертным...

Boris_K
10.11.2014, 13:21
Другой особенностью T_PLC_MS является режим отладки, который позволяет тестировать переполнение внутреннего таймера ПЛК и проверять надежность работы разработанной программы в этом случае. Внутренний таймер каждого ПЛК переполняется через определенное время, независимо от производителя и типа его реализации. Это означает, что он достигает FF..FFFF (наибольшего значения, которое может храниться в переменной соответствующего типа), и затем начинает счет снова с 000..0000. Согласно стандарту, для таймеров ПЛК период переполнения составляет 2^32 -1 миллисекунд, что соответствует примерно 49,71 дням. Поскольку этот таймер реализован аппаратно, то его начальное значение нельзя установить, и после запуска ПЛК отсчет таймера всегда начинается с 0 и продолжается до достижения максимального значения. По достижении максимального значения возникает переполнение таймера, которое может вызвать фатальные последствия для приложения, однако проверить это крайне сложно.

Что-то они тут намудрили. Во-первых, чаще всего требуется не само значение этого таймера, а разность между текущим его значением и значением, сохранённым во время какого-то события - для измерения интервалов времени (если, конечно, они заведомо меньше этих 49 дней). При этом, когда считаем разность, никакие переполнения не страшны, разность всегда будет верной, даже если новое значение перешагнуло через границу диапазона, потому что в этом случае при вычитании также происходит переполнение, и эффекты этих двух переполнений взаимно гасятся, давая в итоге верное значение. Проверено. Во-вторых, переполнение таймера легко отследить и учесть в какой-либо дополнительной переменной, сколько раз оно уже произошло. Что-то они ищут проблемы там где их нет.

Валенок
11.11.2014, 01:35
Что-то они тут намудрили...Что-то они ищут проблемы там где их нет.
Просто им страшно прибавить к FF..F единицу. Вот и баяцца.

Boris_K
12.11.2014, 14:00
Просто им страшно прибавить к FF..F единицу. Вот и баяцца. ;) Видимо так и есть.

Egerenok
11.03.2015, 12:14
точно подмечено!!!! ОГРОМНОЕ СПАСИБО ЗА ТЕРПЕНИЕ И ПОМОЩЬ!!!!!

Эдуард_Н
16.03.2015, 04:52
Не получаеться выделить из библиотеки OSCATBasic блок "ONTIME", ругается на переменную. Подскажите, что делать?

petera
16.03.2015, 05:11
Не получаеться выделить из библиотеки OSCATBasic блок "ONTIME", ругается на переменную. Подскажите, что делать?
Добавить эту переменную.
Для работы блока ONTIME нужна функция T_PLC_MS из этой же библиотеки. Или исправить одну сточку в коде ФБ

FUNCTION_BLOCK ONTIME
VAR_INPUT
IN : BOOL;
RST : BOOL;
END_VAR
VAR_IN_OUT
SECONDS : UDINT;
CYCLES : UDINT;
END_VAR
VAR
tx: DWORD;
last : DWORD;
edge : BOOL;
init: BOOL;
ms: DWORD;
END_VAR

(* read system time *)
tx := TIME_TO_DWORD(TIME());

(* make sure the first cycle works correctly *)
IF NOT init THEN
init := TRUE;
last := tx;
ms := 0;
END_IF;
IF RST THEN
SECONDS := 0;
CYCLES := 0;
last := tx;
ms := 0;
ELSIF IN THEN
(* add the current milliseconds *)
ms := (tx - last) + ms;
IF ms >= 1000 THEN
seconds := seconds + 1;
ms := ms - 1000;
END_IF;
cycles := cycles + BOOL_TO_UINT(NOT edge);
END_IF;
last := tx;
edge := in;

Эдуард_Н
16.03.2015, 13:10
Спасибо, понял.

Egerenok
28.03.2015, 21:21
Нужна помощь: необходимо отследить время с момента выключения ПЛК160 до его включения. (* Не выключать ПЛК по ряду причин нельзя *).

petera
29.03.2015, 02:08
PROGRAM PLC_PRG
VAR
Init: BOOL;
Diff: TIME; (*Время простоя ПЛК*)
now: DT; (*Текущие дата и время*)
END_VAR
VAR RETAIN
old: DT; (*Дата и время в момент откл ПЛК*)
END_VAR

now:=curDT();
IF NOT Init THEN (*Если первый цикл ПЛК*)
Diff:=now-old; (*Время простоя ПЛК*)
Init:=TRUE;
END_IF
old:=now;


Время простоя ПЛК (Diff: TIME) будет с дискретностью 1 секунда
Функцию curDT()

FUNCTION curDT : DT (* Дата и время в формате POSIX как число секунд с 0 часов 1 января 1970г*)
VAR_INPUT
END_VAR
VAR
CurTimeExInst: CurTimeEx;
CurSystemTimeDate: SystemTimeDate;
CurSysTime64: SysTime64;
year: INT;
second: INT;
day: INT;
hour: INT;
minute: INT;
month: INT;
count: INT;
SET_DATE: DWORD;
END_VAR
CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
year :=CurSystemTimeDate.Year;
month :=CurSystemTimeDate.Month;
day :=CurSystemTimeDate.Day;
hour :=CurSystemTimeDate.Hour;
minute :=CurSystemTimeDate.Minute;
second :=CurSystemTimeDate.Second;
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* chech for leap year and add one day if true *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
curDT := DWORD_TO_DT(SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600);


"слепил" из OSCAT-овских SET_DT() и SET_DATE() http://www.owen.ru/forum/showthread.php?t=10555&p=161139&viewfull=1#post161139
Используется стандартная SysLibTime.
Только часы ПЛК160 в выключенном состоянии сбрасываются через 5 суток и по истечение этого периода, время простоя ПЛК будет не корректным.