Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Это lua скрипт для FEMM 4.0
- -- Функция вычисления (переделана из gauss_ver_2_4_04)
- function calculate(C,U,Dpr,Tiz,Lkat,Dkat,Lmag,Nom_mat_magnitoprovoda,Nom_mat_puli,Lpuli,Dpuli,Lsdv,Dstvola,Vel0,delta_t)
- params=C..","..U..","..Dpr..","..Tiz
- params=params..","..Lkat..","..Dkat..","..Lmag..","..Nom_mat_magnitoprovoda
- params=params..","..Nom_mat_puli..","..Lpuli..","..Dpuli..","..Lsdv..","..Dstvola..","..Vel0..","..delta_t
- kRC = 140 -- Постоянная константа RC для распространённых электрколитических нденсаторов, Ом*мкФ
- Rcc = (kRC/C) -- Внутреннее сопротивление конденсатора
- Rv = 0.35+Rcc -- Сопротивление подводящих проводов + сопротивление тиристора + внутреннее сопротивление конденсатора, Ом
- Vol = 3 -- Кратность свободного пространства вокруг модели (рекомендуется значение от 3 до 5)
- Coil_meshsize = 0.5 -- Размер сетки катушки, мм
- Proj_meshsize = 0.35 -- Размер сетки пули, мм
- max_segm = 5 -- Максимальный размер сегмента пространства, град
- t = 0 -- Начальный момент времени, секунды
- sigma = 0.0000000175 -- Удельное сопротивление меди, Ом * Метр
- ro = 7800 -- Плотность железа, Кг/Метр^3
- pi = 3.1415926535
- --------------------------------------------------------------------------------
- -- Начинаем
- --------------------------------------------------------------------------------
- Start_date= date()
- create(0) -- создаем документ для магнитных задач
- mi_probdef(0,"millimeters","axi",1E-8,30) -- создаем задачу
- mi_saveas("temp.fem") -- сохраняем файл под другим именем
- mi_addmaterial("Air",1,1) -- добавляем материал воздух
- mi_addmaterial("Cu",1,1,"","","",58,"","","",4,"","",1,Dpr) -- добавляем материал медный провод диаметром Dpr проводимостью 58
- mi_addcircprop("katushka",0,0,1) -- добавляем катушку
- dofile ("func.lua") -- компилируем функции для дальнейшего доступа к ним
- vvod_materiala (Nom_mat_magnitoprovoda,"M") -- вводим материал магнитопровода назовем его как М и номер материала
- Material_magnitoprovoda="M" .. Nom_mat_magnitoprovoda
- vvod_materiala (Nom_mat_puli,"P") ---- вводим материал пули назовем его как Р и номер материала
- Material_puli="P" .. Nom_mat_puli
- --------------------------------------------------------------------------------
- -- Располагаем объекты
- --------------------------------------------------------------------------------
- --Создаем пространство в Vol раз большее чем катушка
- mi_addnode(0,(Lkat+Lmag)*-Vol) -- ставим точку
- mi_addnode(0,(Lkat+Lmag)*Vol) -- ставим точку
- mi_addsegment(0,(Lkat+Lmag)*-Vol,0,(Lkat+Lmag)*Vol) -- рисуем линию
- mi_addarc(0,(Lkat+Lmag)*-5,0,(Lkat+Lmag)*Vol,180,max_segm) -- рисуем дугу
- mi_addblocklabel((Lkat+Lmag)*0.7*Vol,0) -- добавляем блок
- mi_clearselected() -- отменяем все
- mi_selectlabel((Lkat+Lmag)*0.7*Vol,0) -- выделяем метку блока
- mi_setblockprop("Air", 1, "", "", "",0) -- устанавливаем свойства блока с имнем Air и номером блока 0
- mi_zoomnatural() -- устанавливаем зум так что бы было видно на весь экран
- -------------------------------------------------------------------------- Создаем пулю
- if Dstvola < Dpuli then Dstvola = Dpuli+0.1 end -- защита от неумех
- -- если длина пули равна диаметру значит шар
- if Lpuli==Dpuli then
- mi_addnode(0,Lkat/2-Lsdv)
- mi_addnode(0,Lkat/2+Lpuli-Lsdv)
- mi_clearselected()
- mi_selectnode (0,Lkat/2-Lsdv)
- mi_selectnode (0,Lkat/2+Lpuli-Lsdv)
- mi_setnodeprop("",1)
- mi_addarc(0,Lkat/2-Lsdv,0,Lkat/2+Lpuli-Lsdv,180,5)
- else -- иначе просто цилиндр
- mi_addnode(0,Lkat/2-Lsdv)
- mi_addnode(Dpuli/2,Lkat/2-Lsdv)
- mi_addnode(Dpuli/2,Lkat/2+Lpuli-Lsdv)
- mi_addnode(0,Lkat/2+Lpuli-Lsdv)
- mi_clearselected()
- mi_selectnode(0,Lkat/2-Lsdv)
- mi_selectnode(Dpuli/2,Lkat/2-Lsdv)
- mi_selectnode(Dpuli/2,Lkat/2+Lpuli-Lsdv)
- mi_selectnode(0,Lkat/2+Lpuli-Lsdv)
- mi_setnodeprop("",1)
- mi_addsegment(Dpuli/2,Lkat/2-Lsdv,Dpuli/2,Lkat/2+Lpuli-Lsdv)
- mi_addsegment(Dpuli/2,Lkat/2+Lpuli-Lsdv,0,Lkat/2+Lpuli-Lsdv)
- mi_addsegment(0,Lkat/2+Lpuli-Lsdv,0,Lkat/2-Lsdv)
- mi_addsegment(0,Lkat/2-Lsdv,Dpuli/2,Lkat/2-Lsdv)
- end
- mi_addblocklabel(Dpuli/4,Lkat/2+Lpuli/2-Lsdv)
- mi_clearselected()
- mi_selectlabel(Dpuli/4,Lkat/2+Lpuli/2-Lsdv)
- mi_setblockprop(Material_puli, 0, Proj_meshsize, "", "",1) -- номер блока 1
- ------------------------------------------------------------------------- Создаем катушку
- mi_addnode(Dstvola/2,Lkat/2) -- основание
- mi_addnode(Dstvola/2,-Lkat/2) -- основание
- mi_addnode(Dkat/2,Lkat/2) -- внешняя начальная часть
- mi_addnode(Dkat/2,-Lkat/2) -- внешняя конечная часть
- mi_addsegment(Dstvola/2,-Lkat/2,Dstvola/2,Lkat/2)
- mi_addsegment(Dstvola/2,Lkat/2,Dkat/2,Lkat/2)
- mi_addsegment(Dkat/2,Lkat/2,Dkat/2,-Lkat/2)
- mi_addsegment(Dkat/2,-Lkat/2,Dstvola/2,-Lkat/2)
- mi_clearselected()
- mi_selectnode(Dstvola/2,Lkat/2) -- основание
- mi_selectnode(Dstvola/2,-Lkat/2) -- основание
- mi_selectnode(Dkat/2,Lkat/2)
- mi_selectnode(Dkat/2,-Lkat/2)
- mi_setnodeprop("",2)
- mi_addblocklabel(Dstvola/2+(Dkat/2-Dstvola/2)/2,0)
- mi_clearselected()
- mi_selectlabel(Dstvola/2+(Dkat/2-Dstvola/2)/2,0)
- mi_setblockprop("Cu", 0, Coil_meshsize, "katushka", "",2) -- номер блока 2
- -------------------------------------------------------------------------- Создаем внешний магнитопровод
- if (Lmag > 0) and (Nom_mat_magnitoprovoda > 0) then
- mi_addnode(Dstvola/2,Lkat/2+Lmag)
- mi_addnode(Dkat/2+Lmag,Lkat/2+Lmag)
- mi_addnode(Dkat/2+Lmag,-Lkat/2-Lmag)
- mi_addnode(Dstvola/2,-Lkat/2-Lmag)
- mi_addsegment(Dstvola/2,Lkat/2,Dstvola/2,Lkat/2+Lmag)
- mi_addsegment(Dstvola/2,Lkat/2+Lmag,Dkat/2+Lmag,Lkat/2+Lmag)
- mi_addsegment(Dkat/2+Lmag,Lkat/2+Lmag,Dkat/2+Lmag,-Lkat/2-Lmag)
- mi_addsegment(Dkat/2+Lmag,-Lkat/2-Lmag,Dstvola/2,-Lkat/2-Lmag)
- mi_addsegment(Dstvola/2,-Lkat/2-Lmag,Dstvola/2,-Lkat/2)
- mi_addblocklabel(Dkat/2+Lmag/2,0)
- mi_clearselected()
- mi_selectlabel(Dkat/2+Lmag/2,0)
- mi_setblockprop(Material_magnitoprovoda, 1, "", "", "",3) -- номер блока 3
- end
- mi_clearselected()
- --------------------------------------------------------------------------------
- -- система СИ - метр, Фарад
- --------------------------------------------------------------------------------
- C = C/1000000
- Dpriz = Dpr+Tiz -- Диаметр провода в изоляции
- Dpr = Dpr/1000
- Dpriz = Dpriz/1000
- Lpuli = Lpuli/1000
- Dpuli = Dpuli/1000
- Dstvola = Dstvola/1000
- Lkat = Lkat/1000
- Dkat = Dkat/1000
- Lsdv = Lsdv/1000
- Lmag = Lmag/1000
- --------------------------------------------------------------------------------
- -- Анализируем и запускаем постпроцессор
- mi_analyze(1) -- анализируем (скрывая окно анализа "1") 0 - будет видно окно и будет работать медленее
- mi_loadsolution() -- запускаем саму программу пост процессора
- mo_groupselectblock(2)
- Skat = mo_blockintegral(5) -- Площадь сечения катушки, Метр^2
- Vkat = mo_blockintegral(10) -- Объем катушки, Метр^3
- mo_clearblock()
- mo_groupselectblock(1)
- Vpuli = mo_blockintegral(10) -- Объем пули, Метр^3
- mo_clearblock()
- Mpuli=ro*Vpuli -- Масса пули, кг
- N=Skat*0.94/(Dpriz*Dpriz) -- Количество витков в катушке уточнённое
- DLprovoda=N * 2 * pi * (Dkat + Dstvola)/4 -- Длина обмоточного провода уточнённая, м
- Rkat=sigma*DLprovoda/(pi*(Dpr/2)^2) -- Сопротивление всего обмоточного провода катушки, Ом
- R=Rv+Rkat -- Полное сопротивление системы
- --Устанавливаем число витков, а силу тока 100 А для оценки индуктивности
- mi_clearselected()
- mi_selectlabel(Dstvola*1000/2+(Dkat/2-Dstvola/2)*1000/2,0)
- mi_setblockprop("Cu", 0, Coil_meshsize, "katushka", "",2,N) -- последнее значение - число витков
- mi_clearselected()
- mi_modifycircprop("katushka",1,100)
- -- Анализируем и запускаем постпроцессор
- mi_analyze(1) -- анализируем (скрывая окно анализа "1")
- mo_reload() -- перезапускаем программу пост процессора
- current_re,current_im,volts_re,volts_im,flux_re,flux_im=mo_getcircuitproperties("katushka") -- получаем данные с катушки
- L=flux_re/current_re -- Оценочная индуктивность, Генри
- --------------------------------------------------------------------------------
- -- НАчало симуляции
- --------------------------------------------------------------------------------
- dt = delta_t/1000000 -- перевод приращения времени в секунды
- x=0 -- начальная позиция пули
- I0=0.00000001 -- достаточно малое значение тока
- t=0 -- общее время
- Vel=Vel0
- Vmax=Vel
- Uc = U
- I=I0 -- начальное значение тока
- Force = 0
- Fii = 0
- Fix = 0
- KC=1 -- счетчик циклов, для вывода в файл
- T_I={} -- создаем массив (таблицу как её называют в Lua)
- T_F={}
- T_Vel={}
- T_x={}
- T_t={}
- maxI=0
- Isum=0
- Ic=0
- repeat ------------------------------------------------------------ начинаем цикл
- t = t+dt
- --- Рассчитываем dFi/dI при I и силу
- mi_modifycircprop("katushka",1,I) -- Устанавливает ток
- mi_analyze(1) -- анализируем (скрывая окно анализа "1") 0 - будет видно окно и будет работать медленее
- mo_reload() -- перезапускаем программу пост процессора
- mo_groupselectblock(1)
- Force = mo_blockintegral(19) -- Сила действующая на пулю, Ньютон
- Force=Force*-1 -- ставим "-" из за координат (направление силы в сторону уменьшения координаты)
- current_re,current_im,volts_re,volts_im,flux_re,flux_im=mo_getcircuitproperties("katushka") -- получаем данные с катушки
- Fi0=flux_re -- магнитный поток
- mi_modifycircprop("katushka",1,I*1.001) -- Устанавливает ток, увельченный на 1.001
- mi_analyze(1) -- анализируем (скрывая окно анализа "1") 0 - будет видно окно и будет работать медленее
- mo_reload() -- перезапускаем программу пост процессора
- current_re,current_im,volts_re,volts_im,flux_re,flux_im=mo_getcircuitproperties("katushka") -- получаем данные с катушки
- Fi1=flux_re -- магнитный поток при I=I+0.001*I, dI=0.001*I
- Fii=(Fi1-Fi0)/(0.001*I) -- Рассчитываем dFi/dI
- apuli = Force / Mpuli -- Ускорение пули, Метр/секунда^2
- dx = Vel*dt+apuli*dt*dt/2 -- Приращение координаты, метр
- x = x+dx -- Новая позиция пули
- Vel = Vel+apuli*dt -- Скорость после приращения, метр/секунда
- if tonumber(Vmax)<tonumber(Vel) then Vmax=tonumber(Vel) end
- mi_selectgroup(1) -- Выделяем пулю
- mi_movetranslate(0,-dx*1000) -- Перемещаем её на dx
- --- Рассчитываем dFi/dx при x
- Fix= Force/I
- ------- Расчитываем ток и напряжение на конденсаторе
- I=I+dt*(Uc-I*R-Fix*Vel)/Fii
- Uc = Uc-dt*I/C
- if Uc< 0 then Uc=0 end --если стоит паралельный диод
- if x > (Lpuli+Lkat-Lsdv) and Force >-1 then I=0 end -- Пуля вылетела за пределы катушки и сила очень маленькая
- if x < 0 then I=0 end -- Пуля вылетела назад
- T_I[KC]=I -- записываем данные в массив
- T_F[KC]=Force
- T_Vel[KC]=Vel
- T_x[KC]=x*1000
- T_t[KC]=t*1000000
- KC=KC+1
- if I>maxI then
- maxI=I
- end
- Isum=Isum+I
- Ic=Ic+1
- until (I <= 0) or (Vel < 0 ) -- повторяем расчет, пока не будет тока
- Isr=Isum/Ic
- Epuli = (Mpuli*Vel^2)/2 - (Mpuli*Vel0^2)/2
- EC= (C*U^2)/2
- KPD = Epuli*100/EC
- print ("Симуляция завершена. Данные записаны в файл "..File_name.." result.csv")
- ----------------------------------------------------------------------------------------------------
- -- Записываем всё в csv файл
- ----------------------------------------------------------------------------------------------------
- handle = openfile(File_name .. " result.csv", "a")-- создаем файл а - будем дописывать в конец файла w - записать стерев всё что было перед тем
- res=params ..",".. Start_date..","..R..",".. Rv..","..Rkat..","
- res= res..","..N..","..tostring(Dpr*1000)..","..DLprovoda..","..tostring(Lkat*1000)
- res= res..","..tostring(Dkat*1000)..","..tostring(L*1000000)..","..tostring(Mpuli*1000)..",".. tostring(t*1000000)
- res= res..","..Epuli..",".. EC..",".. KPD..",".. Vel..",".. Vmax..","..maxI..","..Isr..",".. date().."\n"
- write(handle,res)
- closefile(handle)
- -- Удаляем промежуточные файлы
- remove ("temp.fem")
- remove ("temp.ans")
- end
- -- Чтение блока допустимых значений параметра
- function readBlock(handle)
- result={}
- local stop=0
- i=1
- while stop==0 do
- line = read(handle, "*l")
- if line=="[/]" then stop=1
- else result[i]=tonumber(line)
- end
- i=i+1
- end
- return result
- end
- function calculateParams(params)
- calculate(params[1 ],params[2 ],params[3 ],
- params[4 ],params[5 ],params[6 ],
- params[7 ],params[8 ],params[9 ],
- params[10],params[11],params[12],
- params[13],params[14],params[15])
- end
- -- Подбор параметров (рекуррентный)
- function change(params,num,other)
- if num==16 then
- calculateParams(other) -- если все значения параметров подобраны, то считаем
- else
- local param=params[num] -- Допустимые значения меняемого параметра
- for key,value in param do
- local my = other
- my[num]=value
- change(params,num+1,my)
- end
- end
- end
- showconsole() -- показываем окно вывода промежуточных данных
- clearconsole()
- File_name=prompt ("Введите имя файла с данными гауса, без расширения .txt")
- print("Чтение данных...")
- handle = openfile(File_name .. ".txt","r")
- params={}
- -- 1. Ёмкость конденсаторов
- -- 2. Напряжение конденсаторов
- -- 3. Диаметр обмоточного провода катушки, милиметр
- -- 4. Удвоенная толщина изоляции провода (разница диаметра в изоляции и диаметра голого), мм
- -- 5. Длина катушки (не задавать меньше диаметра обмот. провода катушки), милиметр
- -- 6. Внешний диаметр катушки, милиметр
- -- 7. Толщина внешнего магнитопровода, по форме повторяет катушку, если ноль то его нет, милиметр
- -- 8. материал из которого сделан магнитопровод катушки см. таблицу
- -- 9. материал из которого сделана пуля см. таблицу
- -- 10. Длина пули, милиметр
- -- 11. Диаметр пули, милиметр
- -- 12. Расстояние, на которое в начальный момент вдвинута пуля в катушку или находится до катушки с минусом, милиметр
- -- 13. Внешний диаметр ствола (не задавать меньше диаметра пули), милиметр
- -- 14. Начальная скорость пули, м/с (Вместо 0 лучше какое-то небольшое значение, иначе долго на месте стоит)
- -- 15. Приращение времени, мкС
- comb_count=1
- for i=1,13 do
- params[i]=readBlock(handle)
- end
- params[14]={read(handle, "*l")}
- params[15]={read(handle, "*l")}
- closefile(handle)
- handle=openfile(File_name .. " result.csv", "w")
- write (handle,"Ёмкость батареи Ф,")
- write (handle,"Напряжение батареи В,")
- write (handle,"Диаметр провода мм,")
- write (handle,"Удвоенная толщина изоляции мм,")
- write (handle,"Длина катушки мм,")
- write (handle,"Внешний диаметр катушки мм,")
- write (handle,"Толщина внешнего магнитопровода мм,")
- write (handle,"материал магнитопровода,")
- write (handle,"материал пули,")
- write (handle,"Длина пули мм,")
- write (handle,"Диаметр пули,")
- write (handle,"Расстояние, на которое в начальный момент вдвинута пуля в катушку,")
- write (handle,"Внешний диаметр ствола,")
- write (handle,"Начальная скорость пули,")
- write (handle,"Приращение времени,")
- write (handle,"Начало симуляции ,")
- write (handle,"Сопротивление общее Ом,")
- write (handle,"Внешнее сопротивление Ом,")
- write (handle,"Сопротивление катушки Oм,")
- write (handle,"Количество витков в катушке,")
- write (handle,"Диаметр обмоточного провода катушки милиметр,")
- write (handle,"Длина провода в катушке метр,")
- write (handle,"Длина катушки милиметр,")
- write (handle,"Внешний диаметр катушки милиметр,")
- write (handle,"Индуктивность катушки с пулей в начальном положении микроГенри,")
- write (handle,"Масса пули грамм,")
- write (handle,"Время процесса (микросек),")
- write (handle,"Энергия пули Дж,")
- write (handle,"Энергия конденсатора Дж,")
- write (handle,"КПД гауса(%),")
- write (handle,"Скорость пули на выходе из катушки м/с,")
- write (handle,"Максимальная скорость которая была достигнута м/с,")
- write (handle,"Максимальный ток А,")
- write (handle,"Средний ток А,")
- write (handle,"Окончания симуляции\n")
- closefile(handle)
- change(params,1,{}) -- Начинаем подбор
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement