Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)
Vladimir_tat
22.09.2011, 18:23
Немного неправильно написал - в СисТаймЛиб есть такой пункт "Дэй оф уик", с него можно получать на вход порядковый номер дня недели, а мне нужно получать на вход порядковый номер дня года
Vladimir_tat
23.09.2011, 08:06
Я Вам и ответил на Ваш вопрос из d#2011-09-22 вычесть d#2011-01-01, так как напрямую формат DATE не вычитается переводите этот формат в DWORD, количество дней из получившейся разности думаю тоже ничего трудного нет, естесственоо переведя обратно в DATE
Скажите, а как/где получить на вход дату в формате d#2011-09-22, т.е. не отдельно каждый параметр, день/месяц/год, а целиком дату?
Пардон за возможно очевидный вопрос
OSMODIUS
23.09.2011, 14:48
OSMODIUS, чтоб грешить на плк надо сделать пустой проект с нуля, залить в плк загрузочный код, задать глобальной сохраняемой значение и выкл.
Выполнил данную рекомендацию . Результат удручающий - переменная слетела! Взял другой контроллер - одолжил у напарника - кажется 154 (у меня 100). Все прошло на ура - переменная сохранилась и после пропадания все пришло в норму. Проверил заряд аккумулятора 4,18 по сравнению с 154 даже больше , у него 3,84.
Перед тем как проводить эксперименты перепрошил последней прошивкой с сайта контроллер и переустановил последние таргеты. Пример тестовой программы прилагаю. На чужом переменная сохраняется , на моем нет! Делаю выводы - надо звонить в ТЕХПОМ.
Николаев Андрей
23.09.2011, 15:48
C техпом. все не просто, она частично здесь...
Время контроллер не сбрасывает?
OSMODIUS
23.09.2011, 16:33
C техпом. все не просто, она частично здесь...
Время контроллер не сбрасывает?
Время и программа остаются и с ними все в порядке. Вообще из бесед с часовщиками я знаю , что часы без индикации могут ходить до суток , а программа записанная во флеш не сотрется очень долго. Сильно смущает заряд аакомулятора - норма.
В любом случае до ТЕХПОМА дозвонился сказали , что будут заниматься в понедельник.
В тестовой программе всего 2 переменные , 1 - сохраняется. Вроде ничего не накосячил. Ну не сохраняет мой контроллер переменные.
У меня с этим контроллером уже очень близкие отношения , с удовольствием бы поменял портнера !!!!!
первое упоминание проблемы:
http://www.owen.ru/forum/showpost.php?p=68490&postcount=284
Дравствуйте!!!!
Мне нужно с помощью ПЛК63 по сети RS485 опрашивать датчики мощность.
Где можно посмотреть примерную реализацию на ST.
Николаев Андрей
26.09.2011, 23:51
На диске - примеры использования библиотек ModBus и ОВЕН
Viktor_VS
27.09.2011, 21:45
Здравствуйте, пытаюсь связать плк 110 с Lectus Modbus OPC/DDE сервер, делаю всё по примеру выложенному здесь: http://www.kipshop.ru/Documentation/lectus/bistriy_start_tcp.zip
пробовал уже с двумя контроллерами 110-32 и 110-60, пробовал через Ethernet и через RS-232 связываться, ничего не получается. Никаких данных не передаётся, и через несколько секунд пишет “нет связи с устройством”, IP везде 10.0.6.10, порт 1200 (стандартные установки).
Если кто пробовал, делать по этому примеру, объясните, пожалуйста, что не так?
Если у кого остались рабочие файлы для codesys и lectus буду рад.
Viktor_VS
27.09.2011, 22:16
поменял, теперь lectus пишет "ошибка соединения"
Viktor_VS
27.09.2011, 22:28
смотрите если у Вас контроллер имеет адрес 10.0.6.10 и порт 502, то выполнив команду в консольном окошке <telnet 10.0.6.10 502> при наличии связи станет черный экран курсор пропадет, если связь не установиться будет выдано об этом сообщение
попробовал - чёрный экран и с 502 и 1200
Viktor_VS
27.09.2011, 22:48
значит, дело только в лектусе, снесите созданный узел, начните с нуля
Наконец-то, спасибо огромное, заработало, я просто всё время с 1200 портом всё делал, думал как codesys связывается, так и другие проги должны, а тут ещё и у переменных в lectus адрес был 1 и 2, а в codesys я создавал 0 и 1 , и из-за этого нечиталась ни одна.
Здравствуйте.
Подскажите пожалуйста как подключить аналоговый вход и аналоговый выход.
На языке CFC, если есть ПЛК-150 И.М. и термометр сопротивления ТСП-100П, и как сделать так что бы значение на входе сопротивления совпадало со значением на выходе тока 4-20мА.
Наверное Вы это ищите
Я не ищу покоя, я ищу кингстон, как говаривал наш любимый классик :)
Есть одна штука, которая портит нервы при отладке в КДС. Такого не было, пока не работал с SFC-модулями, хотя это может быть и не информация, а ложная связь.
Итак.
Когда ставлю точку останова (в обычном ST-действии моего SFC POU), то система как-то благосклонно смотрит на это в первый раз. Позволяет разок пройтись по шагам. А уже при второй попытке вдруг жалуется на "Слишком много точек останова подряд" и отключает онлайн! Сообщение прилагаю.
Причем, после этого КДС обижается совсем НИПАДЕЦКИ. Я не могу в онлайн сделать СТАРТ - даже если убедился, что точек останова нет вообще (диалог по точкам останова прилагаю). Я перезапускаю систему, я выключаю ПЛК, я танцую с бубном голый при луне... Прошлый раз я не знаю, что именно помогло - слишком много было танцев. А теперь вот случилось снова и я решил поразвлечь уважаемую публику вопросиком.
Правда, пока написал вопрос, часть ответа получил. Помог такой танец: выключил ПЛК, потом включил и нажал там кнопочку Сброс (очень редко ее юзаю).
Так что делать? Приспособить педаль на кнопочку Сброс ПЛК? И, главное, как не попадать в эту ситуацию? Я уже боюсь отладки по шагам...
Спасибо!
Наверное Вы это ищите
Большое спасибо, очень помогли =)
Я не ищу покоя, я ищу кингстон,
Кажется, доискался...
Скажите, плз, что такое Ошибка № 0 при загрузке проекта?
Ситуация такая. Вполне прилично работающая пара - ПЛК-100 и ПК, связб по Етернету, гружу проекты десятки раз и вроде как нормально. Вчера вечером создал загрузочный проект, пошел спать. А сегодня целый день повторяется одна и та же ситуация: проект вроде грузится, а потом вместо пуска ПЛК комп задумывется на несколько секунд и выдает сообщение (прилагаю).
Если я правильно понимаю, что-то этот номер 0 должен значить? Куда копать? Что изменилось в ПЛК за ночь?
Сменил комп - ситуация повторилась.
Еще один факт: старые версии где-то на 150 кБ грузятся и запускаются. Новые - нет. Но у них объем поболе - 170-180 кБ. Уменьшил объем новой версии до 117 К (исключил из компилирования модуль) - все заработало. Вчера работало и при 180 К...
Поэтому такой вопрос: а какой объем программы допускается? Как узнать ресурсы ПЛК?
Посмотрел браузером, данные о ПЛК прилагаю
пробовали пустой проект залить и сбрасывали ли ПЛК?
Ну, пустой совсем? Нет. Пробовал очень простой - все нормально. Пробовал размером 117 К - тоже. Вчера и 180 К грузился. А сегодня - нет.
ПЛК, конечно, сбрасывал - и кнопочкой, и выключал на полчаса.
schlosser
02.10.2011, 23:47
Отключи файрволл. У меня из за NOD Smart Security такая ошибка выскакивала.
Отключи файрволл. У меня из за NOD Smart Security такая ошибка выскакивала.
Я не знаю, куды лезть, чтобы его отключить :(
У меня Винда 7. Щас буду искать, если не ткнешь носом
Уря! Нашел Брэндмауэр, отключил его - и загрузилось и пошло! Уж не знаю, чего оно вчера пускало... И вообще ничего не понимаю. Но все равно - спасибо огромное!
Если будут жалающие (и могущие) пояснить этот фокус - с радостью выслушаю, конечно.
schlosser
03.10.2011, 00:01
Ищи около часов в правом нижнем углу. Жми пр. кн. мыши и ищи (Временно отключить защиту) или что то вроде этого.
Так эта... А я не то отключил??? Ты смотри, а помогло :)
Честно, я баран в этих современных компах. Искал, где ты сказал - не вижу. Что-то такое было в ХР, а здесь нет.
А брандмауэр я отключил именно для этой сети. В ней всего - ПК и ПЛК. Поэтому - пусть и будет отключен всегда. Мне не жалко.
А понять эту ситуацию - совсем безнадежно?
schlosser
03.10.2011, 09:06
Значит у тебя не установлен Smart Security, а роль файрволла играет брэндмауэр Win. Главное что помогло. Я тоже не сразу догадался. Пару недель подключался нормально , а потом раз и всё, главное что через Debug 232 подключается, а через Enternet не хочет.
эта ошибка №0 означает таймаут связи кодесиса с плк. может возникать при обрыве кабеля, при неправильно выбранном интерфейсе связи в "параметрах связи" и в этом случае из-за файрволла, если соединяетесь через эзернет. может еще из-за чего может возникать.
Значит у тебя не установлен Smart Security, а роль файрволла играет брэндмауэр Win.
Не знаю, нужно ли это теперь, но вот, нашел, чтоу меня работаtт Secirity Essentials. Наверное, это какой-то аналог Smart Security.
2 swerder: Спасибо. Ну, таймаут - это слабая диагностика. В общем, будем довольствоваться тем, ШО ЯКОСЬ ПРАЦЮЕ :)
Без шаманства в нашем деле никак...
почему слабая? кдс явно говорит, что не может связаться с плк. пару возможных причин я привел. или надо чтоб кдс сам выяснил почему не может связаться, снес файрвол, поменял кабель...?
почему слабая?
ОК, я выразился грубо. Имеется в виду, что "почему фРайервол разрешал-разрешал, а теперь вдруг запрещает работать с ПЛК?" - на такие вопросы ответов нет. Согласитесь, уважаемый коллега, это оставляет вопрос диагностики ситуации ПРИоткрытым...
Ну, все, все, извините, если задел! Нет объяснения - и ладно.
Просто вот вчера я с утречка и до позднего вечера работать не мог. Никакой отладки. Это уже не совсем "выскакивает иногда". И в условиях дедлайна я бы крыл матом и фРайервола, и не только. Хорошо, что сейчас не так напряженно, работаю в удовольствие.
"почему фРайервол разрешал-разрешал, а теперь вдруг запрещает работать с ПЛК?" - на такие вопросы ответов нет. Согласитесь, уважаемый коллега, это оставляет вопрос диагностики ситуации ПРИоткрытым...
тут согласен, как карты лягут.
lara197a
03.10.2011, 12:28
Из личных наблюдений скажу, что это врятли поможет. Контроллер или конектится сразу или ждать бесполезно. Часто ожидание таймаута раздражает. Приходится отключаться физически. При этом сразу выскакивает "ош. связи" и можно повторить попытку.
Из личных наблюдений скажу, что это врятли поможет.
Ну, я решил все же проверить. Поставил побольше таймаут, а потом, ИСТЕСНА, решил вновь включить этот злополучный брендмауэр. Чтобы проверить, помолгло ли. И тут мои кривые ручки сделали свое дело - я отключил не защиту, а всю эту сеть! Теперь комп упорно не видит по Этернету мой ПЛК :(
Буду перезапускаться, мож поможет. От, блин, с этими компами! Настолько все неочевидно, как с сетями работать...
Настолько все неочевидно, как с сетями работать...
Э-хе-хе... Тайна осталась тайной.
1) Увеличил таймауд с 2,2 до 5 с. Выключил (нечаяно) этот адаптерв компе.
2) Перезапустил ПК (танцы). Нашел, как включить сетевуху. Проверил с таймаутом 5 с - нормально подключается и работает.
3) Внимание! Вернул таймаут "обратно взад". Продолжает работать.
Резюме: после некоторых действий в ПК КДС устыдился и начал работать с теми же установками и с тем же проектом, с которыми сутки назад пил кровушку.
Павел В.
04.10.2011, 11:21
Подскажите пожалуйста, где взять библиотеку LibPLC160.lib? На диске с плк не нашел, или может название отличается?
Павел В.
04.10.2011, 11:59
capzap, нужна функция DWORD GetStatus(void) для диагностики аналоговых входов (Status). На эту библиотеку ссылается руководство по программироваию ПЛК160 (стр. 80). Если есть более простое решение диагностики аналоговых входов/выходов в пользовательской программе, буду рад услышать. Я в этом деле новичок, раньше только сименсами занимался.
Николаев Андрей
04.10.2011, 19:20
такие вопросы рекомендую писать на plc@owen.ru
Павел В.
11.10.2011, 11:51
Библиотеки я видимо не дождусь. :)
capzap, помогите новичку, как считать байт из REAL переменой. Никак команду не найду, нашел только как считать бит.
получить старший байт можно с помощью DWORD_TO_BYTE(SHR(REAL_TO_DWORD(value),24)), где value значение в формате REAL, это навскидку, надо проверять
Библиотеки я видимо не дождусь. :)
capzap, помогите новичку, как считать байт из REAL переменой.
Какой именно байт? Преобразовать РИАЛ в байт или конкретно 1-й, 2-й, ... байты?
Если вытащить побайтно - то указатели рулят. Если преобразовать - то стандартная функция. Или нет?
Наверное с указателями правильнее, потому что преобразования влекут за собой потерю информации и коды будут прочитаны не верно, только как, у меня получается запредельно громоздко :)
pt: POINTER TO DWORD;
value: BYTE;
pt:= ADR(%IR3.0);
value:=DWORD_TO_BYTE(SHR(pt^,24));
у меня получается запредельно громоздко
Ну, я не понял, что ты хотел там получить.
1) Просто уложить на место байта старший байт от DWORD?
2) преобразовать КАК-ТО значение числа из DWORD в BYTE?
3) Или в DWORD лежит уже какой-то REAL? И нужно из него что-то в байт?
ptr: POINTER TO BYTE;
ptrby: POINTER TO BYTE;
aby: ARRAY [0..3] OF BYTE;
ptr:= ADR(%IR3.0);
ptrby := ADR( aby[0]);
FOR i := 1 TO 4 DO
ptrby^ := ptr^;
ptr := ptr + 1;
ptrby := ptrby + 1;
END_FOR
Не проверял. Но как-то так. И потом рассматривай себе на здоровье, ХОШ - первый байт, ХОШ - второй, ХОШ КАКОЙ ХОШ :)
Главное, что меня удивило, когда уважаемый Валенок учил меня здесь пойнтеры юзать, что при прямом наращивании указателя КоДеСис не обращает внимание на размер того, на что он указывает. Поэтому операция ptr := ptr + 1; установит пойнтер именно на следующий байт, а не на следующий РИАЛ (как можно ожидать из опыта Си).
не ну в главном документе про это то есть запись
Обратите внимание: Указатели инкрементируются побайтно! Для увеличения указателя, как это принято в C-компиляторах, используйте инструкцию p=p+SIZEOF(p^);.
не ну в главном документе про это то есть запись
Я сюда пишу тогда, когда главный документ
- прочитан и не понят
- не прочитан
- не известно, что в нем это есть
думаю, что я не одинок :)
Интересно, а автору вопроса наш треп еще нужен?
Проверил в эмуляторе работает
Ты и мертвого уговоришь :)
И я проверил. Спасибо! Была ошибочка - оба пойнтера нужно объявлять одного типа, иначе компилятор ругается. А после объявления их указателями на байт (я у себя и не на байт пробовал - катит!) можно спокойно присваивать ему значение адреса ЧЕГО УГОДНО.
Вот, СОБСНО, работающий проект
PROGRAM PLC_PRG
VAR
ptr: POINTER TO BYTE;
ptrby: POINTER TO BYTE;
aby: ARRAY [0..3] OF BYTE;
i: BYTE;
IR30: REAL := 25.5;
END_VAR
ptr:= ADR(IR30);
ptrby := ADR( aby[0]);
FOR i := 1 TO 4 DO
ptrby^ := ptr^;
ptr := ptr + 1;
ptrby := ptrby + 1;
END_FOR
4851
Evgengold
22.10.2011, 16:10
Где можно посмотреть Адрес контроллера (который задается от 0 до 255)?
Extremator
22.10.2011, 17:33
Уважаемые!
Не подскажете ли, как в упрощенном SFC
удалить ненужный шаг-переход.
Технически.
Что нужно выделить-нажать-произнести...
Уважаемые!
Не подскажете ли, как в упрощенном SFC
удалить ненужный шаг-переход.
Ну, клацнуть на шаге, нажать ШИФТ, подвести мышку к преходу, клацнуть еще раз - пунктир обведет и шаг, и переход. Дажать ДЕЛ - кодесис даже не переспросит
Extremator
22.10.2011, 18:55
Ну, клацнуть на шаге, нажать ШИФТ, подвести мышку к преходу, клацнуть еще раз - пунктир обведет и шаг, и переход. Дажать ДЕЛ - кодесис даже не переспросит
О-оо, спасибо, добрый человек!
А я не дотумкал, что шаг с переходом объединить надо.
Андрейка
27.10.2011, 19:17
Здрасте). Подскажите пожалуйста каким функциональным блоком можно поставить тревогу на вход, чтобы при при значении ЛОЖЬ загаралась тревожная лампочка.
Тема такая - напряжение 24в проходит через три двигателя, если напряжение остается неизменным, работа станка продолжается, если вдруг уменьшилось - загорается лампочка тревоги и станок выключается(не включается). Думал можно взять блок LIMITALARM, который в Until.lib, но так это, или есть что по проще, не знаю - посоветуйте пжлста.
alarm: bool;
voltage: int;
alarm := voltage < 24;
Андрейка
28.10.2011, 12:10
swerder Спасибо
Андрейка
31.10.2011, 16:28
capzap, гистерезис для меня было "странным" словом, я ведь не электрик, но погуглив разобрался. Посоветуюсь с знающими этот термин и совместными усилиями решим этот вопрос. :)
Кстати у меня наверное вообще дурацкий вопрос:
Как мне разобраться с разделом объявлений? Туда надо писать абсолютно всё? Есть какие нибудь сцылки на эту тему?
Просто сами функции через пень-колоду почти научился писать, а вот объявления.. как-то не понятно почему именно там писать, а не в коде.
Андрейка
31.10.2011, 16:49
пишите все в коде, как Вам хочется
Спасибо большое. Но к сожалению, так как мне хочется писать, КДС не поймет:). Нужно писать так как хочется мне, но КДСовским языком. И пока у меня очень хреновый акцент:)
Андрейка
31.10.2011, 17:36
Ну раз пошла такая пьянка. Еще вопрос.
В коде мне нужно указать три направления движения Х вперед=> (назад)=<, Y вверх=^ (вниз)=v, а как указать направление перпендикулярное Х? Ну допустим z. Но так это или нет подскажите. просто не уверен в правильности решения
вы о чем? не знаете как назвать переменные?
Андрейка
31.10.2011, 21:22
вы о чем? не знаете как назвать переменные?
Знаю. Просто это первое задание, свалившееся на меня. Так что лучше лишний раз показать свое скудное образование и уточнить, чем напортачить с три короба, и оказаться крайним.
Андрейка
31.10.2011, 21:24
:) а как у Вас c английским или немецким? Заходите на oscat.de скачивайте библиотеку и документацию, садитесь и изучайте. Практически там есть готовые блоки под любой механизм, которым можно управлять с помощью ПЛК.
А на Белорусском нету? :) :) :). Ладно, ушли от темы, простите за офтоп.
Новички, пишите дальше свои вопросы, тут помогают. А я пока буду сочинять новые вопросы))
Electro2
02.11.2011, 13:17
Помогите с выбором мастера сети.
В сети будет ПЛК110, панель СП270 и 3-4 устройства типо анализаторов сети и датчиков с выходом по ModBus. ПЛК управляет работой устройства, панель необходима для отображения данных с анализаторов и датчиков а также аварийных сигналов от управляемого устройства. Возможно необходимо будет реализовывать простой алгоритм ручного управления устройством с панели (что то типо ВКЛ - ОТКЛ). Также необходимо всю информацию с датчиков и анализаторов передавать на верхний уровень.
В этой ситуации что лучше сделать мастером - панель или ПЛК?
Николаев Андрей
04.11.2011, 21:37
Панель выступает мастером для ПЛК.
ПЛК выступает мастером для счетчиков.
kait-volga
07.11.2011, 10:55
Добрый день.
Вопрос из разряда: как правильней использовать:
считываю/записываю данные с/в МДВВ маской, например MDVV.
Вариант 1:
VAR_GLOBAL
Motor:BOOL;
Motor2:BOOL;
Motor3:BOOL;
END_VAR
(*присваиваем*)
MDVV.0:=Motor; (* как я понимаю, этот кусок *)
MDVV.1:=Motor2; (* кода будет крутиться * )
MDVV.2:=Motor3; (* постоянно *)
(*и в дальнейшем используем переменные Motor, Motor2 и Motor3*)
Вариант 2:
VAR_CONSTANT GLOBAL
Motor:SINT := 0;
Motor2:SINT := 1;
Motor3:SINT := 2;
END_VAR
(*и в дальнейшем используем адресацию через константы*)
MDVV.Motor := TRUE;
MDVV.Motor2 := FALSE;
и т.д.
или есть какой-то третий (правильный) вариант?
kait-volga
07.11.2011, 11:16
второй вариант ни кому не показывайте :)
Почему? Стр. 326 Руководства по Codesys.
да и первый вроде не для считывания а для записи в модуль
Чтение-Запись - не суть важно. Главное как?
Работать то оно работает. Ясно, что пользоваться переменными типа MDVV.5 не есть удобно, когда модули расширения на 32 входа/выхода. Поэтому пользуюсь методом присваивания, т.к. функции аля define в ST нет. Но вот не совсем уверен, что это правильно, может есть другие способы?
Motor3:BOOL := 2;Вы присваиваете булевой переменной двойку, а она (переменная) может иметь два состояния, с единицей и нулем еще как то можно, но что Вы двойкой получите, задумайтесь
Можете написать структуру с вашими моторами размером с Ваш MDVV, объявить её глобально, а затем использовать команду SysMemCpy(ADR(MDVV),ADR(STRU),2), а в программе использовать STRU.красивое_имя_мотора := что_то_там_булевое
kait-volga
07.11.2011, 11:54
Вы присваиваете булевой переменной двойку, а она (переменная) может иметь два состояния, с единицей и нулем еще как то можно, но что Вы двойкой получите, задумайтесь
Упс. Невнимательность. Скопировал выше и не изменил тип данных. Но если все же правильно объявить (SINT), то данный вариант имеет право на жизнь?
Можете написать структуру с вашими моторами размером с Ваш MDVV, объявить её глобально, а затем использовать команду SysMemCpy(ADR(MDVV),ADR(STRU),2), а в программе использовать STRU.красивое_имя_мотора := что_то_там_булевое
C памятью и структурами еще только разбираюсь. Т.е. правильнее будет воспользоваться структурами?
Я понимаю, что мой проект занимает всего 1% данных и пока на скорость исполнения выбор метода не сильно повлияет, но хочется для себя уяснить как более изящно написать код, без лишнего Г$%ноКода.
Спасибо.
kait-volga
07.11.2011, 12:12
У меня аналогично реализован обмен с панелью, есть регистр HMI_Data. И далее я каждый его бит присваиваю другим битовым переменным.
Inputs_G1:=HMI_Data.0;
Inputs_G2:=HMI_Data.1;
Inputs_G3:=HMI_Data.2;
Inputs_G1:=HMI_Data.3;
Но смущает, что при каждом цикле будут тупо присваиваться значения...
kait-volga
07.11.2011, 14:13
Уважаемый capzap попробовал использовать структуру, не получилось. Нужна помощь :confused:
(*Создал структуру MV110DN*)
TYPE MV110DN
STRUCT
Motor0: BOOL ;
Motor1: BOOL ;
-------//------------
Motor31: BOOL ;
END_STRUCT
END_TYPE
(*Объявил*)
VAR_GLOBAL
MDVV:MV110DN;
END_VAR
(*Копирую из MV110_32DN в MDVV - 4 байта (DWORD)*)
SysMemCpy(ADR(MDVV),ADR(MV110_32DN),4);
(* Запускаю исполнение *)
(* Изменяю данные в MV110_32DN, они копируются почему то в mdvv.Motor0 *)
(* и при значении выше 7 (т.к. bool занимает byte без прямой адресации, естественно выдает ошибку INVALID:16#*)
mdvv.Motor0;
mdvv.Motor1;
mdvv.Motor2;
mdvv.Motor3;
В чем моя ошибка?
Николаев Андрей
07.11.2011, 14:36
А можно просто взять библиотеку Util.lib в которой есть блоки Pack и Unpack...
kait-volga
07.11.2011, 15:59
А можно просто взять библиотеку Util.lib в которой есть блоки Pack и Unpack...
А смысл, тем более в ST? Я то же самое действие делаю присваиванием.
kait-volga
07.11.2011, 16:32
А по опыту, Вы как именуете/используете переменные? Присваиванием или по типу MDVV.0, MDVV.1?
Структурой в принципе удобно, в плане того, что при вводе точки после названия, CodeSys сам предлагает выбор элементов структуры. Только вот что-то не получается...
kait-volga
07.11.2011, 16:56
SysMemCpy в эмуляторе неработает
Я в ПЛК сразу зашиваю. Как у Вас сделал, в Value значение копируется. Только вот как сделать так как на картинке Box и значения bitacces я не понял.
kait-volga
07.11.2011, 20:34
там где вы читали про глобальные константы, вторым примером должно идти использование директив
Имеется ввиду директива Pragma? Все испробовал, так и не понял как ею воспользоваться :(
Только добился:
"Неизвестная директива (pragma) '<имя>' проигнорирована!"
Данная директива ‘pragma’ не поддерживается компилятором. См. "Директивы компилятора".
Скажите пожалуйста, в какую сторону рыть.
Почему не работает ?
ЗЫ
Остальные моторы кончилиcь :)
kait-volga
07.11.2011, 21:48
Объясните плиз, как у Вас на второй картинке, в разделе элементов отображается состояние битов? По мануалу надо использовать директиву pragma, но как, не пойму...
kait-volga
07.11.2011, 22:43
запишите как на наших картинках в структуре, этого достаточно
Да вроде так и делал, а что то не получалось.
Держи.
Нужны еще глоб.конст :
мотор1:байт:=0
..
+ галка замены констант
В мануале все ясно написано.
Мануал то читал, но ясность при большом объеме входной информации в мозг, параметр относительный. :)
1) Галочку замены констант сделал сразу.
2) В глобальные константы пробовал добавлять (по мануалу), но т.к.. результата не нашел, то убрал сначала.
3) Сейчас все в кучу свел и получилось. Я просто структуру объявил в глобальных. Поэтому и не мог понять скрины, где в PLC_PRG отображаются биты... Устал уже видать за день :)
4) Без объявления констант действительно выдает "Некорректное выражение".
Еще вопросы.
1) Правильно ли я понимаю, что bitaccess мне дает только (по мануалу) возможность мониторить побитно переменную?
Сейчас ПЛК рядом нет, попробовать заново не могу(ведь как я понял SysLibMem.lib выполняется в ПЛК), но все же.
2) Почему у меня при копировании SysMemCpy(ADR(MDVV),ADR(MV110_32DN),4);
все копировалось в первую переменную?
(*Создал структуру MV110DN*)
TYPE MV110DN
STRUCT
Motor0: BOOL ;
Motor1: BOOL ;
-------//------------
Motor31: BOOL ;
END_STRUCT
END_TYPE
(*Объявил*)
VAR_GLOBAL
MDVV:MV110DN;
END_VAR
(*Копирую из MV110_32DN в MDVV - 4 байта (DWORD)*)
SysMemCpy(ADR(MDVV),ADR(MV110_32DN),4);
(* Запускаю исполнение *)
(* Изменяю данные в MV110_32DN, они копируются почему то в mdvv.Motor0 *)
(* и при значении выше 7 (т.к. bool занимает byte без прямой адресации, естественно выдает ошибку INVALID:16#*)
mdvv.Motor0;
mdvv.Motor1;
mdvv.Motor2;
mdvv.Motor3;
3) Как пользоваться директивой "pragma"?
4) Ну и напоследок: А Вы, как работаете с именами переменных?
Думаю, что вряд-ли с помощью Pack-Unpack... :rolleyes:
Прошу прощения за настойчивость.
Спасибо всем за помощь.
kait-volga
07.11.2011, 23:58
Смешались в кучу кони, люди..
Ну есть чуть чуть...
1.А где тип MDVV ? (100 пудов - это все и объяснит)
Наверное речь идет о самой железяке?
MV110_32DN - 32bit input module. Объявлена в конфигурации.
А если MDVV структуре, то я ее объявил так:
MDVV:MV110DN;
Задумывался о типе структуры, но посчитал, что ее тип, это сумма переменных которые она включает в себя...
2.для syslibmem в эмуляции не сложно сделать подставку. Главное понимать - что оно делает
Пока еще не понимаю, к сожалению. Но мы идем вперед :)
3.И на кой вооще здесь syslibmem ?
Не знаю. Суть вопроса, как рациональней передать данные полученные (отправляемые) с модулей ввода-вывода (и не только) в переменные с названиями имеющими более доступный логический смысл.
Но данная тема ускорила мое понимание смысла syslibmem и структур в целом. :) За что не устаю говорить спасибо!
kait-volga
08.11.2011, 00:53
ёх. Не заметил. Но каково !
Опель:ТФольксваген :eek:
Сорри, названия были от балды..
Ну и так попорядку :
Что есть тип МДВВ у Вас - тоже что и array[0..31] of bool (byte)
А тип MV110_32DN ? - dwоrd, ну или array[0..3] of byte;
В 32 стакана положили 4 ведра.
Примерно рядом мысли и кружили, но как же быть?
Ведь входное значение DWORD, а в структуре вроде как 32 bool.
Но на практике выходит, что 32 byte. А прямые адреса в структурах использовать нельзя.
Совет-на время забудте про syslibmem.
Ок. Но со структурами то надо разобраться? ;)
ЗЫ
Или я что-то пропустил, но у МДВВ 12 входов. (маска - word)
МДВВ-тоже образное название - Модуль В/В (отголосок прошлых проектов). А железка МВ110-32ДН - 32 входа, как я понимаю DWORD.
kait-volga
08.11.2011, 08:26
Ну и получили пачку. Зачем теребить-то.
6 банок в упаковке проще тащить чем в россыпью.
Наделали процессов с входными красивоименоваными булями, и на верхнем уровне передали нужные биты нужным булям - сразу видно кто к чему привязан. И комментарии не нужны, и понятно кто на чем висит.
МДВВ - 12Di/8Do
На этом уровне наглядно видно что 2 насоса на МДВВ и 1 на своих входах/выходах
Понятно. Спасибо. Так и делаю в общем. Просто интересовало как дела с этим обстоят у других. Вопрос закрыт.
kait-volga
08.11.2011, 08:39
Новый вопрос :)
Возможно ли организовать связь ПЛК с OPC сервером и CodeSys через один GSM/GPRS модем-порт? Если можно, то подсказку в студию пожалуйста. Собственно экспериментально пробовал через CSD - не получилось. Если в конфигурации присутствует модем и тот же порт указан в CoDeSys.cfg, то КДС выдает сообщение, что модуль не будет инициализирован. Но уверенности нет, т.к. соединение через CSD CodeSys у меня и так проходило через раз. Поиск ответов не дал..
Николаев Андрей
08.11.2011, 10:57
По связи через модем есть отдельные слова в РП и РЭ на ПЛК (На ПЛК110 точно есть).
Надо понимать, что Gateway очень тяжелый, и полезной информации несет в 5-10 раз меньше, чем сопутствующей.
СОответственно время...
Если OPC Gateway, то не стоит - CoDeSys не рекомендует обращение несколькими устройствами к одному контроллеру по Gateway одновременно.
kait-volga
09.11.2011, 16:10
По связи через модем есть отдельные слова в РП и РЭ на ПЛК (На ПЛК110 точно есть).
Пролистал РЭ ПЛК110. Упоминания о использовании одного порта для подключения средой CodeSys и для связи с внешним миром - OPC сервером там нет (как и в других РП и РЭ по ПЛК и ПМ01).
Если OPC Gateway, то не стоит - CoDeSys не рекомендует обращение несколькими устройствами к одному контроллеру по Gateway одновременно.
Есть OPC Lectus и ПЛК100.. Имелось ввиду не одновременное обращение несколькими устройствами, а в разное время: периодический опрос OPC сервером, а при необходимости корректировки программы соединиться средой CodeSys.
Подсознательно я понимаю, что указав порт в codesys.cfg, ПЛК наверняка зарезервирует его для связи по протоколу Gateway и поэтому проигнорирует модуль Modem в конфигурации, настроенный на этот же порт... Но может есть варианты?
kait-volga
09.11.2011, 16:43
судя по пункту 7.2.8 либо по протоколу КДС либо другие протоколы, в том числе и с помощью ОРС
Прошу прощения, пункт 7.2.8 в каком документе?
kait-volga
09.11.2011, 16:50
РЭ_ПЛК110.pdf
Чего то не пойму.
В http://www.owen.ru/uploads/rie_plk110.pdf
7.2 Технический осмотр контроллера проводится обслуживающим персоналом не реже........
Далее....
7.3 Проверку функционирования аккумулятора необходимо производить
kait-volga
10.11.2011, 10:04
В РЭ общие слова о том, что подключение возможно так то и так. Причем согласно таблице 2.2 этого документа, протокол Gatewey поддерживается только RS-232 Debug и Ethernet, а как же загрузка проекта CodeSys по модему через порт RS-232 и RS-485? Ну это лирика.
В общем все щиты управления которые мы устанавливаем, разбросаны по Волгоградской области, а это более 400 км в разные стороны. Вот и хотелось бы иметь возможность удаленного обновления программы. А модем ПМ-01 уже в комплекте стоит, но задействован для связи с OPC сервером Lectus.
Можно конечно поставить второй модем на другой порт и использовать для загрузки проекта... но во первых второй модем, а во вторых не всегда есть свободный порт в ПЛК.
PS Еще мысль есть попробовать GSM модем с интерфейсом Ethernet...
Николаев Андрей
10.11.2011, 10:22
1. Обновление программы только через 232 Debug или Ethrenet.
Если с Ethernet все понятно, то через Debug надо пробовать - вопрос в скорости связи, но опыт такой был. Естественно, что порт Debug должен быть занят только этой задачей (вставлен соответствующий кабель).
kait-volga
10.11.2011, 10:24
я вот прочел следущее
На кабеле КС3 «ПЛК–Модем» необходимо установить переключатель в положение «ON», если ПЛК110 будет использоваться для связи со средой CoDeSys, и в положение «OFF» в случае работы по остальным протоколам.
Т.е. для того что бы настраивать и просто работать, кто то должен подойти и физически "совершить обряд"
Ну это относится только к порту Debug RS-232. Помимо этого надо еще выключить-выключить ПЛК, т.к. он анализирует сей контакт при включении.
Николаев Андрей
10.11.2011, 10:25
:)
По этому я и говорю, что этот порт должен использоваться ТОЛЬКО для программирования...
kait-volga
10.11.2011, 10:31
1. Обновление программы только через 232 Debug или Ethrenet.
А как же:
http://www.owen.ru/uploads/inctrukciya_po_cozdaniyu_udalennogo_podklyucheniya _credoi_codesys_k_oven_plk_cherez_modem.pdf
Загрузка через порт RS-232 (ПЛК100)
Если для подключения к модему используется порт RS-232 ПЛК100 (а не Debug RS-232), то для
подключения к нему модема в режиме CoDeSys необходимо воспользоваться прямым кабелем.
Загрузка через порт RS-485
Для загрузки проекта через интерфейс RS-485 подключите модем к ПК витой парой, соблюдая
полярность А-А, В-В. Для ПМ01 положение переключателей: 1 - on, 2- off.
Если с Ethernet все понятно, то через Debug надо пробовать - вопрос в скорости связи, но опыт такой был. Естественно, что порт Debug должен быть занят только этой задачей (вставлен соответствующий кабель).
Я опробовал через каждый порт и загрузку проекта CodeSys и связь с OPC Lectus, но только одну из задач предварительно настроенную: или в конфигурации модуль Модем или залив в ПЛК файлы CodeSys.cfg и modem.cfg.
А вот мысль про Ethernet связана с тем, что Ethernet не требует предварительной настройки в ПЛК, для загрузки проекта CodeSys, как и не требует никаких физических переключений...
kait-volga
10.11.2011, 10:34
Только через RS-232 Debug как в руководстве не вышло, а получилось как здесь, в последнем посте.
http://www.owen.ru/forum/showthread.php?t=11232
Павел В.
17.11.2011, 14:41
Подскажите, как передавать/принимать с ПЛК160 на СП270 дробные отрицательные числа? Modbus, панель - мастер.
Павел В.
17.11.2011, 15:59
capzap, похоже я запутался в адресации.
Последний адрес регистра Modbus - 62, тип 2 byte, а вот если добавить ещё четыре регистра для двух REAL то адреса для них будут 63 и 65?
Николаев Андрей
17.11.2011, 16:05
Я бы сделал по другому. Пример есть на форуме, где ТРМ1.
Передавайте Word или DWord умноженный на 10 в степени количества знаков после запятой.
А в панели выставляйте количество знаков после запятой.
Павел В.
17.11.2011, 16:55
capzap, извиняюсь, забыл сказать нумерация регистров с 0, т.е. 62 регистр по порядку будет (63), а 63 и 65 будут (64) и (66). Так вот, поле ввода в панели с адресом 65(66), записывается в ПЛК по адресу 63(64). А поле ввода с адресом 63(64) вообще никуда не записывается. Если бы оно перекрывалсь с другими регистрами ПЛК там бы значения менялись, но нет.
как использовать эти долбаные функциональные блоки? Где и как их объявлять, как использовать переменные? Ни в одном источнике толком подробно ни***на не написано
с горем пополам ФБ добавил, разобрался вроде, но все равно как сделать чтоб системное время отображалось типа TIME_OF_DAY, иначе дальше больно много гемора если часы и минуты будут 2 разными переменными
capzap
огромное спасибо вам!!! Вы спасли меня от полной переделки программы)))
Все преобразовал, но при попытке запустить программу на контроллере возникла проблема: в ФБ не отображаются системное время и дата... Т.е. все параметры остаются по нулям после запуска контроллера. Его надо как-то стыковать с контроллером этот ФБ? Порылся в документации, в кодесисе но не нашел. Подскажите плиз где надо связать ФБ со временем в контроллере?
http://www.owen.ru/forum/showpost.php?p=23828&postcount=46 попробуйте пример, может он чем поможет, системное время появляется, если предварительно во все поля записать нули
спасибо за пример - помогло))) теперь вроде все работает, выходные потестю и попробую применять)))
немного настораживает что часы в контроллере отстают....или мне показалось...
ukrainian
20.11.2011, 14:48
Привет всем!
Помогите, подскажите) у меня на руках плк100 и мдвв. пытаюсь их подключить, сделал все как сказано в инструкцыи, связь между плк100 и ПК вижу, между мдвв и ПК через com вижу. Как увидить связь между плк 100 и мдвв в codesyse? каким модулем это сделать?
Только пожалуйста обясните популярно, а то я совсем зеленый в контролерах:)
сделали же на форуме специально ветку с примерами (http://www.owen.ru/forum/forumdisplay.php?f=49), в которой есть Примеры использования модулей расширения, в частности пример программ подключения модулей МВА8/МВУ8/МДВВ к ПЛК (http://kipshop.ru/Primeri/Modules/02._Samples_MVA8+MVU8+MDVV+PLC.zip)
берете в руки РЭ к МДВВ, находите раздел про подключение плк, находите номера регистров маски входов и выходов, в конфигурации плк добавляете modbus master, делаете интерфейс rs485, настраиваете параметры связи (скорость, четность...), добавляете register input, в нем прописываете адрес регистра с маской входов из РЭ, добавляете register output, далее аналогично.
AlterMann
23.11.2011, 23:01
Здравствуйте.
У меня вопрос по организации памяти в модуле Modbus slave. Скрин конфигурации: http://imglink.ru/thumbnails/23-11-11/a10288dba0b5bdd7de69749c2f0532f6.jpg (http://imglink.ru/show-image.php?id=a5a280043cd3663733b2cfae517c044b)
Интересует, в частности, учитываются ли при выравнивании адресации каналы "Last address", "Last error", "Command". Если да, то по каким адресам будут расположены переменные N_l10S, Tn10S, Tpr10S?
Извиняюсь, если вопрос совсем детский, или где-то уже обсуждался, но чтение документации и метод тыка результатов не дали :( а сроки горят.
Николаев Андрей
23.11.2011, 23:05
Я думаю надо вернуться к чтению РП по программированию. Раздел ModBus Slave.
Адресация начинается с адреса 0.
Регистр (2 байта) занимают один адрес.
Real (4 байта, 2 регистра) занимают 2 адреса, и всегда с четной цифры.
Например:
Регистр 1 - адрес 0
Регистр 2 - адрес 1
Регистр 3 - адрес 2
Real 1 - адрес 4 (адрес 3 останется пустым) - это и есть выравнивание.
По этому всегда рекомендую добавлять переменные начинаться самых маленьких: 8 bit, registr,Float.
AlterMann
23.11.2011, 23:13
Спасибо за оперативность. Просто на ночь глядя уже туго соображаю. Все же считать адреса нужно начинать с "Last address", или с "N_l10S"? Просто контроллеров сейчас под рукой нет, чтобы проверить, а хотелось бы этот момент для себя прояснить.
Николаев Андрей
24.11.2011, 09:38
Читаем мат. часть...
LastAdress и Last Error - это сервисные сообщения, ВЫДАВАЕМЫЕ контроллером, чтобы Вы могли анализировать качество и стабильность обмена.
все никак не пойму, зачем люди пихают master в slave либо slave в master:confused:
Николаев Андрей
24.11.2011, 14:57
все никак не пойму, зачем люди пихают master в slave либо slave в master:confused:
+1.
Однако каждый сам кузнец своего счастья...
AlterMann
24.11.2011, 16:56
Читаем мат. часть...
LastAdress и Last Error - это сервисные сообщения, ВЫДАВАЕМЫЕ контроллером, чтобы Вы могли анализировать качество и стабильность обмена.
Ясно, будем пробовать.
А мастер в слейве - попытка организации шлюза, т.к. контроллер с этой конфигурацией должен одновременно работать с другим ПЛК и СП270, при этом не хотелось "вручную" копировать переменные.
Да, и как там ... "я не волшебник, я только учусь" :)
не хотелось "вручную" копировать переменные.
сэкономили 10 минут на этом, потратили кучу времени на выяснение почему этот шлюз не работает.
AlterMann
24.11.2011, 18:25
Может быть, может быть. Но является ли такой прием вкорне неправильным? Мне кажется, с точки зрения быстродействия он более эффективен. Нет?
AlterMann
24.11.2011, 18:43
К сожалению, только в процессе отладки и ни в чем не уверен. Проблемы есть. Не знаю... Может сделать по-другому? Просто опыта нет, вот экспериментирую.
AlterMann
24.11.2011, 18:54
Проще это создать отдельный мастер и отдельный слейв и в программе копировать переменные из одного в другой? Бум пробовать :)
AlterMann
24.11.2011, 19:17
Понял, попробую. Спасибо.
Подозреваю, что ответ прост, но туплю бешенно. Вопрос касается ПЛК100, но намеренно помещаю его здесь, ибо хочу решить задачу методом, не зависящим от ПЛК.
Так вот, вопрос: как сделать так, чтобы ПЛК стартовал "с чистого листа" при любом пропадании питания?
Дело в том, что ПЛК100 имеет такое свойство - пробовать поддерживать состояние переменных некоторое время после выключения питания. Цель у авторов была благородной, но мне это не только ни к чему, но вообще вредит. Хочу, "чтобы окна открывались мышью" :) Хочу, чтобы даже кратковременное пропадание питания приводило к полному перезапуску процессора, к установлению начальных значений переменных. Зачем мне это - другой вопрос. Хочу.
А пока вижу, что поведение программы при выключении на несколько секунд и несколько минут - различно. И это мешает.
Спасибо!
Николаев Андрей
25.11.2011, 09:26
if "тригер по переднему фронту"(power) then
....
Программа
....
if "тригер по заднему фронту"(power) then
...
модуль статистика Вам в помощь, а именно Power Status
Спасибо. А так, чтобы и доцент понял, нельзя?
конфигурация плк > добавляете модуль statistic
там будет бит power status
конфигурация плк > добавляете модуль statistic
там будет бит power status
ОК, давайте разбираться. Создал с нуля проект. Прилагаю. В нем есть всего ничего: в PLC_PRG один оператор ";" и в Конфигураторе ПЛК добавил модуль статистики.
При запуске на реальном ПЛК100 вижу в модуле статистики одни нули. Ни время цикла, ни температура в ПЛК, ни какая из иных переменных не работают.
Вопрос к знатокам: что сделал неправильно?
Вопрос к опытным: кто использовал модуль Статистики?
Спасибо!
5123
При запуске на реальном ПЛК100 вижу в модуле статистики одни нули.
Прошивка в ПЛК не совпадает с таргетом CDS
После замены прошивки или таргета надо удалить и вставить снова модуль статистики или создавать новый проект.
Николаев Андрей
28.11.2011, 20:48
Удалите старый Target с помощью указанной ранее утилиты.
Скачайте новый Target, соответствующий Вашей прошивке. Установите его. http://www.owen.ru/catalog/78552813
Удалите старый Target с помощью указанной ранее утилиты.
Скачайте новый Target, соответствующий Вашей прошивке. Установите его. http://www.owen.ru/catalog/78552813
После чего открываю проект и должно быть все чики-пики?
Ругается на отсутствие директорий... Как здесь все нелогично, понять невозможно, запомнить не откуда.
Ладно, прочь эмоции.
Рассказываю по пунктам. Кое-что уже вспоминаю, могут быть мелкие неточности.
1) Запустил InstallTarget. Первый вопрос: вот то поле сверху с надписью Installation directory - это что? Какую директорию туда надо записать?
2) Ну, пока удаление, то можно и не знать правильного ответа. В поле Installed Targets отмечаю последовательно все пункты из папки Owen
3) скачиваю файл
Install_Target_v.2.10_for_PLC100_PLC150_PLC154.exe
Источник: http://www.owen.ru/catalog/78552813#t20c
4) запускаю его. Указываю ему путь C:\codesys - именно там была папка targets с кучей папочек PLC100.K-L и т.д.
Вроде как устанавливает. Создав при этом директорию с долгим именем Target_v.2.10_for_PLC100_PLC150_PLC154
Переименовую ее в Targets, чтобы было все как раньше.
ДОБАВЛЕНО: При запуске InstallTarget вижу, что установлены все таргеты (полный список из скачанных с сайта ОВЕН). То есть, думаю, что таргеты установлены...
5) При запуске проекта пишет "Ошибка чтения информации целевой платформы"
Какого?
Даю ОК, хотя уже вижу, что не ОК
Открывает проект и пишет "Ошибка при чтении конфигурации ПЛК! Файл описания модуля 'Module Root' не найден. Изменить конфигурационную директорию?"
6) Что изменять?
И что такое этот Module Root?
Я в растерянности. Прошу помочь понять - как же все-таки канонически расположиьть директории со всякой конфигурационной информацией, чтобы КоДеСис не приходилось "заводить с ноги" каждый раз при новом проекте или смене ПЛК?
Николаев Андрей
28.11.2011, 22:49
Ничего канонически распределять не надо.
У Вас сменился Target - сменилось распределение данных в PLC Configuration.
Заходим в настройки целевой платформы - выбираем свой тип ПЛК.
Переходим в неё родимую (конфигурацию ПЛК), и из меню дополнительно делаем команду - стандартная конфигурация.
Вуаля.
Одна беда - конфигурация сбросится...
Одна беда - конфигурация сбросится...
Огошеньки!!! Спасибо вам большое в шляпку, как говаривали в Одессе :(
Не придумали же еще способа без ручек обходиться?
Серьезно, уважаемый Николаев Андрей, можно было предупредить. Я ушел от такого рецепта, когда мне его в другой ветке предлагали, а тут напоролся по полной.
Прав был Валенок: поменьше пользоваться штатным Конфигуратором.
А если я снесу эти новые таргеты, будь они неладны, и восстановлю старые? Перестанет ругаться КДС? Или обиделась навеки?
Но тогда вопрос: как же заставить ПЛК сбрасываться тотчас же по выключению питания? Или залезть в него и выбросить аккумулятор нафик?
Николаев Андрей
28.11.2011, 23:44
Если снесете, и поставите старый, все будет ок.
По другому в явном виде никак.
Можно изгаляться с релюшками промежуточными и анализировать состояние дискретного входа, но это все...
Андрей, а там сложно долезть до аккумулятора? Прав ли я вообще в том, что его можно отключить и (если в проге нет ни одной РИТЕЙН-переменной) все будет работать нормально?
Николаев Андрей
29.11.2011, 10:46
Андрей, а там сложно долезть до аккумулятора? Прав ли я вообще в том, что его можно отключить и (если в проге нет ни одной РИТЕЙН-переменной) все будет работать нормально?
Все правильно, но есть еще одно но -часы реального времени тоже не сохраняются...
Николай- ЧМЗ-Глазов
30.11.2011, 22:23
Здравствуйте. Пишу диплом по автоматизации. Программа написана, теперь листинг надо вставить в текст пояснительной записки. Ничего не получается(((. Что делать!! Листинг хотелось бы в LD.
Здравствуйте. Пишу диплом по автоматизации. Программа написана, теперь листинг надо вставить в текст пояснительной записки. Ничего не получается(((. Что делать!! Листинг хотелось бы в LD.
Скриншот Вам в помощь (Alt+PrtSc), а затем в «Paint» или что покруче.
P. S. В «ворде» есть кнопка (панель «Настройка изображения») с её помощью можно лишнее обрезать прямо в «ворде» :-)
Николай- ЧМЗ-Глазов
30.11.2011, 23:53
Дык это же диплом, тут всё по ГОСТу надо, в рамке, шрифтом, интервалом там....короче не всё так просто
Мне кажется, что Вы собираетесь применять ГОСТЫ от оформления релейных схем к листинг программы? Или уже есть ГОСТ на оформления листинга? Наверное стоит вставить как есть и пронумеровать как Рис. 1 - Рис.59.
Или вынести в приложение и попытаться оформить, так что бы преподам глаза не резало - тогда это Вам в автокад и тд - то чем умеете пользоваться.
P. S. Поговорите с преподом может все обойдется ;-)
Николай- ЧМЗ-Глазов текстовые программы вставляйте текстом, графические программы вставляйте картинками. у нормконтроля нет официально закрепленных требований к листингу.
Николай- ЧМЗ-Глазов
01.12.2011, 10:16
Значит в среде CoDeSys нет опций по копированию текста программы? Сам искал, но смог только листинг скопировать на IL.
Значит в среде CoDeSys нет опций по копированию текста программы?
Здравствуйте Николай.
Копирование есть для любого куска программы, но вот вставлять скопированное корректно на 100% только в CoDeSys. Полностью согласен с Swerder: текстовые программы копируйте как текст, а графические языки программирования (в том числе и LD) вставляйте как картинки.
P. S. Желаю успешно защитить диплом и не забудьте все спорные нюансы согласовать с преподом ;-) Удачки.
Николаев Андрей
01.12.2011, 11:18
1. Программный код в дипломе ОБЯЗАТЕЛЬНО оформляется как приложение, и закрепляется в конце диплома.
2. В CoDeSys есть возможность вывода программы на печать. Используйте не принтер, а экспорт в pdf или другие "бумажные принтеры".
Почитайте мануал по CoDeSys, раздел посвященный основному меню. В частности файл и проект.
Николаев Андрей
01.12.2011, 11:20
1. Программный код в дипломе ОБЯЗАТЕЛЬНО оформляется как приложение, и закрепляется в конце диплома.
2. В CoDeSys есть возможность вывода программы на печать. Используйте не принтер, а экспорт в pdf или другие "бумажные принтеры".
Почитайте мануал по CoDeSys, раздел посвященный основному меню. В частности файл и проект.
З.Ы.:
Некоторые приложения к диплому не только в диплом подкрепляются, но и отдельно распечатываются, если члены компании захотят их посмотреть. Я распечатывал 3 приложения (по 4 экземпляра).
Николай- ЧМЗ-Глазов
01.12.2011, 20:43
Мне в принципе нужно количество листов набрать близкое к ста. Текст программы я решил написать не в приложения, а в отдельный раздел-Разработка программы работы контроллера в различных режимах. Писать всё-таки буду на IL, точнее конвертирую c FBD. Рядом с каждой строкой описание действия выполняемого программой. Так наверное будет правильнее. P.S. Кстати проект разрабатывал только на Овеновских приборах, так сказать для поддержки отечественного производителя)))
Добрый день.
Впервые пользую, КодеСиС, возникает куча вопросов "дурацких", может кто поможет. Версия 2.3.9.9 руссифицированн.
1. Не работает (Копипаст Ctrl+c) ?
2. Непонятен момент в режиме эмуляции:
out1:=in1; (*VAR BOOL*)
состояние TRUE не передаётся из in1 в out1.
как вобще увазывать реальные порты ввода вывода ?
3. толковые "последовательные" мануалы по ST где искать ?
Николаев Андрей
04.12.2011, 02:02
1. К сожалению особенность CoDeSys Ctrl + Ins Shift + Ins работают.
2. Если Вы привязали переменные к реальным входам - чему удивляетесь, Вы же в режиме эмуляции...
3. Толковых и последовательных почти нет. Что могу порекомендовать: Сайт CoDeSys.ru - там есть первые шаги. Мануал по CoDeSys. Книга И.Петрова.
Программа написанная на языке CFC, в процессе модернизации стала неадыкватно себя вести, то работает, то нет.
В данный момент не работают триггеры (F_, R_) и при подача токового сигна 2.5 мА на AI1, AI2 и т.д. в конфигураторе показывает 10 мА (в 4раза больше).
Причем, загружаю старую прогу (немного раннюю версию) все отлично.
Вопрос: КАК РЕШИТЬ ДАННУЮ ПРОБЛЕМУ! ОЧЕНЬ не хочется переписывать все с нуля. СПАСИБО!
Александр Приходько
12.12.2011, 10:25
Программа написанная на языке CFC, в процессе модернизации стала неадыкватно себя вести, то работает, то нет.
В данный момент не работают триггеры (F_, R_) и при подача токового сигна 2.5 мА на AI1, AI2 и т.д. в конфигураторе показывает 10 мА (в 4раза больше).
Причем, загружаю старую прогу (немного раннюю версию) все отлично.
Вопрос: КАК РЕШИТЬ ДАННУЮ ПРОБЛЕМУ! ОЧЕНЬ не хочется переписывать все с нуля. СПАСИБО!
1) Конечно в Codesys могут быть ошибки, но так чтобы проект не работал в целом - врядли. Как вариант скачайте с нашего сайта версию 2.3.9.30, если ваша более старая.
Советую перед заливкой проекта в ПЛК выполнить два пункта в меню "проект" это "очистить все" и затем "Комилировать все".
2) Что касается особенности операторов CFC: очень важен их порядок и расположение. В графическом редакторе ЛКМ и выбираем Порядок-> В соответствии с потоком данных. Проверяем код программы отладочными средствами. Фокусов не бывает.
3) Если сигналы - +4..+20мА отражаются не корректно, то может быть несколько проблем:
- В конфигурации не верно задано масштабирование
-слетела калибровка ПЛК (например, ПЛК перепрошивали).
-берем мультиметр и измеряем показания датчика.
1) Как вариант скачайте с нашего сайта версию 2.3.9.30, если ваша более старая.
Советую перед заливкой проекта в ПЛК выполнить два пункта в меню "проект" это "очистить все" и затем "Комилировать все".
2) Что касается особенности операторов CFC: очень важен их порядок и расположение. В графическом редакторе ЛКМ и выбираем Порядок-> В соответствии с потоком данных. Проверяем код программы отладочными средствами. Фокусов не бывает.
3) Если сигналы - +4..+20мА отражаются не корректно, то может быть несколько проблем:
- В конфигурации не верно задано масштабирование
-слетела калибровка ПЛК (например, ПЛК перепрошивали).
-берем мультиметр и измеряем показания датчика.
Версия 2.3.9.6;
Очистить и Компилировать все не помогло;
С масштабированием AI все нормально, Масштабирование равно 0;
При проверке проекта нашли логическую ошибку (некоторые элементы противоречили друг другу). Эту ошибку исправили, но аналоговый вход AI показывал в 4 раза больше заданного значения (проверяли мультиметром).
ОДНАКО, когда создали проект заново, полностью аналогичный первому, то все правильно заработало.
Две PRG разработаны на SFC (стандартный) использующие одни и те же выходы ПЛК, PLC_PRG разработан на FBD. Что делать если в одной из программ шаги отрабатываются, а выходы на ПЛК нет, по отдельности программы работают нормально.
Программы расположены в FBD последовательно и та которая находится ниже работает нормально, а верхняя по цепочке отрабатывает шаги но на выходах ПЛК срабатывания реле нет. Если переставить местами программы в FBD, то программа которая была сверху, а теперь снизу работает нормально, верхняя "нещёлкает". Скорее всего переменные выходов захватываются нижней по цепи программой и верхняя их не видит.
Как обойти эту ситуацию.
Елена_23
19.12.2011, 05:15
Здравствуйте. подскажите пожалуйста как быть:( я работаю с ПЛК154, при подключении к ПЛК блок расширения МУ110-8И не могу разобраться с адресами которые присваивают каждому входу:( мне нужно на прямую подать сигнал(4-20мА) с МВ110-8А на МУ11-8И. Сигнал не проходит транзитом:( Никакой документации подключения МУ110-8И к ПЛК я найти не могу. Подскажите как быть?????:(
Елена_23
19.12.2011, 09:13
у меня есть эта документация:) я в Codesys не знаю как прописать в конфигурации ПЛК этот модуль расширения!!!)
http://www.owen.ru/uploads/rie_mu110-8i_889.pdf
таблица В.4 стр.33
на первый выход значение от 0 до 1000, нулевой регистр и т.д.
В КДС в конфигураторе создаете мастер модбас все тоже по книжке PLC_Configuration_OWEN.pdf, создаете из пункта 3.2.1. Модуль «Универсальное устройство Modbus (Master)», внем Register Output Module c функцией записи write multiple registers (0x10) и номером регистра 0
Как то так должно заработать
Елена_23
20.12.2011, 04:07
Спасибо, что помогаете разобраться:) Но я тоже так делала:( мне пишет ошибку: невозможно преобразовать REAL в WORD. мой сигнал 4-20мА должен подаваться транзитом с одного модуля на другой. Я подключила калибратор к модулю ввода, а к модулю вывода регистратор Метран 910, в Codesys на языке LD выбрала функциональный блок MOVE, сделала все так как было написана в руководстве. И ничего:( если подключить регистратор к одному из выходов контроллера сигнал проходит, все ровно все показывает, приборы все исправны! С модулем расширения ну ничего не получается!:confused:
Елена_23
20.12.2011, 04:21
Словно выхода эти не получают сигнал, не доходит он...не прописано что то где то:( я вот и понять не могу где:( пичаль...
Елена_23
20.12.2011, 08:45
я вам в личку написала)
Подскажите:
После установки CodeSYS 2.3.8.1 ненаходит библиотеки:
SYSLIBTIME.lib
SYSTASKINFO.lib
SYSLIBCALLBACK.lib
и пр...
Где можно скачать всё до кучи?
Не отображаются Русские шрифты, как лечется ?
Как в проекте поменять тип контроллера ?
Подскажите:
После установки CodeSYS 2.3.8.1 ненаходит библиотеки:
SYSLIBTIME.lib
SYSTASKINFO.lib
SYSLIBCALLBACK.lib
и пр...
Где можно скачать всё до кучи?
Не отображаются Русские шрифты, как лечется ?
скачивается отсюда (http://kipshop.ru/CoDeSys/2.10.30/CoDeSys_v23930.exe) актуальная версия КДС и все проблемы как рукой снимет
по второму вопросу: вкладка ресурсы, настройки целевой платформы, ваш тип, ok, да, конфигурация плк, меню дополнения, стандартная конфигурация
Ага, спасибо.
*.lib файлы после установки новой версии кодесис нашлись в (program files\CAA-Targets\3S\LIB_PLCWinNT\), я их переложил в папку Library каталога CodeSYS.... Хз правельно или нет, но семплы проектов стали открываться, с руганью что библиотеки были изменены ???
Есть ли внятный мануал по ST с примерами...
Собственно задача сделать что то типа:
7. Пример использования SysLibTime. Подсчет времени наработки станка.
Сам пример на IL можно ли его сконвертить в ST.
"Изменение IP'адреса контроллера возможно при помощи команды SetIP, подаваемой через PLC'Browser."
Кто такой ПЛС'Броузер, и где его искать ???
Блин, вобще куча вопросов возникает, а мануал весь на 45 листах....
PLC Шаг за шагом, ничего такого нет у Овена?
"Изменение IP'адреса контроллера возможно при помощи команды SetIP, подаваемой через PLC'Browser."
Кто такой ПЛС'Броузер, и где его искать ???
кдс, вкладка ресурсы, плк-браузер.
Блин, вобще куча вопросов возникает, а мануал весь на 45 листах....
PLC Шаг за шагом, ничего такого нет у Овена?
CoDeSys_V23_RU.pdf на диске плк
CoDeSys_V23_RU.pdf на диске плк
Мммм, диск не читается, на сайте не нашёл, Google непомог..(((
кдс, вкладка ресурсы, плк-браузер.
Да уж.
Я так понял что синтаксис этог инструмента тоже был на диске PLC_Browser_OWEN.pdf.
Вобщем с сайта я скачал РЭ_ПЛК100.pdf, на 41 стр. мануала было найденно
"Перечень электронных документов, необходимых для начала работы с контроллером ОВЕН ПЛК" .... Где их можно скачать на сайте ??
Как сделать свою функцию с переменным числом аргументов?
Нету тут такого. Если плющит - указатель на список
Типа того. Свою так не сделаете
Здравствуйте! Подскажите пожалуйста как можно использовать ПК в качестве HMI в ПЛК-160 без открытия программы. В описании CoDeSys и на диске с ПЛК упоминается вскользь CoDeSys визуализация (типа демо версия и т.д). То есть я так понимаю что полноценной программы с ПЛК не поставляется?
lara197a
07.01.2012, 18:08
HMI-демо версия. Время работы 1 час. Через час требуется перезапуск. Др. ограничений нет. Лицензию можно приобрести в "Пролог". Описание в справке КДС.
Или используйте любую бесплатную скаду.
Здравствуйте! Подскажите пожалуйста если в ПЛК-160 для связи с компьютером использовать SCADA, то как объявлять переменные которые будут видны в SCADA - глобальные или сетевые?
Николаев Андрей
16.01.2012, 09:40
Смотря как будете настраивать связь.
Если через OPC CoDeSys - то не принципиально.
Если по ModBus, то переменные добавляются в конфигурацию ПЛК, и таким образом автоматически становятся глобальными
Прошу совета. Имеются переменные типа string, приходящие из scada. Описаны в глобальных переменных. (пока работаю через codesys opc,т.к. не могу разобраться с адресацией в lectus opc по modbus). При пропадании питания на ПЛК переменные обнуляются. Можно ли сделать запись этих переменных в энергонезависимую память? Если можно то как? И что будет проще: записать в энергонезависимую память или проверка условия в скада (IF <var1>не равно <нужное значение> then отправка значений.
Извиняюсь если некорректно изложил мысль.
И еще в догонку)) Как в PLC_PRG объявить программу? С FB все ясно, а PRG так не объявляется, всю справку перерыл - не могу найти((
Вы нас пугаете.
1.Сделайте их global retain
var global retain
s : ..
var не ретайн
init : bool
_s - в области обмена
if not init then
init := true;
_s := s;
end_if
s := _s;
2.А зачем её объвлять ? Описали и вызывайте
skodafelicia
24.01.2012, 22:03
Подскажите, как лучше всего в ПЛК 100 организовать учет наработки оборудования в маш\часах. Естественно, старт\стоп будет программный...
Вы нас пугаете.
1.Сделайте их global retain
var global retain
s : ..
var не ретайн
init : bool
_s - в области обмена
if not init then
init := true;
_s := s;
end_if
s := _s;
2.А зачем её объвлять ? Описали и вызывайте
спасибо, прошу прощения за тупые вопросы. Просто для меня все что делаю в новинку, всему учусь.
Ну без объявления не получается.
пытаюсь записать из PLC_PRG в переменную программы значение таким образом: LOGIC.UTRO1:=STRING_TO_TOD(UTRO_1); при компиляции выдает:
"Операндом для 'ST', 'STN', 'S', 'R' должна быть переменная или прямой адрес доступные по записи"
Замените первый операнд переменной, имеющей доступ на запись.
В FB решалось описанием переменной UTRO1 в VAR_INPUT. А тут как быть не пойму.
А вы её, родимую, и в program сделайте var_input
А вы её, родимую, и в program сделайте var_input
ура)) спасибо вам огромное. Я дурак, не догадался попробовать вручную написать раздел VAR_INPUT в PRG. Теперь буду знать))) Спасибо вам)
skodafelicia
24.01.2012, 22:43
Считайте секунды
Типа:
VAR_GLOBAL RETAIN
TOTAL_HOURS: DWORD := 0;
END_VAR
VAR
bl1: BLINK;
ctu1: CTU;
END_VAR
bl1(ENABLE:=IS_START,TIMELOW:=T#500ms,TIMEHIGH:=T# 500ms);
ctu1(CU:=bl1.OUT,PV:=3600);
IF ctu1.Q THEN
TOTAL_HOURS:=TOTAL_HOURS+1;
END_IF
?
Счетчик не ретайн - будете терять остаток
И сброс его где ?
skodafelicia
24.01.2012, 22:59
Счетчик не ретайн - будете терять остаток
И сброса его где ?
Остаток - еще хз, а нужен-ли он мне ))
Счетчик при кратковременном выключении питания сохраняется?
уже потестил, сброс дописал ))
bl1(ENABLE:=IS_START,TIMELOW:=T#500ms,TIMEHIGH:=T# 500ms);
ctu1(CU:=bl1.OUT,RESET:=FALSE,PV:=10);
IF ctu1.Q THEN
TOTAL_HOURS:=TOTAL_HOURS+1;
ctu1(RESET:=TRUE);
END_IF
С другой стороны - DWORD секунд это 136 лет? Я правильно посчитал?
Может тогда секунды и хранить в ретайн?
VAR
bl1: BLINK;
ft1: F_TRIG;
END_VAR
bl1(ENABLE:=IS_START,TIMELOW:=T#500ms,TIMEHIGH:=T# 500ms);
ft1(CLK:=bl1.OUT);
IF ft1.Q THEN
TOTAL_SECS:=TOTAL_SECS+1;
END_IF
UPD: А можно просто раз в секунду через конфигуратор задач вызывать
IF IS_START THEN TOTAL_SECS:=TOTAL_SECS+1;
?
Остаток - еще хз, а нужен-ли он мне ))
30м + 1ч50м + 3ч40м - наработка 4 часа
С другой стороны - DWORD секунд это 136 лет?
Может тогда секунды и хранить в ретайн?
Думаете праправнуки непростят ? Нормуль.
skodafelicia
24.01.2012, 23:11
30м + 1ч50м + 3ч40м - наработка 4 часа
Да, действительно... несколько раз по 55 минут потерять - уже существенно...
Спасибо ) Буду секунды хранить...
через конфигуратор задач вызывать
Цель - достигается
выскажу свое "фи" по поводу использования blink'a для счетчика часов - при его использовании за каждый период счета посчитанное время расходится с реальным на 2 цикла плк. к примеру если цикл плк у вас 5мс, то при счете секунд будет расхождение на 10мс за секунду. на дистанции использования нескольких лет итоговое расхождение будет уже внушительным. хотя кому-то не важно.
я делал счетчик другим способом (исходя из того, что мой плк уж точно не проработает более 49 суток без выключения):
VAR
metronom: DWORD;
tmr_Ah: TON := (PT := t#49d);
END_VAR
VAR RETAIN
counter : dword; (* секунды наработки *)
END_VAR
tmr_Ah(in := переменная_power_status_из_модуля_статистики);
IF metronom < (TIME_TO_DWORD(tmr_Ah.ET) / 1000) THEN
metronom := (TIME_TO_DWORD(tmr_Ah.ET) / 1000);
counter := counter + 1;
end_if;
использования blink'a для счетчика часов - при его использовании за каждый период счета посчитанное время расходится с реальным на 2 цикла плк.
Ну может расхождение в 1% не так критично как десятки % в п#538 ?
Мой обычный рабочий вариант
t( in := true, pt := t#1s ); (*тон*)
if t.q then
t( in := false ); (*перезапуск в этом же цикле );
t( in := true );
sec := sec + 1; (*ретайн*)
end_if
Конечно же цикл кратен секунде (1,2,4 мs)
опять же кому как нравится. мне хватило того, что за десять минут у меня расхождение таймера и блинка с периодом в секунду достигло 10 секунд. в моем понимании вопрос в том, зачем использовать неточный вариант при наличии точного, который не сложнее по реализации.
Да понятно всё. Вместо power_status в in пихаем соотв. выход
Не наработка же ПЛК интересует :)
skodafelicia
26.01.2012, 08:49
это Вы все еще про наработку разговоры говорите, а как паузы во время процесса реализуете, а то вопроситель как бы упомянул о программных включениях и выключениях
С этим как раз все понятно...
По поводу точности: у уважаемого swerder-а тоже есть ограничение в 49 суток (только не понял и хотелось-бы уточнить: работы ПЛК или тех. процесса?).
А что скажете о точности при вызове процедуры счета из конфигуратора задач?
Лично в моем случае (задача по сути сбор статистики и отработка аварийных ситуаций для дробильной установки) работа самого техпроцесса даже в теории не более 12 часов, но в принципе при определенных условиях думаю 49 суток без потери питания тоже теоретически возможно. И потеря 1,5% в моем варианте не столь критично. Да и если стабильное отклонение в 2 цикла, то при определенном времени цикла можно минимизировать эти потери, сделав блинк не 500мс, а рассчитать нужный... даже программно.
Да и часы реального времени в ПЛК тоже вроде не блещут точностью ))
Функция TIME() возвращает время в миллисекундах от начала работы системы в формате TIME (работы ПЛК)
Максимальное значение длительности: t#49d17h2m47s295ms
Выполните такое преобразование TIME_TO_DWORD(T#49d17h2m47s295ms); и сравните с верхним пределом из таблицы элементарных типов данных у DWORD
есть ограничение в 49 суток (только не понял и хотелось-бы уточнить: работы ПЛК или тех. процесса?).
49 суток это ограничение работы самого таймера, через время pt := t#49d таймер остановится. прекратится счет наработки. у меня даже теоретически станок не проработает столько без выключения, поэтому над другими решениями голову не ломал, хотя способ Валенка вроде бы лишен этого ограничения.
над другими решениями голову не ломал, .
Нормально. Перезапуск по Q и обнуление metronom - это же делает и передергивание питания
PT можно поставить любое - хоть 1 день
Добрый день.
Может кто подскажет как сконектить ПЛК110-30М с LECTUS по TCP/IP
Заранее благодарен.
skodafelicia
26.01.2012, 15:45
над другими решениями голову не ломал, .
Я решил поломать )
Во вложении - результат
stat_count вызывается из основной программы, stat1 - раз в секунду из конфигуратора задач
q1 - q4 - отклонения...
В ПЛК крутится небольшая программка: опрос пары датчиков температур по 485 с МВА, вывод на ИП320 + моргание парой выходов
Какое решение использовать - решать Вам ) Думаю вполне все нормально считают. Кстати, в эмуляторе расхождения были на порядок больше даже уже за пять минут, только решение swerder-а показывало нулевое отклонение...
Swerder - 1 место !!!
Насчет эмулятора - у него цикл 50..70мс и нестабильный, средняя ошибка в полцикла - 2-3%
И любопытно - какой minlengthcycle, и что показывает про длительность цикла statistic при обмене по 485 ? :)
skodafelicia
26.01.2012, 16:18
Перегрузка - из-за процедуры stat_count
b_gennady
26.01.2012, 16:47
Непонятно работа оператора JMPC. Простой пример: при наличие true на входе DI1, y=true, x=false. При DI1=false, наоборот. У меня всегда х=true, y=false. В чем ошибка?
skodafelicia молодец! :) теория, подкрепленная экспериментом уже правило.
Swerder - 1 место !!!
Ура!
skodafelicia
27.01.2012, 08:05
И любопытно - какой minlengthcycle, и что показывает про длительность цикла statistic при обмене по 485 ? :)
Кстати, забыл уточнить - опрос ДТ по 485 раз в 0,5 сек )) Длительность цикла прыгала 10-12...
Всем доброго вечера!
Подскажите, пожалуйста, библиотека PID_reg2 применима только для контроллеров ПЛК 63, 73, 410? У меня в наличии ПЛК160..., получается, что эта библиотека не подходит?
Николаев Андрей
02.02.2012, 10:30
Подходит для всех ПЛК
Данная библиотека работает только на ПЛК63 и ПЛК73. Что в явном виде отображено в документах, описывающих работу с данной библиотекой.
anatolys
02.02.2012, 18:14
доброго вечера.
в поиск ходил, не нашел. контроллер ПЛК-110-60, пишу под него программу, столкнулся с такой штукой. пишем вот так:
PROGRAM PLC_PRG
VAR
tp1:TP;
tp2:TP;
END_VAR
tp1(in:=start, pt:=t#4s);
ek1:=tp1.Q;
tp2(in:=stop, pt:=t#4s);
ek1:=tp2.Q;
start и stop - два аппаратных входа DI1 и DI2, ek1 - аппаратный выход, скажем, DO5. в конфгурации ПЛК определены.
как я себе представляю логику работы:
подаю на один из входов единицу, запускается таймер TP, перещелкивает аппаратный выход в 1 на заданное время, потом возвращает выход обратно в 0.
соответственно, от второго входа реакция должна быть та же самая, только вход другой.
что происходит:
железом отрабатывается только вторая часть программы. выход щелкает только при появлении 1 на входе stop. после того, как таймер свое отработал, я подаю 1 на вход start, это приводит к срабатыванию таймера. кодесис в режиме онлайн показывает мне, как выход первого таймера сработал, но при этом аппаратный выход не срабатывает. попытка вручную включить выход в конфигурации ПЛК приводит к тому, что что-то упорно держит его в нуле и не хочет отпускать.
вопрос: что держит выход в нуле, что я делаю не так, и как избежать подобного рода вещей в будущем ?
доброго вечера.
вопрос: что держит выход в нуле, что я делаю не так, и как избежать подобного рода вещей в будущем ?
Ошибка Ваша в том, что в конце программы у Вас опять повторяется строка с присвоением:
ek1:=tp2.Q;
И, когда Вы пытаетесь первым TP присвоить значение на выход, ПЛК доходит до последней строки, но там TP2 ещё не срабатывал и присваивает на выход FALSE.
Программа примерно должна выглядеть так:
tp1(IN:=start , PT:= t#4s, );
tp2(in:=stop, pt:=t#4s);
ek1:=tp1.Q OR tp2.Q;
В этом случае, выходу присвоится значение TRUE при срабатывании ТР1 ИЛИ ТР2.
anatolys
02.02.2012, 20:16
Ошибка Ваша в том, что в конце программы у Вас опять повторяется строка с присвоением:
ek1:=tp2.Q;
И, когда Вы пытаетесь первым TP присвоить значение на выход, ПЛК доходит до последней строки, но там TP2 ещё не срабатывал и присваивает на выход FALSE.
спасибо большое, пример сработал.
возвращаясь к реальной жизни: выходов таких более десятка, включаются они одним и тем же образом. для их включения, чтобы не писать лишнего, я вынес конструкцию с TP в отдельный функциональный блок и вызываю его по мере необходимости. получается, что, если вызов этого блока определен в программе не один раз, то выходы все равно зависают в нуле. наверняка есть какое-то более изящное решение, чем переписывать всю программу, выкинув из нее этот функциональный блок и описав включение каждого выхода через TP с помощью кучи OR ?
anatolys
02.02.2012, 20:38
вот они, куски кода. блок на ST. то, откуда он множественно вызывается, на CFC, и в остальной части программы таких вызовов блока много. как, кстати, правильно сбрасывать TP, и правильно ли я понимаю, что, написав необходимое количество блоков с вызовами TP, я в конце каждого блока этот таймер сбрасываю, и тогда оно начинаетработать, как надо ?
anatolys
02.02.2012, 21:02
я только начинаю, по большому счету, осваивать ПЛК, не всегда еще понимаю логику его работы. мне почему-то подумалось, что, если я смогу привести вырожденный пример, то это не будет сильно отличаться от того, что есть на самом деле. я о том, что я получил одинаковый эффект от двух несколько разны, получается, действий и, исходя из этого, неверно сформулировал вопрос. тогда переформулирую: как один и тот же блок с TP использовать несколько раз так, чтобы работа одного экземпляра не оказывала влияния на другой ?
скрин получился поганый, ограничения на размер картинки. переделал.
тогда переформулирую: как один и тот же блок с TP использовать несколько раз так, чтобы работа одного экземпляра не оказывала влияния на другой ?
Вот так и использовать, как Вы в скрине и показали.
У Вас создан функциональный блок ТР, но в основной программе Вы его вызываете под разными именами: VS3 и VS4.
Следовательно, это два различных экземпляра, которые не оказывают никакого влияния друг на друга.
Созданный Вами функциональный блок, фактически ничем не отличается от созданных программистами CoDeSys (или кем-то ещё) ФБ: TP, BLINK, RS, F_TRIG и.т.д.
И, когда Вы вызываете несколько одинаковых этих ФБ, но под разными именами, - у Вас ведь не возникает опасения, что эти ФБ будут как-то влиять друг на друга?
Главное помнить, что программа выполняется ПЛК не мгновенно.
А - слева направо, сверху вниз, к тому же циклично.
И, в первом Вашем примере,вначале ek1 был присвоен результат TRUE - при срабатывании TP1, но программа выполняется слишком быстро и Вы просто не успели этого заметить, потому что, когда выполнение программы дошло до строки в конце, где присваивается значение выхода TP2 ТОЙ ЖЕ переменной ek1, ей и было изменено значение из TRUE в FALSE, так как ТР2 не сработал и его выход имел значение FALSE.
Данная библиотека работает только на ПЛК63 и ПЛК73. Что в явном виде отображено в документах, описывающих работу с данной библиотекой.Зачем она тогда в комплекте поставки ПЛК110 :) Попробовал PID на ПЛК110, компилируется но не заливается, пишет неразрешенные ссылки на внешние POU. Возникает только вопрос: зачем вы эту библиотеку в поставку 110 включаете и в документации на библиотеку пишете:
Примечание. Значения Y_PLUS и Y_MINUS можно передавать на дискретный выход ПЛК, используя модуль PLC_Configuration PWM, для чего Y_PLUS приведен к значениям 0…65535, а Y_MINUS к значениям 65535…0 На ПЛК63/73 нет PWM.
anatolys
03.02.2012, 15:38
в целом Ваш код работает, если он конечно соответствует заданию
к сожалению, он не работает, не могу понять, почему. в аттаче - полный проект с этой проблемой. в нем есть вход ek1mo, и выход ek1. сначала я вызываю один экзмепляр блока vs в plc_prg, и потом вызываю еще несколько экземпляров vs из другого блока. при этом, ek1 в plc_prg не отрабатывает. перенесение его в другой блок результата не дает. вопрос, что я делаю не так.
anatolys
03.02.2012, 16:10
да, точно. код во вложении сообщением выше не работает, если один из выходов используется более одного раза. не могу понять.
anatolys
03.02.2012, 17:45
применительно к выложенному проекту.
цикл включения:
по входу start срабатывает выход ek1 и, если sens2 активен, срабатывает выход gen_kisl. через промежуток времени включаются выходы pump, gen_ozon и куча ek. ek - это электроклапана с трехпроводным управлением, один открытие, другой закрытие, третий - общий. функциональный блок vs используется для того, чтобы замкать выход на время, необходимое для полного открытия этого клапана. при этом, клапан ek1 можно открывать отдельной кнопкой ek1mo с ипользованием того же ФБ vs, внутри которого TP. так сделано просто чтобы меньше места занимало. семафоры там для удержания выходов gen_kisl, gen_ozon и pump в активном состоянии.
цикл выключения: по входу stop сначала срабатывает выход voc, который тоже такой же электроклапан, через промежуток времени срабатывают выходы, управляющие закрытием всей открытой ранее кучи клапанов - вся куча с буквой "c" на конце, сбрасываются поднятые ранее семафоры.
по большому счету, без семафоров можно обойтись, set/reset там тоже отлично работало. просто решил так.
пробовал заменить TP на TON/TOF, результат точно такой же, выходы висят в нулях.
anatolys
03.02.2012, 18:18
это уже попытка сбросить выход этого TP. не помогло, кстати... :) первоначально ее не было. если ее убрать, отрабатывает всё, кроме связки ek1mo-vs-ek1 в plc_prg. если убрать из блока on_off упоминание ek1, связка начинает работать.
anatolys
03.02.2012, 18:37
на отдых еще два дня впереди... :)
Вы попробовали убрасть R из vs, загрузить это в контроллер и посмотреть, что получится ? и оно заработало ? но КАК ? потому что то, что вижу я, выглядит так: вход отрабатывается, vs отрабатывается, а вот ek1 - нет. см. вложение.
skodafelicia
05.02.2012, 01:20
Библиотека oscat.de, функциональный блок ONTIME, наработка в секундах с программным включением и подсчетом количества этих включений, проблема 49 суток не влияет
К сведению, появилось обновление библиотеки OSCAT до версии 3.33
Спасибо за подсказку, библиотека такая стоит, брожу по ней, изучу данный блок поподробней...
Polina_kazan
06.02.2012, 09:14
Здравствуйте! Подскажите пожалуйста решение проблемы! Есть ПЛК100, к нему по RS-485 подключены модули МВА8 и МВУ8. В контроллере простинькая программа опроса входов и установки выходов. При пропадания питания на ПЛК, и последующего появления, контроллер перестает опрашивать модули ввода\вывода. Нажатия кнопки старт\стоп на контроллере ни к чему не приводят(((.
lara197a
06.02.2012, 09:23
Онлайн-подключение-создание загрузочного проекта-старт.
skodafelicia
06.02.2012, 23:19
http://www.owen.ru/forum/showpost.php?p=67095&postcount=225
b_gennady
16.02.2012, 11:22
Как обнулить таймер? Этот блок вызывается из программы несколько раз.
VAR
var1,var2:BOOL;
TON1:TON
END_VAR
var1:=1;
TON1(IN:=var1,PT:=T#20s,Q=>var2);
IF TON1.Q=1 THEN var1:=0
Переменная Q после первого прохода таймера остается в единице. Как перевести ее в 0.
Ruslan85
22.02.2012, 15:49
Всем Привет! подскажите пожалуйста как исследовать FB hysteresis и др. аналоговые преобразователи FB? заранее спасибо!
Ruslan85
22.02.2012, 16:15
Я совсем новичок в CoDesys пишу программу на языке LD для управления газовым нагревателям.Хочу пока отработать её без ПЛК. У нагревателя идёт регулирование температуры и давления на входе продукта и др. аналоговые сигналы. Затрудняюсь с программированием на языке LD аналоговых сигналов.
Ruslan85
22.02.2012, 16:37
да блок который будет эмулировать температуру
LD - ИМХО мазохизм и пережиток прошлого. Пиши на ST и будет счастье.
Ruslan85
24.02.2012, 14:09
ST конечно хорошо! наслышан, но у меня нет книг по изучению st, а в библиотеке кодесис описание его мне как новичку не хватает.
Ruslan85
24.02.2012, 14:32
очень интересные авторы И.Г. Минаев, Самойленко В.В. всё понятно всё доступно, но они описывают LD. Есть ли подобная литература где описан ST, SFC и CFC?
sv.vasilev
07.03.2012, 04:48
Здравствуйте, недавно получили ПЛК 150 I-M и модули МВ110-8А и МВ110-16Д для тестирования. Проблема возникла при подключении модулей. Индикации RS485 нет, делал все по инструкции подключения к ПЛК, при подключении выдает ошибку #2000:2000.1.6 19:14:17 # 1 PLC STARTED. Что это за ошибка в документации я не нашел, в чем может быть проблема?
И еще для чего нужны перемычки (переключатели) на лицевой стороне модуля? описания в предоставленной документации тоже нет.
при подключении выдает ошибку #2000:2000.1.6 19:14:17 # 1 PLC STARTED. Что это за ошибка в документации я не нашел, в чем может быть проблема?А где там написано, что это ошибка? Просто сообщение.
Покажите свой пробный проект и снимок окна конфигуратора МВ с сетевыми настройками модуля.
удивительно, но в файлах РЭ_МВ110-16Д(ДН)_881.pdf и РЭ_МВ110-224 8А_984.pdf все довольно подробно расписано про перемычки. страницы 33 и 50 соответственно
Дмитрий Громов
07.03.2012, 12:12
Ламерский вопрос, но что-то аж разозлился от своего непонимания... Есть задача настройки пм01 и плк100, вообщем-то прошлый раз я реализовал почти всё что хотел при помощи примеров и так далее, но я делал это вслепую, я никак не могу нигде найти и нигде прочитать как мне работать с модемом прям из кодесис? читал "Прослушиваю связь между модемом и контроллером вижу строку ...." а как люди это делают? где писать посылаемые команды, где видеть принимаемые? я хочу во всём разобраться и написать свой работающий пример. В конечном счёте мне нужно, чтобы при звонке с мобильного на номер модема - он бросал трубку и на этот номер отвечал смс с текстом, а так же на него слал аварийные сообщения...
В конечном счёте мне нужно, чтобы при звонке с мобильного на номер модема - он бросал трубку и на этот номер отвечал смс с текстом, а так же на него слал аварийные сообщения...
При входящем звонке модем в порт ПЛКххх выдает комбинацию символов "RING". Так вот как только это увидите на входе в порт делайте то что Вам нужно :-)
Здравствуйте)) программировал на С, там можно обращаться к переменой через ее адрес (с помощью указателей), сохранять адрес, также к адресу можно было прибавлять целые числа.
мне в программе надо управлять несколькими двигателями, можно ли обращаться к модулю в конфигураторе непосредственно через адрес?, так же прибавив к этому адресу число и обращаешься к следующему модулю.
lara197a
10.03.2012, 22:44
В ПЛК все проще и ближе к людям. Можно и по адресам, но удобнее символьная адресация. Компилятор всё сделает за Вас.
так же прибавив к этому адресу число и обращаешься к следующему модулюОпасно. Память выделяете не вы и это не массив, а потому нельзя полагаться на то, что структуры лежат стык-в-стык.
Я сам плюсишник, но в ST решил особо не фокусничать. В основном проекте у меня через указатели только несколько экземпляров однотипных функциональных блоков адресуются.
Друзья, помогите разобраться с task configuration. В PLC_PRG вызываю прочие pou, например valves(); sensors();
Pou много, вызываются один за другим, все работает как надо. Переношу их в task configuration, в той же последовательности вызываю. Программа начинает работать некорректно, как будто pou не выполняются. В task configuration стоит циклический вызов 50 мс. Используя freewheeling ничего не меняется. Вообще объясните тупому в каких ситуациях рекомендуется использовать cycle а когда freewheeling? Как вообще грамотно работать с task configuration? Буду очень всем откликнувшимся благодарен.
Николаев Андрей
12.03.2012, 14:58
cycle - вызывается с заданной частотой.
freewheeling - вызывается когда у ПЛК есть свободное время. Если времени нет - не вызывается :)
При подключении в TaskConfiguration PLC_PRG перестает быть программой по умолчанию.
Работа с данным инструментом очень хорошо описана в мануале по CoDeSys и в справке.
Warning 2501: A callback function is not allowed to contain local variables.Вай из ит соу?
Дмитрий Громов
14.03.2012, 08:40
При входящем звонке модем в порт ПЛКххх выдает комбинацию символов "RING". Так вот как только это увидите на входе в порт делайте то что Вам нужно :-)
Клаасно что он выдаёт комбинацию символов, но где посмотреть её в какую переменную забивать АТ команды?
sv.vasilev
14.03.2012, 09:36
А где там написано, что это ошибка? Просто сообщение.
Покажите свой пробный проект и снимок окна конфигуратора МВ с сетевыми настройками модуля.
скрин:5706
проект: 5707
И что означает сообщение "1PLC STARTED"
Где можно смотерть расшифровку системных сообщений и ошибок?
что означает сообщение "1PLC STARTED"Включение ПЛК (но не запуск программы).
Ошибок в конфигурации у вас я не нашёл.
sv.vasilev
14.03.2012, 13:02
Включение ПЛК (но не запуск программы).
Ошибок в конфигурации у вас я не нашёл.
Какой должен быть Register address применительно для модуля МВ110-224.8А, на 1-ом канале?
vooodooo22
15.03.2012, 13:05
Доброго всем суток времени.
Вот хотел поинтересоваться в правильном ли я направлении двигаюсь. дабы изучать ПЛК стал только пару недель назад. В электротехнике не шарю, скажу сразу =) но общее представление имею. Изучил основу CoDeSys (но блоки пока не все разобрал, только основные)
На новой работе дали задание изучить область Программируемых логических контроллеров для внедрения в Автоматическую линию контактной сварки. ПЛК будет выполнять роль РКС (регулятор контактной сварки).
Приглянулся нам ОВЕН ПЛК160
Программировать будем в CoDeSys v2.3.
Использую пока FBD, дабы более наглядный язык для новичка незнающего электротехнику
Таргет-файл использую 3S CoDeSes SP RTE с "виртуальным устройством ПЛК"(если можно так сказать, другими словами незнаю как назвать) OEMs:CoDeSys SP RTE Realtime Runtime System For Windows NT/2000/XP, т.к. для Таргет-файла PLC160 "виртуального ПЛК-симулятора" не нашел.
Итог:
•ПЛК (симулятор) - OEM:CoDeSys SP RTE Realtime Runtime System For Windows NT/2000/XP
•Среда - CoDeSys v2.3.
•Язык - FBD
•Таргет-файл - 3S CoDeSes SP RTE
Набросал такую вот программку для подачи сигнала с одного входа "VarBOOL1" на 4 выхода "VarQ1,VarQ2,VarQ3,VarQ4" поочередно ("беглый огонь"), т.е. после подачи сигнала (TRUE) на вход на каждый выход подается секундный импульс поочередно (сначала загарается/гаснет VarQ1 на 1 сек, потом VarQ2 на 1 сек и т.д.) и все это заключено в бесконечный цикл (VarQ4 := VarBOOL1). Цикл тут для наглядности примера, в реале удалю. Все работает как часы.
http://www.cyberforum.ru/attachment.php?attachmentid=134194&d=1331726318
http://www.cyberforum.ru/attachment.php?attachmentid=134194&d=1331726318
2 вопроса:
•Будет ли это работать именно так как задумано (с одного входа на 4 выхода) при подключении ОВЕН ПЛК 160, конечно используя таргет-файл PLC160?
•Существуют ли "виртуальные ПЛК-симуляторы" различных моделей (например ПЛК 160) или они существенно ни чем не отличаются от предложенного 3S CoDeSes SP RTE поэтому и не были созданы?
если вам "симулятор" нужен только для отладки программы, то ставьте таргет для плк, а в кодесисе "онлайн-режим эмуляции"
Будет ли это работать именно так как задумано (с одного входа на 4 выхода) при подключении ОВЕН ПЛК 160, конечно используя таргет-файл PLC160?Скорее всего будет, но я бы не смог спокойно спать, увидев подобный код на объекте, т.к. вы полагаетесь на то, что таймеры работают идеально точно и остаются синхронизированными друг с другом. На всякий случай я бы сделал по крайней мере так: http://images.devs-on.net/Image/pzmyCJ6KurTqIZQg-CoDeSysUntitled.png
И на ST, как правило, лаконичнее получается:
i := TIME_TO_DWORD(TIME()) / 1000 MOD 4;
L1 := i = 0;
L2 := i = 1;
L3 := i = 2;
L4 := i = 3;Так что рекомендую учить именно его.
oops Забыл про разрешающий вход.
А так нагляднее
Попробуйте только L3 задержать на 3с :)
vooodooo22
16.03.2012, 09:48
<pre class="alt2" style="margin:0px; padding:6px; border:1px inset; width:640px; height:98px; overflow:auto"><div dir="ltr" style="text-align:left;">i := TIME_TO_DWORD(TIME()) / 1000 MOD 4;
L1 := i = 0;
L2 := i = 1;
L3 := i = 2;
L4 := i = 3;</div></pre>
Подскажите пожалуйста, как работает TIME_TO_DWORD(TIME())?
Какую переменную получает DIV от TIME_TO_DWORD(TIME()) в варианте с FBD?
Справочник CoDeSys дает не полное описание "TIME_TO/TIME_OF_DAY преобразования" :(
хватит примерно на 49 сутокВ данном примере хватит на сколько угодно, т.к. переполнение идёт через кратную четырём величину.
vooodooo22
16.03.2012, 13:44
конкретно TIME_TO_DWORD переводит значение времени в миллисекунды в диапазоне типа данных DWORD, что хватит примерно на 49 суток
А по поводу 2-го вопроса:
•Какую переменную получает DIV от TIME_TO_DWORD(TIME()) в варианте с FBD конкретно в данном случае? Чтобы до конца понять.
В этом примере:
i := TIME_TO_DWORD(TIME()) / 1000 MOD 4;
(*1000 должна же делиться на конкретную переменную*)
Простите конешно если задаю глупые воросы, но спросить не у кого :confused:
У него в новой теме (http://www.owen.ru/forum/showthread.php?t=12293) все условия для лампочек поменялись.
И там тоже можно на ST в четыре строки уложить :). Но на фига козе баян после каждого изменения хотелок.
см. пост #616
vooodooo22
16.03.2012, 18:39
У него в новой теме (http://www.owen.ru/forum/showthread.php?t=12293) все условия для лампочек поменялись.
И там тоже можно на ST в четыре строки уложить :). Но на фига козе баян после каждого изменения хотелок.
см. пост #616
Все с чего-то начинали :)
вапросик
19.03.2012, 13:41
день добрый,форумяне!
скачал из раздела "Библиотеки для контроллеров ОВЕН ПЛК110/160 (Навигатор ПЛК110/160 версия 6)"
библиотеку ModBus.lib - но в описании на эту библиотеку написано:
Библиотека предназначена для работы (чтение/запись) с параметрами устройств через последовательный интерфейс ПЛК 63 стандартного протокола Mobdus.
Возможно так же применение данной библиотеки для других приборов на основе CoDeSys.
так пригодна эта библиотека именно на ПЛК-110/160?
Здравствуйте Вопросик
в описании на эту библиотеку написано:
Библиотека предназначена для работы (чтение/запись) с параметрами устройств через последовательный интерфейс ПЛК 63 стандартного протокола Mobdus.
Возможно так же применение данной библиотеки для других приборов на основе CoDeSys.
так пригодна эта библиотека именно на ПЛК-110/160?
Да работает. + и на ПЛК100/15х
как запрограммировать на языке st кнопку пуска с самофиксацией file:///F:/%D0%A1%D0%A5%D0%95%D0%9C%D0%90%20%D0%9B%D0%94.jpg
Что за кнопка пуска такая, которая ST поддерживает? :) А если серьёзно, скажите хоть, что там на входе. И картинку вашу тут не увидят, т.к. её надо было прикреплять к сообщению, а не вставлять локальный путь к ней прямо в текст.
Пуск:=Пуск OR НажатоА отключать как?
file:///F:/%D0%A1%D0%A5%D0%95%D0%9C%D0%90%20%D0%9B%D0%94.jpg
КАК КАРТИНКУ ЭТУ ПИКРЕПЛЯТЬ
5762 ЕСЛИ МОЖНО ТО ПЕРЕЧИСЛИТЕ ПОЖАЛУЙСТА СПИСОК ЛИТЕРАТУРЫ ПО ПРОРАММИРОВАНИЮ НА ST
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot