И когда могут поменяться адреса переменных?
Вид для печати
И когда могут поменяться адреса переменных?
Когда выше этих регистров в дереве конфигурации что-нибудь добавите, удалите или замените. Если быть точнее, не сами адреса изменятся, а модули конфигурации на другие адреса попадут.
Валенок ну это уже по обстоятельствам, думаю народ переживет, если восстановленный график будет не идеальным, основная задача будет выполняться со SCADA онлайн....
Доброго дня всем!
Что-то не могу никак разобраться.
Прибор МВУ8-И (ver 2.05)
ModBus-RTU 9600-8-N-1
Проект создаётся на СПК207. В целом с обменом с модулями я разобрался - сейчас работает всё как дОлжно.
Записываю в МВУ8 в регистр со смещением 0х0000 командой 16 значение 0 или 500 или 1000, но прибор на выход не выдаёт то, что должен. Выдаёт обычно 20мА.
При управлении через конфигуратор выход управляется как положено. Правда, в конфигураторе, независимо от установленного протокола, значение на ВЭ предлагается подавать в виде REAL в диапазоне от 0,0000 до 1,0000. Т.е., к примеру, записываю через конфигуратор в регистр 0х0000 значение 0,5 и на выходе получаю желанные 12 мА. Тут не понятно, какое конфигуратор отправляет в регистр значение при установленном протоколе ModBus-RTU. Может конфигуратор ВСЕГДА общается с модулем по протоколу ОВЕН??
Я уже стал эксперементировать с режимом "Авария" по тайм-ауту. Установил параметр t.out в значение 20. А для ВЭ1 установил O.ALr в значение 0. И действительно, после обрыва линии связи через 20 секунд модуль зажигает сигнал "Авария" (начиная при этом ежесекундно обращаться ко всем ВЭ), но ВЭ1, ушедший в 20мА при появлении сигнала "Авария" почему-то не переходит на 4 мА! То есть модуль не отрабатывает то, что должен?? Потом я восстанавливаю линию связи, порт перезапускается, КДС показывает в онлайне что обмен по этому слейву восстановился, через вкладку "Соотнесение входов/выходов" опять же в онлайне я вижу что в этот адрес (единственный! сконфигурёный со смещением 0х0000 и длиной 1) посылается значение 500. Но ВЭ1 опять переходит в 20 мА!!! Ёпсель-Мопсель!!!!!
... опять подключаю конфигуратор, опять убеждаюсь в который раз что всё управляется как должно ...
... в проекте конфигурю слейв на запись командой 16 со смещения 0х0000 последовательностью длиной в 8 слов, прописываю в соотнесении массив из 8 WORDов - не работает...
... конфигурю в слейве 8 каналов, каждый записываю отдельной командой и отдельной (а так же одинаковой) переменной, думая что а вдруг я адресом ошибся (хотя по лампочкам на модуле то я вижу что ни хрена не ошибся!) -- не работает!
Видать я совсем ничего не понимаю... Помогите побороть МВУ8! Что я делаю неправильно???
Коллеги, доброго времени суток!
Прошу помощи с простым вопросом...
Пытаюсь программировать ПЛК 73. Как считать состояние дискретного входа и выдать сигнал дискретного выхода?
Прошу не смеяться, до этого программировал контроллеры MITSUBISHI серии FX, и там входы обозначались Х0...Хn и выходы Y0...Yn а тут непонятно(((
RadistDog странно, почему real ? в РЭ для Modbus только int16 указан от 0 до 1000
Конфигуратор кажется и работает только по Овен протоколу
dimonbest зайдите в конфигурацию ПЛК, если вы установили таргет и обзовите входа и выхода как вам привычно.
melky, спасибо.
А вот как быть со светодиодами K1-K6?
Что значит как ? это вроде ж светодиоды выходов? включите выход, он и загорится.
Похоже что нет, вот описание:
А что такое РП я так и не нашел...Цитата:
Контроллер имеет 6 встроенных светодиодов: K1, K2, K3, K4, K5 и K6, которые
позволяют создавать специализированные программные средства сигнализации о
прохождении процесса, обеспечивающие управление светодиодами из пользова-
тельской программы. Подробнее см. раздел 7 (Подробнее об этом см. в РП).
Руководство по Программированию, находится на сайте http://www.owen.ru/uploads/re_plc73_1634.pdf
Загляните в Additional [FIX] и вы найдете там светодиоды.
И ещё, кстати, один момент - в Руководстве по эксплуатации (далее РЭ) сказано, что для непосредственного управления ВЭ по сети RS-485, в случае когда ШИМ на ВЭ не предполагается (как раз мой вариант), нужно выставить параметр tphd в НОЛЬ. А в конфигураторе можно выставить только значение 00:01. Конфигуратор вообще не считает возможным установить 0 в этом параметре (см. скриншот). Кто прав - РЭ или конфигуратор?
Вложение 12846
melky, Спасибо - помогло.
Там же разобрался как обрабатывать кнопки на панели.
Скачал библиотеку для работы с LCD - тоже разобрался.
Но есть еще вопросы. В контроллерах MITSUBISHI есть аппаратные переменные M0...M8000 типа boolean. В ОВЕН есть такие, или каждую переменную нужно объявлять? И как ее объявлять чтоб она сохраняла значение после пропадания питания?
См. несколько сообщений выше мой ответ юзеру Boris_K.Цитата:
И как ее объявлять чтоб она сохраняла значение после пропадания питания?
Здравствуйте. Хотела бы спросить у вас, знающих людей. Есть учебная задача: при нажатии кнопки пуск загорается лампа 1, горит 1 сек, гаснет, загорается лампа 2, горит 1 сек гаснет, и так 3 лампы. Затем цикл повторяется в обратную сторону. Я реализовала на CFC: из 3ех таймеров TOF и 3ех генераторов импульса F_TRIG. Пуск организовала R_TRIG далее сигнал поступает на таймер TOF (выход Q у него лампа 1), затем сигнал идет на F_TRIG, с него опять на таймер TOF (выход Q у него лампа 2).. И так для трех ламп.
Это не очень умно и хотелось бы узнать как можно сделать цикл например на ST, а в CFC обойтись 1им таймером. Возможно ли это? Спасибо.
можно с этого начатьКод:VAR_INPUT
start: BOOL;
END_VAR
VAR_OUTPUT
lamp1 : BOOL;
lamp2 : BOOL;
lamp3 : BOOL;
END_VAR
VAR
oldStart: BOOL;
buffer: WORD;
tik: TON;
END_VAR
IF start AND NOT oldStart THEN
buffer.0:=TRUE;
ELSIF NOT start THEN
buffer:=0;
END_IF;
oldStart:=start;
IF tik.Q THEN
buffer:=SHL(buffer,1);
IF buffer>4 THEN buffer:=1; END_IF;
END_IF;
tik(IN:=NOT tik.Q AND start,PT:=T#1s);
lamp1:=buffer.0;
lamp2:=buffer.1;
lamp3:=buffer.2;
Конечно, хватит и одного таймера, потому что в любой момент времени у вас может гореть только 1 лампа. Просто при переходе к следующей лампе "перезаряжаете" таймер. На ST сделать - проще простого, это нормальный язык программирования, сродни Паскалю и С++, лучше делать на нём чем диаграммами, он мощнее и во многом удобнее. Всё что вам нужно для этой задачи - условный оператор. Таймер кстати можно сделать вручную, просто обращаясь к системному времени в ПЛК - это счётчик миллисекунд с момента включения ПЛК (функция TIME). Такой способ потенциально более гибкий.
Кому как, мне проще на CFC
Вложение 12849
Мне так нагляднее. :)
А могли бы Вы свою логику продемонстрировать в кусочке программы? Не очень понимаю "перезарядку" таймера и организацию цикла.
Я представляю горящие лампы массивом в цикле for. Сначала с 1ой лампы по 3ью затем с 3ьей лампы по 1.
Но нужен, видимо, функциональный блок или функция, состоящая из таймера, сдвигового регистра, за счет которой шло бы переключение во времени.
Как это сделать - не понимаю
Посмотрите пример уважаемого Capzapа. Там все это есть. Переменная buffer содержит 16 бит (это вместо массива). Используются первые 3 бита (buffer.0, buffer.1, buffer.2). Цикл организовывать не надо, контроллер и так в цикле работет. Также используется функция SHL(), которя сдвигает биты переменной влево.
Под "Перезарядкой" таймера имелось в виду отключить и снова включить вход таймера IN, после того, как он отработает. В примере Capzapа это реализовано так: инвертированный выход с таймера подается ему же на вход, получается такой простенький генератор импульсов.
Здравствуйте.
Есть сервер с 2 сетевыми картами (1-промышленная и 2-локальная сеть). IP отличаются последней цифрой, маски одинаковые, шлюз в настройках первой не указан. ПЛК100 конектится через 1, но необходимо его подключить через локальную сеть. Адреса карт менять нельзя (настроена туча вражеского софта). Есть ли выход из данного положения?
Здравствуйте, подключил модуль дискретного ввода МВ110-16ДН к ПЛК100-24КМ. Работать не хочет. Что я сделал не так? Подскажите пжс.
Никак. Винда абстрагирует сетевые порты. Брэндмауэр, может?Цитата:
Как в КоДеСисе указать через какой порт устанавливать связь?
Товарищи! Подскажите чайнику, а то я себе весь моск сломал:
Как организовать в PLC 110-160 алгоритм работы нескольких двигателей так, чтобы первым запускался двигатель с меньшей наработкой. А в идеале, чтобы еще и отключался первым тот у которого эта наработка больше. С подсчетом времени наработки вроде бы разобрался (использую блок ONTIME oscat-овской библиотеки)
Заранее спасибо за ответ.
Для подсчёта наработки не надо лезть в биб-ки, есть стандартная функция TIME() - время от включения ПЛК (в мс). По ней и считайте. Создайте массив со значениями наработок для движков. Для определения движка с минимальной наработкой можно пойти простым логическим ходом, например так:
minimal:=999999999;
for a:=0 to n do
if narabotki[a] < minimal then
minimal:=narabotki[a];
b:=a;
end_if;
end_for;
После этого блока в переменной b будет индекс движка с наименьшей наработкой, а в переменной minimal - значение этой наработки.
Борис, спасибо за ответ, но после него мой уровень упал с "чайника" до "мееега чайника":) А как это провернуть на языке CFC? а то я пока кроме него мало знаю:(
На CFC сам не пишу, только на курсах когда был, на нём всё делали, но после ST я понял насколько всё будет муторно этими диаграммами делать. Мой вам совет - пишите потихоньку на ST, он мощнее, и не надо возиться с этими линиями входов-выходов. Ничего сложного, особенно если знакомы с программированием даже на школьном уровне. По сути - те же диаграммы, только в виде текста, и с более гибкими возможностями.
Есть вещи, которые на CFC сделать проблематично (например циклы), а на ST очень просто. Для этого делаете функциональный блок по примеру Бориса на языке ST, а потом используйте его в своей CFC программе.
А есть какая-нибудь литература по ST? А то действительно, CFC понятный, но громоздкий.
Об этом много раз говорили на форуме. Пожалуйста, в следующий раз пользуйтесь поиском.
"Петров И.В. (2004) Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования"
http://lib-bkm.ru/load/1-1-0-56
Пытаюсь создать этот блок.
Подскажите, что не так делаю?Вложение 12885
array of для наработок
В объявлениях (VAR) нужно написать:
narabotki:ARRAY[0..n] OF DINT;
Так объявляется массив. В данном случае - набор переменных типа DINT, обращение к которым происходит по индексу от 0 до n (В объявлении вместо n поставить максимальный индекс). И почему вы используете тип DINT? Так как время наработки всегда неотрицательно, лучше возьмите DWORD, получите вдвое большее макс. значение. Чтобы увидеть справку по целочисленным типам, ставьте курсор на слово с типом данных и жмите F1. Вообще, смотрите в справке, там всё описано. :)
P. S. DWORD - неотрицательный тип, имеет полный диапазон, представляемый четырьмя байтами, то есть переменная может принимать значения от 0 до 4294967295. Если у вас время представлено в миллисекундах, то максимальный отрезок времени, который можно хранить в четырёхбайтовой переменной - около 49 суток, после чего диапазон переполнится и всё начнётся с нуля. Если нужно больше, можно написать собственный тип данных, или же сразу переводить в секунды например или в минуты, в зависимости от того, какая точность требуется.
Я интуитивно догадываюсь, но хотелось бы уточнить...:rolleyes: так это должно выглядеть?Вложение 12892
Просто с совсем новичок в этом деле.
Сразу желательно определиться какие будут входы и выходы у вашего ФБ, чтобы его удобно можно было использовать. Сколько у вас двигателей? Если двигателей много, то может есть смысл сделать массив, элементами которого будет структура, состоящая из двух переменных: номер двигателя и его наработка. Тогда наработка будет привязана к конктерному двигателю, а не к индексу массива и элементы в массиве можно менять местами при необходимости (например если надо будет отсортировать массив по возрастанию времени наработки).
Не совсем. Массив должен быть от 0 до n, где n= количеству насосов.
Массив можно сделать с небольшим запасом, например 10, а n оставить в программе и менять количество насосов до 11. Ну не столько же 4 c чем-то миллиардов :)
А вот значение minimal можно сделать не DINT а DWORD, увеличив тем самым то, о чем говорил Boris_K