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

Nikita_C
04.09.2013, 11:39
Можно, но лучше использовать два имени. А в программе сделать простое присвоение.
Причем присвоение можно делать даже без имени - просто по адресу. Но я очень рекомендую поименовать обе переменные - если проект будет модернизироваться, а еще не дай бог ни вами - это спасет Вас от "покраснения ушей"...

Если не трудно показать какой-нибудь пример как это можно сделать. В маленькой программе присвоить новое имя не составляет труда, когда переменных не больше 20-40. Но поскольку пользуюсь языком LD, то гирлянду из 285 присвоений MOVE в программе делать не хочется.

Ozbekbeton
04.09.2013, 20:46
Подскажите, пожалуйста, как в CFC сделать, чтобы вся программа выполнялась несколько раз. Короче, как сделать цикл?

Василий Кашуба
04.09.2013, 21:39
Подскажите, пожалуйста, как в CFC сделать, чтобы вся программа выполнялась несколько раз. Короче, как сделать цикл?
Составляете программу и создаёте связь с выхода на вход. Примерно так.

Ozbekbeton
04.09.2013, 22:03
Составляете программу и создаёте связь с выхода на вход. Примерно так.
А как заставить ее повторяться определенное количество раз? Например, 4?

Василий Кашуба
04.09.2013, 22:09
А как заставить ее повторяться определенное количество раз? Например, 4?
Ставите счётчик на циклы и сравниваете с константой (или с какой то переменной) и по нужным результатам сравнения останавливаете цикл с помощью ФБ "И".

Ozbekbeton
04.09.2013, 22:23
Ставите счётчик на циклы и сравниваете с константой (или с какой то переменной) и по нужным результатам сравнения останавливаете цикл с помощью ФБ "И".
Не понял. ФБ "И" - что это?

Василий Кашуба
05.09.2013, 08:37
Не понял. ФБ "И" - что это?
Это функциональный блок "И"

Валенок
05.09.2013, 09:56
А оzbekbeton'у точно не просто for нужен ?

Николаев Андрей
05.09.2013, 10:31
Если не трудно показать какой-нибудь пример как это можно сделать. В маленькой программе присвоить новое имя не составляет труда, когда переменных не больше 20-40. Но поскольку пользуюсь языком LD, то гирлянду из 285 присвоений MOVE в программе делать не хочется.
На LD это еще проще. Можно делать параллельные ветки по одному условию.
Но я все так-же считаю, что надо еще раз пересмотреть логику реализации. Опишите полностью задачу, постараемся помочь.


Подскажите, пожалуйста, как в CFC сделать, чтобы вся программа выполнялась несколько раз. Короче, как сделать цикл?
Хватит уже издеваться над человеком. Стандартный вопрос специалистов, переходящих с программирования под ПК на ПЛК.
Ozbekbeton, все дело в том, что сам принцип работы ПЛК - циклическое выполнение программы:
Из памяти берутся значения переменных
Программа выполняется сверху-вниз один раз
Результаты записываются в память
Из памяти беруться значения переменных
Программа один раз выполняется сверху вниз
Результаты записываются...

То есть программа не стоит в каком-то одном блоке. И цикл организован уже сам собой.
При программировании ПЛК необходимо не создавать цикл, а наоборот - создавать условие, чтобы вычисления проиводились не постоянно, а только заданное количество раз.
Казалось бы пустяк, но надо менять ВСЮ философию написания программы.
Наглядный пример - создайте программу простого инкремента: a:=a+1;
На ПК - переменная а примет значение 1.
На ПЛК переменная a будет постоянно увеличивать свое значение.

Денис_Гуливатенко
05.09.2013, 13:00
Объясните пожалуйста популярно, в чем отличия в работе контроллера ПЛК73 между "Монопольным режимом индикации", "Рабочим режимом индикации" и "Режимом меню". На сколько я понял в первом недоступны кнопки клавиатуры. а как тогда "пуск/стоп" ??

Ozbekbeton
05.09.2013, 14:15
Вот-вот-вот! Начинает проясняться. Получается нужно создать какое-то действие (условие, переменную), которое не даст работать контроллеру, т.е. его программе.

Денис_Гуливатенко
05.09.2013, 14:55
Вот-вот-вот! Начинает проясняться. Получается нужно создать какое-то действие (условие, переменную), которое не даст работать контроллеру, т.е. его программе.
Так вот мне интересно, в обоих режимах программа контроллера выполняется? Или нужно определить флаг режима, и через него влиять на выполнение тех или иных ФБ?

А Вы мне ответили или выше?:)

Ozbekbeton
05.09.2013, 15:15
Денис, это я ответил Николаеву Андрею.

Денис_Гуливатенко
05.09.2013, 15:25
Денис, это я ответил Николаеву Андрею.

=)) Круто Вам! К моим вопросам все равнодушные =)) Может они(вопросы) глупые:confused:

Ozbekbeton
05.09.2013, 15:37
=)) Круто Вам! К моим вопросам все равнодушные =)) Может они(вопросы) глупые:confused:
Может, никто не знает, что Вам сказать. Пока не знает.

Lam-Ka
05.09.2013, 18:50
Вот-вот-вот! Начинает проясняться. Получается нужно создать какое-то действие (условие, переменную), которое не даст работать контроллеру, т.е. его программе. Выше Вам уже ответили, и даже картинку показали. Если нужно выполнить некую последовательность действий несколько раз- создайте подпрограмму (функциональный блок) и вызовите его на исполнение в главной программе контроллера нужное число раз, способов реализации может быть несколько.

kolyan
05.09.2013, 19:27
Объясните пожалуйста популярно, в чем отличия в работе контроллера ПЛК73 между "Монопольным режимом индикации", "Рабочим режимом индикации" и "Режимом меню". На сколько я понял в первом недоступны кнопки клавиатуры. а как тогда "пуск/стоп" ??

1). В монопольном режиме программа работает также. Только невозможно из него выйти в меню - для этого пользуются функцией Switch_to_editor_mode.
2). В монопольном режиме нет возможности выводить на экран Real и Dint числа.
3). В монопольном режиме один экран для работы.
4). В монопольном режиме не работают системные функции кнопок, зато освобождаются для программы пользователя кнопки вверх\вниз и ввод. Все кнопки доступны для программиста и работают в рамках созданной Вами программы.

Сочетаний кнопок в монопольном режиме 2:
- Пуск\стоп + Выход + Ввод - перезагрузка ПЛК,
- Альт + Выход + Ввод - Переход в отладочный режим индикации.

А вообще - про это подробно написано в руководстве по программированию ПЛК-63\73, стр.85 - 93.

Ryzhij
05.09.2013, 20:24
Вот-вот-вот! Начинает проясняться. Получается нужно создать какое-то действие (условие, переменную), которое не даст работать контроллеру, т.е. его программе.Ага, щаз-з-з! Это Вам не комп, в ПЛК сработает ватч-дог и всё равно перезапустит цикл ;)
Максимум, что допускается в ПЛК - обойти по условию ненужный в данный момент кусок кода (задачу, блок, процедуру).

Денис_Гуливатенко
05.09.2013, 20:27
1). В монопольном режиме программа работает также. Только невозможно из него выйти в меню - для этого пользуются функцией Switch_to_editor_mode.
2). В монопольном режиме нет возможности выводить на экран Real и Dint числа.
3). В монопольном режиме один экран для работы.
4). В монопольном режиме не работают системные функции кнопок, зато освобождаются для программы пользователя кнопки вверх\вниз и ввод. Все кнопки доступны для программиста и работают в рамках созданной Вами программы.

Сочетаний кнопок в монопольном режиме 2:
- Пуск\стоп + Выход + Ввод - перезагрузка ПЛК,
- Альт + Выход + Ввод - Переход в отладочный режим индикации.

А вообще - про это подробно написано в руководстве по программированию ПЛК-63\73, стр.85 - 93.

Ладно, на живом плк попробую почувствовать разницу. Как-то сбивает с толку "Режим редактирования параметров", что там редактировать? Почему нельзя программно описать поведения кнопок и будет Вам редактирование уставок и т.п. А в визуализации ЖКИ можно настроить?

kolyan
05.09.2013, 21:01
Ладно, на живом плк попробую почувствовать разницу. Как-то сбивает с толку "Режим редактирования параметров", что там редактировать? Почему нельзя программно описать поведения кнопок и будет Вам редактирование уставок и т.п. А в визуализации ЖКИ можно настроить?

1). В визуализации - нет, только на реальном железе.

2). Программно - можно, кто же Вам мешает.

Имеется ввиду, нельзя в меню редактирования уставок самого ПЛК прямо зайти. Но для этого есть спец. функция, с помощью ее - можно.
Если у Вас уставки самостоятельно описаны - в программе, то заводское меню Вам может и не понадобиться.

Вы описание почитайте. На диске и примеры есть, как редактировать уставку без использования меню редактирования параметров ПЛК.
Нет смысла переписывать документацию:
http://kipshop.ru/CoDeSys/Navigator_PLC_DVD_v3.iso

Денис_Гуливатенко
05.09.2013, 21:30
1). В визуализации - нет, только на реальном железе.

2). Программно - можно, кто же Вам мешает.

Имеется ввиду, нельзя в меню редактирования уставок самого ПЛК прямо зайти. Но для этого есть спец. функция, с помощью ее - можно.
Если у Вас уставки самостоятельно описаны - в программе, то заводское меню Вам может и не понадобиться.

Вы описание почитайте. На диске и примеры есть, как редактировать уставку без использования меню редактирования параметров ПЛК.
Нет смысла переписывать документацию:
http://kipshop.ru/CoDeSys/Navigator_PLC_DVD_v3.iso

Спасибо, буду еще раз внимательно смотреть!

Nikita_C
06.09.2013, 10:04
На LD это еще проще. Можно делать параллельные ветки по одному условию.
Но я все так-же считаю, что надо еще раз пересмотреть логику реализации. Опишите полностью задачу, постараемся помочь.

Пример во вложении. В данный момент будет использоваться 12 температур. Это пилотный проект. Если испытания пройдут нормально, будет расширение. Меня в принципе интересует только прямая адресация входных сетевых переменных в выходные.

xamitg
10.09.2013, 03:43
Доброе утро, уважаемые знатоки!
Помогите с работой SysLibTime. не могу понять как с ней работать (3 дня читаю форум и не могу допереть) как мне сделать чтоб насос включался в 9.00 и выключался в 18.00.
Если несложно напишите простейший пример (ранее выложенные примеры не могу понять). как дальше работать с SysTime64??

Yegor
10.09.2013, 06:11
PROGRAM PLC_PRG
VAR
uptime: SysTime64;
datetime: SystemTimeDate;
clock: CurTimeEx;
out: BOOL;
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate;
END_VAR

datetime := nulldt;
clock(SystemTime := uptime, TimeDate := datetime);
out := datetime.Hour >= 9 AND datetime.Hour < 18;

xamitg
10.09.2013, 14:45
оказывается все гениально и просто а я голову ломал.
огромное спасибо!

Денис_Гуливатенко
12.09.2013, 12:48
DECODE_FLOAT из Owen_FB работает в симуляции?

petera
12.09.2013, 14:31
DECODE_FLOAT из Owen_FB работает в симуляции?
Конечно работает, только аналоговый вход ПЛК в эмуляции не будет давать значение+код ошибки.
Т.е. ситуацию неисправностей нужно тоже эмулировать.

petera
12.09.2013, 14:57
Эмуляция ошибок измерения. Для DECODE_FLOAT
Я себе сделал так
10086
Для эмуляции ошибок измерения сделал функцию, вот ее код

FUNCTION Em_Err : REAL
VAR_INPUT
ai: REAL;
n_ERR: WORD:=0;
END_VAR
VAR
pt:POINTER TO DWORD;
END_VAR

pt:=ADR(ai);
CASE n_ERR OF
1: pt^:=pt^ OR 16#F1000000;
2: pt^:=(pt^ AND 16#00FFFFFF) OR 16#F6000000;
3: pt^:=(pt^ AND 16#00FFFFFF) OR 16#F7000000;
4: pt^:=(pt^ AND 16#00FFFFFF) OR 16#FA000000;
5: pt^:=(pt^ AND 16#00FFFFFF) OR 16#FB000000;
6: pt^:=(pt^ AND 16#00FFFFFF) OR 16#FC000000;
7: pt^:=(pt^ AND 16#00FFFFFF) OR 16#FD000000;
END_CASE
Em_Err:=ai;

Мне нужны не все коды ошибок, как видно из кода эмулируются только
16#F1 (*Результаты измерения не верны*)
16#F6 (*Результаты измерения не готовы*)
16#F7 (*Канал отключен в конфигурации*)
16#FA (*Сигнал на входе больше возможного*)
16#FB (*Сигнал на входе меньше возможного*)
16#FC (*Перегрузка в канале измерения тока*)
16#FD (*Обрыв датчика*)
Можно добавить и остальные.

ЗЫ. Ошибки измерения можно эмулировать как при оффлайн(эмуляция работы ПЛК) так и при онлайн подключении к ПЛК.
Т.е. даже если с физическими датчиками все в порядке. Для этого на окне визуализации сделал ввод в переменные v_Err_AI чисел, от 0 до 7.
Если v_Err_AI:=0, то ошибок нет и функция не влияет на нормальную работу ПЛК.

Денис_Гуливатенко
12.09.2013, 15:46
Мне эмуляция ошибок не нужна, просто смотрю, что на выходе DECODE_FLOAT.OUT_VALUE не меняется
10092

petera
12.09.2013, 16:43
Мне эмуляция ошибок не нужна, просто смотрю, что на выходе DECODE_FLOAT.OUT_VALUE не меняется
10092
Да, Вы правы!
Действительно DECODE_FLOAT не работает в эмуляции.
Давно ее не использую и уже забыл. Когда-то, и скорей всего именно по тому, что DECODE_FLOAT не работает в эмуляции сделал свой аналог.

FUNCTION_BLOCK DECODE_AI
VAR_INPUT
ai: REAL; (*Датчик*)
END_VAR
VAR_OUTPUT
Rezultat: REAL; (*Результат*)
Cod_Err: BYTE; (*Код ошибки измерения*)
Err: BOOL; (*Наличее ошибки измерения*)
END_VAR
VAR
pt:POINTER TO DWORD;
bar:BYTE;
TMP:REAL:=4.0; (*Значение до ошибки*)
END_VAR

Err:=TRUE; (*Установить ошибку измерений*)
pt:=ADR(ai);
bar:=DWORD_TO_BYTE(SHR(pt^,24));
CASE bar OF
16#F1: Cod_Err:=bar-240; (*Результаты измерения не верны*)
16#F6: Cod_Err:=bar-240; (*Результаты измерения не готовы*)
16#F7: Cod_Err:=bar-240; (*Канал отключен в конфигурации*)
16#FA: Cod_Err:=bar-240; (*Сигнал на входе больше возможного*)
16#FB: Cod_Err:=bar-240; (*Сигнал на входе меньше возможного*)
16#FC: Cod_Err:=bar-240; (*Перегрузка в канале измерения тока*)
16#FD: Cod_Err:=bar-240; (*Обрыв датчика*)
ELSE
Err:=FALSE;
Cod_Err:=0; (*Нет ошибок измерений*)
END_CASE
IF NOT Err THEN TMP:=ai;
END_IF
Rezultat:=TMP;
С тех пор только этим и пользуюсь.

ЗЫ. В отличии от DECODE_FLOAT, здесь нет "Значения по умолчанию". При наличии ошибок измерения на выходе Rezultat будет последнее значение полученное, до отказа датчика.
В остальном работает точно так же как и DECODE_FLOAT

Денис_Гуливатенко
12.09.2013, 16:46
я, пока что, совсем новичок. Буду пользоваться тем, что есть:)

petera
12.09.2013, 16:54
я, пока что, совсем новичок. Буду пользоваться тем, что есть:)
Это Вы зря!:rolleyes:

ЗЫ. Сделать дополнительный POU -функциональный блок, тем более, что код можно просто скопировать отсюда и вставить в редакторе кодесиса.
И использовать этот блок точно так же как и библиотечные.

Денис_Гуливатенко
12.09.2013, 17:07
Это Вы зря!:rolleyes:

ЗЫ. Сделать дополнительный POU -функциональный блок, тем более, что код можно просто скопировать отсюда и вставить в редакторе кодесиса.
И использовать этот блок точно так же как и библиотечные.

Спасибо! Так и сделаю!

Vlad_45
17.09.2013, 11:35
Всем привет. Такая ситуация: 6 котлов, у каждого есть время наработки, условие работоспособности и состояние вкл/выкл. Как можно выбрать один котел с минимальным временем наработки из шести, при этом участвовать в сравнении должны только котлы с условием работоспособности ПРАВДА и состоянием ВЫКЛ??

yurmik
17.09.2013, 11:58
Всем привет. Как удалять записи о тревогах в таблице тревог? Или что бы как то очищалась таблица, например, раз в сутки. Не подтверждать, а удалять. Заранее спасибо

Vlad_45
17.09.2013, 14:16
Всем привет. Такая ситуация: 6 котлов, у каждого есть время наработки, условие работоспособности и состояние вкл/выкл. Как можно выбрать один котел с минимальным временем наработки из шести, при этом участвовать в сравнении должны только котлы с условием работоспособности ПРАВДА и состоянием ВЫКЛ??
Или хотя бы код с каскадным управлением любыми объектами где можно глянуть?

amn
17.09.2013, 18:37
Как можно выбрать один котел с минимальным временем наработки из шести

Раз никто не ответил посмотрите мой пример. Не факт что это оптимально, так как я сам новичок. В примере сравнение только по наработке времени, но можно добавить туда и все остальные условия.

Vlad_45
18.09.2013, 09:39
Раз никто не ответил посмотрите мой пример. Не факт что это оптимально, так как я сам новичок. В примере сравнение только по наработке времени, но можно добавить туда и все остальные условия.
Спасибо, информация к размышлению принята. Попробую внедрить в проект и посмотрю что получится.

Денис_Гуливатенко
18.09.2013, 11:10
Как можно изменить значение переменной главной программы в пользовательском ФБ.
Через указатель можно?

(* фрагмент из PLC_PRG*)
start_adr:=ADR(start);
FB(i:=start_adr)
------------------------------
(* фрагмент из пользовательского блока*)
i^.8:=0; (*записываем 8бит переменной start*)

То что я написал выше будет работать?

capzap
18.09.2013, 12:23
Как можно изменить значение переменной главной программы в пользовательском ФБ.
Через указатель можно?

(* фрагмент из PLC_PRG*)
start_adr:=ADR(start);
FB(i:=start_adr)
------------------------------
(* фрагмент из пользовательского блока*)
i^.8:=0; (*записываем 8бит переменной start*)

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

amn
18.09.2013, 12:31
to Денис_Гуливатенко. Будет. Я только что проверил. :) Можно еще так:

(*пользовательский блок proba*)
VAR_INPUT
i: BYTE;
END_VAR
VAR_OUTPUT
q: BYTE;
END_VAR
-------
i.2:=1;
q:=i;

(*вызвающая программа*)

proba1(i:=by1,q=>by1);

Денис_Гуливатенко
18.09.2013, 12:53
Спасибо. В не сообразил в эмуляторе проверить:(

petera
18.09.2013, 13:45
Как можно изменить значение переменной главной программы в пользовательском ФБ.
Через указатель можно?

(* фрагмент из PLC_PRG*)
start_adr:=ADR(start);
FB(i:=start_adr)
------------------------------
(* фрагмент из пользовательского блока*)
i^.8:=0; (*записываем 8бит переменной start*)

То что я написал выше будет работать?
По моему Вы куда-то не туда свернули.
А почему нельзя использовать явную адресацию переменных? Используйте входные и выходные переменные ФБ.
Ведь ФБ делают тогда, когда предполагается использовать его многократно в разных частях проекта и в главной программе и в не главных программах или внутри других ФБ. При каждом использовании одного и того же ФБ создаются его копии(реализации) и каждая живет своей жизнью.
Если же в ФБ изменять косвенно значения переменной в вызывающей программе , то о использовании такого ФБ в других POU бессмысленно. И это уже не ФБ, а программа(подпрограмма). Но и у программы есть входные и выходные переменные.
Эти переменные и предназначены для передачи значений между ФБ или программой и вызывающей их главной программой.
Разница между ФБ и программой

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

Нельзя вызывать программу из функции.

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

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

RV9WFJ
18.09.2013, 14:09
Всем привет. Такая ситуация: 6 котлов, у каждого есть время наработки, условие работоспособности и состояние вкл/выкл. Как можно выбрать один котел с минимальным временем наработки из шести, при этом участвовать в сравнении должны только котлы с условием работоспособности ПРАВДА и состоянием ВЫКЛ??
Создаем массив из 6 элементов типа структура. Структура из наработки, флага разрешения запуска и текущего состояния. дальше создаем переменную A где будет хранится номер выбранного котла и пишем туда ноль. Далее в цикле FOR i=1 TO 6 DO Проверяем возможность запуска котла и что он остановлен. Если условия выполнены то если А=0 то A= текущий котел. Если не нулю то проверяем если наработка текущего котла меньше чем наработка котла в массиве с индексом равным А то А= номер текущего котла.
P.S. У меня есть аналогичный пример с наработкой насосов, могу прислать на почту.

Денис_Гуливатенко
18.09.2013, 14:14
По моему Вы куда-то не туда свернули.

Я попробую объяснить для чего я это затеял. Мне нужно к ПЛК73 подключить чатотник iG5A. В данном контроллере все настройки подключения нужно описывать в программе. А управление через командное слово, в котором каждый бит определенная команда для него. Я хочу сделать отдельно функции для запуска/останова/аварийного установа/ и т.д. А в значении переменной(глобальной) буду после запуска той или иной функции менять биты, чтобы командное слово было "правильно" записано, то есть чтобы не было противоречий "запуск" и "останов" одновременно.

Поправьте, если я неправильно думаю))

capzap
18.09.2013, 14:30
По моему Вы куда-то не туда свернули.
А почему нельзя использовать явную адресацию переменных? Используйте входные и выходные переменные ФБ.
Ведь ФБ делают тогда, когда предполагается использовать его многократно в разных частях проекта и в главной программе и в не главных программах или внутри других ФБ. При каждом использовании одного и того же ФБ создаются его копии(реализации) и каждая живет своей жизнью.
Если же в ФБ изменять косвенно значения переменной в вызывающей программе , то о использовании такого ФБ в других POU бессмысленно. И это уже не ФБ, а программа(подпрограмма). Но и у программы есть входные и выходные переменные.
Эти переменные и предназначены для передачи значений между ФБ или программой и вызывающей их главной программой.
Разница между ФБ и программой
Уважаемый petera, Вы увлеклись или зациклились на ФБ, а есть ведь еще и функции, если возвращать необходимо множество значений, то можно пойти двумя способами: возвратить структуру, а потом после вызова распределять знчения по переменным программы, а можно послать функции указатели и прям в теле функции изменить требуемые значениЯ

Валенок
18.09.2013, 14:42
Что-то про простой VAR_IN_OUT никто ничего не сказал. Нелюбят штоли

Vlad_45
19.09.2013, 08:58
Добрый день... До сих пор занимаюсь каскадом с котлами. Интересует такой вопрос:
Допустим у нас есть диапазоны разностей температур уставки и подачи (0-5 градусов - включаем один котел, 5-15 градусов - включаем второй (два) котел и т.д). К примеру я задаю условие (см. приложение) для включения одного котла, он включается, в режиме отладки меняю текущую температуру на более высокую, прописываю условие, что при такой температуре котел с макс наработкой должен выключиться, он выключается...
Не могу сделать включение второго котла при переходе в диапазон работы двух котлов...

amn
19.09.2013, 12:34
Vlad_45, тут тема про это есть. Может там Вам быстрей ответят http://www.owen.ru/forum/showthread.php?t=14338

amn
19.09.2013, 13:37
Что-то про простой VAR_IN_OUT никто ничего не сказал. Нелюбят штоли

В документации написано, что битовую адресацию нельзя использовать с переменными VAR_IN_OUT.

Валенок
19.09.2013, 13:51
Как можно изменить значение переменной главной программы в пользовательском ФБ.
Через указатель можно?

(* фрагмент из PLC_PRG*)
start_adr:=ADR(start);
FB(i:=start_adr)
------------------------------
(* фрагмент из пользовательского блока*)
i^.8:=0; (*записываем 8бит переменной start*)
А тут и намека про бит нет ))

Ozbekbeton
19.09.2013, 17:23
Как правильно в Codesys подключить модуль МВА8 - как OWEN_MVA8 или как Universal Modbus device с добавлением подэлементов Real Input module? В документации - первый вариант, в видеокурсе - второй. Как же все-таки более правильно?

Николаев Андрей
19.09.2013, 20:13
Правильно и так и так.
В документации описание и так и так.
Рекомендации - подключайте как UniversalModBus Device.

Ozbekbeton
19.09.2013, 20:36
Вас понял. Спасибо!

Vlad_45
20.09.2013, 07:36
Раз никто не ответил посмотрите мой пример. Не факт что это оптимально, так как я сам новичок. В примере сравнение только по наработке времени, но можно добавить туда и все остальные условия.

Вот у вас там используется триггер для фиксации работы блока... Я до сих пор не могу понять куда запихнуть условие сброса и как его правильно включать. Пока только он работает, если его сбрасывать вручную...
Вот элемент вызова вашего блока:

perebor_min( (*назвал так ФБ в PLC_PROG*)
t := timeworktek, (*Присваиваю время из своего счетчика*)
start:= TRUE,
kotel_number => start_kot); (*номер котла в массиве котлов устанавливаю в ИСТИНА*)
kotly [start_kot] := TRUE;

Вызов повторяется циклически, время меняется, а перебор не работает, так как триггер не сбрасывается

amn
20.09.2013, 10:35
При запуске ФБ, то есть пришел сигнал на вход start, RS триггер фиксирует включенное состояние (как бы вход start становится постоянно включенным) на время работы блока. Это нужно для того, чтобы ФБ не реагировал на вход start в процессе того как он делает свою работу. Как только весь перебор произведен сбрасываем его, у меня сброс где-то в конце. После этого ФБ снова готов к запуску на выполнение. Другими словами смысл использования RS триггера в том, что пока ФБ не сделает весь перебор и не найдет нужный котел, еще раз его запустить не получится.
Да, в ФБ перебор происходит не в одном цикле ПЛК, а каждый шаг в новом цикле, имейте это в виду. Т.е. для перебора мы не создаем свой цикл, а используем цикл ПЛК.

Darkblade
20.09.2013, 11:05
Добрый день. Пытаюсь настроить отклик плк63-L на нажатие комбинации клавиш "Альт" + "Вверх". Где то здесь на форуме видел пример, сделал так как там написано было, то есть вот так вот:

rm(clk:=kbrd=136 ); (*альт+вверх=128+8*)
IF rm.Q THEN
Tech_support:=TRUE;
END_IF

Однако в отладчике значение переменной не изменяется после нажатия этих клавиш (переменная Tech_support объявлена как Global Retain, rm:R_TRIG).
Где я был неправ? Все это делается в режиме Work_mode.


P.S. Совсем забыл, может кто то подкинуть пример или объяснить как работать с отдельными битами внутри переменной (например типа word или int).

Vlad_45
20.09.2013, 14:05
такой вопрос, вкратце: как к работающим котлам прибавить еще один котел с задержкой 10 мин при выполнении некоего условия, потом еще один котел через 5 минут при выполнении некоего условия, потом еще один через 5 мин. и т.д?
Какими лучше таймерами пользоваться? как логика должна строиться?

alex55
20.09.2013, 14:35
Таймер TON вполне подойдет..

Vlad_45
20.09.2013, 14:37
пробовал... получается сделать задержку запуска одного котла.... второй и остальные включаются вместе с первым. не могу нормально условия прописать

capzap
20.09.2013, 15:06
пробовал... получается сделать задержку запуска одного котла.... второй и остальные включаются вместе с первым. не могу нормально условия прописать

так такие вещи надо изучать на проектах конкретно с таймером, чтоб понять его работу, а не в большой системе
Кстати вот и я когда то включал последовательно четыре насоса по уставке http://www.owen.ru/forum/showthread.php?t=10750&p=63186&viewfull=1#post63186
да и саме тема полна примеров на любой вкус

Vlad_45
20.09.2013, 15:11
у меня сейчас часть проекта вынесена в отдельную программу с которой я работаю и отлаживаю работу таймеров и последовательность включения.
и .exp - это что за прога?

amn
20.09.2013, 15:19
такой вопрос, вкратце: как к работающим котлам прибавить еще один котел с задержкой 10 мин при выполнении некоего условия, потом еще один котел через 5 минут при выполнении некоего условия, потом еще один через 5 мин. и т.д?
Какими лучше таймерами пользоваться? как логика должна строиться?

TON1(IN:= NOT TON1.Q, PT:=t#5m); (*генератор импульсов с периодом заданным на входе PT*)

IF <условия> AND TON1.Q THEN
<включаем следующий котел>
END_IF

Валенок
20.09.2013, 16:13
Добрый день. Пытаюсь настроить отклик плк63-L на нажатие комбинации клавиш "Альт" + "Вверх". Где то здесь на форуме видел пример, сделал так как там написано было, то есть вот так вот:

rm(clk:=kbrd=136 ); (*альт+вверх=128+8*)
IF rm.Q THEN
Tech_support:=TRUE;
END_IF

Однако в отладчике значение переменной не изменяется после нажатия этих клавиш (переменная Tech_support объявлена как Global Retain, rm:R_TRIG).
Где я был неправ? Все это делается в режиме Work_mode.


P.S. Совсем забыл, может кто то подкинуть пример или объяснить как работать с отдельными битами внутри переменной (например типа word или int).
1.
Жмем неотпуская "альт+вверх". Сколько krbd ?
2.
w.3 := 3 > 5;

AmpeR3
21.09.2013, 12:01
Подскажите пожалуйста, приобрёл для обучения 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 (81).
Command - Read holding Registers (0x03). Для выхода Register Output module,
в параметрах модуля Registr - 50 (80). Command - Preset singl Registers (0x06).
Но всё равно в тестовой программе при
подачи на вход сигнала, нет его на выходе, мне кажется сигнал пролетает за
микросекунды. А как сделать чтобы сигнал был постоянным, пока есть сигнал на
входе и на выходе не пролетал за микросекунды, а держался пока это необходимо
по программе.
Подскажите пожалуйста как и что написать в Register Input module и Register Output module, в полях Register Address, Command. Чтобы сигнал удерживался на выходе МК110 224.8ДН4Р по логике программы а не пролетал за микросекунды. По программе сигнал ВКЛ выходного реле, а на выходе реле уже давно отключилось.
Заранее ВАм большое спасибо за ответ. Уж очень хочется правильного ответа!!!

Darkblade
23.09.2013, 12:39
1.
Жмем неотпуская "альт+вверх". Сколько krbd ?
2.
w.3 := 3 > 5;

При нажатии Альт+Вверх пишет kbrd=136, однако rm.Q=Flase; Tech_support=False; Может я неправильно понимаю смысл самого блока R_TRIG? Он должен генерировать TRUE на выходе на время 1 цикла ПЛК если условие будет верно?

2. Если у меня переменная w типа int, я могу написать так: w.3:=1; w.10:=0;? Я не работал раньше с битовыми операциями, Ваша запись мне немножко непонятна :)

P.S. Или мб в этом примере w.3 := 3 > 5 результат логического сравнения записывается в 3 бит?

Валенок
23.09.2013, 13:56
При нажатии Альт+Вверх пишет kbrd=136, однако rm.Q=Flase; Tech_support=False; Может я неправильно понимаю смысл самого блока R_TRIG?
Клава — видна.Понимаете правильно, уточню - подъем по переднему фронту. Кусок кода верный. Варианты:
1.Сам участок невыполняется
2.Где-то сразу опускают Tech_support

1.1 Нажать F5
1.2 Вставить счетчики и думать

rm(..);
c1 := c1 + 1;
if rm.q then
c2 := c2 + 1;
..
end_if
2. Думать



Если у меня переменная w типа int...., w.3:=1/w.10:=0/w.3 := 3 > 5 ?
byte/word/dword, да

alex55
25.09.2013, 09:11
Добрый день! Вопрос более приземленный к корифеям кдс: Подскажите пожалуйста как реализовать визуализацию состояния счетчика CTU и возможно ли это, в Direct Logic там оно на поверхности.

Sergey666
25.09.2013, 09:30
Добрый день! Вопрос более приземленный к корифеям кдс: Подскажите пожалуйста как реализовать визуализацию состояния счетчика CTU и возможно ли это, в Direct Logic там оно на поверхности.

А в КДС что ? Закопано что-ли ?
Смотрим в менеджере библиотек ФБ CTU , параметр CV :word; и еще булевский выход есть - достижение уставки.
:) причем тут корифеи ?

Удачи землячек.

amn
25.09.2013, 09:45
Добрый день! Вопрос более приземленный к корифеям кдс: Подскажите пожалуйста как реализовать визуализацию состояния счетчика CTU и возможно ли это, в Direct Logic там оно на поверхности.

Запускаете проект на выполнение. В разделе объявления переменных находите свой CTU. Кликаете левой кнопочкой мыши по плюсику рядом с ним и наблюдаете за состоянием всех его переменных.

alex55
25.09.2013, 10:02
Спасибо. Это я знаю(это информация для самого программиста), а вот как это перенести на HMI-пользователю?

capzap
25.09.2013, 10:12
Спасибо. Это я знаю(это информация для самого программиста), а вот как это перенести на HMI-пользователю?

Выход счетчика заводите в переменную, переменную отображаете в хми, как лтображать переменные есть примеры и на форуме и в докумегтации к КДС

alex55
25.09.2013, 10:17
Спасибо все получилось, я просто не сообразил.что именно выход счетчика и пытался копать внутри его..

Smith2007
26.09.2013, 09:53
Подскажите простой способ получения текущей даты и времени в виде строки.
Нашел только ФБ CurTimeEx
Но для получения в виде строки нужно еще массу вычислений сделать.

capzap
26.09.2013, 09:57
Подскажите простой способ получения текущей даты и времени в виде строки.
Нашел только ФБ CurTimeEx
Но для получения в виде строки нужно еще массу вычислений сделать.

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

Smith2007
26.09.2013, 10:02
Ок. Спасибо. Просто думал, что существует готовая функция.

Еще вопрос: Если я пишу функцию, которая будет возвращать тип STRING. Каков механизм передачи этой строки?
str := func();

Будет передан указатель на строку или скопируется сама строка?

capzap
26.09.2013, 10:05
Какой тип функции при создании присвоите тот и будет, у готовых функций обычно есть описалово по типам входов и выходов

ЗЫ Вы как то увлекаетесь очень указателями , функия не имеет памяти, поетому указатель после своего выполнения теряет всякий смысл

Smith2007
26.09.2013, 10:46
Спасибо, не учел :)
Сейчас перечитал и стыдно за вопрос стало.

Где можно найти ntp и ftp клиента (библиотеку) для ПЛК?
Не хочется самому обработчик писать...

capzap
26.09.2013, 10:56
Спасибо, не учел :)
Сейчас перечитал и стыдно за вопрос стало.

Где можно найти ntp и ftp клиента (библиотеку) для ПЛК?
Не хочется самому обработчик писать...
http://oscat.de

desperadoes
26.09.2013, 22:58
Здравствуйте подскажите пожалуйста как в CoDeSys 2,3 из PLCBrouser заменить прошивку контролера ПЛК 160 с помощью команды Update Core. Замена прошивки связана с пропаданием питания в контролере после отключения питания?
За раннее спасибо!

Щербаков Николай
28.09.2013, 00:20
Прошу помочь разобраться в следующей проблеме. ФБ Sektsiya_v.01 работает как задумано. При создании программы управления рольгангом блок ведёт себя непонятным образом. И в режиме эмуляции, и в реальном контроллере при запуске программы на выходе всех блоков появляется сигнал AvariyaSektsii. В режиме эмуляции ФБ Sektsiya_v.01 данный сигнал формируется как задумано. В программе Rolgang_v001 в ФБ TON (ZaderzhkaAvarii) на входах появляются сигналы (внутри блока - см. рисунок ЗадержкаАварии) TRUE, хотя в самом ФБ этих сигналов нет. Помогите разобраться.

Smith2007
28.09.2013, 11:02
Подскажите какие есть библиотеки для работы с файлами, директориями кроме SysLibFile.lib?
Посмотрел пример "Архивация". Реализовал в своем проекте, но сильно смущает, что под хранение имен файлов приходится отдавать драгоценную RETAIN память.
В 10 году видел сообщение, что SysLibDir не поддерживается ПЛК. Как с поддержкой сейчас ? Есть ли какая замена сторонними либами?

Уж больно кривой архиватор получился.

capzap
28.09.2013, 11:15
Подскажите какие есть библиотеки для работы с файлами, директориями кроме SysLibFile.lib?
Посмотрел пример "Архивация". Реализовал в своем проекте, но сильно смущает, что под хранение имен файлов приходится отдавать драгоценную RETAIN память.
В 10 году видел сообщение, что SysLibDir не поддерживается ПЛК. Как с поддержкой сейчас ? Есть ли какая замена сторонними либами?

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

Smith2007
28.09.2013, 11:58
И я понимаю, что бред. Такой пример нашел (08_Archiver).
Как прочитать директорию файлов?

capzap
28.09.2013, 16:02
И в режиме эмуляции, и в реальном контроллере при запуске программы на выходе всех блоков появляется сигнал AvariyaSektsii.

Смотрите за элементом №15 в ФБ Sektsiya. Он включает Ваш таймер TON, кто же его включает? Если RS триггер молчит, значит элемент №14, который по умолчанию ФАЛЬШ, но через инверсию на вход пятнадцатого OR запускает таймер

Щербаков Николай
28.09.2013, 21:20
Capzap!!! Спасибо! Когда переносил схему в ФБ поставил не там инверсию. Исправил. Всё работает!

capzap
28.09.2013, 21:25
не зачто, главное чтоб работало

Smith2007
29.09.2013, 18:57
При старте программы нужно открыть файл. Далее с этим файлом будет работать ФБ.
В конфигураторе задач поставил галку на против start, ввел имя POU и создал функцию.
В функции пытаюсь открыть файл. хендл файла - глобальная переменная.
Через 5-10 сек после загрузки и старта программы - кодесис сообщает об ошибке связи и отключается.
Что необходимо в функцию добавить?
Или есть иной способ открыть файл при старте?

capzap
29.09.2013, 19:05
IF pwr AND pwr<>oldPwr THEN (* при включении питания *)
hFile:=SysFileOpen('rcpt.bin', 'r'); (* получение дескриптора файла *)
IF hFile>0 THEN (* если файл существует *)
logFileSize := SysFileGetSize('rcpt.bin'); (* вычисляем размер файла *)
length_read := SysFileRead(hFile, ADR(reception), MIN(UDINT_TO_DWORD(logFileSize),224)); (* читаем данные по минимуму, либо размер файла, либо размер массива *)
IF length_read = MAX(UDINT_TO_DWORD(logFileSize),224) THEN (* если приняли соответствующее количество байт *)
SysFileClose(hFile); (* закрываем файл *)
END_IF;
END_IF;
hFile:=SysFileOpen('ppid.bin', 'r'); (* получение дескриптора файла значений ПИД*)
IF hFile>0 THEN (* если файл существует *)
length_read := SysFileRead(hFile, ADR(pids), 10); (* читаем данные *)
SysFileClose(hFile);
END_IF;
ELSIF oldPwr AND pwr<>oldPwr THEN (* при отключении питания *)
;
END_IF;
oldPwr:=pwr AND hFile<>0;

Smith2007
29.09.2013, 19:43
pwr, oldPwr как устанавливаются?
При старте?
Приведенный код в отдельной функции/ФБ?

yurmik
04.10.2013, 10:56
Есть ли в codesys архивирование? Тренды?

Николаев Андрей
04.10.2013, 11:29
Есть и то, и то.

Smith2007
04.10.2013, 12:01
Есть и то, и то.
"Архивирование" - Вы говорите о модуле сбора информации? Или есть готовые ФБ, сохраняющие данные на флеш контроллера?

yurmik
04.10.2013, 14:29
Поясните пожалуйста, как организованно архивирование данных?

S.A.D.
07.10.2013, 14:45
прошу пнуть в нужную сторону. Понадобилось мне изобрести велосипед.
Собственно есть ФБ открывающий порт:
VAR_INPUT
Settings:COMSETTINGSEX;
END_VAR
VAR_OUTPUT
Ready:BOOL;
END_VAR
VAR
P_discr: DWORD;
Settings_OK:BOOL;
CLOSE_OK:BOOL;
END_VAR
__________________________________________________ ____________
P_discr:=SysComOpen(Settings.Port);
IF P_discr<>16#FFFFFFFF THEN
Settings.Size:=SIZEOF(Settings);
Settings_OK:=SysComSetSettingsEx(P_discr, ADR(Settings));
END_IF

Так вот настройки не присваиваются. SysComSetSettingsEx выдает инвалид. Все как по букварю но не работает. в поиске что-то ничего толком не нашел.
с примером COMSERVICE все работает, но он не поддерживает расширенные настройки порта, поэтому и пришлось изобретать велосипед. ПЛК100РМ, порт 1.

capzap
07.10.2013, 15:14
Точно по букварю, кажется любой дескриптор дожен быть типа DWORD

S.A.D.
07.10.2013, 15:17
это просто форум двоеточие и D понял как смайл. поправил

пардон.дело было не в бобине... ошибка у меня на этапе открытия порта...дискриптор возвращается 16#FFFFFFFF. Почему непонятно
покопался по форуму и выяснил что с описаловом библиотеки syslibcom можно только в туалет сходить. Например для того чтоб открыть порт нужно его сначала закрыть (это сработало), далее syscomsetsettings первым параметром хочет не дискриптор порта, а его номер (сделал, но не заработало, ф-ия возвращает инвалид). И так на при попытке установить настройки для любого из портов.

amn
07.10.2013, 18:49
Подскажите, пожалуйста, что означает код ошибки 255. Проскакивает при использовании библиотеки Modbus.lib. К ПЛК100 подключен модуль МДВВ.

Спасибо.

Валенок
07.10.2013, 18:59
оттеда - MB_UNI_IO
(* MODBUS Exception Codes *)
EXC_NO: BYTE:= 16#00; (* NO EXCEPTION *)
EXC_HW: BYTE := 16#FE; (* HARDWARE ERROR *)
EXC_TO: BYTE := 16#FF; (* TIMEOUT ERROR *)

amn
07.10.2013, 19:07
Спасибо. А может ли это быть из-за того, что я скорость поставил 38400. Не слишком маленькая для модуля МДВВ?

Валенок
07.10.2013, 19:29
В данном комплекте скорость - пофиг. А, собсно, какая беда от иногда проскакивающих ошибок ?

amn
07.10.2013, 19:43
Дело в том, что они проскакивают не иногда, а при каждой записи. При чтении если период ставлю 1 сек. чтение происходит почти без ошибок. А во время записи даже если период 5 сек. ошибка проскакивает каждую 5-ю секунду. Это если чередовать чтение и запись. А если не делать чтение, а только запись, то идут только ошибки, а нормальной записи не происходит.

Валенок
07.10.2013, 20:35
Я давно не работаю с modbus.lib, хватает syslibcom, но того что знаю точно - modbus.lib абсолютно рабочая. Траблы обычно в настройках и/или некотором недопонимании слов - "последовательный порт".

capzap
07.10.2013, 20:45
Дело в том, что они проскакивают не иногда, а при каждой записи. При чтении если период ставлю 1 сек. чтение происходит почти без ошибок. А во время записи даже если период 5 сек. ошибка проскакивает каждую 5-ю секунду. Это если чередовать чтение и запись. А если не делать чтение, а только запись, то идут только ошибки, а нормальной записи не происходит.

при записи вообще забейте на ошибки

Валенок
07.10.2013, 20:59
Вот тут я не всегда согласился бы ))
Например мы постоянно читаем и пишем по изменению. Убедится в том что запись была - необходимо. Иначе как быть уверенным что выходы встали как нужно ? (без чтения выходов ессно). Но если и писать постоянно - можно и забить. Проскочит. Это не кошерно - но иногда катит.

Фиша в том - что с МДВВ на modbus.lib можно сделать сотни тысяч запросов (и R и W) без единой ошибки (на ночь оставлял). И какие 5сек ? за это время 500..600 запросов

amn
07.10.2013, 22:26
У меня сложилось впечатление, что ошибка 255 при записи все время присутствует, хотя запись проходит нормально.

Валенок
08.10.2013, 01:04
Одно другому не противоречит. Модбас не UDP. Есть запрос и ответ. Запрос (запись) принят слейвом, ответ не принят мастером. Так как астральное видение немного поломалось - выкладывайте код. Причем и настройки МДВВ тоже.

Igor.m
08.10.2013, 07:33
Здравствуйте! Вопрос по CoDeSys 2.3. Делаю работу по управлению освещением, вентиляцией, теплоузлом здания, есть небольшой опыт работы с кодесис 2.3 и программированием на CFC. Вопрос заключается в следущем: программа пишется одна "для всего и сразу" и получается в нее входит уже куча всяких блоков для освещения, пи регуляторов для вентеляции и т.д. а в кодесисе есть такая штука как POU, куда входят функции, функциональные блоки, программы. Возможен ли такой вариант что например для ПИ регулирования в POU буду создавать отдельные функциональные блоки PID, тогда как они будут функционировать с основной программой, независимо? Будет ли при использовании этих подпрограмм и функций как то теряться скорость выполнения (если их будет много) ? Либо не заморачиваться и сделать все одной программой? Вообще целесообразно ли применять в моем случае один ПЛК, или для каждой системы исползовать свой для надежности?

capzap
08.10.2013, 08:22
Здравствуйте! Вопрос по CoDeSys 2.3. Делаю работу по управлению освещением, вентиляцией, теплоузлом здания, есть небольшой опыт работы с кодесис 2.3 и программированием на CFC. Вопрос заключается в следущем: программа пишется одна "для всего и сразу" и получается в нее входит уже куча всяких блоков для освещения, пи регуляторов для вентеляции и т.д. а в кодесисе есть такая штука как POU, куда входят функции, функциональные блоки, программы. Возможен ли такой вариант что например для ПИ регулирования в POU буду создавать отдельные функциональные блоки PID, тогда как они будут функционировать с основной программой, независимо? Будет ли при использовании этих подпрограмм и функций как то теряться скорость выполнения (если их будет много) ? Либо не заморачиваться и сделать все одной программой? Вообще целесообразно ли применять в моем случае один ПЛК, или для каждой системы исползовать свой для надежности?

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

Igor.m
08.10.2013, 08:26
Спасибо за совет, capzap!

capzap
08.10.2013, 09:15
Вот тут я не всегда согласился бы ))
Например мы постоянно читаем и пишем по изменению. Убедится в том что запись была - необходимо. Иначе как быть уверенным что выходы встали как нужно ? (без чтения выходов ессно). Но если и писать постоянно - можно и забить. Проскочит. Это не кошерно - но иногда катит.

Фиша в том - что с МДВВ на modbus.lib можно сделать сотни тысяч запросов (и R и W) без единой ошибки (на ночь оставлял). И какие 5сек ? за это время 500..600 запросов
http://www.owen.ru/forum/showthread.php?t=12531&p=83649&viewfull=1#post83649

с записью действительно приходит ошибка каждый запрос

Валенок
08.10.2013, 09:29
Тогда придется допустить что мне овен подсовывает какие-то особенные МДВВ которые нормально отвечают на запись, а я этот ответ вижу с syscomread, и этот ответ - ok.

capzap
08.10.2013, 09:31
Тогда придется допустить что мне овен подсовывает какие-то особенные МДВВ которые нормально отвечают на запись, а я этот ответ вижу с syscomread, и этот ответ - ok.

Так у Вас же бибка праалена

amn
08.10.2013, 10:34
Одно другому не противоречит. Модбас не UDP. Есть запрос и ответ. Запрос (запись) принят слейвом, ответ не принят мастером. Так как астральное видение немного поломалось - выкладывайте код. Причем и настройки МДВВ тоже.

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

Валенок
08.10.2013, 11:39
Ну, например, переход в ..read.. :

if cmpl then
....
master:=..
end_if

и в ..write..:

if cmpl then
if err <> .. then
..
else
master := ..
end_if
end_if

Ищем отличия.

Валенок
08.10.2013, 11:53
Так у Вас же бибка праалена
Не, просто другая.

amn
08.10.2013, 12:04
Вы имеете в виду, что шаг записи надо гонять пока не поймаем err=0? Так оно нулю равно только когда cmpl=FALSE. При записи всегда при cmpl=TRUE err=255.

Валенок
08.10.2013, 12:09
Комплект -> вышли. А счет ошибок - отдельное действо. В read - более правильно.

amn
08.10.2013, 12:44
Валенок, сделал как Вы сказали. Не помогло. Вот скрин в работе. Переменная t - счетчик битых посылок, переменная t1 - счетчик нормальных посылок. Как видим, нормальных - 0.

Валенок
08.10.2013, 14:58
////////////////

amn
08.10.2013, 16:32
Валенок, огромное спасибо. Сейчас буду испытывать. Только не понял одну строчку


OUT:=OUT and 255; //чтоб муть не гнать

Валенок
08.10.2013, 16:57
Выходов - восемь.

amn
08.10.2013, 17:45
Валенок. Проверил Ваш вариант. Работает отлично. Запись работает без ошибок. Чтение - 1 ошибка. Причем таймеры я еще никакие не устанавливал. Еще раз СПАСИБО!


Выходов - восемь.

Понял, это чтобы обнулить лишние биты.

Валенок
08.10.2013, 18:11
Чтение - 1 ошибка.
Не при старте ли случайно ?

amn
08.10.2013, 18:45
Да. Ошибка была в самом начале.
Rs.dL=0 - это, как я понял, задержка ответа?

Валенок
08.10.2013, 21:15
Вероятно после setting'а требуется некоторая пауза. Но суть не в этом. Работа при любом уровне помех. Главное чтоб непрерывная череда помех не превышала t.out в МДВВ и устраивающий Вас период контроля связи. Обычно 1-3сек - за глаза для обоих.

..
connect(in:=false,pt:=период_контроля); //tof
case
..
if r3.complete then
connect(in:=C connectoм - очепятка.
после complete
connect(in:=r3.exception = 0 );
..

Rs.dL - задержка ответа в МДВВ. Не нужна.

amn
09.10.2013, 12:08
Валенок
Вероятно после setting'а требуется некоторая пауза. Но суть не в этом. Работа при любом уровне помех. Главное чтоб непрерывная череда помех не превышала t.out в МДВВ и устраивающий Вас период контроля связи. Обычно 1-3сек - за глаза для обоих.

То есть открываем порт. Пауза 1сек. Потом чтение с интервалом 1-3 сек.
Под контролем связи Вы что имели в виду, период опроса входов? Контроль связи осуществяестя в процессе чтения, если нет ошибок, то связь есть. Если есть помехи увеличиваем таймаут в приборе (сейчас там стоит 60 сек. надо ли больше?). Я правильно понял?


..
connect(in:=false,pt:=период_контроля); //tof
case
..
if r3.complete then
connect(in:=true);
..

Уточнение по коду. После того, как завершился процесс чтения подаем сигнал на таймер connect. В следующем цикле перед case убираем сигнал с таймера, время пошло. Далее пока connect.Q=TRUE чтение не разрешаем. Так?

Валенок
09.10.2013, 13:03
Пауза если и нужна 1-2мс.
Зачем такое редкое чтение ?

В следующем цикле перед case убираем сигнал с таймера,
TOF !

если нет ошибок, то связь есть.
Связь есть пока хоть один ок в течении контрольного времени (или предельного кол-ва непрерывных ошибок)

Если есть помехи увеличиваем таймаут в приборе (сейчас там стоит 60 сек. надо ли больше?)
Чесно говоря я t.out и больше 3сек никогда не ставил - это под 3 сотни запросов.

Smith2007
10.10.2013, 19:36
Модуль статистики имеет переменную, которая указывает на статус питания ПЛК. Если анализировать эту переменную, можно произвести запись в лог об отключении питания.
Как лучше определить состояние, когда ПЛК стартанул? (после подачи питания или просто рестарт пользователем)

amn
11.10.2013, 11:23
VAR
init:bool:=true;
...
END_VAR
----
в самом начале программы:
IF init THEN
...
Делаем что надо при старте
...
init:=FALSE;
END_IF

alex55
11.10.2013, 13:11
Здравствуйте! Вопрос вроде бы простой но что то не соображу. Имеется счетчик CTU переменная его состояния CV-типа WORD выведена на визуализацию кдс но в самом счетчике она меняется в десятичной системе а в визуализации в шестнадцатиричной, что не очень приятно мягко сказать пользователю, все мои попытки преобразовать пока безуспешны.. sos my diar frend!

Smith2007
11.10.2013, 13:41
VAR
init:bool:=true;
...
END_VAR
----
в самом начале программы:
IF init THEN
...
Делаем что надо при старте
...
init:=FALSE;
END_IF


Спасибо. Думал есть способ вызвать программу по какому либо признаку (сигналу), который генерит сам ПЛК.
Приведенный вариант сейчас и так работает :)

Smith2007
11.10.2013, 13:43
Вопрос практикам:
Есть ли какая принципиальная разница в способе подключения МХ110 к ПЛК110: ModBus/Owen?

amn
11.10.2013, 13:50
to alex55 Посмотрите в документации CoDeSys_Visu_V23_RU.pdf стр.20. Там есть таблица символов формата вывода. В визуализации в категории Text укажите %u

alex55
11.10.2013, 14:59
Потрясающая компетентность и оперативность , я все буквы перепробовал а u как то не заметил. Спасибо большое amn

Smith2007
11.10.2013, 21:31
Вопрос практикам:
1. Есть ли какая принципиальная разница в способе подключения МХ110 к ПЛК110: ModBus/Owen?
2. При подключении МВ110-8А по протоколу Овен
https://lh6.googleusercontent.com/-J5kFOMdr3JU/Ulg1MfAF-WI/AAAAAAAADbM/jeBnIzlkEU8/w541-h253-no/Owen-Master.jpg

Что за переменная %QW7.2.0: WORD; (* Circular time *) [CHANEL (Q)] ?

capzap
11.10.2013, 22:07
Вопрос практикам:
1. Есть ли какая принципиальная разница в способе подключения МХ110 к ПЛК110: ModBus/Owen?
2. При подключении МВ110-8А по протоколу Овен
https://lh6.googleusercontent.com/-J5kFOMdr3JU/Ulg1MfAF-WI/AAAAAAAADbM/jeBnIzlkEU8/w541-h253-no/Owen-Master.jpg

Что за переменная %QW7.2.0: WORD; (* Circular time *) [CHANEL (Q)] ?
http://www.owen.ru/forum/showthread.php?t=15954&p=121016&viewfull=1#post121016
Для Вас этот же документ, только дополнительно пункт 3.4.5. Переменные протокола ОВЕН

alex55
13.10.2013, 12:26
Добрый день! Возникло желание основную программу PLC_PRG писать на ST/ а небольшие программки на LD, создаю переменные для перехода из из главного POU PLC_PRG в дополнительную программу и при изменении значения переменной в главной программе жду его изменения в дополнительной, пока не получается и описания не нашел.Помогите словом или примером,пожалуйста, уважаемые знатоки..

alex55
13.10.2013, 19:33
Спасибо,разобрался сам, все получилось переменные получаю и в дополнительных проектах и возвращаю в главный PLC_PRG.

RV9WFJ
14.10.2013, 07:27
Если вы не используете функционал ФБ то можно просто объявить переменные глобальными и не передавать их туда сюда. А вызов подпрограммы на LD будет тогда просто Pou1(); где Pou1 имя подпрограммы и т.д.

alex55
14.10.2013, 09:41
RV9WFJ Спасибо за этот ньюанс..

kukla100
15.10.2013, 19:48
Как в CoDeSys v2 переменным присвоить статус энергонезависимых?

YuriBel
15.10.2013, 19:57
Объявляйте их, как Retain.

kukla100
16.10.2013, 03:44
Спасибо за помощь

Igor.m
17.10.2013, 09:19
подскажите как воспользоваться переходом в CFC? если честно слабо представляю для чего он нужен, объясните кто знает. Когда компилирую проект пишет ошибку что МЕТКА НЕ ОПРЕДЕЛЕНА

Василий Кашуба
17.10.2013, 14:39
подскажите как воспользоваться переходом в CFC? если честно слабо представляю для чего он нужен, объясните кто знает. Когда компилирую проект пишет ошибку что МЕТКА НЕ ОПРЕДЕЛЕНА
Вам смогут ответить, если вы представите свой проект на обозрение.

capzap
17.10.2013, 15:07
подскажите как воспользоваться переходом в CFC? если честно слабо представляю для чего он нужен, объясните кто знает. Когда компилирую проект пишет ошибку что МЕТКА НЕ ОПРЕДЕЛЕНА

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

melky
19.10.2013, 11:21
Раньше задавал данный вопрос, но ответы не подходят под задачу. (импорт проекты из CFC в ST)
Нужно готовую программу в CFC превратить в программу на ST, чтобы понять, как все работает, куда все расставляется и т.д.

Для CFC важно расположение элементов программы, слева направо и сверху вниз. Переписывать программу на ST поэлементно не представляется возможным. Толку от того, что я каждый элемент либо могу сразу на языке ST посмотреть никакого. Важно правильное их расположение в тексте программы. При импортировании в новый проект на ST программы на CFC ни к чему не приводит, она все равно на CFC ипортируется.

Можно ли в CodeSYS это как-то сделать ? именно всю программу ?

capzap
19.10.2013, 12:40
Раньше задавал данный вопрос, но ответы не подходят под задачу. (импорт проекты из CFC в ST)
Нужно готовую программу в CFC превратить в программу на ST, чтобы понять, как все работает, куда все расставляется и т.д.

Для CFC важно расположение элементов программы, слева направо и сверху вниз. Переписывать программу на ST поэлементно не представляется возможным. Толку от того, что я каждый элемент либо могу сразу на языке ST посмотреть никакого. Важно правильное их расположение в тексте программы. При импортировании в новый проект на ST программы на CFC ни к чему не приводит, она все равно на CFC ипортируется.

Можно ли в CodeSYS это как-то сделать ? именно всю программу ?

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

melky
19.10.2013, 12:48
capzap только совершенно не понимаю, как это сделать. Проект - Перевод на другой язык. Выбор Целевого языка - пусто. нечего выбирать, ни FBD ни IL

Или как-то иначе это все делается ?

Блин, это перевод коментариев на другие языки.... а не то, что я думал...

capzap
19.10.2013, 12:58
когда ПОУ не открыто, в дереве жмете правой кнопкой т выбираете конвертацию, предоставляется выбор в какой язык сохранить

melky
19.10.2013, 13:03
capzap, спасибо, попробую. Посмотрю, возможно поможет перенести именно всю программу в ST...

Smith2007
20.10.2013, 12:12
В ST почему-то не дает сконвертировать.

Amko
20.10.2013, 12:25
Потому что это задача крайне нетривиальная. В ST ручками, или искать в интернете какие-либо сторонние утилиты.

capzap
20.10.2013, 12:29
В ST почему-то не дает сконвертировать.

http://www.owen.ru/forum/showthread.php?t=10555&p=121503&viewfull=1#post121503

amn
20.10.2013, 14:08
Нужно готовую программу в CFC превратить в программу на ST, чтобы понять, как все работает, куда все расставляется и т.д.


Мне кажется, чтобы понять как все работает проще рассказать словами. В ST программа выполняется сверху вниз. Если вы изучили CFC, то у вас не будет проблем освоить ST. Надо просто не забывать, что вы можете хоть 150 раз в разных местах присваивать одной переменной разные значения, но на выходе всегда будет последнее присвоенное значение. Ну и основное отличие при программировании на ST это использование в основном операторов IF... и CASE..., что очень удобно. Также важно на первых порах не запутаться с таймерами. Я обычно представлял, как это будет выглядеть на CFC, а потом переводил на ST.

Ryzhij
20.10.2013, 20:40
Надо просто не забывать, что вы можете хоть 150 раз в разных местах присваивать одной переменной разные значения, но на выходе всегда будет последнее присвоенное значение.А если при этом указанная переменная ещё и опрашивается SCADA, то непредсказуемость "весёлых цифирок" приятно развлекут тех.персонал, т.к. опрос извне и исполнение программы в ПЛК происходят абсолютно асинхронно.
Если к этим показаниям в SCADA ещё и алармы прикручены...
Это будет просто праздник какой-то!

amn
20.10.2013, 22:23
А если при этом указанная переменная ещё и опрашивается SCADA, то непредсказуемость "весёлых цифирок" приятно развлекут тех.персонал, т.к. опрос извне и исполнение программы в ПЛК происходят абсолютно асинхронно.
Если к этим показаниям в SCADA ещё и алармы прикручены...
Это будет просто праздник какой-то!
Справедливое замечание. Я имел в виду локальные переменные.

capzap
20.10.2013, 22:39
А если при этом указанная переменная ещё и опрашивается SCADA, то непредсказуемость "весёлых цифирок" приятно развлекут тех.персонал, т.к. опрос извне и исполнение программы в ПЛК происходят абсолгютно асинхронно.
Если к этим показаниям в SCADA ещё и алармы прикручены...
Это будет просто праздник какой-то!
Вот не считаю, что всё так, как описываете. Конфигурация обновляется также один раз и ни каких сюрпризов быть не должно

melky
20.10.2013, 23:18
amn в CFC программа выполняется не только сверху вниз, но в принципе последовательно слева направо и сверху вниз. Можно растянуть так, что тоже получится сверху вниз. Но основное не это, а то, что там линиями идут обратные связи например снизу вверх. При этом нет R или S флагов на выходах, но связь будет работать.
CFC я не изучал, я его просто понимаю, так как вся схема перед глазами. Сложности были на нем сделать цикл, но по крайней мере простой цикл на нем тоже реализовывается.
А вот как эти обратные связи будут выглядеть в ST пока даже не представляю.

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

amn
21.10.2013, 00:12
А вы представьте себе, что язык ST это тот же CFC, только без линий связи. Вместо них словами описывается какой выход куда входит. Для понимания попробуйте в программе на CFC для связи использовать для соединения не линию, а конструкцию через точку <имя ФБ>.<имя выхода>. Например выход таймера TON1.Q можем присвоить какому-нибудь входу.

Ryzhij
21.10.2013, 09:32
Вот не считаю, что всё так, как описываете. Конфигурация обновляется также один раз и ни каких сюрпризов быть не должноЕсли под конфигурацией Вы имеете ввиду область входов-выходов, то позвольте напомнить, что SCADA через свой драйвер или через OPC-сервер читает не оттуда, а из памяти глобальных переменных, где и планируется кордебалет.

melky
21.10.2013, 10:32
amn, я это понимаю, просто вид схемы мне нагляднее, но ST дает больше возможностей все же, вот и пытаюсь изучать не на проекте, а типа между делом и на примере готовой программы на CFC перекинув ее в ST было бы куда нагляднее...

amn
21.10.2013, 11:29
Ну тогда только ручками переводим CFC в ST:).

Алексеu
22.10.2013, 20:39
Уважаемые гуру форума (и прочие пользователи :))). Создал тему, а потом сообразил спросить здесь.
Если в визуализации, в поле "текст", написать "$FUB$, то получим имя экземпляра функционального блока типа "PLC_PRG.<имя функционального блока>". Вопрос-можно-ли записать это имя в строковую переменную.

capzap
22.10.2013, 20:52
Уважаемые гуру форума (и прочие пользователи :))). Создал тему, а потом сообразил спросить здесь.
Если в визуализации, в поле "текст", написать "$FUB$, то получим имя экземпляра функционального блока типа "PLC_PRG.<имя функционального блока>". Вопрос-можно-ли записать это имя в строковую переменную.
мало понятно для чего это нужно

Алексеu
22.10.2013, 22:10
Чисто для удобства. Будет несколько однотипных экземпляров ФБ с визуализацией. На каждой визуализации-имя ФБ, который её вызвал, но без PLC_PRG. Например: "HeaterInSmallRoom","HeaterInLargeRoom"

amn
23.10.2013, 00:47
to Алексеu. Попробуйте внутри ФБ добавить входную переменную для идентификации экземпляра, а в разделе объявления переменных в программе при объявлении экземпляра ФБ сразу присвоить ей значение. В визуализации использовать эту переменную.

Алексеu
23.10.2013, 09:51
to Алексеu. Попробуйте внутри ФБ добавить входную переменную для идентификации экземпляра, а в разделе объявления переменных в программе при объявлении экземпляра ФБ сразу присвоить ей значение. В визуализации использовать эту переменную.
Да-пока так и сделал, но в овене маловато памяти и хочется избавиться от всех маломальски ненужных переменных.

amn
23.10.2013, 13:02
Да-пока так и сделал, но в овене маловато памяти и хочется избавиться от всех маломальски ненужных переменных.
Где-то попадалась инфа на этом форуме, что этого добра в ПЛК "как грязи" :)

Алексеu
23.10.2013, 14:29
Где-то попадалась инфа на этом форуме, что этого добра в ПЛК "как грязи" :)
Так вот и мне ранее попадалось. Когда не нужно было. А сейчас вручную прошерстил форум, а как правильно набрать запрос в поиске не знаю

amn
23.10.2013, 14:44
После компиляции проекта выдается информация о количестве памяти. Посмотрите у себя.

capzap
23.10.2013, 15:28
syslibsocket в поиске введите

Валенок
23.10.2013, 15:35
Уважаемые гуру форума (и прочие пользователи :))). Создал тему, а потом сообразил спросить здесь.
Если в визуализации, в поле "текст", написать "$FUB$, то получим имя экземпляра функционального блока типа "PLC_PRG.<имя функционального блока>". Вопрос-можно-ли записать это имя в строковую переменную.
Читаем хелп про элемент "визулизация".

STRUCT/FB ТипаТого
строка : string;
..
END;

Где-то есть
ЧтоТо : ТипаТого;

Экран1
Вставляем ??? и в свойствах :
Текст: %s
Выв_текста: $X$.строка

Экран2
Вставляем элемент-визуализацию. При вставке выбираем имя "Экран1"
Открываем в свойствах Заместители
Заместитель X | Замена ЧтоТо

Оно ?

PS
String лучше ограничивать до необходимого min. String(15) например.

Валенок
23.10.2013, 15:39
мало понятно для чего это нужно
Что-то типа визуального action для fb/struct/program

домино
23.10.2013, 15:47
Добрый день.
Помогите пожалуйста с таким вопросом:

У меня есть:
ПЛК 160
Датчик давления БД ПД-Р (0...10 Бар).
Клапан ASCO серии 290 с позиционером (4-20 мА)

Датчик устанавливается перед клапаном на баллон с газом.
Необходимо запрограммировать таким образом, что если в баллоне давление больше 7 бар - открыть клапан, но при этом постоянно поддерживать на выходе 1 бар (управление позиционером 4-20 мА).
Газ из баллона уходит, давление падает 6, 5, 4, 3 бар - клапан открыт на выход 1 бар.
При показании датчика в 1 бар - закрыть клапан.

Я использовал для реализации гистерезис - открытие/закрытие клапана и ПИД регулятор из util.lib.
Но возникли проблемы с полным закрытием клапана - до конца не закрывается, и не могу подобрать коеффициенты пид-регулятора для 1 бара на выход.

Очень хотелось услышать ваших советов в решении данной проблемы, было бы замечательно,если это будет код в виде FBD.

Ryzhij
23.10.2013, 16:22
Примените дискретное реле давления в баллоне на 1 бар, дискретный клапан-отсекатель и газовый редуктор.
При этом можете даже сэконмить на ПЛК ;)

PS: Если же Вам очень хочется реализовать редуктор давления с применением ПЛК, то соблаговолите дать ПЛК информацию о давлении после клапана-регулятора, ведь именно эту величину Вы планируете поддерживать постоянной.

домино
23.10.2013, 16:42
Ryzhij Уже всё есть, я пытаюсь делать уже на том, что купили до меня.

Так что требуется помощь без изменения состава приборов.

Ryzhij
23.10.2013, 16:48
Поймите, домино, это не аргумент для отмены законов физики, и нарушения причинно-следственных связей.
От того, что глупость сделали не Вы лично, а кто-то другой, она не перестанет быть тем, что есть - глупостью.
Если использование ПЛК для Вас вопрос политический, то Вам нужен ещё один датчик давления, ну и аналоговый вход под него.

домино
23.10.2013, 17:15
Ryzhij Хорошо, я поставлю датчик и после клапана, не могли бы вы помочь в написании программы?

Smith2007
23.10.2013, 17:27
Может я не прав, но добиться устойчивого давления на выходе при динамическом изменении расхода газа будет крайне сложно. И каким быстрым (и точным) не будет опрос датчика давления и регулировка клапана подбирать коэф. надо очень тщательно. Как правильно заметили выше - самое простое решение - отсечной клапан (дискретный) и редуктор (механический за 300 руб). :)

Ryzhij
23.10.2013, 17:29
Думаю, что смогу. Точную модель ПЛК и шкалы датчиков укажите.
PS
И уточните - 4 мА соответствует полностью закрытому положению клапана или полномтью открытому?
Учтите также, что в отличие от редуктора, при отсутствии расхода даже при полностью закрытом клапане на выходе из-за утечек клапана-регулятора в конце-концов установится давление равное давлению в баллоне с газом.

Ryzhij
23.10.2013, 17:35
Может я не прав, но добиться устойчивого давления на выходе при динамическом изменении расхода газа будет крайне сложно. И каким быстрым (и точным) не будет опрос датчика давления и регулировка клапана подбирать коэф. надо очень тщательно. Как правильно заметили выше - самое простое решение - отсечной клапан (дискретный) и редуктор (механический за 300 руб). :)Качество регулирования от многого зависит, и от правильно подобранного клапана, и от объёма трубопровода, но ведь домино не ищет лёгких путей, или они закрыты ;)

capzap
23.10.2013, 20:00
Да-пока так и сделал, но в овене маловато памяти и хочется избавиться от всех маломальски ненужных переменных.

а как Вам такой вариант, подгружать нужный ФБ в зависимости какое окно визуализации открывается
http://www.owen.ru/forum/showthread.php?t=13446&p=91428&viewfull=1#post91428

Валенок
23.10.2013, 22:06
ну или вот

melky
23.10.2013, 22:17
домино датчик показал 1 бар ? можно на сравнивании с этим 1 бар, сделать ресет ПИД регулятору и на выходе получить 0. Можно переключить в режим мануал. Вроде никто не мешает ...

домино
23.10.2013, 23:00
Вложение смотрите из сообщения ниже.

Вчера, 23:22 домино
Как удалить это сообщение не нашел.

домино
23.10.2013, 23:10
Ryzhij

ПЛК-160
4 мА соответствует полностью закрытому положению клапана
шкала датчика 0..10 бар


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

Давления не большие, надеюсь клапан справится.

домино
23.10.2013, 23:22
Я использовал для реализации гистерезис - открытие/закрытие клапана и ПИД регулятор из util.lib.
Но возникли проблемы с полным закрытием клапана - до конца не закрывается, и не могу подобрать коеффициенты пид-регулятора для 1 бара на выход.

1) открытие/закрытие клапана,(просто медленное открытие/закрытие без поддержания постоянного давления на выходе) не получается принудительно его закрыть полностью, рассчитать точно коэффициенты думаю не совсем верно.

2) 1 бар на выходе, регулируется датчиком M2

В прикрепленном файле - описание и реализация, у счетом моментов описанных выше.
Соленоидные клапаны в примере для наглядности работы установки.

Использование ПЛК, дорогих клапанов, и т.д обусловлено ещё и тем что установка большая, и надо много чего еще реализовывать, когда закупалось всего не продумывали, и брали в "лучшие" времена (как мне сказали), а теперь деньги потрачены, больше не выделят, надо крутиться с чем есть.


отсечной клапан (дискретный) и редуктор (механический за 300 руб)
Smith2007 хотелось бы увидеть это на деле, т.е программно.

Руслан23
24.10.2013, 17:04
здравствуйте помогите настроить трм138 для меня это новое оборудование и не могу разобраться мне нужно на что бы он показывал индикацию
1. датчик давления насосов 0...150кПа (4...20мА)
2. датчик уровня клай 8000 на емкость 2 метра (4...20мА) на датчике клай я выстовил предворительно 4 мА на данный момент емкость на половину заполнена какие параметры нужно вбивать
3. датчик температуры воды ДТС 035-50М диапазон от -50 до+180
4. датчик интенсивности от 0 до 100%
5. расходомер Взлет Профи 311И в сутки через него должно проходить 30 кубов (4...20 мА)
мне нужно что бы показывало на табло ТРМ эти все значения в настоящем времени где мне нужно изменять эти параметры.
помогите пожалуйста я буду очень вам признателен. Заранее спасибо

Ryzhij
24.10.2013, 19:36
домино

Верно ли я изобразил технологическую схему Вашего участка?
Обратите внимание на обратный клапан VC, его наличие необходимо чтобы заряженный баллон не сбрасывал давление в магистраль при снижении давления в последней ниже давления в баллоне.
Далее, если есть кнопка (сигнал) на подключение баллона к магистрали для зарядки, то должна быть кнопка (сигнал) и для отключения от магистрали, нет?
Если всё обстоит так, как я нарисовал, то завтра приброшу программу.
Сегодня не получилось - текучка загоняла.

Алексеu
24.10.2013, 20:01
capzapу

а как Вам такой вариант, подгружать нужный ФБ в зависимости какое окно визуализации открывается
http://www.owen.ru/forum/showthread.php?t=13446&p=91428&viewfull=1#post91428
и Валенку

ну или вот
огромное спасибо. Сейчас попробую.
ps Отдельное спасибо Валенку за primer. Дети были в восторге и делали ставки.

RV9WFJ
25.10.2013, 06:42
здравствуйте помогите настроить трм138 для меня это новое оборудование и не могу разобраться мне нужно на что бы он показывал индикацию
1. датчик давления насосов 0...150кПа (4...20мА)
2. датчик уровня клай 8000 на емкость 2 метра (4...20мА) на датчике клай я выстовил предворительно 4 мА на данный момент емкость на половину заполнена какие параметры нужно вбивать
3. датчик температуры воды ДТС 035-50М диапазон от -50 до+180
4. датчик интенсивности от 0 до 100%
5. расходомер Взлет Профи 311И в сутки через него должно проходить 30 кубов (4...20 мА)
мне нужно что бы показывало на табло ТРМ эти все значения в настоящем времени где мне нужно изменять эти параметры.
помогите пожалуйста я буду очень вам признателен. Заранее спасибоРуслан, вот и выбирайте все типы датчиков кроме температуры 4..20мА и вводите мин и макс знасения датчиков. Это можно с компьютера сделать если есть адаптер. Если нет то можно и ручками с панели. Если для вас это звучит как шаманские закленания то я бы лучше к специалисту обратился. По списку датчиков я примерно догадываюсь что это за оборудование, туда больше ПЛК просится с панелью.

Ryzhij
25.10.2013, 13:21
Ryzhij Уже всё есть, я пытаюсь делать уже на том, что купили до меня.

Так что требуется помощь без изменения состава приборов.
А на поверку оказалось, что это дипломная работа.
10555
По таким вещам я принципиально даю только самые общие рекомендации.
Нехорошо, домино, свою деятельность начинать с подобного лукавства.

домино
25.10.2013, 14:05
Ryzhij
Да, я делаю диплом, но установка реальна, существует на предприятии и ее необходимо автоматизировать, чем параллельно я и занимаюсь.
Т.е диплом - разработка, мне надо диплом, им автоматизированная установка.

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

Руслан23
25.10.2013, 14:45
Спасибо большое со всем разобрался все работает, и да у меня тут есть панель оператора и контролле ханевел. Проблемма в том что поставили не ту марку трм138. И большое спасибо

Ryzhij
25.10.2013, 17:02
Да, я делаю диплом, но установка реальна, существует на предприятии и ее необходимо автоматизировать, чем параллельно я и занимаюсь.
Т.е диплом - разработка, мне надо диплом, им автоматизированная установка.Я только радуюсь за Вас, домино, но не считаю для себя возможным мешать Вам овладевать профессией.
Удачи!

mc_
31.10.2013, 11:45
Как вывести время (таймер) в удобоваримом виде на CoDeSys HMI?
Текущее время получается нормально (например 14:38:40), с таймера (там обратный отсчет) - только T#30m12s и прочая абракадабра. На экране так и пишет.

Инструкцию читал, там про текущее время/день/месяц и т.д., не мой случай.
Пример с хронометром (http://www.owen.ru/forum/showthread.php?t=11341&page=6&p=77724&viewfull=1#post77724) скачал, но открыть не смог.

melky
31.10.2013, 12:40
Как ввести время с панели ИП320 в ПЛК используя целочисленные значения ? например просто ввести секунды.

Пробовал word_to_time, dword_to_time на выходе получаю в переменной t#0ms
И пробовал так же пример из документации по CodeSys со string_to_time на входе 't#20s' а на выходе все тоже t#0ms

YuriBel
31.10.2013, 13:03
Нету тут никаких чудес. Формат time содержит значние времени в миллисекундах, столо быть, если из панели получается word, который содержит секунды, то его сначала нужно умножить на 1000, а затем преобразовать в формат времени через word_to_time. Выкладывайте примеры, которые не работают, будем смотреть.

melky
31.10.2013, 14:35
YuriBel однако если в word записано значение 20, то на выходе word_to_time и должно стоять t#20ms или я ошибаюсь ?
Почему же тогда на выходе стоит t#0ms ?

a: word :=20
a - word_to_time - b почему ноль ?

Простая программа с двумя переменными, Codesys 2.3

capzap
31.10.2013, 14:41
YuriBel однако если в word записано значение 20, то на выходе word_to_time и должно стоять t#20ms или я ошибаюсь ?
Почему же тогда на выходе стоит t#0ms ?

a: word :=20
a - word_to_time - b почему ноль ?

Простая программа с двумя переменными, Codesys 2.3
улыбнуло
а не пробовали блокам присвоить нормальный порядок следования

YuriBel
31.10.2013, 14:59
Еще раз повторяю, выкладывайте проект, будем смотреть. Картинками меряться бессмысленно.

melky
31.10.2013, 15:08
capzap от я тормоз, в очередной раз наступаю на грабли :) - работает

yurmik
31.10.2013, 15:21
Доброго времени суток. Нужен переход в другую визуализацию при наступлении определённых условий, то есть без нажатия кнопки. Возможно ли такое реализовать?

melky
31.10.2013, 16:00
Ломаю голову, как сделать двойное изменение параметра в разных слейвах ?
Есть два слейва в конфигурации - tcp(мастер) и панель ИП320(мастер). Вот надо значения переписывать при изменении на одном мастере чтобы отображалось в другом.
То есть я на панели поменял значение, оно записалось в слейве ТСР, поменял это же значение в ТСР, оно тут же попало на панель.

YuriBel
31.10.2013, 16:47
А вот так не пойдет? Сам я, правда, не пробовал, но вроде где-то видел, что так делают.

melky
31.10.2013, 17:00
YuriBel попробую для проверки как-нибудь, но пока уже проект написан, неохота перелопачивать конфигурацию, есть нюансы с ТСР слейвом, ПЛК слейв, шлюз Modbus SNMP мастер по ТСР, там есть много параметров которых нет у панели.
Придется всю струтуру переделывать, а это долго.

Пока вышел из ситуации через промежуточное значение. Сравниваю например панельные данные с промежуточным, и если разные, то записываю промежуточное и в другой слейв. аналогично и с ТСР, сравниаю с этим же промежуточным и если разные пишу в панель.

з.ы. и это все на CFC, на ST пока не умею :)

Не выходит каменный цветок со сравнением переменных, вернее работает частично, пока я из панели запишу, в другом слейве еще значение не поменялось и оно тут же переписывает назад. В итоге через раз удается изменить значение с панели или через мастер ТСР.

Вот на примере пары регистров. at1, bt1 это регистры которыми управляет панель
atp1, btp1 - промежуточные переменные
atcp1, btcp1 - регистры, которыми управляет мастер ТСР

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

Насколько понимаю, это из-за того, что чтение из Modbus происходит в начале цикла, а запись в конце. Вот и как это обходить в программе ?

melky
01.11.2013, 14:18
уперся в реализацию сравнения и изменения другого регистра. Либо панель переписывает значения и не дает менять ТСР устройству, либо ТСР устройство переписывает и не дает менять панели.
Как победить уже не понимаю.

Ryzhij
01.11.2013, 14:50
А не надо экономить на регистрах. ;)
Выделяйте два: один выходной, другой входной.

melky
01.11.2013, 14:59
Ryzhij плодить регистры нет желания, тем более надо видеть значение перед изменением.
Ведь панель будучи мастером прекрасно читает регистр и его же меняет, если ей разрешить это делать.
Точно так же регистр ТСР устройства прекрасно его читает и меняет.

Но вот сделать зависимость одного регистра по отношению к другому не получается. где-то что-то упускаю...

oka859
01.11.2013, 15:15
можно- ли использовать такие блоки как по ссылке http://clip2net.com/s/655maa этот алгоритм мне нужно переписать в CoDeSys ,т.к. будем использовать оборудование овен

melky
01.11.2013, 15:22
oka859 язык CFC вам в помощь, но будьте готовы, что есть блоки аналогичные, есть другие, некоторые придется дописывать, некоторые вытягивать из Oscat библиотеки и т.д.

Ryzhij
01.11.2013, 15:26
Ryzhij плодить регистры нет желания, тем более надо видеть значение перед изменением.
Ведь панель будучи мастером прекрасно читает регистр и его же меняет, если ей разрешить это делать.
Точно так же регистр ТСР устройства прекрасно его читает и меняет.

Но вот сделать зависимость одного регистра по отношению к другому не получается. где-то что-то упускаю...
Коллизия обмена, с которой Вы столкнулись носит всеобщий характер и присуща всем системам с асинхронным обменом по любой сети с использованием общего буфера. Без второго регистра тут не обойтись. Там либо флаг готовности данных выставлять надо, либо регистры однонаправленными делать.
Прочитать перед изменением отведённый для чтения нет никаких проблем. Копировать же содержимое регистров будет программа контроллера, после того как примет переданное значение к исполнению.

oka859
01.11.2013, 15:39
в CFC в основном логические блоки,релейных я там не обнаружил,учитывая ,что я без опыта лезу в среду программирования.. по картинке что я выложил схема работает, среда FBD , но она не устраивает, т.к. добавились процессы .

melky
01.11.2013, 16:10
oka859 то, что у вас на картинке это походу Schneider или ZelioLogic или их контроллеры. Ну так Codesys CFC в принципе тоже самое с теми или иными отличиями....

oka859
01.11.2013, 16:24
да, ZelioLogic

melky
01.11.2013, 16:41
oka859 сразу говорю, ZelioLogic гораздо беднее. И например чтобы быстро перенести программу из него в CodeSys или OwenLogic мне ребята помогли переписать на CFC тот же Boolean шнайдеровский.
Ну и в Zelio один таймер, где галочками ставится режим работы, в CodeSys это просто разные таймеры. Скачайте oscat библиотеки, они перекроют с головой все потребности за исключением некоторых своеобразных из ZelioLogic типа Boolen

melky
01.11.2013, 17:37
Интересная ерунда, убрал проверку регистра ТСР и если я сразу проверяю регистр панели и сразу записываю в регистр ТСР, то записаться оно не успевает.. очень интересно...

petera
02.11.2013, 05:20
Ломаю голову, как сделать двойное изменение параметра в разных слейвах ?
Есть два слейва в конфигурации - tcp(мастер) и панель ИП320(мастер). Вот надо значения переписывать при изменении на одном мастере чтобы отображалось в другом.
То есть я на панели поменял значение, оно записалось в слейве ТСР, поменял это же значение в ТСР, оно тут же попало на панель.

PROGRAM PLC_PRG
VAR
Reg1:WORD; (*Промежуточная переменная*)
END_VAR

IF Reg1 <> Reg1slave1 THEN
Reg1:=Reg1slave1;
Reg1slave2:=Reg1;
ELSE
IF Reg1 <> Reg1slave2 THEN
Reg1:=Reg1slave2;
Reg1slave1:=Reg1;
END_IF
END_IF
10624

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

melky
02.11.2013, 09:09
petera как реализовать один IF Then на CFC я понимаю. А вот как вложенный сделать (ELSE) немного не понимаю. сделать отдельный POU на ST пока нет возможности, отдавать уже надо :(
И пробема оказалась в том, что одна комбинация не успевает записать значение в modbus.
ТО есть я просто сравниваю значение Reg1 c Reg1slave1 и тут же пишу в Reg1 и Reg1slаvе2 (при помощи move c en входом, на en вход идет bool сравнения) и происходит странность. Переменная Reg1 записывается, а в Regslave2 значение отправиться не успевает....

Как на картинке в посту http://www.owen.ru/forum/showthread.php?t=10555&page=243&p=122480&viewfull=1#post122480

at1 - это Reg1slave1
atp1 - это Reg1
atcp1 - это Regslave2 - так вот эта переменная не успевает отправиться в регистр почему-то. Хотя то, что оно не успевает отправиться в само устройство понятно, мастер tcp опрашивает раз в 1 сек регистры. Но внутри ПЛК Universal Modbus Slave device ведь должен восприниматься просто как обычные переменные, а уж когда их считает мастер проблема не ПЛК. Тем более запись регистра мастером только по запросу происходит....

capzap
02.11.2013, 09:43
petera как реализовать один IF Then на CFC я понимаю. А вот как вложенный сделать (ELSE) немного не понимаю. сделать отдельный POU на ST пока нет возможности, отдавать уже надо :(
И пробема оказалась в том, что одна комбинация не успевает записать значение в modbus.
ТО есть я просто сравниваю значение Reg1 c Reg1slave1 и тут же пишу в Reg1 и Reg1slаvе2 (при помощи move c en входом, на en вход идет bool сравнения) и происходит странность. Переменная Reg1 записывается, а в Regslave2 значение отправиться не успевает....

Как на картинке в посту http://www.owen.ru/forum/showthread.php?t=10555&page=243&p=122480&viewfull=1#post122480

at1 - это Reg1slave1
atp1 - это Reg1
atcp1 - это Regslave2 - так вот эта переменная не успевает отправиться в регистр почему-то. Хотя то, что оно не успевает отправиться в само устройство понятно, мастер tcp опрашивает раз в 1 сек регистры. Но внутри ПЛК Universal Modbus Slave device ведь должен восприниматься просто как обычные переменные, а уж когда их считает мастер проблема не ПЛК. Тем более запись регистра мастером только по запросу происходит....
так выглядит на CFC, то что предложил petera

petera
02.11.2013, 09:50
Возможно должно быть так?
10628

petera
02.11.2013, 09:57
Вообще-то я не понимаю как может быть

так вот эта переменная не успевает отправиться в регистр почему-то. Хотя то, что оно не успевает отправиться в само устройство понятно, мастер tcp опрашивает раз в 1 сек регистры. Но внутри ПЛК Universal Modbus Slave device ведь должен восприниматься просто как обычные переменные, а уж когда их считает мастер проблема не ПЛК. Тем более запись регистра мастером только по запросу происходит....
Возможно мастер tcp пишет в slave(в ПЛК) значения не по изменению, а с тем же периодом 1с? Тогда только разделение регистров на чтение и запись для этого мастера.
А нельзя попробовать без всяких программ, прямо в конфигурации Modbus Slave из кодесиса просто попробовать менять значения, будут ли они записываться для мастера TCP или он не даст их изменить из-за того, что все время сам пишет в этот регистр?

melky
02.11.2013, 14:55
Спасибо, попробую и так и так. А про метки то я и забыл....
petera Проверял, временные параметры стоят 0.0 секунд, то есть запись только по запросу со стороны мастера.
Так дело в том, что сперва на выходе move висело две переменных Reg1 и Regslave2 значение из Regslave1. Почему-то Regslave2 не меняет значение. Я просто убрал Regslave2 и в конце программы поставил Reg1 записать в Regslave2 и так работало.

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

amn
02.11.2013, 15:02
petera сделать отдельный POU на ST пока нет возможности, отдавать уже надо :(


А так выглядит использование блока, который предложил petera. Там на один вход подсоединяете регистр первого слэйва на второй регистр второго слэйва и все.

Ryzhij
02.11.2013, 17:13
PROGRAM PLC_PRG
VAR
Reg1:WORD; (*Промежуточная переменная*)
END_VAR

IF Reg1 <> Reg1slave1 THEN
Reg1:=Reg1slave1;
Reg1slave2:=Reg1;
ELSE
IF Reg1 <> Reg1slave2 THEN
Reg1:=Reg1slave2;
Reg1slave1:=Reg1;
END_IF
END_IF
Используется промежуточная переменная Reg1. В ней хранится предыдущее значение, полученное ранее из любого слейва.
Всё замечательно, но нам надо бы ещё расставить приоритеты.
Из-за абсолютной несинхронности обменов по сетям будут возникать ситуации, когда в течение одного цикла поменяются значения из обоих источников.
Кого будем слушаться? Кто у нас сегодня за "гегемона"? ;)

capzap
02.11.2013, 17:20
Всё замечательно, но нам надо бы ещё расставить приоритеты.
Из-за абсолютной несинхронности обменов по сетям будут возникать ситуации, когда в течение одного цикла поменяются значения из обоих источников.
Кого будем слушаться? Кто у нас сегодня за "гегемона"? ;)

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

Ryzhij
02.11.2013, 20:46
Это Вы потом оператору(-рам) расскажете )))
А я с такой лабудой по жизни уже сталкивался.
Но, похоже, у каждого свой путь и свои персональные грабли.

capzap
02.11.2013, 21:12
чего мне им рассказывать, у меня в последнее время все объекты идут с дополнительным удаленным операторским местом и бывает даже не с одним

Ryzhij
02.11.2013, 22:15
Что ж, если Вам не приходится передавать/захватывать управление объектом, разбираться с правами операторов, приоритетами источников команд, и не Вы заморачиваетесь с логгированием действий операторов, то Вам можно только позавидовать.

capzap
02.11.2013, 22:27
какой высокий полет мысли, как он соприкасается с поставленной задачей :)

Ryzhij
02.11.2013, 22:37
Как только возникнет хоть один из описанных аспектов, то сразу появится необходимость выделения каждому из источников своего массива регистров ;)
Персонального.
Чтобы мух - к мухам, а котлеты - к котлетам. И не взирая на асинхронность событий.

capzap
02.11.2013, 22:42
ну и что, вот когда человек решит задачу, как с двух мест менять регистры, перейдет к следущим вопросам и возможно они не будут еще касаться администрирования прав
по этому как говорится: "Простой поток сознания вызывал череду сложных биохимических реакций"

kukla100
03.11.2013, 16:30
Что такое массив и с чем его едят?
(ВОПРОС: Подскажите пожалуста, как отправлять несколько СМС (допустим 5 штук) по одному номеру? Допустим сразу два, а вдругой аварийный случай одно, а может быть даже три. Вобщем диспетчерезацию (PLC-телефон) маленькой такой котельной.

ОТВЕТ: Все сообщения в массив и по очереди отправляйте. Переход к следующему - наличие флага успешной отправки. )

Smith2007
03.11.2013, 19:01
Что такое массив и с чем его едят?


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

из справки (что по F1)
Массивы

Элементарные типы данных могут образовывать одно-, двух-, и трехмерные массивы. Массивы могут быть объявлены в разделе объявлений POU или в списке глобальных переменных. Путем вложения массивов можно получить многомерные массивы, но не более 9 мерных ( "ARRAY[0..2] OF ARRAY[0..3] OF …" ).
Синтаксис:
<Имя_массива>:ARRAY [<ll1>..<ul1>,<ll2>..<ul2>] OF <базовый тип>.
где ll1, ll2, ll3 указывают нижний предел индексов; ul1, ul2 и ul3 указывают верхние пределы.
Индексы должны быть целого типа. Нельзя использовать отрицательные индексы.
Пример:
Card_game: ARRAY [1..13, 1..4] OF INT;
Пример инициализации простых массивов:
arr1 : ARRAY [1..5] OF INT := 1,2,3,4,5;
arr2 : ARRAY [1..2,3..4] OF INT := 1,3(7); (* сокращение для 1,7,7,7 *)
arr3 : ARRAY [1..2,2..3,3..4] OF INT := 2(0),4(4),2,3;
(* сокращение для 0,0,4,4,4,4,2,3 *)
Пример инициализации массива структур:
TYPE STRUCT1
STRUCT
p1:int;
p2:int;
p3:dword;
END_STRUCT
ARRAY[1..3] OF STRUCT1:= (p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),
(p1:=14,p2:=5,p3:=112);
Пример инициализации части массива:
arr1 : ARRAY [1..10] OF INT := 1,2;
Не инициализированные явно элементы массива принимают значения по умолчанию. Так, в данном примере оставшиеся элементы примут значение 0.

Доступ к элементам массива:
Для доступа к элементам двухмерного массива используется следующий синтаксис:
<Имя_массива>[Индекс1,Индекс2]
Пример:
Card_game [9,2]

ps. Возможно я зря взял на себя ответственность давать какие либо советы ибо сам только постигаю азы, но мне показалось, что автор вопроса не понял ответа.</ul2></ll2></ul1></ll1>

Ryzhij
03.11.2013, 19:28
Что такое массив и с чем его едят?Найдите на просторах интернета книгу "Петров И.В. Программируемые контроллеры. Стандартные языки и примеры программирования".
Там в разделе 4.3.1 Массивы (стр. 57) изложен интересующий Вас вопрос как раз применительно к работе в среде Codesys.

melky
03.11.2013, 21:16
Ryzhij Может я выше где-то и писал, не помню уже. У меня никто соревноваться не будет. Настройки с панели скрыты от использования и закрыты паролем. Необходимы для пусконалдки и только. Просто раз у меня еще есть шлюз Modbus-SNMP то эти же настройки решил пробросить и туда. Чтобы можно было удаленно тоже подкрутить настройки. Не более того.

Ryzhij
04.11.2013, 11:35
Надо признать, melky, я не в курсе какого рода оборудование Вы автоматизируете.
Ну что ж, если Вас не беспокоит неизбежная при такой архитектуре перспектива "разбора залётов" и попыток свалить вину на "большого брата на том конце шнура", то можете и не заморачиваться с необходимостью чёткого определения и фиксации, а кто же именно сказал "Мяу".

melky
04.11.2013, 12:15
Ryzhij мне все-таки пришлось разнести регистры записи и чтения modbus tcp мастера. Насколько я понимаю, скорость обмена по Modbus существенно ниже, нежели выполнение программы ПЛК. А у Universal Modbus Slave Device в таргетах нет понятия статуса передачи, по которым можно было бы отслеживать прием и передачу.
Если это есть у библиотек работы с Modbus, то хорошо, в будущем перейду на работу с библиотеками. А так пришлось корячиться...

Да оборудование простое, Приточка, Вытяжка, Газоудаление в работе в ручном режиме со сбросом по Аварии. Отсюда и ПЛК. Просто одновременно с этим мониторинг состояния клапанов, вентиляторов по датчикам давления, нескольких кондиционеров, весь мониторинг необходимо загнать в SNMP, что довесило соответствующий шлюз в систему.
А все эти плюсы в виде изменения параметров удаленно просто чтобы из-за изменения одного параметра не переться на объект, вот и все. Если один раз отстроится при пнр и будет все работать, ну и ладно, даже удаленно не буду менять, а если нет ?.... Есть железка для удаленки, почему бы не воспользоваться ?

melky
04.11.2013, 17:58
Блин, тупанул с варисторами, прицепив их к выходу ТТР. Получается я его спалил ? чета слабенькое оно в защите оказалось... или у меня лыжи не едут с управлением ТТР. На выходе надо задавать значения 4-20 в REAL вроде же ?

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

service
05.11.2013, 11:48
не работал FBD в кодесисе. как вставить блок RAMP_REAL в программу или функциональный блок?

petera
05.11.2013, 12:10
не работал FBD в кодесисе. как вставить блок RAMP_REAL в программу или функциональный блок?

http://toolson.net/ImageData/GifAnimation/1371748.gif

oka859
05.11.2013, 12:11
скачал. а куда их сохранять?

melky
05.11.2013, 16:00
oka859 вы про oscat библиотеки ? .lib положить в папку с библиотеками где CodeSys установился c:\Program Files (x86)\3S Software\CoDeSys V2.3\Library\
подключать через вкладку Ресурсы - Менеджер библиотек в самом CodeSys

Приготовьтесь библиотеку делить и кромсать через экспорт/импорт, так как CodeSys может отругаться на превышенное количество POU в проекте. Ну туповат он, сперва все в себя загружает, даже если в проекте ни одного POU не поставлено из библиотеки.

kolyan
06.11.2013, 13:08
Здравствуйте!

Связка: ПЛК-73М + радиомодем "Спектр-433" в прозрачном режиме (радиоудлинитель RS-485) + радиомодем "спектр-433 IO" с 4-мя входами и 4-мя выходами на борту.
Задача: с помощью ПЛК-73 опрашивать входы (Функция 02 Modbus, адрес 0..3) и управлять выходами (функция 15 Modbus, адрес 0..3) удалённого радиомодема "спектр-433 IO".
Во вложении - пример.
Проблема в том, что связь между ПЛК и "Спектр-433IO" нормальная, аварии связи нет, но не получается ни управлять выходами модема ни получать данные со входов. Чувствую, что проблема в расшифровке содержимого буффера чтения и в неправильной записи в буффер передачи. Но нигде толком не нашёл, как работать с именно с функциями 02 и 15 Modbus, в плане буфферов.
Если кто в курсе, помогите, пожалуйста!
Желательно, простым примером.

oka859
06.11.2013, 13:17
Спасибо, я вчера разобрался куда положить.

oka859
06.11.2013, 13:39
А описания стандартных библиотек на русском нету?

capzap
06.11.2013, 14:09
А описания стандартных библиотек на русском нету?

http://www.owen.ru/catalog/67395347 в архиве/ах Библиотеки CoDeSys в папке Lib_Doc все файлы с окончанием имени _RU.pdf должны быть на русском

oka859
06.11.2013, 14:27
хорошо, а описание самих блоков?
Ну не знаю я английский язык, учил в детстве немецкий,да и после учебы применять его негде было,забыл я его.