Переключатель тепло-холод

Обсуждение примера на официальном Форуме

Переключатель тепло-холод Компания должна использовать собственные наработанные типовые модели (шаблоны) для похожих проектов или фрагментов новых проектов. Но при однотипных задачах их технологическая реализация может радикально отличаться в зависимости от региона, времени года, проходимости трасс, доступности ресурсов, наличия средств для реинвестирования и многих других параметров. Создавать множество похожих моделей, ориентированных на определенные условия, непродуктивно. Задача тем более усложняется, если в рамках одного длительного проекта технология однотипных задач в разных его фрагментах зависит от внешних условий и может меняться. Сложность еще возрастает с увеличением числа комбинаций влияющих условий, а также когда влияющие условия динамически изменяются в зависимости от исполнения проекта. Используя возможности программы необходимо на этапе создания модели заложить в нее разные варианты реализации работ с автоматическим выбором необходимого варианта в зависимости от исходных или меняющихся текущих условий.

 Задача

Компания занимается устройством монолитных конструкций нулевого цикла для промышленных строений различного назначения. Типовые проекты повторяются достаточно часто (серии опор, серии хранилищ и пр.) Необходимо создать универсальную шаблонную модель проекта, автоматически учитывающую сезонность производства определенных работ по проекту для зон умеренного климата. По требованию технолога компании бетонирование начиная с 1 октября и до 1 апреля необходимо обеспечивать устройством тепляка. В период с 1 апреля по 1 октября дополнительных работ производить не нужно.

 Реализация
Для начала создадим в модели упрощенное описание бетонирования. Когда модель будет готова, проверим, как работает наш алгоритм, если работы по бетонированию попадают на теплое или на холодное время года. Работы будем описывать укрупнено, без детализации. Все Операции будут Типа ДПГ Длительность. Ресурсы в данном упрощенном примере не используются. Для наглядности добавим Операции Подготовка и Сдача длительностью по 5 рабочих дней в начале и в конце всего проекта. Эти две Операции производятся в любое время года и их свойства от времени года не зависят.
Для начала опишем рабочее время для наших Операций. Операции Подготовка и Сдача могут производиться в дневное время, с перерывами на обед и выходными днями. Для них создадим Неделю 5д8ч в таблице Недели. Обеденные перерывы можете добавить самостоятельно.

Неделя 5д8ч

На основе этой Недели создадим в таблице Календарей Календарь 5д8ч. Это Календарь для обычных дневных Операций по обычной пятидневной неделе.

Календарь 5д8ч

Операции типа Бетонирование и Набор прочности относятся к непрерываемым Операциям. В подавляющем большинстве случаев процесс бетонирования на одном фрагменте монолита не прерывается (выходные, праздники, ночь) после начала, а процесс набора прочности нельзя прервать на ночь или выходные, поскольку это определенное время, а не деятельность, которую можно остановить, а потом снова продолжить. Для корректного моделирования подобных задач необходимо, во-первых, сделать Календарь в котором всё время рабочее и не существует никаких перерывов, и во-вторых, установить в свойствах Непрерывность выполнения.

Включение непрерывности выполнения

Создадим непрерывный Календарь 7д24ч. Для начала в таблице Недели создадим для этого Неделю 7д24ч.

Неделя 7д24ч

Теперь на основе этой Недели создадим в таблице Календари Календарь 7д24ч.

Календарь 7д24ч

Будьте внимательны — в подобный Календарь не должны попасть Календарные исключения праздников, каникул и т.д. (это может произойти, если вы не создали новый календарь, а скопировали уже имеющийся). Проверьте вкладку Исключения.

Вкладка исключения

Календари готовы. Теперь опишем бетонирование в режиме <тепло>. Поскольку никаких дополнительных работ кроме самого бетонирования не предусматривается, опишем его Операцией Бетонирование (тепло) и Операцией Набор прочности. Первая будет для наглядности длительностью 2 дня, вторая по требованиям технолога 9 дней. Соединим эти операции Связью Финиш-Старт.

Гантт с колонками календаря и непрерывности

Но мы заранее не можем сказать, на какое время года придётся наше Бетонирование. Все зависит от многих параметров: когда начнется проект, через какой интервал времени внутри проекта начнется конкретно это Бетонирование, как идет исполнение проекта до него (отставания, опережения) и так далее. Таким образом, может сложиться такая ситуация, что Бетонирование попадет на холодное время года, а там требования другие.
Опишем технологию для холодного времени. К двум Операциям Бетонирование и Набор прочности добавится Операция Устройство тепляка. Устройство тепляка идет до начала работ по Бетонированию. Добавим эту Операцию в модель, укажем ей Длительность 5 дней. Соединим Операции Связями.

Гантт с операциями холодного варианта

Описание двух вариантов работ по Бетонированию готово. Теперь необходимо сделать так, чтобы в зависимости от текущей даты в момент старта работ по Бетонированию выбирался или тот или другой вариант. Подобные <развилки> реализуются при помощи Операций с Типом ДПГ Переключатель. Добавим эту Операцию Переключатель Тепло-Холод перед двумя цепочками операций.

Гантт Переключатель

Проведем одну Связь от этой Операции к началу <теплой> цепи работ, вторую — к <холодной>. В настройках этих Связей необходимо указать — какая из них происходит по какому состоянию Переключателя. Поставим <теплой> цепи Условие переключателя Да, <холодной> Условие переключателя Нет.

Свойство связи Cостояние переключателя

Выбор варианта работ мы сделали. Теперь замкнем окончание обеих цепей работ по Бетонированию на финальную Операцию Сдача. Она завершает любой вариант производства работ.

Гантт работ

Проверим действие созданного Переключателя. В поле Состояние переключателя включим Да и произведем Расчет расписания без ограничений на ресурсы. В проекте осталась только <теплая> цепь работ.

Гантт с операциями теплого варианта

Переключим состояние в Нет и снова произведем Расчет расписания без ограничений на ресурсы. В проекте осталась только <холодная> цепь работ.

Гантт с операциями холодного варианта

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

Выбор варианта производства работ по Бетонированию мы реализовали. Но в условиях задачи указано требование проводить работы по определенному варианту в зависимости от даты.
Логика проверки следующая. Мы должны определить, какая дата является текущей в момент принятия решения по производству работ по Бетонированию. Сразу начинать Бетонирование или сначала строить тепляк. Поэтому проверка даты будет производиться для нашей операции Переключатель. Переключатель имеет нулевую длительность, поэтому для проверки можно воспользоваться как его свойством Начало, так и свойством Окончание. Возьмем Начало. Условие будет выглядеть следующим образом:

Если Начало позднее 1 октября или ранее 1 апреля, то это <холодное время> и нужно строить тепляк.

В самом простом случае (если проект разовый) можно написать Формулу явной проверки условия с точными датами периода, в котором идет проект — например 01.10.2014 и 01.04.2015. Но тогда мы потеряем универсальность нашей модели. В следующем году запуская в работу подобный проект нам нужно будет не забыть, что расчеты состояний работ по Бетонированию производятся по данной формуле и произвести в ней коррекцию лет. Подобный путь может привести к ошибкам. Поэтому сделаем Формулу универсальной, на любые года. Нам необходимо уйти от связи с номером года и оставить в работе только номер месяца, поскольку месяцы в любом году повторяются. Для этого необходимо получить номер месяца из Поля Начало.
Создадим для этих целей вспомогательное Поле Начало (текст). В его свойствах установим Тип Текст. Это необходимо для того, чтобы преобразовать данные из системного Поля Начало, имеющего формат Дата-время, в формат с возможностью выбора нужных символов.

Свойства поля Начало (текст)

Далее в Таблице Формулы напишем Формулу его заполнения:

Формула заполнения поля Начало (текст)

Не забываем включить у Формулы свойство Автоматически выполнять в Гантте работ после расчета расписания. В противном случае нам придется не забывать вручную запускать исполнение Формулы.

Настройка автоматического выполнения

Мы приравняли значения Поля Начало нашему новому Полю Начало (текст). После этого произведем Расчет расписания без ограничений на ресурсы, чтобы сработала Формула. Данные перенеслись.

Даты в поле Начало (текст)

Нужные нам символы, указывающие на номер месяца — 4 и 5 слева. Создаем еще одно вспомогательное Поле Номер месяца. В свойствах указываем, что Поле числовое.

Свойства поля Номер месяца

В Таблице Формулы пишем для него Формулу определения значений. Для выбора нужных символов из текста существует Функция SubString. Данная Функция берет из указанного Поля нужное количество символов с указанной позиции. В нашем случае она будет выглядеть так:

    monum = SubString ( StartText ; 4 ; 2 ) — взять из Поля Номер месяца начиная с 4 символа 2 символа.

Не забываем поставить этой Формуле свойство Автоматически выполнять в Гантте работ после расчета расписания.

Формула расчета номера месяца

Произведем Расчет расписания без ограничений на ресурсы. Мы получили цифру соответствующую месяцу начала каждой Операции.

Цифры месяцев в поле Номер месяца

Осталось написать Формулу для реакции на данное число нашего Переключателя. В Таблице Формулы опишем логику работы Переключателя:

    f_SwitchCondition = If ( monum >3 ; If ( monum<10 ; ‘Да’ ; ‘Нет’ ) ; ‘Нет’ )

Формула расчета состояния переключателя

Не забываем поставить этой формуле свойство Автоматически выполнять в Гантте работ после расчета расписания. Формула проверяет значение в Поле Номер месяца. Если оно больше трех, то производится вторая проверка на то, что оно меньше десяти. Если оба условия выполнены, то в Поле Состояние переключателя пишется Да, в противном случае Нет.
Проверим полученный результат. В Свойствах проекта поставим Текущее время проекта 1 июля 2014 года. ДВАЖДЫ произведем Расчет расписания без ограничений на ресурсы.

 Для чего Расчет расписания необходимо производить дважды.
При первом расчете определяются все основные показатели Операций и состояние Переключателя. При втором расчете на основании состояния Переключателя включается соответствующая цепь работ.

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

Гантт с колонкой переключателя проект тепло

Поменяем Текущее время проекта на 1 ноября 2014 года. ДВАЖДЫ произведем Расчет расписания без ограничений на ресурсы. Переключатель принял значение Нет, в проекте осталась цепочка работ относящаяся к холодному времени года.

Гантт с колонкой переключателя проект холодно

Теперь проверим универсальность алгоритма по годам. Поменяем Текущее время проекта на 1 июля 2016 года. ДВАЖДЫ произведем Расчет расписания без ограничений на ресурсы. Расписание соответствует теплому времени года независимо от номера года. Задача решена.

Для контроля скрытых Переключателем цепочек Операций можете включить в настройках Гантта работ пункт Отображать операции отмененные переключателем.

Гантт с колонкой переключателя проект тепло 2016 год

Примеры
Пример модели в Spider Project