FUNCTION_BLOCK FB_TempControl
VAR_INPUT
Исходное значение: REAL;
ProcessValue: REAL;
END_VAR
VAR_OUTPUT
КонтрольВыход: REAL;
END_VAR
VAR
Kp: REAL:= 2.0;
Ки: REAL:= 0.05;
Kd: REAL:= 0.5;
IntegralTerm: REAL:= 0;
Последнее ошибку: REAL:= 0;
Таймер: ТОН;
END_VAR
Начинать.
// Периодически (100 мс)
Таймер ((IN:= НЕ Таймер.Q, PT:= T#100ms);
Если Таймер.Q Тогда
Ошибка VAR:= Установка точки - значение процесса;
IntegralTerm:= IntegralTerm + ошибка;
VAR DerivativeTerm := Ошибка - Последняя ошибка;
LastError:= Ошибка;
ControlOutput := Kp * Error + Ki * IntegralTerm + Kd * DerivativeTerm;
ControlOutput:= LIMIT(0.0, ControlOutput, 100.0);
Таймер ((IN):= FALSE);
END_IF;
END_FUNCTION_BLOCK
Случай 4: Управление очередями на производственной линии
Скл
FUNCTION_BLOCK FB_ProductionQueue
VAR_INPUT
NewOrder: BOOL;
OrderID: INT;
Полный сигнал: BOOL;
END_VAR
VAR_OUTPUT
Текущий порядок: INT;
длина очереди: INT;
END_VAR
VAR
OrderQuee: ARRAY[1..50] OF INT;
Заголовок очереди: INT:= 1;
Следующая очередь: INT:= 1;
END_VAR
Начинать.
// Новый порядок очереди
Если NewOrder и QueueLength < 50
OrderQueue[QueueTail] := OrderID;
Чередовый хвост:= Чередовый хвост MOD 50 + 1;
Длина очереди:= Длина очереди + 1;
END_IF;
// Завершен порядок очереди
Если полный сигнал и длина очереди > 0
QueueHead:= QueueHead MOD 50 + 1;
Длина очереди:= Длина очереди - 1;
END_IF;
// Текущий порядок
Если длина очереди > 0
CurrentOrder := OrderQueue[QueueHead];
Еще
Текущий порядок: = 0;
END_IF;
END_FUNCTION_BLOCK
Случай 5: Контроль блокировки предохранительных ворот
Скл
FUNCTION_BLOCK FB_SafetyGate
VAR_INPUT
Вход 1 закрыт, вход 2 закрыт: BOOL;
EStopButton: BOOL;
Кнопка перезагрузки:
END_VAR
VAR_OUTPUT
Статус безопасности: BOOL;
END_VAR
VAR
LockoutStatus: BOOL:= FALSE;
Время блокировки: TON;
END_VAR
Начинать.
// Безопасность
VAR AllGatesClosed:= Gate1Closed И Gate2Closed;
// Аварийная остановка высшего приоритета
Если EStopButton тогда
Статус безопасности:= FALSE;
LockoutStatus:= TRUE;
LockoutTimer ((IN):= TRUE, PT:= T#10S);
ВРЕТА;
END_IF;
Отключи логику.
Если ResetButton и LockoutStatus и LockoutTimer.Q тогда
LockoutStatus:= FALSE;
END_IF;
// Нормальная работа
Если нет, то отключитесь.
Статус безопасности: = все ворота закрыты;
END_IF;