#Программа Elcut должна быть запущена и открыта задача coil.pbm. package require twapi; twapi::import_commands; #=============================================== #Расчет сил в Elcut #=============================================== proc getELCForceX {x_position} { #0. открыть модель #1. проверить положение якоря, передвинуть якорь #2. рассчитать силу # 0. открыть модель set ELC [comobj ELCUT.Application]; #подключиь Elcut set pbm [[$ELC Problems] Item 1]; #доступ к первой открытой задаче $pbm LoadModel; #загрузить модель set mdl [$pbm Model]; #подключить модель #1. проверить положение якоря по оси x, координату вершины "R" якоря set theVertex [[[[$mdl Shapes] Vertices] LabeledAs "R" "" ""] Item 1]; set theXposition [[$theVertex Point] X]; #расчет x-координаты вершины "R" set theVector [$ELC PointXY [expr $x_position - $theXposition] 0]; #расчет вектора перемещения #якорь состоит из 2-ух блоков: "изоляция" (внешний), "сердечник" (внутренний) #iесли передвигать внешний блок, то внутренний блок также будет передвинут set theBlock [[[[$mdl Shapes] Blocks] LabeledAs "" "" "изоляция"] Item 1]; #выбор блока "изоляция" $theBlock Move 0 $theVector; #перемещение якоря. 0=qfShift, перемещение #2. Решение задачи [$mdl Shapes] BuildMesh true false; #построение сетки $mdl Save; #сохранение модели if {[$pbm Solved]!=1} { #проверка, решена ли задача $pbm SolveProblem; #solve problem }; $pbm AnalyzeResults; #решение задачи set res [$pbm Result]; #ссылка на объект результатов set theFieldWindow [$res GetFieldWindow 1]; #подключение окна показа результатов set theContour [$theFieldWindow Contour]; #построение контура интегрирования #якорь состоит из 2-ух блоков: "изоляция" (внешний), "сердечник" (внутренний) $theContour AddBlock1 "изоляция"; #добавление к контуру блок "изоляция" $theContour AddBlock1 "сердечник"; #добавление к контуру блокa "сердечник" #Расчет интеграла магнитной силы set theForce [[$res GetIntegral 15 $theContour] Value]; #15=qfInt_MaxwellForce return [$theForce X]; #вывод x-компоненты силы } #=============================================== # основная программа начинается здесь #=============================================== #физические параметры реле set x_out 0.01; # максимально возможное положение, м set x_in 0.006; # минимально возможное положение, м set m_mass 0.0045; # масса сердечника, кг set k 4.0; # коэффициент упругости пружины, Н/м set x_spring_free 0.015; # положение без влияния пружины, м #начальные условия set t_time 0.0; # время, с set x_position $x_out; # положение сердечника, м set v_speed 0.0; # скрость сердечника, м/с set dt_time_step 0.005; # шаг интегрирования, с set max_time 0.2; # максимальное время интегрирования puts "Время,с Положение,м Скорость,м/с"; while { $t_time < $max_time && $x_position > $x_in } { set theForce [getELCForceX $x_position]; # электромагнитная сила set theForce [expr $theForce + ($x_spring_free - $x_position) * $k]; # добавление упругой силы set v_speed [expr $v_speed + ($theForce / $m_mass) * $dt_time_step]; # расчет ускорения и скорости set x_position [expr $x_position + $v_speed * $dt_time_step]; # расчет положения сердечника set t_time [expr $t_time + $dt_time_step]; # приращение времени puts "$t_time $x_position $v_speed"; # выходные результаты };