В нижнем окне каком ? никакого списка именно неиспользуемых переменных нигде не отображается.
Может не туда смотрю ?
О, почему-то не сразу отобразилось, теперь есть. Спасибо.
Вид для печати
В нижнем окне каком ? никакого списка именно неиспользуемых переменных нигде не отображается.
Может не туда смотрю ?
О, почему-то не сразу отобразилось, теперь есть. Спасибо.
Очень интересно, были CTUD и работали, потом перестали работать при этом при компиляции никаких ошибок ? :(
Вопрос на засыпку, почему входной параметр CTU счетчика PV - WORD, а при вводе значения 65535 выход счетчика Q переводится в 1 ?
при вводе 32767 (15 бит) он еще 0, при вводе 32768 (16 бит) уже 1.
Сам параметр WORD имеет значение от 0 до 65535 - как так?
Подскажите, есть 32-х битный счетчик в CodeSys ?
Так же заметил на операциях сравнения. <, > и т.д. По HELP указано, что значения могут быть WORD, DWORD, DINT и т.д. по факту DWORD не работает, как только в верхнем разряде появляется 1, то < или другой оператор срабатывает.
Валенок попробуйте сравнить явный dword#4294967295 c с числом немного меньшим, например dword#4294967290 и посмотрите на выходы блоков сравнения. Либо вставьте в таймер word#65535 и посмотрите на выход QU заодно прочтите в справке, что должно быть на выходе QU...
Обломс, справка не соответствует действительности.
Куда уж явнее, если в объявлении переменных я указываю например tm1:DWORD;
подскажите пожалуйста, что значит сообщение об ошибке, появляющееся в процессе заливки проекта с текстом: неразрешенные ссылки на внешние POU. И дальше приводятся 2 POU один из которых является ФБ одной из подключенных библиотек, а второй я вообще не знаю откуда он взял. Ни одно из наименований в проекте не используется. Использую ПЛК100-РМ
проблема решена. прошу прощения за беспокойство
не могу открыть сокет биб-кой syslibsockets.
пишу
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
и ф-ия возвращает -1, т.е. что сокет открыт неудачно. Непойму что я сделал не так. У кого есть опыт работы с этой биб-кой, пните в нужную сторону плиз.
Ни разу неиспользовал эти счетчики. Зачем ?
Посмотрел. Сделал вывод - внутри работа со знаковыми (int'ами) Типа jge вместо jae. Плакать ?
Валенок со сравнением возможно ошибся (может в прошлый раз забыл явно указать тип) или на EQ так действует, не помню, меня больше счетчики интересовали в тот момент.
А вот счетчики удивляют. pv1 и pv2 заданы в явном виде pv1:WORD:=ххххх
А выход не соответствует документации, проверьте в режиме ST, а то мне проще CFC использовать.
http://www.owen.ru/forum/attachment....1&d=1365168632
Не плакать, а как-то донести разработчикам, что документация не соответствует работе ПО.
p.s. там ошибочка, сям ошибочка, и однажды кого-нибудь перепилит на станке :)
.именно по этому в ответственных местах не использую откуда-то блоки- а сам их делаю.Цитата:
там ошибочка, сям ошибочка, и однажды кого-нибудь перепилит на станке
Валенок похвально, но странно, что с некоторыми элементами такое происходит. Или вы и ADD сами пишите и т.д. элементарные блоки ?
При попытке после ADD поставить dint_to_dword получаем ошибку, говорящую о том, что переменная таки dword.
http://www.owen.ru/forum/attachment....1&d=1365171113
И что значит откуда-то ? большая их часть вшита в CodeSys
УПС, эту ошибку я исправил, тут действительно смешивались на SEL разные типы данных bool и dword и из-за этого сравнение давало ошибку.
Валенок я уже исправил эту программу, там на сел попадал bool, преобразовал и все заработало правильно.
Жалко что пришлось все это писать самому, когда есть счетчики, на которых это делается в несколько раз быстрее. Просто сам факт удивил, что заявлены 16 битные счетчики, а на все 16-ть не работают.
Ну вот по миниатюре. Рекомендую порядок исполнения сделать в "соответствии с потоком". Тут бывают нюансы.
ADD(33) а SEL(35), хотя выход с SEL идет в ADD и тд..
Переезжаешь ?
А мы бы и хатку под искали;) :D :)
Помогите пожалуйста найти описание ПИД регулятора(если оно конечно есть) из библиотеки Util.lib
1. Стандартная справка, там есть описание ПОУ библиотеки util.lib
2. Как известно, лучшим описанием языка программирования является транслятор с него. Поэтому откройте сам файл библиотеки в КДС, изучите ПОУ PID, он написан на ST.
конфигуратор
Господа подскажите речь идет о ПЛК160. В чем разница если я буду опрашивать периферийные устройства через конфигурацию ПЛК или через библиотеки SYS
Для начала расскажите что именно собрались опрашивать, как часто и в каком объёме.
Опрашивать буду по 485 мэ110 3шт. Мв110-8а 1шт. Мсд200 1 шт. ПЧ 1шт.
По обьему не скажу ну около 50 Переменных разного типа.
По 232 панель оператора, Обьем я думаю не меньше.
Библиотеки мне помогали когда я капризный Мерадат опрашивал. А один коллега обнаружил, что с конфигуратором при больших объёмах иногда съезжают регистры на один влева или вправо. С другой стороны, когда весь модбас определён в конфигураторе, программа не замусоривается всякой фигнёй, которая к задаче управления отношения не имеет. Так что попробуйте сначала в конфигурации сделать, и если что-то не понравится, переедете на библиотеки.
Можно было бы сказать, что в библах вы сами запросы формируете и определяете моменты передачи, но в конфигурации момент тоже определять можно (режим передачи по команде), а запросы вручную формировать особого смысла нет — зачем то же самое вручную считать?
Спасибо. Попробую.
Ставил ли кто-нибудь Codesys на windows 8 x64? Вроде бы поставилось нормально, но среда не видит gateway. При попытке подключения к контроллеру выдается ошибка "Не возможно подключиться к удаленному шлюзу".
При входе в параметры связи система долго думает (видимо сетевой таймаут) и выдает "No gateway with the given settings could be found!"
Firewall отключен.
Сам себе и отвечу (может кому пригодится). Проблема была во встроенном антивирусе "Windows Defender". Причем просто добавить папку Codesys в исключения не помогло. Пришлось все снести, отключить защитника, переустановить Codesys и вроде бы пошло.
Ручками я поудалял, что не используется. Но остался огромный перечень VAR CONSTANT "переменных", как глобальных. так и объявленных в разных POU. Выбрасывать их низзя, ибожеж используются! Но почему-то упорно выдаются мне в списке неиспользуемых.
К чему бы это? Мож погода изменится?
Доброе утро. Не могу найти ответа на свой вопрос. Есть несколько устройств. ТРМ202, два модема ПМ01, и комп с Lectus. Через гипертерминал к модемам подключаюсь свободно, никаких проблем. Но никак не могу подключиться к модему через лектус и передать данные с ТРМ202 по CSD. Настройки портов перепроверял. Лектус пишет "Нет связи с устройством". Модем+ТРМ202: модем настроен на автоподъём трубки. Не пойму где я ошибся.
Подключите оба модема к ПК, свяжитесь с ними через два гипертерминала и прозвонитесь с одного на другой. Номер телефона в команде ATD нужно записать без точки с запятой - это звонок в режиме передачи данных. С точкой с запятой - это голосовой звонок. Если услуга передачи данных и факсов открыта на ваших симках, то модемы должны соединиться в режиме передачи данных и вы увидите строку Connect 9600 или что-то в этом роде. если услуга не разрешена, соединение не установится. Если все ОК, можете с клавиатуры черкнуть пару строк самому себе и увидеть, как они просквозят эфир и нарисуются на втором гипертерминале.
Здравствуйте, подскажите пожалуйста:
Запрограмировал ПЛК100, использовал SFC. Первый шаг программы, устанавливает систему в исходное состояние, и после ресета ПЛК стартует с этого шага. НО рабочий шаг, это 2. И программа после цикла возвращается на этот шаг (т.е. к 1 шагу больше не обращается).
Если выключаю питание ПЛК, то программа стартует (как я понимаю) с последнего рабочего шага (это 2 шаг), и получатеся что система не устанавливается в исходное состояние.
Вопрос: каким образом можно сделать так чтобы, при включении после потреи питания, ПЛК стартовал с начала (1 шага) программы, а не с последнего активного?
По поводуЭто результат глупости разработчиков ПЛК! ПЛК продолжает работать на аккумуляторе при обесточенном оборудовании, и если он находился в шаге 2(или любом другом), то там и остается, а не стартует с этого шага.Цитата:
Если выключаю питание ПЛК, то программа стартует (как я понимаю) с последнего рабочего шага (это 2 шаг), и получатеся что система не устанавливается в исходное состояние.
В любом случае нужно добавить в конфигурацию модуль Statistic.
В нем есть бит Power status. Присвоить ему имя, например PWR.
А дальше в зависимости от того, как сделана программа.
1. Ваша SFC это главная программа - PLC_PRG.
В этом случае добавляете ко всем шагам условие перехода "NOT PWR" (он должен быть самым левым) на начальный шаг (Init).
2. Ваша SFC вызывается из другой программы, например из PLC_PRG.
В этом случае или по варианту 1 или используйте Флаги SFC
А) или SFCInit:Б) или SFCReset:Цитата:
Переменная типа BOOL. Когда переменная получает значение ИСТИНА, программа переходит на шаг Init и все SFC флаги сбрасываются. Шаг Init становится активным, но не выполняется, пока переменная имеет значение ИСТИНА. Как только SFCInit примет значение ЛОЖЬ, выполнение программы продолжится
В раздел входных переменных SFC программы нужно добавить объявлениеЦитата:
Переменная типа BOOL. Работает подобно SFCInit. Но приостановка выполнения происходит после шага инициализации Init. Поэтому флаг SFCReset можно сбросить в самом шаге Init.
SFCInit : BOOL;
или
SFCReset:BOOL;
Использование SFCInit
1.В PLC_PRG по условию "NOT PWR:=TRUE" устанавливаем этот флаг для соотв. программы: prg_sfc.SFCInit := TRUE; Она останавливается и переходит на Init
2.В PLC_PRG сбрасываем этот флаг по условию "PWR:=TRUE", SFC программа начинают работать сначала.
В шаге Init нужно предусмотреть соответствующую инициализацию всех важных внутренних переменных, поскольку сброс флагами SFC POU не вызывает нач. инициализацию.
Использование SFCReset
1.В PLC_PRG по условию "NOT PWR:=TRUE" устанавливаем этот флаг для соотв. программы: prg_sfc.SFCReset:= TRUE; Она останавливается и переходит на Init
2.В действии шага Init выполняется последовательность соответствующая инициализацию всех важных внутренних переменных
3. Последней строчкой выполняем сброс SFCReset:= FALSE;
Где-то так...
ЗЫ. Я думаю, что при использовании SFCInit можно сделать проще
В любом случае в основной программе есть вызов программы SFC в виде prg_sfc(). Меняем на prg_sfc(SFCInit:=NOT PWR)
Доброго времени суток! Недавно обратил свое внимание на ПЛК ОВЕН, ранее работал только с SIEMENS. При программировании возник вопрос.
В Step7 есть такое понятие как ДатаБлок (DB - все знают о чем я :) )
Вопрос в следующем - как можно (и можно ли вообще) работать с переменными и таблицами переменных в CODESYS ПЛК110? И как определить область памяти (переменные типа M, если по аналогии с сименом)? Есть ли таблица символов?
А как называется? Что в справке искать то? :)
Именно так. использую SFCReset для того, чтобы не ставить в каждом шаге проверки. Но у меня SFC - не главная, поэтому я приспособил этот флаг для "вылавливания" нажатия кнопки СТОП. Работает замечательно - где бы SFC прога ни находилась, по СТОПу срывается в ИНИТ и уж там смотрю: ага, так мы сюда попали не просто так, а по кнопке СТОП - ну и делаю чего надо.
Так что флаг SFCReset - рулез!
А вот слежение за питанием сделал (тоже на этом же форуме подсказали) через watchdog. Как только вижу пропадание питания (ну, еще полсекунды ковыряюсь в носу), тупо становлюсь в мертвую петлю, откуда watchdog таймер сорвет в сброс всю программу:
Здесь bPower_OK - именно тот бит в модуле статистики, о котором многоуважаемый коллега petera и говорит.Код:TON_Power( IN:= NOT bPower_OK, PT:=T#0.5s);
WHILE TON_Power.Q DO ; END_WHILE
Внешне это выглядит именно так, как пользователь имеет право ожидать: как только питание сорвалось, ПЛК летит в сброс. Если включить сразу же питание - мы видим нормальный старт, с инициализациями и прочим, положенным при старте.
Кому надо - можно сначала (до ухода в метрвую пелтю) выполнить те или иные действия по "безопасной" смерти программы. Ну, ради чего аккум в ПЛК и задумывался.
:) У Семена не платил и тут не охота :)