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



         

Архитектура математического ядра моделирующих программ с поточной моделью управления - часть 3


Set Mdl = CreateObject("Klinachyov.SimKernel")

' Устанавливаем свойства симуляции модели

Mdl.setSimProp 0, 1, 0.01, 0

' Создаем блоки (математические объекты или функции)

Mdl.createBlock L702, 0, 1, 0 ' inpVector

Mdl.createBlock L101, 2, 1, 2 ' summingJunction

Mdl.createBlock L100, 1, 1, 1 ' gain

Mdl.createBlock L951, 1, 1, 1 ' 1/S

Mdl.createBlock L802, 1, 0, 0 ' outVector

Mdl.createBlock L800, 2, 0, 0 ' export

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

Mdl.setBlkParam 2, 1, 1 Mdl.setBlkParam 2, 2, -1 Mdl.setBlkParam 3, 1, 4 Mdl.setBlkParam 4, 1, 0

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

Mdl.createWire 1, 1, 1, 2 Mdl.createWire 2, 1, 1, 3 Mdl.createWire 3, 1, 1, 4 Mdl.createWire 4, 1, 2, 2 Mdl.createWire 2, 1, 1, 6 Mdl.createWire 4, 1, 2, 6 Mdl.createWire 4, 1, 1, 5

' Устанавливаем очередность исполнения блоков

Mdl.BildSimFlow

' Это не важно - задаем массив выборок для обработки моделью

For i = 0 To 99 mySmplArr(i) = Sin(i / 7) Next

' Передаем массив в математическое ядро

Mdl.swapInputOutputSamples mySmplArr

' Запускаем процесс симуляции модели

Mdl.Simulation

' Считываем обработанный моделью массив

Mdl.swapInputOutputSamples mySmplArr

' Запускаем сервер визуализации результатов

' ...

Беглого взгляда на программу достаточно, дабы сделать вывод о том, что процесс создания модели унифицирован (для создания любого математического блока или же любой межблочной связи используется только один соответствующий метод (интерфейс)). Именно жесткая унификация интерфейсов делает возможным создание шлюзов между редакторами векторной графики и математическими ядрами.

 Интерфейсы (методы) COM-сервера - математического ядра
 SimKernel.setSimProp(timeStart, timeEnd, dT, mode)
 SimKernel.createBlock(IDLIB, numInp, numOut, numPrm)
 SimKernel.setBlkParam(idBlk, indexPrm, prmValue)
 SimKernel.createWire(O_idBlk, indexOut, indexInp, I_idBlk)
 SimKernel.BildSimFlow()
 SimKernel.SimStep()
 SimKernel.Simulation()
 SimKernel.ResetStates()
 SimKernel.SnapStates()
 SimKernel.swapInputOutputSamples(Array)
 SimKernel.getState(idBlk, indexOut)
 SimKernel.ControlPoints.Item(i)
 
 ControlPoint.onCalc(inpVector)
 SimKernel.UserBlocks.Item(i)
 
 UserBlock.onCalc(inpVector, outVector, prmVector)
 
 UserBlock.onFstStep(inpVector, outVector, prmVector)
 
 UserBlock.onEndStep(inpVector, outVector, prmVector)
 
 UserBlock.onPrmSet(prmVector)

Завершая обзор математического ядра, отметим, что представленные архитектурные решения позволяют решать системы как чисто дифференциальных уравнений (т.е. ядро может быть явным решателем), так и системы алгебро-дифференциальных уравнений (т.е. ядро может быть неявным (итерационным) решателем). Архитектура ядра не препятствует созданию, ставших уже классическими для моделирующих программ, методов частотного анализа [1]. Пользователь может свободно замещать блоки обладающие эффектом памяти (1/S, 1/Z, e-dTs) собственными процедурами, и, в любой момент, может иметь доступ ко всем координатам модели getState.




Содержание  Назад  Вперед