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