MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

Simulink

Переопределение геометрических параметров блока "Body" в Matlab/Simulink

А.А. Руппель, к.т.н., доцент, СибАДИ
И.С. Щербаков, аспирант, СибАДИ

Аннотация. При создании программ моделирования машин с заранее не известными геометрическими параметрами твердых тел, возникает необходимость изменения параметров из интерфейса программы. В данной статье представлен способ изменения геометрических параметров блока “Body” на примере вызова из командной строки. Предложенный способ позволяет менять параметры блока без открытия диалогового окна “Body”.

Передавая параметры «mass», «tensor inertia» блоку «Body» авторы столкнулись с проблемой передачи параметров в матрицы CG, CS1 и CS2 (Рис.1).


Рис.1

Создав (для примера) модель tmp , открыв в нем блок «Body» и выполняя из командной строки:

set_param('tmp/Body','Mass','35')
set_param('tmp/Body','Inertia','[0 35 0][0 35 0][0 35 0]')

видим в диалоговом окне «Body», что параметры в полях «mass» и «tensor inertia» изменились.

Выполнив такую же команду для полей CG или CS1, CS2 система обновлений параметров в блоке диалога не производит, но и сообщений об ошибке не выдает:

set_param('tmp/Body','CG','35')

Просматривая структуру блока:

>> get_param('tmp/Body','DialogParameters')

ans = 

ClassName: [1x1 struct]
DialogClass: [1x1 struct]
Mass: [1x1 struct]
MassUnits: [1x1 struct]
InertiaUnits: [1x1 struct]
Inertia: [1x1 struct]
Shape: [1x1 struct]
ShapeDims: [1x1 struct]
ShapeUnits: [1x1 struct]
ShapeUse: [1x1 struct]
Density: [1x1 struct]
DensityUnits: [1x1 struct]
DensityUse: [1x1 struct]
CG: [1x1 struct]
WorkingFrames: [1x1 struct]
CS1Pos: [1x1 struct]
CS1Rot: [1x1 struct]
CS2Pos: [1x1 struct]
CS2Rot: [1x1 struct]
CGPos: [1x1 struct]
CGRot: [1x1 struct]

была замечена переменная ‘WorkingFrames’, опросив ее:

aa = get_param('tmp/Body','WorkingFrames')

была получена следующая структура:

aa =

Left$CS1$[0 0 0]$CG$CG$m$[0 0 0]$Euler
X-Y-Z$deg$INERTIAL$true#Right$CS2$[0 0 0]$CG$CG$m$[0 0 0]$Euler
X-Y-Z$deg$INERTIAL$true

Знаки доллара ($) в строке - делимитеры помогающие при разборе строки отделять одну переменную от другой. (Видимо фирмой MathWorks это было сделано не случайно, интерфейс к блоку существует, но в документации, по каким-то причинам, упоминания об этом нет.)

Для изменения значения порта Right ( CS2 ), (изменяем размера тела по оси Х) последовательно выполняем:

получаем структуру:

a = get_param('tmp/Body', 'WorkingFrames')

[q w e r t y u i o p s d f g h j k l z x c v b n m qq ww ee rr
tt yy]=strread(a,'%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s
%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s','delimiter','$')

присваиваем одной из переменных значение 60:

DlinBodyVal = 60

размещаем переменную в первой позиции трехмерного массива

(соответствующей координате 60 на оси Х):

f = ['[' char(DlinBodyVal) ' ' '0' ' ' '0' ']']

формируем структуру aa с переменной f (выделена красным цветом):

aa=[char(q) '$' char(w) '$' char(e) '$' char(r) '$' char(t)
'$' char(y) '$' char(u) '$' char(i) '$' char(o) '$' char(p)
'$' char(s) '$' char(d) '$' char(f) '$' char(g) '$' char(h)
'$' char(j) '$' char(k) '$' char(l) '$' char(z) '$' char(x)
'$' char(c) '$' char(v) '$' char(b) '$' char(n) '$' char(m)
'$' char(qq) '$' char(ww) '$' char(ee) '$' char(rr)
'$' char(tt) '$' char(yy)]

запускаем на выполнение:

set_param('tmp/Body', 'WorkingFrames', aa)

и получаем ответ:

aaa = get_param(' tmp/Body ', 'WorkingFrames')

aaa =

Left$CS1$[0 0 0]$CG$CG$m$[0 0 0]$Euler
X-Y-Z$deg$INERTIAL$true#Right$CS2$[60 0 0]$CG$CG$m$[0 0 0]$Euler
X-Y-Z$deg$INERTIAL$true$$$$$$$$$$

массив CS2 [60 0 0] (выделен красным цветом) в первой позиции содержит новое значение переменной DlinBodyVal ( 60 ). Открыв окно параметров блока «Body» (Рис.2) видим то же самое значение.


Рис.2

В поле CS2$[60 0 0] появилось значение 60, что и требовалось (Рис.2).

Теперь необходимо сохранить параметры;

save_system

и перегрузить модель:

reloadsys('tmp')

Поиск по сайту:

Система Orphus

Яндекс.Метрика