Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)
Спасибо. С праздничком! :)
lecsa для начала открыть документацию на ПЛК, а то может на выход надо подавать не 4-20 а 0-1.....
Наверное так?
Аналоговое управление осуществляется по прямо-пропорциональному закону (т.е. 4 мА или 0 В соответствует входному сигналу, равному 0, а 20 мА или 10 В соответствует входному сигналу, равному 1).
Приветствую. Это опять я со своими тупыми вопросами :)
Все тот же ПЛК73м. Не могу понять как реализовать следующее, вернее реализовано все кроме 3го абзаца.
Кратко: Уставка (sp1) температуры в ПИД. Изменение уставки с панели (Sub_menu - Float - sp1 - тип "конфигурационный") По умолчанию "0". При вводе кнопками уставки, ПЛК запоминает ее значение при выключении питания. Тут все нормально. И как я понимаю, в этом случае sp1 является глобальной,так как обьявлена в sub_menu, правильно?
Далее, для познания не опознанного, сделал визуализацию, для более комфортного настраивания ПИД. Визуализация записывает переменные в плк в он-лайн режиме, допустим ту же уставку sp1, все отлично, но плк не запоминает ее при выключении.
Проба обьявить sp1 VAR_GLOBAL_RETAIN_PERSISTENT увенчалась конфликтом с глобальной sp1 .
Как правильно сделать. Я еще не силен чтоб самому додуматься. Если можно строчку кода или ссылку на пример или просто немного разжевать.
Наверное правильно будет спросить так " Как записать значение переменной в меню конфигурации самого плк через тег визуализации но чтобы осталась возможность, задавать значение переменной через ручной ввод на панели плк, меню конфигурации"
Файлик с проектом прилагаю.
Все вопрос снимается. В конфигурацию через кодесис записать значение переменной НЕЛЬЗЯ.
Конфигурационные пользовательские параметры – значение этих парамет-ров считывается из EEPROM при запуске контроллера. Конфигурационные пользова-тельские параметры доступны для редактирования с передней панели и для чте-ния / записи по сети (при условии установленных атрибутов).
Введенные в ПО CoDeSys (в окне режима «Конфигурация ПЛК (PLC Configuration)») новые значения этих параметров не сохраняются в EEPROM и не до-ступны по сети RS.
Введенные с передней панели ПЛК или по сети значения конфигурационных па-раметров сохраняются в EEPROM, и при выключении питания будут сохранены.
Все вопрос снимается. В конфигурацию через кодесис записать значение переменной НЕЛЬЗЯ.
Конфигурационные пользовательские параметры – значение этих парамет-ров считывается из EEPROM при запуске контроллера. Конфигурационные пользова-тельские параметры доступны для редактирования с передней панели и для чте-ния / записи по сети (при условии установленных атрибутов).
Введенные в ПО CoDeSys (в окне режима «Конфигурация ПЛК (PLC Configuration)») новые значения этих параметров не сохраняются в EEPROM и не до-ступны по сети RS.
Введенные с передней панели ПЛК или по сети значения конфигурационных па-раметров сохраняются в EEPROM, и при выключении питания будут сохранены.
здесь речь идет, НЕ о введенных в окне визуализации, а о тех случаях, когда вводятся значения вручную прямо в дерево ресурса конфигурация.
А так, в программе запросто, только использовать нужно функцию "SAVE_PARAMETER" из библиотеки ARM7_specific.lib
ЗЫ
Пример есть на диске ПЛК
Применение данной функции показано на примере ее вызова в составе
программы, которая при отпускании нажатых кнопок Альт+стрелка вверх записывает
значение параметра «Уставка 1», увеличенное на 1.
29798
PROGRAM PLC_PRG
VAR
tm:TON;
fm:F_TRIG;
starting:BOOL:=FALSE;
param_ptr:POINTER TO parameter_descriptor;
param_adr: POINTER TO REAL;
param_adr2: POINTER TO ARRAY[0..15] OF BYTE;
temp: REAL;
temp2: ARRAY [0..15] OF BYTE;
END_VAR
VAR CONSTANT
key:BYTE:=136;
END_VAR
IF NOT starting THEN (*То что делается при начальной загрузке контроллера*)
SetWorkScreenCount(1); (*Установим количество экранов = 1 *)
ClearScreen(0); (*Очистим экран*)
starting:=TRUE; (*Установим аттрибут, чтобы больше не входить в этот цикл*)
END_IF
fm(clk:=kbrd=key); (*Если пользователь нажал Альт+стрелка вверх*)
IF fm.Q THEN (*и отпустил, то будет выполнен этот цикл*)
param_ptr:=READ_BY_HASH(16#37B7,0); (*чтение дескриптора параметра*)
temp:=sp1+1.0; (*в переменную temp занесём значение уставки + 1*)
param_adr:=ADR(temp); (*в param_adr -- адрес temp*)
param_adr2:=param_adr; (*Сделаем так, чтобы переменные param_adr и param_adr2 ссылались на одно и то же место в памяти*)
temp2:=param_adr2^; (*в temp2 занесём результат, считанный по адресу param_adr2, то есть фактически в temp2 попадает значение из temp с учётом преобразования типов*)
param_ptr^.value:=temp2; (*значение переменной в param_ptr занесём temp2*)
SAVE_PARAMETER(param_ptr); (*запись параметра в память контроллера*)
END_IF
tm(in:=NOT tm.Q, pt:=t#200ms); (*цикл индикации -- 200 мс*)
IF tm.Q THEN (*цикл будет запущен каждые 200 мс*)
ShowReal(0,0,0,'%2.1f',sp1); (*отображаем значение уставки*)
END_IF
О, petera благодарю! Попробую вникнуть!
О, petera благодарю! Попробую вникнуть!
Смысл в том, что в окне визуализации нужно будет вводить значения не в конфигурационную переменную, а в промежуточную. Затем промежуточную переменную с помощью функции "SAVE_PARAMETER" записывать в конфигурационную переменную.
Добрый вечер. Есть проблема. Нужно поднять ТРМ в кодесис на СFC. C cамим ТРМ проблем не возникло, но с гистерезисом никак не справлюсь. Подскажите как лучше это сделать.
Andrew_Stranger
01.03.2017, 21:02
Примеры смотрели на сайте?
Если можно дайте ссылку. В примерах я ничего не нашел. Возможно не там смотрел.
Василий Кашуба
01.03.2017, 21:58
Если можно дайте ссылку. В примерах я ничего не нашел. Возможно не там смотрел.
На СФС можно сделать так.
29803
Правильно ли я понимаю, что все переменные обмена по ModBus по умолчанию являются RETAIN и не теряются при выключении питания?
29828
Интересует то, что "подключено" к ModBus (slave).
Добрый день. Проблема следующая. Читаю из панели оператора СП307 значение в формате INT.
Не понятно как мне его получить в глобальной переменной ПЛК?
Там есть только WORD и REAL.
Получите его в WORD, а затем через WORD_TO_INT получите INT, если он вам реально нужен.
Получается, что INT из панели получаю в WORD в ПЛК и далее опять перевожу в INT?
Протокол модбас не знает ничего про типы данных, которые через него передают. Если два устройства обмениваются данныме по протоколу Модбас, то задача того, кто этот обмен программирует, обеспечить соответствие типов. То есть, если вы знаете, что панель вим передает INT, имеющий размерность WORD, то получив этот самый WORD, вы его будете интерпретировать как INT путем преобразования WORD_TO_INT. С величинами типа FLOAT нужно еще смотреть за порядком следования байт, который на разных сторонах может отличаться.
Да, спасибо Вам, все понял
Всем добрый день. Подскажите, если не сложно. Как созданный на CFC макрос засунуть в библиотеку?
Василий Кашуба
05.03.2017, 10:51
Всем добрый день. Подскажите, если не сложно. Как созданный на CFC макрос засунуть в библиотеку?
Когда сделали свой ФБ, сохраните (экспортируйте) его как библиотеку. С помощью меню Сохранить как.
Подскажите пожалуйста есть ли ФБ для CFC наподобие элемента ИЛИ для переменных типа WORD?
Если быть точнее наподобие элемента MOVE только с несколькими входами.
Василий Кашуба
05.03.2017, 17:54
Если быть точнее наподобие элемента MOVE только с несколькими входами.
Добавляйте новый вход к нужному элементу, наведя курсор на вход и нажав на ПКМ.
Приветствую.
Пытаюсь прикрутить ОПС к плк 73м. Смотрел по видеоурокам, там нужно "создание загрузочного проекта" - у меня эти пункты неактивны. Как быть (или он создается автоматом?) так же неактивно в "настройки целевой программы - общие - загружать символьный файл"
Как я понимаю то из этого файла опсос читает адреса переменных. ШО делать О_0?
Еще вопрос. Не можете прояснить это подключение к ОПС этого плк (rs1) Я раньше прикручивал разные ОПСы к семёну s5 через мастерОПС, кепсервер и т.д, балвался разными скадами. Но тут что то в затуп попал. Руководства читал.
Если можно шаги настройки через дефис.
Прошло время...
По RS1 вроде мастерОПС соединился с ПЛК (мой косяк, перепутал А В на преобразователе 485).
Теперь как определить адреса переменных (глобальных и локальных) для записи в ОПС? должна быть какая то таблица типа (%I0.0 - адрес 0 и тд)?
Тут нашел ответ по "созданию загрузочного проекта"
загрузочный проект создается автоматически т.к. в плк63 программа исполняется из флеш а не из озу. соответсвенно проект автоматически заливается во флешь и автоматически становится загрузочным.
Так кто нибудь подскажет как определить адреса переменных (глобальных и локальных) для записи в ОПС, сторонних опс?
Почитал этот топик http://www.owen.ru/forum/showthread.php?t=21035 и ужаснулся , как криво все сделано, почему у старинного S5 семена такого нет?
Всем добрый день. Пытаюсь писать файл на usb-flash контроллер ПЛК 110-60 М02. При использовании библиотеки SysLibFile минимальный цикл записи получаю 5 с, но со всеми вытекающими минусами данной библиотеки. А при использовании библиотеки OwenLibFileAsync минимальный цикл записи 30 сек. Запись инициирую вызовом функционального блока из основной программы. Никаких таймеров не использую. Собственно вопрос, кто-то замечал такие тайминги?
Павел В.
22.03.2017, 11:36
Такой вопрос по CDS 2.3 - в редакторе CFC к выходу логического элемента AND подключено несколько переменных VAR типа BOOL, но при активации выхода этого элемента, из всех подключенных переменных становится "TRUE" только одна, хотя линии связи меняют свой цвет с чёрного на синий ко всем переменным.
Такой вопрос по CDS 2.3 - в редакторе CFC к выходу логического элемента AND подключено несколько переменных VAR типа BOOL, но при активации выхода этого элемента, из всех подключенных переменных становится "TRUE" только одна, хотя линии связи меняют свой цвет с чёрного на синий ко всем переменным.
30177
А если быть более внимательным, то окажется, что где-то ниже этим переменным присваеваются совсем другие значения.
30178
А отображаются всегда значения, которые встречаются самыми последними в схеме
ЗЫ.
Множественная запись (в разных местах программы) в переменные ни к чему хорошему не приводит. Никогда так не делайте, а то концов найти не сможете.
День добрый! Столкнулся с ситуацией которую никак не могу понять.
Простой детектор фронта и спада. (Я привык так на си писать)
MinD1O Выход релюшка или любая другая переменная. Релюшка щелкает-переключается.
Код...
Это условие выполняется нормально при фронте MinD1O.
IF (MinD1O=TRUE AND OldMinD1O=FALSE) THEN
i:=1;
END_IF;
Это условие не выполняется никогда как бы ни записывал. Со скобками в любом сочетании и без скобок.
IF (OldMinD1O=TRUE AND MinD1O=FALSE) THEN
i:=0;
END_IF;
OldMinD1O:=MinD1O;
Куда порыть можно??? Более в тексте подпрограммы ничего нет. Всю голову сломал.
К MinD1O больше нигде нет обращения. OldMinD1O локальная переменная. Она изменяется.
Как правильно писать сложные условия в CodeSys? В доках ничего кроме простейшего примера не нашел.
можно и так написать
IF MinD1O AND NOT OldMinD1O THEN
i:=1;
ELSIF NOT MinD1O AND OldMinD1O THEN
i:=0;
END_IF;
OldMinD1O:=MinD1O;
Сам спростил, сам ответил. Решение нашел, не нашел ответа.
Строку OldMinD1O:=MinD1O; не выполнялась совсем. OldMinD1O всегда в false. Почему такое?
Переставил строку OldMinD1O:=MinD1O; в начало программы, заработало. OldMinD1O при присвоении MinD1O=true, тоже стала становиться true.
Затем переставил строку OldMinD1O:=MinD1O; промеж двух IFов. Тоже заработало. Затем вернул строку OldMinD1O:=MinD1O; на место где она не работала. И о чудо!!! Все стало работать!!
Это что? глюки компилятора CodeSys? И часто это бывает с ним такое? Когда абсолютно правильно написанный код просто не работает? А мне предстоит написать еще тысячи строк кода! И если это повторится как тогда вообще отлаживать сложные программы, когда простейшее условие и не работает по совершенно непонятной причине? Я в честно говоря шокирован.
можно и так написать
IF MinD1O AND NOT OldMinD1O THEN
i:=1;
ELSIF NOT MinD1O AND OldMinD1O THEN
i:=0;
END_IF;
OldMinD1O:=MinD1O;
Сначала так и писал. Ближе к си. Затем уже явно все прописал пока искал глюк.
Хочешь ответа - приводи весь проект. Тута экстрасенсов нэма. Может старт не сделал, может еще где наиндусил
Сам так решил ?
Это весь проект и есть. Абсолютно чистый контроллер ресетнутый на заводские установки. Я же писал, что переменная MinD1O меняется, релюшка щелкает. Контроллер работает, программа крутится. Не экстрасенсы весь текст не читают?:)
А что неправильного в тех строчках, что я привел?
Сначала так и писал. Ближе к си. Затем уже явно все прописал пока искал глюк.
Вы считаете это единственный вариант? Например через RS-триггер, можно было бы вобще не писать эту конструкцию
Глюк в 99.9999% - в голове.
Онлайн ?Если ответить по существу нечего, промолчи и пройди мимо, за умного сойдешь.
Вы считаете это единственный вариант? Например через RS-триггер, можно было бы вобще не писать эту конструкциюНет конечно, не единственный. До этого дошел пытаясь понять почему не работает. Есть и детектор фронта. Я в основном пишу на си и мне быстрее намного написать так, чем использовать библиотечные функции. Даже число в степень возвести лучше ручками, чем использовать EXPT(x,y). Ручками даже вещественные возводятся в 2 раза быстрее чем эта функция.
)) Если задача в получении i - даже тригеры не нужны. Вообще ничего не нужно.
Пусть свое исходное прогонит в эмуляции и не компостирует мозг какими-то глюками
ну зачем Вы так, ему же придется тогда чем то другим заполнять тысячу строк кода
Я в основном пишу на си и мне быстрее намного написать так, чем использовать библиотечные функции. Даже число в степень возвести лучше ручками, чем использовать EXPT(x,y). Ручками даже вещественные возводятся в 2 раза быстрее чем эта функция.
я читал как вы пишите на Си, мое мнение не там вы ищите проблемы, это больше похоже на плохого танцора
Мдя. Думал тут люди серьезные, а оказалось пара троллей ничего не могущих ответить и порекомендовать, но зато разбирающихся в балете. Адью.
Мдя. Думал тут люди серьезные, а оказалось пара троллей ничего не могущих ответить и порекомендовать, но зато разбирающихся в балете. Адью.
Чего изволите Вам порекомендовать, снять на видео как я наделаю кучу глупостей и восстановлю картину, что обычный код не будет работать, в этом случае уменя всё равно не получится обвинить в этом КДС
Павел В.
22.03.2017, 15:18
Вопрос - где почитать описание библиотеки UNM.lib? И вообще есть ли где описание овеновских библиотек? Не программировал ОВЕН уже лет 5 поэтому надо всё вспоминать практически с 0.
Вопрос - где почитать описание библиотеки UNM.lib? И вообще есть ли где описание овеновских библиотек? Не программировал ОВЕН уже лет 5 поэтому надо всё вспоминать практически с 0.
http://www.owen.ru/uploads/txtlic.php?url=http:/kipshop.ru/CoDeSys/bibl/Lib_OWEN_PLC1xx_v8.12.zip
Explorerrr
24.03.2017, 18:06
доброго времени суток. Такая проблема. Опрашиваю ТРМ-133 прибором ПЛК-150 по протоколу овен, все запросы на ок за исключением уставки (sp.lu).
Не пойму в чём она приходит? Вижу число - 4367 (или около того), уставка при этом 25. Вроде бы WORD, командой WORD_TO_REAL не вычисляется - помогите разобраться пожалуйста. Как её привести в человеческий вид? Желательно на CFC. Спасибо.
Павел В.
28.03.2017, 16:47
Вопрос по связи ПЛК160 с CoDeSys через Ethernet - пока порт Ethernet использовался для программирования ПЛК со связью было нормально, как только добавил в конфигурацию ПЛК160 Modbus TCP с чтением нескольких переменных из стороннего ПЛК через этот же Ethernet (Modbus TCP) начали постоянные ошибки связи (номер вроде всегда #0) между ПК и ПЛК160. Т.е. теперь через 20-30 с стабильно ПЛК160 отваливается от CoDeSys.
Добрый день! С некоторых пор при сохранении или когда просто закрываеш проект, выскакивает сообщение. На работу вроде не влияет, но как его убрать?30300
Спасибо тебе Валенок, всегда выручаеш!
Ден123456
03.04.2017, 13:58
Здравствуйте. Можно подключится к контроллеру Wago 750-881 программой Codesys без проекта? Бывает плк зависает, бывает нужно проверить дискретные выхода. Или без проекта это не возможно. Плк установила организация но ПО не дала частые простои оборудования.
krollcbas
03.04.2017, 14:23
Ден123456, можно. Прога есть io pro. Можно проверить входа/выхода. Если подцепитесь codesys, то сотрете рабочий проект.
Если вам попалась такая организация, переписывайте код. Плк ваш и код должен быть ваш, иначе вы становитесь кормовой базой таких интеграторов
Ден123456
03.04.2017, 14:51
krollcbas, спасибо. Еще вопрос io pro caa чем отличается от io pro?
У меня 750 - 881 при нажатии login у списку контроллеров нету максимум 842. Нужно искать таргет файл?
krollcbas
03.04.2017, 16:26
Понятно. Вы используете что-то левое. Свяжитесь со мной, помогу с этим бесплатно.
Относительно вашего вопроса:
CAA это комплект болванка codesys + сервисный кабель
Проще купить кабель и запросить софт
Болванка стоит порядка 30 тыс р
Всем привет.
Подскажите пожалуйста, где почитать или как правильно работать и создавать объекты в дереве POU?
Всем привет.
Подскажите пожалуйста, где почитать или как правильно работать и создавать объекты в дереве POU?
Кроме правой кнопки мыши ничего больше не требуется
Всем добрый день. Проблема такая. Нарисовал схему включения и отключения выхода одной кнопкой.
30473
Включение происходит, а выключение нет.
Проверка работы схемы в эмуляторе
Бинкевич Игорь
09.04.2017, 17:20
R_TRIG должны иметь разные объявления (имена), у Вас один блок.
С разными тоже не работает
а кнопку старт еще раз отпустить и нажать ? R_Trig только передний фронт ловит.
Всем добрый день. Проблема такая. Нарисовал схему включения и отключения выхода одной кнопкой.
30473
Включение происходит, а выключение нет.
Месье понимает толк в сложности.
30474
Пять лет назад http://www.owen.ru/forum/showthread.php?t=13655&p=94449&viewfull=1#post94449
30478
Добрый день!
как реализовать алгоритм сброса в FALSE значимых переменных при старте программы?
ПЛК 150 И.М
Добрый день!
как реализовать алгоритм сброса в FALSE значимых переменных при старте программы?
ПЛК 150 И.М
Если эти "значимые" переменные не находятся в слейве ПЛК(они будут retain и сохраняют значения при выключении ПЛК), то ничего делать не надо.
При старте программы ВСЕ переменные инициализируются начальными значениями, =0 для чисел или FALSE для BOOL. Если конечно Вы принудительно не задали начальные значения отличные от нулевых при объявлении переменных.
30490
Конфигурация оборудования - ПЛК150 (master) - СП310 (slave) - ПЧВ (slave)
Система построена для насосной станции опресовки. Суть в том что когда с панели нажимаем кнопку старт (используется регистр PSW) происходит старт системы.
Если не перевести систему в режим стоп и выключить/включить питание происходит авто запуск (это не нужно)
Как реализовать функционал сброса переменной "СТАРТ" при выключении/включении питания.
Пробовал использовать функциональную область - все равно происходит кратковременный старт системы
Рекомендую при нажатии включать бит старт при отпускании сбрасывать бит старт и все будет хорошо.
Рекомендую при нажатии включать бит старт при отпускании сбрасывать бит старт и все будет хорошо.
??? Поподробнее можно?
Когда нажали кнопку в панели, контроллер ее увидел и зафиксировал старт у себя.
Когда отпустили панель сбросила старт.
Теперь если выключить контроллер , а потом включить - старта с панели не будет, потому что его нет, а автоматический режим в контроллере не сформируется пока не будет дан старт.
Когда нажали кнопку в панели, контроллер ее увидел и зафиксировал старт у себя.
Когда отпустили панель сбросила старт.
Теперь если выключить контроллер , а потом включить - старта с панели не будет, потому что его нет, а автоматический режим в контроллере не сформируется пока не будет дан старт.
Так и реализовано! на панели 2 кнопки "СТАРТ" и "СТОП" (функция "включена пока нажата")
В ПЛК переменная типа BOOL "start_system" c функцией SET/RESET
Сответственно:
При кратковременном нажатии на кнопку "СТАРТ" на панели переменная "start_system" фиксируется в TRUE
При кратковременном нажатии на кнопку "СТОП" на панели переменная "start_system" фиксируется в FALSE
когда переменная "start_system" находится в TRUE если отключить/включить питание плк и панели, переменная "start_system" по прежнему будет находится в положении TRUE
Как сделать чтоб при востанавлении питания плк и панели, данная переменная сразу же находилась в FALSE
Ваша ошибка в том что вы используете одну переменную, а нужно для старта одна, для останова другая.
У контроллера переменные "не retain" сбрасываются при включении питания, посмотрите тип вашей переменной.
Ваша ошибка в том что вы используете одну переменную, а нужно для старта одна, для останова другая.
У контроллера переменные "не retain" сбрасываются при включении питания, посмотрите тип вашей переменной.
В переменной "start_system" отсутствует галочка "RETAIN"
30495
ПАНЕЛЬ
30496
30497
В панеле правильно.
В контроллере "Нач.значение" укажите значение "0" и если не поможет сделайте принудительное обнуление при первом скане программы.
Еще посмотрите раздел в этом-же форуме "Инициализация переменных при запуске ПЛК 150"
В панеле правильно.
В контроллере "Нач.значение" укажите значение "0" и если не поможет сделайте принудительное обнуление при первом скане программы.
Еще посмотрите раздел в этом-же форуме "Инициализация переменных при запуске ПЛК 150"
Спасибо! Будем пробовать!
Василий Кашуба
10.04.2017, 17:35
Добрый день!
как реализовать алгоритм сброса в FALSE значимых переменных при старте программы?
ПЛК 150 И.М
Попробуйте сделать так.
30498
в CDS нет явных обратных связей, может заработать, а может не заработать...
Василий Кашуба
10.04.2017, 17:41
в CDS нет явных обратных связей, может заработать, а может не заработать...
Эта точно заработает.:)
Проблема решилась только при использования модуля "Statistic" в конфигурации ПЛК. Всем спасибо за помощь!
Вопрос по связи ПЛК160 с CoDeSys через Ethernet - пока порт Ethernet использовался для программирования ПЛК со связью было нормально, как только добавил в конфигурацию ПЛК160 Modbus TCP с чтением нескольких переменных из стороннего ПЛК через этот же Ethernet (Modbus TCP) начали постоянные ошибки связи (номер вроде всегда #0) между ПК и ПЛК160. Т.е. теперь через 20-30 с стабильно ПЛК160 отваливается от CoDeSys.
как то странно, вроде для программирования по умолчанию 1200, а для modbus 502
Добрый день, работаю в CoDeSys на языке LD (мне так проще - я привык к релейным обозначениям), работаю в CoDeSys очень редко - по мере необходимости, иначе давно бы уже этот вопрос для себя решил. И вопрос следующий - Возможно ли на LD работать с аналоговыми величинами, выставлять уставки срабатывания и заводить их на катушку реле? Например для ПЛК100+МВ110-8А или ПЛК150? Подскажите пожалуйста, что почитать? Или примеры где посмотреть простенькой программы?
За ранее, спс
krollcbas
15.04.2017, 10:40
Да можно конечно и на LD, блоки поддерживает, например компаратор (сравнение)
LE,GE и т.п
Да можно конечно и на LD, блоки поддерживает, например компаратор (сравнение)
LE,GE и т.п
Я так и думал, что можно. Но пример дал бы лучшее понимание))))
Я так и думал, что можно. Но пример дал бы лучшее понимание))))
Если сможете что-либо рассмотреть, то вот пример
https://www.youtube.com/watch?v=XOI72PK-gGY
Если сможете что-либо рассмотреть, то вот пример
Всем добрый день. Подскажите возможно ли организовать счет от 0 до 100 в одну сторону и от 0 до -100 в другую сторону на счетчике CTUD?
Всем привет. Помогите разобраться в ST, залип на преобразовании переменных из bool_to_word. Заранее спасибо
30746
Всем привет. Помогите разобраться в ST, залип на преобразовании переменных из bool_to_word. Заранее спасибо
30746
http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf стр.312 пример на ST
Разобрался. Вопрос закрыт
Всем привет. Помогите разобраться в ST, залип на преобразовании переменных из bool_to_word. Заранее спасибо
30746
Кто так пишет?
Тогда уже надо так
IF BOOL_TO_WORD(Alarm_M1) = 1 THEN
Хотя на нафига здесь BOOL_TO_WORD?
Вообще-то нужно так
IF Alarm_M1 THEN
out_Alarm_M1:=1;
END_IF
А если еще окажется, что out_Alarm_M1 имеет тип BOOL, то нафига здесь вообще IF...THEN ?
out_Alarm_M1:=Alarm_M1;
C IF...THEN только если нужно "защелкнуть" состояние Alarm_M1=TRUE
Я думаю, что это касается и 55 строки
Разве для защелкивания обязательно нужен IF ? )
Нет, конечно
out_Alarm_M1:=Alarm_M1 OR out_Alarm_M1;
Но в контексте исходного кода только "защелкивание" - единственное оправдание использования IF
alextopaz
22.04.2017, 17:17
Добрый день. Прошу помощи знатоков. Стоит задача модернизация 10 объектов (ЦТП) в плане телеметрии. Для ознакомления с программированием приобрел ПЛК-150. Задача с точки зрения программирования простая, опросить все датчики, счетчики и передать результат на верхний уровень. С нижнем уровнем проблем нет, создал простенький проект в Simpl Scada по Ethernet и RS-232 Debug с штатный кабелем который идет в комплекте через OPC сервер Codesys все работает. Проблема собственно в чем, связь с объектами будет производится по радио каналу и скорость обмена по RS-232 Debug необходима 9600 бит/сек. В конфигурации ПЛК создаю Modbas slave произвожу его настройку согласно инструкции соответствующие настройки вношу в настройки COM порта ПК прописываю переменную запускаю скаду она обращается к виртуальному COM порту (загорается светодиод преобразователя), а на ПЛК светодиод связь не загорается. Пробовал и кабелем КС1 и делал такой же только без перемычки и в ответ тишина. Что делаю не так?? Какой кабель нужен или может порт RS-232 Debug может использоваться только для программирования и отладки в Codesys?? В качестве скады планируется TRACE Mode т.к. она используется в данный момент и обращаться к ПЛК нужно будет не через ОРС а напрямую к регистрам.
Уважаемые форумчане, помогите пожалуйста написать программу на языке LD.
На вход подается один аналоговый сигнал, далее преобразуется(любым путем), и на выходе получается другой аналоговый сигнал.
krollcbas
23.04.2017, 22:33
Дипломная работа? Слишком мало вводных
Дипломная работа? Слишком мало вводных
Курсовая... А с одним нельзя сделать никак ? =( Хотя бы чего-нибудь...:( Пожаалуйста
Добрый день господа , подскажите пожалуйста как работать с библиотекой Work_mode.lib
Нужно значение анал. сигнала показать на экране
попробывал так ShowReal(1, 1, 1, '%2.1f', Value)
но все равно на экране нету цифры. помогите!
скорость обмена по RS-232 Debug необходима 9600 бит/сек.
Если не ошибаюсь, порт Debug работает только на скорости 115200
Курсовая... А с одним нельзя сделать никак ? =( Хотя бы чего-нибудь...:( Пожаалуйста
Тебе намекнули, что задачу надо бы подробнее описывать :)
PavelG2010
04.05.2017, 07:55
Добрый день!
Не могу настроить «Конфигуратор виртуальных портов на (Windows 7 профессиональная) Программа устанавливается без ошибок, находит ЕКОН134 но тут же вылетает. Ест видео — вот ссылка (https://drive.google.com/open?id=0B9bvDr9X9PSORDVJYktUZTdmT3M)
Минеев Антон
12.05.2017, 15:15
Народ, добрый день... Никак не пойму: Как считать системное время с контроллера ПЛК110(М02)-60. Задача: нужно каждые 10 минут выводить количество деталей с указанием времени этого события.
Народ, добрый день... Никак не пойму: Как считать системное время с контроллера ПЛК110(М02)-60. Задача: нужно каждые 10 минут выводить количество деталей с указанием времени этого события.
С помощью библиотеки SysLibTime.lib
Например
FUNCTION_BLOCK REAL_TIME
VAR_INPUT
END_VAR
VAR_OUTPUT
current_time: TOD; (*Текущее время*)
current_date:DATE; (*Текущая дата*)
current_day: INT; (*Номер дня в году*)
END_VAR
VAR
CurTimeExInst: CurTimeEx;
CurSystemTimeDate: SystemTimeDate;
CurSysTime64: SysTime64;
year: INT;
second: INT;
day: INT;
hour: INT;
minute: INT;
month: INT;
count: INT;
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate;
END_VAR
(*Получить текущее время и дату*)
CurSystemTimeDate:=nulldt;
CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
year :=CurSystemTimeDate.Year;
month :=CurSystemTimeDate.Month;
day :=CurSystemTimeDate.Day;
hour :=CurSystemTimeDate.Hour;
minute :=CurSystemTimeDate.Minute;
second :=CurSystemTimeDate.Second;
IF year =0 THEN
year :=1970;
month :=1;
day :=1;
END_IF
(*собираем часы, минуты и секунды в одну кучу - в миллисекунды*)
current_time:=DWORD_TO_TOD((INT_TO_DWORD(Hour) * 3600
+ INT_TO_DWORD(Minute * 60)
+ INT_TO_DWORD(Second))*1000);
(*Вычислить дату с учетом високосных лет*)
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;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
current_date:=DWORD_TO_DATE((INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400);
current_day:= DAY_OF_YEAR(current_date);
31117
Для вычисления номера дня в году здесь нужна такая функция
FUNCTION DAY_OF_YEAR : INT
VAR_INPUT
IDATE : DATE;
END_VAR
DAY_OF_YEAR := UDINT_TO_INT((DATE_TO_UDINT(idate) / UDINT#86400) MOD UDINT#1461);
IF DAY_OF_YEAR > 729 THEN
IF DAY_OF_YEAR > 1095 THEN DAY_OF_YEAR := DAY_OF_YEAR - 1095; ELSE DAY_OF_YEAR := DAY_OF_YEAR - 729; END_IF;
ELSIF DAY_OF_YEAR > 364 THEN
DAY_OF_YEAR := DAY_OF_YEAR - 364;
ELSE
DAY_OF_YEAR := DAY_OF_YEAR + 1;
END_IF;
Rednaxel
16.05.2017, 18:12
Впал в ступор от простейшей задачи управления светом. После полдня мучений создал вот такую конструкцию:
31176
Она работает только благодаря "костылю" в виде посторонней переменной, которая синхронизируется со светом в другом месте программы.
Дело в том, что этот переключатель нужно оформить в виде ФБ чтобы использовать многократно и эта переменная там ни к чему.
Подскажите пожалуйста: как на CFC сделать без костыля?
Видимо на языке типа ST это проще и правильнее, но я его пока не освоил.
Василий Кашуба
16.05.2017, 18:57
Впал в ступор от простейшей задачи управления светом. После полдня мучений создал вот такую конструкцию:
31176
Она работает только благодаря "костылю" в виде посторонней переменной, которая синхронизируется со светом в другом месте программы.
Дело в том, что этот переключатель нужно оформить в виде ФБ чтобы использовать многократно и эта переменная там ни к чему.
Подскажите пожалуйста: как на CFC сделать без костыля?
Видимо на языке типа ST это проще и правильнее, но я его пока не освоил.
Для меня проще на CFC, сделайте так.
31178
Rednaxel
18.05.2017, 15:24
Спасибо за ответ!
Но честно говоря просветления не наступило :(
При чем здесь ИЛИ - не понимаю?
Мне представляется, что для моей задачи нужна бы конструкция типа If ... Then ... Else.
Если свет горит - переменную Light установить в TRUE, если нет - сбросить в FALSHE.
Моя беда в том, что я не понимаю какой блок на CFC применить для этого?
Или все не так совсем: растолкуйте пожалуйста.
Upd:
Голова сообразила наконец, что если добавить задержку во вторую часть блока, чтобы прошел цикл, блок начинает работать.
31220
Только это тоже костыль. Поэтому вопрос остается открытым: "какая конструкция на CFC соответствует логике If ... Then ... Else?
Добрый день господа, подскажите пожалуйста как увеличить частоту опроса аналогового входа на ПЛК 73 ????
сигнал меняется очень быстро а результат я вижу спустя 2 секунды. Буду признателен
Василий Кашуба
18.05.2017, 20:27
Спасибо за ответ!
Но честно говоря просветления не наступило :(
При чем здесь ИЛИ - не понимаю?
Мне представляется, что для моей задачи нужна бы конструкция типа If ... Then ... Else.
Если свет горит - переменную Light установить в TRUE, если нет - сбросить в FALSHE.
Моя беда в том, что я не понимаю какой блок на CFC применить для этого?
Или все не так совсем: растолкуйте пожалуйста.
Upd:
Голова сообразила наконец, что если добавить задержку во вторую часть блока, чтобы прошел цикл, блок начинает работать.
31220
Только это тоже костыль. Поэтому вопрос остается открытым: "какая конструкция на CFC соответствует логике If ... Then ... Else?
Вот вам без всяких костылей.
31223312243122531226и это не ИЛИ, а ИСКЛЮЧАЮЩЕЕ ИЛИ.
Берем паспорт и смотрим характеристики, время опроса аналоговых входов. И получаем что у вас вполне нормальный результат если вы все входы задействовали. Ускорить можно только путем уменьшения опрашиваемых входов.
"какая конструкция на CFC соответствует логике If ... Then ... Else?
Теперь я попробую объяснить. Логическая операция исключающее ИЛИ (XOR)
31239
Применение в такой виде будет означать:
если А=1 и В=1, то В=0
если А=1 и В=0, то В=1
если А=0, то В не меняется
Вопрос:
Подскажите пожалуйста, есть ли в КДС какой-либо ФБ, который выполняет функции измерителя скорости. Т. е. задача состоит в том, что на одном из входов нужно считать импульсы за определенный интервал времени. Контрольный интервал - 1 минута, частота импульсов - до 300 имп\мин. Да, я могу написать это с помощью стандартных ФБ, но не хотелось бы изобретать велосипед.
Вопрос:
Подскажите пожалуйста, есть ли в КДС какой-либо ФБ, который выполняет функции измерителя скорости. Т. е. задача состоит в том, что на одном из входов нужно считать импульсы за определенный интервал времени. Контрольный интервал - 1 минута, частота импульсов - до 300 имп\мин. Да, я могу написать это с помощью стандартных ФБ, но не хотелось бы изобретать велосипед.
на оскат есть аллергия?
Добрый день всем!
Поставил Codesys с сайта ОВЕН, но в нем не запускается ни один пример с того же сайта. Точнее, примеры загружаются и открываются, но программа пустая. Таргеты все поставил, библиотеки тоже, русский язык настроил. В чем может быть причина?
Спасибо!
Codesys с сайта ОВЕН какая версия 2.3?
Попробовать перезагрузить ПК, если нет переустановить кдс, ОС какая?
Win 7 x64. Странно, ни одной ошибки не выдавал, перезагрузить пробовал, не помогло.
Попробовать создать новый проект, при выборе плк обратть внимание таргеты плк установились?
Доброе утро!
Сегодня проверил. Встроенные в кодесис проекты открываются без проблем. Созданные проекты также сохраняются и открываются.
Такое ощущение, что галочка где-то не проставлена.
А может они не пустые, а там ; стоит? Можно их вручную с Рабочего стола поместить в папку Проекты CoDeSys, туда где находятся рабочие проекты, тогда наверняка откроются..
Берем паспорт и смотрим характеристики, время опроса аналоговых входов. И получаем что у вас вполне нормальный результат если вы все входы задействовали. Ускорить можно только путем уменьшения опрашиваемых входов.
а где есть описание отключения входов. И еще была версия что можно с помощью МВ110 модуль ввода аналоговых сигналов ускорить!
Подскажите если есть информация по этим вариантам!
Заранее спасибо!
harlylorn
22.05.2017, 21:59
Есть генератор случайных чисел. Подскажите пожалуйста, можно ли сделать так чтобы число генерировалось 1 раз при запуске программы и больше не генерировалось.
FUNCTION_BLOCK RNG (* Генератор случайных чисел *)
VAR_INPUT
LOAD: BOOL;
X0: USINT := 1;
END_VAR
VAR_OUTPUT
X: USINT := 1; (* Случайное число *)
END_VAR
VAR
RESET: R_TRIG; (* Экземпляр ФБ R_TRIG *)
END_VAR
===================================
RESET(CLK := LOAD);
IF RESET.Q THEN X := X0; END_IF
X := X *10 - 11 * (X * 10/11);
harlylorn
22.05.2017, 22:02
Есть генератор случайных чисел. Подскажите пожалуйста, можно ли сделать так чтобы число генерировалось 1 раз при запуске программы и больше не генерировалось.
FUNCTION_BLOCK RNG (* Генератор случайных чисел *)
VAR_INPUT
LOAD: BOOL;
X0: USINT := 1;
END_VAR
VAR_OUTPUT
X: USINT := 1; (* Случайное число *)
END_VAR
VAR
RESET: R_TRIG; (* Экземпляр ФБ R_TRIG *)
END_VAR
===================================
RESET(CLK := LOAD);
IF RESET.Q THEN X := X0; END_IF
X := X *10 - 11 * (X * 10/11);
Есть генератор случайных чисел. Подскажите пожалуйста, можно ли сделать так чтобы число генерировалось 1 раз при запуске программы и больше не генерировалось.
FUNCTION_BLOCK RNG (* Генератор случайных чисел *)
VAR_INPUT
LOAD: BOOL;
X0: USINT := 1;
END_VAR
VAR_OUTPUT
X: USINT := 1; (* Случайное число *)
END_VAR
VAR
RESET: R_TRIG; (* Экземпляр ФБ R_TRIG *)
END_VAR
===================================
RESET(CLK := LOAD);
IF RESET.Q THEN X := X0; END_IF
X := X *10 - 11 * (X * 10/11);
:) бу-га-га, готовтесь
по существу, можно считывать дату создания/модификации файла проекта и из него генерировать уникальный ключ, таким образом если проект не менялся при каждой загрузке будет свое рандомное число
а где есть описание отключения входов.
http://www.picshare.ru/uploads/170523/bm9SVyHOQN_thumb.jpg (http://www.picshare.ru/view/8103034/)
И еще была версия что можно с помощью МВ110 модуль ввода аналоговых сигналов ускорить!
Подскажите если есть информация по этим вариантам!
Заранее спасибо!Ускорить можно, если часть входов перенести на МВ110-8А и скорость опроса хорошую задать при опросе, и опрос групповой сделать. Но подключать через ModBus.lib придется.
zendo057
23.05.2017, 13:32
Впал в ступор от простейшей задачи управления светом. После полдня мучений создал вот такую конструкцию:
31176
Она работает только благодаря "костылю" в виде посторонней переменной, которая синхронизируется со светом в другом месте программы.
Дело в том, что этот переключатель нужно оформить в виде ФБ чтобы использовать многократно и эта переменная там ни к чему.
Подскажите пожалуйста: как на CFC сделать без костыля?
Видимо на языке типа ST это проще и правильнее, но я его пока не освоил.
Т_тригер ни кто не отменял
Rednaxel
23.05.2017, 15:49
Т_тригер ни кто не отменял
Вещица безусловно полезная, спасибо! Скажите, это ваша разработка?
К сожалению, для моей задачи не годится, т.к. переменная на выходе получается "привязана" к выходу out. А мне нужно чтобы ее можно было изменить в любом другом месте программы. Отсюда и мои извращения с Set/Reset.
XOR, который посоветовали Василий и Дмитрий, как нельзя лучше подходит в данном случае.
Еще раз спасибо всем откликнувшимся!
Rednaxel
23.05.2017, 16:05
Есть генератор случайных чисел. Подскажите пожалуйста, можно ли сделать так чтобы число генерировалось 1 раз при запуске программы и больше не генерировалось.
Я бы посоветовал использовать для этого Power status из модуля статистики. Он меняется при подаче питания.
31315
zendo057
24.05.2017, 14:10
Вещица безусловно полезная, спасибо! Скажите, это ваша разработка?
Да я сам ее сваял.
Добрый день. Есть необходимость запилить пид-регулятор для электропривода шарового крана для плавной регулировки уровня в накопительной емкости по сигналу датчика уровня (или давления) 4..20 мА.
Хочу разобраться в применении пид из стандартной библиотеки util.lib.
На данный момент пока не понял назначение некоторых переменных.
Y_OFFSET - правильно ли я понимаю, что это смещение будет суммировано с вычисленным значением?
Y_MIN, Y_MAX - эти значения должны быть как то коррелировать с предельным рассогласованием, как их правильно высчитать?
Допустим, у меня уровень изменяется от 0 до 4 м.в.ст., тогда минимальное и максимальное воздействие будет +-4? Хотя, вряд ли такие значения можно получить с коэффициентами... тогда как?
Спасибо за участие.
PS. Жутко не хватает нормального описания функций, по типу описания API для операционных систем.
krollcbas
26.05.2017, 10:46
Y_OFFSET - правильно ли я понимаю, что это смещение будет суммировано с вычисленным значением?
Да, вы правильно понимаете
Y_MIN, Y_MAX - эти значения должны быть как то коррелировать с предельным рассогласованием, как их правильно высчитать?
Это пределы управления устройством. Например от 0 до 100%. Эти величины потом необходимо масштабировать в аналоговый выход
Это пределы управления устройством. Например от 0 до 100%. Эти величины потом необходимо масштабировать в аналоговый выход
Спасибо за быстрый ответ. Я думал, что значения ACTUAL, SET_POINT, Y должны быть одной размерности, но судя по вашему ответу я ошибался. Получается, что именно Y_MIN, Y_MAX задают размерность величине Y?
Если на вход пида мы подадим ACTUAL:=400 (kPa), SET_POINT:= 200 (kPa) и Y_MIN, Y_MAX соответственно 0 и 100%, то на выходе мы получим какое-то значение в % от 0 до 100?
krollcbas
26.05.2017, 13:06
Будет 0, если пропорциональный коэффициент = 1(положительный), интегральный поставьте 10. Для начала
Будет 0, если пропорциональный коэффициент = 1(положительный), интегральный поставьте 10. Для начала
Это вы уже прикинули какое значение будет на выходе при определенных коэффициентах, но мне было важно понять верен ли мой вывод о разных размерностях вышеуказанных переменных и то, что на выходе значение будет в % (условно).
Подскажите пожалуйста, верно ли я расписал порт Modbus?
Задача состоит в том, что читать со слейва нужно постоянно, а писать в него только по изменению значений.
ПЛК110М2, слейв - Delta C2000.
31451
31452
Rednaxel
02.06.2017, 15:19
Задача состоит в том, что читать со слейва нужно постоянно, а писать в него только по изменению значений.
Не могу посмотреть картинку, нет доступа, но общий принцип такой:
в модуле Universal Modbus device вы указываете время опроса Polling time в ms - это и будет частота, с которой функции чтения (InputModule) опрашивают ваш Slave.
С другой стороны, функции записи (output module) записывают значение переменной в указанный регистр только после его изменения, на то они и функции записи.
Эдуард_Н
08.06.2017, 07:34
Какой элемент в КДС может заменить "DC32" из ОЛ?
Добрый день.
Нахожусь в некотором замешательстве. В основной программе вызывается блок для подсчёта максимального количества работавших за час насосов:
(* фронты включения насосов *)
rtrPumpOn1(CLK:= inNA1, Q=> );
rtrPumpOn2(CLK:= inNA2, Q=> );
rtrPumpOn3(CLK:= inNA3, Q=> );
rtrPumpOn4(CLK:= inNA4, Q=> );
rtrPumpOn5(CLK:= inNA5, Q=> );
rtrPumpOn6(CLK:= inNA6, Q=> );
(* фронты выключения насосов *)
ftrPumpOn1(CLK:= inNA1, Q=> );
ftrPumpOn2(CLK:= inNA2, Q=> );
ftrPumpOn3(CLK:= inNA3, Q=> );
ftrPumpOn4(CLK:= inNA4, Q=> );
ftrPumpOn5(CLK:= inNA5, Q=> );
ftrPumpOn6(CLK:= inNA6, Q=> );
(* считаем количество работающих насосов *)
pumpsCount := pumpsCount + BOOL_TO_INT(rtrPumpOn1.Q) + BOOL_TO_INT(rtrPumpOn2.Q) + BOOL_TO_INT(rtrPumpOn3.Q) + BOOL_TO_INT(rtrPumpOn4.Q) + BOOL_TO_INT(rtrPumpOn5.Q) + BOOL_TO_INT(rtrPumpOn6.Q) -
BOOL_TO_INT(ftrPumpOn1.Q) - BOOL_TO_INT(ftrPumpOn2.Q) - BOOL_TO_INT(ftrPumpOn3.Q) - BOOL_TO_INT(ftrPumpOn4.Q) - BOOL_TO_INT(ftrPumpOn5.Q) - BOOL_TO_INT(ftrPumpOn6.Q);
(* запоминаем максимальное количество работающих насосов *)
IF maxPumpsCount < pumpsCount THEN
maxPumpsCount := pumpsCount;
END_IF;
IF rtrHour.Q THEN
dataFlow.maxPumpsOn[tmTimeNow.Hour] := INT_TO_STRING(maxPumpsCount); (* сохраняем значение в структуру *)
maxPumpsCount := 0; (* обнуляем значение *)
oldHour := tmTimeNow.Hour; (* обнуляем разницу времени *)
END_IF;
И эти данные, соответственно, раз в час сохраняются в файл.
Что непонятно, так это то, что в некоторые часы я получаю нулевые значения, хотя на 100% уверен, что в эти часы не было такого, что ни один насос не работал. После этого блока уже вызывается программа записи в файл, которая пишет значения структуры "dataFlow", также раз в час по фронту "rtrHour.Q". Как то можно это объяснить?
Добрый день.
Нахожусь в некотором замешательстве. В основной программе вызывается блок для подсчёта максимального количества работавших за час насосов:
потому что в эти часы у вас ничего не включалось и не выключалось, потому счетчик и не рос...
хотя да, странно что счетчик обнуляется..
а вообще не понятно, для чего для такой задачи фронты использовать? почему нельзя просто посчитать количество включенных насосов?
потому что в эти часы у вас ничего не включалось и не выключалось, потому счетчик и не рос...
хотя да, странно что счетчик обнуляется..
а вообще не понятно, для чего для такой задачи фронты использовать? почему нельзя просто посчитать количество включенных насосов?
Ну мне нужно знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения.
После обнуления:
IF rtrHour.Q THEN
maxPumpsCount := 0; (* обнуляем значение *)
END_IF;
maxPumpsCount все равно становится равным количеству работающих насосов в этот момент, согласно
(* запоминаем максимальное количество работающих насосов *)
IF maxPumpsCount < pumpsCount THEN
maxPumpsCount := pumpsCount;
END_IF;
И всё работает как задумано, но в некоторые часы (процентов 5% случаев может, не считал точно) maxPumpsCount оказывается равным 0, хотя это не так. вот и пытаюсь понять в чем косяк
Ну мне нужно знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения.
После обнуления:
IF rtrHour.Q THEN
maxPumpsCount := 0; (* обнуляем значение *)
END_IF;
maxPumpsCount все равно становится равным количеству работающих насосов в этот момент, согласно
(* запоминаем максимальное количество работающих насосов *)
IF maxPumpsCount < pumpsCount THEN
maxPumpsCount := pumpsCount;
END_IF;
И всё работает как задумано, но в некоторые часы (процентов 5% случаев может, не считал точно) maxPumpsCount оказывается равным 0, хотя это не так. вот и пытаюсь понять в чем косяк
Чтобы знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения совсем не обязательно подсчитывать фронты включения и фронты выключения.
Для этого есть стандартный оператор MAX() и как было верно сказано, нужно просто посчитать количество включенных насосов
Никаких промежуточных счетчиков не нужно!!
Как в прочем и r_trigg, f_trigg
maxPumpsCount := MAX (maxPumpsCount , (BOOL_TO_INT(inNA1) +BOOL_TO_INT( inNA2) + BOOL_TO_INT(inNA3) +
BOOL_TO_INT(inNA4) +BOOL_TO_INT( inNA5) +BOOL_TO_INT( inNA6) ) );
IF rtrHour.Q THEN
dataFlow.maxPumpsOn[tmTimeNow.Hour] := INT_TO_STRING(maxPumpsCount); (* сохраняем значение в структуру *)
oldHour := tmTimeNow.Hour;
(* А теперь, подсчитать количество ВКЛЮЧЕННЫХ. насосов на начало следующего часа *)
maxPumpsCount := BOOL_TO_INT(inNA1) +BOOL_TO_INT( inNA2) + BOOL_TO_INT(inNA3) +
BOOL_TO_INT(inNA4) +BOOL_TO_INT( inNA5) +BOOL_TO_INT( inNA6);
END_IF;
Обратите внимание, что я не обнуляю maxPumpsCount после записи в структуру, а присваиваю ей количество работающих насосов в данный момент времени.
И для следующего часа это и будет начальным значением максимального количества включенных насосов.
Имеется ПЛК110, являющийся в системе устройством ввода вывода. Передача по modbus. Сам ПЛК является slave устройством. Необходимо выставлять регистры состояния входов, записывать значения выходов и получать из сети промежуточные переменные. Все бы ничего, но мастер при опросе ищет устройство, регистры которого начинаются с адреса 0ХА400. В конфигураторе ПЛК для слэйва задание адреса не подразумевается, они поочередно идут, начиная с нулевого. Каким образом можно обозвать переменную и присвоить ей конкретный адрес регистра? И еще: можно ли знать, что переменная прочитана (пришел запрос на чтение данного регистра соответсвующей функцией)? Хотел через modbus.lib но он работает только с мастером.
Да, действительно,что то я забыл про МАХ(). Думаю ваш вариант будет правильнее работать. Спасибо.
shymok90
10.06.2017, 23:03
Здравствуйте, нужна помощь. Некорректно работает тайм аут мастера: Панель СПК110 (мастер), подключение по modbus через 485; 2 слейва из 3 отключены; Тайм аут мастера стоит 200 мс; Время между фреймами 20 мс; Реальное время, которое уходит на эти 2 отключенных слейва 20 с! Как исправить? Спасибо за помощь
sanatolich
14.06.2017, 11:43
Добрый день! ПЛК пока не приобретен. Ориентируясь на ПЛК73, дописываю программу управления системой отопления и горячей водой под 2 существующих источника тепла (твердотопливный и электро) + в перспективе третий (газ) на CFC. Много чего удалось победить: управление одной кнопкой двумя-тремя разными *родственными* режимами, управление одной кнопкой взаимоисключающими режимами, управление задвижкой двустороннего действия. Много времени ушло на проработку *защиты от дурака*, когда например начинают нажимать лихорадочно на все подряд кнопки, нажимают и удерживают, и так далее. Но споткнулся о задачу реализации режима работы электронагревом в ночное время суток - с 23час5мин до 5час55мин. Интуитивно понимаю, что решение крутится вокруг таймера RTC. Но у него какой -то странный (обрезанный) функционал. Не понятно, зачем этот таймер вообще есть в стандарт.либ. Вопрос у меня разветвленный. Как сделать автоматическое считывание времени из ЦП персонального компьютера (для режима эмуляции) или ПЛК, и записи на вход блока PDT? Второй вариант вопроса. Как написать суточный (не недельный) таймер вручную с нуля? И в догонку еще вопрос. Извините, я еще только учусь, но есть ли в ПЛК функция автостарта программы на случай отключения электричества?
есть ли в ПЛК функция автостарта программы на случай отключения электричества?
Пропало электричество - ПЛК перестал работать, появилось электричество - запустилась с нуля программа ПЛК. Что еще надо ?
sanatolich
14.06.2017, 12:44
Пропало электричество - ПЛК перестал работать, появилось электричество - запустилась с нуля программа ПЛК. Что еще надо ?
Еще раз повторюсь, я новичок. Но тогда зачем кнопки на плк ПУСК и СТОП?
Еще раз повторюсь, я новичок. Но тогда зачем кнопки на плк ПУСК и СТОП?
что бы программировать их под свои задачи, а так же заходить в стандартное меню ПЛК
sanatolich
14.06.2017, 13:26
Спасибо. С автостартом понял. Как быть с суточным таймером? Кто поможет?
... споткнулся о задачу реализации режима работы электронагревом в ночное время суток - с 23час5мин до 5час55мин. Интуитивно понимаю, что решение крутится вокруг таймера RTC. Но у него какой -то странный (обрезанный) функционал. Не понятно, зачем этот таймер вообще есть в стандарт.либ. Вопрос у меня разветвленный. Как сделать автоматическое считывание времени из ЦП персонального компьютера (для режима эмуляции) или ПЛК, и записи на вход блока PDT? Второй вариант вопроса. Как написать суточный (не недельный) таймер вручную с нуля? ..
Все значительно проще, чем Вы думали. Никаких таймеров RTC ненужно :rolleyes:
31675
А что такое "блок PDT"? И зачем он Вам нужен?
sanatolich
14.06.2017, 14:53
Спасибо за решение! Попробую разобраться. Про PDT я не верно выразился. Вход PDT блока RTC))
И все таки вопрос про считывание программой времени из памяти ПК остался. Как-то это можно реализовать?
sanatolich
14.06.2017, 14:57
Все. Понял)) Объявляем переменную реального времени в плк. И она в программе показывает реальное время) Предыдущий вопрос снимается. Спасибо.
Спасибо за решение! Попробую разобраться. Про PDT я не верно выразился. Вход PDT блока RTC))
И все таки вопрос про считывание программой времени из памяти ПК остался. Как-то это можно реализовать?
Никак.
Для режима эмуляции проста записывайте "ручками" значения времени суток в секундах прямо в конфигурации, в переменную "часы контроллера" (у меня в примере это CurDT). Т.е. значение - (Час х 3600)+(Мин х 60)+ сек.
Кто знает, как прописать ТРМ1 датчик температуры NTC 10kOm?
ParuSnow
20.06.2017, 17:58
уважаемые разработчики OBEN!
зделайте 3-ёх контактные кнопки,
с помощью которых можно будет собирать кнопочные матрицы, такие как на Фото.
Для ПР110 получается
16-36 кнопочная станция.
Здравствуйте. использую библиотечный блок Пид регулятор,для управления нагревателем 3 кВт (очень инертное изменение температуры) с выводом данных на панель СП-270. Недавно выдал глюк, которого в реальности быть не может. Сделал сброс ПЛК, глюк исчез, но Пид регулирование теперь отличается от того, что было раньше в худшую сторону. Температура прыгает вокруг уставки, хотя никаких значений я не изменял. Подскажите - где копать?
Сам отвечу - замкнул тэн, и ТТР с управлением 4-20 мА сгорела и залипла в 100% открытом состоянии, все грелось на полную, а сигнал управления был на 0, так как реальная температура превышала уставку. А эти иглы в графике - замыкания тена на землю. Всем спасибо
dorofeevms
27.06.2017, 07:15
Добрый день!
Начинаю вникать в процесс программирования owen. Как просто "программист" состоялся ))
Возможно, странный вопрос, но все же.
А можно в операторах непосредственно использовать ВХОДЫ (глобальные переменные, связанные с входами) ?
Вот такой фрагмент, скажем, допустим ?
В теле функции -
...
If diP then
... do something
end_if
diP - дискретный вход, если он в состоянии "1" - чего то сделать.
Какие особенности и/или подвохи ?
Или надо сначала в локальную переменную считать вход fsysP := diP, а затем уже использовать fsysP в операторах ?
Добрый день!
Начинаю вникать в процесс программирования owen. Как просто "программист" состоялся ))
Возможно, странный вопрос, но все же.
А можно в операторах непосредственно использовать ВХОДЫ (глобальные переменные, связанные с входами) ?
Вот такой фрагмент, скажем, допустим ?
В теле функции -
...
If diP then
... do something
end_if
diP - дискретный вход, если он в состоянии "1" - чего то сделать.
Какие особенности и/или подвохи ?
Или надо сначала в локальную переменную считать вход fsysP := diP, а затем уже использовать fsysP в операторах ?
на то у них и добавлена приставка глобальные, чтоб в любом месте программы использовать
dorofeevms
27.06.2017, 08:10
Видимо неправильно вопрос задал ) по области видимости как бы вопросов нет.
Сам способ использования в конструкции IF (while, и аналогичных) переменной-входа - допустим ? Тонкостей и нюансов никаких нет ?
упрощенно, сперва в глобальные переменные записываются сигналы с физ.входов, далее выполняется пользовательский код, далее из соответствующих переменных записываются в физ.выхода. Поэтому проблем, программных, быть не должно, антидребезг решается фильтрацией или программно через TON. С while(и другими циклами) могут быть проблемы, приводящие к перегрузке плк, выполнение такого кода по времени должно быть не более ограничений в конфигурации на максимальное выполнение цикла контроллера, поэтому неадекватная задержка на while может сбросить выполнение программы
Видимо неправильно вопрос задал ) по области видимости как бы вопросов нет.
Сам способ использования в конструкции IF (while, и аналогичных) переменной-входа - допустим ? Тонкостей и нюансов никаких нет ?
Из встроенной в CoDeSys 2.3 справки:
Что такое глобальные переменные?
Объявленные как глобальные, "нормальные" переменные, реманентные переменные и константы имеют область видимости, включающую весь проект.
Обратите внимание: Если в некотором программном компоненте проекта объявлена локальная переменная, имя которой совпадает с именем глобальной переменной, то в данном компоненте будет работать локальная переменная!
Использование прямых адресов в функциональных блоках противоречит идеологии независимости данных разных экземпляров функционального блока. Конфигурационные, или "шаблонные", переменные решают эту проблему.
Прочитайте про использование конфигурационных переменных (VAR_CONFIG) в той же справке, там есть примеры использования.
dorofeevms
27.06.2017, 08:50
Предельно понятно, спасибо!
Ограничение по времени учту, while не использую сам почти (редко), процесс достаточно инерционный, поэтому цикл задавать очень короткий смысла нет.
Учту обязательно. Пока, видимо, вопросы в раздел "для новичков" буду писать )
Помогите, не пойму что надо. Написал функциональный блок (первый в жизни), поставил в проект (тоже первый), при компиляции ошибка 3781.
Что он хочет?
31843
31844
Имена начинаются с букв или _
Благодарю все получилось:rolleyes:
Для чтения используется режим By poll time, для записи By value change.
Меня смущало то, что чтение и запись разнесены на разные экземпляры UMD, но оба экземпляра работают на один адрес слейва. Воплотил в железе, проверил, вроде работает.
Добрый день!
Не совсем понятно как работает блок RAMP_INT(REAL). Читал, что при подаче TRUE на вход RESET вход IN транслируется на OUT, а в хелпе пишут: "Установка двоичного входа RESET в TRUE вызывает сброс RAMP_INT в начальное состояние". Но по факту получается не так.
При работе блока при подаче true на вход reset, происходит просто остановка работы на текущем значении. При изменении in на out ничего не меняется, он остается на последнем значении. Соответственно, вопрос: как сбросить out блока, или установить нужное значение, с которого нужно начинать работу?
На вход In подается значение, к которому будет стремиться значение на выходе.
на вход ASCEND и DESCEND, подаются числа, которые влияют на скорость изменения значения на выходе.
на вход TIMEBASE задается время за которое изменится значение на выходе, до у ставки.
Если на входах ASCEND и DESCEND значение будет равно 100, то время TIMEBASE будет идти 1 к 1,
а если на входах ASCEND и DESCEND к примеру подать значение 50, то время TIMEBASE будет идти в 2 раза дольше.
На вход In подается значение, к которому будет стремиться значение на выходе.
на вход ASCEND и DESCEND, подаются числа, которые влияют на скорость изменения значения на выходе.
на вход TIMEBASE задается время за которое изменится значение на выходе, до у ставки.
Если на входах ASCEND и DESCEND значение будет равно 100, то время TIMEBASE будет идти 1 к 1,
а если на входах ASCEND и DESCEND к примеру подать значение 50, то время TIMEBASE будет идти в 2 раза дольше.
В этом то понятно, кроме
Если на входах ASCEND и DESCEND значение будет равно 100, то время TIMEBASE будет идти 1 к 1,
а если на входах ASCEND и DESCEND к примеру подать значение 50, то время TIMEBASE будет идти в 2 раза дольше.
Мне казалось ASCEND и DESCEND это значения, на которые происходит прирост/уменьшение out за время TIMEBASE.
Непонятно, как можно сбросить/присвоить OUT, так как он после паузы в работе сохраняет последнее значение.
В этом то понятно, кроме
Мне казалось ASCEND и DESCEND это значения, на которые происходит прирост/уменьшение out за время TIMEBASE.
Непонятно, как можно сбросить/присвоить OUT, так как он после паузы в работе сохраняет последнее значение.
ну так тут делов то, просто взять и открыть библиотеку как проект в КДС и посмотреть исходный код этого ПОУ. Как такового сброса выхода нет, в идеале он равен входу, от этого и надо "плясать"
Понял,спасибо, придётся так и сделать
в идеале он равен входу
К сожалению это не так
P.S. Ага, посмотрел исходник - разобрался. Чтобы получить OUT:=IN нужно TIMEBASE приравнять к нулю
Здравствуйте . ПЛК 100 отлично работал год, потом был простой 7 месяцев. Когда запустил, после перерыва, программа стала работать некорректно. Появились какие - то "инвалиды" в таймерах. Грешу на железную часть ПЛК. Датчики в норме. ПРограмму перезаливал - глюки остаются. Подскажите пжс - что это может быть, и как это возможно устранить?
Похоже на то, что дело в дохлой батарейке. Заменил - инвалиды исчезли. Всем спасибо за поддержку
Добрый день. Подскажите, как лучше поступить с программой.
Состоит из 9 подпрограмм. Они незначительно отличаются, но в базе содержат 4 функциональных блока (которые сам написал)
1. Гистерезис с 5 уставками, и управляющими входами.
2. Таймер с 5 уставками и упр. входами
3. блок управления частотником, тоже с управлением, и уставками.
4. объединенный блок блинка и счетчика импульсов.
в общем, размер каждой программы солидный, попробовал все разместить в плк_прг заняло в таком виде почти все пространство отведенное codesis на написание программы, и комп начал глючить, не хватает мощности работать с такой программой.
Рассматриваю 2 варианта:
1. Каждую программу засунуть в функциональный блок (это уже освоил, но есть подозрения, что значительно увеличится размер программы)
2. Создать дерево программ (останавливает то, что вообще не понял как настраивать конфигурацию задач)
Егор_Егор
11.07.2017, 15:41
Здравствуйте. Подскажите, пожалуйста, почему не работает выход ФБ. При этом, если ту же программу написать в PLC_PRG всё работает. ПЛК160-24.А-М
32024
32025
32026
Здравствуйте. Подскажите, пожалуйста, почему не работает выход ФБ. При этом, если ту же программу написать в PLC_PRG всё работает. ПЛК160-24.А-М
32024
32025
32026
У Вас в ФБ одной и той же переменной присваиваются значения в разных местах. Актуальным будет то значение у которого номер будет максимальным, в частности №31 (на выходе OR №30). И не важно, что было присвоено переменной AVAR_TEMP_SENSOR раннее.
Необходимо собирать условия вкл. переменной в одном месте, например, вместо трех OR использовать один с шестью входами.
Аналогично и в PLC_PRG. У Вас A13_OUT.11 присваивается в двух местах, работать тоже не будет, актуальным всегда будет значение с выхода OR №53.
Егор_Егор
11.07.2017, 16:39
Спасибо, понял)
Добрый день. Подскажите, как лучше поступить с программой.
Состоит из 9 подпрограмм. Они незначительно отличаются, но в базе содержат 4 функциональных блока (которые сам написал)
1. Гистерезис с 5 уставками, и управляющими входами.
2. Таймер с 5 уставками и упр. входами
3. блок управления частотником, тоже с управлением, и уставками.
4. объединенный блок блинка и счетчика импульсов.
в общем, размер каждой программы солидный, попробовал все разместить в плк_прг заняло в таком виде почти все пространство отведенное codesis на написание программы, и комп начал глючить, не хватает мощности работать с такой программой.
Рассматриваю 2 варианта:
1. Каждую программу засунуть в функциональный блок (это уже освоил, но есть подозрения, что значительно увеличится размер программы)
2. Создать дерево программ (останавливает то, что вообще не понял как настраивать конфигурацию задач)
Что-то я сильно сомневаюсь в том что вы написали столько, что не влезает. Скорее всего библиотек нацепляли много. Один только OSCAT, если целиком, выносит все ресурсы. Смотрите в эту сторону.
Здравствуйте. Подскажите, пожалуйста, почему не работает выход ФБ. При этом, если ту же программу написать в PLC_PRG всё работает. ПЛК160-24.А-М
32024
32025
32026
Добрый день, вот такая же беда, как у Егора, ток как справится с ней даже не знаю, есть ли возможность как то правило выбора блока выставить, например при нажатии пуска1 работать только от блока1, а на остальные не обращать внимания.
А то у меня больше 150 входов, и только 6 выходов, а хотел в виде 9 программ сделать.
например так:32030
а внутри каждый такой:
32032
и каждый блок внутри блока такой:32033
И если описывать всю программу в ST, то вообще для меня будет жесть. Есть какие нибудь способы упростить, я хотел сделать 9 разных подпрограмм, как в примере, но все они выходят на одни 6 выходов.
Добрый день, вот такая же беда, как у Егора, ток как справится с ней даже не знаю, есть ли возможность как то правило выбора блока выставить, например при нажатии пуска1 работать только от блока1, а на остальные не обращать внимания.
А то у меня больше 150 входов, и только 6 выходов, а хотел в виде 9 программ сделать.
например так:32030
а внутри каждый такой:
32032
и каждый блок внутри блока такой:32033
И если описывать всю программу в ST, то вообще для меня будет жесть. Есть какие нибудь способы упростить, я хотел сделать 9 разных подпрограмм, как в примере, но все они выходят на одни 6 выходов.
а в чем различие производства кефира от ряженки, что для них нужно обязательно отдельную программу написать, по сути на вход блока надо подать соответствующую рецептуру, дополнительно еще параметр, отвечающий за выполнение или исключение тех или иных операций для конкретного продукта
Даю наводку, шесть емкостей и гвс и рецепты на 15 продуктов работаю в 160-ом без каких либо проблем
Просто заказчики хотят, чтоб уставки продуктов были в памяти, а им нужно было максимум нажать пару кнопок.
и при желании отредактировать была возможность.
Просто заказчики хотят, чтоб уставки продуктов были в памяти, а им нужно было максимум нажать пару кнопок.
и при желании отредактировать была возможность.
вот именно так, я же не на марсианском молочном заводе автоматизацию делаю, почему требования моих заказчиков должны отличаться от Ваших
Добрый день! Столкнулся со следующей проблемой... Никак не могу установить таргет-файл для CodeSys...Имеется контроллер ПЛК100-220.Р-М. В папке с таргет-файлами этот контроллер отсутствует...
Ниже содержимое диска:
32046
32047
При попытке установить все файлы он выводит искомый контроллер в списке:
32048
Но после установки, при создании нового проекта этот контроллер отсутствует в IDE:
32049
Поиск нужного файла на официальном сайте не дал результат.
Что делать?
Используйте тот который заканчивается на r-m
Используйте тот который заканчивается на r-m
Спасибо! В прошлый раз он "не пошел"... Теперь работает нормально :-)
Всем добрый день. Подскажите, что означает подача на дискретный вход макс 10 кГц при применении аппаратного счетчика для ПЛК 150 ? Ни как не могу найти где это настраивается в ПЛК?
Гарчев Евгений
18.07.2017, 18:40
Всем добрый день. Подскажите, что означает подача на дискретный вход макс 10 кГц при применении аппаратного счетчика для ПЛК 150 ? Ни как не могу найти где это настраивается в ПЛК?
Здравствуйте! Речь идет о подмодулях дискретных входов "Trigger", "Counter 16bit", "Counter SP". Описание в РП, пп. 2.1.3, 2.1.4, 2.1.6 - http://www.owen.ru/uploads/rp_plc100-plc150-plc154_25.pdf
Подскажите, пожалуйста. Нужно сделать так, чтобы двигатель работал некоторое время(4мин), потом была пауза(60мин), затем повторение этого в автоматическом режиме. Как это организовать, никак не могу допереть.
Подскажите, пожалуйста. Нужно сделать так, чтобы двигатель работал некоторое время(4мин), потом была пауза(60мин), затем повторение этого в автоматическом режиме. Как это организовать, никак не могу допереть.
http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf стр.357 блок BLINK
Контроллер ПЛК-100 после подачи питания находится в режиме СТОП. Кнопка переназначена, поэтому запустить можно только через среду CoDeSys, что крайне неудобно. Почему так происходит?
P.S. Иногда (вроде как при непродолжительном снятии питания) он всё же в режиме СТАРТ, батарейка целая, > 3 В.
Контроллер ПЛК-100 после подачи питания находится в режиме СТОП. Кнопка переназначена, поэтому запустить можно только через среду CoDeSys, что крайне неудобно. Почему так происходит?
P.S. Иногда (вроде как при непродолжительном снятии питания) он всё же в режиме СТАРТ, батарейка целая, > 3 В.
при непродолжительном пропадании питания работа контроллера и не останавливается, а то что у Вас он не запускается, так Вы наверное загрузочный проект не делали
Slait_gul
27.07.2017, 18:15
Добрый день, подскажите пожалуйста, как при подаче питания на контроллер выключить все выходи на время около 1 минуты, для того чтобы загрузилась и проинициализировалась вся система, а дальше контроллер работал по программе???
создал системное событие OnPowerOn и прописал все выходы в режим False, но при старте все равно выходы сразу включаются из-за условий написанной программы.
Добрый день. Задумался над реализацией обмена между ПЛК и АРМом посредством сетевых переменных как способ устранения всех текущих моих головных болей. Т.е на одном конце плк udp, на другом конце программа на c#. Собственно вопрос существует ли какое то описание протокола этих сетевых переменных и номера используемых портов. Чувствую что заветные id групп сетевых переменных напрямую связаны с номерами портов. Или только wireshark меня спасёт?
Здравствуйте. Задача вроде простая, но ранее её делать не приходилось.
Нужно в одну энергонезависимую переменную организовать счёт моточасов если сигнал "работа двигателя" в TRUE.
Чтобы не убивать память обновлением этой энергонезависимой переменной каждый цикл, - думаю сделать переменную счёта отдельную, а чтобы в энергонезаивисимую это значение записывалось только при выключении питания ПЛК (речь о ПЛК110 старой версии).
Вопросов несколько:
1) Целесообразно ли использовать для этой цели переменную "Power Status" из блока статистики? То есть когда она в FALSE - тогда организовывать запись в энергонезависимую переменную?
2) Энергонезависимая переменная при этом без разницы где будет описана, - хоть в конфигурации хоть в GLOBAL RETAIN?
3) Ну и сам тип переменной RETAIN что означает? Как в железке работает она?
А) Что каждый раз при изменении этой переменной новое значение сразу записывается в энергонезависимый EEPROM/FLASH?
Б) Или переменная RETAIN - она при обычной работе ведёт себя как будто живёт в оперативной памяти, а в энергонезависимую часть памяти записывается только при отключении питания ПЛК?
Если как в варианте Б - значит моточасы прямо в ней и можно вести, не заморачиваясь с Power Status'ом и дополнительной переменной в оперативной памяти?
Подскажите как на самом деле это работает. Задача пустяковая, но вот этот момент с риском убийства памяти напрягает. Хотя, для сетевого обмена ВСЕ переменные описываются в конфигурации, и те, которые должны быть энергонезависимыми и обычные, и никакая память ещё ни разу не умирала.
Здравствуйте. Задача вроде простая, но ранее её делать не приходилось.
Нужно в одну энергонезависимую переменную организовать счёт моточасов если сигнал "работа двигателя" в TRUE.
Чтобы не убивать память обновлением этой энергонезависимой переменной каждый цикл, - думаю сделать переменную счёта отдельную, а чтобы в энергонезаивисимую это значение записывалось только при выключении питания ПЛК (речь о ПЛК110 старой версии).
Вопросов несколько:
1) Целесообразно ли использовать для этой цели переменную "Power Status" из блока статистики? То есть когда она в FALSE - тогда организовывать запись в энергонезависимую переменную?
2) Энергонезависимая переменная при этом без разницы где будет описана, - хоть в конфигурации хоть в GLOBAL RETAIN?
3) Ну и сам тип переменной RETAIN что означает? Как в железке работает она?
А) Что каждый раз при изменении этой переменной новое значение сразу записывается в энергонезависимый EEPROM/FLASH?
Б) Или переменная RETAIN - она при обычной работе ведёт себя как будто живёт в оперативной памяти, а в энергонезависимую часть памяти записывается только при отключении питания ПЛК?
Если как в варианте Б - значит моточасы прямо в ней и можно вести, не заморачиваясь с Power Status'ом и дополнительной переменной в оперативной памяти?
Подскажите как на самом деле это работает. Задача пустяковая, но вот этот момент с риском убийства памяти напрягает. Хотя, для сетевого обмена ВСЕ переменные описываются в конфигурации, и те, которые должны быть энергонезависимыми и обычные, и никакая память ещё ни разу не умирала.
В ПЛК реализован "Вариант Б".
Так, что никакого "убийства" флеш памяти не будет.
В ПЛК реализован "Вариант Б".
Так, что никакого "убийства" флеш памяти не будет.
Спасибо за быстрый ответ)
А файл создать во FLASH-памяти можно только через модуль "Архиватор"?
А файл создать во FLASH-памяти можно только через модуль "Архиватор"?
Совсем не обязательно.
Нужно использовать библиотеку SysLibFile.lib
На диске к ПЛК есть эта библиотека
32395
И описание
32396
32397
Там же можно и пример посмотреть.
Совсем не обязательно.
Нужно использовать библиотеку SysLibFile.lib
На диске к ПЛК есть эта библиотека
32395
И описание
32396
32397
Там же можно и пример посмотреть.
Большое спасибо:). И ещё есть новый отдельный вопрос - как и где надо описать переменную двойного типа RETAIN PERSISTENT чтобы она на самом деле обладала свойствами обоих типов? Находил где-то таблицу со свойствами переменных в кодесисе и про переменную типа PERSISTENT написано что она сохраняет своё значение даже при перепрошивке ПЛК. А на деле - при перепрошивке значение переменной слетает в ноль, точно так же как и все остальные... Описывал свою переменную типа RETAIN PERSISTENT в разделе глобальных переменных.
Я всё пытаюсь создать переменную, которая бы не затиралась ни при каких манипуляцих с ПЛК, ищу разные пути. Записывать её в файл - наверное будет единственный вариант это реализовать?
Здравствуйте
Подскажите как скопировать программный модуль или функцию на CFC из одного проекта в другой
Простое выделение и копирование блоков ни чего потом не вставляет в окно другого проекта
Библиотеку делать не хочется
Спасибо
Василий Кашуба
04.08.2017, 10:00
Здравствуйте
Подскажите как скопировать программный модуль или функцию на CFC из одного проекта в другой
Простое выделение и копирование блоков ни чего потом не вставляет в окно другого проекта
Библиотеку делать не хочется
Спасибо
А в другом проекте установлены такие же библиотеки?
Здравствуйте
Подскажите как скопировать программный модуль или функцию на CFC из одного проекта в другой
Простое выделение и копирование блоков ни чего потом не вставляет в окно другого проекта
Библиотеку делать не хочется
Спасибо
Экспорт - Импорт
Экспорт
Либо так, если один POU
32419
Либо так, если POU много
32420 32421
Затем в любом другом проекте
32422 32423
Б) Или переменная RETAIN - она при обычной работе ведёт себя как будто живёт в оперативной памяти, а в энергонезависимую часть памяти записывается только при отключении питания ПЛК?
В ПЛК старой модели для сохранения ретайнов стоит аккумулятор. Иногда они выходят из строя, что влечет за собой потерю всех ретайн. Чем чаще выключается ПЛК, тем быстрее умирает аккумулятор. На своих двоих старых ПЛК просто поменял акк на более мощный (оригинал 140ма\ч, поставил 450ма\ч). Родные акки прожили три года, хотя некоторые пользователи отмечали, что умирает через год. Кроме того, если позволяет проект, то время работы ПЛК после пропадания питания нужно уменьшить до минимума. Штатные настройки - 6 секунд, я ставил 2 сек. Это позволит продлить жизнь акку, т.к. в момент отключения питания ПЛК начинает работать от акка установленное в проекте время.
А ретайнами пользовался как обычными переменными, проблем не наблюдалось. Причем одна переменная при работе обновляется до 100 раз в секунду, при этом ПЛК работает в режиме 24\7.
Вроде получилось создать файл во FLASH-памяти,, записывать в него и считывать данные. Расширение у файла поставил .txt
Теперь хотелось бы его из памяти ПЛК вытянуть на ПК. Средствами Кодесиса это можно сделать? Если нет - то чем это сделать проще всего?
В ПЛК старой модели для сохранения ретайнов стоит аккумулятор. Иногда они выходят из строя, что влечет за собой потерю всех ретайн. Чем чаще выключается ПЛК, тем быстрее умирает аккумулятор. На своих двоих старых ПЛК просто поменял акк на более мощный (оригинал 140ма\ч, поставил 450ма\ч). Родные акки прожили три года, хотя некоторые пользователи отмечали, что умирает через год. Кроме того, если позволяет проект, то время работы ПЛК после пропадания питания нужно уменьшить до минимума. Штатные настройки - 6 секунд, я ставил 2 сек. Это позволит продлить жизнь акку, т.к. в момент отключения питания ПЛК начинает работать от акка установленное в проекте время.
А ретайнами пользовался как обычными переменными, проблем не наблюдалось. Причем одна переменная при работе обновляется до 100 раз в секунду, при этом ПЛК работает в режиме 24\7.
Понятно, спасибо. А не подскажете где эта настройка чтобы штатные 6 секунд работы аккумулятора уменьшить?
Вроде получилось создать файл во FLASH-памяти,, записывать в него и считывать данные. Расширение у файла поставил .txt
Теперь хотелось бы его из памяти ПЛК вытянуть на ПК. Средствами Кодесиса это можно сделать? Если нет - то чем это сделать проще всего?
Файл стянул через PLC_IO. Но у него сбитая кодировка, кракозябры вместо цифр. Как-то можно настроить кодировку? Или формат файла TXT не совсем подходит для этой цели? Конечно, в финальном проекте программы - никто не будет лезть и считывать этот файл из ПЛК, но всё-таки мне сейчас в процессе отладки хотелось бы видеть что туда пишется.
P.S. Эта тема становится на мой личный блог:) Но хотелось бы, конечно, ответов на те вопросы, которые я задавал..
Владимир Ситников
05.08.2017, 10:25
Файл стянул через PLC_IO. Но у него сбитая кодировка, кракозябры вместо цифр. Как-то можно настроить кодировку? Или формат файла TXT не совсем подходит для этой цели?
Расширение файла (txt) никак не влияет на содержимое.
Какое содержимое вы туда записали, такое и получилось.
Показывайте код, которым записывали этот самый файл и сам файл -- тогда ещё можно подсказать "как понимать этот файл". А, если нет, то продолжайте вести свой "блог".
serg_ingener
20.08.2017, 15:23
Здравствуйте участники форума ! Подскажите , ПЛК100 поддерживает WEB Визуализацию ? Если нет , то какие поддерживают (ПЛК ОВЕН) . И если можно , объясните как сделать WEB Визуализацию .
Можно-ли в визуализации CoDeSys v2.3 задавать значение текстом ( цифрами . Как , например в мастерскаде . ) а не ползунком .
Возможно у вас путаница в терминологии. ПЛК1хх поддерживают визуализацию, но не WEB. Если вам необходимо именно WEB то смотрите СПК207 или ПЛК3хх.
Значение вводить цифрами можно.
serg_ingener
21.08.2017, 17:02
Мне не нужна именно WEB , а как ещё сделать визуализацию , чтобы сделать готовый к работе проект ? Чтобы оператор открыл файл и работал .
Или объясните как запустить СoDeSys HMI безлицензионную версию , пусть ограниченную версию . Как она будет работать ?
Я пока обучаюсь программе CoDeSys , могу путаться . Заранее извиняюсь и прошу помощи !
Или объясните как запустить СoDeSys HMI безлицензионную версию , пусть ограниченную версию . Как она будет работать ?
Я пока обучаюсь программе CoDeSys , могу путаться . Заранее извиняюсь и прошу помощи !
Почитайте http://www.kipshop.ru/CoDeSys/steps/codesys_visu_v23_ru.pdf
Ну и здесь много чего для начала http://www.owen.ru/catalog/codesys_v2/51162335
serg_ingener
22.08.2017, 19:01
Уже читал . Так мог бы и я ответить .
Здравствуйте участники форума ! Подскажите , ПЛК100 поддерживает WEB Визуализацию ? Если нет , то какие поддерживают (ПЛК ОВЕН) . И если можно , объясните как сделать WEB Визуализацию .
Можно-ли в визуализации CoDeSys v2.3 задавать значение текстом ( цифрами . Как , например в мастерскаде . ) а не ползунком .
поддерживает если её самостоятельно напаисать или восползоваться решением от самой S3Software
как сделать WEB Визуализациютема http://www.owen.ru/forum/showthread.php?t=3129 ни куда не девалась
serg_ingener
22.08.2017, 19:52
Спасибо , но не могу смотреть вложения - чёрный квадрат с точкой в центре . Нужен веб браузер один из перечисленных в первом сообщении для просмотра и для создании WEB визуализации ?
Спасибо , но не могу смотреть вложения - чёрный квадрат с точкой в центре . Нужен веб браузер один из перечисленных в первом сообщении для просмотра и для создании WEB визуализации ?
http://www.owen.ru/forum/showthread.php?t=3129&p=139087&viewfull=1#post139087 это вложение должно открываться
serg_ingener
23.08.2017, 17:13
Открылось , что это за файл ?
Открылось , что это за файл ?
В КДС делайте проект=>импорт и выбиратете этот файл
serg_ingener
23.08.2017, 18:48
Я писал программы на языке CFC и LD другими не владею . Что делать с этим проектом ?
Я писал программы на языке CFC и LD другими не владею . Что делать с этим проектом ?
предположим запустить в реальном плк и зайти в контроллер через веб-браузер
Добрый день, подскажите есть ли возможность в ПЛК ОВЕН 63 в языке программирования CFC на выход таймера TON ввести переменную, которая будет аналогична кнопке "Онлайн - Сброс"(Необходим сброс ПЛК после зажатой кнопки). Как я понимаю мне необходимо найти библиотеку, где будет описываться операции по данной кнопке и подключить ее. Правильно ли это или есть более простой способ?
Гарчев Евгений
24.08.2017, 16:28
Можно по выходу таймера запустить программу с бесконечным циклом.
А перезагрузка через системное меню не подходит?
serg_ingener
24.08.2017, 16:54
предположим запустить в реальном плк и зайти в контроллер через веб-браузер
У меня на этом проекте в режиме онлайн выскакивает много ошибок 3740 и 3760 . Может не хватает библиотек ?
В контроллер пока не пробовал загружать . Или всё-равно попробовать загрузить ?
У меня на этом проекте в режиме онлайн выскакивает много ошибок 3740 и 3760 . Может не хватает библиотек ?
В контроллер пока не пробовал загружать . Или всё-равно попробовать загрузить ?
Как Вы собираетесь тестировать работу с локальной сетью в эмуляции, даже виртуальный контроллер имеет свои библиотеки, отличные от тех, которые нужны овеновскому контроллеру. Для работы с сетью нужно добавлять SysLibSocket
serg_ingener
24.08.2017, 17:37
Я так понял нужно загрузить библиотеку SysLibSocket в проект и загрузить в плк ?
ПЛК на работе , попробую завтра , но боюсь возникнут новые вопросы (типа что дальше делать ). Не могли бы вы capzap объяснить всё по порядку .
Мне надо на мнемосхеме всего-то несколько кнопок , несколько индикаторов . Без мудрёных схем .
Мне необходимо при зажатии кнопки на пульте произвести сброс программы, аналогичный сбросу "онлайн - сброс". Запуск бесконечного цикла, как я понимаю, не даст этого результата
Можно по выходу таймера запустить программу с бесконечным циклом.
А перезагрузка через системное меню не подходит?
Мне необходимо при зажатии кнопки на пульте произвести сброс программы, аналогичный сбросу "онлайн - сброс". Запуск бесконечного цикла, как я понимаю, не даст этого результата
Вы бы написали для чего вам такая экзотика нужна, потому как в явном виде такой возможности нет. Но вы пожалуй первый кому это надо. Возможно вам просто инициализация процесса нужна, так это иначе решается.
Да не такой уж и первый, раньше тоже спрашивали как остановить работу программы
Я так понял нужно загрузить библиотеку SysLibSocket в проект и загрузить в плк ?
ПЛК на работе , попробую завтра , но боюсь возникнут новые вопросы (типа что дальше делать ). Не могли бы вы capzap объяснить всё по порядку .
Мне надо на мнемосхеме всего-то несколько кнопок , несколько индикаторов . Без мудрёных схем .
http://www.owen.ru/forum/showthread.php?t=3129&p=256239&viewfull=1#post256239
Такой вопрос: можно ли, подав сигнал на дискретный вход ПЛК100, поставить выполнение программы на паузу? Включая все текущие таймеры, вычисления и прочее?
Мне нужно подключить кнопку к DI, чтобы пользователь нажав на нее, смог приостановить полностью тех процесс. Нажатием на другую кнопку, нужно запустить процесс с того же места, где он был приостановлен.
Такой вопрос: можно ли, подав сигнал на дискретный вход ПЛК100, поставить выполнение программы на паузу? Включая все текущие таймеры, вычисления и прочее?
Мне нужно подключить кнопку к DI, чтобы пользователь нажав на нее, смог приостановить полностью тех процесс. Нажатием на другую кнопку, нужно запустить процесс с того же места, где он был приостановлен.
Чем не устраивает всю программу поместить в новую программу, например ProgNew, а в PLC_PRG написать IF NOT DI1 THEN ProgNew(); END_IF; Где DI1 бит состояния вашей кнопки. Надо только проверить что с таймерами будет в таком случае. При желании можно их немного переписать, изменив стандартные.
Чем не устраивает всю программу поместить в новую программу, например ProgNew, а в PLC_PRG написать IF NOT DI1 THEN ProgNew(); END_IF; Где DI1 бит состояния вашей кнопки. Надо только проверить что с таймерами будет в таком случае. При желании можно их немного переписать, изменив стандартные.
Процесс состоит из последовательных стадий и очень много завязано на таймеры, поэтому не хотелось бы городить костыли, если есть возможность этого избежать. А есть ли такая возможность я и спрашивал.
Надо только проверить что с таймерами будет в таком случае.
Так таймеры не ведут самостоятельно отсчет - они просто сравнивают текущее время с временем активации. Поэтому на паузу их не поставить
Так таймеры не ведут самостоятельно отсчет - они просто сравнивают текущее время с временем активации. Поэтому на паузу их не поставить
Если таймер не опрашивать, то он и считать не будет, т.е. застынет. Если его снова начать опрашивать, то он снова начнет считать.
Если таймер не опрашивать, то он и считать не будет, т.е. застынет. Если его снова начать опрашивать, то он снова начнет считать.
все дело в том, каким образом таймер получает время, чтоб сравнить его с заданным. Здесь однозначно придется свой таймер писать такой который еще и паузу умеет держать
все дело в том, каким образом таймер получает время, чтоб сравнить его с заданным. Здесь однозначно придется свой таймер писать такой который еще и паузу умеет держать
Вот пример. Работает так как я писал в #5867. О каком таком таймере вы пишите мне не понятно.
Вот пример. Работает так как я писал в #5867. О каком таком таймере вы пишите мне не понятно.
и я про них, вернее все семейство, включая TP И TOF
предположим, завели время на 10 минут, через минуту перестали опрашивать, через 20 минут включили и что в результате произойдет. Таймер обращается к RTC, вычисляет разницу со стартовым временем, сравнивает её с PT, обнаруживает что время превышено и завершает работу таймера, подачей сигнала на выход таймера, а не как Вам видится, продолжает свою работу с того же места
Изменил Ваш проект, понаблюдайте в онлайне развернув ton1
и я про них, вернее все семейство, включая TP И TOF
предположим, завели время на 10 минут, через минуту перестали опрашивать, через 20 минут включили и что в результате произойдет. Таймер обращается к RTC, вычисляет разницу со стартовым временем, сравнивает её с PT, обнаруживает что время превышено и завершает работу таймера, подачей сигнала на выход таймера, а не как Вам видится, продолжает свою работу с того же места
Изменил Ваш проект, понаблюдайте в онлайне развернув ton1
А в моем примере что не так ?
А в моем примере что не так ?
что не так? не соотвествует поставленному запросу
Если таймер не опрашивать, то он и считать не будет, т.е. застынет. Если его снова начать опрашивать, то он снова начнет считать.
а нужно
нужно запустить процесс с того же места, где он был приостановлен.отсчет времени с начала не нужен
что не так? не соотвествует поставленному запросу
а нужно отсчет времени с начала не нужен
То что таймер застыл разве не означает, что отсчет продолжится не с нуля, а c того момента где он прервался ?
Capzap же показал.
И что он показал ?
Мне кажется костыль в данной ситуации вы изобретаете. А правильным было бы фиксировать время стопа и запускать после его снятия процесс с новым временем таймера. Или все обнулять в зависимости от условий. Я у себя так делаю.
RollForRepair
06.09.2017, 13:00
Здравствуйте. Продублирую свой вопрос из другой темы сюда:
Есть ПЛК-110-24.60.Р-М, на нём загружен проект, разработчик с исходниками уехал на полторы недели. Хотелось бы пока есть время провести испытания с уже зашитой программой.
Сейчас пытаюсь установить связь с ПЛК по RS-232, воткнул RJ в RS-232 Debug, через переходник RS-232/USB подсоединил к компьютеру, в диспетчере устройств Com-порт увидел. Далее в Codesys нажимаю открыть -> ПЛК -> выбираю свою конфигурацию -> выбираю Serial RS-232, правильный Com-порт, скорость 115200, ошибка связи каждый раз... Таргет файлы пробовал как качать с сайта, так и устанавливать с диска.
Что я делаю не так?
Здравствуйте. Продублирую свой вопрос из другой темы сюда:
Есть ПЛК-110-24.60.Р-М, на нём загружен проект, разработчик с исходниками уехал на полторы недели. Хотелось бы пока есть время провести испытания с уже зашитой программой.
Сейчас пытаюсь установить связь с ПЛК по RS-232, воткнул RJ в RS-232 Debug, через переходник RS-232/USB подсоединил к компьютеру, в диспетчере устройств Com-порт увидел. Далее в Codesys нажимаю открыть -> ПЛК -> выбираю свою конфигурацию -> выбираю Serial RS-232, правильный Com-порт, скорость 115200, ошибка связи каждый раз... Таргет файлы пробовал как качать с сайта, так и устанавливать с диска.
Что я делаю не так?Вариантов что вы делаете не так великое множество, так как вы не точно описываете свои настройки подключения. Но если предположить, что вы все делаете правильно, то порт Debug возможно используется в программе, и тогда для подключения надо просто перезагрузить ПЛК с подключенным к нему шнурком для программирования.
RollForRepair
ПЛК110 любых модификаций имеют такую особенность - порт Debug начинает работать только при включении\перезагрузке ПЛК с подключенным шнурком.
RollForRepair
07.09.2017, 11:01
RollForRepair
ПЛК110 любых модификаций имеют такую особенность - порт Debug начинает работать только при включении\перезагрузке ПЛК с подключенным шнурком.
Вариантов что вы делаете не так великое множество, так как вы не точно описываете свои настройки подключения. Но если предположить, что вы все делаете правильно, то порт Debug возможно используется в программе, и тогда для подключения надо просто перезагрузить ПЛК с подключенным к нему шнурком для программирования.
Большое спасибо, как раз в этом и была проблема!
odekolon
10.09.2017, 01:03
всем добрый вечер!
подключил к ПЛК110-60 модуль МУ110-32 по модбас
модуль подключился, как бы работает...
никак не могу сделать побитное присвоение имен ключей.
действовал так:
-создал MODBUS master
- к нему подключил подэлемент "unversal modbus device"
- а к нему , в свою очередь, "8 bit output module" в режиме "force multiply coils" 0x0f (10)
первые восемь ключей замечательно управляются - присваиваешь имена битам - все ок , работает
но следующий "8 bit output module" , вместо управления ключами, начинает управлять скважностью - релюхи щелкать начинают
при этом, на скриншоте, явно виден пробел в нумерации на одну десятичную позицию
если первый байт в codesys имеет адрес 6.1.0.0, то следующий должен быть 6.1.0.1, а он имеет адрес 6.1.1.0
получается пробел в 8 байт.
соответственно биты ставятся где -то в области управления скважностью
33053
Почему так происходит?
PS
пробовал подключать подэлементы WORD, и "32 bit_output module" - но эти элементы не дают возможности адресовать ключи побитно...
Smith2007
10.09.2017, 01:20
А вы этим битам дайте имена и попробуйте по именам к ним обратиться/присвоить
odekolon
10.09.2017, 10:16
А вы этим битам дайте имена и попробуйте по именам к ним обратиться/присвоить
подэлементы WORD и 32-bit output - не дают возможности адресоваться побитно. Это как-то извращаться надо.
odekolon
10.09.2017, 11:23
А х.з. Кто кроме вас знает адрес регистра куда пишите ? Картинки ведь такие информативные..
PS
"6.1.0.1" - а что это хрень и на кой ляд вы забиваете себе этим мозг ?
ага, спасибо, разобрался :)
нужно было правильные адреса расставить.
вся фигня была в том, что оба( или больше) подэлемента обращались к одним и тем же битам, соотвественно при каждом poll-time
койлу присваивался то 0 то 1. Соответственно оно и щелкало.:D
учитывая , что это мой первый эксперимент в модбас, полет нормальный.
Здравствуйте. Есть такой вопрос:
Имеется несколько функциональных блоков (FB), в них есть таймеры TP. Иногда бывает необходимость прервать работу ФБ, нажатием кнопки. Я пробовал поставить NО контакт (язык LD) перед ФБ, но при размыкании его таймеры, находящиеся в ФБ продолжают отчет, и если ФБ вызвать снова, таймеры начинают не сначала. Как полностью обнулить ФБ перед новым вызовом?
RollForRepair
11.09.2017, 09:25
Скажите, а ведь нельзя запустить и проверить проект загруженный на ПЛК110 через Codesys если у меня отсутсвует одна из библиотек? Разработчик уехал в отпуск оставил прошитый пульт, но без исходников.
Скажите, а ведь нельзя запустить и проверить проект загруженный на ПЛК110 через Codesys если у меня отсутсвует одна из библиотек? Разработчик уехал в отпуск оставил прошитый пульт, но без исходников.
проект, даже если отсутствует какая то из библиотек это и есть исходники. Выразитесь подробнее что у Вас есть и что нужно сделать
RollForRepair
11.09.2017, 09:38
проект, даже если отсутствует какая то из библиотек это и есть исходники. Выразитесь подробнее что у Вас есть и что нужно сделать
Некоторые процессы в стенде, к которому подключен ПЛК110, не начинаются пока не поменять значения некоторых переменных в программе через Codesys, а запустить проект у меня не получается, т.к. ругается на библиотеки. Т.е. чтобы мне полноценно провести испытания мне обязательно необходима библиотека от программиста?
обычно, у нормальных программистов, все переменные, требующие изменений во время процесса, выводят для доступности по модбас или по другим поддерживаемым протоколам. Возможно и нет нужды открывать онлайн режим в КДС и даже если переменная "спрятана" в проекте, есть устройства которые работают по codesys протоколу и могут изменить любую переменную проекта, не подключаясь с самой КДС
Как полностью обнулить ФБ перед новым вызовом?
Штатно никак - надо самому все организовывать. Если что, таймеры со сбросом есть в библиотеке OSCAT
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot