PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Yegor
17.05.2013, 13:02
Вообще при работе с последовательным портом надо быть готовым к тому, что сообщение будет разбито на несколько кусков. Уж не знаю, как это учитывается в библиотеке.

melky
17.05.2013, 13:04
Yegor при чтении 1-ого байта (ячеек) ? офигеть, он что на три куска бьет чтение одной ячейки ? параметр quantity у FB.

Предположим FB разбил чтение на три куска. 2 байта, 8 и 7. Но почему тогда функция пишет это в массив (а функции массив дали из 256 байт) всегда с начала и не делает приращения ?

capzap
17.05.2013, 13:06
Видео слабо, но скринами сейчас сделаю.

Три шага выполнения чтения регистров. На третьем шаге в ячейку [4] попадает состояние выходов МК110, потом прыгает еще и в ячейку [1] и на втором шаге, когда ByteCnt = 8 все убивается и так по кругу, если убрать r_trig и просто разрешить работу.

То есть не один раз какое-то значение получаем из МК а постоянно меняющиеся значения, одно из которых мое. я уже не говорю, что параметр Quantity = 1 и я его не меняю.

Либо в описалове на библиотеку что-то не рассказано, либо ее поведение полный неадекват.
Сразу же по первой картинке, а у Вас вообще работает обмен, Вы хоть раз прочитали или записали данные?

capzap
17.05.2013, 13:08
Вообще при работе с последовательным портом надо быть готовым к тому, что сообщение будет разбито на несколько кусков. Уж не знаю, как это учитывается в библиотеке.

библиотека, с помощью выходной переменной комплит, сообщает когда получены все данные, поэтому кусочничества не будет

melky
17.05.2013, 13:18
capzap да, обмен есть. через FB MB_WR_SNG_COIL прекрасно передается изменение выходов МК, запись 0 или 1 на нужные выход. Выхода вкл/выкл.
При чтении FB регистров на трерьем шаге я вижу в [4] значения выходов.
Но то, что он делает это циклом мне непонятно.
Видно, что в ячейке [0] появляется 16 - вероятно адрес слейва.
в ячейке [3] появляется 50 - видимо адрес регистра 0х32

Я бы понял, если бы FB в массив возвращал полный ответ от устройства
Адрес устройства, функция, данные, контрольная сумма но он несет явную ахинею, которую трудно понять...

capzap
17.05.2013, 14:00
Вы хоть имеете представление для чего вход En нужен, блок будет работать пока на этот вход подается ИСТИНА, в Вашем случае это один цикл, за это время обмена с устройством не может происходить. В то же время на вход Enable совсем не требуется подавать постоянно ИСТИНА, там как раз хватит запуска через фронтальный триггер

melky
17.05.2013, 14:11
capzap сути проблемы это не меняет, буфер заполняется не от [0] до [Х] за один шаг (до complete = 1), а несколько раз начиная с [0] разным количеством байт.

etruscilla
17.05.2013, 14:40
Прошу помощи специалистов.
На панель СП270 требуется вывести текущее значение из таймера (Timer.ET) в виде строки типа "3s150ms" (а ещё лучше вообще без ms). Как преобразовать время во что-то удобоваримое для вывода (не применяя массив)?

П.С. Контроллер ПЛК 100, забыла написать)))

YuriBel
17.05.2013, 14:48
Формат time подразумевает хранение времени, выраженном в миллисекундах, поэтому если сначала преобразовать формат времени, ну например, к формату DWord, а затем разделить целочисленным делением на 1000, то получится количество секунд. Его и выводите на здоровье.

Mustafa_ibragim
17.05.2013, 15:02
Приветствую! Пишу с помощью библиотеки SysLibFile данные в файл CSV, подскажите как сделать перевод записи на след. строку, $0d+$0a не помогает, получается какая-то ерунда.

VAR
CR:STRING:='$00D';
LF:STRING:='$0d0a'
END_VAR


PerevodStroki:=CONCAT(CR,LF);
SysFileWrite(f, ADR(PerevodStroki), SIZEOF(PerevodStroki));

etruscilla
17.05.2013, 15:17
YuriBel, спасибо, я даже не думала, что всё настолько просто :)

melky
17.05.2013, 16:55
capzap подобным костылем и я читаю выходы. Дело то несколько в другом.

Читаем то мы всего 1 байт так ? вроде так.
После завершения процедуры, раз уж нельзя в библе определять массив и он всегда 256 байт, результат должны получить всего 1 байт - вроде тоже так.
Почему он в ячейке [1] а не [0] ? было бы логичнее, раз у нас массив [0..255]

Или почему в массиве не весь конверт ответа от слейва (правда тогда массив должен быть больше, с учетом служебной инфы) ?

Это я вычислил, в какой ячейке мой результат, потому что железо стоит на столе и я ему вкл/выкл выходы и могу понять, что результат в [1] а не где-то еще по завершении комплит. Но результат самой FB не логичен.
Что произойдет, когда читать будем 256 байт ? [0] то вылетело куда-то...

Вот такие несуразности и удивляют в подобных вещах, а еще накладываются собственные ошибки и вообще туши свет :)

amn
17.05.2013, 17:03
capzap Читаем то мы всего 1 байт так ? вроде так.
После завершения процедуры, раз уж нельзя в библе определять массив и он всегда 256 байт, результат должны получить всего 1 байт - вроде тоже так.
Почему он в ячейке [1] а не [0] ? было бы логичнее, раз у нас массив [0..255]


Наверное из-за того, что при передаче Модбас меняет местами младший и старший байт в регистре.

capzap
17.05.2013, 17:05
еще раз читайте ссылку про модбас, мы никогда не читаем байт, регистр это слово состящее из двух байт, поэтому инт16 значением до 255 будет распологаться в первом байте а не нулевом. Пока проблемы только в Вашей голове, библиотека работает нормально всё в соответствии со стандартом, на выходе блока массив заполняется с нуля запрошенными данными, а служебная информация в ответе предварительно вырезана

melky
17.05.2013, 17:16
amn и capzap Семен Семеныч! :)
Вот я тормознул на слове :)
Спасибо, а то уж думал точно что-то с головой.....

melky
17.05.2013, 17:21
Подскажите, как правильно считать слово из байтового массива ?

amn
17.05.2013, 17:50
Если не ошибаюсь, то с заменой местами младшего и старшего байтов будет так:

var
ptr_D:POINTER TO BYTE;
B: ARRAY [0..255] OF BYTE;
word1: WORD;
END_VAR

ptr_D:=ADR(word1);
ptr_D^:=B[1];
ptr_D:=ptr_D+1;
ptr_D^:=B[0];

melky
17.05.2013, 18:11
amn то есть простых вариаций типа BUFFER.word#0 или что-то в этом роде не предусмотренно ?
и зная, что они переставлены местами прокрутить на 8 бит.

amn
17.05.2013, 19:19
Можно так:

word1:= B[1] OR SHL(BYTE_TO_WORD(B[0]),8);

или

word1:= B[1] + SHL(BYTE_TO_WORD(B[0]),8);

amn
17.05.2013, 23:03
Возможно ли такое: мастером управляем через библиотеку по одному интерфейсу, а слейв организуем на другом интерфейсе через конфигурацию.

Работать будет?

Yegor
17.05.2013, 23:07
Будет.

Набранное вами сообщение слишком короткое. Увеличьте ваше сообщение до 10 символов.

amn
21.05.2013, 00:00
Здравствуйте. Хотел бы уточнить. При работе с библиотекой Modbus.lib открываем и настраиваем порт. Надо ли его иногда закрывать и в каких случаях? В случае перезагрузки ПЛК никаких проблем не возникнет, если порт не был закрыт?

С уважением, Михаил.

lazy
23.05.2013, 16:33
Здравствуйте. Хотел бы уточнить. При работе с библиотекой Modbus.lib открываем и настраиваем порт. Надо ли его иногда закрывать и в каких случаях? В случае перезагрузки ПЛК никаких проблем не возникнет, если порт не был закрыт?

С уважением, Михаил.

Я закрываю (чтобы открыть вновь) при пропадании связи. иногда помогает. Специально больше никогда не закрывал. Вроди без проблем и ни кто не жаловалсо )

service
29.05.2013, 11:37
возможно ли программу из кодесиса перевести в степ7?

melky
29.05.2013, 13:17
service в вариант SCL возможно из ST возможно с наименьшими телодвижениями. Но это только в v11 и выше. (Tiaportal) ну или если доставлен в 5.4 степа.

Если в CFC написано, то он у них несколько платный.

А так вообще возможно все.
я чтобы понять как в ST написать FB в КДС, набросал ее в FBD на степе и переключил на STL, мне стало понятнее.
Жаль, что в CodeSys нельзя переключать тело программы на другой язык на лету как в Степе. Очень удобно для понимания и обучения.

melky
29.05.2013, 23:11
Такой вопрос. Можно ли сделать ПИД регулирование ступенчатым, используя 3 контактора подключения тэнов ?
Или получится ерунда ?

kgsh82
30.05.2013, 05:23
Такой вопрос. Можно ли сделать ПИД регулирование ступенчатым, используя 3 контактора подключения тэнов ?
Или получится ерунда ?

Ответ зависит от объекта регулирования.
В вентиляционных установках электрокалорифер пилят на ступени. Но первая обычно через ТТР включается. Остальные - через контакторы

Можно и все через контакторы - но не очень "плавно" получится

melky
30.05.2013, 10:46
kgsh82, понял, спасибо. Учел ТТР, но блин с защитой по КЗ дорого, думаю легче будет поменять тэн вместе с ТТР в случае чего.

kgsh82
30.05.2013, 17:56
kgsh82, понял, спасибо. Учел ТТР, но блин с защитой по КЗ дорого, думаю легче будет поменять тэн вместе с ТТР в случае чего.

А цепь контактор-ТЭН защищать от КЗ не надо?

melky
30.05.2013, 22:11
kgsh82 цепь вся - автоматический выключатель кривая B с размыкателем по перегреву тэна (2-я сткпень перегрева 130 гр, сухой контакт), контактор с реле отключения и командой на контролер по перегреву 1-й ступени 80гр, ТТР с варистором на выходе.

Скажем так защита в пределах, но при КЗ ТТР может сдохнуть, так как кривая B автомата несколько дольше работает, чем может выдержать ТТР.

Блин, сейчас таки нашел схему тэнов, трехфазная звезда без нуля, выходит я не могу использовать однофазные ТТР с управлением 4-20мА ? или все-таки можно, если ТТР расчитан на 380 В ?

YuriBel
31.05.2013, 10:04
если вы ориентируетесь на ТТР от Кипприбора, то у них реле с управлением 4-20 мА расчитаны на 250 В.
А в принципе ТЭН-вещь довольно инерционная и нагревом можно управлять дискретными сигналами от контроллера или модуля через ШИМ.

melky
31.05.2013, 10:26
YuriBel нет, я ориентировался немного на другие реле, с напряжением 380В, но китай и у нас в сетях бывает 415-420В влегкую.
Скорее всего я ппоставлю 3Р ТТР кипприборовское и с помощью ШИМ буду управлять.
А однофазки уже через 4-20 мА.

YuriBel
31.05.2013, 10:41
Скорее всего я ппоставлю 3Р ТТР кипприборовское и с помощью ШИМ буду управлять.

Я бы наверное точно также сделал.

S.A.D.
03.06.2013, 11:19
Уважаемые коллеги, вылез какой-то косяк и не могу понять в чем дело. Связано это с чертовым конфигуратором. В нем реализован обмен по 485 интерфейсу в качестве мастера. Опрашивает ПЛК100 модули МВ110-8А, МВ110-16ДН и МУ110-8Р и частотник delta vfd-f на скорости 9600 без четности и одним стоп битом. После того как я немного рационализировал сохранение на флеш количество наработаных двигателями часов (стал все писать в один файл, вместо "для каждого свой") лег обмен по 485. Больше вроде как ничего не делал. Один раз наблюдал такую хрень на другой проге, но решил что какой-то единоразовый глюк. Помимо тех процесса контроллер общается по двум ком-портам с панелью и верхним уровнем посредством самописной биб-ки (тут проблем нет). Где-то видел упоминания от людей о том, что конфигуратор ложиться, а вот от чего хз. Может кто сталкивался? Ошибок модуль статистик не выдает.

Дополнено: не знаю что за глюк был, но после полного ресета со сбросом с удержаной кнопкой старт и последующей перезаливкой проекта, все заработало... Надолго ли.... ох надо писать мастер самому как и слейв :)

melky
04.06.2013, 18:35
Подскажите, как битовой переменной выхода присвоить символьное имя ?

есть переменная out32 (по адресу модуля), это соответственно регистр (например 8 выходов)
условие - out32.1 (ну и так далее)
Как привильно присвоить этому out32.1 имя, чтобы не писать как выше, а написать например V1_lamp ?

А то как ни пишу в переменных все время на что-то ругается, то подавай ему тип, то не хватает : перед .

petera
04.06.2013, 19:13
Подскажите, как битовой переменной выхода присвоить символьное имя ?

есть переменная out32 (по адресу модуля), это соответственно регистр (например 8 выходов)
условие - out32.1 (ну и так далее)
Как привильно присвоить этому out32.1 имя, чтобы не писать как выше, а написать например V1_lamp ?

А то как ни пишу в переменных все время на что-то ругается, то подавай ему тип, то не хватает : перед .
1. В настройках проекта: Опции-->Генератор кода --> установить галку "Замена констант".
2. В глобальных переменных создать такой раздел объявлений

VAR_GLOBAL CONSTANT
V1_lamp:INT:=0;
V2_lamp:INT:=1;
V3_lamp:INT:=2;
..................
V8_lamp:INT:=7;
END_VAR
И в программе можно обращаться так
out32.V1_lamp:=TRUE;
out32.V2_lamp:=FALSE;
out32.V3_lamp:=0;
out32.V4_lamp:=1;
и т.д.

Yegor
05.06.2013, 09:46
Можно красивее. Как рассказал petera, только вместо глобальных констант создавайте перечисления такого вида:
TYPE DO1 : (Pump1, Valve2, Valve3);
END_TYPEТеперь можно делать out32.Pump1 := TRUE; out32.Valve2 := FALSE.

melky
05.06.2013, 09:50
petera несколько не отменяет проблемы, потому что все равно придется писать out32.

хотелось именно заменить, то есть написал V1_lamp и программа знает, что это out32.0 а потом весь out32 отправлять в регистр модуля вывода.

Yegor перечисления где необходимо сделать ? в разделе переменных или в самой программе ?

Yegor
05.06.2013, 11:30
В типах данных.

Дмитрий
05.06.2013, 12:16
Сильно извиняюсь если вопрос уже задавали, Как мне распаковать маску входов МДВВ на 12 входов в CFC, на 8 нашел unpack. а на 12?

melky
05.06.2013, 13:05
Дмитрий сдвинуть регистры слова на 8 бит и подать на второй unpack как вариант.
или считать в переменную Х: word; регистр, а потом использовать в программе без распаковки X.0, X.1, ... , X.12

yurmik
05.06.2013, 15:16
Всем привет. Столкнулся с проблемой ограничения количества дискретных входов/выходов. Как добавить дополнительный модуль к ПЛК-160?

rovki
05.06.2013, 15:43
По сети RS 485 .ПЛК мастер сети ,модуль -слейв

garry
05.06.2013, 21:24
Как правильно организовать ожидание сигнала логической единицы на IL? Я пока сделал следующим способом:

label:
LD UP -загружаем состояние переменной(входа) в аккумулятор
JMPCN label -пока 0 прыгаем снова на метку
далее продолжение обработки

переменная(контакт датчика) изменяет свое состояние с 0 на 1 менее чем на 1 сек
Как сделать красивее?

capzap
05.06.2013, 22:04
Как правильно организовать ожидание сигнала логической единицы на IL? Я пока сделал следующим способом:

label:
LD UP -загружаем состояние переменной(входа) в аккумулятор
JMPCN label -пока 0 прыгаем снова на метку
далее продолжение обработки

переменная(контакт датчика) изменяет свое состояние с 0 на 1 менее чем на 1 сек
Как сделать красивее?

ну Вы наверное обратились, потому что не работает :)
попробуйте так
LD flag

JMPC else1_0

RET

else1_0:
end1_0:

garry
05.06.2013, 22:33
Если зацикливать опрос, то в эмуляции срабатывает таймер-сторож.Мой вариант тоже работоспособен(в спектрумах работал). Хочется функцию(элемент библиотеки), что-бы при вызове ее она просто ждала импульс со входа и при этом не срабатывал сторож. Ваш вариант тоже предполагает зацикливание.

capzap
05.06.2013, 22:39
Если зацикливать опрос, то в эмуляции срабатывает таймер-сторож.Мой вариант тоже работоспособен(в спектрумах работал). Хочется функцию(элемент библиотеки), что-бы при вызове ее она просто ждала импульс со входа и при этом не срабатывал сторож. Ваш вариант тоже предполагает зацикливание.

злая собака у Вас сработает и в реальном плк, мой вариант корректно закончит цикл. Забудьте свои навыки из программирования другой микропроцессорной техники, это совет

Валенок
05.06.2013, 22:39
попробуйте так
)))))
Правильный подход. Зачем ломать мозг с il когда есть текст и волшебные кнопки

capzap
05.06.2013, 22:41
)))))
Правильный подход. Зачем ломать мозг с il когда есть текст и волшебные кнопки
ну я честно сперва обратил внимание, что обращение к метке вначале кода приведет к зависанию, потом уже с конвертировал :D

garry
05.06.2013, 23:03
Немного не понял принцип. Ваш код вызывается как ФБ например из тела блока SFC
CAL WAIT(CLK:=UP)


в теле ФБ WAIT пишем
LD CLK пишем в аккумулятор содержимое CLK

JMPC else1_0 при единице прыгаем на метку

RET иначе возвращаемся в тело блока SFC (а зачем? единицы то не было)

else1_0: а тут куда ходить?
end1_0:

capzap
05.06.2013, 23:06
Немного не понял принцип. Ваш код вызывается как ФБ например из тела блока SFC
CAL WAIT(CLK:=UP)


в теле ФБ WAIT пишем
LD CLK пишем в аккумулятор содержимое CLK

JMPC else1_0 при единице прыгаем на метку

RET иначе возвращаемся в тело блока SFC (а зачем? единицы то не было)

else1_0: а тут куда ходить?
end1_0:
Вы же тоже не написали какие действия производите, если пришла единица. Вот и я оставил пустое место, вставляйте код между лейбами и все, придет единица выполнится вычисление, будет ноль функция вернется без вычислений

garry
05.06.2013, 23:10
Тогда эту функцию можно вызывать бесконечно пока не появится единица?
А собака?

Yegor
06.06.2013, 06:03
Тогда эту функцию можно вызывать бесконечно пока не появится единица?В ПЛК у вас для ожидания всё будет вызываться бесконечно. Тут подход к программированию другой. Циклы ожидания организовывать не надо, т.к. вы уже в бесконечном цикле.

Дмитрий
06.06.2013, 06:28
Дмитрий сдвинуть регистры слова на 8 бит и подать на второй unpack как вариант.
или считать в переменную Х: word; регистр, а потом использовать в программе без распаковки X.0, X.1, ... , X.12

может прмерчик?

petera
06.06.2013, 08:56
Дмитрий сдвинуть регистры слова на 8 бит и подать на второй unpack как вариант.

может прмерчик?
Может просто без премудростей сделать свой ФБ?
http://i011.radikal.ru/1306/c3/5940a591af27t.jpg (http://i011.radikal.ru/1306/c3/5940a591af27.png)
Это не сложнее, чем стандартный unpack, см. библиотеку Util.lib
http://s018.radikal.ru/i507/1306/fe/64f2ca1e4282t.jpg (http://s018.radikal.ru/i507/1306/fe/64f2ca1e4282.png)

raven34716
06.06.2013, 13:30
Здравствуйте. Просветите, пожалуйста, в таком вопросе. Можно ли задействовать дискретный вход ПЛК150 в качестве приемника импульсов с расходомера? Задача такая: имеется расходомер ПРЭМ с числоимпульсным выходом и ПЛК150-И-М. Необходимо подсчитать мгновенный часовой расход холодной воды. Максимальная частота расходомера 500Гц.

Николаев Андрей
06.06.2013, 13:37
Нельзя. Обновление аналогового входа - 0,3 сек.
Счетчик подключите на дискретный вход, а другой сигнал на аналоговый.

raven34716
06.06.2013, 13:49
Нельзя. Обновление аналогового входа - 0,3 сек.
Счетчик подключите на дискретный вход, а другой сигнал на аналоговый.

Не понял ваш ответ, я как раз и спрашиваю про дискретный вход. У ПРЭМА нет токового выхода, следовательно "забрать" с него аналоговый сигнал не могу. Только числоимпульсный. Форма сигнала прямоугольная.

melky
07.06.2013, 17:43
raven34716 максимальная частота сигнала при программной обработке 1 кГц при программной обработке.
Инфа из каталога.
Но это если время цикла программы менее 1 мс.
у вас максимальная 500 Гц, уже 2 мс. должен успевать, если у вас до максимума к тому же доходить не будет.

А вот что означает макс 10 кГц при применении аппаратного счетчика для ПЛК 150 ? где-то настраивается в ПЛК ?

mush00
10.06.2013, 00:12
Всем добрый вечер.
Просьба камнями не кидать, начинающий.
Подскажите, как получить текущую TOD и желательно без секунд.
CurTimeEx тикает, можно добыть из него по отдельности что надо, но тогда ветвлений получится много при сравнении отдельно часов и минут.
Вижу RTC от Петрова, но CDT там в формате DT.
Задача - естественно, работа по расписанию. Много примеров посмотрел, но что-то не врублюсь никак.

Grig CH
10.06.2013, 09:58
Добрый день,
Если не затруднит, подскажите пжлст,
как ограничить количество знаков после запятой у переменной формата REAL без преобразований в другие типы.
в мануале по CodeSys не нашёл шаблона для записи формата.

YuriBel
10.06.2013, 10:21
Про количество знаков после запятой можно говорить только применительно к вводу или выводу числа, вы его куда отправляете (или откуда забираете)?

petera
10.06.2013, 11:10
Добрый день,
Если не затруднит, подскажите пжлст,
как ограничить количество знаков после запятой у переменной формата REAL без преобразований в другие типы.
в мануале по CodeSys не нашёл шаблона для записи формата.
В библиотеке OSCAT есть ф-ция ROUND(in,N), выгядит она почти так:

VAR_INPUT in : REAL;
N : INT;
END_VAR
VAR
X: REAL;
DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,100 0000.0,10000000.0;
END_VAR


X :=DECADES[LIMIT(0,N,8)];
ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;

Grig CH
10.06.2013, 11:12
To YuriBel
Наблюдаю за переменной в самой CodeSys в визуализации.
Есть ли возможность обрезать "хвост" у REAL на экране, без манипуляций c преобразованием типов.
Хотел ограничиться одним знаком после запятой.

Grig CH
10.06.2013, 11:45
To petera
Спасибо. Думаю эта функция решает вопрос, но сложновато.
Сам я пока решаю так, REAL x 10 -> INT -> REAL /10, но думал, что есть просто шаблон вывода.

petera
10.06.2013, 12:06
To petera
Спасибо. Думаю эта функция решает вопрос, но сложновато.
Сам я пока решаю так, REAL x 10 -> INT -> REAL /10, но думал, что есть просто шаблон вывода.
Для визуализации есть и шаблоны вывода.
http://s017.radikal.ru/i434/1306/fc/0362b4513240t.jpg (http://s017.radikal.ru/i434/1306/fc/0362b4513240.png)

Grig CH
10.06.2013, 12:30
To petera.
Большое спасибо. То, что надо.
Раньше я читал этот фрагмент, но тогда не понял, что куда подставлять.

mush00
10.06.2013, 17:09
Никто мой вопрос не увидел ))):
>>> Всем добрый вечер.
Просьба камнями не кидать, начинающий.
Подскажите, как получить текущую TOD и желательно без секунд.
CurTimeEx тикает, можно добыть из него по отдельности что надо, но тогда ветвлений получится много при сравнении отдельно часов и минут.
Вижу RTC от Петрова, но CDT там в формате DT.
Задача - естественно, работа по расписанию. Много примеров посмотрел, но что-то не врублюсь никак.

capzap
10.06.2013, 18:58
Никто мой вопрос не увидел ))):
>>> Всем добрый вечер.
Просьба камнями не кидать, начинающий.
Подскажите, как получить текущую TOD и желательно без секунд.
CurTimeEx тикает, можно добыть из него по отдельности что надо, но тогда ветвлений получится много при сравнении отдельно часов и минут.
Вижу RTC от Петрова, но CDT там в формате DT.
Задача - естественно, работа по расписанию. Много примеров посмотрел, но что-то не врублюсь никак.

Загляните в бибку оскат, там этих TOD_TO_DT ну просто завались :)

lazhator
11.06.2013, 12:33
Никто мой вопрос не увидел ))):
>>> Всем добрый вечер.
Просьба камнями не кидать, начинающий.
Подскажите, как получить текущую TOD и желательно без секунд.
CurTimeEx тикает, можно добыть из него по отдельности что надо, но тогда ветвлений получится много при сравнении отдельно часов и минут.
Вижу RTC от Петрова, но CDT там в формате DT.
Задача - естественно, работа по расписанию. Много примеров посмотрел, но что-то не врублюсь никак.

Нужно было отдельно вывести часы и минуты исполнения программки на экран, из RTC делал через DT_TO_STRING, далее работа со строками обрезаю ненужное, беру что нужно (RIGHT,MID), в оскате, малость не то, ну или я не нашел. тож начинающий, камнями можно...

capzap
11.06.2013, 12:43
Нужно было отдельно вывести часы и минуты исполнения программки на экран, из RTC делал через DT_TO_STRING, далее работа со строками обрезаю ненужное, беру что нужно (RIGHT,MID), в оскате, малость не то, ну или я не нашел. тож начинающий, камнями можно...

блин, а попробуйте перевернуть мое предложение в предыдущем посте через _ТО_ :)

а в оскате это две функции DT_TO_SDT и SDT_TO_TOD это если самому писать не хочетсе на основе ихних примеров

S.A.D.
11.06.2013, 13:01
Всем добрый вечер.
Просьба камнями не кидать, начинающий.
Подскажите, как получить текущую TOD и желательно без секунд.
CurTimeEx тикает, можно добыть из него по отдельности что надо, но тогда ветвлений получится много при сравнении отдельно часов и минут.
Вижу RTC от Петрова, но CDT там в формате DT.
Задача - естественно, работа по расписанию. Много примеров посмотрел, но что-то не врублюсь никак.
необходимые библиотеки: SYSLIBTIME.lib, STANDARD.lib

VAR
GetTime:CurTimeEx;
Sys_Time:SysTime64;
SYST:SystemTimeDate;
SYSTIME:TOD;
END_VAR

SYST.Day:=0;
SYST.DayOfWeek:=0;
SYST.dwHighMsec:=0;
SYST.dwLowMSecs:=0;
SYST.Hour:=0;
SYST.Milliseconds:=0;
SYST.Minute:=0;
SYST.Day:=0;
SYST.Month:=0;
SYST.Second:=0;
SYST.Year:=0;
GetTime(SystemTime:=Sys_Time, TimeDate:=SYST);

SYSTIME:=STRING_TO_TOD(CONCAT(CONCAT(CONCAT('TOD#' ,UINT_TO_STRING(SYST.Hour)) ,':') ,UINT_TO_STRING(SYST.Minute)));

ЗЫ: может быть последняя строчка индусами попахивает, но я делал так.

mush00
11.06.2013, 14:10
Вариантов-то сколько сразу ))))
спасибо, что вы такие отзывчивые есть.
обязательно попробую их все, хотя, CurTimeEx как-то понятнее работает.
а вот через 0:00 не просто будет перескочить, как я понимаю? 1,00 не будет больше 23,00 без доп вычислений ?

S.A.D.
11.06.2013, 14:48
Вариантов-то сколько сразу ))))
спасибо, что вы такие отзывчивые есть.
обязательно попробую их все, хотя, CurTimeEx как-то понятнее работает.
а вот через 0:00 не просто будет перескочить, как я понимаю? 1,00 не будет больше 23,00 без доп вычислений ?
если ты сравниваешь переменные типа TOD, то 23:00 будет больше 01:00. Тут тебе еще тогда нужно учитывать день недели, месяц и т.д.. А вообще график чего у тебя будет? Если будет график температур или давления на день или неделю, то проблем никаких на самом деле.

mush00
11.06.2013, 16:25
Технологические сутки делятся на неравные 2 части. Начало суток никогда не будет в 00,00. В разных интервалах насос работает в разных режимах по блинку. Тут не привязаться к таймерам, которые при перебоях электроэнергии будут скидываться в нули. Надо плясать от системного времени. Ну да ладно, это уже не такая большая проблема.

mush00
11.06.2013, 18:40
Нарисовал линейку на листе - на самом деле проблем с 0 нет, так что одна баба с воза ушла

Валенок
13.06.2013, 11:45
Вообщем здесь манипуляции с системным временем и время/дата в строки
В строки - одной функцией с задаваемым свободным форматом

myles
19.06.2013, 11:37
Здравствуйте, такой вопрос.
У меня есть модуль ввода и ПЛК, к которому так же подключена коробка управления магнитопроводом. Посоветуйте пожалуйста, как получать разницу значений модуля ввода при включенном 1 входе ПЛК и при включенном 2 входе ПЛК. Можно - ли объединить значение МВ и 1 входа ПЛК в одну переменную, и значение МВ и 2 входа ПЛК в другую переменную? И как это сделать?

petera
19.06.2013, 11:48
Здравствуйте, такой вопрос.
У меня есть модуль ввода и ПЛК, к которому так же подключена коробка управления магнитопроводом. Посоветуйте пожалуйста, как получать разницу значений модуля ввода при включенном 1 входе ПЛК и при включенном 2 входе ПЛК. Можно - ли объединить значение МВ и 1 входа ПЛК в одну переменную, и значение МВ и 2 входа ПЛК в другую переменную? И как это сделать?
Вроде написано по русски, но ни чего не понятно.:confused:

capzap
19.06.2013, 13:08
Здравствуйте, такой вопрос.
У меня есть модуль ввода и ПЛК, к которому так же подключена коробка управления магнитопроводом. Посоветуйте пожалуйста, как получать разницу значений модуля ввода при включенном 1 входе ПЛК и при включенном 2 входе ПЛК. Можно - ли объединить значение МВ и 1 входа ПЛК в одну переменную, и значение МВ и 2 входа ПЛК в другую переменную? И как это сделать?
Если про управление или с плк или с удаленного модуля ответ напрашивается сам, это элемент ИЛИ в общем случае

myles
19.06.2013, 15:47
Вроде написано по русски, но ни чего не понятно

Попробую по - другому описать проблему)
Мне нужно сравнить значение модуля ввода, при включении 1 и 2 входа ПЛК.

kost2
19.06.2013, 16:48
Возможно ли задержать выполнение программы на ПЛК?
Т.е. некий аналог фукции Sleep, чтобы программа остановила свое выполнение и через, например 50 мс, продолжила с того же места. Есть таймеры, но они, насколько я понимаю, выполнение программы не прерывают.
Поясню для чего это нужно, допустим пришла команда по сети сменить направление вращения движка, для ПЛК это значит выключить один дискретный выход и включить другой. без задержки эти действия выполнять нельзя. Можно, конечно, сделать это на таймерах, но функция sleep была бы удобнее

YuriBel
19.06.2013, 20:08
Не изобретайте велосипед, это неправильный подход. Программа в контроллере должна работать постоянно, это основа безопасности. То, что вам нужно, без труда делается на таймерах.

petera
19.06.2013, 21:32
Поясню для чего это нужно, допустим пришла команда по сети сменить направление вращения движка, для ПЛК это значит выключить один дискретный выход и включить другой. без задержки эти действия выполнять нельзя. Можно, конечно, сделать это на таймерах, но функция sleep была бы удобнее
При управлении исполнительными механизмами с тремя состояниями (Открыть-Откл-Закрыть; Влево-Откл-Вправо...) проще всего использовать программу или ф.блок на языке SFC. Т.к очень просто реализуется блокировка одновременного включения управляющих выходов, если присутствуют оба сигнала управления Откр и Закр.
http://s004.radikal.ru/i208/1306/80/3e5276bd10c9t.jpg (http://s004.radikal.ru/i208/1306/80/3e5276bd10c9.png)
И кроме того в этой простейшей программе автоматически обеспечивается задержка между изменениями состояния выходов ПЛК равная одному циклу без каких-либо дополнительных ухищрений
Если состояния входов Откр=1, Закр=0 одновременно изменится на Откр=0, Закр=1, то выход Откр станет равным 0 в текущем цикле, а выход Закр включится только в следующем цикле.
Продлить задержку между переключениями выходов на время больше, чем время одного цикла тоже очень просто, без дополнительных таймеров
http://s017.radikal.ru/i402/1306/61/76abc4fafaf5t.jpg (http://s017.radikal.ru/i402/1306/61/76abc4fafaf5.png)

amn
20.06.2013, 12:44
Попробую по - другому описать проблему)
Мне нужно сравнить значение модуля ввода, при включении 1 и 2 входа ПЛК.

В конфигурации дайте имена входам, например in1 и in2.

В программе:

IF in1 AND in2 THEN
<сравниваем что нужно>
END_IF

Это если нужно что-то сравнить при включенных входах in1 и in2. Тип входов BOOL.

myles
20.06.2013, 16:58
В конфигурации дайте имена входам, например in1 и in2.

В программе:

IF in1 AND in2 THEN
<сравниваем что нужно>
END_IF

Это если нужно что-то сравнить при включенных входах in1 и in2. Тип входов BOOL.
Немного не так. У меня один тип входов BOOL, это входы на контроллере, а второе значение - это значение с модуля ввода, оно REAL. Обозвал это значение например izm. Так вот, можно - ли объединить в одну переменную izm и in1, а в другую переменную izm и in2. А потом сравнивать значения?

amn
20.06.2013, 17:25
Немного не так. У меня один тип входов BOOL, это входы на контроллере, а второе значение - это значение с модуля ввода, оно REAL. Обозвал это значение например izm. Так вот, можно - ли объединить в одну переменную izm и in1, а в другую переменную izm и in2. А потом сравнивать значения?

Что-то Вы мудрите. Зачем объединять? Почему нельзя просто сравнить значения с модуля? Приведите пример, чего хотите добиться в результате. А то не понятно, что дано, с чем сравнивать, и что в итоге должно получиться?

Hafizov G
20.06.2013, 18:31
Здравствуйте, я новичок, у меня 2 вопроса 1) как на языке ST сделать авто подхват кнопки (кнопку нажал пришла единица и она осталась, а кнопка отошла) и 2) написал программу на SFC упрощенном -первый цикл проходит в конце выставляю все значения в начальные, на 2 цикле программа будто цикла не замечает летает по кругу (специально на условиях переключения останавливал - в тело ШАГА она не заходит а сразу на условие перехода) хотя я может не правильно её понял?

amn
20.06.2013, 19:02
Здравствуйте, я новичок, у меня 2 вопроса 1) как на языке ST сделать авто подхват кнопки (кнопку нажал пришла единица и она осталась, а кнопка отошла)

По первому вопросу:

VAR
RS1: RS;
in1: BOOL; (*кнопка включения*)
off: BOOL; (*кнопка оключения*)
q1: BOOL; (*сигнал на выходе*)
END_VAR

RS1(SET:=in1 , RESET1:=off , Q1=>q1 );

Hafizov G
20.06.2013, 20:18
Спасибо Amn, а нет идей по по воду 2 -го вопроса - там проблема после прохождения первого цикла счетчик не сбрасывается (CTU) через Reset. Не знаешь его принудительно как нибудь сбросить можно?

amn
21.06.2013, 00:14
Hafizov G, по второму вопросу мало информации. Нужно видеть проект.

Hafizov G
21.06.2013, 08:49
запросто,9051,суть такова почти в каждом теле программы есть счетчик СТУ, он и приводит в действие тело ШАГА, первый цикл программа проходит, тоесть init - step 6, то по идее в инните дожен произойти сброс всех счетчиков, как я думал, но это не прокатывает, пробовал ставить генератор изменения reseta перед тоже на 2 цикле не замечает.

Hafizov G
21.06.2013, 09:42
или есть возможность предложите код счетчика как в CTU, илискажите можно ли обнулить значение CV? - прога говорит он недоступен для записи, можно ли его сделать доступным?

myles
21.06.2013, 11:18
Что-то Вы мудрите. Зачем объединять? Почему нельзя просто сравнить значения с модуля? Приведите пример, чего хотите добиться в результате. А то не понятно, что дано, с чем сравнивать, и что в итоге должно получиться?
Хорошо, а как сравнивать значения с модуля в моменты, когда поочерёдно включаются 1 и 2 входы контроллера. Т.е., мне нужно получить разницу значения модуля ввода при включённых 1 и 2 входах, в зависимости от которой будут включаться два других выхода контроллера. Что-то типа U1 - это необходимое значение модуля ввода при 1 включённом входе, U2 - это при 2 входе. И всё, что мне нужно, это получить разницу значений U1-U2.

petera
21.06.2013, 11:39
запросто,9051,суть такова почти в каждом теле программы есть счетчик СТУ, он и приводит в действие тело ШАГА, первый цикл программа проходит, тоесть init - step 6, то по идее в инните дожен произойти сброс всех счетчиков, как я думал, но это не прокатывает, пробовал ставить генератор изменения reseta перед тоже на 2 цикле не замечает.
"по идее в инните дожен произойти сброс всех счетчиков" :confused:
Это по какой-такой идее, а где код, который сбрасывает счетчики?
По крайней мере код действия шага Init должен быть вот так

A5:=1;
i:=0;
WHILE i<5 DO
NA:=1;
i:=i+1;
END_WHILE
NA:=0;
i:=0;
(*----------- Сброс счетчиков*)
CTUInst(RESET:= TRUE);
CTUInst1(RESET:=TRUE);
T1(RESET:= TRUE);
T3(RESET:= TRUE);
(*------------*)

И что это за код (встречается в во всех шагах)

i:=0;
WHILE i<5 DO
NA:=1;
i:=i+1;
END_WHILE
NA:=0;
i:=0;
Это код паразит, он ни чего не делает, может это типа задержки(он просто считает число циклов ПЛК).
А вот здесь
http://toolson.net/ImageData/GifAnimation/915868.gif

Состояние элементов Т1, Т2, Т3, вообще не будут иметь значение.

Что это за выражение
http://s017.radikal.ru/i420/1306/4c/6e9aebe6b64bt.jpg (http://s017.radikal.ru/i420/1306/4c/6e9aebe6b64b.png)
Ведь переменная имеет тип BOOL, интересно когда она станет отрицательной.:rolleyes:
И еще. Почему нельзя просто прямо возле черточки само условие написать. Ведь простейшие условия
http://i058.radikal.ru/1306/d8/0498eacd56ddt.jpg (http://i058.radikal.ru/1306/d8/0498eacd56dd.png)
Дальше программу не смотрел, наверняка есть и другие ляпсусы.

petera
21.06.2013, 11:58
Хорошо, а как сравнивать значения с модуля в моменты, когда поочерёдно включаются 1 и 2 входы контроллера. Т.е., мне нужно получить разницу значения модуля ввода при включённых 1 и 2 входах, в зависимости от которой будут включаться два других выхода контроллера. Что-то типа U1 - это необходимое значение модуля ввода при 1 включённом входе, U2 - это при 2 входе. И всё, что мне нужно, это получить разницу значений U1-U2.
Вообщем этому человеку нужно устройство выборки и хранения измеренного значения

IF in1 THEN (*Пока вход 1 включен*)
U1:=izm; (*эта переменная повторяет измеренное значение*)
END_IF
(*после выключения входа 1 в переменной U1 запомнится значение в момент отключения входа in1*)


IF in2 THEN (*Пока вход 2 включен*)
U2:=izm; (*эта переменная повторяет измеренное значение*)
END_IF
(*после выключения входа 2 в переменной U2 запомнится значение в момент отключения входа in1*)

Если нужно запоминать измеренные значения в момент включения входов, то нужно в условия IF добавить R_TRIG.

amn
21.06.2013, 11:59
запросто,9051,суть такова почти в каждом теле программы есть счетчик СТУ, он и приводит в действие тело ШАГА, первый цикл программа проходит, тоесть init - step 6, то по идее в инните дожен произойти сброс всех счетчиков, как я думал, но это не прокатывает, пробовал ставить генератор изменения reseta перед тоже на 2 цикле не замечает.

У тебя в глобальных перменных CTUInst: CTU и эта же переменная в локальных PLC_PRG, так и должно быть?

Вообще старайся как можно меньше использовать глобальные переменные. Это избавит тебя от ошибок, которые очень трудно найти. Для этого используй в функциональных блоках переменные var_input.

Действие Init.

Смотри, что у тебя тут происходит:

A5:=1;
i:=0;

Далее зачем-то цикл
WHILE i<5 DO
NA:=1;
i:=i+1;
END_WHILE

после цикла имеем: NA=1, i=5;

далее эти же переменные меняются:
NA:=0;
i:=0;

В результате работы действия Init у тебя всегда будут одни и те же значения: A5=1, NA=0, i=0. То есть цикл никак не повлиял на результат.

Имей в виду, что цикл надо использовать осторожно, так как он увеличивает время работы программы в целом, и если цикл будет большим, то контроллер зависнет и перезагрузится. Контроллер сам работает в цикле. И этим надо пользоваться.

По поводу счетчика. Почитай описание работы в документации CoDeSys_V23_RU.pdf стр.347. Обрати внимание, что счетчик будет считать тогда, когда будет меняться сигнал на входе CU, а обнуляться будет тогда, когда на вход RESET подается TRUE.

petera
21.06.2013, 12:30
Для для Hafizov G

Если Вы хотели сбрасывать счетчики, которые используются в шагах, просто изменив в шаге Init переменную NA из 0 в 1 и затем опять в 0, то эти манипуляции ни как не отразятся на состоянии счетчиков, нужно именно вызывать сами экземпляры счетчиков с нужным значением входа RESET, потому как любая подпрограмма сохраняет свою внутренние переменные до следующего к ней обращения.
Счетчик это тоже подпрограмма.
Исходя из ранее не замеченной мной переменной NA предлагаю, такой код для шага Init

A5:=1;
(*----------- Сброс счетчиков*)
CTUInst(RESET:=1); CTUInst(RESET:=0);
CTUInst1(RESET:=1);CTUInst1(RESET:=0);
T1(RESET:=1);T1(RESET:=0);
T3(RESET:=1);T3(RESET:=0);
(*------------*)

Hafizov G
23.06.2013, 18:24
Блин, ребята спасибо! Все учту, буду учиться пользоваться, есть еще один вопрос- о LD. возможно ли на LD строить циклы? и есть ли литература с примерами (как по LD так и по остальным для новичков)? а то на мануале конечно здорово, но увидеть в одной книжке пару десятков примеров было бы круто, я инет чуть чуть порыл, только статьи, а книг хороших не заметил, наверное плохо искал.

capzap
23.06.2013, 19:25
Блин, ребята спасибо! Все учту, буду учиться пользоваться, есть еще один вопрос- о LD. возможно ли на LD строить циклы? и есть ли литература с примерами (как по LD так и по остальным для новичков)? а то на мануале конечно здорово, но увидеть в одной книжке пару десятков примеров было бы круто, я инет чуть чуть порыл, только статьи, а книг хороших не заметил, наверное плохо искал.
есть хорошее средство, как конвертация. Найдите пример с циклом, откройте его в КДС, правой кнопкой по нужному ФБ и выбрать конвертацию, так сможете разобраться как в LD выглядят циклы, если конечно это принципиально. Не могу понять только зачем, когда есть другие языки

S.A.D.
24.06.2013, 11:14
просто видимо человек более-менее понимает только LD, а задачу надо решать уже сейчас.

petera
24.06.2013, 12:53
Блин, ребята спасибо! Все учту, буду учиться пользоваться, есть еще один вопрос- о LD. возможно ли на LD строить циклы? и есть ли литература с примерами (как по LD так и по остальным для новичков)? а то на мануале конечно здорово, но увидеть в одной книжке пару десятков примеров было бы круто, я инет чуть чуть порыл, только статьи, а книг хороших не заметил, наверное плохо искал.
Есть такая книга И.Г. Минаев, В.В.Самойленко "Программируемые логические контроллеры. Практическое руководство для начинающего инженера". "АРГУС" 2009г.
Как раз вся книга про LD и контроллеры ОВЕН.
Можно найти в интернете и скачать.
9080 9081

S.A.D.
24.06.2013, 14:11
отличная книга)))с нее фактически я начинал освоение ПЛК))) Книга написана великолепным языком.

Николаев Андрей
24.06.2013, 14:29
Есть такая книга И.Г. Минаев, В.В.Самойленко "Программируемые логические контроллеры. Практическое руководство для начинающего инженера". "АРГУС" 2009г.
Как раз вся книга про LD и контроллеры ОВЕН.
Можно найти в интернете и скачать.
9080 9081

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

garry
24.06.2013, 20:57
Написал первую программу в кодесис. Прошу посмотреть что не так, где можно улучшить? Программа управления прессом для склейки фанеры. Есть визуализация с вводом данных. Логика работы пресса такова:
1 При пуске включаются насос высокого давления(НВД) и насосы смыкания плит.
2 При смыкании плит кратковременно замыкается микропереключатель(в визуализации кнопка DUP) на реле давления-насосы смыкания останавливаются, НВД продолжает нагнетать давление.
3 По достижении первой ступени давления склейки(обычно около 300кг/см)запускается выдержка времени, в это время давление поддерживается НВД и клапаном сброса высокого давления в пределах +-10кг.
4 Клапан сбрасывает давление до второй ступени(обычно 100кг/см), запускается выдержка времени.
5 После выдержки открывается клапан сброса высокого давления, давление сбрасывается до 30кг
6 Открывается клапан размыкания плит.
В визуализации сигнал с датчика давления я эмулировал ползунком.
http://yadi.sk/d/-cOaIPtA68lmC
под ПЛК150

S.A.D.
25.06.2013, 18:43
не пойму в чем вопрос... Заливайте вашу программу в контроллер и тестируйте работоспособность, потом на объект. Там и выяснится что не так и что где и как можно улучшить. Здесь за вас врядли кто-то будет делать вашу работу. Если есть конкретная проблема, то множество людей с радостью вам постараются помочь.

Hafizov G
26.06.2013, 18:06
Ребята, я снова в недоумении, внимание вопрос - Как настроить ПЛК 110 -32 так чтобы при нажатии кнопки СТОП (на лицевой панели) все выходы отключались (а то устройство так в разнос идет) и программа начиналась с начала, (в мануале смотрел, но так и не нашел) Программа на упрощенном SFC, LD, ST))

S.A.D.
26.06.2013, 18:11
если я правильно понял то это вам не кнопка стоп нужна, а кнопка "сброс" Она там рядом)

Hafizov G
26.06.2013, 18:15
Хороший вариант, но не пойдет)), хотя бы чтоб выходы отключались, (а то кнопку стоп нажал, а рейка с манипулятором дальше бежит))

Николаев Андрей
26.06.2013, 18:22
В конфигурации добавляете подмодуль Button и работаете с кнопкой старт\стоп как с простым входом.

Hafizov G
26.06.2013, 19:24
я понимаю что вы имеете в виду, но проблема в том что я понятие не имею как плк останавливает программу, и воспроизвести такой механизм пока не могу ((

capzap
26.06.2013, 21:15
я понимаю что вы имеете в виду, но проблема в том что я понятие не имею как плк останавливает программу, и воспроизвести такой механизм пока не могу ((
Программу ни кто не останавливает,просто не выполняются соответствующие ПОУ
Например это можно организовать с помощью условия IF и RETURN

melky
27.06.2013, 09:58
Hafizov G тоже думал над этим. Поэтому как Николаев Андрей написал, использовать кнопку button и заводить данный вход на элементы И перед выходами или интегрировать в схеме раньше по ситуации и логике.
Может есть еще варианты ?

Кстати в каких ситуациях срабатывает "безопасное состояние" выходов ?

Николаев Андрей
27.06.2013, 10:08
В ПЛК нет понятия остановить программу...
Кнопка старт\стоп на самом деле скорее пауза.

melky
27.06.2013, 12:23
Вот как раз речь об этой паузе. Не важно как ее обозвать, главное, чтобы можно было в данном режиме указывать состояния выходов.
Нажал на паузу и согласно настройкам выход ставишь либо в отключенное состояние, либо во включенное состояние, либо в состояние предшествующее нажатию кнопки, то есть не менять.
Очень плохо, что данного понятия нет в ПЛК от ОВЕН.

Николаев Андрей
27.06.2013, 12:43
Очень плохо, что данного понятия нет в ПЛК от ОВЕН.

Я думаю тут недопонимание. У ПЛК НЕ МОЖЕТ БЫТЬ РЕЖИМА СТОП. Это противоречит самой логике ПЛК...
Все остановки\паузы и остальная логика прописывается в программе. Где Вы в зависимости от состояния переменной\входов и выходов переводите программные блоки в определенные состояния. Ну и точно так же Вы или Ваши программные блоки управляют выходами.
А безопасные состояния и пр. - это милые, но не всегда полезные опции безопасности. Но никак не управления.
Перевод ПЛК в "паузу" как и резет - СЕРВИСНОЕ СОСТОЯНИЕ ПЛК.

petera
27.06.2013, 12:43
Вот как раз речь об этой паузе. Не важно как ее обозвать, главное, чтобы можно было в данном режиме указывать состояния выходов.
Нажал на паузу и согласно настройкам выход ставишь либо в отключенное состояние, либо во включенное состояние, либо в состояние предшествующее нажатию кнопки, то есть не менять.
Очень плохо, что данного понятия нет в ПЛК от ОВЕН.
Ну Вы даете.
А чем так плохо. Вставьте в начало программы проверку нажатия кнопки ПАУЗА.

IF bt_PAUSA THEN (* Если нажата кнопка пауза)
out1:=1; (*заданное состояние "для паузы" *)
out2:=0; (*заданное состояние "для паузы" *)
out3:=0; (*заданное состояние "для паузы" *)
(*И т.д
------------------
------------------*)
ELSE
(*Здесь тело программы
...................
...................
*)
;
END_IF

capzap
27.06.2013, 13:27
Вот как раз речь об этой паузе. Не важно как ее обозвать, главное, чтобы можно было в данном режиме указывать состояния выходов.
Нажал на паузу ги согласно настройкам выход ставишь либо в отключенное состояние, либо во включенное состояние, либо в состояние предшествующее нажатию кнопки, то есть не менять.
Очень плохо, что данного понятия нет в ПЛК от ОВЕН.

Я вроде дал подсказку как это сделать, чё за наезд на овен, поговорка про зеркало не встречалась?

melky
27.06.2013, 13:28
petera то, что это можно реализовать программно понятно. речь немного о другом.
Николаев Андрей угу, это камень в огород например Сименса, там в легкую ПЛК переводится в СТОП с настройкой безопасного состояния выходов или с форсированием. например при грубых ошибках в ПО, оборудовании и т.д.
Именно подобное хотелось бы видеть и в ОВЕНе. частично там что-то есть даже, просто необходимо разобраться с реализацией. Единственное непонятна вообще кнопка прибора "старт/стоп" как-то через место сделана, что приходится предусматривать все в программе вместо того, чтобы просто прописать в настройках прибора.

СТОП он и в Африке стоп, даже если его паузой назови, остановка цикла программы - для данного режима на аппаратном уровне необходимо контролировать состояния выходов, а не на программном. Но это ИМХО.

capzap все встречалось, но как написал выше, логичнее это организовывать на аппаратном уровне ПЛК, а не на программном в программе пользователя..

capzap
27.06.2013, 13:33
petera то, что это можно реализовать программно понятно. речь немного о другом.
Николаев Андрей угу, это камень в огород например Сименса, там в легкую ПЛК переводится в СТОП с настройкой безопасного состояния выходов или с форсированием. например при грубых ошибках в ПО, оборудовании и т.д.
Именно подобное хотелось бы видеть и в ОВЕНе. частично там что-то есть даже, просто необходимо разобраться с реализацией. Единственное непонятна вообще кнопка прибора "старт/стоп" как-то через место сделана, что приходится предусматривать все в программе вместо того, чтобы просто прописать в настройках прибора.

СТОП он и в Африке стоп, даже если его паузой назови, остановка цикла программы - для данного режима на аппаратном уровне необходимо контролировать состояния выходов, а не на программном. Но это ИМХО.

capzap все встречалось, но как написал выше, логичнее это организовывать на аппаратном уровне ПЛК, а не на программном в программе пользователя..

Вы догадываетесь наверное что фенечки стоят денег, на семена нечего намекать, если овен будет реализовывать такое же то и цена поднимется и с чего Вы решили что там сделано на аппаратном уровне?

melky
27.06.2013, 14:09
capzap хорошо, поправлюсь, на уровне фирмваре (прошивки) :)
имелось ввиду не на уровне пользовательской программы.

Николаев Андрей
27.06.2013, 14:52
Давайте таки разделять.
1. И с этим никто не поспорит, надеюсь: все обдуманные действия, в том числе переход из состояния системы в состояние делается программно, в цикле ПЛК. Тут можно спорить\не спорить\ и приводить любые примеры. Так работает ПЛК и с этим не поспоришь.
2. У некоторых производителей ПЛК действительно есть набор сервисных функций, таких как управление выходами в состоянии сервисного прерывания работы контроллера, путем искусственного останова цикла ПЛК (режим стоп\пауза).
НО: этот сервисный режим сделан не для того, чтобы закладывать его в работу установки (объекта). Он для того, чтобы наладчик мог не запуская программу проверить работают ли у контроллера выходы.
И это не ИМХО.
Сервисный режим "безопасные выходы" при перезагрузке реализован и на наших ПЛК. Режим пауза сервисный и используется только до запуска объекта.

Алексей Дмитриев
27.06.2013, 15:05
Сервисный режим "безопасные выходы" при перезагрузке реализован и на наших ПЛК. Режим пауза сервисный и используется только до запуска объекта.

Ну да, ну да - коллега у меня поф(х)....ст, не сделал отключение питания выходов контроллера релюхой при неработающей программе, нонсенс конечно, но на всех других платформах так работает нормально, на Вашей при подаче питания на контроллер, перед тем как все запустилось в работу все выходы делают кратковременный щелк, что не есть хорошо (пневматика дрыгается, моторы тоже)!:mad: Может поправите? Проблема, похоже аппаратная.:cool:

Hafizov G
28.06.2013, 05:44
Ох, черт дернул спросить, спасибо за подсказки, так и сделал))

Николаев Андрей
28.06.2013, 07:40
Ну да, ну да - коллега у меня поф(х)....ст, не сделал отключение питания выходов контроллера релюхой при неработающей программе, нонсенс конечно, но на всех других платформах так работает нормально, на Вашей при подаче питания на контроллер, перед тем как все запустилось в работу все выходы делают кратковременный щелк, что не есть хорошо (пневматика дрыгается, моторы тоже)!:mad: Может поправите? Проблема, похоже аппаратная.:cool:

Был такой косяк.
Причем, как ни странно - программный (взаимодействие между центральным процессором и сопроцессором).
Уже устранили.
Если еще такое будет заметно - большая просьба сообщить.
Спасибо.

Алексей Дмитриев
28.06.2013, 13:44
Замечательно, просто мы давно ничего не делали на ваших контроллерах, тут почитал - вспомнилось. Поскольку напрягает не сильно, то и ....
Тогда отключили таки питание контактом реле подачи напряжения, все стало хорошо. Впрочем, так делаем всегда и на всех платформах, просто в тот раз как-то коллега накосячил, я не проконтролировал.

melky
03.07.2013, 12:07
Вопрос по поводу ШИМ управления на МУ110-8К
Указано, что при групповом управлении выходами (так понимаю запись в регистр 50 битовой маски) ШИМ отключается.
Получается если мне один выход необходим с ШИМ а остальные просто включать выключать, я должен всеми выходами управлять как будто они с ШИМ ? то есть для простых выходов записывать BOOL_TO_WORD 1*1000 и передавать в регистр 0...7 при использовании Modbus ?

Или можно как-то проще поступить, если мне нужен всего один выход с ШИМ ?

Алексей Дмитриев
03.07.2013, 15:49
Использовать софтовый ШИМ с выходом типа BOOL.

Vorgehen
04.07.2013, 11:46
Здравствуйте товарищи. Решил обратиться за помощью после 3-х дневного сидения над проблемой. Задача стоит следующая. Имею 5 приборов трм 101 с rs 485 и плк 100 для их опроса. Плк выступает в роли мастера. Один прибор подключил и сконфигурировал при помощи модуля плк конфиг. Далее мне эти данные необходимо шлюзануть на контроллер другого производителя по модбас 9183. Использую для этого модуль modbus (slave). 9181 и для испытаний порт rs232 с конфигурацией 9182. Адреса регистров беру из схемы выложенной кем-то ранее 9184, соответственно это 0x00(чтение), 0x01(чтение), 0x02(запись). Адресс моего плк-10. Запросы отправляются, а ответа ни одного бита. Если бы хоть один бит шёл бы в ответ, то уже можно было бы думать о таймаутах, о разрывах, помехах и т.д. А так как будто бы порт мёртвый на плк. Причём пробовал и дебаг 232. Картина такая же. Конечно в дальнейшем я буду юзать ethernet для передачи переменных по модбас, мне на данном этапе важно увидеть хоть какой-то результат работы модуля modbus(slave). Может какие-нибудь перемычки нужно переключать? Забыл упомянуть что контроллер выступающий мастером в сети(опрашивающий модуль modbus(slave)) рабочий и установлен в линии. Так же пробовал другой контроллер и ещё компьютер со скадой. ПЛК 100 с адрессом 10 на запросы мастера по rs 232 не отвечает.

Валенок
04.07.2013, 11:48
Или можно как-то проще поступить, если мне нужен всего один выход с ШИМ ?
Нет. Или все через ШИМ или вариант Алексея Дмитриева.

Валенок
04.07.2013, 11:52
Здравствуйте товарищи
Вы мастеров натыкайте внутри слейва.

PS
Совет имеет о-о-чень ограниченное действие. Я не виноват

melky
04.07.2013, 11:58
Валенок а если битовую маску записывать а потом один выход переписывать ШИМом ? на выходе ведь все передается в конце цикла программы. Так должно работать ?

На счет варианта софтового ШИМ как-то не понял, пример можно ?

Vorgehen
04.07.2013, 12:49
Вы мастеров натыкайте внутри слейва.
Попробую как вы говорите.

Vorgehen
04.07.2013, 15:14
Попытался убрать мастер внутрь слейва 9187,преобразование типов делаю так 9189, но опять тишина. Что делать - не знаю. А изначально шёл по примеру 9188. Версия 2.3.9.38 соdеsys, а версии прошивки и таргета последние что лежат на сайте. Точно нет никаких перемычек на запрет использования портов?

Валенок
04.07.2013, 17:36
Валенок а если битовую маску записывать а потом один выход переписывать ШИМом ? на выходе ведь все передается в конце цикла программы. Так должно работать ?
На счет варианта софтового ШИМ как-то не понял, пример можно ?

Работать будет но до следующей записи. Следующая же маска - выставит шим в 0 или 1000. И скорее всего сбросит таймер периода. Вобщем фигня. Не усложняйте.
Софтовый шим : в поиске наберите ШИМ, тут было много. Кажется 1-2 строки. Не найдете - напишут.
Yчтите - "квантование" это шима у Вас - с циклом записи в модуль

melky
04.07.2013, 18:46
Валенок может я не понимаю, но разве на физические выходы данные передаются не в конце цикла ?

начало цикла
......
запись битовой маски
запись значения ШИМ на один выход
конец цикла

Ну и что, что маска будет переписывать значение ШИМ если оно тут же будет записанно опять и в конце цикла все выгрузиться в выходы ? или в данном случае не будет записана маска ? и не будут переписаны измененные биты остальных выходов ? как это архитектурно устроено в ПЛК ?

Ладно, не буду мучаться, переведу пока все выходы на ШИМ.

Алексей Дмитриев
04.07.2013, 22:47
Ладно, не буду мучаться, переведу пока все выходы на ШИМ.
Чего вас так софтовый-то пугает? Скорей всего где-нибудь в оскате есть готовый, если нет - напишите сами. Помню давным-давно делал на таймере, или двух.

melky
04.07.2013, 23:30
Алексей Дмитриев я нашел софтовый на форуме на таймере. Мне только не совсем понятно как его использовать.
получается 1 будет держаться на выходе согласно таймеру и каждый цикл переписываться, (ну или 0 когда таймер выключен) и выход софтового ШИМ так же запаковываем в слово и отправляем битовой маской в модуль вывода.
Какую погрешность он будет иметь с учетом цикла программы и времени передачи по Modbus ? или это совсем не критично ?
Когда используешь ШИМ модуля, то все вроде аппаратно происходит, согласно прошивке модуля.

Оффтопик, я так и не понял, как написанную программу на CFC переделать в ST ?, экспорт и импорт не срабатывает. Программа импортируется опять в CFC. Просто хочется посмотреть, что я там наваял именно в ST варианте.

Vorgehen
04.07.2013, 23:38
Попытался убрать мастер внутрь слейва ,преобразование типов делаю так , но опять тишина.
Да все работает. Там у мастера не все поля отображаются в слейв. И в качестве такого шлюза код вообще не нужен.

Что б разобраться (я через конфигурацию не работаю) можно сделать например так.
Слейв(
2 byte имя ему _
мастер1(..)
мастер2(..)
..
)


var
P : pointer to array[0..999] of word;


p := adr(_);

Дальше (оffлайне) в мастерах куда только можно пишем 1,2,3,4...
Раскрываем p^
Ищем индексы (а это и есть - регистры) где появились циферки 1,2,3,4...
Вообщем разбираемся какое поле мастера в каком регистре слейва
Флоаты - нужно потыкать какое-то число и обнаружив где меняется, учесть - это 2 регистра, с стартом от четного номера
Т е. вы хотите сказать что плк 100 произвольно создаёт адресса регистров для себя слэйва, причём не с нуля, и мне их придётся искать програмно? А нет способа проще? И если не трудно то дайте примерчик подробнее. Очень Вас прошу. Дело в том что работаю с другими производителями ПЛК в других средах, отличных от кодесис.

melky
04.07.2013, 23:49
он их не произвольно создает, а согласно таблице расположения добавляемых вами "узлов" с выравниванием.
http://www.owen.ru/catalog/62474614 вот здесь есть на примере использования с ИП320.
Когда вы идете по дереву добавленных "узлов" (регистры, биты, 2 байта, 4 байта), в свойствах показывается размерность.

почему только это как-то не отражать сразу в свойствах, непонятно ?

А, учитывая, что все делается через библиотеки, тогда наверное надо все ручками расчитывать от 0-ого регистра.

Vorgehen
05.07.2013, 00:05
он их не произвольно создает, а согласно таблице расположения добавляемых вами "узлов" с выравниванием.
http://www.owen.ru/catalog/62474614 вот здесь есть на примере использования с ИП320.
Когда вы идете по дереву добавленных "узлов" (регистры, биты, 2 байта, 4 байта), в свойствах показывается размерность.

почему только это как-то не отражать сразу в свойствах, непонятно ?

А, учитывая, что все делается через библиотеки, тогда наверное надо все ручками расчитывать от 0-ого регистра.
Т.е. то что читается в модуле овен мастер тоже занимает область памяти контроллера и соответственно регистр?

Vorgehen
05.07.2013, 20:23
Ребят подскажите где лежат библиотеки с modbus. Покопаю.Валенок вашу подсказку попробовал но всё по нулям. Нигде чисел не отображается. Т.е. все нули, а в определённый момент вообще контроллер улетает в релоад. Посижу немного и попробую ещё пару вариантиков.

Валенок
05.07.2013, 21:39
Пришол виниться. (((
Ну не работаю я через конфигуратор.
Попробывал живьем. Действительное если в внутрислейвовом мастере (местном) модули input - то кырдык (???) Но если output - но работают.
Ее-мае. Ход мысли аффторов понятен. Но ! Ведь слейв на попытку записи извне в поля input модулей может прислать вполне определенное исключение. Не первый раз разочарован в мастере конфигуратора.
А Ваш релоад - убил.

Цепляйте библиотеки, и читайте ими прям область конфиг.слейва. Это гарантировано работает.
Только что сделал шлюз ПЛК1 м-s ПЛК2 м-s МВА8 :
ПЛК2 - читает всё разом из МВА8 в конфиг.слейв каждые 50мс. (38400)
ПЛК1 - читает это всё разом из ПЛК2 каждые 16-18мс (115200)

Ну или перекладывайте из соседских мастеров. Даже пробывать не хочу.

Vorgehen
08.07.2013, 11:12
Цепляйте библиотеки с удовольствием, только откуда:D

Vorgehen
08.07.2013, 11:14
А Ваш релоад - убил. . Делаю прокрутку. Когда дохожу до P[128]=0, срывает в релоад.

myles
08.07.2013, 12:37
IF in1 THEN (*Пока вход 1 включен*)
U1:=izm; (*эта переменная повторяет измеренное значение*)
END_IF
(*после выключения входа 1 в переменной U1 запомнится значение в момент отключения входа in1*)


IF in2 THEN (*Пока вход 2 включен*)
U2:=izm; (*эта переменная повторяет измеренное значение*)
END_IF
(*после выключения входа 2 в переменной U2 запомнится значение в момент отключения входа in1*)

Спасибо, то, что нужно!
Ещё вопрос. Хочу ввести ещё переменную, чтобы можно было видеть разность U2 и U1, типа U:=U2-U1. Переменная U естественно REAL? Почему - то при таком раскладе U всё равно показывает 0, хотя значение U2 и U1 есть.

Vorgehen
08.07.2013, 13:53
Решил попробовать сделать контроллер мастером и записать переменные в свой контроллер. Но обнаружил что поддерживаются только 232 интерфейсы и 485. 485 у меня занят. 232 не пойдёт, ибо длинна линии больше 3 метров. А езернет модулем модбас мастер не поддерживается? Или библиотеки есть какие нибудь?.

15.43 Вроде нашёл библиотеки. Сейчас буду разбираться.

Vorgehen
08.07.2013, 13:54
По сути мне только 3 и 6 функции нужны.
Вот только что обнаружил юниверсал модбас девайс. Посмотрю может в нём что есть. Помню что-то читал в мануале.
А в библиотеках не поддерживается езернет. Там только между rs'ами выбирать можно. Что делать? Если бы не было в трмах101 чудо протокола ОВЕН я бы не задавал тут вопросов. Что делать. ПЛК конфиг поддерживает овен на ура. Я получаю значения по протоколу ОВЕН, а вот дальше то что предпринять? Свободен только езернет. 232ой не годиться ввиду длины. Вокруг частотники и сильные помехи.

Валенок
08.07.2013, 18:51
В комплекте в 63/73 идут modbus.lib и owennet.lib. На модель плк - клади. Оба протокола можно на один порт повесить.
syslibcom.lib - в комплекте к среде
232 можно в 485 конвертером
syslibsocket.lib -в комплекте к среде
в параметрах umd - см. netmode (tcp/serial, и ip самый первый) - мастеров конфигуратора не юзаю.
На родной слейв конфигуратора - жалоб не было
reload - прокрутка в цикле значений под указателем ? Обращение к памяти вне зоны доступа - защита системы. То что у меня 0..999 был - пример. Где в онлайне ??? там и кончиласть доступная память

melky
09.07.2013, 09:58
Vorgehen попробуйте 232 интерфейс, у него 15 метров макс по стандарту, примените экранированный кабель заземленный с одной стороны, уменьшите скорость.
Поднимали связь на 40 метров по этому интерфейсу, дальше не взлетело.

Valadar71
09.07.2013, 13:35
здравствуйте, уважаемые профи кодесиса 2,3. пишет Вам чайник)) большая просьба к Вам: напишите плиз прогу, чтобы при нажатии на кнопку пуск объект перемещался только по оси иксов. я сам пытался...но ни гу-гу..выкладываю свою версию. спасайте, пожалуйста!!!!

petera
09.07.2013, 16:28
здравствуйте, уважаемые профи кодесиса 2,3. пишет Вам чайник)) большая просьба к Вам: напишите плиз прогу, чтобы при нажатии на кнопку пуск объект перемещался только по оси иксов. я сам пытался...но ни гу-гу..выкладываю свою версию. спасайте, пожалуйста!!!!
Только развлечения ради, держите. Даже больше чем Вы хотели.
PROGRAM PLC_PRG

VAR
Res:BOOL; (*Кнопка Сброс*)
ToLeft: BOOL; (*Копка влево*)
ToRight: BOOL; (*Кнопка вправо*)
x_pos: INT := 0; (*Относительная координата по Х*)
END_VAR
IF ToRight AND x_pos<= 200 THEN
x_pos:=x_pos+1; (*Двигать вправо, но не дальше 200*)

ELSE
ToRight:=0; (*Досигли правого края, кнопку можно выклбчить*)
END_IF
IF ToLeft AND x_pos>= -200 THEN
x_pos:=x_pos-1; (*Двигать влево, но не дальше -200*)

ELSE
ToLeft:=0; (*Досигли левого края, кнопку можно выклбчить*)
END_IF
IF Res THEN (*Если нажали кнопку Сброс, то*)
ToLeft:=0; (*Выключить кнопку*)
ToRight:=0; (*Выключить кнопку*)
x_pos:=0; (*Квдратик в центр области перемещения*)
END_IF

UPD
Вложение можно скачать здесь

Vorgehen
09.07.2013, 16:39
melky сначала надо получить результат в принципе, а он не получается, по непонятным причинам. Уже не знаю с чем может быть связано. Я уже на своём контроллере поставил опрос адрессов с 0 по 50. А на овене во все 2 байтовые переменные поместил число. Молчёк. Никакого ответа. Может быть модуль Modbus slave отключён из-за того что версия прибора L? Полное название ПЛК 100- 220. Р-L. Ладно попробую библиотеки.Важно получить результат в принципе.

Valadar71
09.07.2013, 17:10
Только развлечения ради, держите. Даже больше чем Вы хотели.

ОГРОМНОЕ СПАСИБО!!!!!!!!!!!! ВЕК БУДУ БЛАГОДАРЕН))))))))

petera
09.07.2013, 22:23
здравствуйте, уважаемые профи кодесиса 2,3. пишет Вам чайник)) большая просьба к Вам: напишите плиз прогу, чтобы при нажатии на кнопку пуск объект перемещался только по оси иксов. я сам пытался...но ни гу-гу..выкладываю свою версию. спасайте, пожалуйста!!!!
Вот еще один вариант на SFC.
Здесь, в отличии от предыдущего варианта на ST, кнопки влево, вправо и сброс можно нажимать в любой последовательности.
9226

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

Vorgehen
10.07.2013, 10:09
А может быть неработоспособность модуля modbus slave в плк конфиг связана с севшей батарейкой в контроллере?

melky
10.07.2013, 11:22
Vorgehen в Modbus 0 адрес используется для широковещательных сообщений. Может это мешает ?
L от M отличается только количеством байт для Modbus, других отличий быть не должно.

myles
10.07.2013, 11:31
Я уже задавал выше вопрос про перемещение в зависимости от измеренных значений с модуля ввода. И возникла при этом проблема, так как частота измерений от 2 гц и больше, выходы контроллера не успевают срабатывать. Можно - ли как - то сделать, не меняя частоту, чтобы при измеренной разнице значений, включался один выход например на секунды 3, и только после этого замер значений продолжался. Пробовал сделать это всё с помощью таймеров, но результата никакого, т.к. таймеры всё время переключались.

Вот код того, что я написал. Хоть и задал время в таймере 3 секунды, и обозначил один из выходов FALSE, он всё включается меньше, чем через секунду, из - за измеренного значения.

IF DI1 THEN
U1:=izm1;
END_IF

IF DI2 THEN
U2:=izm1;
END_IF

IF U2-U1>0 AND DO7=TRUE AND DI17=1 THEN
move_right(IN:=TRUE, PT:=T#0s);
END_IF

IF move_right.Q AND DO10=FALSE THEN
DO9:=TRUE;
DO10:=FALSE;
move_right(IN:=FALSE, PT:=T#3s);
END_IF

IF U2-U1=0 AND DO7=TRUE AND DI17=1 THEN
DO9:=FALSE;
DO10:=FALSE;
END_IF

IF U2-U1<0 AND DO7=TRUE AND DI17=1 THEN
move_left(IN:=TRUE, PT:=T#0s);
END_IF

IF move_left.Q AND DO9=FALSE THEN
DO9:=FALSE;
DO10:=TRUE;
move_left(IN:=FALSE, PT:=T#3s);
END_IF

Проще говоря, как сделать, чтобы цикл таймера не сбивался и длился полностью 3 секунды, а не переключался мгновенно на другой?

Vorgehen
10.07.2013, 15:44
Vorgehen в Modbus 0 адрес используется для широковещательных сообщений. Может это мешает ?
В первом байте (где адресс прибора). А адресс регистра может быть ноль совершенно спокойно. И пример тому мву-8 выход 1. melky вы меня не правильно поняли. 0-50 я имел ввиду адресса регистров. Я пытался прошупать первые 51 регистр предварительно поместив туда число, но мои попытки пока не к чему не привели. Я подозреваю что проблема в том что память энергонезависима и зависит от батарейки. А она у меня села потому что после перезагрузки (снятие питания и вновь подача) контроллера программа не сохраняется.

L от M отличается только количеством байт для Modbus, других отличий быть не должно. Только модбас или овен тоже? У меня соответственно 15 переменных типа флоат, а это 60 байт. Должно остаться.

Valadar71
10.07.2013, 15:49
уважаемые профи кодесиса, здравствуйте!! вопрос Вам хочет задать чайник)) можете написать алгоритм любой для работы с массивами ( желательно с визуализацией). прочитал в петрове плк теория понятна, но сам сделать увы силёнок не хватает :-) спасибо заранее за помощь!!!!!!!

melky
10.07.2013, 16:19
Vorgehen тогда корректнее надо ставить вопрос, вы говорили об адресах а не регистрах.
Вы программу загрузили в прибор на постоянной основе или просто ?

Память на все, если правильно понимаю, независимо от протокола.

Если вы опрашиваете модуль и его входы не в логической единице, то вы и получите 0 всегда.
Если вы записываете в модуль, то смотрите в какой регистр по документации необходимо записывать, какой командой и какое значение (например если выходы поотдельности работают в ШИМ режиме и вам надо его включить через Modbus вы должны записать 1000 в регистр этого выхода типа word а не булеву 1)

Ошибка в описании МВУ8 Приложение Таблица В.4. Регистры протокола ModBus
Выходов 8 с 1 по 8, регистры с 0 по 7 (а не 8)
1 выход запись по регистру 0 в режиме RTU значения word 1000 командой 16(10h) должен включить первый выход.

Vorgehen
10.07.2013, 17:13
melky да я всё понимаю. Теорию знаю наизусть. У меня 3 мву8 модуля работает на производстве и цыплял я их к другому контроллеру не овеновскому, всё замечательно работает. А Сам реализовывал 03 функцию протокола под линукс на языке СИ в своё время.
Сейчас речь о том что необходимо разобраться в причине нерабочего состояния модуля плк-конфиг. Потому что это решит одну из проблем на производстве. Программу загружаю при помощи иконки на панели инструментов выглядит он как синенький компьютер и когда на него наводишь мышку появляется слово подключение в кодесис 2.3. Можно конечно изучать теорию, но подчеркну что я пользуюсь контроллерами другого производителя. И если изучать среды всех ныне существующих производителей, то жизни не хватит. Кстати Вы меня натолкнули на мысль что я может быть действительно как то не правильно загружаю программу в контроллер?

melky
10.07.2013, 17:33
Vorgehen, программа сперва загружается в оперативу при команде "online" и там работает до выключения питания.
По команде "Ондайн" - "Создание загрузочного проекта" уже пишется во Flash память и будет работать после перезагрузки, выключении питания.

сам нарвался сперва на это :)

Конфиг ПЛК должен указывать точный адрес модуля и тип протокола, на счет МВУ не подскажу, а МК110 протокол определяют вроде автоматически Modbus RTU или ASCII или ОВЕН.

Vorgehen
10.07.2013, 17:36
melky спасибо Друг. Пошёл пробовать
По команде "Ондайн" - "Создание загрузочного проекта" уже пишется во Flash память и будет работать после перезагрузки, выключении питания..
Я делал просто онлайн.

Valadar71
11.07.2013, 02:17
уважаемые профи кодесиса, здравствуйте!! вопрос Вам хочет задать чайник)) можете написать алгоритм любой для работы с массивами ( желательно с визуализацией). прочитал в петрове плк теория понятна, но сам сделать увы силёнок не хватает :-) спасибо заранее за помощь!!!!!!!

capzap
11.07.2013, 05:15
уважаемые профи кодесиса, здравствуйте!! вопрос Вам хочет задать чайник)) можете написать алгоритм любой для работы с массивами ( желательно с визуализацией). прочитал в петрове плк теория понятна, но сам сделать увы силёнок не хватает :-) спасибо заранее за помощь!!!!!!!http://www.owen.ru/forum/showthread.php?t=13408&p=90889&viewfull=1#post90889
Напомню что на видео, но точно что то связано с массивами

Valadar71
11.07.2013, 09:55
http://www.owen.ru/forum/showthread.php?t=13408&p=90889&viewfull=1#post90889
Напомню что на видео, но точно что то связано с массивами

спасибо за помощь!!!!!!!))

Valadar71
11.07.2013, 12:45
здравствуйте, многоуважаемые профи кодесиса) очень нужна Ваша помощь (не откажите плиз чайнику) :-) дело обстоит так...мне надо нарисовать две стрелки над элементом...причём надо записать код как-то так, чтобы при нажатии на кнопку из визуализации над этим объектом эти стрелки моргали одновременно с какой-нибудь продолжительностью (например 2 сек горят, 2 сек не горят и чтобы это повторялось). с меня ящЫк пивасика))) спасибо))

Vorgehen
11.07.2013, 17:25
Валенок и melky спасибо за помощь. Завёлся модуль модбас мастер. После того как ткнул создание загрузочного проекта. Буду решать с помощью UMD. Спасибо Ребят.

kolyan
11.07.2013, 19:24
Для Valadar 71:
_____________
Ну, как-то так.
Рисовать не старался)):

Valadar71
12.07.2013, 00:46
Для Valadar 71:
_____________
Ну, как-то так.
Рисовать не старался)):

я побежал за ящЫком в магаз)) Колян, куда ехать?)) СПАСИБО ОГРОМНЕЙШЕЕ!!!!!!!!!

kolyan
12.07.2013, 12:10
я побежал за ящЫком в магаз)) Колян, куда ехать?)) СПАСИБО ОГРОМНЕЙШЕЕ!!!!!!!!!

На здоровье!)))

S.A.D.
13.07.2013, 19:44
Уважаемые коллеги! Попал в ситуацию. В общем есть устройство которое на запрос возвращает структуру вида:
hours1:BYTE;
minutes1:BYTE;
value1:INT;
rele1:BYTE;

hours2:BYTE;
minutes2:BYTE;
value2:INT;
rele2:BYTE;

hours3:BYTE;
minutes3:BYTE;
value3:INT;
rele3:BYTE;

hours4:BYTE;
minutes4:BYTE;
value4:INT;
rele4:BYTE;

hours5:BYTE;
minutes5:BYTE;
value5:INT;
rele5:BYTE;

hours6:BYTE;
minutes6:BYTE;
value6:INT;
rele6:BYTE;

я создаю такую структуру (тип А) и делаю переменную A_var: A;
Из устройства эти структура приходит просто в виде упорядоченного набора байт (массив). Т.е. та структура которую я указал только последовательно побайтно.
Переписываю этот массив в переменную A_var посредством указателя pt:POINTER TO A:
pt:=ADR(kadr[4]);
A_var:=pt^;

И в итоге некоторые байты переписываются с каким-то странным смещением на 1 байт, в общем некорректно. Вот сижу и не пойму то ли лыжи не едут, то ли у меня образованности не хватает. Если есть нюансы при работе с указателями подскажите плиз.

capzap
13.07.2013, 21:00
Уважаемые коллеги! Попал в ситуацию. В общем есть устройство которое на запрос возвращает структуру вида:
hours1:BYTE;
minutes1:BYTE;
value1:INT;
rele1:BYTE;

hours2:BYTE;
minutes2:BYTE;
value2:INT;
rele2:BYTE;

hours3:BYTE;
minutes3:BYTE;
value3:INT;
rele3:BYTE;

hours4:BYTE;
minutes4:BYTE;
value4:INT;
rele4:BYTE;

hours5:BYTE;
minutes5:BYTE;
value5:INT;
rele5:BYTE;

hours6:BYTE;
minutes6:BYTE;
value6:INT;
rele6:BYTE;

я создаю такую структуру (тип А) и делаю переменную A_var: A;
Из устройства эти структура приходит просто в виде упорядоченного набора байт (массив). Т.е. та структура которую я указал только последовательно побайтно.
Переписываю этот массив в переменную A_var посредством указателя pt:POINTER TO A:
pt:=ADR(kadr[4]);
A_var:=pt^;

И в итоге некоторые байты переписываются с каким-то странным смещением на 1 байт, в общем некорректно. Вот сижу и не пойму то ли лыжи не едут, то ли у меня образованности не хватает. Если есть нюансы при работе с указателями подскажите плиз.

вот и наберите в поиске: "указатель структура смещение", г-н Валенок подробно описывал происходящее помоему даже в этой теме

Валенок
13.07.2013, 21:09
Если я правильно понял - идут 6 пакетиков по 5 байт ?
Или тот девайс - плк-слейв, а это его структура ?
PS
Мне привычней - т-щ ))

S.A.D.
13.07.2013, 21:47
Если я правильно понял - идут 6 пакетиков по 5 байт ?
Или тот девайс - плк-слейв, а это его структура ?
PS
Мне привычней - т-щ ))
идет один пакет длиной 30 байт, который нужно просто переложить в соответствующую структуру. Тот девайс Слейв. Только не ПЛК, а регулятор с протоколом WAKE.

На данный момент взял все захардкодил, но выглядит это ужасающе порнографично. Однако работает безотказно если не учитывать, разницу в объеме кода...

S.A.D.
13.07.2013, 21:49
вот и наберите в поиске: "указатель структура смещение", г-н Валенок подробно описывал происходящее помоему даже в этой теме
по данным критериям поиска вывалилось только ваше сообщение :(

capzap
13.07.2013, 22:00
по данным критериям поиска вывалилось только ваше сообщение :(

и в правду, ну вобщем смысл в том же самом выравнивании

Валенок
13.07.2013, 22:02
Что делать ?
1.STRUCT_A
h,m : byte;
val : int;
rele : byte;

VAR
V : array [1..6] of STRUCT_A;
M : array [1..6,1..5] of byte;

2.Принять данные в M

3.Переложить M в V
for i := 1 to 6 do
V[i].h := M[i,1];
V[i].m := M[i,2];
V[i].val := 256 * M[i,4] + M[i,3]; (* или 256 * M[i,3] + M[i,4] ?*)
V[i].rele := M[i,5];
end_for

Кто виноват ? (кратко)
1.просто выравнивание
2.выравнивание структур особенно

S.A.D.
14.07.2013, 13:04
Что делать ?
1.STRUCT_A
h,m : byte;
val : int;
rele : byte;

VAR
V : array [1..6] of STRUCT_A;
M : array [1..6,1..5] of byte;

2.Принять данные в M

3.Переложить M в V
for i := 1 to 6 do
V[i].h := M[i,1];
V[i].m := M[i,2];
V[i].val := 256 * M[i,4] + M[i,3]; (* или 256 * M[i,3] + M[i,4] ?*)
V[i].rele := M[i,5];
end_for

Кто виноват ? (кратко)
1.просто выравнивание
2.выравнивание структур особенно
спасибо! Смысл ясен)) Получается, что при инициализации структуры контроллер отводит память под неё как ему за хочется, а если мы инициализируем массив, то тут уже отводится последовательное кол-во байт. Вобщем следовало бы догадаться. Однако получится ли заполнить массив V [0..6] за раз посредством указателя? Или снова вмешается выравнивание в структуре лежащей по адресу V[i]? Что-то мне кажеся что вмешается. В таком случае получается не многим проще, чем захардкодить это переложение.

Валенок
14.07.2013, 22:06
1.
Размер читаемой структуры 6 x 5 байт.
В подструктуре есть слово (val:int)
=> адреса этих слов - четный,нечетный, четный...

2.
Принимающая железка не может разместить слово по нечетному адресу. (Не Овен и даже не КДС, а именно железка) => будет выравнивание.

3.
Почему спросил - кто слейв ?
В предположении что слейв - ПЛК и имеет структуру:
слейв{
h1 : byte
m1 : byte
val1 : int
rele1 : byte
h2 : byte
m2 : byte
val2 : int
rele2 : byte
...
}

В таком случае неявное выравнивание в самом слейве было бы таково :
слейв{
h1 : byte
m1 : byte
val1 : int
rele1 : byte
x1 : byte
h2 : byte
m2 : byte
val2 : int
rele2 : byte
x2 : byte
...
}

Не знаю что такое "захардкодить". Если объявить VAR как выше в слейве и попытаться прочитать туда - неполучицца. По факту будет как с неявным (выше). Вы просто не сможете разместить данные как в посылке. Разве только:

h1 : byte
m1 : byte
val1_lo : byte
val1_hi : byte
rele1 : byte
...

А если сделаете :

p : pointer to int;

p := adr(val?_lo)
то каждое второе p^ , в любую сторону, приведет к би-и-п. "Потеря связи.."

Тоже самое c

p : pointer to struct{h,m:byte; val:int; rele:byte}
p := adr(h?)
p^ туда/сюда целиком - нормуль.
Но p^.val - приведет к тому же что выше

+
если будет фрагмент типа

...
h6 : byte
m6 : byte
val6_lo : byte
val6_hi : byte
rele6 : byte
END_VAR
где-нить в глобал, то можно бибикнуть при любом обращении даже к p^ (:= ADR(h6)), т.к. присутствует выход за пределы доступной памяти.


4.
В КДС размер любой структуры/фб - кратен 4. Отсюда :
STRUCT A{
h : byte
m : byte
val : int
rele : byte
}
равносильно
STRUCT A{
h : byte
m : byte
val : int
rele : byte
x : array[1..3] of byte
}

=> ... выводы по адресации делаем сами. И с учетом массива структур

Нету никаких "как ему за хочется". Все рассчитываемо если есть понимание механизма выравнивания

PS
на море .. на море ... на море ...

S.A.D.
15.07.2013, 10:22
большое спасибо за пояснения. Я понимаю что нету как ему захочется. Я имел ввиду, что повлиять на это мы не можем и это нормально. Захардкодить я имел ввиду жестко в ручную писать переписывание из посылки в структуру каждой переменной. В конце концов проект этот пишется раз и на долгое время под массовый шкафчик. Так что лучше прописать все жестко. Займет больше строк кода и выглядеть будет не так красиво, зато надежно.

myles
15.07.2013, 11:34
Возможно - ли как - то отключать измерение на несколько секунд с модуля ввода в программе на ПЛК, после достижения необходимого значения?

S.A.D.
15.07.2013, 11:55
Возможно - ли как - то отключать измерение на несколько секунд с модуля ввода в программе на ПЛК, после достижения необходимого значения?
можно остановить опрос модуля ввода. Для этого в модуле Universal Modbus Device Есть в самом верху пункт (*Command (0xFF - Start)*). Как им пользоваться написано в руководстве по программированию ПЛК на 85 странице в разделе Universal Modbus Device.

_Pavel_
15.07.2013, 21:52
Подскажите, пожалуйста: в проекте имеется модуль modbus-slave-TCP, на компьютере запущен OPC-сервер, опрашивающий контроллер. Если я кратковременно (не более примерно 5-ти секунд) отключаю физически разъём от ethenet-а контроллера, восстановление опроса происходит быстро, однако если продержать разрыв чуть дольше восстановление связи с OPC-сервером происходит оочень долго, минут 5-10, несмотря на то что контроллер уже давно "пингуется". Если физически перезагрузить контроллер связь появляется сразу. Подскажите, можно ли настроить контроллер, чтобы связь восстанавливалась как только восстанавливается ethrnet-соединение? Подозреваю что дело именно в контроллере, т.к. помогает его физическая перезагрузка...

melky
16.07.2013, 10:59
Подскажите по взаимодействию контроллера с панелью ИП320.
Например мне необходимо real переменную изменять. Учитывая, что переменная без знаков после запятой то все просто real_to_int - изменили, обратно int_to_real
А если мне необходим 10-тичный знак . Real*10 - real_to_int - отправить в панель с указанием показывать 1 знак после запятой. Изменить и вернуть обратно int_to_real /10

Как панель воспринимает указание, что необходимо показывать количество знаков после запятой ? или панели необходимо именно real значение для этого ?

capzap
16.07.2013, 11:13
Подскажите по взаимодействию контроллера с панелью ИП320.
Например мне необходимо real переменную изменять. Учитывая, что переменная без знаков после запятой то все просто real_to_int - изменили, обратно int_to_real
А если мне необходим 10-тичный знак . Real*10 - real_to_int - отправить в панель с указанием показывать 1 знак после запятой. Изменить и вернуть обратно int_to_real /10

Как панель воспринимает указание, что необходимо показывать количество знаков после запятой ? или панели необходимо именно real значение для этого ?
а доки не пробовали читать?

melky
16.07.2013, 12:06
capzap пробовал и читаю, но не совсем понял, как панель работает со знаком после запятой. Это только отображение, или таким образом можно дать ей целое число и просто указывать количество знаков.
Панели пока под руками нет.

capzap
16.07.2013, 12:20
capzap пробовал и читаю, но не совсем понял, как панель работает со знаком после запятой. Это только отображение, или таким образом можно дать ей целое число и просто указывать количество знаков.
Панели пока под руками нет.

да, чтоб не возиться с реалом, его умножают на столько порядков, которое требуется для количества знаков после запятой, далее переводят в ИНТ и отправляют в панель, в настройках регистра панели задают количество знаков

melky
16.07.2013, 13:28
capzap спасибо, как раз хотел избавиться от real в панели, всего один параметр, который мне необходимо изменять с десятыми долями.

Valadar71
17.07.2013, 14:32
здравствуйте, уважаемые профи кодесиса!! пишет Вам чайник)) может кто-нибудь может скинуть свои разработки в этой программе (какие-нибудь простенькие примеры). Уж ооочень хочется научиться программировать в кодесисе. большое спасибо заранее!! :rolleyes:

melky
17.07.2013, 15:24
Valadar71 на языке ST есть примеры в разделах ПЛК. примеры программ (http://www.owen.ru/forum/forumdisplay.php?f=49)
если на языке CFC то можно брать примеры программ для ПР110,114 и переделывать на ПЛК.

MikJagger
22.07.2013, 12:13
Добрый день, не подскажите, работаю с двумя библиотеками, Mercury.lib и SmsOwen.lib, в обеих этих библиотеках есть функциональные блоки OpenPort, при добвалении обеих кодесис начинает ругаться, говорит что POU с именем OpenPort включен уже в библиотеку, подскажите как быть?!

S.A.D.
22.07.2013, 14:58
Добрый день, не подскажите, работаю с двумя библиотеками, Mercury.lib и SmsOwen.lib, в обеих этих библиотеках есть функциональные блоки OpenPort, при добвалении обеих кодесис начинает ругаться, говорит что POU с именем OpenPort включен уже в библиотеку, подскажите как быть?!
в кратце: вам не нужно создавать в проекте такой же ФБ как в библиотеке. Если вы добавили библиотеку в проект, значит все POU входящие в библиотеки уже присутствуют в проекте и для использования ФБ нужно просто объявить его экземпляр. Подробнее написано в руководстве по программированию и справке кодезиса.

amn
22.07.2013, 19:09
Попробуйте в одной из библиотек удалить лишний ФБ.

MikJagger
22.07.2013, 21:31
Попробуйте в одной из библиотек удалить лишний ФБ.
Библиотеки закрытые, удалить ФБ нельзя...

MikJagger
23.07.2013, 06:12
в кратце: вам не нужно создавать в проекте такой же ФБ как в библиотеке. Если вы добавили библиотеку в проект, значит все POU входящие в библиотеки уже присутствуют в проекте и для использования ФБ нужно просто объявить его экземпляр. Подробнее написано в руководстве по программированию и справке кодезиса.
Может Вы не поняли, Добавляя эти две библиотеки, через менеджер библиотек и создавая простейший проект ";", кодесис уже начинает ругаться!

petera
23.07.2013, 06:47
Может Вы не поняли, Добавляя эти две библиотеки, через менеджер библиотек и создавая простейший проект ";", кодесис уже начинает ругаться!
Попробуйте сделать так
1. Добавить в проект только одну библиотеку.
2. Выбрать в меню Проект-->Опции...-->Генератор кода.
3. Нажать кнопку Исключить объекты
4. В дереве POU выбрать имя ФБ которое есть в обоих библиотеках.
5. Установить галку внизу, слева -Исключить.
6. Нажать ОК.
7. Сделать простейший проект ";". И откомпилировать его.
8. Добавить в проект вторую библиотеку. И будет Вам счастье.:)

MikJagger
23.07.2013, 14:17
Попробуйте сделать так
1. Добавить в проект только одну библиотеку.
2. Выбрать в меню Проект-->Опции...-->Генератор кода.
3. Нажать кнопку Исключить объекты
4. В дереве POU выбрать имя ФБ которое есть в обоих библиотеках.
5. Установить галку внизу, слева -Исключить.
6. Нажать ОК.
7. Сделать простейший проект ";". И откомпилировать его.
8. Добавить в проект вторую библиотеку. И будет Вам счастье.:)
Не помогло, не удаляется ФБ из библиотеки...

petera
23.07.2013, 15:41
Не помогло, не удаляется ФБ из библиотеки...
А и не должен удаляться из библиотеки. Просто элемент исключенный из компиляции станет в библиотеке другого цвета(зеленого). И не будет участвовать в компиляции.
Когда писал свой совет,то проверял и у меня все получилось.
Сейчас проверил опять. НЕ РАБОТАЕТ!!!.
Но оказалось, что есть зависимость от места расположения библиотек в дереве
У меня нет, указанных Вами библиотек, но поясню на примере двух других библиотек. Например Pid_regulators и Owen_FB.
1. Вот так ругается компилятор, который нашел три одинаковых ФБ в обоих библиотеках
9420
2. При исключении из компиляции элементов в библиотеке расположенной выше(по отношению ко второй) при компиляции получаю те же ошибки.
9421

3. Но стоит включить исключенные ФБ в вышестоящей библиотеке, а в ниже стоящей эти ФБ исключить, то все прекрасно компилируется и ошибок нет.
9422
9423
Таким образом исключать ФБ из компиляции нужно у библиотеки более ниже расположенной в списке подключенных библиотек

MikJagger
24.07.2013, 06:19
А и не должен удаляться из библиотеки. Просто элемент исключенный из компиляции станет в библиотеке другого цвета(зеленого). И не будет участвовать в компиляции.
Когда писал свой совет,то проверял и у меня все получилось.
Сейчас проверил опять. НЕ РАБОТАЕТ!!!.
Но оказалось, что есть зависимость от места расположения библиотек в дереве
У меня нет, указанных Вами библиотек, но поясню на примере двух других библиотек. Например Pid_regulators и Owen_FB.
1. Вот так ругается компилятор, который нашел три одинаковых ФБ в обоих библиотеках
9420
2. При исключении из компиляции элементов в библиотеке расположенной выше(по отношению ко второй) при компиляции получаю те же ошибки.
9421

3. Но стоит включить исключенные ФБ в вышестоящей библиотеке, а в ниже стоящей эти ФБ исключить, то все прекрасно компилируется и ошибок нет.
9422
9423
Таким образом исключать ФБ из компиляции нужно у библиотеки более ниже расположенной в списке подключенных библиотек

Спасибо большое, помогло, действительно есть зависимость исключения блока от положения библиотеки в менеджере библиотек. Тогда еще вопрос, как считаете ФБ "OpenPort", в разных библиотеках должны ,в принципе, одинаковые задачи выполнять!?

amn
24.07.2013, 18:38
Тогда еще вопрос, как считаете ФБ "OpenPort", в разных библиотеках должны ,в принципе, одинаковые задачи выполнять!?

Посмотрите объявленные входные и выходные переменные этого ФБ. Если в обоих библиотеках они одинаковые, то скорее всего это один и тот же код.

MikJagger
24.07.2013, 19:02
Посмотрите объявленные активходные и выходные переменные этого ФБ. Если в обоих библиотеках они одинаковые, то скорее всего это один и тот же код.
Входные и выходные переменные одинакового типа, только в одном блоке еще есть вход "enable", выясним когда буду на практике применять. Спасибо за помощь.

Щербаков Николай
31.07.2013, 18:11
Уважаемые коллеги! Помогите разобраться. Нужно из программы сделать функциональный блок. Что то не получается. Подскажите как это правильно делать. В программе есть retain-блок.

kolyan
31.07.2013, 18:41
Уважаемые коллеги! Помогите разобраться. Нужно из программы сделать функциональный блок. Что то не получается. Подскажите как это правильно делать. В программе есть retain-блок.

В программе не стал разбираться.
Сам ФБ во вложении.

Щербаков Николай
31.07.2013, 19:19
Спасибо Kolyan. Буду разбираться. Если есть возможность и время, прошу подсказать, как правильно, и главное без ошибок, создавать ФБ.

kolyan
31.07.2013, 19:34
Спасибо Kolyan. Буду разбираться. Если есть возможность и время, прошу подсказать, как правильно, и главное без ошибок, создавать ФБ.

Есть хорошая книга: Программируемые контроллеры. Практическое применение языков стандарта МЭК 61131-3
Петров И.В.
Скачивается без проблем.
На стр.91 ответ на Ваш вопрос.

kosmas
02.08.2013, 23:19
И снова здрасьте...

Начал пытаться осваивать ОРС.

На вложенной картинке видно, что есть внешний модуль ModBus, пристегнутый к контроллеру по 485. С него получаю температуру. Модуль slave, PLC - master.

В конфигурации создал модуль модбас слейв, чтобы скада была мастером, и пытаюсь прицепить это дело к ОРС через ethernet.

И тут же возник вопрос с адресацией и типами. В CodeSys про переменные написано:


VAR
T01: REAL; (* Датчик температуры 1 *)
T02: REAL; (* Датчик температуры 2 *)
T03: REAL; (* Датчик температуры 3 *)
END_VAR

(* Смотрим температуру с 1-Wire *)
T01 := INT_TO_REAL(WORD_TO_INT(TEMP01)) / 100.0;
T02 := INT_TO_REAL(WORD_TO_INT(TEMP02)) / 100.0;
T03 := INT_TO_REAL(WORD_TO_INT(TEMP03)) / 100.0;


Как мне получить в том же Lectus'e данные либо с самих датчиков (TEMP01), либо из переменной T01?

Неужели для каждой переменной из проекта надо будет в модуле ModBus Slave заводить свою? Или я чего-то недопонимаю?

Ryzhij
03.08.2013, 07:44
Как мне получить в том же Lectus'e данные либо с самих датчиков (TEMP01), либо из переменной T01?
Из контроллера, но имя уже будет другим ;)

Неужели для каждой переменной из проекта надо будет в модуле ModBus Slave заводить свою? Или я чего-то недопонимаю?Сеть у Вас уже другая, а контроллер всё тот же. Это значит, что переменные в новой сети должны быть описаны каждая заново и персонально. Не все из проекта, а те которые Вы будете передавать через OPC.
Имена переменных в том же контроллере повторятся не могут. Типы переменных лучше оставить такими же и в новой сети - меньше путаницы. Хотя можете и преобразовать под свои нужды - дело Ваше.
Адреса переменным в новой сети в соответствии с их типом Вы назначаете в контроллере.
В конфигурации OPC Вы заново будете описывать все переменные, давая им имена (можно уже другие, но зачем?) и указывая назначенный в контроллере адрес и тип.
Ну, а потом в SCADA в базу тэгов будете вносить имена OPC переменных. Но там проще - обычно в SCADA есть визард для этого.

Вот как-то так.

kosmas
04.08.2013, 12:59
Из контроллера, но имя уже будет другим ;)
Вот как-то так.

Спасибо! Буду думать... :)

_Pavel_
05.08.2013, 12:45
Господа, подскажите, пожалуйста: в конфингураторе задач, задача, настроенная на событие, выполняется по фронту соответствующей переменной типа BOOL, как правильно сделать задачу, которая будет работать по срезу той же переменной?
Сейчас просто инвертирую нужную мне пременную в свободной задаче ПЛК и завожу в качестве события, но кажется это как-то коряво...

VitVir
05.08.2013, 17:33
В программе на CFC уперся в конец поля, т.е. элементы уже не влазят, поле ограничено снизу. Можно ли как-то это настроить, увеличить поле ввода?
Я понимаю, что можно разделить, сделать вызвать другой программы, поставить элементы правее, но пока стоит именно такая задача.

kolyan
05.08.2013, 20:06
Господа, подскажите, пожалуйста: в конфингураторе задач, задача, настроенная на событие, выполняется по фронту соответствующей переменной типа BOOL, как правильно сделать задачу, которая будет работать по срезу той же переменной?
Сейчас просто инвертирую нужную мне пременную в свободной задаче ПЛК и завожу в качестве события, но кажется это как-то коряво...

Используйте F_TRIG из стандартной библиотеки.

amn
05.08.2013, 20:37
В программе на CFC уперся в конец поля, т.е. элементы уже не влазят, поле ограничено снизу. Можно ли как-то это настроить, увеличить поле ввода?
Я понимаю, что можно разделить, сделать вызвать другой программы, поставить элементы правее, но пока стоит именно такая задача.

VitVir, попробуйте выделить несколько элементов и нажать правую кнопку мыши. Выберите пункт Create macro (упаковать в макрос). Кодесис свернет их в один маленький блок и место освободится.

kosmas
06.08.2013, 22:27
Уважаемые коллеги!
Нижайшая просьба - слепите пример из 5-6 переменных , 3 из которых доступны на чтение-запись из СКАДы через ОРС-сервер хоть Lectus, хоть какой бесплатный.. Ну, и конфиг ОРС посмотреть бы...
Потомки и я вас не забудут! :)

Как из СКАДЫ прочитать переменные из ОРС - понятно. А вот как их прочитать СКАДОЙ из контроллера через ОРС- пока не очень. Малость с адресацией запутался... :(.

krasmontag
07.08.2013, 20:26
где-то спросил уже, но может тут быстрее ответят. Есть плк63, при загрузке примера работы с пм-01 выдал:: неразрешенные ссылки на внешние pou::: потом, при заливке другой программы(которая кстати отлично на нем работала), выдал ошибку о несоответствии платформы. смена таргета ни к чему не привела. вообще перестал загружаться. при попытке сменить внутреннее по, выдал:::не совпадают идентификаторы прошивок::: и программа завершает работу. что делать?

sea
09.08.2013, 00:11
Возможно в CDS без подключения ПЛК (в режиме эмуляции) оценить время, затрачиваемое на выполнение написанной программы, для оценки требуемого периода цикла ПЛК?

Yegor
09.08.2013, 05:58
Возможно в CDS без подключения ПЛК (в режиме эмуляции) оценить время, затрачиваемое на выполнение написанной программы, для оценки требуемого периода цикла ПЛК?Не думаю, т.к. нет и не будет эмуляции самого железа ПЛК.

yurmik
12.08.2013, 13:39
Всем привет, вопрос такой. Как создать условие в кнопке? В меню "Ввод", далее галка "Вып. программы". Там с помощью ASSIGN можно присваивать значения переменным. А как задать условие присваивания в этом поле?

yurmik
12.08.2013, 17:28
И еще вопрос, в меню "Вып. программы" есть команда Programm. Импортируется файл.txt. Напиршите пожалуйста пример синтаксиса в этом файле на примере оператора IF.

mush00
19.08.2013, 17:16
Подскажите, как подключается датчик температуры со встроенным нормирующем преобразователем. у него 4 клеммы (вх +/-, вых +/-)не считая ещё одного разъёма под неизвестный мне коннектор. Шунтирующее сопротивление есть. Имеется 2-х проводная схема подключения от внешнего источника, но, похоже, это не тот вариант. Первый раз подключил по надписям на клеммах, он успел нагреться и я не стал больше судьбу испытывать.

RV9WFJ
25.08.2013, 14:35
Подскажите, как подключается датчик температуры со встроенным нормирующем преобразователем. у него 4 клеммы (вх +/-, вых +/-)не считая ещё одного разъёма под неизвестный мне коннектор. Шунтирующее сопротивление есть. Имеется 2-х проводная схема подключения от внешнего источника, но, похоже, это не тот вариант. Первый раз подключил по надписям на клеммах, он успел нагреться и я не стал больше судьбу испытывать.Уточните к чему подключаете. Если к ПЛК то вам и надо смотреть схему с внешним источником, просто как внешний источник использовать выход 24в ПЛК.

AmpeR3
25.08.2013, 18:06
Здравствуйте!
Подскажите пожалуйста, приобрёл для обучения Owen PLC 110-32M-R для программирования в CoDeSys v.2. Программы с применением одного ПЛК у меня получаются, а вот с подключением модуля расширения МК110 224.8ДН4Р по шине RS-485 у меня не получается никак. Все настройки у них по свойствам связи все одинаковые (скорость, биты и т.д.). Перечитал уже сколько раз эти инструкции по этим приборам, но связи в программном ходе задачи нетушки. Может быть что-то не так настраиваю в свойствах ПЛК, понять не могу. Мне всего-то нужно чтобы каждый вход и выход работал независимо, т.е. по программе (вкл-выкл) без всяких ШИМ. Уже ставил Modbus Master связь RS-485, Universal Modbus device. Для входа Register Input module, в параметрах модуля Registr - 51. Command - Read holding Registers (0x03). Для выхода Register Output module, в параметрах модуля Registr - 0. Command - Preset singl Registers (0x06). Для остальных выходов Registr - 1,2,3. Но всё равно в тестовой программе при подачи на вход сигнала, нет его на выходе, мне кажется сигнал пролетает за микросекунды. А как сделать чтобы сигнал был постоянным, пока есть сигнал на входе и на выходе не пролетал за микросекунды, а держался пока это необходимо по программе.
Заранее ВАм большое спасибо за ответ. Уж очень хочется правильного ответа!!!

RV9WFJ
26.08.2013, 09:13
Так у вас адресация неправильная. Попробуйте пример. Протокол ModBus RTU на модуле поставьте, остальное по умолчанию.

Василий Кашуба
26.08.2013, 11:19
Здравствуйте!
Подскажите пожалуйста, приобрёл для обучения Owen PLC 110-32M-R для программирования в CoDeSys v.2. Программы с применением одного ПЛК у меня получаются, а вот с подключением модуля расширения МК110 224.8ДН4Р по шине RS-485 у меня не получается никак. Все настройки у них по свойствам связи все одинаковые (скорость, биты и т.д.). Перечитал уже сколько раз эти инструкции по этим приборам, но связи в программном ходе задачи нетушки. Может быть что-то не так настраиваю в свойствах ПЛК, понять не могу. Мне всего-то нужно чтобы каждый вход и выход работал независимо, т.е. по программе (вкл-выкл) без всяких ШИМ. Уже ставил Modbus Master связь RS-485, Universal Modbus device. Для входа Register Input module, в параметрах модуля Registr - 51. Command - Read holding Registers (0x03). Для выхода Register Output module, в параметрах модуля Registr - 0. Command - Preset singl Registers (0x06). Для остальных выходов Registr - 1,2,3. Но всё равно в тестовой программе при подачи на вход сигнала, нет его на выходе, мне кажется сигнал пролетает за микросекунды. А как сделать чтобы сигнал был постоянным, пока есть сигнал на входе и на выходе не пролетал за микросекунды, а держался пока это необходимо по программе.
Заранее ВАм большое спасибо за ответ. Уж очень хочется правильного ответа!!!
Попробуйте так:
IF in1 THEN out1 := 1000;
ELSE out1 := 0;
END_IF;

mush00
27.08.2013, 11:47
Уточните к чему подключаете. Если к ПЛК то вам и надо смотреть схему с внешним источником, просто как внешний источник использовать выход 24в ПЛК.

Да, к ПЛК 160, вопрос не по источнику, он на датчики отдельный. На нём сидит так же датчик избыт давления ПД100 (у него просто всё было - 2 контакта по схеме),проблема в том, что совсем не понимаю куда какие клеммы термодатчика подключать. В этом термодатчике 4 клеммы. Ткните, пожалуйста пальцем куда вх+, вх-, вых+, вых-. Подключил один раз - тот нагрелся сильно.

вот схема. Справа мой вариант.
9740

Заранее спасибо

Василий Кашуба
27.08.2013, 12:46
Да, к ПЛК 160, вопрос не по источнику, он на датчики отдельный. На нём сидит так же датчик избыт давления ПД100 (у него просто всё было - 2 контакта по схеме),проблема в том, что совсем не понимаю куда какие клеммы термодатчика подключать. В этом термодатчике 4 клеммы. Ткните, пожалуйста пальцем куда вх+, вх-, вых+, вых-. Подключил один раз - тот нагрелся сильно.

вот схема. Справа мой вариант.
9740

Заранее спасибо
Вх+/- на терморезистор, а Вых+/- аналогично датчику ПД100.

mush00
27.08.2013, 12:48
а если данный прибор куплен уже готовым (в сборе) в овене, значит, терморезистор уже подключен?

Василий Кашуба
27.08.2013, 13:13
а если данный прибор куплен уже готовым (в сборе) в овене, значит, терморезистор уже подключен?
Мне отсюда не видно, выложите фото.:)

mush00
27.08.2013, 13:27
Спасибо за совет, если ничего не выйдет - выложу позже )))

Денис_Гуливатенко
27.08.2013, 20:50
Подскажите, есть готовые решения с визуализацией ПЛК73(кнопки, дисплей)?
В какой библиотеке ПИД с автонастройкой?

БЕСПЛАТНАЯ БИБЛИОТЕКА ФУНКЦИОНАЛЬНЫХ БЛОКОВ:
– разработки ОВЕН: ПИД-регулятор с автонастройкой, блок управления 3-х позиционными задвижками и др.;
– стандартные библиотеки CoDeSys.

гандурас
28.08.2013, 07:27
Наступил на те же грабли.Имеется в виду ТРМ151-03 по изучал ваш форум так и не уяснил для себя, кто нибудь обучил этого зверя или используют как
индикатор.
Если есть кто полностью разобрался, то прошу отозваться.Можно сюда или сюда rydnika.65@mail.ru

logo
28.08.2013, 09:07
Подскажите как запустить Owen Process Manager (OPM.exe), так чтобы сразу запустился процесс записи данных.
Хочу при включении компьютера чтобы сразу запускался Process Manager и шла запись данных.

S.A.D.
29.08.2013, 10:46
возникла потребность подправить немного уже работающий объект, который делали другие люди, которые отказываются ехать и подправлять. Раньше с этим не сталкивался, посему не возникало проблем. А сейчас возникла. Я честно пользовался поиском, но конкретного ответа не нашел. Я знаю, что можно из одного ПЛК в другой перекинуть скомпилированные файлы проекта. А есть ли возможность их декомпилировать чтоб поличить исходники? Я подозреваю, что нет, но решил спросить все таки, вдруг кто этим заморачивался?

Василий Кашуба
29.08.2013, 11:33
Ответ однозначный НЕЛЬЗЯ.

S.A.D.
29.08.2013, 11:39
Ответ однозначный НЕЛЬЗЯ.
спасибо большое!

RV9WFJ
29.08.2013, 11:40
а если данный прибор куплен уже готовым (в сборе) в овене, значит, терморезистор уже подключен?Да уже подключен, используйте только Вых-/+ как на ПД100. Если успел "нагреться" то возможно уже в ремонт.

RV9WFJ
29.08.2013, 11:54
Ответ однозначный НЕЛЬЗЯ.Отчего так однозначно. Скомпилированный файл это DEFAULT.PRG + DEFAULT.CHK в контроллерах с файловой системой. Соответственно если контроллеры и прошивки одинаковые то возможно и получится. Сам не пробовал. Начать стоит с того, что в контроллере проверить наличие исходника. Лично я его почти всегда оставляю, мне не жалко. Да и это для себя же если через 3 года придется вернуться к проекту. Хранить на сервере это хорошо, но бывает и они ломаются.

Василий Кашуба
29.08.2013, 12:13
Отчего так однозначно. Скомпилированный файл это DEFAULT.PRG + DEFAULT.CHK в контроллерах с файловой системой. Соответственно если контроллеры и прошивки одинаковые то возможно и получится. Сам не пробовал. Начать стоит с того, что в контроллере проверить наличие исходника. Лично я его почти всегда оставляю, мне не жалко. Да и это для себя же если через 3 года придется вернуться к проекту. Хранить на сервере это хорошо, но бывает и они ломаются.
Я сказал про декомпиляцию, так как на чужих объектах в контроллерах никогда исходников не находил.

Денис_Гуливатенко
29.08.2013, 16:02
Как на языке CFC задать значение переменной, если она имеет пользовательский тип - структуру.
9789


Спасибо, уже разобрался:D

Ozbekbeton
31.08.2013, 18:27
Скажите, пожалуйста, как в визуализации в "Конфигурировании элемента" в категории "Текст" в строке написать так, чтобы выводилось значение переменной типа TIME?

amn
31.08.2013, 20:47
Скажите, пожалуйста, как в визуализации в "Конфигурировании элемента" в категории "Текст" в строке написать так, чтобы выводилось значение переменной типа TIME?

В категории "Text" пишите: время %s
В категории "Variables" там где "Textdisplay" через клавишу "F2" выбираете свою переменную.

Если значение переменной например 5 секунд, то результат будет: время T#5s

Ozbekbeton
02.09.2013, 14:31
Спасибо!!! Все получилось.

aerofotograf
03.09.2013, 12:24
Здравствуйте.

Есть ли в CoDeSys такой блок для языка программирования CFC, который сбрасывает значения всех переменных к первоначальному? Что-то вроде перезагрузки контроллера?

Спасибо.

Lam-Ka
03.09.2013, 13:45
Здравствуйте.

Есть ли в CoDeSys такой блок для языка программирования CFC, который сбрасывает значения всех переменных к первоначальному? Что-то вроде перезагрузки контроллера?

Спасибо.Блока такого нет (ибо заранее не известно какие именно переменные нужно сбросить). Но Вы можете создать свой собственный ФБ.

aerofotograf
03.09.2013, 14:09
Понял, спасибо, буду думать...

Nikita_C
03.09.2013, 16:12
Добрый день.
Можно ли передать из 1 в 2 используя одно и тоже имя переменной?
9858

zendo057
03.09.2013, 23:33
в контроллере проверить наличие исходника. Лично я его почти всегда оставляю, мне не жалко. Да и это для себя же если через 3 года придется вернуться к проекту. Хранить на сервере это хорошо, но бывает и они ломаются.

А поподробней как это сделать?

Николаев Андрей
04.09.2013, 08:33
Понял, спасибо, буду думать...
Еще раз обдумайте логику работы Вашего объекта. Сбрасывать ВСЕ переменные как будто перезагрузка - это какое-то логическое несоответствие...
Если необходимо сбрасывать значение нескольких переменных - в самом верху программы (язык не важен) пишете соответствующее условие.
if "что-то случилось" then
perem1:=0;
perem2:=1;
perem3:=...:
"что-то случилось" = not "что-то случилось";
end_if

На FBD можно использовать функцию move, причем использовать блок с разрешением на исполнение (block with en). На вход en подавать это самое "если что-то случилось".
На LD все еще проще...

Добрый день.
Можно ли передать из 1 в 2 используя одно и тоже имя переменной?
9858
Можно, но лучше использовать два имени. А в программе сделать простое присвоение.
Причем присвоение можно делать даже без имени - просто по адресу. Но я очень рекомендую поименовать обе переменные - если проект будет модернизироваться, а еще не дай бог ни вами - это спасет Вас от "покраснения ушей"...

А поподробней как это сделать?
Для того, чтобы записать исходный проект (а не только исполняемый код) в контроллер - необходимо находясь на связи с ПЛК войти в меню Онлайн, и выполнить соответсвующую команду (загрузка исходного кода, или запись файла в ПЛК).

Алексей Геннадьевич
04.09.2013, 10:53
В чём основные различия между CoDeSys v2 и CoDeSys v3 ?