ЖУРНАЛ СТА №3/2023

СТА 3/2023 58 www.cta.ru НОУ - ХАУ дованием уже относятся не ко всей си- стеме в целом, а только к реализации класса. Таким образом, инкапсуляция упрощает задачу обеспечения коррект- ного управления оборудованием. Полиморфизм Полиморфизм – возможность ис- пользовать методы родительского класса независимо от того, какие они имеют реализации в дочерних классах. В нашем примере родительский класс GasBoiler имеет два защищённых метода ( timeout, tick ) и два открытых ( start-Heating, stopHeating ), унаследо- ванных от класса Boiler . Технологиче- ский алгоритм можно спроектировать для работы только с конкретной моде- лью котла, например, с экземпляром класса Boiler-ModelM1 . Но тогда при из- менении модели котла придётся вно- сить изменения и в технологический алгоритм. Этого можно избежать, если спроектировать технологический алго- ритм для работы со всеми газовыми кот- лами. Для этого потребуется вместо клас- са BoilerModelM1 указать класс GasBoiler . В итоге технологический алгоритм (OPC-клиент) будет вызывать открытые методы класса GasBoiler , а OPC-сервер уже будет их отрабатывать в соответ- ствии с конкретным типом созданного объекта ( BoilerModelM1…BoilerModelM3 ). Таким образом, полиморфизм позво- ляет менять котлы, имеющие различ- ные алгоритмы работы, не затрагивая технологический алгоритм управле- ния этими котлами в контроллере. Разработка OPC-сервера Разработка OPC-сервера может осу- ществляться на платформе .NET (язык C#) с помощью библиотеки от OPC Foundation [3]. Выполним описание раз- работанной информационной модели (две UML-диаграммы классов) в формате XML. Далее этот XML-файл преобразуется с помощью компилятора моделей [4] в набор файлов для среды разработки. Листинг 1 содержит XML-описание типа (класса) GasBurner (рис. 2). Тег опи- сывает тип объекта ( opc:ObjectType ), указывая его имя ( SymbolicName ), базо- вый тип ( BaseType ) и абстрактность ( IsAbstract ). Тип с именем GasBurner унаследован от базового типа Base- ObjectType , принятого в OPC UA, и яв- ляется абстрактным. Тег opc:Children описывает открытые (доступные для клиента) атрибуты и методы. Здесь определены две переменные ( opc: Variable ) типа Boolean . Уровень доступа задан в AccessLevel : переменная spark Листинг 1 <opc:ObjectType SymbolicName="GasBurner" BaseType="ua:BaseObjectType" IsAbstract="true"> <opc:Children> <opc:Variable SymbolicName="spark" DataType="ua:Boolean" ValueRank="Scalar" TypeDefinition="ua:BaseDataVariableType" ModellingRule="Mandatory" AccessLevel="ReadWrite"/> <opc:Variable SymbolicName="flame" DataType="ua:Boolean" ValueRank="Scalar" TypeDefinition="ua:BaseDataVariableType" ModellingRule="Mandatory" AccessLevel="Read"/> </opc:Children> </opc:ObjectType> Листинг 4 <opc:ObjectType SymbolicName="GasBoiler" BaseType="Boiler" IsAbstract="true"> <opc:Children> <opc:Object SymbolicName="burner" TypeDefinition="GasBurner" ModellingRule="Mandatory"> </opc:Object> </opc:Children> </opc:ObjectType> Листинг 2 <opc:ObjectType SymbolicName="AtmoGasBurner" BaseType="GasBurner" IsAbstract="true"> <opc:Children> <opc:Variable SymbolicName="gasValve" DataType="ua:Boolean" ValueRank="Scalar" TypeDefinition="ua:BaseDataVariableType" ModellingRule="Mandatory" AccessLevel="ReadWrite"/> </opc:Children> </opc:ObjectType> Листинг 3 <opc:Method SymbolicName="ActionMethodType"></opc:Method> <opc:ObjectType SymbolicName="Boiler" BaseType="ua:BaseObjectType" IsAbstract="true"> <opc:Children> <opc:Variable SymbolicName="outWaterTemp" DataType="ua:Double" ValueRank="Scalar" TypeDefinition="ua:AnalogItemType" ModellingRule="Mandatory" AccessLevel="Read"/> <opc:Variable SymbolicName="status" DataType="ua:Int16" ValueRank="Scalar" TypeDefinition="ua:BaseDataVariableType" ModellingRule="Mandatory" AccessLevel="Read"/> <opc:Method SymbolicName="startHeating" TypeDefinition="ActionMethodType" ModellingRule="Mandatory"/> <opc:Method SymbolicName="stopHeating" TypeDefinition="ActionMethodType" ModellingRule="Mandatory"/> </opc:Children> </opc:ObjectType>

RkJQdWJsaXNoZXIy MTQ4NjUy