Показать сообщение отдельно
Старый 05.02.2021, 16:11   #621
Makrel
Новичок
 
Регистрация: Apr 2020
Сообщения: 12
Благодарил(а): 1 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: Небольшие хотелки в SMLogix

Цитата:
Сообщение от 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 просто, было бы очень полезно увидеть.

Последний раз редактировалось Makrel, 05.02.2021 в 16:27
Makrel вне форума   Ответить с цитированием