大数跨境
0
0

用Python实现喇叭天线设计小工具(四)

用Python实现喇叭天线设计小工具(四) 微波射频网
2021-06-29
0
导读:本节主要介绍主调模块,以及GUI模块的编写。
摘要:本节主要介绍主调模块,以及GUI模块的编写。


调模

终于到了主调模块了,之前的章节主要介绍了参数计算,波导查值,以及HFSS封装和调用等,所有准备工作已就绪,只差一个“主体”将这些模块调用起来,实现这个功能的便是主调模块main.py。

这一步的编写相对比较简单,按我个人习惯,还是采用了面向对象的编程思路,写一个叫Horn的对象,首先通过对象的初始化功能将输入参数导入进来,然后调用“波导查值”模块确定波导尺寸、“参数计算”模块计算喇叭尺寸,再调用“HFSS调用模块”,通过规定一系列建模动作(如第三节所述),完成HFSS建模和运算。

示意代码如下,如果对于建模的动作有不太明白了,请看上一篇文章的讲解。

import paraCalc
import wg
import sim


class Horn:
def __init__(self, freq, HPE, HPH, wg_name=None):
self.freq = freq
self.HPE = HPE
self.HPH = HPH
self.wg_name = wg_name
self.wg_a, self.wg_b, self.horn_a, self.horn_b, self.horn_l = None, None, None, None, None

def wg_size(self):
if self.wg_name is None:
self.wg_a, self.wg_b = wg.check_by_freq(self.freq)
else:
self.wg_a, self.wg_b = wg.check_by_name(self.wg_name)
return self.wg_a, self.wg_b

def para(self):
self.wg_size()
if (self.wg_a or self.wg_b) is None:
print('Input error!')
else:
self.horn_a, self.horn_b, self.horn_l = paraCalc.calc(self.freq, self.HPE, self.HPH, self.wg_a, self.wg_b)

def realize_in_hfss(self):
h = sim.HFSS()

# 设置变量
h.set_variable('wg_a', self.wg_a)
h.set_variable('wg_b', self.wg_b)
h.set_variable('wg_l', self.wg_a*1.5)
h.set_variable('horn_a', self.horn_a)
h.set_variable('horn_b', self.horn_b)
h.set_variable('horn_l', self.horn_l)
h.set_variable('wg_t', 0.5)
h.set_variable('ab', 75/self.freq)

# 波导内腔
h.create_centered_rectangle('wg_a', 'wg_b', 0, 'wg_in')
h.create_centered_rectangle('wg_a', 'wg_b', 'wg_l', 'wg_in_')
h.connect('wg_in', 'wg_in_')

# 喇叭内腔
h.create_centered_rectangle('wg_a', 'wg_b', 'wg_l', 'horn_in')
h.create_centered_rectangle('horn_a', 'horn_b', 'wg_l+horn_l', 'horn_in_')
h.connect('horn_in', 'horn_in_')

# 波导外形
h.create_centered_rectangle('(wg_a+wg_t*2)', '(wg_b+wg_t*2)', '-wg_t', 'wg')
h.create_centered_rectangle('(wg_a+wg_t*2)', '(wg_b+wg_t*2)', 'wg_l', 'wg_')
h.connect('wg', 'wg_')

# 喇叭外形
h.create_centered_rectangle('(wg_a+wg_t*2)', '(wg_b+wg_t*2)', 'wg_l', 'horn')
h.create_centered_rectangle('(horn_a+wg_t*2)', '(horn_b+wg_t*2)', 'horn_l+wg_l', 'horn_')
h.connect('horn', 'horn_')

# 布尔运算生成喇叭,然后设为PEC
h.unite('horn', 'wg')
h.unite('horn_in', 'wg_in')
h.subtract('horn', 'horn_in')
h.set_material('horn')

# 生成区域并赋予辐射边界
h.create_region('ab')
h.assign_radiation_region()
h.insert_radiation_setup()

# 设置端口
h.create_centered_rectangle('wg_a', 'wg_b', 0, 'port')
h.assign_port('port')
h.insert_analysis_setup(self.freq)

# 创建报告
h.create_reports()

# 保存工程并运行
h.save_prj()
h.run()


if __name__ == '__main__':
f, E, H = 10, 30, 20
a_horn = Horn(f, E, H)
a_horn.realize_in_hfss()


以上代码可能没有太多需要解释的,可以看到的是,定义好HFSS接口后,调用过程就很轻松愉快了。

图形交互界面模块

开篇提到过,Python实现图形界面的方法有很多,除了Tkinter属于自带包外,其他著名的包如PyQt、wxPython等都需要额外安装,考虑到我们的小程序功能单一,界面也不需要太花哨,采用Python自带的Tkinter是一种较为经济快捷的选择。

由于第一次写界面,代码质量可能有点差,实现效果也不怎么样,好在我们要做的东西功能简单,不会影响使用。(自我安慰。。。)

不废话,直接上代码。


from tkinter import Tk, Label, StringVar, Entry, Button, Frame, TOP
import main

root = Tk()
root.title('最佳喇叭计算 by kuangzl')
root.geometry('420x280')
root.resizable(width=False, height=False)

tip = Label(root, text='由波束宽度计算喇叭尺寸,\n使得该尺寸下增益最大化', height=3,
font=('Microsoft YaHei UI', 12, 'italic'))
tip.pack(side=TOP)

frm = Frame(root)
frm.pack()

Label(frm, text='中频(GHz):').grid(row=0, column=0)
Label(frm, text='E面(deg):').grid(row=1, column=0)
Label(frm, text='H面(deg):').grid(row=2, column=0)
Label(frm, text='波导宽(mm):').grid(row=0, column=2)
Label(frm, text='波导窄(mm):').grid(row=1, column=2)
Label(frm, text='喇叭宽(mm):').grid(row=2, column=2)
Label(frm, text='喇叭窄(mm):').grid(row=3, column=2)
Label(frm, text='喇叭长(mm):').grid(row=4, column=2)


def calc():
f = float(v1.get())
E = float(v2.get())
H = float(v3.get())
horn = main.Horn(f, E, H)
horn.para()
v4.set(horn.wg_a)
v5.set(horn.wg_b)
v6.set(horn.horn_a)
v7.set(horn.horn_b)
v8.set(horn.horn_l)


def hfss():
f = float(v1.get())
E = float(v2.get())
H = float(v3.get())
horn = main.Horn(f, E, H)
horn.para()
horn.realize_in_hfss()


v1 = StringVar()
Entry(frm, textvariable=v1, width=8).grid(row=0, column=1, padx=10, pady=5)
v2 = StringVar()
Entry(frm, textvariable=v2, width=8).grid(row=1, column=1, padx=10, pady=5)
v3 = StringVar()
Entry(frm, textvariable=v3, width=8).grid(row=2, column=1, padx=10, pady=5)


v4 = StringVar()
Label(frm, textvariable=v4, width=10).grid(row=0, column=3)
v5 = StringVar()
Label(frm, textvariable=v5, width=10).grid(row=1, column=3)
v6 = StringVar()
Label(frm, textvariable=v6, width=10).grid(row=2, column=3)
v7 = StringVar()
Label(frm, textvariable=v7, width=10).grid(row=3, column=3)
v8 = StringVar()
Label(frm, textvariable=v8, width=10).grid(row=4, column=3)

Button(frm, text='calc', command=calc).grid(row=4, column=0)
Button(frm, text='hfss', command=hfss).grid(row=4, column=1)

root.mainloop()


这段代码实现的效果是这样的:

点击hfss按钮以后的效果:
小结

至此,该小程序已经完成了九成以上,作为自用已经毫无问题了!但如果还想将程序分享出来,则须打包成可执行文件(如exe),这一步貌似很简单,却有不少的坑,我将在下一节详细介绍。

本篇即到此为止,下一篇将会是终篇,谢谢各位观看(*^_^*)!

转载自:知乎@况泽灵


系列文章:
用Python实现喇叭天线设计小工具(一)
用Python实现喇叭天线设计小工具(二)
用Python实现喇叭天线设计小工具(三)

原创文章:

Excel也能调用HFSS?

模拟和矢量信号源进阶使用技巧
IQ正交调制器基础知识和测试详解
学个Antenna:Wi-Fi双频金属中框天线
学个Antenna:手机天线之宽带匹配原理
学个Antenna:手机天线入门

学个Antenna:HFSS脚本建模入门

Wi-Fi 6射频技术全面解析及Wi-Fi 7热点技术介绍

无线技术专栏:无线通信信号传输模型

使用矢网测量PA S11、S21和饱和功率的方法

学个Antenna:Matlab天线工具箱知多少(一)

原创干货:使用矢网测量PA S12 S22和功率的方法

ETC 天线技术概览(工作方式、极化方式、实现方式、技术革新点)

附加相位噪声测试方法

4G和5G基站天线工程知识和应用场景

噪声的意义及测量方法

非50欧系统阻抗的S参数测试

交调失真的意义及矢网实例测量方法

增益压缩的意义及矢网实操测量方法

S参数的意义及矢网实例测量方法

学个Antenna:偶极子天线馈电及倒V天线

从电磁波产生到对称阵子天线

张跃平教授:无线电科学与技术中的因子4

【声明】内容源于网络
0
0
微波射频网
专注无线通信、微波射频、天线、卫星通信、雷达、半导体等领域。微波射频产学研交流平台 - 射频行业知名媒体
内容 2527
粉丝 0
微波射频网 专注无线通信、微波射频、天线、卫星通信、雷达、半导体等领域。微波射频产学研交流平台 - 射频行业知名媒体
总阅读1.5k
粉丝0
内容2.5k