ЖУРНАЛ СТА №3/2023
У горелки будет производиться изме- рение массового расхода газа (атрибут gasFlow типа Double только для чтения). Для определения тепловой мощности горения будет вызываться метод get- BurningPower() без параметров, возвра- щающий значение типа Double . При вызове метода происходит вычисление мощности горения на основании изме- ренного расхода газа. Далее определим классы конкретных горелок. BurnerModelM2 – класс наддув- ных одноступенчатых горелок модели М2, BurnerModelM3 – класс наддувных модулируемых горелок модели М3. Продолжим прорабатывать ветку га- зовых котлов (см. рис. 1). Газовые котлы (класс GasBoiler ) могут быть с естествен- ной тягой (дочерний класс NaturalPull- GasBoiler ) и принудительной (дочерний класс ForcedPullGasBoiler ). Газовые кот- лы с принудительной тягой (класс ForcedPullGasBoiler ) имеют вытяжной вентилятор (атрибут exhaustFan типа Boolean ). Определим класс газовых котлов с ес- тественной тягой конкретной модели – BoilerModelM1 . Пусть эти котлы имеют в своём составе атмосферную горелку модели М1 (атрибут burner абстрактно- го типа GasBurner уточнили его кон- кретным подтипом BurnerModelM1 ). Определим класс газовых котлов с принудительной тягой модели М2 (класс BoilerModelM2 ), которые имеют в своём составе наддувную одноступен- чатую горелку модели М2 (класс BurnerModelM2 ). Определим ещё один класс газовых котлов с принудитель- ной тягой модели М3 (класс Boiler- ModelM3 ), которые имеют в своём со- ставе наддувную модулируемую горел- ку модели М3 (класс BurnerModelM3 ). В итоге, все неабстрактные классы кот- лов имеют неабстрактные типы горе- лок. Это отражает тот факт, что реаль- ный котёл конкретной модели всегда имеет реальную горелку, модель кото- рой также известна. Предложенные иерархии классов и объектов упорядочивают по уровням абстракции котельного оборудования, что позволяет их эффективно хранить, проектировать, дорабатывать и ис- пользовать. Инкапсуляция Инкапсуляция – скрытие внутренне- го устройства (реализации) объекта [2]. Цель инкапсуляции – обеспечить изо- ляцию между интерфейсом и реализа- цией объекта, что позволяет менять реализацию, не затрагивая интерфейс. В скрытую реализацию невозможно вмешательство снаружи, что позволяет реализации сохранять заданные инва- рианты состояния и поведения объекта. В нашем примере OPC-клиент может управлять горелкой любой модели на- прямую, изменяя доступные для записи атрибуты объекта. Например, у экзем- пляра класса BurnerModelM1 можно изменять значения атрибутов spark и gasValve , управляя тем самым пода- чей искры и газовым клапаном. Но ког- да разрозненное оборудование (горелка и вытяжной вентилятор) используются в составе котла, их работа должна быть согласована (например, нельзя зажи- гать горелку без команды запуска кот- ла, нельзя выключать вентилятор во время горения и т.д.). Выполниминкапсуляцию – скроем де- тали реализации управления оборудо- ванием котла. Для этого разрешим толь- ко чтение атрибутов вложенного объ- екта burner (см. классы BoilerModelM1… Boiler-ModelM3 на рис. 1). Также сделаем доступным только для чтения атрибут exhaustFan класса ForcedPullGasBoiler . Те- перь OPC-клиент не сможет управлять оборудованием напрямую. Управление горелкой ( burner ) и вытяжным вентиля- тором ( exhaustFan ) будет доступно толь- ко из методов, относящихся к котлу ( GasBoiler ). При управлении этим оборудованием потребуется работа с таймером и гене- ратором импульсов. Таймер может ис- пользоваться для реализации выдерж- ки времени, необходимой, например, для зажигания пламени горелки или продувки топки газового котла. Генера- тор импульсов может использоваться для активации периодической провер- ки определённых условий, например, возникновения аварийной ситуации. Необходимость в таймере и генераторе возникает на уровне абстракции газо- вого котла, поэтому определим атрибу- ты timer типа Timer и generator типа PulseGenerator в классе GasBoiler . Таким образом, объекты timer и generator будут вложены в любой объект типа GasBoiler . Например, объект типа BoilerModelM1 также является и объектом типа GasBoiler , поэтому он унаследует таймер и генератор. Объект timer по истечении заданно- го времени после запуска будет вызы- вать метод timeout() , а объект generator будет вызывать метод tick() с заданной периодичностью. Данные объекты и методы являются защищёнными (по- мечены знаком #). Защищённые члены класса недоступны извне, а доступны только для дочерних классов. Методы определены как абстрактные, так как неизвестна их реализация на данном уровне иерархии. Как именно должен работать котёл, становится известно только на уровне определения класса конкретной моде- ли котла. Поэтому реализация защи- щённых методов timeout() и tick() , а так- же открытых методов startHeating() и stopHeating() определена на уровне не- абстрактных классов BoilerModelM1… BoilerModelM3 . Здесь данные методы уже не являются абстрактными (имена методов на рис. 1 не выделены курси- вом). На этом уровне полностью из- вестна внутренняя реализация класса (класс не содержит ни одного абстракт- СТА 3/2023 56 www.cta.ru НОУ - ХАУ Рис. 3. UML-диаграмма состояний котла модели М1
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy