plcforum.uz.ua

International PLC Forum
It is currently Tue Oct 23, 2018 4:16 am

All times are UTC + 3 hours


Forum rules


Please click here to view the forum rules



Post new topic Reply to topic  [ 20 posts ] 
Author Message
PostPosted: Fri Jul 27, 2018 11:23 am 

Joined: Wed Mar 19, 2008 4:12 pm
Posts: 181
Location: Ukraine
Здравствуйте, подскажите куда копать по следующему вопросу:

Есть CPU 314C-2 PN/DP, код к нему написан в Step7. Процентов 80 кода это STL - время цикла 12мс

Сделал новый проект(ПЛК тотже) практически с таким же функционалом в ТІАv14 (тут уже 80 процентов кода на SCL) - время цикла запредельные 60 мс, что в моей практике никогда не было

Даже если у меня и есть ошибки с оптимизацией то 50мс это уж сильно круто

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


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 11:43 am 
Site Admin

Joined: Thu Feb 16, 2006 6:25 pm
Posts: 3360
Location: Russia
Надо ставить эксперимент на одной конкретной задаче, написав идентичный функционал на разных языках.
Сравнить размер занимаемой программой памяти.
Можно сгенерировать "исходники" Source и сравнить самописный код STL и скомпилированный из SCL.
Учитывать обращение к внешней периферии и коммуникациям.


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 3:04 pm 

Joined: Wed Mar 19, 2008 4:12 pm
Posts: 181
Location: Ukraine
Запутался и по моему мое представление о правильной архитектуре программы неправильно...

Допустим из OB вызывается FB1/DB1
в FB1 вызывается 10 раз FB2(мотор) который использует память FB1/DB1:
Motor1(FB2)
Motor2(FB2)
Motor3(FB2)
Motor4(FB2)
Motor5(FB2)
Motor6(FB2)
Motor7(FB2)
Motor8(FB2)
Motor9(FB2)
Motor10(FB2)
В каждом FB2 вызывается FB3 и FC1:
Motor1(FB2)
------------>FB3
------------>FC1
Motor2(FB2)
------------>FB3
------------>FC1
Motor3(FB2)
------------>FB3
------------>FC1
и т.д......

Вопрос : если заметить вызовы FB3 и FC1 на обработку их задач внутри FB2 это даст экономию времени цикла????


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 4:32 pm 

Joined: Tue Dec 26, 2006 8:21 am
Posts: 561
Location: Russia
Даст.


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 6:11 pm 

Joined: Fri Feb 24, 2012 11:28 am
Posts: 116
SCL компилятор создает кучу всякого дополнительного, и иногда ненужного кода (особенно когда код с циклами), а это дополнительная нагрузка на ресурсы. Даже ЛАД или ФБД создает дополнительный код (но меньше). Может лучше на СТЛ сделать?


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 6:12 pm 

Joined: Wed Mar 19, 2008 4:12 pm
Posts: 181
Location: Ukraine
Спс всем за ответы,
да дало, уже выиграл 7 мс только на вызове одного "типа" оборудования - сделал вызов вложенных FC и FB по условию,
еще вопрос, есть инструкция Return часто ли ее используют при программировании, я как бы ее ни разу не использовал так как надобности не было????


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 6:14 pm 

Joined: Wed Mar 19, 2008 4:12 pm
Posts: 181
Location: Ukraine
Usver wrote:
SCL компилятор создает кучу всякого дополнительного, и иногда ненужного кода (особенно когда код с циклами), а это дополнительная нагрузка на ресурсы. Даже ЛАД или ФБД создает дополнительный код (но меньше). Может лучше на СТЛ сделать?

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


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 7:02 pm 

Joined: Fri Feb 24, 2012 11:28 am
Posts: 116
Quote:
есть инструкция Return часто ли ее используют при программировании

А как без нее? Если дальнейшие действия в функции не имеют значения, или имеют, но они не нужны, то как без нее обойтись? Даже на ЛАД есть инструкция RET (на ФБД не помню, но скорее она тоже есть). Используется конечно же часто, как и на С++ и т.д и т.п.


Top
 Profile  
 
PostPosted: Fri Jul 27, 2018 7:10 pm 

Joined: Wed Mar 19, 2008 4:12 pm
Posts: 181
Location: Ukraine
Спасибо, теперь все стало понятно почему такой большой разбег


Top
 Profile  
 
PostPosted: Sat Aug 18, 2018 9:25 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
a_gricaj wrote:
Спс всем за ответы,
сделал вызов вложенных FC и FB по условию,

скажите, как по условию вызывать?

if чегото=совпало then
FB(FC)_Name_DB();
end_if;

???


Top
 Profile  
 
PostPosted: Sun Aug 19, 2018 11:53 am 

Joined: Tue Dec 26, 2006 8:21 am
Posts: 561
Location: Russia
На каком языке?
На СТЛ:
если не совпало то прыгаем на первый, а если совпало, то продолжаем, в конце продолжения прыгаем дальше первого на второй (или вылетаем из блока :) (или из программы :) :)( или стоп процессора :) :) :) (или записываем неправильный формат в DB и процессор зависнет :) :) :) :) (или запусканем СТУХНЕТ :) :) :) :) :) :)).


Top
 Profile  
 
PostPosted: Sun Aug 19, 2018 1:00 pm 

Joined: Wed Mar 19, 2008 4:12 pm
Posts: 181
Location: Ukraine
Dfcz wrote:
На каком языке?
На СТЛ:
если не совпало то прыгаем на первый, а если совпало, то продолжаем, в конце продолжения прыгаем дальше первого на второй (или вылетаем из блока :) (или из программы :) :)( или стоп процессора :) :) :) (или записываем неправильный формат в DB и процессор зависнет :) :) :) :) (или запусканем СТУХНЕТ :) :) :) :) :) :)).

Да тут все стало ясно - решил переделать на свою голову свои типовые блоки, переделывал на 1500-том - цикл был норм))), а когда засунул их в большом количестве в 300-тый то увидел какой я "суперский" программер, и теперь опять переделывать


Top
 Profile  
 
PostPosted: Sun Aug 19, 2018 1:38 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
Dfcz wrote:
На каком языке?

SCL, отчего пример спросил, потому что в 1500 у меня в циклах и в IF блоках таймер не работает.
пик пок посмотрел, не получится с оптимированными блоками их применить.
меня слайс доступ в цикле интересует
viewtopic.php?f=9&t=26308&p=84596#p84596


Top
 Profile  
 
PostPosted: Sun Aug 19, 2018 3:06 pm 

Joined: Wed Mar 19, 2008 4:12 pm
Posts: 181
Location: Ukraine
а че в IF блоках не работают таймеры? если условие выполняется должны работать, штатные таймеры не юзаю, но свои в блоке IF работают, или может че неправильно понял...


Top
 Profile  
 
PostPosted: Sun Aug 19, 2018 4:28 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
да, IEC таймеры, как и S5 в TIA в SCL не работают.
в симуляторе короткое время можно наблюдать, что стартует таймер, но время не отрабатывает.
далее даже симулятор не отображает, что условие
Code:
IF  "Takten_DB".min_act <> "Takten_DB".min_old THEN


выполняется, хотя оно выполняется.
стоит вынести таймер за "скобки", пределы блока, все становится OK.
Вначале я таймер в FUB NW создал и оно заработало, затем в другом NW на SCL и тоже все ок.

Как бы в S7 классике я вставлял таймеры в IF блок.


вот так не работают.
Code:
#RetVal := RD_LOC_T("Takten_DB".sysTime);
// if RetVal si true then sommer time


"Takten_DB".min_act := "Takten_DB".sysTime.MINUTE;
IF  "Takten_DB".min_act <> "Takten_DB".min_old THEN

#Timer_Start_min := TRUE;

"IEC_Timer_for_min_Imp".TP(IN := #Timer_Start_min,
PT := t#5000ms,
Q => "Takten_DB".min_Imp);
END_IF;

"Takten_DB".min_old := "Takten_DB".min_act;


вот так работают
Code:
#RetVal := RD_LOC_T("Takten_DB".sysTime);
// if RetVal si true then sommer time


"Takten_DB".min_act := "Takten_DB".sysTime.MINUTE;
IF  "Takten_DB".min_act <> "Takten_DB".min_old THEN

#Timer_Start_min := TRUE;

END_IF;

"IEC_Timer_for_min_Imp".TP(IN := #Timer_Start_min,
PT := t#5000ms,
Q => "Takten_DB".min_Imp);

"Takten_DB".min_old := "Takten_DB".min_act;


а вообще я хотел так реализовать, без #Timer_Start_min

Code:
#RetVal := RD_LOC_T("Takten_DB".sysTime);
// if RetVal si true then sommer time


"Takten_DB".min_act := "Takten_DB".sysTime.MINUTE;
IF  "Takten_DB".min_act <> "Takten_DB".min_old THEN

"IEC_Timer_for_min_Imp".TP(IN := TRUE,
PT := t#5000ms,
Q => "Takten_DB".min_Imp);

END_IF;

"Takten_DB".min_old := "Takten_DB".min_act;


вызывается FC блок (пробовал и в FB и таймеры в интерфейсе блока размещал)10 раз в секунду.
генерирую минутные, часовые и переходные через 24 часа импульсы.


коллега говорит, что не работает так и не работало никогда.
как то стыдно стало, так как не знаю почему. на форуме сименся тему делал,
ответа нет.
Но я как бы делал когда-то и работало :D
может приснилось?
Quote:
но свои в блоке IF работают


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


Top
 Profile  
 
PostPosted: Mon Aug 20, 2018 6:08 pm 

Joined: Fri Feb 24, 2012 11:28 am
Posts: 116
Quote:
вот так не работают.

А по-вашему должны? Ну может быть, конечно. Ну а если отменяется вызов блока таймера(IF "Takten_DB".min_act <> "Takten_DB".min_old не будет ИСТИНОЙ), тогда как он должен работать? Попробуйте тоже самое написать в стл, пойдет?
Quote:
вот так работают

Таймер вызывается постоянно, потому и работает.
Quote:
как то стыдно стало, так как не знаю почему.

а чего тут такого?


Top
 Profile  
 
PostPosted: Mon Aug 20, 2018 9:01 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
Quote:
Ну а если отменяется вызов блока таймера(IF "Takten_DB".min_act <> "Takten_DB".min_old не будет ИСТИНОЙ)

один раз истина в в минуту. если секунды считывать то раз в секунду. условие выполняется верно, если таймер вынести за блок IF.
#Timer_Start_min Typ temp, живет один цикл. можно и так приписать после вызова таймера за блоком, все будет работать, так как условие выполняется. если таймер в блоке, то условие не выполняется#
Code:
#Timer_Start_min:=FALSE;



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

Quote:
Таймер вызывается постоянно, потому и работает.


да, но #Timer_Start_min=FALSE есть если условие не выполняется


Top
 Profile  
 
PostPosted: Mon Aug 20, 2018 10:11 pm 

Joined: Fri Feb 24, 2012 11:28 am
Posts: 116
Какие типы данных и логика работы Вашей программы мне не известны.
Quote:
просто, говорят, что таймер в блоке никогда не работал и работать не будет

Вроде бы я тоже самое и сказал, что таймер в блоке работать не должен. Таймер должен постоянно вызываться. Тут не важно на каком языке выполнено. Можно попробовать на ЛАДе, но только, чтобы с прыжками или возвратом. Если выполните так, как у Вас в СЦЛ, то результат измениться не должен.


Top
 Profile  
 
PostPosted: Mon Aug 20, 2018 10:56 pm 
Site Admin

Joined: Sat Aug 13, 2005 9:15 am
Posts: 1125
Oll Bell wrote:
а вообще я хотел так реализовать, без #Timer_Start_min
Code:
#RetVal := RD_LOC_T("Takten_DB".sysTime);
// if RetVal si true then sommer time


"Takten_DB".min_act := "Takten_DB".sysTime.MINUTE;
IF  "Takten_DB".min_act <> "Takten_DB".min_old THEN

"IEC_Timer_for_min_Imp".TP(IN := TRUE,
PT := t#5000ms,
Q => "Takten_DB".min_Imp);

END_IF;

"Takten_DB".min_old := "Takten_DB".min_act;

так точно работать не будет
IEC_Timer_for_min_Imp".TP(IN) всегда TRUE
scl использует set/reset
т.е. как минимум надо делать":
Code:
ELSE  "IEC_Timer_for_min_Imp".TP(IN := FALSE,
PT := t#5000ms,
Q => "Takten_DB".min_Imp);


Top
 Profile  
 
PostPosted: Sat Aug 25, 2018 1:29 pm 

Joined: Mon Apr 18, 2011 12:49 am
Posts: 115
Quote:
т.е. как минимум надо делать":

логично, наверное к этому бы пришел, если бы в блоке IF таймер работал.

Quote:
но свои в блоке IF работают


поделитесь примером своего таймера который в блоке IF работает


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 20 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 6 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  
Powered by International PLCforum® Forum Software © PLCforum
Mobile version