Теория систем автоматического регулирования

       

XML хранилище модели


Анализ графических примитивов и правил, используемых для выполнения рисунков блок-схем, позволяет выявить ряд объектов и принадлежащих им атрибутов, которые требуется сохранять в файле модели. Отношения между объектами демонстрирует показанная на рис. 4 схема данных. Очевидно, что для поддержания подобной информационной структуры требуется реляционная СУБД с мощными механизмами масштабирования, поиска, сортировки, обеспечения целостности данных и сохранения.


Рис. 4. Схема данных хранилища модели

К большому сожалению разработчики моделирующих программ предпочитают реализовывать собственные СУБД. Судя по функционированию программ, для большинства эта задача оказывается сложной. Вторым досадным моментом является несовместимость хранилищ (рабочих файлов) разных производителей и невозможность их непосредственного восприятия человеком. Как было упомянуто ранее, проблему может снять бесплатный движок реляционной базы данных фирмы Microsoft — COM-сервер msxml*.dll [7], последние версии которого включены в платформу .NET.

Если ориентироваться на Visio, то данный пакет уже использует этот движок для сохранения рисунков. Однако схема данных хранилища объектов Visio отличается от представленной на рис. 4. Это означает, что она не будет оптимальной (речь о нормализации базы данных) для хранения моделей и, в частности, блок-схем. Следует так же отметить, что схема данных для хранения объектов направленного графа (блок-схемы) не подойдет для хранения объектов ненаправленного графа (схемы физической принципиальной). Но различия не существенны, поэтому последнюю не рассматриваем. Более того, при использовании хранилищ с XML-разметкой, производители моделирующих программ могут придерживаться собственных схем данных — это не ограничит пользователя. Таже СУБД предоставляет механизмы XSLT-трансформаций, позволяющие без привлечения производителей переформатировать рабочие файлы одной моделирующей программы (их структуру и синтаксис) в рабочие файлы другой программы.


Одна из возможных XML-схем хранилища направленного графа (блок-схемы) представлена в виде листинга 4 (атрибуты не показаны). Большинство реляционных отношений схемы данных (рис. 4) кодируется инкапсуляцией описания соответствующих объектов внутри тегов объектов-владельцев. Лишь отношение между таблицей входов и таблицей связей задается парными атрибутами тегов <input/> и <wire/>. При отрисовке блок-схем широко используется механизм иерархической инкапсуляции повторяющегося фрагмента модели в одном составном блоке. В хранилище такие блоки имеют тег <space/>. Принцип описания инкапсуляции можно отследить по положению тегов <block/>.

Листинг 4

<!-- XML-схема хранилища направленного графа (рисунка блок-схемы) -->

<!-- Created by ModelStoreGate.WSC.1.00 -->

<directed_bond_graph> <block> <space> <block>...</block> <block>...</block> ...

<input /> ... <output> <wire /> ... </output> ... </space> <param /> ... <input /> ... <output> <wire /> ... </output> ... <model> <name /> <simproperties /> <autor /> <data /> <description /> <ico /> <library /> </model> </block> </directed_bond_graph>

Для создания хранилища и записи его на диск под управлением СУБД msxml*.dll требуется промежуточный COM-сервер, который допустимо написать на скриптах VBScript или JScript [6], но лучше на VB. Листинг 5 демонстрирует порядок использования объекта ModelStoreGate.WSC из этого сервера для экспорта блок-схемы. Сравнение листингов 2 и 5 позволяет выявить их подобие, из которого следует возможность использования шлюза Visio2SimKernel не только для программирования математического ядра, но и для экспорта рисунка блок-схемы в рабочий файл модели той или иной моделирующей программы.



Листинг 5

/* ************************* Head ***************************** */

// Определяем имя рабочего файла блок-схемы



NameMakingFile = "MDL_01c.XML";

// Создаём из COM-сервера объект для работы с хранилищем

var Store = new ActiveXObject("ModelStoreGate.WSC"); Store.reConnectToLibrary("1stSim_Lib_V2b.xml"); Store.ModelName = "K/(1+Ts) on SUB_1/S"; Store.ModelTimeStart = 0; Store.ModelTimeStep = 0.01; Store.ModelTimeEnd = 1; Store.ModelSimMode = 0; Store.Autor = "Nikolay Klinachyov"; Store.Date = "10.11.2003"; Store.Description = "Модель апериодического звена " + "на субмодели дискретного квазианалога интегратора"; Store.Ico = "apper.ico";

// Создаем корневой составной блок

// Определяем указатель на субобласть составного блока

rtB = Store.addBlock("L001", null);

/* ************************* Begin **************************** */

// Создаем блоки внутри корневого составного блока

Store.addBlock("L701", rtB); // 1(t-dT)

Store.addBlock("L101", rtB); // summingJunction

Store.addBlock("L100", rtB); // gain

Store.addModel("SUB_1S.XML", rtB); // 1/S: 6+1 блок

Store.addBlock("L800", rtB); // export

// Добавляем дополнительные входы и выходы блокам

// Store.addInput(2);

// Store.addOutput(0);

// Устанавливаем параметры блоков и начальные условия

Store.setParam( 1, 1, 1.0); Store.setParam( 1, 2, 0.05); Store.setParam( 2, 2, -1.0); Store.setParam( 3, 1, 4.0);

// Создаем связи между блоками (схему передачи аргументов)

Store.addWire( 1, 1, 1, 2); Store.addWire( 2, 1, 1, 3); Store.addWire( 3, 1, 1, 4); Store.addWire( 4, 1, 2, 2); Store.addWire( 2, 1, 1,11); Store.addWire( 4, 1, 2,11);

/* ************************* End ****************************** */

// Сохраняем хранилище в файле

Store.save( NameMakingFile ); // WScript.Echo("File " + NameMakingFile + " successfully created");

// Store.visualizationInMSIE( NameMakingFile );

Фактически, объект ModelStoreGate.WSC отвечает за трансформацию линейного потока команд в иерархическое хранилище.Безусловно, при считывании рабочего файла в целях визуализации редактором векторной графики или же для прямого программирования математического ядра требуется обратное преобразование. Оно может быть выполнено одной процедурой с соответствующими параметрами, примером которой является командный скрипт XML2SimKernelGate.WSF см. рис. 2.


Содержание раздела