Цитата:
Сообщение от Arsie
1) Посмотрите название темы. Поднятую вами тему возможно обозначить словом "небольшая"?
|
Да, я понимаю. В первом сообщении я ведь так и написал: "Понимаю, что это "большая" хотелка...". Но подходящей темы не нашёл, а создавать новую тему - это показалось как-то нескромным
Цитата:
Сообщение от Arsie
2) Вы уверены, что вы вообще обратились по адресу?) Здесь техническая поддержка Вам наверное с менеджерами нужно общаться, с руководством. Уж точно и 100% не со мной и 146% не на форуме.
|
Ну, я как-то наивно полагал, что у Вас
команда. Т.е. общение есть и общие предложения/идеи как-то циркулируют. Простите, забылся что обычно в наших фирмах постсоветского пространства такое не в чести.
Цитата:
Сообщение от Arsie
Можете мне рассказать о вашей задаче? Вот чтобы стало объективно видно, что FBD там ни к чёрту, а ST прямо вот самое оно? Я надеюсь, что я смогу более-менее непредвзято оценить ваши утверждения.
|
Давайте попробуем. Вы определенно намного лучше меня специалист в FBD, а судя по представлению и в "классическом" программирование тем более.
В одной из задач надо было реализовать следующее:
Нужно изменять мощность нагрева по заданному графику. Графиков много, и под конкретные задачи выбирается свой график. Графики делаются технологами. В контроллер график поступает в виде набора точек: точка №1 («прибавка мощности от старта №1» , «время №1»), точка №2 («прибавка мощности от старта №2» , «время №2»), точка №3 … точка №40.
Вот это надо реализовать.
Алгоритм:
1) Определить на каком отрезке графика мы находимся по времени
2) Рассчитать требуемую прибавку мощности на этом интервале
3) Периодически на этом интервале производить корректировку
4) "Сигнализировать" дальше если дошли до последней точки, что бы отключить процесс
Структурированным текстом это делается достаточно просто и наглядно (для меня по крайней мере это и выглядит наглядно и достаточно просто):
Описание переменных:
Код:
TIMEPROC - общий таймер контроллера в секундах
Process_Timer - таймер процесса в секундах. При запуске режима Process_Timer = TIMEPROC.
already_corrected - для того что бы не обновлять много раз в нулевую секунду данной минуты
process_power_minute - время в минутах от запуска процесса
GR_POW.POW / GR_POW.MTIME - массив значений мощность / время для точек графика
DELTA_POW_MINUTE - расчётная прибавка мощности в минуту на данном интервале графика
RAS_POW - текущая расчётная мощность нагрева
Код функции:
Код:
IF (TRUNC((TIMEPROC - Process_Timer) / 60.0 ) - (TIMEPROC - Process_Timer) / 60.0) = 0 THEN ; новая минута (таймер процесса в секундах делится на 60 без остатка)
IF already_corrected = NO THEN ; в данную минуту уже производился пересчёт мощности?
process_power_minute = UINT((TIMEPROC - Process_Timer) / 60) ; время от старта процесса в минутах
IF process_power_minute = GR_POW.MTIME[POINT_GR_POW+1] THEN ; текущее время процесса в минутах равно времени следующей точки
INC(POINT_GR_POW) ; перейти к следующему номеру точки графика
IF POINT_GR_POW <> POINT_POW THEN ; если мы дошли до последней точки, то не рассчитывать дельту
DELTA_POW_MINUTE = (REAL(GR_POW.POW[POINT_GR_POW+1]) - REAL(GR_POW.POW[POINT_GR_POW]))/(REAL(GR_POW.MTIME[POINT_GR_POW+1]) - REAL(GR_POW.MTIME[POINT_GR_POW])) ; рассчёт дельты, которая на этом отрезке графика будет прибавляться (отниматься) к текущей мощности каждую минуту
ENDIF
ENDIF
IF ((RAS_POW + DELTA_POW_MINUTE) > 0) THEN ; если с учётом корректировки мощность больше нуля, произвести корректировку (график может и уменьшать мощность)
RAS_POW = RAS_POW + DELTA_POW_MINUTE
ENDIF
already_corrected = YES
IF POINT_GR_POW >= POINT_POW - 1 THEN ; если мы дошли до последней точки, то отключить процесс
end_of_process = YES
ENDIF
ENDIF
ELSE
already_corrected = NO
ENDIF
Можно ли реализовать это на FBD как-то просто? Потому что то, как у меня получилось сделать это на FBD, ну никак нельзя назвать ни простым, ни наглядным (для меня по крайней мере). И заработала конструкция из FBD-блоков далеко не с первого раза.
Если знаете, как реализовывать подобное на FBD просто, было бы очень полезно увидеть.