надо будет на железе проверить, а то может опять прелести эмулятора....
Вид для печати
надо будет на железе проверить, а то может опять прелести эмулятора....
Вот в эмуляторе с ретайном точно проблема.
А так: FB - структура. Объявили ее в ретайне. Вся структура там.
PS
Про SHL подтверждаю Егора - на железе как положено (110-60L)
В эмуляторе бывают и другие отличия. Опять же - к немцам.
Помогите кто нибудь с кодом. Хотя бы подскажите куда думать.
Мне надо чтобы таймер работал внутри цикла. Что-то типа такогоЯ знаю что этот код кривой, но ровный никак не могу придумать. Поставленную задачу сделал через инструкцию CASE, в общем-то всё работает. Но когда я на код смотрю плакать хочется, 12 раз повторяется одно и то-же. Вижу что напрашивается Цикл использовать но в цикле таймер и я никак не могу добиться чтобы таймер ждал итерацию. Может это и не возможно но тогда прошу это подтвердить. В таком случае придется смириться.Код:FOR i:=1 TO 12 DO
t:=T#7s;
TP1(IN:=TRUE,PT:=t,Q=>Prst1);
IF TP1.Q=0 THEN
TP1(IN:=FALSE,PT:=T#0s);
END_IF
END_IF
END_IF
END_FOR
Спасибо вам.
Мне надо чтобы прошла интерация цикла 1, потом отработал таймер, потом следующая интерация цикла 2, снова отработал таймер, потом 3 и так далее пока цикл не закончится.
А у меня таймер включился а цикл не обращая внимания но то что таймер еще не остановился побежал дальше. Я хочу понять как можно заставить цикл ожидать таймер который находится внутри цикла.
Тогда в течении 12*7=84с будет выполняться только этот код. Поэтому или все остальное подвиснет или отработает ограничение по времени программного цикла.
Поэтому в вашем случае цикл while. А правильно - полное переписывание программного кода.
Цикл FOR будет выполняться весь в текущем цикле программы и не подходит для данной задачи.
Решение очевидно. Нужно разложить FOR на составляющие
Есть некая переменная цикла i, которая в каждом цикле увеличивается на величину шага, и есть проверка условия достижения переменной i конечного значения.
Например так
Код:PROGRAM PLC_PRG
VAR
TP1: TP:=(PT:=T#7s);
i: INT;
Prst1: BOOL;
END_VAR
IF i<12 THEN
TP1(IN:=NOT TP1.Q, Q=>Prst1);
IF NOT TP1.Q THEN
i:=i+1;
END_IF
END_IF
Это понятно что 84 секунды должен выполняться код, но только именно это у меня и не получается написать таймер внутри цикла И код я уже полностью переписал но только он страшный, 12 раз инструкцией CASE выполняется одно и то-же. Хочется сделать его компактным. А почему цикл while надо использовать, ведь заранее известно что в цикле всегда 12 интераций?
+1. Зависать в любом месте программі нельзя.
Да, в принципе. уважаемый коллега petera дал вполне годный код. Автору вопроса нужно всего лишь ввести этот код в пустой проект, подключить Standard.lib и убедиться, как все красиво работает. То, что у него должно выполняться 1 раз в каждом шаге цикла при истечении таймера - записать над или под строкой
И фсьо...Код:i:=i+1;
Рассуждая дальше, не могу не отметить, что упомянутая "сложная и громоздкая" конструкция CASE на самом деле очень и очень часто используется как раз при разруливании задачи: выполнять несколько разных по смыслу действий с разносом в некоторые интервалы времени (даже не обязательно одинаковые, как в нашем примере) или по выплнению тех или иных условий во внешнем мире (то есть ожидать не внутренние таймеры, а внешние события). Для таких случаев заводится переменная ФАЗА, которая может принимать одно из ограниченного множества значений, а по ней прокручивается тот самый
Ну, и уж совсем красиво это решается в SFC. Там замени слово ФАЗА на понятие ШАГ - и получишь те же крашенки, только в профиль :)Код:CASE ФАЗА OF
ФАЗА1: (* Ждем Q первого таймера *)
...
ФАЗА2: (* Ждем Q второго таймера *)
...
ФАЗА3: (* Джем внешнего события *)
...
END_CASE
по поводу кода petera, не поверю что нужна такая простота, n-цать раз отсчитать время и пойти дальше, в каждой итерации наверное предполагаются и другие различные действия. Поэтому надо знать конкретную задачу от автора
Да ладно... Автор пока шашлык кушает - что ж, мешать ему???
На самом деле, после постинга от petera, мы здесь уже не консультируем ТС, а просто теоретизируем для саморазвития :)
Поэтому вполне можем нарисовать все возможные случаи и без автора. Я вижу всего 2 варианта:
1) В каждом шаге цикла нужно выполнять вполне себе одинаковое действие. Тогда над/под той строкой инкремента "i" достаточно прописать необходимые действия
2) действия зависят от номера цикла. Тогда над инкрементом поставить тот же CASE - и вытворять что угодно, в зависимости от "фазы", представленной той же переменной "i".
Повторюсь, что я рассматриваю цикл им. petera как частный случай общего подхода к управлению процессом в реальном времени с ненулевыми задержками на каждом шаге. Если число шагов известно (12) и переходы зависят только от внутреннего таймера - то на ST уже ничего больше и не надо придумывать.
Или ты можешь предложить такую задачу (от имени автора вопроса), которая не опишется циклом Петеры? :)
Здравствуйте. Изучаю Модбас через библиотеки. Мне нужно для связи ПЛК100, МВА8, МДВВ, ПР110 и панель ИП320. Возможно блоков ввода-вывода будет много. В форуме прочитал, что если больше 3-5 приборов, то лучше использовать библиотеки, а не конфигуратор.
Где-то попадалось сообщение, что уважаемый Валенок какую-то библиотеку подправлял. Есть ли ссылка на исправленный вариант?
Вопрос такой: какие библиотеки порекомендуете как более надежные?
С уважением, Михаил.
Упростим вопрос: какими библиотеками пользуетесь и какие есть нарекания?
Здравствуйте, amn.
Для опроса МВА8 могу порекомендовать протокол ОВЕН, с ModBus у меня были проблемы. Следовательно или протокол ОВЕН для всех, или разносить по разным интерфейсам протоколы ОВЕН и ModBus. + можно сэкономить время передовая в модули вывода только изменения :-)
Лучше расскажите сколько и чего будет стоять на объекте и каковы требования по времени опроса модулей.
P. S. У меня на объектах нормально работает на протоколе ОВЕН (без библиотек) около 20-30 модулей МВА8, МВУ8, МДВВ (давно делалось).
Так она работает нормально? Без ошибок?
Да кто ж кроме Валенка тебе ответит по сути допиловки? Кинь ему в личку вопрос, вернется с шашлыков и, поковыриваясь зубочисткой, расскажет, что там к чему.
Сама библиотека да, должна быть рабочая. Я ее не юзал. Мож тут и представители ОВЕНа могли бы зубочистку выплюнуть и поведать. Так что дождись рабочего времени, не горячись. На шашлычек выберись покамест :)
Ну, х.з., какие там в твоей системе будут процессы. На всякий случай поделюсь, сам недавно впервые запустил несколько слейвов на одной сопле: опрос-то происходит циклически по всему кругу. И на каждый запрос Мастер терпеливо ждет ответа от Слейва. А среди Слейвов разные бывают: МВ110, например, откликаются через 4-7 мс после окончания запроса от Мастера, а вот ИП320, при всем моем восхищении этим модулем, - аж через 50 и более. В результате ПЕРИОД опроса всех Слейвов получается уже сотни миллисекунд - вовсе не так быстро, как я думал. И это на скорости 38400, когда само время передачи сообщения уже не играет особой рояли...
Так что будь внимателен, можешь отдельно протестировать модули, которые собираешься ставить - и нарисовать себе картинку, как оно примерно будет. Чтобы не было "потом сюрприза" :)
Один мастер - 8 слейвов, и период опроса не критичен. Нафиг городить опрос через библиотеки?
Не мучайте себя, сделайте конфигуратором. Модулей мало, скорость пофиг, работать будет.
drvlas, спасибо, что уделили внимание. Ваши посты приятно читать. У Вас талант правильно формулировать вопросы, делать выводы и доходчиво объяснять. А уважаемого Валенка подождем, думаю он и сам сюда заглянет.:)
Amko, мне предстоит еще один проект, там уже скорость опроса имеет значение, поэтому на этом хотел потренироваться.:)
Capzap, хотел заглянуть вовнутрь Modbus.lib. Открываю ее в Кодесис как проект, пытаюсь открыть любой ФБ, пишет, что объект не может быть открыт, потому что вы не имеете какого-то доступа.
Вопрос: как посмотреть содержимое библиотеки?
С уважением, Михаил.
Молодец, Capzap! Вроде бы ответили, а вопрос остался.:D
Точно, а за 5тыщь -утраивается ,реально :D .
Всем доброго времени суток.
Подскажите пожалуйста, как данную конструкцию переложить на ST.
Спасибо.
ps А то у самого таймер.Q остается в TRUE.
Capzap, спасибо! Сам бы я к этому пришел бы как раз после 1000 сообщения на форуме.:)
Мне кажется у вас сама конструкция неправильная. На входе таймера и на выходе одна и та же переменная. Если она на входе TRUE, то и на выходе она также будет TRUE и таймер тут уже роли не играет.
Вы напишите своими словами что хотите получить, так легче будет вам помочь. А то как спросили, так вам и ответили. Я уверен, что удовлетворения от полученного ответа вы не получили.
С уважением, Михаил.
Не лады с RETAIN переменными.
написал библиотечку, если всю целиком ее определить как retain (поставил 6 штук) то КДС пишет, что съело 992 байта из 4 кб (ПЛК 100).
Переписал библиотечку так, что в ней всего 4 меременных retain, ставлю в проект, сами библиотеки уже не ввожу в retain переменные, по идее если FB использует в своем теле такие переменные, то и взять должна только их.
В библиотеке 4 переменных dword обозначены как retain, поставил 6 штук, должно бы скушаться 96 байт, а в итоге еще больше съело, уже 1 кб.
Как с этим бороться ?
С таймером TP разобрался. Отдаю долг форуму - новичкам пригодится.
OUT1-OUT5 => Ресурсы.Конфигурация ПЛК.Discrete Outputs [FIX]
Код:PROGRAM PLC_PRG
VAR
TP1:TP;
IN1: INT;
T: TIME := T#1s;
END_VAR
Скриншот https://downloader.disk.yandex.ru/pr...size=XL&crop=0Код:IF IN1=0 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT1);
IF NOT TP1.Q THEN
IN1:=2;
END_IF
ELSIF IN1=1 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT2);
IF NOT TP1.Q THEN
IN1:=3;
END_IF
ELSIF IN1=2 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT3);
IF NOT TP1.Q THEN
IN1:=4;
END_IF
ELSIF IN1=3 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT4);
IF NOT TP1.Q THEN
IN1:=0;
END_IF
ELSIF IN1=4 THEN
TP1(IN:=NOT TP1.Q,PT:=T,Q=>OUT5);
IF NOT TP1.Q THEN
IN1:=1;
END_IF
END_IF
Всем Спасибо за помощь.
melky, а сколько экземпляров этих ФБ используете? Мне кажется надо умножить количество retain переменных на количество экземпляров ФБ, где они используются.
amn, 6 экземпляров, в каждом по 4 dword переменных retain, в итоге 1006 байт вместо 96 байт.
Если же в библиотеке нет retain переменных а сами экземпляры кинуть в retain то съедалось 992 байта.
Вот такой вот парадокс странный.
Еще раз читаем внимательно.
"Замечания. Если хотя бы одна переменная функционального блока объявлена как RETAIN, то все данные экземпляров целиком помещаются в энергонезависимый сегмент."
Не может у ФБ быть части данных вне Retain области, если хотя бы одна переменная там находится.
"Или все сапоги на тумбочке, или все сапоги под тумбочкой".
Так что никаких чудес.
YuriBel вот блин, а что теперь делать то ? как заставить вещи считаться и сохраняться, вводить дополнительные входы для FB чтобы он с RETAIN переменных брал значения и продолжал считать дальше ?
Где-то попадались директивы, позволющие в ФБ исключить переменные из retain.
___
Ошибочка вышла, там речь шла о persistent.
{nonpersistent} исключение данных из persistent стр 150 из CoDeSys_V23_RU.pdf