-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcoilgun.lua
722 lines (625 loc) · 26.5 KB
/
coilgun.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
-- Ñêðèïò äëÿ ïðîãðàììû FEMM 4.2
--------------------------------------------------------------------------------
setcompatibilitymode(1) -- Ñîâìåñòèìîñòü ñ âåðñèåé 4.2
----[ Âñÿêèå êîíñòàíòû ]-----------------------------------------------------------------------------------------------
vers = 128 -- Âåðñèÿ ñêðèïòà
k_rc = 140 -- Ïîñòîÿííàÿ êîíñòàíòà RC äëÿ ðàñïðîñòðàí¸ííûõ ýëåêòðêîëèòè÷åñêèõ íäåíñàòîðîâ, Îì*ìêÔ
coil_meshsize = 0.5 -- Ðàçìåð ñåòêè êàòóøêè, ìì
proj_meshsize = 0.35 -- Ðàçìåð ñåòêè ïóëè, ìì
max_segm = 5 -- Ìàêñèìàëüíûé ðàçìåð ñåãìåíòà ïðîñòðàíñòâà, ãðàä
sigma = 0.0000000175 -- Óäåëüíîå ñîïðîòèâëåíèå ìåäè, Îì * Ìåòð
ro = 7800 -- Ïëîòíîñòü æåëåçà, Êã/Ìåòð^3
pi = 3.1415926535
name_mat = "Iron"
air_mat = "Air"
coil_name = "katushka"
cu_mat = "Cu"
----[ ×òåíèå íà÷àëüíûõ äàííûõ èç òåêñòîâîãî ôàéëà ]--------------------------------------------------------------------
function read_config_file(file_name)
conf = {}
opt = {}
dofile(file_name)
local config = conf
conf = nil
config.opt_params = opt or {}
opt = nil
local t_iz = sqrt(config.d_pr) * 0.07
config.d_pr_iz = config.d_pr+t_iz -- Äèàìåòð ïðîâîäà â èçîëÿöèè
if (config.r_cc == nil) or (config.r_cc == 0) then
config.r_cc = (k_rc / config.c) -- Âíóòðåííåå ñîïðîòèâëåíèå êîíäåíñàòîðà
end
-- çàùèòà îò íåóìåõ
if config.d_stv < config.d_puli then config.d_stv = config.d_puli + 0.1 end
if config.l_otv > (config.l_puli-0.5) then config.l_otv = config.l_puli - 0.5 end
if config.l_otv < 0 then config.l_otv = 0 end
if config.d_otv > (config.d_puli-0.5) then config.d_otv = config.d_puli - 0.5 end
if config.d_otv < 0 then config.d_otv = 0 end
-- Ïîääåðæêà ñòàðîãî êîíôèãà
if config["l_mag_y"] ~= nil then
config.l_mag_top = config.l_mag_y
config.l_mag_bot = config.l_mag_y
end
return config
end
----[ Äîáàâëÿåò òàáëèöó ñâîéñòâ ìàòåðèàëà "ìÿãêàÿ ñòàëü" ]-------------------------------------------------------------
function add_iron_material()
local iron_props = {
{0, 0 },
{0.0001, 50 },
{0.001, 100 },
{0.01, 150 },
{0.015, 175 },
{0.0253, 200 },
{0.15, 300 },
{0.5031, 400 },
{1.0059, 500 },
{1.3706, 700 },
{1.4588, 900 },
{1.51, 1200 },
{1.55, 1600 },
{1.58, 2000 },
{1.62, 2700 },
{1.77, 10000 },
{1.84, 20000 },
{1.93, 42000 },
{2.01, 75000 },
{2.10, 123300 },
{2.25, 207000 },
{2.439, 350000 },
{3.13, 900000 },
{7.65, 4500000 },
{13.3, 9000000 },
{22.09, 16000000}
}
mi_addmaterial(name_mat,"","","","","",0)
for i, prop in iron_props do
mi_addbhpoint(name_mat, prop[1], prop[2])
end
end
----[ Ñîçäà¸ò ïðîåêò â FEMM äëÿ ðàñ÷¸òîâ ]-----------------------------------------------------------------------------
function add_all_points(points)
for i, pt in points do mi_addnode(pt[1], pt[2]) end
end
function select_all_points(points)
for i, pt in points do mi_selectnode(pt[1], pt[2]) end
end
function add_all_segments(points)
local last_i = getn(points)
local pt2
for i, pt1 in points do
if i == last_i then pt2 = points[1]
else pt2 = points[i+1] end
mi_addsegment(pt1[1], pt1[2], pt2[1], pt2[2])
end
end
function create_project(config)
local Vol = 1.5 -- Êðàòíîñòü ñâîáîäíîãî ïðîñòðàíñòâà âîêðóã ìîäåëè
local d_otv = config.d_otv
local d_kat = config.d_kat
local l_kat = config.l_kat
local l_mag = config.l_mag
local l_mag_top = config.l_mag_top
local l_mag_bot = config.l_mag_bot
local d_stv = config.d_stv
local l_puli = config.l_puli
local l_sdv = config.l_sdv
local d_puli = config.d_puli
local l_otv = config.l_otv
local d_pr = config.d_pr
create(0) -- ñîçäàåì äîêóìåíò äëÿ ìàãíèòíûõ çàäà÷
mi_probdef(0,"millimeters","axi",1E-8,30) -- ñîçäàåì çàäà÷ó
mi_saveas("temp.fem") -- ñîõðàíÿåì ôàéë ïîä äðóãèì èìåíåì
mi_addmaterial(air_mat,1,1) -- äîáàâëÿåì ìàòåðèàë âîçäóõ
mi_addmaterial(cu_mat,1,1,"","","",58,"","","",3,"","",1,d_pr) -- äîáàâëÿåì ìàòåðèàë ìåäíûé ïðîâîä äèàìåòðîì d_pr ïðîâîäèìîñòüþ 58
mi_addcircprop(coil_name,0,0,1) -- äîáàâëÿåì êàòóøêó
add_iron_material()
-- Ðàñïîëàãàåì îáúåêòû
--Ñîçäàåì ïðîñòðàíñòâî â Vol ðàç áîëüøåå ÷åì êàòóøêà
local vol_base = max(l_puli + l_kat/2 + l_mag_top + l_mag_bot - l_sdv, l_mag + d_kat/2)
mi_addnode(0, vol_base * -Vol) -- ñòàâèì òî÷êó
mi_addnode(0, vol_base * Vol) -- ñòàâèì òî÷êó
mi_addsegment(0, vol_base * -Vol, 0, vol_base * Vol) -- ðèñóåì ëèíèþ
mi_addarc(0, vol_base * -5, 0, vol_base * Vol, 180, max_segm) -- ðèñóåì äóãó
mi_addblocklabel(vol_base * 0.7 * Vol, 0) -- äîáàâëÿåì áëîê
mi_clearselected() -- îòìåíÿåì âñå
mi_selectlabel(vol_base * 0.7 * Vol, 0) -- âûäåëÿåì ìåòêó áëîêà
mi_setblockprop(air_mat, 1, "", "", "",0) -- óñòàíàâëèâàåì ñâîéñòâà áëîêà ñ èìíåì Air è íîìåðîì áëîêà 0
mi_zoomnatural() -- óñòàíàâëèâàåì çóì òàê ÷òî áû áûëî âèäíî íà âåñü ýêðàí
-- Ñîçäàåì ïóëþ
-- åñëè äëèíà ïóëè ðàâíà äèàìåòðó çíà÷èò øàð
if l_puli==d_puli then
mi_addnode(0,l_kat/2-l_sdv)
mi_addnode(0,l_kat/2+l_puli-l_sdv)
mi_clearselected()
mi_selectnode (0,l_kat/2-l_sdv)
mi_selectnode (0,l_kat/2+l_puli-l_sdv)
mi_setnodeprop("",1)
mi_addarc(0,l_kat/2-l_sdv,0,l_kat/2+l_puli-l_sdv,180,5)
-- èíà÷å ïðîñòî öèëèíäð
else
local y1 = l_kat / 2 + l_puli - l_sdv
local y2 = l_kat / 2 - l_sdv
local x = d_puli / 2
local projectile_points;
if d_otv > 0 then
-- (6) *-----* (1)
-- | |
-- (4) *---*(5) |
-- | |
-- | |
-- | |
-- | |
-- (3) *---------* (2)
projectile_points = {
{ x, y1 }, -- 1
{ x, y2 }, -- 2
{ 0, y2 }, -- 3
{ 0, y1-l_otv }, -- 4
{ d_otv/2, y1-l_otv }, -- 5
{ d_otv/2, y1 } -- 6
}
else
-- (1) *---------* (2)
-- | |
-- | |
-- | |
-- | |
-- | |
-- | |
-- (4) *---------* (3)
projectile_points = {
{ 0, y1 }, -- 1
{ x, y1 }, -- 2
{ x, y2 }, -- 3
{ 0, y2 } -- 4
}
end
add_all_points(projectile_points)
mi_clearselected()
select_all_points(projectile_points)
mi_setnodeprop("",1)
add_all_segments(projectile_points)
end
mi_addblocklabel(d_puli/4,l_kat/2+l_puli/2-l_otv/2-l_sdv)
mi_clearselected()
mi_selectlabel(d_puli/4,l_kat/2+l_puli/2-l_otv/2-l_sdv)
mi_setblockprop(name_mat, 1, proj_meshsize, "", "",1) -- íîìåð áëîêà 1
-- Ñîçäàåì êàòóøêó
if (config.k_ark <= 0) then config.k_ark = 0.5 end
-- (1) (2)
-- *------*
-- | |
-- | |
-- | |
-- *------*
-- (4) (3)
local intern_coil_points = {
{ config.k_ark + d_stv/2, config.k_ark - l_kat/2 }, -- 1
{ -config.k_ark + d_kat/2, config.k_ark - l_kat/2 }, -- 2
{ -config.k_ark + d_kat/2, -config.k_ark + l_kat/2 }, -- 3
{ config.k_ark + d_stv/2, -config.k_ark + l_kat/2 } -- 4
}
add_all_points(intern_coil_points)
add_all_segments(intern_coil_points)
mi_addblocklabel(d_stv/2+(d_kat/2-d_stv/2)/2,0)
mi_clearselected()
mi_selectlabel(d_stv/2+(d_kat/2-d_stv/2)/2,0)
mi_setblockprop(cu_mat, 0, coil_meshsize, coil_name, "",2) -- íîìåð áëîêà 2
-- Ñîçäàåì âíåøíèé ìàãíèòîïðîâîä
if (l_mag > 0) then
if l_mag_top ~= 0 and l_mag_bot ~= 0 then
-- Ìàãíèòîïðîâîä ñ äâóìÿ ù¸÷êàìè ñâåðõó è ñíèçó
-- (1) (2)
-- *-------------*
-- | |
-- *-------* |
-- (8) (7)| |
-- | |
-- (5) (6)| |
-- *-------* |
-- | |
-- *-------------*
-- (4) (3)
mag_core_points = {
{ d_stv / 2+0.3, l_kat / 2 + l_mag_top }, -- 1
{ d_kat / 2 + l_mag, l_kat / 2 + l_mag_top }, -- 2
{ d_kat / 2 + l_mag, -l_kat / 2 - l_mag_bot }, -- 3
{ d_stv / 2+0.3, -l_kat / 2 - l_mag_bot }, -- 4
{ d_stv / 2+0.3, -l_kat / 2 }, -- 5
{ d_kat / 2, -l_kat / 2 }, -- 6
{ d_kat / 2, l_kat / 2 }, -- 7
{ d_stv / 2+0.3, l_kat / 2 } -- 8
};
elseif l_mag_top ~= 0 and l_mag_bot == 0 then
-- Ìàãíèòîïðîâîä ñ ù¸÷êîé ñâåðõó
-- (1) (2)
-- *-------------*
-- | |
-- *-------* |
-- (6) (5)| |
-- | |
-- | |
-- (4) *-----* (3)
mag_core_points = {
{ d_stv / 2+0.3, l_kat / 2 + l_mag_top }, -- 1
{ d_kat / 2 + l_mag, l_kat / 2 + l_mag_top }, -- 2
{ d_kat / 2 + l_mag, -l_kat / 2 }, -- 3
{ d_kat / 2+0.3, -l_kat / 2 }, -- 4
{ d_kat / 2, l_kat / 2 }, -- 5
{ d_stv / 2+0.3, l_kat / 2 } -- 6
};
elseif l_mag_top == 0 and l_mag_bot ~= 0 then
-- Ìàãíèòîïðîâîä ñ ù¸÷êîé ñíèçó
-- (1) (2)
-- *-----*
-- | |
-- | |
-- (5) (6)| |
-- *-------* |
-- | |
-- *-------------*
-- (4) (3)
mag_core_points = {
{ d_kat / 2, l_kat / 2 }, -- 1
{ d_kat / 2 + l_mag, l_kat / 2 }, -- 2
{ d_kat / 2 + l_mag, -l_kat / 2 - l_mag_bot }, -- 3
{ d_stv / 2+0.3, -l_kat / 2 - l_mag_bot }, -- 4
{ d_stv / 2+0.3, -l_kat / 2 }, -- 5
{ d_kat / 2, -l_kat / 2 }, -- 6
};
elseif l_mag_top == 0 and l_mag_bot == 0 then
-- Ìàãíèòîïðîâîä áåç ù¸÷åê
-- (1) (2)
-- *-----*
-- | |
-- | |
-- | |
-- *-----*
-- (4) (3)
mag_core_points = {
{ d_kat / 2, l_kat / 2}, -- 1
{ d_kat / 2 + l_mag, l_kat / 2}, -- 2
{ d_kat / 2 + l_mag, -l_kat / 2}, -- 3
{ d_kat / 2, -l_kat / 2}, -- 4
};
end
add_all_points(mag_core_points)
add_all_segments(mag_core_points)
mi_addblocklabel(d_kat/2+l_mag/2,0)
mi_clearselected()
mi_selectlabel(d_kat/2+l_mag/2,0)
mi_setblockprop(name_mat, 1, "", "", "",3) -- íîìåð áëîêà 3
end
mi_clearselected()
end
----[ Ñèìóëÿöèÿ îäíîãî âûñòðåëà ïî ïàðàìåòðàì, çàäàííûì â config ]-----------------------------------------------------
function simulate(config)
local result = {}
-- ïåðåâîäèì â ñîñòåìó Ñè
local c = config.c / 1000000
local d_pr = config.d_pr / 1000
local d_pr_iz = config.d_pr_iz / 1000
local l_puli = config.l_puli / 1000
local l_kat = config.l_kat / 1000
local l_sdv = config.l_sdv / 1000
local nagr = config.nagr / 1000
-- Íà÷èíàåì
result.start_date = date()
result.r_v = config.r_sw+config.r_cc -- Ñîïðîòèâëåíèå êëþ÷à + âíóòðåííåå ñîïðîòèâëåíèå êîíäåíñàòîðà, Îì
-- Àíàëèçèðóåì è çàïóñêàåì ïîñòïðîöåññîð
mi_analyze(1) -- àíàëèçèðóåì (ñêðûâàÿ îêíî àíàëèçà "1")
mi_loadsolution() -- çàïóñêàåì ñàìó ïðîãðàììó ïîñò ïðîöåññîðà
mo_groupselectblock(2)
local Skat = mo_blockintegral(5) -- Ïëîùàäü ñå÷åíèÿ êàòóøêè, Ìåòð^2
local Vkat = mo_blockintegral(10) -- Îáúåì êàòóøêè, Ìåòð^3
mo_clearblock()
mo_groupselectblock(1)
local Vpuli = mo_blockintegral(10) -- Îáúåì ïóëè, Ìåòð^3
mo_clearblock()
result.m_puli=ro*Vpuli + nagr -- Ìàññà ïóëè ïëþñ îïåðåíèå, êã
if config.k_mot < 1 then
result.n = config.k_mot * Skat / (d_pr_iz * d_pr_iz) -- Êîëè÷åñòâî âèòêîâ â êàòóøêå óòî÷í¸ííîå
else
result.n = config.k_mot -- èëè ÿâíî çàäàíî
end
local end_x = l_puli + l_kat - l_sdv -- Ïîëîæåíèå ïóëè çà ïðåäåëîì êàòóøêè
result.dl_provoda = result.n * 2 * pi * ((config.d_kat + config.d_stv)/1000) / 4 -- Äëèíà îáìîòî÷íîãî ïðîâîäà óòî÷í¸ííàÿ, ì
result.r_kat = sigma * result.dl_provoda / (pi * (d_pr / 2)^2) -- Ñîïðîòèâëåíèå âñåãî îáìîòî÷íîãî ïðîâîäà êàòóøêè, Îì
result.r = result.r_v + result.r_kat -- Ïîëíîå ñîïðîòèâëåíèå ñèñòåìû
--Óñòàíàâëèâàåì ÷èñëî âèòêîâ, à ñèëó òîêà 100 À äëÿ îöåíêè èíäóêòèâíîñòè
mi_clearselected()
mi_selectlabel(config.d_stv / 2 + (config.d_kat / 2 - config.d_stv / 2) / 2, 0)
mi_setblockprop("Cu", 0, coil_meshsize, coil_name, "", 2, result.n) -- ïîñëåäíåå çíà÷åíèå - ÷èñëî âèòêîâ
mi_clearselected()
mi_modifycircprop(coil_name, 1, 100)
-- Àíàëèçèðóåì è çàïóñêàåì ïîñòïðîöåññîð
mi_analyze(1) -- àíàëèçèðóåì (ñêðûâàÿ îêíî àíàëèçà "1")
mo_reload() -- ïåðåçàïóñêàåì ïðîãðàììó ïîñò ïðîöåññîðà
current_re,_,_,_,flux_re,_ = mo_getcircuitproperties(coil_name) -- ïîëó÷àåì äàííûå ñ êàòóøêè
result.l = flux_re / current_re -- Îöåíî÷íàÿ èíäóêòèâíîñòü, Ãåíðè
-- ÍÀ÷àëî ñèìóëÿöèè
local dt = config.delta_t / 1000000 -- ïåðåâîä ïðèðàùåíèÿ âðåìåíè â ñåêóíäû
local x = 0 -- íà÷àëüíàÿ ïîçèöèÿ ïóëè
local I0 = 0.01 -- äîñòàòî÷íî ìàëîå çíà÷åíèå òîêà I0=0.01
local Uc = config.u
local I = I0 -- íà÷àëüíîå çíà÷åíèå òîêà
local Force = 0
local Fii = 0
local kc = 1 -- ñ÷åò÷èê öèêëîâ, äëÿ èíäåêñà çàïèñè â ìàññèâ result.items
result.v_max = config.vel0
result.f_aver = 0
result.t = 0 -- îáùåå âðåìÿ
result.vel = config.vel0
result.items = {} -- ñîçäàåì ìàññèâ (òàáëèöó êàê å¸ íàçûâàþò â Lua)
local have_to_stop = 0
repeat -- íà÷èíàåì öèêë
result.t = result.t+dt
--- Ðàññ÷èòûâàåì dFi/dI ïðè I è ñèëó
mi_modifycircprop(coil_name, 1, I) -- Óñòàíàâëèâàåò òîê
mi_analyze(1) -- àíàëèçèðóåì (ñêðûâàÿ îêíî àíàëèçà "1")
mo_reload() -- ïåðåçàïóñêàåì ïðîãðàììó ïîñò ïðîöåññîðà
mo_groupselectblock(1)
Force = mo_blockintegral(19) -- Ñèëà äåéñòâóþùàÿ íà ïóëþ, Íüþòîí
Force = Force * -1 -- ñòàâèì "-" èç çà êîîðäèíàò (íàïðàâëåíèå ñèëû â ñòîðîíó óìåíüøåíèÿ êîîðäèíàòû)
result.f_aver = result.f_aver + Force * dt
_,_,_,_,flux_re,_ = mo_getcircuitproperties(coil_name) -- ïîëó÷àåì äàííûå ñ êàòóøêè
local Fi0=flux_re -- ìàãíèòíûé ïîòîê
mi_modifycircprop(coil_name, 1, I * 1.001) -- Óñòàíàâëèâàåò òîê, óâåëè÷åííûé íà 1.001
mi_analyze(1) -- àíàëèçèðóåì (ñêðûâàÿ îêíî àíàëèçà "1")
mo_reload() -- ïåðåçàïóñêàåì ïðîãðàììó ïîñò ïðîöåññîðà
_,_,_,_,flux_re,_ = mo_getcircuitproperties(coil_name) -- ïîëó÷àåì äàííûå ñ êàòóøêè
local Fi1 = flux_re -- ìàãíèòíûé ïîòîê ïðè I=I+0.001*I, dI=0.001*I
Fii = (Fi1 - Fi0) / (0.001 * I) -- Ðàññ÷èòûâàåì dFi/dI
local apuli = Force / result.m_puli -- Óñêîðåíèå ïóëè, Ìåòð/ñåêóíäà^2
local dx = result.vel * dt -- Ïðèðàùåíèå êîîðäèíàòû, ìåòð (èñïðàâëåíîå)
x = x + dx -- Íîâàÿ ïîçèöèÿ ïóëè
result.vel = result.vel + apuli * dt -- Ñêîðîñòü ïîñëå ïðèðàùåíèÿ, ìåòð/ñåêóíäà
if result.v_max < result.vel then result.v_max = result.vel end
mi_selectgroup(1) -- Âûäåëÿåì ïóëþ
mi_movetranslate(0, -dx * 1000) -- Ïåðåìåùàåì å¸ íà dx
mi_modifycircprop(coil_name, 1, I) -- Óñòàíàâëèâàåò òîê
mi_analyze(1) -- àíàëèçèðóåì (ñêðûâàÿ îêíî àíàëèçà "1")
mo_reload() -- ïåðåçàïóñêàåì ïðîãðàììó ïîñò ïðîöåññîðà
mo_groupselectblock(1)
_,_,_,_,flux_re,_ = mo_getcircuitproperties(coil_name) -- ïîëó÷àåì äàííûå ñ êàòóøêè
local Fi0 = flux_re -- ìàãíèòíûé ïîòîê
mi_modifycircprop(coil_name, 1 , I * 1.001) -- Óñòàíàâëèâàåò òîê, óâåëü÷åííûé íà 1.001
mi_analyze(1) -- àíàëèçèðóåì (ñêðûâàÿ îêíî àíàëèçà "1")
mo_reload() -- ïåðåçàïóñêàåì ïðîãðàììó ïîñò ïðîöåññîðà
current_re,_,_,_,flux_re,_ = mo_getcircuitproperties(coil_name) -- ïîëó÷àåì äàííûå ñ êàòóøêè
Fi1 = flux_re -- ìàãíèòíûé ïîòîê ïðè I=I+0.001*I, dI=0.001*I
-- Ðàññ÷èòûâàåì dFi/dI
Fif = (Fi1 - Fi0) / (0.001 * I)
-- Ðàññ÷èòûâàåì dL
local dL=Fif-Fii
-- Ðàñ÷èòûâàåì òîê è íàïðÿæåíèå íà êîíäåíñàòîðå
I = I + dt * (Uc - I * result.r - I * dL / dt) / Fii
-- Îãðàíè÷èâàåì òîê, åñëè âûñòàâëåíà ñîîòâåñòâóþùàÿ íàñòðîéêà
if config.i_max and (config.i_max > 0.1) and (I > config.i_max) then I = config.i_max end
Uc = Uc - dt * I / c
if Uc < 0 then Uc = 0 end --åñëè ñòîèò ïàðàëåëüíûé äèîä
-- çàïèñûâàåì äàííûå â ìàññèâ
local res_item = {}
res_item.i = I
res_item.f = Force
res_item.vel = result.vel
res_item.x = x*1000
res_item.t = result.t*1000000
res_item.u = Uc
res_item.l = 1000000 * flux_re / current_re
result.items[kc] = res_item
kc = kc + 1
-- Ïðîâåðêà, íå ïîðà ëè îñòàíîâèòü ñèìóëÿöèþ:
-- ... çàêîí÷èëñÿ òîê
if I <= 0 then have_to_stop = 1 end
-- ... ïóëÿ ïîëåòåëà â îáðàòíóþ ñòîðîíó
if result.vel < 0 then have_to_stop = 1 end
-- ... ïóëÿ âûëåòåëà çà ïðåäåëû êàòóøêè è ñèëà î÷åíü ìàëåíüêàÿ
if (x > end_x) and (Force < 0) then have_to_stop = 1 end
-- ... ïóëÿ âûëåòåëà íàçàä
if x < 0 then have_to_stop = 1 end
-- ... ðåæèì "òðàíçèñòîð" è ïóëÿ íà÷àëà òîðìîçèòüñÿ
if (config.mode > 0) and (result.vel < result.v_max) then have_to_stop = 1 end
until have_to_stop ~= 0
result.f_aver = result.f_aver / (dt * kc)
result.e_puli = (result.m_puli * result.vel^2) / 2
result.e_puli0 = (result.m_puli * config.vel0^2) / 2
result.e_c0 = (c * config.u^2) / 2
result.e_c = (c * Uc^2) / 2
result.de_puli = result.e_puli - result.e_puli0
result.de_c = result.e_c0 - result.e_c
result.eff = result.de_puli * 100 / result.de_c
result.stop_date = date()
-- Óäàëÿåì ïðîìåæóòî÷íûå ôàéëû
remove ("temp.fem")
remove ("temp.ans")
mi_close()
return result
end
----[ Çàïèñü ïîëó÷åííûõ ðåçóëüòàòîâ â ôàéë ]---------------------------------------------------------------------------
function save_result_to_file(file_name, config, result)
local handle = openfile(file_name, "a")
function save(text) write (%handle, text .. "\n") end
save("------------------------------------------------------------")
save(format("Íà÷àëî ðàñ÷¸òà %s", result.start_date))
save(format("Êîíåö ðàñ÷¸òà %s", result.stop_date))
save(format("Âåðñèÿ ñêðèïòà %i", vers))
save(format("Îáùåå âðåìÿ, ìèêðîñåêóíä = %i", result.t*1000000))
save(format("Èíòåðâàë ðàñ÷¸òà, ìêñ = %i", config.delta_t))
save(format("¨ìêîñòü êîíäåíñàòîðà, ìêÔ = %.1f", config.c))
save(format("ESR êîíäåíñàòîðà, Îì = %.2f", config.r_cc))
save(format("Íà÷àëüíîå íàïðÿæåíèå,  = %.1f", config.u))
save(format("Îáùåå ñîïðîòèâëåíèå, Îì = %.3f", result.r))
save(format("Âíåøíåå ñîïðîòèâëåíèå, Îì = %.3f", result.r_v))
save("\n----- ÏÐÎÂÎÄ ---------------------------------------------")
save(format("Ñîïðîòèâëåíèå îáìîòêè, Îì = %.3f", result.r_kat))
save(format("Êîëè÷åñòâî âèòêîâ = %i", result.n))
save(format("Äèàìåòð ïðîâîäà, ìì = %.2f", config.d_pr))
save(format("Îáùàÿ äëèíà ïðîâîäà, ì = %.1f", result.dl_provoda))
save("\n----- ÊÀÒÓØÊÀ --------------------------------------------")
save(format("Äëèíà êàòóøêè, ìì = %.1f", config.l_kat))
save(format("Âíåøíèé äèàìåòð êàòóøêè, ìì = %.1f", config.d_kat))
save(format("Èíäóêòèâíîñòü êàòóøêè â ñòàðò. ïîçèöèè, ìêÃí = %.1f", result.l*1000000))
save(format("Òîëùèíà êîðïóñà âíåøíåãî ìàãíèòîïðîâîäà, ìì = %.1f", config.l_mag))
save(format("Òîëùèíà âåðõ. ù¸÷êè ìàãíèòîïðîâîäà, ìì = %.1f", config.l_mag_top))
save(format("Òîëùèíà íèç. ù¸÷êè ìàãíèòîïðîâîäà, ìì = %.1f", config.l_mag_bot))
save(format("Âíóòðåííèé äèàìåòð êàòóøêè, ìì = %.1f", config.d_stv))
save("\n----- ÏÓËß --------------------------------------------")
save(format("Ìàññà ïóëè áåç îïåðåíèÿ, ã = %.2f", result.m_puli*1000-config.nagr))
save(format("Äëèíà ïóëè, ìì = %.1f", config.l_puli))
save(format("Äèàìåòð ïóëè, ìì = %.1f", config.d_puli))
save(format("Ãëóáèíà îòâåðñòèÿ â ïóëå, ìì = %.1f", config.l_otv))
save(format("Äèàìåòð îòâåðñòèÿ, ìì = %.2f", config.d_otv))
save(format("Ìàññà îïåðåíèÿ, ã = %.2f", config.nagr))
save(format("Ìàññà ïóëè âìåñòå ñ îïåðåíèåì, ã = %.2f", result.m_puli*1000))
save(format("Ñòàðòîâàÿ ïîçèöèÿ ïóëè, ìì = %.1f", config.l_sdv))
save("\n----- ÝÍÅÐÃÈß ------------------------------------------")
save(format("Ýíåðãèÿ ïóëè íà÷àëüíàÿ, Äæ = %.1f", result.e_puli0))
save(format("Ýíåðãèÿ ïóëè êîíå÷íàÿ, Äæ = %.1f", result.e_puli))
save(format("Ïðèðàùåíèå ýíåðãèè ïóëè, Äæ = %.1f", result.de_puli))
save(format("Ýíåðãèÿ êîíäåíñàòîðà íà÷àëüíàÿ, Äæ = %.1f", result.e_c0))
save(format("Ýíåðãèÿ êîíäåíñàòîðà êîíå÷íàÿ, Äæ = %.1f", result.e_c))
save(format("Ðàñõîä ýíåðãèè êîíäåíñàòîðà, Äæ = %.1f", result.de_c))
save(format("Ñðåäíÿÿ ñèëà, Í = %.1f", result.f_aver))
save(format("ÊÏÄ, %% = %.2f", result.eff))
save("\n------ ÑÊÎÐÎÑÒÜ ----------------------------------------")
save(format("Íà÷àëüíàÿ ñêîðîñòü ïóëè, ì/ñ = %.1f", config.vel0))
save(format("Êîíå÷íàÿ ñêîðîñòü ïóëè, ì/ñ = %.1f", result.vel))
save(format("Ìàêñèìàëüíàÿ ñêîðîñòü ïóëè, ì/ñ = %.1f", result.v_max))
save("\n------ Data of simulation -------------------------------")
save(" Òîê(À) Íàïð(Â) Ñèëà(Í) Ñêîð.(ì/ñ) Ïîç.(ìì) Âðåì.(ìêñ) Èíä-òü(ìêÃí)")
for i, item in result.items do
save(
format(
"%10.1f %10.1f %10.2f %10.2f %10.3f %10.0f %12.0f",
item.i, item.u, item.f, item.vel, item.x, item.t, item.l
)
)
end
save("\n------ Data for export to Excel sheet --------------------")
save("Ñèëà òîêà (À)\tÍàïðÿæåíèå (Â)\tÑèëà (Í)\tÑêîðîñòü (ì/ñ)\tÏîçèöèÿ x (ìì)\tÂðåìÿ (ìêñ)");
for i, item in result.items do
save(item.i .. "\t" .. item.u .. "\t" .. item.f .. "\t" .. item.vel .. "\t" .. item.x .. "\t" .. item.t)
end
closefile(handle)
end
----[ Ôóíêöèÿ, êîòîðàÿ ïûòàåòñÿ íàéòè îïòèìàëüíûå çíà÷åíèÿ äëÿ data, ïåðåáèðàÿ opt_params ]----------------------------
function optimize(data, opt_params, fun, log)
function get_values_str()
local str = ""
for o_name, o_value in %opt_params do
if str ~= "" then str = str .. " " end
str = str .. format("%s=%.3f", o_name, %data[o_name])
end
return str
end
local cache = {}
function get_cached_result()
local key = get_values_str()
if %cache[key] == nil then %cache[key] = %fun(%data) end
return %cache[key]
end
function log_str(str)
if %log == nil then return end
%log(str)
end
function log_cur_values()
local str = get_values_str()
log_str("ïðîáóþ " .. str .. "...")
end
local cur_result = get_cached_result()
log_str("èñõ. ðåçóëüòàò = " .. cur_result .. " äëÿ " .. get_values_str())
while 1 do
local was_optimized = 0
for o_name, o_value in opt_params do
local prev_value = data[o_name]
data[o_name] = data[o_name] + o_value
log_cur_values()
local next_result = get_cached_result()
log_str("ðåçóëüòàò = " .. next_result)
if next_result > cur_result then
log_str("õîðîøî :)")
was_optimized = 1
cur_result = next_result
else
log_str("ïëîõî :(")
data[o_name] = prev_value
opt_params[o_name] = -opt_params[o_name]
data[o_name] = data[o_name] + opt_params[o_name]
log_cur_values()
next_result = get_cached_result()
log_str("ðåçóëüòàò = " .. next_result)
if next_result > cur_result then
log_str("õîðîøî :)")
was_optimized = 1
cur_result = next_result
else
log_str("ïëîõî :(")
data[o_name] = prev_value
end
end
end
if was_optimized == 0 then break end
end
log_str("Ãîòîâî! Îïòèìàëüíûå çíà÷åíèÿ: " .. get_values_str())
end
-- [ Ïîêàçûâàåò è î÷èùàåò êîíñîëü ]------------------------------------------------------------------------------------
function prepare_console()
showconsole()
clearconsole()
end
-- [ Ôóíêöèÿ, êîòîðàÿ ïðîâåðÿåò, åñòü ëè íà äèñêå ôàéë ñ èìåíåì name ]-------------------------------------------------
function file_exists(name)
local f = openfile(name, "r")
if f ~= nil then
closefile(f)
return 1
else
return 0
end
end
----[ Ñîáñòâåííî, âñÿ ðàáîòà ñêðèïòà ]---------------------------------------------------------------------------------
-- ×èòàåì êîíôèã
local conf_file_name=prompt("Ââåäèòå èìÿ ôàéëà äàíûõ, áåç ðàñøèðåíèÿ .txt")
local conf_full_name = conf_file_name .. ".txt"
if file_exists(conf_full_name) == 0 then
prepare_console()
print('Íå íàéäåí ôàéë íàñòðîåê "' .. conf_full_name .. '"')
return
end
local config = read_config_file(conf_full_name)
-- Åñëè íå íàäî íè÷åãî îïòèìèçèðîâàòü
if (config.opt == null) or (config.opt == 0) or (config.opt_params == {}) then
-- Ñîçäà¸ì ïðîåêò
create_project(config)
-- Ñèìóëèðóåì âûñòðåë
local result = simulate(config)
-- Ñîõðàíÿåì ðåçóëüòàòû â ôàéë
local res_file_name = conf_file_name .. "_V=" .. format("%6.2f", result.vel) .. ".txt"
save_result_to_file(res_file_name, config, result)
-- Âûâîäèì èíôîðìàöèþ â êîíñîëü
prepare_console()
print ("-----------------------------------")
print ("Ïîëó÷åííûå äàííûå çàïèñàíû â ôàéë: " .. res_file_name)
-- Îïòèìèçèðóåì ïî config.opt_params
else
prepare_console()
-- Ô-öèÿ, âûïîëíÿþùàÿ âûñòðåë ñ ïàðàìåòðàìè, çàïèñàííûìè â config è âîçâðàùàþùàÿ ïîëó÷åííóþ ñêîðîñòü ïóëè èëè ÊÏÄ
function opt_shot(config)
create_project(config)
local result = simulate(config)
if (config.opt_t == nil) then return result.vel end
return result[config.opt_t]
end
-- Ïîäáèðàåì îïòèìàëüíûå çíà÷åíèÿ
optimize(config, config.opt_params, opt_shot, print)
-- Ñ÷èòàåì åù¸ ðàç ñ îïòèìàëüíûì ðåçóëüòàòîì
create_project(config)
local result = simulate(config)
-- Ñîõðàíÿåì ðåçóëüòàòû â ôàéë
local res_file_name = conf_file_name .. "_Vopt=" .. format("%6.2f", result.vel) .. ".txt"
save_result_to_file(res_file_name, config, result)
-- Âûâîäèì èíôîðìàöèþ â êîíñîëü
print ("-----------------------------------")
print ("Îïòèìèçèðîâàííûå äàííûå çàïèñàíû â ôàéë: " .. res_file_name)
end