Ну вот и хотелось бы написать вариант без патентных прав.
Не вдаваясь в нюансы и в подробности, код Гистерезиса для примера

Код:
    public class Hysteresis()
    {
        public bool EN; // входная переменная разрешающая работу программы
        public double inCnl;
        public double low;
        public double high;

        public bool mode = true; // По умолчанию нагрев = true, охлаждение = false

        public bool Q; // Выход гистерезиса

        public ushort cycle; // Задание цикла выполнения программы в мс
        public bool terminated = false; // Переменная остановки цикла для остановки программы и(или) для закрытия потока

        bool _mode;

        public void Run()
        {
            // Копирование входных переменных во внутренние программы
            bool res = false;

            do
            {
                if (EN)
                {
                    // Копирование входных переменных во внутренние в начале цикла программы
                    _mode = mode;
                    // Инициализация выходных переменных если требуется.
                    res = Q; // для возможности задания retain при перезапусках
                    // тело программы
                    if (_mode)
                    {
                        if (inCnl < low) res = true;
                        if (inCnl > high) res = false;
                    }
                    else
                    {
                        if (inCnl < low) res = false;
                        if (inCnl > high) res = true;
                    }
                    // тело программы
                    // Копирование выходных переменных из внутренних в конце цикла программы, для некоторых необязательно, будут обработаны программой
                    Q = res;
                    // Задание времени цикла
                    Thread.Sleep(cycle);
                }
            }
            while (!terminated);
        }
    }
Суть, выполнять несколько экземпляров программ из Scada системы с возможностью управления модулями В/В без контроллеров.
Вот PID бы аналогично сделать, но доступный и каким-то образом прикрутить еще автонастройку. Типа запустил на Н-ное время, потом получил в каналах Scada соответствующие коэффициенты. Вбил их в основную программу и запустил на постоянку.