Page 1 of 1

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

Posted: Fri Jul 27, 2018 8:23 am
by a_gricaj
Здравствуйте, подскажите куда копать по следующему вопросу:

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

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

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

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

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

Posted: Fri Jul 27, 2018 8:43 am
by CoMod
Надо ставить эксперимент на одной конкретной задаче, написав идентичный функционал на разных языках.
Сравнить размер занимаемой программой памяти.
Можно сгенерировать "исходники" Source и сравнить самописный код STL и скомпилированный из SCL.
Учитывать обращение к внешней периферии и коммуникациям.

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

Posted: Fri Jul 27, 2018 12:04 pm
by a_gricaj
Запутался и по моему мое представление о правильной архитектуре программы неправильно...

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

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

Posted: Fri Jul 27, 2018 1:32 pm
by Dfcz
Даст.

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

Posted: Fri Jul 27, 2018 3:11 pm
by Usver
SCL компилятор создает кучу всякого дополнительного, и иногда ненужного кода (особенно когда код с циклами), а это дополнительная нагрузка на ресурсы. Даже ЛАД или ФБД создает дополнительный код (но меньше). Может лучше на СТЛ сделать?

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

Posted: Fri Jul 27, 2018 3:12 pm
by a_gricaj
Спс всем за ответы,
да дало, уже выиграл 7 мс только на вызове одного "типа" оборудования - сделал вызов вложенных FC и FB по условию,
еще вопрос, есть инструкция Return часто ли ее используют при программировании, я как бы ее ни разу не использовал так как надобности не было????

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

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

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

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

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

Posted: Fri Jul 27, 2018 4:10 pm
by a_gricaj
Спасибо, теперь все стало понятно почему такой большой разбег

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

Posted: Sat Aug 18, 2018 6:25 pm
by Oll Bell
a_gricaj wrote:Спс всем за ответы,
сделал вызов вложенных FC и FB по условию,
скажите, как по условию вызывать?

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

???

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

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

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

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

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

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

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

Posted: Sun Aug 19, 2018 12:06 pm
by a_gricaj
а че в IF блоках не работают таймеры? если условие выполняется должны работать, штатные таймеры не юзаю, но свои в блоке IF работают, или может че неправильно понял...

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

Posted: Sun Aug 19, 2018 1:28 pm
by Oll Bell
да, 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?

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

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

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

Posted: Mon Aug 20, 2018 6:01 pm
by Oll Bell
Ну а если отменяется вызов блока таймера(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 есть если условие не выполняется

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

Posted: Mon Aug 20, 2018 7:11 pm
by Usver
Какие типы данных и логика работы Вашей программы мне не известны.
просто, говорят, что таймер в блоке никогда не работал и работать не будет
Вроде бы я тоже самое и сказал, что таймер в блоке работать не должен. Таймер должен постоянно вызываться. Тут не важно на каком языке выполнено. Можно попробовать на ЛАДе, но только, чтобы с прыжками или возвратом. Если выполните так, как у Вас в СЦЛ, то результат измениться не должен.

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

Posted: Mon Aug 20, 2018 7:56 pm
by sania
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);

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

Posted: Sat Aug 25, 2018 10:29 am
by Oll Bell
т.е. как минимум надо делать":
логично, наверное к этому бы пришел, если бы в блоке IF таймер работал.
но свои в блоке IF работают
поделитесь примером своего таймера который в блоке IF работает