Просмотр полной версии : адрессация
при обкатке программы возник вопрос. операцию присвоения адреса входа плк (посредством Move) входной величине созданного функционального блока Fb где лучше осуществить, внутри самого функционального блока или же в главной программе откуда он вызывается? все входа на Fb в гл. программе Prg тоже есть.
спасибо.
Николаев Андрей
27.07.2010, 16:07
немного непонятно, но если вопрос стоит ли заносить глобальные переменные (а переменные из конфигурации глобальные априори) в блоки или присваивать на входы в основной программе - мое имхо в основной программе одназначна.
Немного не понял с move
Мне надо, чтобы входная переменная в одном из созданных мною FB считывала значение напрямую с адреса. Попытался в разделе объявлений её объявить как
var_input
ten % AT ID 0.2.0:REAL;
cкомпилировал -он заругался: то ему нужно двоеточие поставить перед %, то неправильная inicial variable, то неизвестный тип переменной.
Вобщем пришлось с помощью MOVE c аналового входа присваивать значение входу FB.
Конечно было бы проще с прямой адрессацией, но почему-то не получается?
И ещё вопрос. С помошью MOVE можно ли из других функциональных блоков или других частей программы значения локальных переменных перемещать или это действует только в пределах одного блока?
И в чём принципиальная разница если я измеренную величину попытаюсь сохранить либо объявив её как Retain, либо отправив по адресу например %AT MD14 ?
спасибо
Малышев Олег
28.07.2010, 10:07
1) В фб пишем
FUNCTION_BLOCK ddd
VAR_INPUT
aa AT %I* :BOOL;
END_VAR
VAR_OUTPUT
bb:BOOL;
END_VAR
VAR
END_VAR
2) В Var_config создаем
PLC_PRG.g.aa AT %IX0.0.0:BOOL;
где PLC_PRG.g - имя экземпляра ФБ типа ddd
Николаев Андрей
28.07.2010, 11:47
AT % а не наоборот... Ну и работайте с именем а не с адресом - сильно правильнее
var
var1 AT % ... : BOOL;
end_var
спасибо! с адресацией понятно, а что скажите по остальным вопросам насчёт Move и сохранения полученной переменной?см. выше
Николаев Андрей
28.07.2010, 15:20
1. Я бы почитал документацию по CoDeSys и понял чем различается Retain и маркерная память.
2. Локальная переменная на то и локальная, что действует в одной подпрограмме. В другой подпрограмме может быть локальная переменная с таким же именем - и это 2 разных переменных. Если Вы уже понимаете, что у Вас будут подпрограммы - не стесняйтесь делать для них входящие и выходящие переменные: надо данные из другого куска передать: var_input, надо результат в основную программу вернуть - var_output.
В разделе примеров есть пример создания подпрограмм и вызова из основной программы.
спасибо за предыдущие советы. возникли ещё вопросы. Во время обкатки проекта (см. вложения) возникает следующая ситуация . По короткой команде TRUE (следом FALSE) start_zero (global_var) запускается блок измерения среднего значения веса за единицу времени mix:STATISTICS_REAL. Время произвольное. По короткой (TRUE следом FALSE) команде stop в гланой программе PLC_PRG c помощью блока MOVE выходные величины FB mix записываются в память меркеров (см. var_retain). Дальнейшее измерение идёт с учётом этих величин. И всё бы ничего, только вот после выключения ПЛК эти величины показывают какую-то чушь. Например до выключения всё нормально:
MN = 0.2254406;
MX = 2.326654;
AVG = 1.361449.
после выключения и повторного включения ПЛК:
MN =2.337515e-32;
MX = -1.032399e+017;
AVG = 1.762714e+033.
Такое ощущение, что проведённые измерения не сохраняются даже после того как их объявил retain.
А мне эти величины нужны сохранёнными, что пользоваться ими в дальнейшем либо как константами, либо как коэффициэнтами, даже если ПЛК будет выключен несколько месяцев.
ЧТО Я ДЕЛАЮ НЕ ТАК??? Может есть другой способ сохранения этих величин? Заранее благодарю.
Николаев Андрей
03.08.2010, 14:59
Многое не так делаете...
1. В Вашей подпрограмме сохранение никогда и не будет - у Вас переменная mem будет true в любом случае до конца цикла (до низа поля программы). В начале следующего прохода она уже опять будет равно false...
2. Не делайте Retain внутри блока, если Вы не уверенны, что в момент пропадания питания блок будет вызываться из основной программы. Да и в принципе Retain я бы делал в основной программе.
3. Объявляйте их просто Retain - не заносите в маркерную память.
4. Адрес переменной AT %... недопустим!!!!!!!!!!!!!!!!!!!
Начните с простого - создайте простую программу без подпрограмм, и задайте в ней пару переменных типа Retain. Как сохранятся- двигайтесь дальше.
Програмка, которую я выставил, очень усечённая версия. В ней уже существуют другие подпрограмки. mem потому и объявлена глобальной, что действует и в другом блоке и включается только на период одного цикла. А вообще мне просто нужно единовременно измерить (режим калибровки) средний вес ленты весового дозатора за один оборот ленты и использовать его в последующих вычислениях.
Как я теперь понимаю - меркерная память действует только в динамическом режиме, во время работы программы?
А почему сам адрес-то не допустим? Компилятор не ругается вроде.
Николаев Андрей
03.08.2010, 16:42
Ну с памятью - я имел в виду у вас встречается в подпрограмме AT %* - почему не ругается компилятор не знаю.
С маркерной особо не работал - не в курсе. А с ретэйнами работал.
Если у Вас по какому то событию надо сохранять значения всех переменных - не издевайтесь так над собой и над программой.
Создайте отдельную подпрограмму, которая по результатам переменной mem (простой выход одного из блоков - не глобальная переменная) будет присваивать отдельным переменным для хранения значений в Retain значение простых выходных переменных из других подпрограмм.
Ну или даже не подпрограмму - а прям операторами типа move с блоками EN...
Ну и последнее - данное присвоение стоит делать (вызывать подпрограмму записи переменных) в самом конце программы. Чтобы флаг mem или любые другие были взведены. При переходе в начало программы (на примере Вашей программы) mem сбрасывается.
попробовал по разному, но в итоге как вы и говорили лучше всего ретайны объявлять и записывать с помощью Move в самой гл. программе. когда перенёс в Plc_prg -заработало -стали сохранятся. получается, что с ретайнами работать можно только в Plc_prg. а как же тогда понимать HELP?
"если локальная переменная функционального блока объявлена Var Retain, то все его данные целиком помещаются в энергонезависимую область памяти, но обслуживаться как Var Retain будет только данная переменная." ???
Или всё зависит от целевой платформы?
И ещё. возникает следующий вопрос:
"Есть ли возможность сохранять, полученные в результате измерений во время процесса ,так сказать online, калибровочные коэффициенты (сохранённые В ПЛК как retain) ещё и в самой программе на ПК, чтобы была возможность загрузить на другой контроллер в любое время, хоть через год и не париться с калибровками"
Оборудование бывает неделями ремонтируется."
Cпасибо
Николаев Андрей
04.08.2010, 22:40
"если локальная переменная функционального блока объявлена Var Retain, то все его данные целиком помещаются в энергонезависимую область памяти, но обслуживаться как Var Retain будет только данная переменная." ???
Или всё зависит от целевой платформы?
Я знаю, что если переменную блока объявить как Retain, то весь блок попадает в Retain. Но как и где - не пробовал - не скажу...
И ещё. возникает следующий вопрос:
"Есть ли возможность сохранять, полученные в результате измерений во время процесса ,так сказать online, калибровочные коэффициенты (сохранённые В ПЛК как retain) ещё и в самой программе на ПК, чтобы была возможность загрузить на другой контроллер в любое время, хоть через год и не париться с калибровками"
Оборудование бывает неделями ремонтируется."
Cпасибо
Зависит от программы на ПК:cool:
Можно с помощью библиотеки SysLibFile создать в ПЛК свой файл и че угодно в него записывать самим.
спасибо. буду дальше пробовать. можете закрывать тему.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot