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

kot.shrodingera
06.02.2018, 11:57
capzap, petera Спасибо за разъяснения

kot.shrodingera
06.02.2018, 12:20
Подскажите ещё, как проще всего организовать побитовое ИЛИ? Встроенной функции я так понимаю нет? Необходимо использовать POINTER TO BOOL и цикл по длине исходных данных или есть какой-то удобный способ?

capzap
06.02.2018, 12:25
W#16#7777 OR W#16#6666 чему будет равно?

kot.shrodingera
06.02.2018, 12:47
W#16#7777 OR W#16#6666 чему будет равно?

Не догадался, что так просто работает. А зачем W# ?

capzap
06.02.2018, 13:00
http://www.owen.ru/catalog/codesys_v2/51162335 здесь найдутся многие ответы,начать стоит с этого документа http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf

fren
06.02.2018, 20:30
Ставлю русский в кодесис и вот такой язык появляется 35430 раньше такого не было и ставился русский нормально.

Осинский Алексей
07.02.2018, 08:44
Ставлю русский в кодесис и вот такой язык появляется 35430 раньше такого не было и ставился русский нормально.

Зайдите в настройки (Project - Options - Editor) и выберите шрифт с поддержкой кириллицы. Все русские надписи станут читабельны.

35432

Кроме этого советую шрифт Droid Sans Mono (http://blog.cosmix.org/2009/10/27/a-slashed-zero-droid-sans-mono/) - удобный моноширный шрифт.

Евгений Кислов
09.02.2018, 14:46
Добрый день. Подскажите как с помощью широковещательной команды записать на несколько СМИ-2? Вроде сделал все правильно (причем на контроллере другого производителя работает) но выдает ошибку 81. Может у кого есть пример, буду благодарен.35278

Добрый день. Теперь на сайте доступен пример:
http://www.owen.ru/catalog/svetodiodnij_indikator_smi2/54824558

sosna
11.02.2018, 15:43
Всем здравствуйте. Подскажите, можно ли в плк 150 продублировать каким либо способом кнопку старт/cтоп на свободный дискретный вход для удаленного останова программы?

RV9WFJ
12.02.2018, 06:07
что мешает просто вызов основной программы сделать по состоянию дискретного входа?
В PLC_PRG:
IF bIn1 THEN
ProgMain();
END_IF;

Эдуард_Н
12.02.2018, 18:06
Подскажите я правильно вот это:35545 изобразил в ST: 35546

sosna
12.02.2018, 18:13
что мешает просто вызов основной программы сделать по состоянию дискретного входа?
В PLC_PRG:
IF bIn1 THEN
ProgMain();
END_IF;

Не силен в ST. Как можно реализовать на CFC? И потом мне не нужно вызывать программу.
Мне нужно в любой момент остановить ее.

xapymam6ypoji
12.02.2018, 22:05
Приветствую.
Не совсем понял, как пользоваться режимом работы modbus мастера Work mode - by command.
Для записи или считывания регистров слейва мне достаточно записать 0xFF в регистр %QB8.2.0? Как будет это работать, если я каждый цикл ПЛК буду писать это значение?
Спасибо.
35552

Aroha
13.02.2018, 11:04
Здравствуйте.
Можно ли на ПЛК160 поднять одновременно Modbus TCP мастер и слейв.
Стоит задача: по модбас вычитывать данные с нескольких устройств (до восьми), производить над этими данными ряд арифметических действий, а потом отправлять результат на другое устройство (одно), тоже по модбас.
Все эти устройства в одной сети. Всюду Modbus TCP.

Garikrus
14.02.2018, 18:15
Всем привет.

Делаю первые шаги ПЛК100-24-P-L.

Хочу сделать так:

При срабатывании входа DI0 (контролируется Триггером по переднему фронту TrDI0) должен вызываться таймер TOF - включать выход yellow1 и спустя 5 сек. - выключать его.

Если просто в тело PLC_PRG написать:

TOF_Yellow1(IN:=TrDI0, PT:=T#5s , Q=> , ET=> );
yellow1:=TOF_Yellow1.Q;

то работает;

а если написать

IF TrDI0=TRUE THEN

TOF_Yellow1(IN:=TRUE, PT:=T#5s , Q=> , ET=> ); ВЗВОЖУ ТАЙМЕР должен появиться Q=TRUE;
TOF_Yellow1.IN:=FALSE; ЗАПУСКАЮ ОТСЧЁТ должен начаться отсчёт
yellow1:=TOF_Yellow1.Q; Выход yellow1 = TRUE с момента взвода таймера и до конца отсчёта.
уходим на проверку IF
END_IF

не работает.

Что я делаю не так?

Спасибо.

capzap
14.02.2018, 18:26
Всем привет.

Делаю первые шаги ПЛК100-24-P-L.

Хочу сделать так:

При срабатывании входа DI0 (контролируется Триггером по переднему фронту TrDI0) должен вызываться таймер TOF - включать выход yellow1 и спустя 5 сек. - выключать его.

Если просто в тело PLC_PRG написать:

TOF_Yellow1(IN:=TrDI0, PT:=T#5s , Q=> , ET=> );
yellow1:=TOF_Yellow1.Q;

то работает;

а если написать

IF TrDI0=TRUE THEN

TOF_Yellow1(IN:=TRUE, PT:=T#5s , Q=> , ET=> ); ВЗВОЖУ ТАЙМЕР должен появиться Q=TRUE;
TOF_Yellow1.IN:=FALSE; ЗАПУСКАЮ ОТСЧЁТ должен начаться отсчёт
yellow1:=TOF_Yellow1.Q; Выход yellow1 = TRUE с момента взвода таймера и до конца отсчёта.
уходим на проверку IF
END_IF

не работает.

Что я делаю не так?

Спасибо.
то что функциональный блок таймера вызываться должен каждый цикл, чтобы отситать положенное время, а в условии когда TrDI0 становиться FALSE он не вызывается о отсчет времени не ведет

Garikrus
14.02.2018, 18:47
Capzap, спасибо.

Я никак не пойму - как выполняется программа на ST?

Контроллер каждую строчку друг за дружкой читает и выполняет?

Если в строке - таймер - контроллер ждёт пока не не кончится время этого таймера, а потом читает и выполняет дальше или сразу после запуска таймера бежит дальше по программе, а таймер сам по себе работает? Т.е. можно запустить много параллельных таймеров и других задач?

Что такое этот пресловутый цикл? - Пробежка от начала программы до конца?

Почему даже 1 раз не запускается у меня таймер в IF ?

Один же раз в каком-нибудь цикле TrDI0 становится TRUE - я же жму кнопку и Триггер видит это.


Я изменил TrDI0 на просто сигнал входа DI0.

IF DI0=TRUE THEN

TOF_Yellow1(IN:=TRUE, PT:=T#5s , Q=> , ET=> ); ВЗВОЖУ ТАЙМЕР должен появиться Q=TRUE;
TOF_Yellow1.IN:=FALSE; ЗАПУСКАЮ ОТСЧЁТ должен начаться отсчёт
yellow1:=TOF_Yellow1.Q; Выход yellow1 = TRUE с момента взвода таймера и до конца отсчёта.
уходим на проверку IF
END_IF

В этом случае при нажатии кнопки - DI0 - включается выход yellow1 и продолжает быть true. Таймер не срабатывает на начало отсчёта даже после отпускания кнопки.

Почему IF даже один раз не выполняется? Не могу понять.

capzap
14.02.2018, 19:04
смысл таймера в контроллерах это зафиксировать по фронту входного сигнала текущее время и далее выполняя каждый прогон программы сравнивать текущее время с запомненным, если разница стала превышать, установленное значение в РТ, то таймер завершает свою работы и выдает на выход соответствующее состояние. Поэтому ни кто ни кого не ждет.
Постройте сперва самую простую комбинацию, например TOF_Yellow1(IN:=NOT TOF_Yellow1.Q, PT:=T#5s) без всяких условий и посмотрите как это работает, раскройте в онлайне его внутренности в окне объявлений и понаблюдайте

Garikrus
14.02.2018, 22:10
Capzap, я посмотрел - всё ясно, как устроен TOF TON и т.д. Мягко говоря - непривычно.

Как запустить ОТДЕЛЬНЫЙ таймер, отдельно от программы? Который сам считает свою задержку и независимо от цикла делает то, что ему сказано?

Здесь что, и инструкции в FOR DO будут исполняться не пока FOR сравняется с заданным, а один раз, затем, когда программа прокрутится по кругу - ещё раз?

Непонятно... где объясняется, как выполняется программа и что такое цикл?

Хочу сделать простейшее - по нажатию на кнопку лампа должна включится и погаснуть 10 раз. 2 сек. горит, 3 не горит.

И это должно быть в IF.

capzap
14.02.2018, 22:29
Capzap, я посмотрел - всё ясно, как устроен TOF TON и т.д. Мягко говоря - непривычно.

Как запустить ОТДЕЛЬНЫЙ таймер, отдельно от программы? Который сам считает свою задержку и независимо от цикла делает то, что ему сказано?

Здесь что, и инструкции в FOR DO будут исполняться не пока FOR сравняется с заданным, а один раз, затем, когда программа прокрутится по кругу - ещё раз?

Непонятно... где объясняется, как выполняется программа и что такое цикл?

Хочу сделать простейшее - по нажатию на кнопку лампа должна включится и погаснуть 10 раз. 2 сек. горит, 3 не горит.

И это должно быть в IF.
Вы хотя бы с одним из этих документов ознакомились? http://www.owen.ru/catalog/codesys_v2/51162335
Бессмысленно объяснять если основ не знаете

Garikrus
14.02.2018, 22:51
Вот и я о том - не понимая, как оно работает в самой своей основе - я не могу правильно им пользоваться.

:(

Ушёл читать. :)

alex55
15.02.2018, 16:15
Добрый день, уважаемые коллеги! Имеются порционные весы- один отвес:50кг+-200гр, совсем зациклился-не могу сообразить как организовать суммарный итог веса с нарастанием(суммировать вес порций) на ST, идеи, код, если возможно..

Вольд
15.02.2018, 20:39
Добрый день, уважаемые коллеги! Имеются порционные весы- один отвес:50кг+-200гр, совсем зациклился-не могу сообразить как организовать суммарный итог веса с нарастанием(суммировать вес порций) на ST, идеи, код, если возможно..

Программировать надо на трезвую голову. ;)

weight := weight + portion;

alex55
15.02.2018, 21:02
Это понятно, а как формировать этот weight(суммарный вес, что УЖЕ прошел через весы?), весы набрались-разгрузились, а мне надо это значение сохранить и суммировать затем с весом следующей порции итд до бесконечности) тут и с трезвой головой не разберешься!
PS. Утром все получилось, благодаря трезвому совету малопьющего Вольда! ;)

Дмитрий021
16.02.2018, 11:57
Необходимо засечь время между событиями А и Б (сигналы на дискретные входы).
Если использовать ФБ CurTimeEx то получу два значения, но оба они записаны как структуры, как найти разность между ними или как, например, перевести TimeDate в формат DATE_AND_TIME ?

fren
16.02.2018, 12:12
Нужно с урж2км перевести учёт расхода с помощью плк 100, по протолку модбасу,читал инструкцию не нашел ни в одной,пробовал пример у плк 100..
Плк 100 должен запросить данные по расходу с урж2км,чтоб узнать учёт расхода не могу понять как сделать..

Dimensy
16.02.2018, 13:25
Необходимо засечь время между событиями А и Б (сигналы на дискретные входы).
Если использовать ФБ CurTimeEx то получу два значения, но оба они записаны как структуры, как найти разность между ними или как, например, перевести TimeDate в формат DATE_AND_TIME ?

используйте функцию time() - возвращает время в миллисекундах от начала работы системы в формате TIME

Garikrus
16.02.2018, 14:37
Сapzap, прочитал. Вот такое сделал:


F_TRIGgreen1(CLK:=STARTSTOP , Q=> );

IF F_TRIGgreen1.Q=TRUE THEN
q:=1;
z:=1; (*вспомогательная переменная*)
TOF_Green1.IN:=TRUE;
TOF_Green1.PT:=T#5s; (*можно изменить первоначальную длительность горения*)
TOF_Green1; (*взвожу таймер*)
TOF_Green1.IN:=FALSE;
TOF_Green1; (*запускаю отсчёт таймера*)
TON_Green1.IN:=FALSE;
TON_Green1.PT:=T#0.5S;
TON_Green1; (*обнуляю таймер*)

END_IF
(*теперь надо заставить лампу Green1 зажечься на 0,5с, погаснуть на 0,5с и так 10 раз*)

IF F_TRIGgreen1.Q = TRUE OR z=1 THEN

IF q<=10 THEN

TOF_Green1; (*вызываю таймер чтобы он глянул, как там время; первый раз отсчитывает со строки 8, потом будет со строки 37*)
green1:=TOF_Green1.Q;


IF TOF_Green1.Q=FALSE THEN (* проверяю, окончен ли отсчёт*)

TON_Green1(IN:= TRUE); (*запускаю отсчет негорения*)

green1:=FALSE; (*можно и так - всё равно она не должна гореть в этом месте*)

END_IF

IF (*TOF_Green1.Q=FALSE AND*) TON_Green1.Q=TRUE THEN (* проверяю, кончилось ли время негорения *)
TOF_Green1.IN:=TRUE;
TOF_Green1.PT:=T#0.5s;
TOF_Green1;
TOF_Green1.IN:=FALSE;
TOF_Green1; (*перезапуск таймера периода горения*)

TON_Green1(IN:=FALSE); (*обнуляю таймер негорения*)

q:=q+1; (*увеличиваю счётчик циклов*)

END_IF

END_IF

END_IF (* конец действия ИФ по F_Triggreen1*)


Это работает, но для такой простой задачи - достаточно корявый "код" :)

Никак не могу понять, почему, если я вместо приращаемой каждый цикл переменной q и IF использую While или FOR для отсчета количества циклов - ПЛК перезагружается, а режим эмуляции пишет о WatchDog и зацикливании....

цикл-то должен 5 раз пройти и кончится... причём здесь зацикленность.

capzap
16.02.2018, 14:44
Никак не могу понять, почему, если я вместо приращаемой каждый цикл переменной q и IF использую While или FOR для отсчета количества циклов - ПЛК перезагружается, а режим эмуляции пишет о WatchDog и зацикливании....

цикл-то должен 5 раз пройти и кончится... причём здесь зацикленность.

потому что программирование контроллеров отличается от программирования на ПК
если программный цикл(for,while) задерживает исполнение очередного цикла плк на время большее чем заданное макс.время циклав настройках конфигуратора, произойдет перегрузка

ЗЫ попробуйте как на картинке

Dimensy
16.02.2018, 15:40
...достаточно корявый "код"
А я вот так, в свое время сделал

Garikrus
16.02.2018, 18:40
Это другое.

Я могу менять время горения и "негорения".

Но, попробую с простыми таймерами и триггерами - должно получится короче.

Garikrus
17.02.2018, 02:55
ЗЫ попробуйте как на картинке

:) Спасибо. Это праздник какой-то!

VAR
TON_BLINK_RED2: TON;
IDENT_RED2: BOOL:=FALSE;
DELAY_RED2: TIME;
COUNTER_RED2: INT:=1;
END_VAR

(*Моргание короткой записью от Capzap*)

IF TON_BLINK_RED2.Q=TRUE THEN
IDENT_RED2:=NOT IDENT_RED2; COUNTER_RED2:=COUNTER_RED2+1;
END_IF

IF IDENT_RED2=FALSE THEN
DELAY_RED2:=T#60S;
ELSE
DELAY_RED2:=T#30S;
END_IF

TON_BLINK_RED2(IN:=NOT TON_BLINK_RED2.Q AND COUNTER_RED2<=6000 , PT:=DELAY_RED2);

RED2:= NOT IDENT_RED2 AND COUNTER_RED2<=6000;

sosna
17.02.2018, 11:36
Всем добрый день. Вопрос такой. Можно ли остановить работу таймера TP в процессе выполнения программы ПЛК т.е. поставить на паузу когда он запустился и второе, обнулить его.

Дмитрий021
17.02.2018, 11:59
А к какой библиотеке относится данная функция [TIME()]? Не могу найти ее описание.

Garikrus
18.02.2018, 00:45
Подскажите, пожалуйста.

Если из программы вызывать функциональный блок, в описании переменных которого им присваивается значение

например (VAR U:BOOL:=FALSE; END_VAR)

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

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

Dimensy
19.02.2018, 00:05
А к какой библиотеке относится данная функция [TIME()]? Не могу найти ее описание.
Операторы и функции МЭК - Адресные операторы и вспомогательные функции

Dimensy
19.02.2018, 00:08
Подскажите, пожалуйста.

Если из программы вызывать функциональный блок, в описании переменных которого им присваивается значение

например (VAR U:BOOL:=FALSE; END_VAR)

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

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

Это начальное значение при инициализации блока

Garikrus
19.02.2018, 01:41
Это начальное значение при инициализации блока


Как это понять?

Эта инициализация происходит при первом вызове блока?

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

А если надо иметь возможность менять переменные в блоке - нужно обозначить их как входящие; и вызывать блок с указанием изменённых переменных?

Зинько Владислав
19.02.2018, 09:35
Это начальное значение при инициализации блока


Как это понять?

Эта инициализация происходит при первом вызове блока?

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

А если надо иметь возможность менять переменные в блоке - нужно обозначить их как входящие; и вызывать блок с указанием изменённых переменных?

Инициализация происходит при ПЕРВОМ вызове блока.
При последующих вызовах функционального блока сохраняется его предыдущее состояние.

fren
22.02.2018, 08:07
Пример с библиотекой modbus lib можете дать ссылку где посмотреть как работать с ней?

_Mikhail
22.02.2018, 10:50
Пример с библиотекой modbus lib можете дать ссылку где посмотреть как работать с ней?
http://www.owen.ru/catalog/codesys_v2/13257808

Disease_kunq
22.02.2018, 12:11
Здравствуйте!
Подскажите, как на ТРМ212 открыть конфигурацию второго входа.
Листаю параметры и на этапе когда должен перейти к нужному пункту(по инструкции) меня перекидывает к начальному параметру 1 входа.
Что я не сделал или сделал не так, пожалуйста, помогите.

odekolon
04.03.2018, 22:03
всем добрый вечер!
учусь , программировать в SFC
есть несколько вопросов

1. входы
поскольку система еще в проекте, заранее неизвестен тип датчиков (нормально закрытый или НО)
можно ли как-то сделать так, чтобы глобально указать полярность каждого входа?

например, в LD, я обычно в начале программы присваиваю значение каждого входа внутренней переменной (обмотке) а в дальнейшем, вместо входа, подставляю значение обмотки. Это позволяет, быстро менять полярность входа на "живой" системе.
можно ли как-то решить эту задачу , при использовании SFC?

2. Чего можно и чего нельзя в режиме SFC
можно ли многократно использовать один и тот же таймер?
то есть в одном шаге, он используется для одного, в другом шаге, для другого

то же для обмоток и выходов, то есть в разных шагах обмоткам и выходам присваиваются разные значения

serviser
15.03.2018, 12:56
Здравствуйте.

Может кто-нибудь подскажет, каким образом лучше отправлять на HMI дату последней редакции PLC_PRG или название проекта (в моем случае это выглядит как ххххххх_15_03_2018.pro)? Хочу что бы на HMI можно было увидеть дату последнего обновления, без подключения доп устройств. В ручную каждый раз писать - не вариант. Хотелось бы использовать переменную.

Спасибо!

Евгений Кислов
15.03.2018, 13:23
Здравствуйте.

Может кто-нибудь подскажет, каким образом лучше отправлять на HMI дату последней редакции PLC_PRG или название проекта (в моем случае это выглядит как ххххххх_15_03_2018.pro)? Хочу что бы на HMI можно было увидеть дату последнего обновления, без подключения доп устройств. В ручную каждый раз писать - не вариант. Хотелось бы использовать переменную.

Спасибо!

Добрый день. Используйте библиотеку SysLibProjectInfo.lib.

36064

36063

serviser
15.03.2018, 20:19
Огромное спасибо за подробный пример! У меня беда с ST, всю голову поломал))

Но, кое как добился результата, на знакомом для меня CFC.

3607336074

Может кому пригодится.

Евгений Кислов
15.03.2018, 20:43
Только лучше добавить для функции вход EN и подавать туда единичный импульс при старте ПЛК - иначе вся информация будет считываться каждый цикл ПЛК, а в этом, собственно, нет нужды.

serg_ingener
18.03.2018, 13:19
Пробовал сделать управление двигателем 1500 об/мин через частотник . Связь ПЛК 100 с частотником через RS485 . Сделал программу , чтобы плк считал количество оборотов вала двигателя и останавливал при достижении заданного числа оборотов . Соответственно 50Гц- первая скорость и 5гц вторая скорость ( для точной остановки ) Вторая скорость включается за 15 оборотов до требуемого . Датчик индуктивный , реагирует на пластинку , закреплённую на валу . Датчик до 1000гц.
Но двигатель не работал так как хотелось . То переходил с 50 до 5 герц и делал 1-3 оборота и останавливался точно (как я и хотел). Или с 50гц сразу останавливался , но делал 2 - 3 лишних оборота . Увеличивать число оборотов на медленной скорости не хотелось бы .
Думаю дело в скорости выполнения программы или обмена данными между ПЛК и частотником .
Что нужно сделать для того , чтобы моё устройство работало стабильно ?

IVM
18.03.2018, 18:35
Пробовал сделать управление двигателем 1500 об/мин через частотник . Связь ПЛК 100 с частотником через RS485 . Сделал программу , чтобы плк считал количество оборотов вала двигателя и останавливал при достижении заданного числа оборотов . Соответственно 50Гц- первая скорость и 5гц вторая скорость ( для точной остановки ) Вторая скорость включается за 15 оборотов до требуемого . Датчик индуктивный , реагирует на пластинку , закреплённую на валу . Датчик до 1000гц.
Но двигатель не работал так как хотелось . То переходил с 50 до 5 герц и делал 1-3 оборота и останавливался точно (как я и хотел). Или с 50гц сразу останавливался , но делал 2 - 3 лишних оборота . Увеличивать число оборотов на медленной скорости не хотелось бы .
Думаю дело в скорости выполнения программы или обмена данными между ПЛК и частотником .
Что нужно сделать для того , чтобы моё устройство работало стабильно ?

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

Global
28.03.2018, 12:05
добрый день!
что-то не нашёл ни поиском ни в документах, - есть ли какие-то "ограничения" в CDS на размерность уставок времени в таймерах (ТОN ТOF Blink....)в рамках одной программы? - только в миллисекундах к примеру, или можно придерживаться только одной размерности в одном проекте, допустим в секундах?
или могу я сделать допустим у Blink один вход в часах, другой в минутах, а где-то TON в миллисекундах?

petera
28.03.2018, 13:14
добрый день!
что-то не нашёл ни поиском ни в документах, - есть ли какие-то "ограничения" в CDS на размерность уставок времени в таймерах (ТОN ТOF Blink....)в рамках одной программы? - только в миллисекундах к примеру, или можно придерживаться только одной размерности в одном проекте, допустим в секундах?
или могу я сделать допустим у Blink один вход в часах, другой в минутах, а где-то TON в миллисекундах?

В каких угодно единицах - днях, часах, секундах, миллисекундах и их комбинации (t#30d12h34m15s300ms). В любых местах в тех единицах, в каких удобно, например, у Blink один вход в часах, другой в минутах

Global
28.03.2018, 13:52
В каких угодно единицах - днях, часах, секундах, миллисекундах и их комбинации (t#30d12h34m15s300ms). В любых местах в тех единицах, в каких удобно, например, у Blink один вход в часах, другой в минутахспасибо
и уже если здесь прозвучало - t#30d - в CDS нет ограничения на длительность времени таймера в 23 часа 59 минут 59 сек и т.д.? можно оперировать несколькими сутками?

petera
28.03.2018, 14:12
спасибо
и уже если здесь прозвучало - t#30d - в CDS нет ограничения на длительность времени таймера в 23 часа 59 минут 59 сек и т.д.? можно оперировать несколькими сутками?

Максимальное значение для типа TIME : 49d17h2m47s295ms (4 294 967 295 ms).

kongsberg
29.03.2018, 17:51
Добра всем.

Помогите(ткните носом) как написать простейший генератор импульсов(до 4 кГц), какую может библиотеку использовать...и т.д. в кодесис для быстрых выходов на ПЛК110.
задача: один параметр на вход - задатчик частоты, один параметр на выход - частота меняется от 0 до 3,5кгц.

пробовал использовать BLINK из библиотеки Util, но выяснил что им до 3,5 кГц никак не получиться выжать....

Благодарен, за ранее.

Зинько Владислав
30.03.2018, 07:42
Добра всем.

Помогите(ткните носом) как написать простейший генератор импульсов(до 4 кГц), какую может библиотеку использовать...и т.д. в кодесис для быстрых выходов на ПЛК110.
задача: один параметр на вход - задатчик частоты, один параметр на выход - частота меняется от 0 до 3,5кгц.

пробовал использовать BLINK из библиотеки Util, но выяснил что им до 3,5 кГц никак не получиться выжать....

Благодарен, за ранее.

Добрый день!

При помощи генерации импульсов Вы хотите управлять шаговым двигателем?
Или Вы решаете другую задачу?

kazhenek
30.03.2018, 11:37
Здравствуйте!
Прошу опытного совета новичку. С термопреобразователя ТРМ148 по rs485 приходит значение с датчика температуры. В codesys я получаю число типа REAL (для примера): 24,31396. В HMI визуализации codesys смотрится оно очень убого. Хочу преобразовать и выдать это число в формате: 24,3, - то есть округлить до десятых без нулей (если в INT преобразую то десятки уйдут). Что можете посоветовать в данном случае? Спасибо за внимание.

Евгений Кислов
30.03.2018, 11:41
Здравствуйте!
Прошу опытного совета новичку. С термопреобразователя ТРМ148 по rs485 приходит значение с датчика температуры. В codesys я получаю число типа REAL (для примера): 24,31396. В HMI визуализации codesys смотрится оно очень убого. Хочу преобразовать и выдать это число в формате: 24,3, - то есть округлить до десятых без нулей (если в INT преобразую то десятки уйдут). Что можете посоветовать в данном случае? Спасибо за внимание.

Добрый день. Используйте в визуализации форматированный вывод (в примере %.2f - два знака после запятой):

36319

kazhenek
30.03.2018, 11:46
Добрый день. Используйте в визуализации форматированный вывод (в примере %.2f - два знака после запятой):

36319

Спасибо все получилось.

Зинько Владислав
31.03.2018, 10:22
Добра всем.

Помогите(ткните носом) как написать простейший генератор импульсов(до 4 кГц), какую может библиотеку использовать...и т.д. в кодесис для быстрых выходов на ПЛК110.
задача: один параметр на вход - задатчик частоты, один параметр на выход - частота меняется от 0 до 3,5кгц.

пробовал использовать BLINK из библиотеки Util, но выяснил что им до 3,5 кГц никак не получиться выжать....

Благодарен, за ранее.

Написал Вам в личные сообщения.

CFC-ST
04.04.2018, 08:38
Добрый день!
Вопрос по синтаксису языка СFC
для программирования ПЛК110

Как на языке СFC
написать изменение бита в переменной типа WORD
аналогично тому, как я написал на языке ST?

OUT1:WORD;
OUT1.0:= nom_ust=1;


те как записать присвоение значение 1 нулевому биту переменной OUT1 типа WORD на языке CFC?
Спасибо заранее.

Нелия Зеленова
04.04.2018, 15:51
Добрый день!
Вопрос по синтаксису языка СFC
для программирования ПЛК110

Как на языке СFC
написать изменение бита в переменной типа WORD
аналогично тому, как я написал на языке ST?

OUT1:WORD;
OUT1.0:= nom_ust=1;


те как записать присвоение значение 1 нулевому биту переменной OUT1 типа WORD на языке CFC?
Спасибо заранее.

Добрый день!
Для наглядности создала для Вас небольшой пример.

Добавила второй пример с оператором EQ

Нелия Зеленова
05.04.2018, 09:44
а на кой там моve ? просто нравиццо ?

Оператор MOVE используется для присвоения значения одной переменной другой соответствующего типа. В CFC есть возможность управлять разрешением работы блока с помощью входов EN/EN0 (Вы сами и писали ранее).
Для такой задачи можно использовать и оператор EQ - так наиболее наглядно

capzap
05.04.2018, 10:01
Оператор MOVE используется для присвоения значения одной переменной другой соответствующего типа. В CFC есть возможность управлять разрешением работы блока с помощью входов EN/EN0 (Вы сами и писали ранее).
Для такой задачи можно использовать и оператор EQ - так наиболее наглядно

есть еще такой термин Asign, наверное Валенок про него
PS в CFC можно обойтись просто выходом
PSS и еще можно рекомендовать ST конвертировать в FBD, КДС сам сделает нужные преобразования

Panalexfix
09.04.2018, 13:34
День добрый!!!
Подскажите как с ПЛК отправлять готовый файл архива на ПК по ETHERNET ???? Скажем на диск С в корень (на ПК)?
Есть ли возможность это сделать с помощью готовых библиотек?
Если можно подробнее.Отправка интересует автоматическая и без запуска CDS.
ПЛК 110-60М!!!

capzap
09.04.2018, 13:43
День добрый!!!
Подскажите как с ПЛК отправлять готовый файл архива на ПК по ETHERNET ???? Скажем на диск С в корень (на ПК)?
Есть ли возможность это сделать с помощью готовых библиотек?
Если можно подробнее.Отправка интересует автоматическая и без запуска CDS.
ПЛК 110-60М!!!
разработать для плк библиотеку с протоколом samba (https://ru.wikipedia.org/wiki/Samba), если же ПК может выступать в роли файлового сервера, то написать для плк клиент под этот сервер, в бибке oscat (http://oscat.de/) например есть реализация фтп-клиента, ну или отказаться от идеи что плк что то должен куда то отправлять, а занятся решением как с ПК можно получить файл, будь то plcio (http://www.owen.ru/catalog/programmiruemij_logicheskij_kontroller_oven_plk110/87310138) или что то еще по предпочтениям

Panalexfix
09.04.2018, 14:01
capzap- Спасибо огромное !!!! облегчил задачу)))

Panalexfix
09.04.2018, 15:04
capzap-Не сочтите за наглость:), а может есть готовое решение без участия человека по передаче файла в автоматическом режиме на пк????
метод с plc_io и plccommander конечно хороши, но оператору ковыряться в файлах ПЛК не надо и тем более с возможностью их удаления!!!!
если не сложно "пните" в правильном направлении)))))
В делфи и Си не силен(((((

capzap
09.04.2018, 15:10
можно попробовать на плк организовать подобие веб-сервера, посылаете запрос с ПК например командой curl в ответ приходит файл. В любом случае потребуется реализовывать самостоятельно, готовые решения обычно делаются "под себя" и могут отличаться от Ваших желаний

Panalexfix
09.04.2018, 15:21
capzap-Спасибо за уделенное время!!)))
Получается надо программиста искать который сможет написать приложение для ПК?

capzap
09.04.2018, 15:29
программиста искать который сможет написать

для плк, на ПК можно просто браузер открыть с нужным url, но если нужен автомат то curl (https://ru.wikipedia.org/wiki/CURL) можно в cmd файле запускать по расписанию

Panalexfix
10.04.2018, 08:47
для плк, на ПК можно просто браузер открыть с нужным url, но если нужен автомат то curl (https://ru.wikipedia.org/wiki/CURL) можно в cmd файле запускать по расписанию

Спасибо!!! Решил пойти по пути наименьшего сопротивления!!!! PLC_IO->*.bat и планировщик заданий!!! Думаю этот способ самый оптимальный!!! Еще раз СПАСИБО!!!!

Global
11.04.2018, 13:01
можно ли поменять формат представления данных с аналогового модуля?
36557
при этом без изменения сигнала на входе, в CDS цифры могут меняться рандомно.
36563

В чём прикол? Это так и должно быть?

sergei_m
12.04.2018, 11:57
Для связи с панелью планирую использовать около 100 переменных. Где можно посмотреть какой адрес регистра получился для какой-то переменной в Modbus (Slave)? Неужели только вручную считать с учетом выравнивания?

capzap
12.04.2018, 12:00
Для связи с панелью планирую использовать около 100 переменных. Где можно посмотреть какой адрес регистра получился для какой-то переменной в Modbus (Slave)? Неужели только вручную считать с учетом выравнивания?

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

sergei_m
12.04.2018, 12:24
Хм, я как раз хотел массив интов читать с панели. Я в глобальных переменных объявил
ar_shleif: ARRAY [0..100] OF INT; (*Состояние шлейфов*)
а адрес первой переменной в modbus (Slave) - AT %QW8.1.0
Тогда мне нужно изменить объявление массива на
ar_shleif AT %QW8.1.0: ARRAY [0..100] OF INT; (*Состояние шлейфов*)
А в modbus (Slave) создать 100 переменных подряд типа 2 byte
Верно?

capzap
12.04.2018, 12:47
Хм, я как раз хотел массив интов читать с панели. Я в глобальных переменных объявил
ar_shleif: ARRAY [0..100] OF INT; (*Состояние шлейфов*)
а адрес первой переменной в modbus (Slave) - AT %QW8.1.0
Тогда мне нужно изменить объявление массива на
ar_shleif AT %QW8.1.0: ARRAY [0..100] OF INT; (*Состояние шлейфов*)
А в modbus (Slave) создать 100 переменных подряд типа 2 byte
Верно?

так то у Вас массив из 101 элемента, могут возникнуть проблемы

sergei_m
12.04.2018, 17:38
так то у Вас массив из 101 элемента, могут возникнуть проблемы

Да, С-шные привычки, ошибся.
Попробовал связь - работает:)

fantozes
19.04.2018, 13:40
как считать данные word с 256 адреса регистра в режиме modbus rtu slave (плк100рл, рс485)

_Mikhail
21.04.2018, 16:06
как считать данные word с 256 адреса регистра в режиме modbus rtu slave (плк100рл, рс485)

Сайтом совсем пользоваться не умеешь? Лучше в десяти темах задавать один и тот же вопрос.
На сайте можно скачать все библиотеки с описаниями http://www.owen.ru/catalog/codesys_v2/67395347
Там же и по modbus.lib

SWAT
25.04.2018, 14:30
Здравствуйте, у меня сверхдилетанский вопрос: где брать бибилеотеку sysLibTime ? В конф. Библиотеки не нашел. Скачал с ОВЕН библиотеки не нашел.

capzap
25.04.2018, 14:32
Здравствуйте, у меня сверхдилетанский вопрос: где брать бибилеотеку sysLibTime ? В конф. Библиотеки не нашел. Скачал с ОВЕН библиотеки не нашел.

http://www.owen.ru/catalog/codesys_v2/67395347 Библиотеки CODESYS

SWAT
25.04.2018, 14:52
На ПЛК 150 не нашел, скачал распаковал, как ОВЕН так и Коде

уточните если можно

И еще вопрос если можно: Как сохранить значение переменной , а потом вытащить и сравнить с чем нибудь в дальнейшем.
С уважением

capzap
25.04.2018, 15:03
На ПЛК 150 не нашел, скачал распаковал, как ОВЕН так и Коде

уточните если можно

И еще вопрос если можно: Как сохранить значение переменной , а потом вытащить и сравнить с чем нибудь в дальнейшем.
С уважением

бибки подходят для всех плк

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

SWAT
25.04.2018, 15:12
Пример, хранение данных, просто хранение. Записывать результат измерений допустим через каждый час.

А потом через 24 обработать (редне ариф.) но паралельно плк занимается своими делами, скажем так.

Типа, воспользоватся ячейкой ОЗУ.

Видимо вы предложите массив, я понял.

Rednaxel
25.04.2018, 16:47
Пример, хранение данных, просто хранение. Записывать результат измерений допустим через каждый час.

А потом через 24 обработать (редне ариф.) но паралельно плк занимается своими делами, скажем так.
...

Хранить результат измерений сколько нужно? Или после вычисления среднего очистить начать по новой? А среднее сколько хранить?
Панель есть в проекте?

Роман55
26.04.2018, 08:31
Здравствуйте. Не могли бы подсказать как реализовать проверку достоверности (актуальности данных) ? Существует два плк которые обмениваются данными, при потери связи между ними на СП 310 остаётся последние значение и висит до тех пор пока не возобновится связь. Возможно есть подходящие библиотеки или подскажите как это реализовать кодом. Заранее спасибо.

kot.shrodingera
26.04.2018, 12:49
Подскажите, как использовать аналоговые входы-выходы? Допустим я хочу просто подавать на выход 10мА. У меня ПЛК150. В конфигурации ПЛК есть два Analog Output, дал им обоим имена. Пишу программу, выбираю язык ST. Обоим именами присваиваю 10, подключаюсь к контроллеру, запускаю программу. Меряю мультиметром AO 0-1 и 0-2, на обоих по нулям. Что я делаю не так?

UPD: Проблема была в мультиметре

Lukasevich
27.04.2018, 17:00
Здравствуйте! Может кто нибудь поделиться рабочим проектом с ПИД-регулятором на ПЛК73 из util.lib.
Уже сломал мозг, регулятор очень криво работает.
Заранее спасибо.

RV9WFJ
28.04.2018, 07:16
Здравствуйте! Может кто нибудь поделиться рабочим проектом с ПИД-регулятором на ПЛК73 из util.lib.
Уже сломал мозг, регулятор очень криво работает.
Заранее спасибо.На PidReg2 пример для камеры сушки, думаю при желании на Util.lib элементарно переделать. (в проекте идеологический ляп, 4 независимых ПИД на одну камеру, правда есть возможность перевести каждый регулятор в 2х позиционный режим. Не повторяйте такое - это хотелка заказчика, оно толком работать не будет)

Ivan_ERM
05.05.2018, 12:21
Добрый день уважаемые форумчане!

Прошу у Вас помощи!
Поделитесь пожалуйста информацией (где почитать или как сделать).
Работаю с ПЛК Овен 110 60 и консолью Овен СП307.
Необходимо считывать с консоли задаваемое число (для изменения времени в таймере).
Вопрос в том, как правильно настроить передачу этого числа в контроллер (прописать вход QX в "конфигурации ПЛК")?

Использую формат данных WORD и систему чисел DEC (в консоли).

Заранее благодарю за помощь!

С уважением
Ермилов Иван.

Rednaxel
05.05.2018, 12:53
Добрый день уважаемые форумчане!

Прошу у Вас помощи!
Поделитесь пожалуйста информацией (где почитать или как сделать).
Работаю с ПЛК Овен 110 60 и консолью Овен СП307.
.....

Добрый день!
Все подробно "разжевано" в разделе Сенсорные панели оператора ОВЕН СП3хх — ПО, примеры и инструкции (http://www.owen.ru/catalog/sensornie_paneli_operatora_oven_sp3xx/95184166)
Скачайте и изучите пример Настройка обмена с ПЛК на CODESYS 2.3 (http://www.owen.ru/upl_files/PO/SP300CODESYS2.3_v1.1.zip)
В большинстве случав подойдет вариант 04_СП3xx. Пример обмена с ПЛК110 [M02] по Modbus RTU, панель - Master. Панель будет инициировать обмен и хранить заданные вами значения.

Ivan_ERM
05.05.2018, 13:15
Понял, благодарю за ответ!

Евгений Кислов
05.05.2018, 13:25
Еще рекомендую видеоурок:
https://www.youtube.com/watch?v=yJkwRU33I80

serg_ingener
07.05.2018, 12:37
Подскажите . Плк не видит , если связь с модулем ввода-вывода оборвалась . Как сделать , чтобы он определил потерю связи и , например , дал сигнал на свой дискретный выход или на внутреннюю переменную ?

enyuzer
08.05.2018, 09:44
Добрый день.
СПК110 обновить проект с USB накопителя выполняю по инструкции. После активации "Обновить проект" черный экран, ожидал реакции до 5 минут.
Еще выполнял такое действие. После "Переподключить USB" заходил в конфигуратор, сведений о USB нет.
Если дело в самом USB, какой порекомендуете применить?

enyuzer
08.05.2018, 10:45
Подобрали флеш, определяется.
После загрузки не отображаются элементы визуализации из пула изображений.
Сориентируйте, пожалуйста, в чем может быть проблема.

Евгений Кислов
08.05.2018, 11:03
Подобрали флеш, определяется.
После загрузки не отображаются элементы визуализации из пула изображений.
Сориентируйте, пожалуйста, в чем может быть проблема.

1. Например, названия файлов изображений содержали кириллицу.
2. Другой вариант - файлы изображений не были включены в проект, а только "привязаны".

См. п. 8.13 - там инструкция по правильной настройке пула:
https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_FAQ_v.1.3.pdf

enyuzer
08.05.2018, 12:27
Включены в проект.
Названия кирилицей.
Спасибо.

kot.shrodingera
16.05.2018, 05:18
Здравствуйте, можете посоветовать, что делать, если ПЛК110 иногда останавливается? Всё нормально работало, ничего не менялось, но с какого-то момента стал периодически останавливаться (лампочка Работа не горит), если нажать Старт/Стоп, работа продолжается. Хотелось бы узнать, как можно определить причину остановки?

capzap
16.05.2018, 05:38
Здравствуйте, можете посоветовать, что делать, если ПЛК110 иногда останавливается? Всё нормально работало, ничего не менялось, но с какого-то момента стал периодически останавливаться (лампочка Работа не горит), если нажать Старт/Стоп, работа продолжается. Хотелось бы узнать, как можно определить причину остановки?

Модель плк старая, если да добавляйте модуль button

kot.shrodingera
16.05.2018, 05:48
Модель плк старая, если да добавляйте модуль button

Модель не обновлённая. Можно по подробнее про модуль button? Что именно это даст?

capzap
16.05.2018, 05:55
Поиском форума воспользуйтесь

kot.shrodingera
16.05.2018, 06:02
Поиском форума воспользуйтесь

Спасибо, как я понял, бывают самопроизвольные нажатия кнопки? И добавление модуля переключает её в режим дискретного входа и отключается возможность управлять пуском с лицевой панели?

RV9WFJ
16.05.2018, 07:34
Здравствуйте! Может кто нибудь сможет помочь.
Пытаюсь разобраться с подключением термопары через модуль ввода (МВ110-224.8А) и плк 110-220.30 РМ
программа конфигуратор видит термопару и вроде как верно показывает данные(адекватно реагирует на нагрев датчика), но при запуске программы на плк данных термопары нету, постоянно показывает 0.
В чем может быть ошибка, где ее искать?Проблема в том, что у вас что-то не то со связью. Причин может быть множество, а данных о подключении вы не предоставили. Так что помочь в таком виде вам смогут только шаманы и экстрасенсы.

enyuzer
16.05.2018, 08:06
Добрый день. Предложу варианты.
1.В соответствии настроек сетевых параметров модуля и ПЛК.
2.В соответсвии номеров регистров модуля и ПЛК.
3.В соответствии команд чтения выбранному регистру (выбранным регистрам).
4.В особенности формата данных с плавающей точкой. При передаче 4-х байтных значений (тип Float 32) старшее слово передается в регистре с меньшим номером. Возможно, Вы видите старший разряд, а значение только в младшем.

Sulfur
16.05.2018, 10:59
при запуске программы на плк данных термопары нету, постоянно показывает 0.
В чем может быть ошибка, где ее искать?
В некоторых версиях модулей МВ110-8А изначально производителем выставлены переключатели в положение принудительных стандартных настроек связи. Даже при изменении в конфигураторе эти настройки остаются активны. Т. е. в конфигураторе Вы меняете все под свой протокол, сохраняете и думаете, что все нормально, а по факту работают стандартные настройки порта. И получается, что ПЛК просто не видит модуль, в следствии чего в регистрах обмена нули.
Переключатели находятся под крышечкой на лицевой панели, нужное Вам положение - все три в положении OFF.

MAX_DGTS
16.05.2018, 23:20
А мог бы кто то выложить библиотеку TcpUdpLib.lib? В гугле не нашел.

capzap
17.05.2018, 04:38
А мог бы кто то выложить библиотеку TcpUdpLib.lib? В гугле не нашел.

а поиском по форуму не ищется?

MAX_DGTS
17.05.2018, 06:10
На форуме нашел. Но вместо загрузки черный экран в браузере. С более свежих постов все загружается нормально.

MAX_DGTS
17.05.2018, 10:19
Пытался скачать из этой темы.http://www.owen.ru/forum/showthread.php?t=14315 Безрезультатно

capzap
17.05.2018, 10:27
Все что старше приблизительно пяти лет, может четырех, удаляется с сервера, но я выкладывал меньше месяца назад, тщательнее ищите в расширенном поиске

MAX_DGTS
17.05.2018, 13:23
из поисковиков куда то подевались все фтп-шные адреса КДС, где хранились бибки подобные прикрепленной с названием TcpUdpLib.lib

Жесть. и от сюда не скачивается, только черный экран((

capzap
17.05.2018, 13:30
Жесть. и от сюда не скачивается, только черный экран((

странно конечно, а так

MAX_DGTS
17.05.2018, 13:44
странно конечно, а так
Спасибо. Так с первого клика.

Dimooon
21.05.2018, 08:10
Здравствуйте, хочу с панели присылать запакованый регистр, в ПЛК распаковать, и биты распределить по исполнительным выходам -где то вкл состояние, а где то откл. Может, у кого есть шаблон реализации на CFC?

Валерон
21.05.2018, 13:20
здравствуйте коллеги! столкнулся с такой проблемой: не знаю что за датчик температуры. термопара или температурный датчик сопротивления? С датчиками сопротивления знаком хорошо с их НСХ Pt100 100П 50СU Pt500 и т д и как проверить их при помощи мультиметра.. но данный датчик при комнатной температуры показывает сопротивление 0 Ом и лишь нагревая штырь данного датчика сопротивление растет.
если это термомара то как узнать ее номинал? какой диапазон температур может мерить данный датчик.
прилагаю фото.37350

Вольд
21.05.2018, 13:37
Это термопара.

http://www.gosthelp.ru/text/gostr85852001gsitermopary.html

sergei_m
21.05.2018, 15:56
У меня вопрос по Модбас Мастеру.
Мне нужно читать из 5 одинаковых модулей по 20 регистров одного типа, расположенных друг за другом. Всё читается, только каждый регистр запрашивается отдельной командой (смотрел обмен по интерфейсу). Соответственно время опроса сильно вырастает. Может где-то нужно указать, чтобы контроллер формировал запросы на чтение блоков последовательно расположенных регистров? Или это стандартными средствами сделать невозможно? Только через библиотеку?

petera
21.05.2018, 16:23
У меня вопрос по Модбас Мастеру.
Мне нужно читать из 5 одинаковых модулей по 20 регистров одного типа, расположенных друг за другом. Всё читается, только каждый регистр запрашивается отдельной командой (смотрел обмен по интерфейсу). Соответственно время опроса сильно вырастает. Может где-то нужно указать, чтобы контроллер формировал запросы на чтение блоков последовательно расположенных регистров? Или это стандартными средствами сделать невозможно? Только через библиотеку?

Можно существенно ускорить обмен, если использовать String input module, по одному для каждого из 5 слейвов. Смотреть пример здесь https://owen.ru/forum/showthread.php?t=22915&p=244022&viewfull=1#post244022
Предложенный способ повышения скорости обмена с панелью с использованием в мастере ПЛК модулей String output module/String input module здесь http://www.owen.ru/forum/showthread.php?t=17207&p=141316&viewfull=1#post141316
Так как в одном Стринге будет "всего" 20 регистров, то проблема http://www.owen.ru/forum/showthread.php?t=21799&p=177886&viewfull=1#post177886 40 регистров Вам не грозит.

Dimooon
24.05.2018, 11:09
Простейший вопрос - 5 насосов, автоматически запускаются один за другим. Первый отработал - по заднему фронту приходит сигнал на насос 2 и тд. Как попроще так сделать, чтобы была возможность выбирать порядок включения насосов. Сначала задаем порядок включения, например 1,4,3, 2, 5. Старт - и поехало. Лучше пять булевых кнопок создать, или цифровым вводом номера насосов вводить?

Dimooon
25.05.2018, 04:37
Микрофон к сп310 приляпать-это Вы мощно подсказали... Имел ввиду - проще для меня. У меня щас последовательная цепочка включения. 12345. Мне надо переделать для изменения порядка включения. И я спросил - для простоты реализации этой схемы, лучше булевые сигналы использовать, или числовые значения? Сформулировал криво, в КЗ живу, русским слабо владею, должны понимать... Мне просто уже поля программы в CFC не хватает, надо как то покомпактней лепить.... Пытался для этого использовать оператор MUX, по всякому его вертел... слишком громоздко все с ним получается. а если булевый сигнал по заднему фронту предыдущего насоса - слишком много операторов надо создать, или ФБ надо делать отдельный... А Вы мне Алису поставить советуете....
А мне надо то - подходит оператор к панели, у него есть желание включить последовательно пять насосов в порядке 25143. На панели эти пять насосов. И вот тут я сомневаюсь.. Как понятней сделать, цифровой ввод, чтобы он этот порядок в одной строке набрал ( и как мне потом в ПЛК этот регистр распределить для этого включения), или возле каждого насоса кнопочку нажать в нужном ему порядке (тогда надо на панели цифровой дисплей соорудить возле каждого насоса с отображением порядкового номера запуска), чтобы оператор мог видеть, какой насос будет первым, какой последующий. Нажимает старт, вкл и отрабатывает первый насос - по заднему фронту надо заглянуть в тот регистр, где указано, какой насос будет следующим, и его включить и тд... Как то так...

alex55
25.05.2018, 06:47
Можно простой хитрый вариант: пять кнопок каждая со своим таймером на одинаковое время (30с например), тогда оператор нажимает кнопку2(процесс пошел), а пока доносит палец до кнопки5 проходит 1с, следовательно насос 2 включится позже 5-го ну ит.д через 30с все запустится в определенном порядке: дешево и сердито..

capzap
25.05.2018, 06:54
Ещё можно все это написать на стеке FIFO от булевых кнопок, пример очереди на стеке я выкладывал, но без ST сложно будет

Dimooon
25.05.2018, 06:58
Можно простой хитрый вариант: пять кнопок каждая со своим таймером на одинаковое время (30с например), тогда оператор нажимает кнопку2(процесс пошел), а пока доносит палец до кнопки5 проходит 1с, следовательно насос 2 включится позже 5-го ну ит.д через 30с все запустится в определенном порядке: дешево и сердито..

Тут дело в том, что насос отключается по достижению уставки по весу, и только по выполнению этого условия должна прилететь команда на запуск заданного в порядке включения следующего насоса

Dimooon
25.05.2018, 06:58
Ещё можно все это написать на стеке FIFO от булевых кнопок, пример очереди на стеке я выкладывал, но без ST сложно будет

Подскажите пожалуйста, как это реализовать

capzap
25.05.2018, 07:43
Мне не когда искать, могу только подсказать что я делал на основе библиотеки оскат

Dimooon
25.05.2018, 07:56
Ну хотя бы так....

Dimooon
25.05.2018, 11:24
У меня блокировка имеется - включенным может быть только один насос. В библиотеке OSCAT нарыл ФБ SELECT_8, попробую приделать его к этой задаче


вот щас
Правила русского йазыка - как кунгфу, настоящие мастера не используют их без надобности. Но если припрет - диктант на спор с любым

Dimooon
25.05.2018, 11:58
Ну так давайте с Вами обсудим этот моментик более предметно

Dimensy
25.05.2018, 15:27
Dimooon
Ну, можно как-то так

FUNCTION_BLOCK Pump
VAR_INPUT
c1: BYTE:=1; (* первый в очереди*)
c2: BYTE:=2; (* второй в очереди*)
c3: BYTE:=3; (* третий в очереди*)
c4: BYTE:=4; (* четвертый в очереди*)
c5: BYTE:=5; (* пятый в очереди*)
bs: BOOL; (*сигнал на переключение (по заднему фронту)*)
END_VAR
VAR_OUTPUT
p1, p2, p3, p4, p5: BOOL; (* насосы *)
END_VAR
VAR
ft1: F_TRIG;
pm: ARRAY[0..4] OF BYTE;
nm: BYTE;
a: BYTE:=1;
END_VAR

pm[0]:=SHL(a,c1-1);
pm[1]:=SHL(a,c2-1);
pm[2]:=SHL(a,c3-1);
pm[3]:=SHL(a,c4-1);
pm[4]:=SHL(a,c5-1);

ft1(clk:=bs);
IF ft1.Q THEN
nm:=(nm+1) MOD 5;
END_IF;

p1:=pm[nm].0;
p2:=pm[nm].1;
p3:=pm[nm].2;
p4:=pm[nm].3;
p5:=pm[nm].4;

Dimooon
26.05.2018, 10:30
Ну, можно как-то так

Спасибо, в понедельник испытаю

Dimooon
28.05.2018, 07:39
Dimooon
Ну, можно как-то так

Все отлично, только не могли бы Вы дописать- если с1,с2, с3, с4, с5=0, то надо пропускать эти входы. некоторые насосы могут быть не в работе

Dimensy
28.05.2018, 14:46
Dimooon
тогда, так можно

FUNCTION_BLOCK pump
VAR_INPUT
c1: BYTE:=1; (* первый в очереди*)
c2: BYTE:=2; (* второй в очереди*)
c3: BYTE:=3; (* третий в очереди*)
c4: BYTE:=4; (* четвертый в очереди*)
c5: BYTE:=5; (* пятый в очереди*)
bs: BOOL; (*сигнал на переключение (по заднему фронту)*)
END_VAR
VAR_OUTPUT
p1, p2, p3, p4, p5: BOOL; (* насосы *)
END_VAR
VAR
ft1: F_TRIG;
pm: ARRAY[0..4] OF BYTE;
nm: BYTE;
a: BYTE:=0;
b: BYTE:=1;
num: BYTE;
END_VAR

num:=0;
IF c1 > 0 THEN
pm[num]:=SHL(b,c1-1);
num:=num+1;
END_IF;
IF c2 > 0 THEN
pm[num]:=SHL(b,c2-1);
num:=num+1;
END_IF;
IF c3 > 0 THEN
pm[num]:=SHL(b,c3-1);
num:=num+1;
END_IF;
IF c4 >0 THEN
pm[num]:=SHL(b,c4-1);
num:=num+1;
END_IF;
IF c5 > 0 THEN
pm[num]:=SHL(b,c5-1);
num:=num+1;
END_IF;

ft1(clk:=bs);
IF ft1.Q AND num > 0 THEN
nm:=(nm+1) MOD num;
END_IF;

a:=31 AND pm[nm];
p1:=a.0;
p2:=a.1;
p3:=a.2;
p4:=a.3;
p5:=a.4;

Dimooon
30.05.2018, 12:15
Dimensy, нужен вход сброса, последний выход висит в true- мешает работать. Какой- то обнулятор после всего цикла нужен.
Capzap, пробовал FIFO - вроде прилетает один сигнал на считывание с R_TRIG, а он разряжает весь буфер. И светится, что пустой. Хотя в эмуляции работает как надо. Пробовал сам написать на CFC - моск чуть не взорвался. Спасите, кто может

capzap
30.05.2018, 12:46
Dimensy, нужен вход сброса, последний выход висит в true- мешает работать. Какой- то обнулятор после всего цикла нужен.
Capzap, пробовал FIFO - вроде прилетает один сигнал на считывание с R_TRIG, а он разряжает весь буфер. И светится, что пустой. Хотя в эмуляции работает как надо. Пробовал сам написать на CFC - моск чуть не взорвался. Спасите, кто может

http://www.owen.ru/forum/showthread.php?t=25216&p=221238&viewfull=1#post221238

Dimensy
30.05.2018, 13:46
Dimensy, нужен вход сброса, последний выход висит в true- мешает работать. Какой- то обнулятор после всего цикла нужен.

Т.е., блок должен отработать один круг и все, на второй не идти?

Dimensy
30.05.2018, 14:24
Dimooon
Добавил вход пуск / стоп-резет

FUNCTION_BLOCK pump
VAR_INPUT
c1: BYTE:=1; (* первый в очереди*)
c2: BYTE:=2; (* второй в очереди*)
c3: BYTE:=3; (* третий в очереди*)
c4: BYTE:=4; (* четвертый в очереди*)
c5: BYTE:=5; (* пятый в очереди*)
bSR: BOOL; (* 1 - старт, 0 - стоп/резет *)
bs: BOOL; (*сигнал на переключение (по заднему фронту)*)
END_VAR
VAR_OUTPUT
p1, p2, p3, p4, p5: BOOL; (* насосы *)
END_VAR
VAR
ft1: F_TRIG;
rt1: R_TRIG;
pm: ARRAY[0..5] OF BYTE;
nm: BYTE;
a: BYTE:=0;
b: BYTE:=1;
num: BYTE;
END_VAR

num:=0;
IF c1 > 0 THEN
num:=num+1;
pm[num]:=SHL(b,c1-1);
END_IF;
IF c2 > 0 THEN
num:=num+1;
pm[num]:=SHL(b,c2-1);
END_IF;
IF c3 > 0 THEN
num:=num+1;
pm[num]:=SHL(b,c3-1);
END_IF;
IF c4 >0 THEN
num:=num+1;
pm[num]:=SHL(b,c4-1);
END_IF;
IF c5 > 0 THEN
num:=num+1;
pm[num]:=SHL(b,c5-1);
END_IF;

IF NOT bSR THEN nm:=0; END_IF; (* стоп / резет*)
rt1(CLK:=bSR);
IF rt1.Q THEN nm:=1; END_IF; (* старт*)

ft1(clk:=bs);
IF ft1.Q AND num > 0 AND bSR THEN
nm:=(nm+1);
IF nm > num THEN nm:=1; END_IF;
END_IF;

a:=31 AND pm[nm];
p1:=a.0;
p2:=a.1;
p3:=a.2;
p4:=a.3;
p5:=a.4;

Dimooon
31.05.2018, 05:16
Спасибо большое. Да. Отработать должен один круг, потом порядок может поменяться

PotokU
05.06.2018, 13:34
Здравствуйте. Как онлайн подключиться к ПЛК/СПК, менять программу... есть ли такая возможность?

Марат Перухин
08.06.2018, 16:05
Добрый день!

Помогите с выводом графика.

37598

Мастеренко Иван
09.06.2018, 15:05
Здравствуйте. Как онлайн подключиться к ПЛК/СПК, менять программу... есть ли такая возможность?

Здравствуйте! Возможность есть.
Если нужно подключение по месту, то варианты подключения к ПЛК можно посмотреть, например, в обучающем онлайн курсе: http://www.owen.ru/catalog/programmiruemij_logicheskij_kontroller_oven_plk110/76168553
к СПК в документе СПК FAQ на стр.46 : https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_FAQ_v.1.3.pdf?_ga=2.126332941.1490052883.15283 53680-2011946049.1520836262


Если имеете в виду удаленное подключение, то, например, можно подключить контроллер по ethernet к роутеру, который имеет доступ в интернет. После чего на роутере настроить проброс портов.

Мастеренко Иван
09.06.2018, 15:10
Добрый день!

Помогите с выводом графика.

37598

Здравствуйте! Выложите, пожалуйста, Ваш проект (можете отправить его мне по почте) и напишите, какие переменные нужно вывести на график.

prilutsky
13.06.2018, 10:44
Добрый день.
Подскажите,пожалуйста,как восстановить пункт меню "Alarm Configuration". Он был, но куда-то пропал. Переключение в англоязычный интерфейс не помогает.
Win10, Codesys V3.5 SP10.

Ильнур Гибадуллин
13.06.2018, 15:07
Добрый день.
Подскажите,пожалуйста,как восстановить пункт меню "Alarm Configuration". Он был, но куда-то пропал. Переключение в англоязычный интерфейс не помогает.
Win10, Codesys V3.5 SP10.

Добрый день!

Он пропал у Вас в проекте или у Вас отсутствует возможность его добавить заново (добавляться путем нажатия ПКМ на Application --> Добавить объект --> Конфигурация тревог (Alarm Coniguration)?

prilutsky
13.06.2018, 17:15
Добрый день.

При нажатии ПКМ на Application-> Добавить объект в меню пропал пункт Конфигурация тревог(Alarm Coniguration)

prilutsky
14.06.2018, 14:05
Добрый день.
Чудесным образом Alarm Configuration восстановился. Вроде бы ничего особенного не делал. Так и не понял что произошло.
Возникла другая проблема.
Выгружаю программу на целевой ПЛК. Запускаю. Программа работает, переменные меняются так, как надо, а выходы не включаются.
Появляется сообщение "Шина не запущена. Данные значения, возможно не актуальны". При поиске по форумам аналогичная проблема рассматривается при использовании MODBUS. Но я MODBUS в программе не использую.
Кто-нибудь может что-то подсказать по решению этой проблемы?

Евгений Кислов
14.06.2018, 14:18
Добрый день.


Выгружаю программу на целевой ПЛК.

А что у вас за целевой ПЛК?

prilutsky
14.06.2018, 14:22
ПЛК не Овеновский - Advantech Apax-5580.

Евгений Кислов
14.06.2018, 14:23
ПЛК не Овеновский - Advantech Apax-5580.

Я бы тогда порекомендовал обратиться в техподдержку Advantech (или их дистрибьютора).

prilutsky
14.06.2018, 14:30
Жду ответа дистрибьютора с контактами техподдержки. Написал сюда от отчаяния. Система уж больно дарогая, а запустить не могу.
Есть возможность подвешивания шефом за известное место.

Вольд
14.06.2018, 22:16
Добрый день.
Чудесным образом Alarm Configuration восстановился. Вроде бы ничего особенного не делал. Так и не понял что произошло.
Возникла другая проблема.
Выгружаю программу на целевой ПЛК. Запускаю. Программа работает, переменные меняются так, как надо, а выходы не включаются.
Появляется сообщение "Шина не запущена. Данные значения, возможно не актуальны".Кто-нибудь может что-то подсказать по решению этой проблемы?

Либо таргет не тот, либо выходы неверно запитаны.

nackih48
14.06.2018, 23:36
Не кидайте помидорами пожалуйста. Связка плк+пм01 на объекте и пм-01+лектус OPC на диспетчерском пункте. Подскажите пожалуйста, как в codesys посмотреть или вычислить адрес заданной переменной, чтобы внести адрес в лектус для опроса? возможна ли передача переменных типа РЕАЛ по модбас ASCII через CSD из плк в лектус, и как это осуществить? ткните носом пожалуйста!

Мастеренко Иван
15.06.2018, 10:56
Не кидайте помидорами пожалуйста. Связка плк+пм01 на объекте и пм-01+лектус OPC на диспетчерском пункте. Подскажите пожалуйста, как в codesys посмотреть или вычислить адрес заданной переменной, чтобы внести адрес в лектус для опроса? возможна ли передача переменных типа РЕАЛ по модбас ASCII через CSD из плк в лектус, и как это осуществить? ткните носом пожалуйста!

Добрый день.
Если интерфейс ПЛК настроен на Slave, то адресация начинается с 0.
Например, если добавили 2 переменные "2 byte", то первая переменная будет иметь 0 регистр, а вторая 1 регистр.
Или если добавили 2 переменные типа "float", то первая - 0,1 регистр, вторая - 2,3.

При добавлении переменных учитывайте выравнивание переменных.
Более подробно про выравнивание переменных при размещении в области памяти можно в РП на стр.46: http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf

Если интерфейс ПЛК - мастер, то регистры прописываются вручную в параметрах модуля переменной.

Передача типа Реал возможна. Пример настройки CSD соединения можно найти тут: http://www.owen.ru/catalog/gsm_gprs_modem_owen_pm01/29188586
"Связь с ОВЕН ПЛК через модем ПМ01"

nackih48
15.06.2018, 11:59
Добрый день.
Если интерфейс ПЛК настроен на Slave, то адресация начинается с 0.
Например, если добавили 2 переменные "2 byte", то первая переменная будет иметь 0 регистр, а вторая 1 регистр.
Или если добавили 2 переменные типа "float", то первая - 0,1 регистр, вторая - 2,3.

При добавлении переменных учитывайте выравнивание переменных.
Более подробно про выравнивание переменных при размещении в области памяти можно в РП на стр.46: http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf

Если интерфейс ПЛК - мастер, то регистры прописываются вручную в параметрах модуля переменной.

Передача типа Реал возможна. Пример настройки CSD соединения можно найти тут: http://www.owen.ru/catalog/gsm_gprs_modem_owen_pm01/29188586
"Связь с ОВЕН ПЛК через модем ПМ01"\
Спасибо, есть еще вопрос: Если я допустим добавля после слейва еще одно слейв устройство, как тогда адресация во втором слейв устройстве будет? так же с 0 или же учитывая все ранее заданные переменные в предыдущих устройствах?

Мастеренко Иван
15.06.2018, 12:49
Спасибо, есть еще вопрос: Если я допустим добавля после слейва еще одно слейв устройство, как тогда адресация во втором слейв устройстве будет? так же с 0 или же учитывая все ранее заданные переменные в предыдущих устройствах?

Будет так же с 0.

nackih48
15.06.2018, 12:59
Будет так же с 0.

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

AEV12345
15.06.2018, 13:06
Здравствуйте. Такой вот вопрос:
Организовал обмен данными между панелью и контроллером, через библиотеку Modbus.lib. Все работает нормально до отключения питания, после появления питания все данные передаваемые с панели обнуляются (настроечные параметры). Решил проблему, поместив массив передаваемых данных в VAR GLOBAL RETAIN. Насколько такое решение правильное и есть ли альтернативное.
Раньше все делал, через конфигурацию ПЛК. Судя по справке КДС записываются параметры в энергонезависимую память только при сбросе и потери питания, а на форуме где то попадалось что по мере изменения параметров. Где правда?

ASo
15.06.2018, 13:13
У Вас панель мастер?

AEV12345
15.06.2018, 13:19
У Вас панель мастер?

А через библиотеку, она разве может быть мастером?

ASo
15.06.2018, 14:19
А тогда где хранились настроенные параметры?

Мастеренко Иван
15.06.2018, 14:35
Иван, как я понимаю различие тогда между двумя слейв устроойствами заключается только лишь в адресе модуля?
В адресе и при необходимости, в сетевых настройках интерфейсов (скорость, четность и т.д.).

AEV12345
15.06.2018, 15:16
А тогда где хранились настроенные параметры?

В ПЛК в энергонезависимой. Больше вопрос был по тому как часто перезаписывается энергонезависимая память?

ASo
15.06.2018, 18:43
При выключении ПЛК.

RV9WFJ
16.06.2018, 07:31
В ПЛК в энергонезависимой. Больше вопрос был по тому как часто перезаписывается энергонезависимая память?
Я надеюсь в панели у вас эти параметры тоже в энергонезависимой памяти, а то ерунда получится.

Panalexfix
21.06.2018, 20:55
Доброго времени суток!!
Уважаемые "форумчане" подскажите, как записать в файл переменную типа string размером больше чем 255 ??? дело в том, что пришлось клеить колбасу из переменных в файл формата .CSV для 1С, а как записать такую длину ума не приложу!!! ПЛК 160 КМ
Заранее благодарен!!!

Panalexfix
22.06.2018, 09:17
Доброго времени суток!!
Уважаемые "форумчане" подскажите, как записать в файл переменную типа string размером больше чем 255 ??? дело в том, что пришлось клеить колбасу из переменных в файл формата .CSV для 1С, а как записать такую длину ума не приложу!!! ПЛК 160 КМ
Заранее благодарен!!!

Неужели никто не знает решения этой задачи???

Panalexfix
22.06.2018, 10:23
перечислите параметры для sysfilewrite
Не понял Вопроса.
открываю файл на запись >пишу в него 1 строку в которой длина около 400 символов > закрываю файл
вот так выглядит:
PROGRAM Arhiv_wrk
VAR
File_name: STRING(21); (*имя архива*)
size:UINT; (*размер архива*)
Saved: BOOL; (*сохранить архив в файл*)
StatusOfFile: INT:=100; (*инициализация ФБ*)
f: DWORD; (*дескриптор файла*)
statusf: DWORD;
pt: POINTER TO DWORD; (*указатель на архив*)
R_TRIG2: R_TRIG;
f_err: BOOL;
str_new_fail:STRING;
Rtrig_pwr: R_TRIG;
Ftrig_pwr: F_TRIG;
new_fail: BOOL;
END_VAR

RV9WFJ
22.06.2018, 22:03
В несколько заходов пишите и все.

Panalexfix
24.06.2018, 08:26
Тоже не понял. Проблема с записью или с созданием строки ?
Проблема в том, что когда записываю строку больше чем 255 у меня сохраняется только часть ее. Если меньше 255,то все отлично записывается и читается.
А вот писать по кускам надо попробовать!!!!

capzap
24.06.2018, 08:28
Проблема в том, что когда записываю строку больше чем 255 у меня сохраняется только часть ее. Если меньше 255,то все отлично записывается и читается.

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

Panalexfix
24.06.2018, 17:58
а лучше наверное по моему это увеличить размер записываемых данных
так и сделал Спасибо за совет!!!!
Подскажите еще если не сложно, перевод каретки в .CSV файлах на 1 , 2 и 3 строки вниз и вверх как осуществляется в CDS2.3?
Пробовал $N и $R так он наоборот вверху новую строку записывает!!
А как сделать чтоб запись велась сверху вниз?

capzap
24.06.2018, 19:09
Ну либо считать файл, добавить строку и записать по новой, либо взять функцию позиции курсора и писать в конце файла

TV13M
24.06.2018, 20:15
Доброго времени уважаемые форумчане!
Есть такой проект на CFC
В нём есть:

En_function: BOOL; - разрешение на включение функции
counter: WORD; - счётчик от энкодера
volume_start: WORD; - значение начального движения
sensor: BOOL; - датчик крайнего положения механизма
Err: BOOL; - значение возможной ошибки (запрет на выполнение действия)
TIME_reg: WORD; - регистр времени на последнее действие
Trig_start: F_TRIG; - тригер переключения действия
slow: BOOL; - медленное движение
Delay100ms: TOF; - костыль что бы программа не прерывалась раньше времени
Permission: BOOL; - разрешение на выход из программы
speed: BOOL; - движение на макс. скорости
start: BOOL; - начало движения
timer: TP; - таймер последнего движения
last_ACT: BOOL; - последнее движение
function_end: BOOL; - действие закончено.

Проблема в том что выходные переменные:
start, speed и slow - включаются на реальном контроллере с задержкой.
То есть - механизм движется по выходу старт, дошёл до своего значения энкодера, остановился, включилось движение по speed... и т.д.
А надо что бы он не успевал остановиться и продолжал двигаться уже по speed
Что я сделал не так и как добиться того что бы механизм двигался плавно (сейчас идёт рывками между переключениями)

ЗЫ. Это только часть программы. Вся программа более 300 блоков + 230 блоков раз в 240мсек (вывод инфы на дисплей)
ЗЫ.ЗЫ пробовал ставить задержку до 60 мсек (на отключение выходных переменных старт и т.д. - не помогло.) Более 60 не ставил. И так бред какой то. Надо что то нормальное придумать.

Panalexfix
24.06.2018, 21:28
.
У меня на ПЧ дельта подобная ситуация была!!!
Пришлось время остановки (торможения) выставить в 0 и отнять от позиции остановки по импульсам от энкодера импульсов 90 (инерция большая) и включать повышенную 2ю скорость. А время разгона увеличил и получился плавный ход и переключение!!

serg_ingener
27.06.2018, 20:35
Уважаемые форумчане ! Не могли бы вы дать несколько советов по повышению быстродействия модулей ввода - вывода .

Есть дискретный импульсный сигнал 1сек да , 1сек нет . Программа пропускает сигналы . Воспринимает примерно - 4сек да 4сек нет . Была скорость 9600 , поднял до 115200 - изменений не увидел . Скорость вернул на 9600 , перенастроил в конфигурации плк - параметры модуля с дискретными выходами на запись по изменению переменной - стало лучше ( 2 сек на 2сек ) , но не устраивает .

В схеме плк100 , МВ110-224.16ДН , МВ110-24.32ДН , 2 МУ110-224.16Р , МУ110-24.32Р , МВ110-224.8А , МЭ110-220.3М . Аналоговые модули время опроса 1000мс .

Вольд
27.06.2018, 21:09
Делай опрос через библиотеки.

Павел Братковский
03.07.2018, 09:17
Добрый день, у меня вопрос, на СПК207

не в ту тему пишите, и где проект...

Расул
03.07.2018, 12:50
Объясните пожалуйста, цель задачи состоит в том, чтобы при подаче сигнала на дискретный вход плк 150 загорался соответствующий индикатор ип320.

Rednaxel
04.07.2018, 10:19
Объясните пожалуйста, цель задачи состоит в том, чтобы при подаче сигнала на дискретный вход плк 150 загорался соответствующий индикатор ип320.

Одна из причин, по которой выбирают оборудование ОВЕН: наличие большого количества доступно изложенных инструкций и примеров программ (http://www.owen.ru/catalog/codesys_v2/13257808) на все случаи жизни.

Ближе всего мне кажется Пример передачи измеренной величины из трм101 по протоколу ОВЕН на ИП320 (Master) по протоколу Modbus посредством ПЛК1хх (http://kipshop.ru/Primeri/HMI/02_02_PLC1xx+TRM101+IP320%5BMaster%5D.zip).
Только в Вашем случае в модуль ModBus (Slave) в ПЛК нужно добавить модуль 8 bits и использовать в нем по одному биту для каждого индикатора.

Можно найти также множество обучающих видеороликов, в том числе и по Вашей задаче (https://www.youtube.com/results?search_query=%D0%BE%D0%B1%D0%BC%D0%B5%D0%B D+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8+%D0%B 8%D0%BF320+%D0%BF%D0%BB%D0%BA).

Если появятся конкретные вопросы спрашивайте здесь, и Вам с удововольствием на них ответят :)

Осинский Алексей
04.07.2018, 11:24
Aleksey.KIP Выделил Ваш вопрос в отдельную тему в разделе CODESYS 3: http://www.owen.ru/forum/showthread.php?t=29069

Расул
05.07.2018, 07:39
Я уже добавлял 8bit в модуль ModBus (Slave) и номеру каждого бита там соответствовал номер бита индикатора, но все равно ничего не выходило, не можете здесь подсказать ?

АлександраР
05.07.2018, 09:59
Помогите пожалуйста начинающему! У меня есть 2 генератора импульсов (один работает в автоматическом режиме, другой в ручном), оба они подключены к одному выходу ПЛК. Мне необходимо реализовать: когда в работе один генератор, то сигналы идут только с него. Объясните пожалуйста как это сделать.

Rednaxel
05.07.2018, 15:27
Я уже добавлял 8bit в модуль ModBus (Slave) и номеру каждого бита там соответствовал номер бита индикатора, но все равно ничего не выходило, не можете здесь подсказать ?

Скорее всего проблема с настройками связи или с адресацией запутались. Проекты выложите -- посмотрим. Иначе как?

Rednaxel
05.07.2018, 15:31
У меня есть 2 генератора импульсов (один работает в автоматическом режиме, другой в ручном), оба они подключены к одному выходу ПЛК. Мне необходимо реализовать: когда в работе один генератор, то сигналы идут только с него.
Непонятно: генераторы к вЫходу подключены? Может это счетчики импульсов? Или они ко входу подключены?
И если можно подробнее: для чего вам импульсы?

Kravchenko
06.07.2018, 20:56
Вопрос по библиотеке ПЛК_ПЧВ.lib
при подключении к ПЛК110 появляется ошибка:"неразрешенные ссылки на внешние POU"
37948
причем в режиме эмуляции ошибок нет и компилируется все нормально

sjester
09.07.2018, 09:11
подскажиет есть ли библиотека для работы с шифратором 750-631/000-004?

Rednaxel
09.07.2018, 10:02
Вопрос по библиотеке ПЛК_ПЧВ.lib
при подключении к ПЛК110 появляется ошибка:"неразрешенные ссылки на внешние POU"
37948
причем в режиме эмуляции ошибок нет и компилируется все нормально

Следовательно ошибку выдает контроллер, не так-ли?
С такой-же ошибкой (внешние POI были другие) я сталкивался при использовании библиотеки SysLibSockets.lib. Тогда выяснилось, что не все модели ПЛК поддерживают данную библиотеку.

А что за ПЛК_ПЧВ.lib? Какие функции ПЧВ Вам нужны?

Зинько Владислав
09.07.2018, 11:04
Вопрос по библиотеке ПЛК_ПЧВ.lib
при подключении к ПЛК110 появляется ошибка:"неразрешенные ссылки на внешние POU"
37948
причем в режиме эмуляции ошибок нет и компилируется все нормально

Добрый день!

Данная библиотека выложена на сайте по ошибке, как внешняя. Внешние библиотеки не поддерживаются нашими ПЛК.

Для того, чтобы это исправить, необходимо:

1. Открыть библиотеку как проект.
2. В пункте меню "Файл" выбрать пункт "Сохранить как".
3. В нижнем выпадающем списке необходимо выбрать "Внутренняя библиотека .lib".
37964
4. Сохранить в той же папке, где Вы уже была эта библиотека и под тем же именем, заменяя предыдущую версию.

После этого в проекте все будет компилироваться.

В ближайшее время на архив на сайте будет исправлен.

sosna
18.07.2018, 13:27
Может ли кто нибудь компетентно ответить на следующий вопрос. При конфигурировании Universal Modbus Devaice в параметре Work Mode при записи в панель переменных рекомендуется использовать параметр By value change(однократная запись при изменении выхода). Почему я не могу использовать параметр By Poil Time(циклическая запись).
С чем это связано? Проблема связана с зависанием кнопок на панели, если происходит ее отключение и повторное включение при работающем ПЛК.

xrus
18.07.2018, 16:11
Добрый день, подскажите, каким образом возможно пройтись в цикле по всем полученным битам (8 bits или 2 byte) по modbus? По битовому обращению типа x.i я так понимаю может обращаться только константа.

xrus
19.07.2018, 10:53
for i := 0 to 15 do
if (x and shl(word#1,i)) > 0 then //i-ый бит в x поднят
...
end_if
end_for

А что в данном случае x?
Мне нужно в цикле обращаться к любому биту переменной.
Пробую записать сначала все биты в массив, но данный код у меня не работает:


FOR i := 0 TO 15 DO
IF (a AND SHL(PG1_2,i)) > 0 THEN
Ar[i]:=WORD_TO_BOOL(a);
END_IF
END_FOR
a всегда 0, даже если iый бит 1.
В общем сейчас приходится делать так:


Ar[0]:=PG1.0;
Ar[1]:=PG1.1;
Ar[2]:=PG1.2;
Ar[3]:=PG1.3;
Ar[4]:=PG1.4;
Ar[5]:=PG1.5;
Ar[6]:=PG1.6;
Ar[7]:=PG1.7;
Ar[8]:=PG1.8;
Ar[9]:=PG1.9;
Ar[10]:=PG1.10;
Ar[11]:=PG1.11;
Ar[12]:=PG1.12;
Ar[13]:=PG1.13;
Ar[14]:=PG1.14;
Ar[15]:=PG1.15;

работа с массивом

PG1.0:=Ar[0];
PG1.1:=Ar[1];
PG1.2:=Ar[2];
PG1.3:=Ar[3];
PG1.4:=Ar[4];
PG1.5:=Ar[5];
PG1.6:=Ar[6];
PG1.7:=Ar[7];
PG1.8:=Ar[8];
PG1.9:=Ar[9];
PG1.10:=Ar[10];
PG1.11:=Ar[11];
PG1.12:=Ar[12];
PG1.13:=Ar[13];
PG1.14:=Ar[14];
PG1.15:=Ar[15];

Вопрос - можно ли также работать с битами переменной как с массивом (обращаться в цикле к iму элементу). И можно ли присвоить биты word массиву и наоборот другими методами?

Осинский Алексей
19.07.2018, 13:41
А что в данном случае x?
Мне нужно в цикле обращаться к любому биту переменной.
Пробую записать сначала все биты в массив, но данный код у меня не работает:


FOR i := 0 TO 15 DO
IF (a AND SHL(PG1_2,i)) > 0 THEN
Ar[i]:=WORD_TO_BOOL(a);
END_IF
END_FOR
a всегда 0, даже если iый бит 1.
В общем сейчас приходится делать так:


Ar[0]:=PG1.0;
...
Ar[15]:=PG1.15;

работа с массивом

PG1.0:=Ar[0];
....
PG1.15:=Ar[15];

Вопрос - можно ли также работать с битами переменной как с массивом (обращаться в цикле к iму элементу). И можно ли присвоить биты word массиву и наоборот другими методами?

Используйте функцию EXTRACT библиотеки UTIL для заполнение массива значениями бит из переменной в цикле,


FOR i := 0 TO 15 DO
AR[i] := EXTRACT (PG1, i);
END_FOR

а функцию PUTBIT той же библиотеки для заполнения переменной значениями из массива.


FOR i := 0 TO 15 DO
PG1 := PUTBIT (PG1, i, AR[i]);
END_FOR

xrus
19.07.2018, 15:01
Хорошо, спасибо, попробую. Еще один вопрос, пытаюсь создать новую функцию, нигде не могу найти примеров. В итоге выдаются такие ошибки. Что они означают?

petera
19.07.2018, 15:13
for i := 0 to 15 do
if (x and shl(word#1,i)) > 0 then //i-ый бит в x поднят
...
end_if
end_for

А что в данном случае x?
Мне нужно в цикле обращаться к любому биту переменной.


В данном случае х - собственно и есть переменная, к битам которой нужно обращаться, например Ваша PG1

xrus
19.07.2018, 15:28
То есть у неё может быть два значение 0 или 1? А какой у не должен быть тип, BOOL?
Можете подсказать, почему выдаются ошибки?

petera
19.07.2018, 15:28
Хорошо, спасибо, попробую. Еще один вопрос, пытаюсь создать новую функцию, нигде не могу найти примеров. В итоге выдаются такие ошибки. Что они означают?
Функцию создают как отдельный программный компонент (POU), а не записью в теле объявлений PLC_PRG конструкции "FUNCTION ..... END_FUNCTION.
38093

38094

38096

petera
19.07.2018, 15:42
То есть у неё может быть два значение 0 или 1? А какой у не должен быть тип, BOOL?

Почему 0 или 1?
Вы же хотели пройтись по всем битам переменной (2byte), так вот это и есть она - переменная формат WORD.
Например PG1


FOR i := 0 TO 15 DO
IF (PG1 AND SHL(WORD#1,i)) > 0 THEN
Ar[i]:=TRUE;
ELSE
Ar[i]:=FALSE;
END_IF
END_FOR

xrus
19.07.2018, 16:44
Понял, спасибо!
Может посоветуете какую-нибудь более расширенную документацию по языку st в codesys? Того что входит в комплект, как мне кажется недостаточно.

petera
19.07.2018, 22:15
Понял, спасибо!
Может посоветуете какую-нибудь более расширенную документацию по языку st в codesys? Того что входит в комплект, как мне кажется недостаточно.
Любая книжка по Паскалю

Semagar
25.07.2018, 09:15
ПЛК100, в программе есть счетчик, у него есть счетный выход CV, значение которого нужно сохранять при выключении питания. Т.е., при новом включении счет должен продолжаться с сохраненного значения. Как это сделать? Счетчик объявлен как RETAIN, но почему-то это не помогает - после выключения/включения счет начинается с нуля.

Rednaxel
25.07.2018, 09:32
У вас Reset срабатывает при включении благодара инверсии, нет?
Также полагаю нужно сохранять в RETAIN значение Q вместо самого счетчика

Semagar
25.07.2018, 09:40
У вас Reset срабатывает при включении благодара инверсии, нет?

Да вроде нет - при включении на входе Reset от датчика приходит единица - инверсия дает ноль.


Также полагаю нужно сохранять в RETAIN значение Q вместо самого счетчика

Q - это выход срабатывания по уставке. А нужно сохранить именно подсчитанное число импульсов. Пытался объявить в Retain переменную CV - но компилятор ругается.

Зинько Владислав
25.07.2018, 09:54
Да вроде нет - при включении на входе Reset от датчика приходит единица - инверсия дает ноль.



Q - это выход срабатывания по уставке. А нужно сохранить именно подсчитанное число импульсов. Пытался объявить в Retain переменную CV - но компилятор ругается.

Добрый день!

Напишите на support@owen.ru и к теме письма добавьте "для Зинько Владислава".
Вышлю Вам инструкцию.

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

Зинько Владислав
25.07.2018, 09:56
У вас Reset срабатывает при включении благодара инверсии, нет?
Также полагаю нужно сохранять в RETAIN значение Q вместо самого счетчика

Добрый день!

К сожалению, объявление выходных переменных счетчика в энергонезависимой памяти для сохранения их значения не поможет.
При включении ПЛК сам ФБ счетчика сбрасывает все выходы в "0"/FALSE.

VitSSSSS
27.07.2018, 10:28
Добрый день, подскажите, может где и было. Как защитить, так сказать, свою интеллектуальную собственность в ситуации когда у заказчика контроллер ОВЕН и ты для него разрабатываешь прогу в CODESYS V2.3, но не хочешь чтобы на основе твоего проекта он в дальнейшем вносил сам изменения в пересылаемый ему проект для закачки в ПЛК. Ну в смысле посылать бы ему какой нибудь откомпилированный код для закачки в ПЛК по месту, но без возможности его просмотреть или изменить.

Rednaxel
27.07.2018, 10:41
Добрый день, подскажите, может где и было. Как защитить....

Добрый день! Вы правы, обсуждается каждые полгода ;-). Например (http://www.owen.ru/forum/showthread.php?t=11578)

VitSSSSS
27.07.2018, 10:47
Добрый день! Вы правы, обсуждается каждые полгода ;-). Например (http://www.owen.ru/forum/showthread.php?t=11578)

Спасибо за оперативность, поизучаем.

Kravchenko
28.07.2018, 10:12
Добрый день!

подскажите, как правильно сбросить reset в CTU при достижении уставки?
38177
в таком виде работает не правильно(
точнее я не успеваю снять TRUE с выхода out2

Василий Кашуба
28.07.2018, 12:53
Добрый день!

подскажите, как правильно сбросить reset в CTU при достижении уставки?
38177
в таком виде работает не правильно(
точнее я не успеваю снять TRUE с выхода out2
Поставьте между счётчиком и выходом триггер.

Sulfur
28.07.2018, 13:48
Можно еще воткнуть F_TRIG между ctu1.Q и out2. Будет задержка сигнала на один цикл.

Kravchenko
28.07.2018, 17:15
Зри в корень))))
всем спасибо!

xrus
06.08.2018, 14:24
Добрый день, пытаюсь разобраться в работе таймеров, создаю функцию:
TON1(IN:=1,PT:=t#20s);
IF TON1.Q THEN valve_reg:=1; RETURN; END_IF
Делаю вызов:
IF in THEN o1:=valve_reg(); END_IF

В режиме эмуляции все работает корректно, через 20 секунд переменная меняет свое значение. Однако после контроллере почему то ничего не происходит. В чем проблема?

capzap
06.08.2018, 14:41
создаю функцию:
этого достаточно чтоб понять проблему

xrus
06.08.2018, 16:36
Получается нельзя создавать функции с таймерами?

Зинько Владислав
06.08.2018, 16:45
Получается нельзя создавать функции с таймерами?

Добрый день!

Функция сбрасывает свои переменные/ФБ в ноль перед каждым вызовом.
Т.е. Ваши таймеры будут перезапускаться при каждом вызове функции, но никогда не досчитают до уставки.

Для работы с таймерами используйте программы или ФБ.
У этих POU есть внутренняя память - они "помнят" свое состояние после предыдущего вызова.

xrus
08.08.2018, 12:33
Ясно, спасибо!

DIPHENHYDRAMINE
08.08.2018, 18:01
ребята подскажите пожалуйста, какое максимальное время для таймера в ФБ ?
где-то видел..... не нашел....((

DIPHENHYDRAMINE
08.08.2018, 22:15
2^32 - 1, мс
спасибо! а в мин? час? а в таком виде T#5d10h20m

71562мин?

Orshu
15.08.2018, 14:51
Всем здравствуйте.
Подскажите сколько клиентов (удаленных) может опрашивать OPC сервер CoDeSys.OPC.02 ?

FROST87
30.08.2018, 10:29
Подскажите мне что есть что по настройкам памяти target (ПЛК100РМ) из этой картинки (все выделенное красным требует объяснения). Желательно подробно.
38543
Спастбо.

FROST87
30.08.2018, 10:39
Где найти объяснения про адресное пространство контроллера ПЛК100РМ или объясните что есть что на этой картинке настройки памяти в его target.
38544
Хотелось бы получить развернутый ответ по следующим вопросам:
1) Что такое AREA, как её реально можно использовать?
2) Что такое Total size of data memory и в чем её отличие от Memory?
3) Что такое Global и Code и самое интересное надпись 'per segment' ?
4) Что такое Memory, Input, Output, Retain ?

Как это согласуется с контроллером ПЛК100РМ?

ArteM FreeMAn
30.08.2018, 11:00
Доброго дня, жителям форума! Можно ли на плк ОВЕН-160 задать конкретное, точное время длительности цикла?(есть возможность задать максимальное и минимальное время цикла, но необходимо задать конкретное значение)

capzap
30.08.2018, 12:10
Доброго дня, жителям форума! Можно ли на плк ОВЕН-160 задать конкретное, точное время длительности цикла?(есть возможность задать максимальное и минимальное время цикла, но необходимо задать конкретное значение)

читайте доки (http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf) про конфигуратор задач и будет Вам профит

deniska13
30.08.2018, 12:37
Не могу ее найти.
Добрый день! Вы смогли найти эту библиотеку? cascade.lib Если да пришлите пожалуйста!

Евгений Кислов
30.08.2018, 12:40
Добрый день! Вы смогли найти эту библиотеку? cascade.lib Если да пришлите пожалуйста!

Добрый день. Вот ссылка:
http://www.owen.ru/uploads/biblioteka_cascade.lib_cds2.3.zip

Филоненко Владислав
05.09.2018, 13:22
Я не рекомендую ничего менять просто чтобы поменять. Какая задача стоит? Размеры ОЗУ и ПЗУ ограничены.

FROST87
05.09.2018, 14:58
Я просто хочу понять что есть что. Для этих целей даже контроллер разобрал и посмотрел какие микросхемы стоят. А задача стоит выжать из контроллера по максимуму. Даже не так, просто знать максимальные ресурсные возможности контроллера.

Филоненко Владислав
06.09.2018, 09:40
Я просто хочу понять что есть что. Для этих целей даже контроллер разобрал и посмотрел какие микросхемы стоят. А задача стоит выжать из контроллера по максимуму. Даже не так, просто знать максимальные ресурсные возможности контроллера.
По опыту, выжав из чего-то максимум, через полгода попадаешь в ловушку. Заказчик хочет её бантик, а всё, запаса нет. Делите ресурсы на 2.

FROST87
08.09.2018, 11:25
Это все понятно... Но ведь для того, чтобы поставить ресурсы на 2, нужно четко понимать где потолок. А я в этом и прошу помощи. Но никто не хочет отвечать, в том числе и служба поддержки ОВЕН....Буду составлять официальное письмо от имени нашего директора предприятия в службу поддержки. Прошлый раз они откликнулись.

capzap
08.09.2018, 11:44
Но никто не хочет отвечать, в том числе и служба поддержки ОВЕН...

потому что не на что отвечать, единицы времени не опускаются меньше 1мс, объем кода до 680кБ пропорционально увеличит время цикла плк, если в коде используется обмен с другими устройствами или запись в файл линейная зависимость нарушиться, в этом случае вообще ни кто не скажет сколько будет занимать цикл, если код написан кривыми руками, так можно и на паре строк запнуться

romeg
12.09.2018, 18:24
подскажите пожалуйста как это написать в цикле?
card : ARRAY [1..5] OF INT:=1;
IF card[1]>card[2]
THEN card[2]:=card[1]*2;
END_IF;
IF card[2]>card[3]
THEN card[3]:=card[2]*2;
END_IF;
IF card[3]>card[4]
THEN card[4]:=card[3]*2;
END_IF;
IF card[4]>card[5]
THEN card[5]:=card[4]*2;
END_IF;

petera
12.09.2018, 18:36
подскажите пожалуйста как это написать в цикле?
card : ARRAY [1..5] OF INT:=1;
IF card[1]>card[2]
THEN card[2]:=card[1]*2;
END_IF;
IF card[2]>card[3]
THEN card[3]:=card[2]*2;
END_IF;
IF card[3]>card[4]
THEN card[4]:=card[3]*2;
END_IF;
IF card[4]>card[5]
THEN card[5]:=card[4]*2;
END_IF;


card : ARRAY [1..5] OF INT:=1;
i: INT;

FOR i:=1 TO 4 DO
IF card[i]>card[i+1]
THEN card[i+1]:=card[i]*2;
END_IF;
END_FOR

Andrew_Stranger
13.09.2018, 11:55
Сотворил подобное для проверки элементов массива, но выскакивает таймер сторож на эмуляции. Что не так, подскажите?
FOR i:=1 TO 8 DO
AlarmSensMVA:=StatSensMva1[i]<>0
END_FOR;

Зинько Владислав
13.09.2018, 15:39
Сотворил подобное для проверки элементов массива, но выскакивает таймер сторож на эмуляции. Что не так, подскажите?
FOR i:=1 TO 8 DO
AlarmSensMVA:=StatSensMva1[i]<>0
END_FOR;

Добрый день!

Вы объявляете массив как [1..8] ?

Вы уверены, что именно из-за этого куска кода срабатывает сторожевой таймер?
Сообщение при ошибке какое появляется?

Andrew_Stranger
13.09.2018, 15:53
Объявление массива StatSensMva1:ARRAY [1..8] OF WORD;

Сообщение:

Таймер-сторож: Текущий рабочий цикл выполняется слишком долго. Вероятно произошло зацикливание!
Данный цикл for убираю и ошибка уходит.

capzap
13.09.2018, 15:58
Объявление массива StatSensMva1:ARRAY [1..8] OF WORD;

Сообщение:

Таймер-сторож: Текущий рабочий цикл выполняется слишком долго. Вероятно произошло зацикливание!
Данный цикл for убираю и ошибка уходит.

перезалейте полность весь проект а не онлайн изменения

Andrew_Stranger
13.09.2018, 19:56
перезалейте полность весь проект а не онлайн изменения
Не помогло

ASo
13.09.2018, 20:17
Что показывает Tasck monitor?

RV9WFJ
14.09.2018, 05:45
FOR i:=1 TO 8 DO
AlarmSensMVA:=StatSensMva1[i]<>0
END_FOR;
Не хватает ";" в конкце строки присваивания.

capzap
14.09.2018, 07:25
Не хватает ";" в конкце строки присваивания.

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

Тут, спрашивающий либо опечатался, либо что то недоговаривает

Andrew_Stranger
14.09.2018, 08:20
Потерялась при копировании, вставке. Код пробую пока на эмуляторе.

Валенок
14.09.2018, 08:54
Да недоговаривает.
Есть куча способов облажаться на таких примитивных строках и стучатся на форум с ребусом.
Весь проект - где ?

Silver_n
14.09.2018, 15:21
У меня есть ПР200, нужно сделать юстировку AI (датчик 4-20мА). Вопрос: Можно ли это сделать с помощью РЗУ-420 и как?

Andrew_Stranger
14.09.2018, 23:56
Да недоговаривает.
Есть куча способов облажаться на таких примитивных строках и стучатся на форум с ребусом.
Весь проект - где ?
Попробовал отдельно, работает. Программа скорее всего увесистая получилась и данный цикл ее добивает
совместно с Modbus.lib.
Всем спасибо.

RV9WFJ
15.09.2018, 06:27
Попробовал отдельно, работает. Программа скорее всего увесистая получилась и данный цикл ее добивает
совместно с Modbus.lib.
Всем спасибо.Вы серьезно думаете, что цикл в 8 проходов ложит процессор? :-) Ищите баги в коде. И они явно не в этом цикле, просто цикл по каким-то причинам не может выполнится из за кода перед ним.

Sven
16.09.2018, 21:20
Здравствуйте.
Подскажите пожалуйста в чем проблема: в строке 176 выход функции BLINK не хочет "выходить" на релейный выход HORN.
Спасибо.
38778

ASo
16.09.2018, 21:28
См. строку 188.

Sven
16.09.2018, 21:29
Спасибо.
Мысль понятна. буду разбираться.

p_dima90
17.09.2018, 00:39
Доброй ночи!
в ST не силен, прошу посмотреть матерых, правильно ли будет так организовать запись в файл. Запись нужна лишь для хранения уставок.
Т.к. форум не знает файлов типа .EXP, залил на файлообменник, прога доступна по ссылке (https://dropmefiles.com/ieQHJ)
Ну, или просто код:


PROGRAM PLC_PRG
VAR

start1:BOOL;
start2:BOOL;
f1:DWORD;
Buffer_in: ARRAY[0..7] OF REAL;
Buffer_out: ARRAY[0..7] OF REAL;
timeout_1: TON := (PT := T#5s);
sfw:DWORD;
sfr:DWORD;
sfc:BOOL;
END_VAR
VAR_INPUT
per1_write:REAL;
per2_write:REAL;
per3_write:REAL;
per4_write:REAL;
per5_write:REAL;
per6_write:REAL;
per7_write:REAL;
per8_write:REAL;

write:BOOL;
read:BOOL;
END_VAR

VAR_OUTPUT
per1_read:REAL;
per2_read:REAL;
per3_read:REAL;
per4_read:REAL;
per5_read:REAL;
per6_read:REAL;
per7_read:REAL;
per8_read:REAL;
finish_write:BOOL; (*триггер успешной записи*)
finish_read:BOOL; (*триггер успешного чтения*)
END_VAR




Buffer_in[0] :=per1_write; (*формируем буфер из переменных для записи*)
Buffer_in[1] :=per2_write;
Buffer_in[2] :=per3_write;
Buffer_in[3] :=per4_write;
Buffer_in[4] :=per5_write;
Buffer_in[5] :=per6_write;
Buffer_in[6] :=per7_write;
Buffer_in[7] :=per8_write;

IF write=TRUE AND read=FALSE THEN (*команда на начало записи*)

f1 := SysFileOpen ('my_retain', 'w');
IF f1>0 THEN;
sfw:=SysFileWrite(f1, ADR(Buffer_in), SIZEOF(Buffer_in));
IF sfw=32 THEN;
sfc:=SysFileClose(f1);
finish_write:=TRUE; (*формирование флага успешной записи*)
timeout_1(IN := TRUE);

IF timeout_1.Q THEN
finish_write:=FALSE; (*сброс флага через время PT*)
timeout_1(IN := FALSE);
write:=FALSE;

END_IF
END_IF
END_IF
END_IF

IF read=TRUE AND write=FALSE THEN (*команда на начало чтения*)

f1:=SysFileOpen('my_retain', 'r');
IF f1>0 THEN;
sfr:=SysFileRead(f1, ADR(Buffer_out), SIZEOF(Buffer_out));
IF sfr=32 THEN;
sfc:=SysFileClose(f1);

SysMemCpy(ADR(per1_read), ADR(buffer_out[0]), SIZEOF(per1_read)); (*копируем из буфера чтения*)
SysMemCpy(ADR(per2_read), ADR(buffer_out[1]), SIZEOF(per2_read));
SysMemCpy(ADR(per3_read), ADR(buffer_out[2]), SIZEOF(per3_read));
SysMemCpy(ADR(per4_read), ADR(buffer_out[3]), SIZEOF(per4_read));
SysMemCpy(ADR(per5_read), ADR(buffer_out[4]), SIZEOF(per5_read));
SysMemCpy(ADR(per6_read), ADR(buffer_out[5]), SIZEOF(per6_read));
SysMemCpy(ADR(per7_read), ADR(buffer_out[6]), SIZEOF(per7_read));
SysMemCpy(ADR(per8_read), ADR(buffer_out[7]), SIZEOF(per8_read));

finish_read:=TRUE; (*формирование флага успешного чтения*)
timeout_1(IN := TRUE);

IF timeout_1.Q THEN
finish_read:=FALSE; (*сброс флага через время PT*)
timeout_1(IN := FALSE);
read:=FALSE;

END_IF
END_IF
END_IF
END_IF

rayman0v0
19.09.2018, 20:21
Здравствуйте!
В общем, проблема такого характера: все задействованные дискретные входы ПЛК-110 в CoDeSys'е при подключении к ПЛК дают true, хотя кнопка не нажата и датчик не срабатывает (кнопка и датчик - входные устройства). В самом ПЛК всё отображается корректно, нажал кнопку - загорелась лампочка над соответствующим входом. Что с этим можно сделать?