Wednesday, April 25, 2018

Windows下鼠标键盘的禁用与解禁

        有时候需要通过软件来禁用PC的鼠标键盘,等时机成熟了的时候呢再解禁这种限制。实现方法应该有很多种,这个时候最方便的方法就是调用Windows系统API函数User32.dll来实现。

        简单配置系统函数如下图。DLL所在的目录默认如下,在C:\Windows\System32\user32.dll,其中的函数BlockInput就可以同时禁用鼠标键盘灯输入设备。配置如下,很简单。


        代码也很简单。输入"1"的时候就是禁用,输入"0"则为解禁。


        到这里,看样子是结束了,但是在实际测试过程中发现有的电脑有效,有的无效。这就对了,还有最后一步,需要将UAC设置为低等级。



----

Reference
  1. 转载自微信公众号:LabVIEW-Jobs
This post is forward from Wechat account: LabVIEW-Jobs
     2. 有疑问可以联系support@itestgroup.com
Any questions, please query at support@itestgroup.com more information click here





Friday, March 2, 2018

LabVIEW下基于百度地图的路径规划与拥堵预测

        想必大家刚刚从春节假日回到学习工作中,而每年春节期间的春运又必然是一个热门话题。笔者今年年前也是打算自驾出行的,接近九百公里的长途。临近出行前,一遍一遍的用手机刷地图,看看不同时段的拥堵情况,时间预估,以便能尽量挑选一个最佳的出行时间。费时费力也费心,所以想想不如写个小软件来自动查询并计算,由此预估一个相对靠谱的出行时间点。
        大致思路是每分钟查询一次导航规划路线所预估的花费时间作为纵坐标,与当时的时刻作为横坐标形成一个趋势波形图。由此预测出峰谷点。当然,也可以设计出更详细更靠谱的算法,从而得出更准确的预测。
        主要方法跟此前的文字转语音工具(发送关键词"TTS"获取早期文章)是类似的。也即是调用百度地图API,在线获取我们所需要的数据,记录并统计分析。

        百度API:首先的有百度账号,进入【百度地图开放平台】(http://lbsyun.baidu.com/)。进入【开发文档】--【服务接口】--【Web服务API】,点击打开页面。点击左侧【路线规划】--【路线规划 v2.0】。重点阅读【服务文档】,其中的驾车路线规划:
http://api.map.baidu.com/direction/v2/driving?origin=40.01116,116.339303&destination=39.936404,116.452562&ak=您的ak
        这是一个最基础的请求格式,根据自身需要以及【服务文档】所介绍的参数配置,可以有更个性化的定制。
        有几点注意事项:
        1. API调用是有配额限制的,根据用户认证等级不同有不同的限制,如下图所示:普通用户仅2000次,认证用户则有3万次,对于我们这种小应用已经足够。备注:百度地图API目前均不收费,无论是个人使用还是商业应用,均免费使用。虽然有限额,但是如果有实际真实需求,日使用量即使超百万级别,也是可以申请免费扩容的。

        
        2. 前面提到的接口格式里面,有一个重要的参数就是我们的起始地点的地图坐标。经过这次学习,也知道了一个常识――地图数据应国家保密要求,是经过加密了的,不允许直接提供GPS经纬度坐标系。具体坐标系的含义如下所述,其中使用百度地图,我们通常使用的就是百度自家的坐标系了BD09.

坐标系说明
WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标
路线规划服务API v2.0的输入参数支持以上三种坐标系,开发者无需进行任何坐标转换,通过请求参数"coord_type"指明所使用的坐标系即可。输出参数支持国测局坐标(gcj02)和 百度坐标(bd09ll)两种坐标,通过请求参数"ret_coordtype"进行设置。
        3. 获取坐标。【百度地图开放平台】--【开发文档】--【工具支持】--【坐标拾取器】,运用这个工具即可获取物理地址的坐标参数。如北京市东城区人民政府的坐标就是【116.422806,39.934797】,但是一定要注意的是:使用的时候需要将坐标反转过来,否则会报错,如刚才的坐标写成【39.934797,116.422806】才有效,原因不明。

        至于LabVIEW代码就比较简单了,如下图所示。使用HTTP_GET向服务器发送请求,然后解析返回字符串即可。为了保证持续不间断运行,注意在HTTP_GET后面的错误给清除掉,以免由于服务器或网络不稳定原因导致程序停止运行。


        介绍到此结束。下面分享一组数据。

第一组:是收集的部分数据,包含总里程,单位是公里;时间,单位是小时;高速收费金额,单位是元;收费里程,单位是米。

第二组:绘制的简易波形趋势图,纵坐标是耗费时间,单位为小时,横坐标为时刻,每分钟一个点,具体起始时刻要看记录。

第三组:嗯,这是笔者上下班路线的早/晚高峰的数据 :-)

第四组:春运整体拥堵趋势图

PS1: 如果有同学喜欢高德地图导航的,也可以把文中的API换成高德的。笔者高德也注册有账号,体验了一下,大致差不多,甚至格式都是一样的,但是高德的额度没有明确免费,目前的个人免费额度也是3万/天。

PS2:哦,最后近900公里的里程,花费了15个小时,包含服务区休息时间以及路上拥堵时间,还算是在预期内 :-) 

Reference
  1. 转载至微信公众号:LabVIEW-Jobs
This post is from Wechat account: LabVIEW-Jobs
     2. 有疑问可以联系support@itestgroup.com
Any questions, please query at support@itestgroup.com more information click here

Friday, December 22, 2017

Zebra斑马打印机中打印QR码时如何设置大小

        在标签打印中,斑马Zebra打印机可以说是非常流行的,可以说是占据着垄断地位;同时在二维码的世界里,随着智能机的普及,如今QR码是越来越流行了。QR码更多的是在互联网应用中普及,虽然在工业领域没有互联网应用中那么普及,但现在也是越来越流行了。在实际使用中,你会惊奇地发现到目前为止(2017/12/20),Zebra对QR码的支持还不是那么完美――无法直接设置QR码大小。不用怀疑,确实不支持,否则笔者也不会挑这个话题了。

        斑马打印机,我们通常都是用的ZPL(Zebra Programming Language)。其中对于QR码支持的指令如下图所示:其主指令是BQ,参数分别有a,b,c,d,e,其中只有参数c (magnification factor)有一定的调节大小的作用,但是这个作用是非常有限的。顾名思义,这个参数是设置放大倍数的,而且只支持1到10,而且不支持小数。其本意也只是用于适配不同精度的打印机的,并不是用来设置条码大小的。

         斑马打印机对于QR码的大小,目前的主要依据是条码的内容。也就是说,条码内容越长,越多,其原声QR码就越大。
       针对这个局限性现提出3或者4种"解决"办法,打引号的意思是这几种办法都并不算完美。
        第一种,对于条码内容大小固定的QR码,可以首先使用上面提到的magnification factor这个参数来调节。如果正好能调整到期望的大小或者接近期望大小,那么恭喜你,这是最简单的办法,简单的同时其弊端也是显而易见的――不能保证都适用,而且凑出来的大小并不精确。
        第二种,对于条码内容大小固定或相差不大的QR码,使用空格或其他不可见的字符来填充,直到填充到期望的大小。当然同时也可以配合第一种方法一起调整。这个办法谈不上简单,也算不上复杂,但是还是能解决一部分问题。弊端也是显而易见的――多余的字符可能会影响QR码的读取与解析,另外就是也影响了条码的解析度,QR码单位面积内所包含的字符越多,其线条越精细,对于扫码设备的解析精度要求越高,同理也适用于打印机。
        第三种,也是对于条码内容大小固定或相差不大的QR码,使用指令MU来放大调节整个标签,也可以跟第一种方法配合着调整。如下图所示,MU指令一共有3个参数,a,b,c。这个放大原理是重新虚拟一个打印精细度,比如我们通常所说的300DPI或600DPI(dot per inch),是指每英寸单元打印的像素点。虚拟放大之后,自然也就调整了QR码的大小了。其弊端也是显而易见的――这种放大后的打印精度会降低,而且这个调整是全局的,是对整个条码标签的调整,无法只针对QR部分进行调整。
        第四种,堪称一种最完美的办法,当然也是最复杂的一种办法了。原理就是通过第三方软件或API生成一个指定大小与格式的QR码图片,然后通过打印机调用图片来进行打印。这种方法当然也就从根本上解决了问题,不限制条码内容大小。弊端当然也是显而易见的――一个"第三方"既可以说是没有限制也可以说是不确定的限制,因为限制来源于第三方。至于如何通过LabVIEW生成QR码图片,也是另外一个话题了。有兴趣了解的,可以在文后留言,后面可以写相关的话题。
        打印图片的指令分别有IL(Image Load), IM(Image Move)以及IS(Image Save)等等操作,详细指令参数可参考编程手册。

        斑马打印机缺乏对QR码大小的直接设置支持,已经在斑马的开发者论坛上被用户吐槽过多次了,现在也已经引起了官方的注意。但愿在不久的将来,官方能够完善对于QR码的支持,毕竟现在QR码越来越流行了,无论互联网还是工业界。大家如果有什么想法,也欢迎在文后的评论中留言交流或者邮件交流。
        

------
本文转载自微信公众号LabVIEW-Jobs(LabVIEW伯乐), 关注二维码关注公众号。

More information click here



Thursday, November 9, 2017

LabVIEW下UTF8编码格式的转换


        延续前面的一个话题(公众号LabVIEW-Jobs下回复TTS或百度,直接返回上期话题),上期谈到的文字转语音,是同时支持中英文的。对于英文来说,比较简单,直接输入英文字符串就可以了,但是对于中文的输入,就涉及到编码的转换。需要将中文转换为UTF8编码格式,然后再输入到URL中,才能被识别。

        LabVIEW没有在程序框图面板直接提供这个函数,但是实际上在老版本的LabVIEW的Email发送函数里面已经内置了。在网络应用方面,经常遇到编码问题的。所以今天是搬运工,直接搬运出这个函数。在安装目录下C:\Program Files\National Instruments\LabVIEW 2013\vi.lib\Utility\SMTP,打开smtpeml.llb,看到了熟悉的身影了。
        再打开这个VI就可以看到我们想要的函数了text to UTF-8,拷贝出来就可以直接使用了。
        不明白的是,NI始终没有将这个基础函数放置在函数面板,论坛上一直都有这个话题的讨论。LabVIEW更新了这么多版本,至今都没有开放出来。但是毕竟还是出自官方,所以这个函数的可靠性应该是没有问题的。另外,从UTF8编码反向转换为字符的函数,NI老版本也一样提供了。
        除此外,坊间也有很多其他方法来实现这个功能。在其他语系里面,也算是一个基础函数了。
        延续上次的话题,需要将中文先转化为UTF8编码,然后分解为16进制并添加%作为转义字符才能完美地被识别。参考下面的截图:
Reference
转载自微信公众号:LabVIW-Jobs (This post is forward from Wechat account: LabVIEW-Jobs)

有疑问可以联系support@itestgroup.com
Any question or feedback, please contact with support@itestgroup.com more information click here

Sunday, November 5, 2017

TTS:LabVIEW下调用百度TTS API实现文字转语音


        大概2年前吧,接到客户的一个需求:测试结束后能不能把测试结果用语音播报出来?一些人机配合的地方,也加上语音提示。当然了,这完全是没有问题的,不就是播放一些音频文件嘛,LabVIEW自带就支持wav文件的直接播放。然后就是怎么制作这些语音文件呢?总不能自己录吧,那太土了!现在各大手机导航平台不都支持各种语音风格么,当时就找到了百度语音。使用百度语音TTS来制作这些语音文件。当然,当初只是在线生成了几个固定的语音文件。强迫症患者表示,一定要实现自动在线转换。今天就是这个主题。

        第一步,首先的注册一个百度开发者账号,这个是免费的。http://yuyin.baidu.com/tts,百度目前提供三大语音服务(识别,合成,唤醒),而TTS就是我们这次所要用的语音合成服务。创建一个应用,会自动生成三个参数:App ID, API Key以及Secret Key。这是几个非常关键的参数,后续会用到。
        第二步,获取Access Token,这个就需要用到第一步获取的两个参数。具体参考百度官方教程:http://yuyin.baidu.com/docs/tts/135。 摘录如下:
        使用语音识别及合成REST API 需要获取 Access Token。Access Token 是用户身份验证和授权的凭证,语音识别采用的是Client Credentials授权方式,即采用应用公钥(Api Key)、密钥获取Access Token,适用于任何带server类型应用,通过此授权方式获取Access Token仅可访问平台授权类的接口,使用Client Credentials获取Access Token需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的" https://openapi.baidu.com/oauth/2.0/token "地址上,并带上以下参数:
  • grant_type:必须参数,固定为"client_credentials";
  • client_id:必须参数,应用的 API Key;
  • client_secret:必须参数,应用的 Secret Key;

        响应数据包如下所示,其中 "access_token" 字段即为请求 REST API 所需的令牌, 默认情况下,Access Token 有效期为一个月,开发者需要对 Access Token的有效性进行判断,如果Access Token过期可以重新获取。百度目前的有效期是一个月,但是失效后可以自由的再生成一个新的Token,所以在写程序的时候通常就是先判断Token是否有效,如果失效就重新生成一个,这个刷新的过程目前好像没有限制。


        第三步,生成语音文件。具体参数详见官方说明http://yuyin.baidu.com/docs/tts/136。通过HTTP协议下的POST或GET模式均可以完成。LabVIEW代码也非常简洁:一个VI即可。

        通过百度语音工具包,可以让语音播报功能跟语音导航一样丰富多彩。有几点说明:中文需转化为UTF-8编码,每次转换的长度不能超过1024字符,也就是512个中文,服务完全依赖百度的免费政策,不能保证永久有效,文中方式需网络支持,目前百度SDK也支持离线转换。

       完整代码如下图

        公开本次测试的密钥,不想注册百度开发者的用户也可以直接使用。
API Key: HxPBVGrRw2w20kmXljrPW6rj
Secret Key: FkmLKunqnBTZY8w2t5sGFKXHvKBgu1YX
Access Token:24.6bf26153cd4a81e4e1c79d6da89d6add.2592000.1512442552.282335-5203061(目前有效期还有一个月,过期后需要根据上述第二步自己重新生成。)

需要VI代码的可以联系support@itestgroup.com
If need the demo code of this post, please contact support@itestgroup.com more information click here

Sunday, October 29, 2017

【WORD】LabVIEW如何读取Word文档


Title: How to read the MS Word documents by LabVIEW
        前不久,有一个测试软件所产生的测试报告全部是PDF格式。嗯,这已经不是第一次遇到PDF格式的测试报告了。客户紧急需要统计测试报告的数据,做一个数据分布图出来。而且还是下班后收到的请求,这事儿搞的有点大,至少有几百个PDF文件的数据要统计吧,如果纯人工抄录,然后再统计,这活可不容易啊――纯体力活啊。
        通常的话,无论是数据库还是Excel,文本txt或者Word格式的文档,都是可以通过软件写个脚本来实现自动化的,但是对于PDF来讲,还是有点困难的。PDF格式既是一种通用格式,但是又不具备可编辑性。短时间内完成这个脚本还是不容易的。目测了这个PDF格式的内容,有表格有图片有文字有数字,还是比较丰富的。而对于数据统计有意义的就是文字与数字。所以确定了方向:PDF先转化成Word,然后Word再转化为text,最后读取数据统计分析。

        PDF转Word,网络上有很多工具与服务,也收集了很多工具,有收费的也有免费的。这次选择了国产办公软件金山WPS,免费,而且支持批量转化,速度与质量都不错。
        
图1、就是这个工具,来自WPS,好歹也出自名门
图2、支持多文件一次性导入,操作方便,转换速度也不错,值得推荐
        几百个文件,几分钟就转换成一个个独立的同名Word文档,剩下的任务就是用LabVIEW来读取Word文档的内容了。

        整体上来讲,是使用了Microsoft ActiveX API函数。这里有一点惊喜的是,电脑没有安装微软的Office套件,只安装了金山WPS套件,还以为没有这些API函数,结果是WPS也兼容了MS的API,不需要安装MS的Office套件也能找到这些函数。(此处存疑,电脑确实没有安装MS Office,以前也没有安装过MS Office,但是API确实是可以用的。)

        
        使用LabVIEW的automation open打开MS的Word应用的引用,这里就是一个惊喜:并没有安装MS家的Office套件,只安装了WPS套件,居然也是完全兼容的。
        使用Documents属性节点访问文件,然后再通过Open方法节点打开指定的文件,这里有很多参数可选,比如编码、格式、密码等等,根据具体需要来设置。对于目前这个简单的文档,只需要设定好文件路径即可。
        通过文件属性节点访问内容Content (MSDN的描述:Returns a Range object that represents the main document story),当然当你用鼠标下拉后会发现,这里可以访问的东西很多很多哦,比如密码、打印设置、标题、表格、读写权限。。。多达几十项。我们这里只需要读取文本,就选择了Content属性节点。
        通过Range属性节点去访问文本text,就可以得到全部的文本内容。当然,这里也有很多其他节点可以尝试,可以读取到其他内容与参数。MSDN的描述:The Text property returns the plain, unformatted text of the range. When you set this property, the existing text in the range is replaced.
        在代码的最后面,就是对读取的文本进行了一些简单的处理,再进一步就可以导出到Excel里面做数据统计分析了。

        有几点说明:PDF转Word不是万能的,因为PDF本身是一种非常广泛的万能格式,不是所有的PDF都可以转化成有用的Word格式。另外,如果Word格式过于复杂,在使用API读取的时候需要格外小心,以免数据读取错误或丢失。

        延伸两点:LabVIEW也是可以生成丰富多彩的PDF格式报告的;也可以生成丰富多彩的Word/Excel格式报告的,也就是使用报告生成工具包RGT。

        API参考资料:https://msdn.microsoft.com/en-us/VBA/Word-VBA/articles/document-object-word

       有疑问可以联系support@itestgroup.com
       Any question for this post, please contact support@itestgroup.com more information click here

Sunday, September 24, 2017

PCA9540之应用(2-channel I2C multiplexer)

        这是一款来自NXP的很老的芯片了,现在都升级为PCA9640了。是一颗很容易理解的二选一开关,在很多场合都可以应用到这种简易的IIC开关,便于系统的扩展。之所以把这么一颗简单的IIC开关拿出来,只是因为前段时间犯了一个错误导致花费了一些时间,故而记录一下。
        
器件地址
这是器件地址,很好理解,按照上篇讲到的7位地址则为0x70,即111(MSB),000(LSB)。而且这个地址全部是全固定地址,硬件无法改变,从另外一个角度来讲,一个Master下只能接一个这种开关,无法扩展多个。

控制寄存器

很明确,这里就是后三位用于开关的通道选择,由于本器件只有两个通道,所以3bit已经足以达到目的。

状态表
也很清晰,0x00是上电默认状态,此时任何一个通道都没有选通;0x04则选通的为通道0;0x05则选通的为通道1. 其中D3至D7位无需考虑,有用的只有低3位。

写寄存器
        这是写操作,请注意的是这里。这里是直接写控制寄存器,并没有常规理解上的寄存器地址。也就是说,在发送完器件地址,收到响应后直接发送控制寄存器值即可,无需先发送地址。如果一定要说地址偏移量,也可以说成是0.也即offset设置为0.因为此类IIC器件的功能非常简单,并没有太多的内容需要操作,所以并没有分区分块的操作。

读寄存器
        这是读操作。从上图可以看出,也是非常简单,只需要将R/W位改为1即可,也是没有所谓的地址的。
        当初所犯之错误就在这里,想当然的将读写地址设置为0x00。这样在写的时候还好,没有实际影响,但是在读的时候实际是有一个"地址" 的动作,这样实际写入的就是0x00,也就是说将此前已经实际写入的寄存器值(0x04或0x05)又覆盖掉了,覆盖成0x00,故而一个通道都没有打开。

--------
Any feedback, please contact @ support@itestgroup.com more information click here