0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

跑马灯是什么 如何用HFSS来跑马灯

ExMh_zhishexues 来源:微波射频网 作者:94巨蟹座少年 2021-08-13 11:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

学个Antenna是以天线仿真和调试为主,理论原理为辅的干货天线技术专栏,包括天线入门知识以及各类天线的原理简介、仿真软件建模、设计、调试过程及思路。如有想看到的内容或技术问题,可以在文尾写下留言。

摘要:

经过前面两期的教学HFSS-API入门第一弹,第二弹,已经可以完成部分常规的建模需求。本期整点好玩的,用HFSS来跑马灯。欢迎小伙伴们阅读、分享、再看,转发给更多有需要的人!喜欢的小伙伴可赞赏下作者哦。

本文使用的软件为MATLAB2019a和AnsysEM 18.2

0 1简单介绍

常规的跑马灯,是指将多个发光二极管分别连接到单片机的某一并行端口处,通过编程控制这几个发光二极管依次点亮。

在HFSS-API入门第一弹:画个Box中对hfssBox函数的使用进行了详细介绍,如果再加上修改Box的颜色的透明度,加上延时操作,就可以利用MATLAB编写vbs脚本,在HFSS中Run Script实现“跑马灯”效果。

0 2修改颜色和透明度函数

接下来先介绍修改物体颜色和透明度的函数:hfssSetColor,hfssSetTransparency。

% hfssSetColor(fid, ObjectName, Color)% ObjectName:需要修改颜色的物体对应的名字.% Color:RGB三色值.% 实例:% hfssSetColor(fid, ‘Box1’, [255, 255, 0]);

% hfssSetTransparency(fid, ObjectName, Value)% ObjectName:需要修改颜色的物体对应的名字.% Value:透明度值,在0到1之间;0代表完全不透明,1代表完全透明.% 实例:% hfssSetTransparency(fid,‘Box1’, 0)

这两个函数的使用自然是很简单。压缩的GIF动图预览如下:

5700dbae-fbe4-11eb-9bcf-12bb97331649.gif

那么这个效果是如何实现的呢?

新建工程,新建设计文件,定义变量,画Box,这四个常规步骤是很容易做到的,hfssSetColor和hfssSetTransparency这两个函数也可以对物体的颜色和透明度进行二次修改。剩下需要做的就是在vbs中进行延时,以及控制鼠标左键在非模型区域点击一下,使得物体不处于高亮状态,便于观察变色效果。

首先需要解决的延时问题,网络上随手搜索关键词vbs延时函数,可以找到wscript.sleep这个函数用法:

用法:Times为延迟时间(单位:毫秒)wscript.sleep Times

新建一个txt文件,将后缀改为vbs,然后用记事本打开复制粘贴下面代码:

wscript.sleep 1000msgbox(“Hello”)wscript.sleep 1000msgbox(“This World!”)

单独运行时正常可用的。

说明HFSS的vbs脚本中不支持该函数方法,联想到单片机中的delay函数都是自己写的,于是也在MATLAB里手撸了一个大概的延时函数:

% 延时函数的编写fprintf(fid, ‘Sub delay(ms)

’);fprintf(fid, ‘ Dim i,value

’);fprintf(fid, ‘ for i=1 to 7500*ms

’);fprintf(fid, ‘ value=i+1

’);fprintf(fid, ‘ next

’);fprintf(fid, ‘End Sub

’);

然后我们需要解决vbs脚本中控制鼠标左键点击的需求,这里也是一样百度关键词vbs模拟鼠标按键,找到下面的网站:

https://www.cnblogs.com/jinjiangongzuoshi/p/3821375.html

经过拆解分析后,转化为自己可使用的封装代码。

Class SetMouseprivate Sprivate xls, wbk, module1private reg_key, xls_code, x, yPrivate Sub Class_Initialize() Set xls = CreateObject(“Excel.Application”) Set S = CreateObject(“wscript.Shell”) reg_key = “HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM” reg_key = Replace(reg_key, “$”, xls.Version) S.RegWrite reg_key, 1, “REG_DWORD” xls_code = _ “Private Type POINTAPI : X As Long : Y As Long : End Type” & vbCrLf & _ “Private Declare Function SetCursorPos Lib ”“user32”“ (ByVal x As Long, ByVal y As Long) As Long” & vbCrLf & _ “Private Declare Function GetCursorPos Lib ”“user32”“ (lpPoint As POINTAPI) As Long” & vbCrLf & _ “Private Declare Sub mouse_event Lib ”“user32”“ Alias ”“mouse_event”“ ” _ & “(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)” & vbCrLf & _ “Public Function getx() As Long” & vbCrLf & _ “Dim pt As POINTAPI : GetCursorPos pt : getx = pt.X” & vbCrLf & _ “End Function” & vbCrLf & _ “Public Function gety() As Long” & vbCrLf & _ “Dim pt As POINTAPI: GetCursorPos pt : gety = pt.Y” & vbCrLf & _ “End Function” Set wbk = xls.Workbooks.Add Set module1 = wbk.VBProject.VBComponents.Add(1) module1.CodeModule.AddFromString xls_codeEnd SubPrivate Sub Class_Terminate xls.DisplayAlerts = False wbk.Close xls.QuitEnd SubPublic Sub getpos( x, y) x = xls.Run(“getx”) y = xls.Run(“gety”)End SubPublic Sub move(x,y) xls.Run “SetCursorPos”, x, yEnd SubPublic Sub clik(keydown) Select Case UCase(keydown) Case “LEFT” xls.Run “mouse_event”, &H2 + &H4, 0, 0, 0, 0 Case “RIGHT” xls.Run “mouse_event”, &H8 + &H10, 0, 0, 0, 0 Case “MIDDLE” xls.Run “mouse_event”, &H20 + &H40, 0, 0, 0, 0 Case “DBCLICK” xls.Run “mouse_event”, &H2 + &H4, 0, 0, 0, 0 xls.Run “mouse_event”, &H2 + &H4, 0, 0, 0, 0 End SelectEnd SubEnd Class

由于这段代码过长,直接在MATLAB中用fprintf写入到vbs脚本得一行一行处理,于是将其单独复制到一个mouse_control.txt文件里,通过MATLAB的读写文件操作,将这段代码追加写入到vbs脚本文末,作为可调用的函数进程。

上面代码第8行之所以是双斜杠,是为了将单斜杠写入到vbs脚本中。

reg_key = “HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM”

有了上面的代码后,鼠标点的移动和左键点击事件可以在MATLAB中写入:

fprintf(fid, ‘Set mouse=New SetMouse

’);fprintf(fid, ‘% move后面是电脑鼠标需要移动的坐标点,通过mousexy确定坐标点fprintf(fid, ’mouse.move 1678,575

‘);fprintf(fid, ’delay(500)

‘);fprintf(fid, ’mouse.clik “dbclick”

‘);fprintf(fid, ’delay(500)

‘);fprintf(fid, ’

‘);

用MATLAB进行整体的vbs脚本写入,整段代码如下所示,可在文末下载链接下载。

clear;clc;path = mfilename(’fullpath‘);i=strfind(path,’‘);path=path(1:i(end));cd(path);addpath(genpath(strcat(path,’hfssapi-by-Jianhui Huang‘)));try % 填写路径 % tmpPrjFile:生成的aedt或者hfss(安装hfss15以下的后缀名为.hfss)项目文件的路径名 % tmpScriptFile:生成的vbs脚本文件的路径名 tmpPrjFile = ’F:vbsScripthorse_race_lamp.aedt‘; tmpScriptFile = ’F:vbsScriptauto_code.vbs‘;

% hfssExePath:HFSS软件的路径 hfssExePath = ’D:softwareHFSS15AnsysEM18.2Win64ansysedt.exe‘;

% 创建一个可读写vbs脚本文件。 fid = fopen(tmpScriptFile, ’wt‘);

%创建一个新的HFSS项目并插入一个新的设计文件。 hfssNewProject(fid); Design_name=’example‘; hfssInsertDesign(fid, Design_name); Box_W=1;Box_L=1;Box_H=1; % hfssVariableInsert(fid,DesignName,variableName, value, units,flag) hfssVariableInsert(fid,Design_name,’Box_W‘, Box_W, ’mm‘,1); hfssVariableInsert(fid,Design_name,’Box_L‘, Box_L, ’mm‘,1); hfssVariableInsert(fid,Design_name,’Box_H‘, Box_H, ’mm‘,1); % 画Box % hfssBox(fid, BoxName, Start, Size, Units, Color, Material, Transparency, flag) hfssBox(fid, ’Box1‘, {’-Box_W/2‘, ’-Box_L/2‘, ’0mm‘}, {’Box_W‘, ’Box_L‘, ’Box_H‘}, ’mm‘,。。。 “(0 128 128)”, “Rogers RO4350 (tm)”, 0, 2); % 点击鼠标左键 fprintf(fid, ’

‘); fprintf(fid, ’Set mouse=New SetMouse

‘); fprintf(fid, ’mouse.getpos x,y

‘); fprintf(fid, ’mouse.move 1678,575

‘); fprintf(fid, ’delay(500)

‘); fprintf(fid, ’mouse.clik “dbclick”

‘); fprintf(fid, ’delay(500)

‘); fprintf(fid, ’

‘); % 跑马灯 for num=0:20 hfssSetColor(fid, ’Box1‘, [randi(255,1), randi(255,1), randi(255,1)]); fprintf(fid, ’delay(100)

‘); end % 保存项目文件到指定路径 hfssSaveProject(fid, tmpPrjFile,1); % 延时函数的编写 fprintf(fid, ’Sub delay(ms)

‘); fprintf(fid, ’ Dim i,value

‘); fprintf(fid, ’ for i=1 to 7500*ms

‘); fprintf(fid, ’ value=i+1

‘); fprintf(fid, ’ next

‘); fprintf(fid, ’End Sub

‘); % 鼠标控制 fid1=fopen(’mouse_control.txt‘); %打开文本文件 INDEX=0; while ~feof(fid1) strdata = fgetl(fid1); % 读取一行, strdata是字符串 fprintf(fid, strdata); fprintf(fid, ’

‘); end fclose(fid1); % Close the HFSS Script File. fclose(fid); disp(’vbs脚本已生成!‘);catch disp(’程序出现异常!‘); fclose(fid);end

按个人情况按图索骥地修改tmpPrjFile,tmpScriptFile ,hfssExePath这几个路径和Design_name,使用的时候记得将mouse_control.txt和该vbs_horse_race_lamp.m文件单独拎出来,与hfssapi-by-Jianhui Huang放在同一个总文件夹内。点击运行即可生成vbs脚本(在自行赋值的tmpScriptFile的这个路径下)。vbs脚本可以直接点击运行,或者在HFSS软件中Run Script。

基础性地写代码编注释还是挺费时间和精力的,希望大家多点赞分享。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真
    +关注

    关注

    53

    文章

    4404

    浏览量

    137644
  • API
    API
    +关注

    关注

    2

    文章

    2146

    浏览量

    66198
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66812
  • hfss
    +关注

    关注

    32

    文章

    168

    浏览量

    51489
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    何用FPGA控制ADV7513实现HDMI画面显示和音频播放

    HDMI接口显示使用DMT时序+TMDS编码实现。当用FPGA控制HDMI的数据传输时,通常可以采用纯RTL实现TMDS算法或者使用专门的HDMI芯片(如ADV7513)这两种方案完成。本文主要是介绍如何用FPGA控制ADV
    的头像 发表于 12-02 11:05 2112次阅读
    如<b class='flag-5'>何用</b>FPGA控制ADV7513实现HDMI画面显示和音频播放

    【瑞萨RA6E2】驱动 WS2812 实现 RGB 跑马灯效果

    , BSP_IO_LEVEL_LOW); R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MICROSECONDS); } 实现跑马灯效果的逻辑:定义颜色数组存储 GRB 格式的红
    发表于 11-25 01:55

    【书籍评测活动NO.66】玩转高速电路:基于ANSYS HFSS的无源仿真实例

    HFSS的无源仿真实例」阅读体验】+自拟标题 注意事项 1、活动期间如有作弊、灌水等违反电子发烧友论坛规则的行为一经发现将立即取消获奖资格 2、活动结束后获奖名单将在论坛公示请活动参与者尽量
    发表于 11-06 14:19

    【RA4M2-SENSOR】 Keil开发环境建立和跑马灯运行

    ... pter6/chapter6.html 因为此开发板有IC CH340C 进行UART通信,建议用SWD接口和USB 转TTL下载器进行编程下载。 3.在keil中编程跑马灯程序。 先在
    发表于 09-11 07:53

    何用电容式的片式 CHIP LAN 网络变压器(电感)替代消费级传统网络变压器,电气原理图是怎样的?

    Hqst石门盈盛(华强盛)电子导读:如何用电容式的片式 CHIP LAN 网络变压器(电感)替代消费级传统网络变压器,电气原理图是怎样的?这节将和大家一起做探讨.....
    的头像 发表于 07-13 11:01 1291次阅读
    如<b class='flag-5'>何用</b>电容式的片式 CHIP LAN 网络变压器(电感)<b class='flag-5'>来</b>替代消费级传统网络变压器,电气原理图是怎样的?

    运用笙泉评估板(EVB),高效开发M0应用产品

    ,搭配UI软体工具烧录或仿真。1、J1连接PC,烧录RGB_LED跑马灯程序 每一片EVB,出厂都带有程序,上电可以运行。 2、J1连接PC,可以在Keil直接仿真。 三、笙泉M0系列EVB
    发表于 06-24 11:16

    【RA4L1-SENSOR】+ RA4L1-SENSOR开发版之点灯实现流水灯跑马灯

    打开RA4L1的原理图,上面有3个LED灯 分别是 P601-- LED3 P610-- LED2 P609-- LED1 任何人都知道,这3灯都是高电平 “1”点亮 “0”熄灭,不解释 打开瑞萨的SMART配置软件进行IO配置 3灯配置完成 点击生成代码 默认我配置为熄灭 KEIL里面也显示smart生成软件生效了 修改LED功能代码 添加LED文件 4。添加LED头文件 根据原理图引脚配置宏 5。实现LED1LED2LED3功能函数 #include \"led.h\" /*函数说明:led1闪烁 *传入参数:无 *返回参数:无 */ void led_1_flicker(void) { LED1_lighting_up; R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); LED1_lighting_off; R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); } /*函数说明:led2闪烁 *传入参数:无 *返回参数:无 */ void led_2_flicker(void) { LED2_lighting_up; R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); LED2_lighting_off; R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); } /*函数说明:led3闪烁 *传入参数:无 *返回参数:无 */ void led_3_flicker(void) { LED3_lighting_up; R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); LED3_lighting_off; R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); } #ifndef __led_H #define __led_H #include \"hal_data.h\" /*********参数宏定义*********/ #define LED1 BSP_IO_PORT_06_PIN_09 #define LED2 BSP_IO_PORT_06_PIN_10 #define LED3 BSP_IO_PORT_06_PIN_01 /*********函数宏定义*********/ #define LED1_lighting_off R_IOPORT_PinWrite(&g_ioport_ctrl,LED1,BSP_IO_LEVEL_LOW) #define LED1_lighting_upR_IOPORT_PinWrite(&g_ioport_ctrl,LED1,BSP_IO_LEVEL_HIGH) #define LED2_lighting_off R_IOPORT_PinWrite(&g_ioport_ctrl,LED2,BSP_IO_LEVEL_LOW) #define LED2_lighting_upR_IOPORT_PinWrite(&g_ioport_ctrl,LED2,BSP_IO_LEVEL_HIGH) #define LED3_lighting_off R_IOPORT_PinWrite(&g_ioport_ctrl,LED3,BSP_IO_LEVEL_LOW) #define LED3_lighting_upR_IOPORT_PinWrite(&g_ioport_ctrl,LED3,BSP_IO_LEVEL_HIGH) /*********函数声明*********/ void led_1_flicker(void); void led_2_flicker(void); void led_3_flicker(void); #endif 主函数中添加功能 #include \"hal_data.h\" #include \"usart9.h\" #include \"RTT.h\" #include \"led.h\" FSP_CPP_HEADER void R_BSP_WarmStart(bsp_warm_start_event_t event); FSP_CPP_FOOTER /*******************************************************************************************************************//** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.This function is called by main() when no RTOS is used. *********************************************************************************************************************/ void hal_entry(void) { / TODO: add your own code here */ UART9_Init(); //printf(\"\\\\r\\\\n欢迎来到瑞萨电子\\\\r\\\\n\"); //printf(\"很高兴试用RA4L1开发板********\\\\r\\\\n\"); //printf(\"串口输出打印 波特率115200\\\\r\\\\n\\\\r\\\\n\"); print(\"\\\\r\\\\nwelcome to renesas\\\\r\\\\n\"); print(\"USART output RA4L1 test\\\\r\\\\n\"); print(\"\\\\r\\\\n\"); while(1) { //printf(\"RA4L1 Sensor开发板\\\\r\\\\n\"); //print(\"RA4L1 Sensor develop board\\\\r\\\\n\"); led_1_flicker(); led_2_flicker(); led_3_flicker(); //R_BSP_SoftwareDelay(300, BSP_DELAY_UNITS_MILLISECONDS); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } /*******************************************************************************************************************//** This function is called at various points during the startup process.This implementation uses the event that is called right before main() to set up the pins. @param[in]event Where at in the start up process the code is currently at **********************************************************************************************************************/ void R_BSP_WarmStart (bsp_warm_start_event_t event) { if (BSP_WARM_START_RESET == event) { #if BSP_FEATURE_FLASH_LP_VERSION != 0 /* Enable reading from data flash. */ R_FACI_LP->DFLCTL = 1U; /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */ #endif } if (BSP_WARM_START_POST_C == event) { /* C runtime environment and system clocks are setup. */ /* Configure pins. */ R_IOPORT_Open(&IOPORT_CFG_CTRL, &IOPORT_CFG_NAME); #if BSP_CFG_SDRAM_ENABLED /* Setup SDRAM and initialize it. Must configure pins first. */ R_BSP_SdramInit(true); #endif } } #if BSP_TZ_SECURE_BUILD FSP_CPP_HEADER BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable (); /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */ BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable () { } FSP_CPP_FOOTER #endif 编译,烧录板子,可以看到LED1 LED2 LED3每隔500ms翻转 详情看视频!!!!!!
    发表于 06-09 09:25

    【RA-Eco-RA4M2开发板评测】点灯实现6种LED花式流水灯操作

    很高兴收到瑞萨电子提供的RA4M2开发板,这次帖子就专门用来说说专业点灯操作,实现各种花式的流水灯,可以十分方便地控制LED的各种状态,甚至多个LED组合控制,如跑马灯等。 打开原理图,可以看到3个
    发表于 04-28 21:28

    何用c#使用ST25R3911DISCOComm.dll读取和写入NDEF区的数据?

    何用c#使用ST25R3911DISCOComm.dll读取和写入NDEF区的数据,需要相关例程,感谢各位大佬拯救一下我啊!????
    发表于 04-23 06:58

    LED显示屏控制卡,高度24如何适配32高度的文本内容?

    客户的后台程序只能设置16或者32的高度,即1632或者3232,但是现场安装的是832的模组,安装了三块高度是24。 为了实现最理想的显示效果,如果在2432点的模组上接收显示32*32的内容? 显示屏是单色的红色滚动跑马屏,使用的控制卡是深圳流明电子的控制卡
    发表于 04-14 11:05

    何用几条命令搞定Ubuntu系统的网络配置

    在某些场景下,设备没有显示器或屏可以用,这时候通过命令行设置网络就变得特别重要了。本文将介绍如何用几条命令搞定Ubuntu系统的网络配置。
    的头像 发表于 03-14 10:53 3250次阅读
    如<b class='flag-5'>何用</b>几条命令搞定Ubuntu系统的网络配置

    何用c#使用ST25R3911DISCOComm.dll读取和写入NDEF区的数据?

    何用c#使用ST25R3911DISCOComm.dll读取和写入NDEF区的数据,需要相关例程,感谢各位大佬拯救一下我啊!????
    发表于 03-13 06:51

    HFSS 自动化建模工具

    因工作需求,自己写的HFSS参数自动化建模工具,目前只实现了常用的四种模型,可定制化,如需可联系 qq:1300038043 附件下载链接:https://pan.baidu.com/s/1TVeTTFiJw-pxSyT1AT8IQA 提取码: kxup
    发表于 02-27 17:44

    零知开源——玩转WS2812B灯条模块

    关闭到开启不同颜色以及跑马灯、呼吸灯和彩虹灯等效果。  一、工具原料 电脑、Windows系统 零知开发板 Micro-usb线 WS2812RGB灯 二、硬件连接 零知标准开发板 WS2812B
    的头像 发表于 02-19 15:09 2502次阅读
    零知开源——玩转WS2812B灯条模块

    AN-737: 如何用ADIsimADC完成ADC建模

    电子发烧友网站提供《AN-737: 如何用ADIsimADC完成ADC建模.pdf》资料免费下载
    发表于 01-13 14:54 1次下载
    AN-737: 如<b class='flag-5'>何用</b>ADIsimADC完成ADC建模