[?]: Время цикла программ на языках STL и SCL

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
Post Reply
a_gricaj
Posts: 202
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

[?]: Время цикла программ на языках STL и SCL

Post by a_gricaj » Fri Jul 27, 2018 8:23 am

Здравствуйте, подскажите куда копать по следующему вопросу:

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

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

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

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

CoMod
Site Admin
Posts: 3969
Joined: Thu Feb 16, 2006 3:25 pm
Location: Russia
Contact:

Re: [?]: Время цикла программ на языках STL и SCL

Post by CoMod » Fri Jul 27, 2018 8:43 am

Надо ставить эксперимент на одной конкретной задаче, написав идентичный функционал на разных языках.
Сравнить размер занимаемой программой памяти.
Можно сгенерировать "исходники" Source и сравнить самописный код STL и скомпилированный из SCL.
Учитывать обращение к внешней периферии и коммуникациям.

a_gricaj
Posts: 202
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

Re: [?]: Время цикла программ на языках STL и SCL

Post by a_gricaj » Fri Jul 27, 2018 12:04 pm

Запутался и по моему мое представление о правильной архитектуре программы неправильно...

Допустим из 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 это даст экономию времени цикла????

Dfcz
Posts: 875
Joined: Tue Dec 26, 2006 5:21 am
Location: Russia

Re: [?]: Время цикла программ на языках STL и SCL

Post by Dfcz » Fri Jul 27, 2018 1:32 pm

Даст.

Usver
Posts: 191
Joined: Fri Feb 24, 2012 8:28 am

Re: [?]: Время цикла программ на языках STL и SCL

Post by Usver » Fri Jul 27, 2018 3:11 pm

SCL компилятор создает кучу всякого дополнительного, и иногда ненужного кода (особенно когда код с циклами), а это дополнительная нагрузка на ресурсы. Даже ЛАД или ФБД создает дополнительный код (но меньше). Может лучше на СТЛ сделать?

a_gricaj
Posts: 202
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

Re: [?]: Время цикла программ на языках STL и SCL

Post by a_gricaj » Fri Jul 27, 2018 3:12 pm

Спс всем за ответы,
да дало, уже выиграл 7 мс только на вызове одного "типа" оборудования - сделал вызов вложенных FC и FB по условию,
еще вопрос, есть инструкция Return часто ли ее используют при программировании, я как бы ее ни разу не использовал так как надобности не было????

a_gricaj
Posts: 202
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

Re: [?]: Время цикла программ на языках STL и SCL

Post by a_gricaj » Fri Jul 27, 2018 3:14 pm

Usver wrote:SCL компилятор создает кучу всякого дополнительного, и иногда ненужного кода (особенно когда код с циклами), а это дополнительная нагрузка на ресурсы. Даже ЛАД или ФБД создает дополнительный код (но меньше). Может лучше на СТЛ сделать?
Судя по всему лучше, но его не знаю, проект большой переделать не успею....

Usver
Posts: 191
Joined: Fri Feb 24, 2012 8:28 am

Re: [?]: Время цикла программ на языках STL и SCL

Post by Usver » Fri Jul 27, 2018 4:02 pm

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

a_gricaj
Posts: 202
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

Re: [?]: Время цикла программ на языках STL и SCL

Post by a_gricaj » Fri Jul 27, 2018 4:10 pm

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

Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: [?]: Время цикла программ на языках STL и SCL

Post by Oll Bell » Sat Aug 18, 2018 6:25 pm

a_gricaj wrote:Спс всем за ответы,
сделал вызов вложенных FC и FB по условию,
скажите, как по условию вызывать?

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

???

Dfcz
Posts: 875
Joined: Tue Dec 26, 2006 5:21 am
Location: Russia

Re: [?]: Время цикла программ на языках STL и SCL

Post by Dfcz » Sun Aug 19, 2018 8:53 am

На каком языке?
На СТЛ:
если не совпало то прыгаем на первый, а если совпало, то продолжаем, в конце продолжения прыгаем дальше первого на второй (или вылетаем из блока :) (или из программы :) :)( или стоп процессора :) :) :) (или записываем неправильный формат в DB и процессор зависнет :) :) :) :) (или запусканем СТУХНЕТ :) :) :) :) :) :)).

a_gricaj
Posts: 202
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

Re: [?]: Время цикла программ на языках STL и SCL

Post by a_gricaj » Sun Aug 19, 2018 10:00 am

Dfcz wrote:На каком языке?
На СТЛ:
если не совпало то прыгаем на первый, а если совпало, то продолжаем, в конце продолжения прыгаем дальше первого на второй (или вылетаем из блока :) (или из программы :) :)( или стоп процессора :) :) :) (или записываем неправильный формат в DB и процессор зависнет :) :) :) :) (или запусканем СТУХНЕТ :) :) :) :) :) :)).
Да тут все стало ясно - решил переделать на свою голову свои типовые блоки, переделывал на 1500-том - цикл был норм))), а когда засунул их в большом количестве в 300-тый то увидел какой я "суперский" программер, и теперь опять переделывать

Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: [?]: Время цикла программ на языках STL и SCL

Post by Oll Bell » Sun Aug 19, 2018 10:38 am

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

a_gricaj
Posts: 202
Joined: Wed Mar 19, 2008 1:12 pm
Location: Ukraine

Re: [?]: Время цикла программ на языках STL и SCL

Post by a_gricaj » Sun Aug 19, 2018 12:06 pm

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

Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: [?]: Время цикла программ на языках STL и SCL

Post by Oll Bell » Sun Aug 19, 2018 1:28 pm

да, IEC таймеры, как и S5 в TIA в SCL не работают.
в симуляторе короткое время можно наблюдать, что стартует таймер, но время не отрабатывает.
далее даже симулятор не отображает, что условие

Code: Select all

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

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


вот так не работают.

Code: Select all

#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: Select all

#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: Select all

#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
может приснилось?
но свои в блоке IF работают
своих нет, если делать то нужно привязывать к циклическим OB?

Usver
Posts: 191
Joined: Fri Feb 24, 2012 8:28 am

Re: [?]: Время цикла программ на языках STL и SCL

Post by Usver » Mon Aug 20, 2018 3:08 pm

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

Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: [?]: Время цикла программ на языках STL и SCL

Post by Oll Bell » Mon Aug 20, 2018 6:01 pm

Ну а если отменяется вызов блока таймера(IF "Takten_DB".min_act <> "Takten_DB".min_old не будет ИСТИНОЙ)
один раз истина в в минуту. если секунды считывать то раз в секунду. условие выполняется верно, если таймер вынести за блок IF.
#Timer_Start_min Typ temp, живет один цикл. можно и так приписать после вызова таймера за блоком, все будет работать, так как условие выполняется. если таймер в блоке, то условие не выполняется#

Code: Select all

#Timer_Start_min:=FALSE;

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

Usver
Posts: 191
Joined: Fri Feb 24, 2012 8:28 am

Re: [?]: Время цикла программ на языках STL и SCL

Post by Usver » Mon Aug 20, 2018 7:11 pm

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

sania
Site Admin
Posts: 1372
Joined: Sat Aug 13, 2005 6:15 am
Contact:

Re: [?]: Время цикла программ на языках STL и SCL

Post by sania » Mon Aug 20, 2018 7:56 pm

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

Code: Select all

#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: Select all

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

Oll Bell
Posts: 118
Joined: Sun Apr 17, 2011 9:49 pm

Re: [?]: Время цикла программ на языках STL и SCL

Post by Oll Bell » Sat Aug 25, 2018 10:29 am

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

Post Reply