综测仪MT8862A控制方法

news2024/11/19 20:46:42

实现自动化控制,本次为大家讲解综测仪MT8862A的控制逻辑。

新建底层控制逻辑

在这里插入图片描述

在文件basis_contorl.py中写入仪器控制底层代码,代码如下:

import tkinter.messagebox
import pyvisa


class InstrumentControl(object):
    inst = None

    def __init__(self, equipment_name: str, equipment_visa: str, visa_dll='c:/Windows/System32/visa32.dll'):
        """
        建立仪器初始对象
        @param equipment_name: 仪器名
        @param equipment_visa: 仪器visa地址
        @param visa_dll: visa.all地址
        """
        try:
            self.rm = pyvisa.ResourceManager(visa_dll)
            print("打开visa32.dll文件成功")
            self.inst = self.open_by_name(equipment_name, equipment_visa)
        except Exception as e:
            tkinter.messagebox.showerror('错误', '在{}中找不到visa32.dll,请确认正确安装了NI-MAX和驱动')
            print(f"打开visa32.dll文件失败, 报错原因:{e}")
        pass

    def open_by_name(self, device_name, gpib_ip):
        """
        仪表通讯
        @param device_name:
        @param gpib_ip:
        @return: 仪器控制对象
        """
        self.inst = self.rm.open_resource(gpib_ip)
        print(self.inst)
        print("打开资源:" + gpib_ip)
        query_name_str = self.command_query("*IDN?")
        print("查询名称为:" + query_name_str)
        if device_name in query_name_str:
            print("打开仪表成功,打开的是:" + device_name)
            print("打开仪表成功,打开的是:" + device_name)
            return self.inst
        return self.inst

    def command_write(self, write_cmd):
        """
        命令写入
        @param write_cmd: 写入指令
        @return: 执行结果
        """
        print("执行了写入指令:" + write_cmd)
        ret_res = self.inst.write(write_cmd)
        print("返回了:" + str(ret_res))
        return ret_res

    def command_read(self, read_cmd):
        """
        命令读取
        @param read_cmd: 读取指令
        @return: 读取信息
        """
        print("执行了读取指令:" + read_cmd)
        ret_res = self.inst.read(read_cmd)
        print("返回了:" + str(ret_res))
        return ret_res

    def command_query(self, query_cmd):
        """
        命令查询
        @param query_cmd: 查询指令
        @return: 查询信息
        """
        print("执行了查询指令:" + query_cmd)
        ret_res = self.inst.query(query_cmd).replace('\n', '')
        print("返回了:" + str(ret_res))
        return ret_res

编写好底层控制代码,在文件instrument_MT8862A.py写入综测仪MT8862A的控制指令,代码如下:

from instrument_control.basis_contorl import InstrumentControl


class MT8862A(InstrumentControl):
    def __init__(self, equipment_name: str, equipment_visa: str):
        super(MT8862A, self).__init__(equipment_name, equipment_visa)

    def reset_inst(self):
        """
        初始化仪表
        """
        self.command_write('*RST;*OPC?')
        self.command_write('*CLS;*OPC?')
        self.command_write('NWTYPE AP;*OPC?')
        self.command_write('MODE RXMODE;*OPC?')
        self.command_write('ILVL 12;*OPC?')
        self.command_write('OLVL -50;*OPC?')

    def query_equipment(self):
        """
        查询设备的sn
        :return: 设备sn
        """
        result = self.command_query("*IDN?")
        return result

    def set_ppuu_type(self, ppuu_type: str, standard: str):
        """
        设置带宽
        @param ppuu_type: 20MHZ
        @param standard: 测试制式
        """
        self.command_write(f"PPDUTYPE_{standard.upper()} {ppuu_type};*ESR?")

    def query_ppuu_type(self, standard: str):
        """
        查询带宽
        @return: 查询结果
        @param standard: 测试制式
        """
        result = self.command_query(f"PPDUTYPE_{standard.upper()}?;*ESR?")
        return result

    def set_mcs_index(self, mcs_index: str, standard: str):
        """
        设置速率
        @param mcs_index: 0,1。。。。。
        @param standard: 测试制式
        """
        self.command_write(f"MCSINDEX_{standard.upper()} {mcs_index};*ESR?")

    def query_mcs_index(self, standard: str):
        """
        查询速率
        @return: 查询结果
        @param standard: 测试制式
        """
        result = self.command_query(f"MCSINDEX_{standard.upper()}?")
        return result

    def set_channel_band(self, channel_band: str, standard: str):
        """
        设置2/5g信道或6g信道
        @param channel_band: 6G,2PT4G_5G
        @param standard: 测试制式
        """
        self.command_write(f"CHANNELBAND_{standard.upper()} {channel_band};*ESR?")

    def query_channel_band(self, standard: str):
        """
        查询信道模式
        @return: 查询结果
        @param standard: 测试制式
        """
        result = self.command_query(f"CHANNELBAND_{standard.upper()}?")
        return result

    def set_wifi_ssid(self, wifi_ssid):
        """
        设置WiFi的ssid
        @param wifi_ssid: WiFi名字
        """
        self.command_write(f"NWSSID {wifi_ssid}")

    def query_wifi_ssid(self):
        """
        查询WiFi的ssid
        @return: 查询结果
        """
        result = self.command_query(f"NWSSID?")
        return result

    def set_security_type(self, security_type: str):
        """
        设置加密方式
        @param security_type:WPA3
        """
        self.command_write(f"SECURITY_TYPE_AP {security_type};*ESR?")

    def query_security_type(self):
        """
        查询加密方式
        @return: 查询结果
        """
        result = self.command_query("SECURITY_TYPE_AP?")
        return result

    def set_psk_passphrase(self, psk_passphrase: str):
        """
        设置密码
        @param psk_passphrase: 12345678
        """
        self.command_write(f'SECURITY_PSKPASSPHRASE_WPA3_AP "{psk_passphrase}";*ESR?')

    def query_psk_passphrase(self):
        """
        查询密码
        @return: 查询结果
        """
        result = self.command_query("SECURITY_PSKPASSPHRASE_WPA3_AP?")
        return result

    def set_country_state(self, country_state: str):
        """
        设置是否支持国家码
        @param country_state: ENABLE
        """
        self.command_write(f"COUNTRY_STATE {country_state};*ESR?")

    def query_country_state(self):
        """
        查询是否支持国家码
        @return:
        """
        result = self.command_query("COUNTRY_STATE?")
        return result

    def set_country_code_mode(self, country_code_mode: str):
        """
        设置国家码模式
        @param country_code_mode: STR
        """
        self.command_write(f"COUNTRY_REGION_MODE {country_code_mode};*ESR?")

    def query_country_code_mode(self):
        """
        查询国家码模式
        """
        result = self.command_query(f"COUNTRY_REGION_MODE?")
        return result

    def set_country_code_one(self, country_code: str):
        """
        设置国家码
        @param country_code: CN
        """
        self.command_write(f"COUNTRY_REGION {country_code};*ESR?")

    def query_country_code_one(self):
        """
        查询国家码
        """
        result = self.command_query(f"COUNTRY_REGION?")
        return result

    def set_loss_state(self, state: str):
        """
        设置线损开关状态
        @param state: 开:ON  关:OFF
        """
        self.command_write(f'EXTLOSSW {state}')

    def set_rate_11g(self, rate: int):
        """
        设置802.11g速率
        @param rate: 速率
        """
        self.command_write(f'DATARATE_G {rate}')

    def set_rate_11b(self, rate):
        """
        设置802.11b速率
        @param rate: 速率
        """
        self.command_write(f'DATARATE_B {rate}')

    def set_rate_11a(self, rate):
        """
        设置802.11a速率
        @param rate: 速率
        """
        self.command_write(f'DATARATE_A {rate}')

    def set_wifi_system(self, tech: str):  # 11a-5G 11b-2g
        """
        设置制式
        @param tech: 802.11a:A, 802.11b:B, 802.11g:G, 802.11n:N, 802.11ac:AC, 802.11ax:AX
        """
        cmd = 'WLANSTD {}'.format(str(tech).upper())
        self.command_write(cmd)

    def query_wifi_system(self):
        """
        查询设置制式
        @return: 返回制式
        """
        result = self.command_query("WLANSTD?")
        return result

    def set_rx_or_tx_mode(self, mode: str):
        """
        更改RX mode或TX mode
        @param mode: tx:TXMODE rx:RXMODE
        """
        self.command_write('MODE {}'.format(mode))

    def set_data(self):
        """
        更新目标参数
        """
        cmd = "NWUPDATE;*ESR?"
        self.command_write(cmd)

    def set_channel(self, ch: int):
        """
        频段设置
        @param ch: 测试频段
        """
        cmd = 'CHANNELNUM {}'.format(str(ch))
        self.command_write(cmd)

    def set_start_and_end_level(self, start_level: str, end_level: str):
        """
        设置start_level 和 end_level
        @param start_level: 起始电平值
        @param end_level: 结束电平值
        """
        self.command_write(f'RXSEARCH_LVL {start_level},{end_level}')

    def set_output_level_one(self, level: str):
        """
        设置输出电平
        @param level: 电平值
        """
        self.command_write(f"OLVL {level};*ESR?")

    def query_output_level_one(self):
        """
        查询电平值
        @return:
        """
        result = self.command_query("OLVL?;*ESR?")
        return result

    def set_input_level_one(self, level: str):
        """
        设置输入电平
        @param level: 电平值
        """
        self.command_write(f"ILVL {level};*ESR?")

    def query_input_level_one(self):
        """
        查询电平值
        @return:
        """
        result = self.command_query("ILVL?;*ESR?")
        return result

    def set_primary_channel(self, primary_channel: str):
        """
        设置测试信道
        @param primary_channel: 0,1.。。。
        """
        self.command_write(f"CHANNELNUM {primary_channel};*ESR?")

    def query_primary_channel(self):
        """
        查询测试信道
        @return: 查询结果
        """
        result = self.command_query("CHANNELNUM?;*ESR?")
        return result

    def set_assign_ip_address(self, assign_ip_address: str):
        """
        设置assign_ip_address
        @param assign_ip_address: MANUAL
        """
        self.command_write(f"IPPROP {assign_ip_address};*ESR?")

    def query_assign_ip_address(self):
        """
        查询assign_ip_address
        @return: 查询结果
        """
        result = self.command_query("IPPROP?")
        return result

    def set_dut_ip_address(self, dut_ip_address: str):
        self.command_write("")

    def set_anti_seize(self):
        """
        卡住重连
        """
        self.command_write("ABORT;*ESR?")
        self.command_write("DISCONNECT;*ESR?")

    def get_ack(self):
        """
        查询PER(丢包率)测量值
        @return: 丢包率
        """
        ret = self.command_query('MEAS_PER?').split(',')[1]
        return ret

    def check_connect(self):
        """
        查询wifi连接状态
        @return: Idle:0 Scanning:2 Connecting:6 Connected:7 Disable:9
        """
        try:
            ret = self.command_query('NWSTAT?').replace('\r', '')
        except:
            ret = None
        return ret

    def set_pkt(self, pkt: int):
        """
        设置执行PER测试时MT8862A传输的数据包数
        @param pkt: 数据包数
        """
        self.command_write('PERPKTS {}'.format(pkt))

    def single_on(self):
        """
        发射WIFI信号 (前提需要先连接上仪表WIFI 带8862A字样)
        """
        self.command_write('SNGLS')

    def query_pkt_statue(self):
        """
        查询测试状态
        @return: 测试状态
        """
        pkt_statue = self.command_query("MPSTAT?")
        return pkt_statue

    def query_test_statue(self):
        """
        查询测试状态
        @return: 测试状态
        """
        test_statue = self.command_query("MSTAT?")
        return test_statue

    def set_test_step(self, step: str):
        """
        设置测试步进
        @param step: 测试步进
        """
        self.command_write("RXSEARCH_STEP {}".format(step))

    def query_test_step(self):
        """
        查询测试步进
        @return: 测试步进
        """
        result = self.command_query("RXSEARCH_STEP?")
        return result

    def query_line_loss(self):
        """
        查询输出电损
        @return: 输出电损
        """
        result = self.command_query("LOSSTBLVAL_LIST?")
        return result

    def set_loss(self, loss_value: float, cent_freq: int, port: str):
        """
        设置对应频段线损
        :param loss_value: 线损值
        :param cent_freq: 测试频段
        :param port: 输出端口,Main1或Main2
        """
        if 'MAIN1' in port:
            self.command_write(f'LOSSTBLVAL_LIST {cent_freq}MHZ,{loss_value},{loss_value},0.00,0.00,0.00;*ESR?')
        else:
            self.command_write(f'LOSSTBLVAL_LIST {cent_freq}MHZ,0.00,0.00,0.00,{loss_value},{loss_value};*ESR?')

    def set_lvl_status(self, status: str):
        """
        设置lvl状态
        @param status: ON为开,OFF为关
        """
        self.command_write(f"LVL {status};*ESR?")

    def disconnect_wifi(self):
        """
        断开WiFi
        """
        self.command_write("DISCONNECT;*ESR?")

    def set_wifi_sign(self):
        self.command_write("TRGSRC COM;*ESR?")
        self.command_write("COMTRGMODE MODE3;*ESR?")
        self.command_write("TXDATARATE_CTRL MODEB;*ESR?")

    def set_output_port(self, port: str):
        """
        设置输出端口
        @param port:
        """
        self.command_write(f"PORT MAIN{port};*ESR?")

    def query_output_port(self):
        """
        查询输出端口
        @return: 返回端口结果
        """
        result = self.command_query(f"PORT?")
        return result

控制仪器时先设置控制对象,具体例子如下:

    set_equipment_name = "MT8862A"
    set_equipment_visa = "仪器的GPIB地址"
    d66319_object = MT8862A(equipment_name=set_equipment_name, equipment_visa=set_equipment_visa)

关于综测仪MT8862A的控制方法就到这里了,博主后续还会更新不同仪器的控制方法,各位敬请期待吧,有疑问欢迎找博主解答,我是活动的笑脸。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Flutter混淆工具提高应用的反编译难度

在移动应用开发中,保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具,帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆,并提供了相关的操作步骤和注意事项。 📝 摘要 本…

C# 委托的基础应用

一、Action 和 Func 的使用。 二、自定义委托: 完整的使用代码示例: 三、委托的一般使用 模板方法: 回调方法,在模板方法的基础上进行添加。

使用向量检索和rerank 在RAG数据集上实验评估hit_rate和mrr

文章目录 背景简介代码实现自定义检索器向量检索实验向量检索和rerank 实验 代码开源 背景 在前面部分 大模型生成RAG评估数据集并计算hit_rate 和 mrr 介绍了使用大模型生成RAG评估数据集与评估; 在 上文 使用到了BM25 关键词检索器。接下来,想利用向…

Filter

概念:Filter表示过滤器,是JavaWeb三大组件(Servlet,Filter,Listener)之一 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 过滤器一般完成一些通用的操作,比如:权限控…

元宇宙虚拟空间的场景渲染(五)

前言 该文章主要讲元宇宙虚拟空间的场景渲染,基本核心技术点,不多说,直接引入正题。 场景渲染 下面第二个图中的代码是一个循环渲染逻辑,首先getDelta 获取2次时间的时间间隔,requestAnimationFrame请求我们的一个动…

mbti,INTJ型人格的心理问题分析

什么是INTJ型人格? INTJ来自mbti职业性格测试,16种人格类型之一,INTJ分别代表内向,直觉,理智,独立,而INTJ型人格是一种以冷静和理性著称的人格,这种人格的人总给人一种比较理智&…

【【萌新的学习之Numpy数组的使用】】

萌新的学习之Numpy数组的使用 先记录一下之前的关于函数的设计 通过创造类的形式 复习完毕之后介绍numpy数组的使用 #整数型数组遇到除法 (即便是除以整数) 不同维度的数组之间 从外形上的本质区别 一维数组用1层中括号 二维数组用2层中括号 三维数…

golang设计模式图解——命令模式

设计模式 GoF提出的设计模式有23个,包括: (1)创建型(Creational)模式:如何创建对象; (2)结构型(Structural )模式:如何实现类或对象的组合; (3&a…

docker 部署 dujiaoka 独角数卡自动售货系统 支持 X86 和 ARM 架构

前言 很早就想部署一套自己的发卡自动售货系统,研究了很久发现独角数卡相对更加成熟好用,可是折腾技术三年多最怕的就是php和Laravel之类的语言和框架,各种权限,守护之类配置麻烦,加上如果跑在docker里更加头疼&#…

Android 的网络加载

发起网络请求的过程 当用户在应用程序中输入网址或关键字时,应用程序会发起网络请求。这个过程大致如下: 应用程序将请求发送到服务器,服务器返回响应数据。应用程序接收到响应数据后,将其转换为应用程序可识别的数据格式。应用…

Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题

文章目录 前言一、需要实现的效果如下二、flutter实现代码如下:总结 前言 最近写flutter项目,遇到NestedScrollView与TabBar双列表滚动位置同步问题,下面是解决方案,希望帮助到大家。 一、需要实现的效果如下 1、UI图&#xff1…

程序汪5万接的公交车板打车小程序,开发周期40天(发布版

本项目来自程序汪背后的私活小团队,开发了一个打车小程序,给粉丝分享一下解决方案,本项目前端工作量比较大,希望给想接私活的朋友一些经验参考 视频版本 在 B站【我是程序汪】 目录 一、项目构成 二、开发人员 三、项目背景 四…

Redis数据库的入门学习

关系型数据库和非关系型数据库的区别: 简介 Redis数据库和MySql数据库的区别:Redis数据库是基于内存的key-value结构的数据库。本质上是内存存储。 而MySql数据库是通过数据文件的方式存在磁盘当中,本质上是磁盘存储。且MySql当中是通过二维…

2-3多交换机静态流表控制原理与实现

实现目标环境下的静态流表设置: 1 单个ovs上实现多个主机hosts之间的通信 2多ovs上多主机之间的通信 1 单个ovs上实现多个主机hosts之间的通信 使用函数定义的方式创建一个如下的拓扑,并使用静态流表 from mininet.net import Mininet from mininet.n…

ENSP防火墙,解决不兼容及报错等问题,windows命令行修改网卡配置,配置cloud及防火墙连接,web连接防火墙

解决不兼容和报错等问题 原因1:VirtualBox版本太低(5.1.x)或太高(6.x.x)和eNSP不兼容 卸载virtualbox,下载virtualbox 5.2.28,安装稳定版本的virtualbox 删除原有程序:c:\用户\***\.…

Qt报错:C1083 无法打开包括文件: No such file or directory

我用的是VS2019 添加了一个继承自QTextEdit 的新类QMsgTextEdit, 就出现了这样的报错: 我双击ui_TalkWindow.h, 打开这个文件后, 发现: 我就试着打开qmsgtextedit.h,发现: 于是,我就在当前ui_TalkWindow.h文件的目…

数据可视化-地图可视化-Python

师从黑马程序员 基础地图使用 基础地图演示 视觉映射器 具体颜色对应的代码可以在http://www.ab173.com/中查询RGB颜色查询对照表 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts#准备地图对象 mapMap() #准备数据 data[("北京",…

数据结构学习——栈和队列

1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 …

YOLOv5实战记录05 Pyside6可视化界面

个人打卡,慎看。 指路大佬:【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后,无法pip install了。解决如下: activate.bat中修改…

关系型数据库与非关系型数据库、Redis数据库

相比于其他的内存/缓存数据库,redis可以方便的实现持久化的功能(保存至磁盘中) 一、关系数据库与非关系型数据库 1.1 关系型数据库 一个结构化的数据库,创建在关系模型基础上一般面向于记录 SQL语句 (标准数据查询语言) 就是一种…