karma配好之后,默认使用的是jasmine作为测试框架: frameworks: ['jasmine']。
jasmine是基于BDD模式的测试框架,详细介绍请上网查看,在此我们直接进入实战。
本文以jasmine1.3为例,因为最新版的Karma v0.12.9 使用的为jasmine1.3。
参考文档:http://jasmine.github.io/1.3/introduction.html
jasmine测试用例的书写格式:
可用的匹配器:
测试用例的前置和后置函数
http://powertech.iteye.com/blog/2065922
beforeEach afterEach
探测器:探测函数的执行过程,以及动态修改
函数的参数和返回值。
http://powertech.iteye.com/blog/2065922
探测器的类型:
http://powertech.iteye.com/blog/2065922
andCallThrough 监听函数的执行过程。
andReturn:伪造函数的返回值,一般用来在测试用例执行前
为测试用例提前配置好测试环境,减少函数间的依赖。
andCallFake:伪造函数的调用过程。
createSpy:请查看原文档
createSpyObj:请查看原文档
测试用例的同步代码支持:
在测试的时候,有时我们需要某个测试执行时,等待5秒钟之后再开始,
或者满足某个条件后才开始,比如,执行用户管理测试,需要先调用
登录代码后,等待1秒再开始其它测试。
用于序列化执行的的代码块,多个runs块按顺序执行。
waits(毫秒),执行完此函数,会引起等待,等待结束然后再执行下一个runs代码块或下一个
it测试用例
waitsFor代码块在5000毫秒内返回true,则执行下一下runs块
如果在5000毫秒内不能返回true,则测试用例失败,不再执行下一个runs代码块。
实例:
和karma的配合
http://powertech.iteye.com/blog/2065922
karma默认每个包含的文件,都是用<script src="my.js"></script>这种格式包含进一个HTML文档里。
console.log($(document))即可看到:
文件的加载顺序和配置顺序是一样的。
所以可以写一些前置的测试用例,用来初始化测试环境,比如设置登录用户,预加载页面内容
伪造服务器响应,修改服务器地址,设置全局变量,使用waits等待加载等。
当这些测试用测跑完,相当于走了一个初始化过程,再开始其它的测试用例,会省去很多重
复代码。
如:
作完这些操作后,其它的测试用例跑起来很方便。
karma里测试文件的加载方式:
http://powertech.iteye.com/blog/2065922
默认情况下,所有文件都使用<script>标签直接加载到浏览器里,后台相当于存在一个小服务器。也可以将文件加载到服务器,在地址档访问,或Ajax加载。
jasmine是基于BDD模式的测试框架,详细介绍请上网查看,在此我们直接进入实战。
本文以jasmine1.3为例,因为最新版的Karma v0.12.9 使用的为jasmine1.3。
参考文档:http://jasmine.github.io/1.3/introduction.html
jasmine测试用例的书写格式:
describe("用户登录功能", function() { it("密码验证", function() { expect(true).toBe(true); }); it("重复密码", function() { expect(true).toBe(true); }); it("登录事件", function() { expect(true).toBe(true); }); it("登录界面", function() { expect(true).toBe(true); }); }); //测试套件的嵌套 describe("用户管理", function() { describe("用户登录功能", function() { it("密码验证", function() { expect(true).toBe(true); }); it("重复密码", function() { expect(true).toBe(true); }); it("登录事件", function() { expect(true).toBe(true); }); it("登录界面", function() { expect(true).toBe(true); }); }); });
可用的匹配器:
expect(true).toBe(true); expect(false).not.toBe(true); expect(a).toEqual(12); expect(message).toMatch(/bar/); expect(message).toMatch('bar'); expect(message).not.toMatch(/quux/); expect(a.foo).toBeDefined(); expect(a.bar).not.toBeDefined(); expect(a.foo).not.toBeUndefined(); expect(a.bar).toBeUndefined(); expect(null).toBeNull(); expect(a).toBeNull(); expect(foo).not.toBeNull(); expect(foo).toBeTruthy(); expect(a).not.toBeTruthy(); expect(a).toBeFalsy(); expect(foo).not.toBeFalsy(); expect(a).toContain('bar'); expect(a).not.toContain('quux'); expect(e).toBeLessThan(pi); expect(pi).not.toBeLessThan(e); expect(pi).toBeGreaterThan(e); expect(e).not.toBeGreaterThan(pi); expect(pi).not.toBeCloseTo(e, 2); expect(pi).toBeCloseTo(e, 0); expect(foo).not.toThrow(); expect(bar).toThrow();
测试用例的前置和后置函数
http://powertech.iteye.com/blog/2065922
beforeEach afterEach
describe("用户登录功能", function() { beforeEach(function(){ console.log('前置函数,下面的每个测试用例之前执行一次'); }); afterEach(function(){ console.log('前置函数,下面的每个测试用例之后执行一次'); }); it("密码验证", function() { expect(true).toBe(true); }); it("重复密码", function() { expect(true).toBe(true); }); it("登录事件", function() { expect(true).toBe(true); }); it("登录界面", function() { expect(true).toBe(true); }); });
探测器:探测函数的执行过程,以及动态修改
函数的参数和返回值。
http://powertech.iteye.com/blog/2065922
describe("A spy", function() { var foo, bar = null; beforeEach(function() { foo = { setBar: function(value) { bar = value; } }; spyOn(foo, 'setBar'); foo.setBar(123); foo.setBar(456, 'another param'); }); it("tracks that the spy was called", function() { expect(foo.setBar).toHaveBeenCalled(); }); it("tracks its number of calls", function() { expect(foo.setBar.calls.length).toEqual(2); }); it("tracks all the arguments of its calls", function() { expect(foo.setBar).toHaveBeenCalledWith(123); expect(foo.setBar).toHaveBeenCalledWith(456, 'another param'); }); it("allows access to the most recent call", function() { expect(foo.setBar.mostRecentCall.args[0]).toEqual(456); }); it("allows access to other calls", function() { expect(foo.setBar.calls[0].args[0]).toEqual(123); }); it("stops all execution on a function", function() { expect(bar).toBeNull(); }); });
探测器的类型:
http://powertech.iteye.com/blog/2065922
andCallThrough 监听函数的执行过程。
it('andCallThrough',funciton(){ spyOn(myObj,'fun').andCallThrough(); //判断是否返回了期望的结果 var result = myObj.fun(222); expect(result).toBe(234) //可以使用toHaveBeenCalled判断函数是否执行, expect(myObj.fun).toHaveBeenCalled(11); //使用toHaveBeenCalledWith判断是否传入了期望的参数 expect(myObj.fun).toHaveBeenCalledWith(11); });
andReturn:伪造函数的返回值,一般用来在测试用例执行前
为测试用例提前配置好测试环境,减少函数间的依赖。
it('andCallThrough',funciton(){ spyOn(myObj,'getLoginUserID').andReturn(function(para){ //将函数myObj.getLoginUserID的返回值修改为123 return 123; }); var id = myObj.getLoginUserID(para); var user = myObj.getUser(id); } });
andCallFake:伪造函数的调用过程。
it('andCallThrough',funciton(){ spyOn(myObj,'fun').andCallFake(function(para){ //将函数myObj.fun的执行过程改为下面的代码 var i= i+1; return 123; }); myObj.fun1 = function(para){ var ss = myObj.fun(para); return ss*10; } //判断是否返回了期望的结果 var result = myObj.fun(222); expect(result).toBe(1230) });
createSpy:请查看原文档
createSpyObj:请查看原文档
测试用例的同步代码支持:
在测试的时候,有时我们需要某个测试执行时,等待5秒钟之后再开始,
或者满足某个条件后才开始,比如,执行用户管理测试,需要先调用
登录代码后,等待1秒再开始其它测试。
runs(funciton(){ 代码块1 }) runs(funciton(){ 代码块2 })
用于序列化执行的的代码块,多个runs块按顺序执行。
waits(毫秒),执行完此函数,会引起等待,等待结束然后再执行下一个runs代码块或下一个
it测试用例
waitsFor(function(){ //满足条件时返回true if(condition){ return true; } },'失败说明',5000);
waitsFor代码块在5000毫秒内返回true,则执行下一下runs块
如果在5000毫秒内不能返回true,则测试用例失败,不再执行下一个runs代码块。
实例:
describe('等待啊等待',function(){ it('开始,配置环境',funciton(){ //发起一个异步的ajax登录 myusr.login(); //下一个it执行前等待500毫秒, //保证登录已完成。 waits(500); }); it('顺序执行',funciton(){ this.user = myojb.loginUser; runs(function(){ this.user .setName('小花'); }); runs(function(){ this.user .setAge(26); }); waitFor(function(){ if(findFriends(this.user)){ this.friends = findFriends(this.user); return true; } },'条件不具备',5000); runs(function(){ console.log(this.friends); expect(this.friends).toBe('程序员'); }); }); })
和karma的配合
http://powertech.iteye.com/blog/2065922
karma默认每个包含的文件,都是用<script src="my.js"></script>这种格式包含进一个HTML文档里。
console.log($(document))即可看到:
引用
<!-- Dynamically replaced with <script> tags -->
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/jasmine.js?437512c57124d57f5ec77e2e82bfb4e3cdd15cce"></script>
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/adapter.js?8758b57ed804b1772f97ced0c9165fbc2ae4b92f"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.js?b08cf5128a86aea81cc62981679dd1612cad97a1"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.cookie.js?bfe7d4d0c3bfb70871cab51bd8f462ca78a38ad3"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.md5.js?44c1e596e0ade9981f1309503ee505588c27ec8c"></script>
<script type="text/javascript" src="/base/public_html/lib/bootstrap3.1.1/js/bootstrap.min.js?5814e91bb6276f4de8b7951c965f2f190a03978d"></script>
<script type="text/javascript" src="/base/public_html/lib/underscore-min.js?08092373bfbdb7924dd01795779e171e66f038cd"></script>
<script type="text/javascript" src="/base/public_html/lib/backbone.js?ae0af2f4065288db615051160ce7d9a7c609421c"></script>
<script type="text/javascript" src="/base/public_html/js/base/Distance.js?b302ee794838832c74089b938b0983694e41bb41"></script>
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/jasmine.js?437512c57124d57f5ec77e2e82bfb4e3cdd15cce"></script>
<script type="text/javascript" src="/absoluteC:/Users/consumer/AppData/Roaming/npm/node_modules/karma-jasmine/lib/adapter.js?8758b57ed804b1772f97ced0c9165fbc2ae4b92f"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.js?b08cf5128a86aea81cc62981679dd1612cad97a1"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.cookie.js?bfe7d4d0c3bfb70871cab51bd8f462ca78a38ad3"></script>
<script type="text/javascript" src="/base/public_html/lib/jquery.md5.js?44c1e596e0ade9981f1309503ee505588c27ec8c"></script>
<script type="text/javascript" src="/base/public_html/lib/bootstrap3.1.1/js/bootstrap.min.js?5814e91bb6276f4de8b7951c965f2f190a03978d"></script>
<script type="text/javascript" src="/base/public_html/lib/underscore-min.js?08092373bfbdb7924dd01795779e171e66f038cd"></script>
<script type="text/javascript" src="/base/public_html/lib/backbone.js?ae0af2f4065288db615051160ce7d9a7c609421c"></script>
<script type="text/javascript" src="/base/public_html/js/base/Distance.js?b302ee794838832c74089b938b0983694e41bb41"></script>
文件的加载顺序和配置顺序是一样的。
所以可以写一些前置的测试用例,用来初始化测试环境,比如设置登录用户,预加载页面内容
伪造服务器响应,修改服务器地址,设置全局变量,使用waits等待加载等。
当这些测试用测跑完,相当于走了一个初始化过程,再开始其它的测试用例,会省去很多重
复代码。
如:
引用
start config\karma.conf.js
INFO [karma]: Karma v0.12.9 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 34.0.1847 (Windows 7)]: Connected on socket wxF-ypt_qN_FJCIwnwtA with id 65078817
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
LOG: 'XX测试,初始化...'
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
LOG: '模拟用户登录……'
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
INFO [karma]: Karma v0.12.9 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 34.0.1847 (Windows 7)]: Connected on socket wxF-ypt_qN_FJCIwnwtA with id 65078817
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
LOG: 'XX测试,初始化...'
Chrome 34.0.1847 (Windows 7): Executed 0 of 14 SUCCESS (0 secs / 0 secs)
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
LOG: '模拟用户登录……'
Chrome 34.0.1847 (Windows 7): Executed 1 of 14 SUCCESS (0 secs / 0.133 secs)
作完这些操作后,其它的测试用例跑起来很方便。
karma里测试文件的加载方式:
http://powertech.iteye.com/blog/2065922
默认情况下,所有文件都使用<script>标签直接加载到浏览器里,后台相当于存在一个小服务器。也可以将文件加载到服务器,在地址档访问,或Ajax加载。
files: [ //直接加载到浏览器 'public_html/lib/jquery.js', 'public_html/lib/jquery.cookie.js', 'public_html/lib/jquery.md5.js', 'public_html/lib/bootstrap3.1.1/js/bootstrap.min.js', 'public_html/lib/underscore-min.js', 'public_html/lib/backbone.js', 'public_html/js/base/*.js', //将文件加载到服务器后端,需要时再访问 //访问路径http://localhost:9876/base/public_html/js/somefile.js {pattern: 'public_html/**/*.html', watched: false, included: false, served: true}, {pattern: 'public_html/js/**/*.js', watched: false, included: false, served: true}, ],
发表评论
-
解决eclipse在修改js卡顿现象
2018-02-09 15:49 1427新版eclipse编辑含有javascript内容的jsp时, ... -
chosen 数据的动态更新
2016-09-08 15:28 1787chosen是个不错的复合下拉组件,缺点是文档较少 源码在gi ... -
优秀的弹层组件
2016-04-20 18:19 693http://layer.layui.com/ -
googleapis.com域名访问慢的解决办法
2016-04-13 12:09 10151、安装火狐 2、安装插件ReplaceGoogleCDN -
国内常用前端公共库CDN服务
2015-11-15 14:00 985BAIDU http://cdn.code.baidu.co ... -
jquery validate 1.14
2015-10-12 20:14 802<!DOCTYPE html PUB ... -
jquery 事件处理handler函数的参数
2015-02-08 23:22 2598jquery 事件处理handler函 ... -
jquery tr rowindex
2014-11-30 13:42 942var tr = $(this).parents('tr' ... -
jqgrid please select row warning
2014-11-23 19:42 1766引入ui.jqgrid.css即可解决 -
改变多个jquery.ready的默认顺序
2014-11-23 15:37 1307$(document).ready 这个函数的解释: 引用 D ... -
javascript 错误的继承方式
2014-11-02 23:02 734var parent = {t:1,m:2,} pare ... -
JS图片格式验证
2014-07-03 16:48 943function pic(file){ var r ... -
更改underscorejs默认的匹配符
2014-06-14 11:51 882/** 修改underscore.js默认的< ... -
uglifyjs批量压缩js
2014-06-13 16:34 2445jquery官方使用uglifyjs进行压缩的,压缩比较高 ... -
html5 canvas作的手写板【兼容手机】
2014-05-21 15:56 5300<!DOCTYPE html> <ht ... -
backbone.js model和view视图的单元测试
2014-05-20 17:32 1372backbone的模块化开发,需要引入测试流程保证代码的质量, ... -
由正则表达式html或xml标签配对说起【括号编组和正负向预查】
2014-05-15 14:17 2484经常会查找xml或HTM ... -
javascript的代理和切面
2014-05-15 13:39 749Java里有面向切面的实现方式,可以监控包、对象、函数 ... -
backbone.js路由Router的使用
2014-05-09 11:33 1597路由的使用很简单,路由的转向 router.navigate( ... -
backbone.js的View里的事件重复调用
2014-05-09 11:18 2007backbone的一个视图被初始化多次后,发现一个按钮事 ...
相关推荐
"永宏PLC与台达VFD-M变频器RTU通讯程序的极致体验:简单上手,功能强大,附教程和全套配套程序",永宏plc和台达vfd-m变頻器modbs rtu通讯程序史上最好用的plc和变頻器rtu通讯程序,甩三菱bd板通讯几条街了,程序简单易用,好上手功能强大,控制监视效果可以看视频,说走就走。 使用的是永宏fbs-20mct plc,A,B,N系列也都支持。 内容包含plc和威纶通触摸屏程序,变頻器参数设置和通讯接线,plc程序有注释,关键还有三集的教程送 ,永宏PLC;台达VFD-M变频器;Modbus RTU通讯程序;易用性;功能强大;控制监视;视频教程;永宏FBS-20MCT PLC;A、B、N系列支持;威纶通触摸屏程序;变頻器参数设置;通讯接线;教程。,永宏PLC与台达VFD-M变频器RTU通讯程序:易用强大,监控无难事
"智能电网中配电网孤岛划分与故障重构策略研究",配电网孤岛划分及故障重构 ,配电网孤岛划分; 故障重构; 电力系统稳定性; 能源管理优化; 智能算法应用。,"智能配电网孤岛划分与故障重构策略研究"
EPSON机械手与相机TCP/IP协议协同操作及PLC通讯映射触摸屏实现自动化控制,EPSON机械手跟相机搭配走tcp ip协议,及跟plc通讯将手动操作部分映射到触摸屏 ,核心关键词:EPSON机械手; 相机搭配; TCP/IP协议; PLC通讯; 手动操作; 触摸屏映射。,"EPSON机械手与相机TCP/IP通信,手动操作映射至触摸屏的PLC通讯方案"
伺服电机PLC控制案例程序详解:从基础到实践的全方位指南,伺服电机控制伺服电机案例程序整套伺服电机PLC程… ,核心关键词:伺服电机控制; 案例程序; 整套伺服电机; PLC程序; 伺服电机案例。,"伺服电机控制案例:完整程序与PLC工程实践"
Matlab主动配电网优化重构程序:基于牛顿拉夫逊法的仿真实现与最优电源接入位置研究,matlab主动配电网优化重构程序 牛顿拉夫逊法的Matlab仿真程序 以网损费用最低作为目标函数,也可以改为其他目标,最终计算出最优电源接入位置,实现配电网的优化重构 有专门的文档说明和程序注释,好理解好上手 ,核心关键词:Matlab; 主动配电网优化重构程序; 牛顿拉夫逊法仿真; 网损费用最低目标函数; 最优电源接入位置; 配电网优化重构; 文档说明; 程序注释。,"MATLAB实现主动配电网优化重构:牛顿拉夫逊法仿真及多目标优化研究"
RCC电路间歇振荡的研究资料
高清电视音频解码的定点DSP 实现
字典树的内存优化策略.pdf
西门子SMART触摸屏与两大变频器Modbus通讯实现多功能控制及数据读取文档(附详细程序与源程序文件),西门子SMART触摸屏与2台变频器通讯,通过modbus rtu与三菱FR-D700、台达MS300变频器通讯,实现正反转控制、频率设定,读取输出频率、输出电压、输出电流,有详细的程序说明和源程序文件,文档使用云笔记整理撰写 ,西门子SMART触摸屏; Modbus RTU通讯; 变频器控制; 频率设定; 输出参数读取; 程序说明; 源程序文件; 云笔记整理撰写,西门子SMART触摸屏三变频器通讯控制方案及源码详解
全国标准化知识竞赛试题库(含参考答案).pptx
BLDC控制器创新设计方案揭秘:高效能、智能化控制策略实践,BLDC控制器设计方案 ,核心关键词:BLDC控制器; 设计方案; 驱动算法; 控制系统; 性能优化; 可靠性设计; 安全性设计; 调试与测试; 通信协议; 硬件与软件整合。,基于BLDC电机的控制器设计新思路
计算两个相机相对位姿(1).py
BLDC无刷直流驱动控制板:驱动300W电机,功能丰富,含霍尔传感器,原理图与源码齐全,CAN通信总线技术,电压范围广泛,BLDC无刷直流驱动控制板资料,可驱动300W电机,已量产(STM32 CAN总线)输入电压:15~36V 驱动功率:300W~500W ,20A电流检测,CAN通信总线 功能介绍 KEY1:运行 KEY2:停止 VR1:转速调节 带霍尔传感器 提供工程原理图和源码,AD9工程 内有提供电机型号 ,核心关键词:BLDC无刷直流驱动控制板;300W电机驱动;STM32 CAN总线;输入电压范围;驱动功率范围;20A电流检测;CAN通信总线;运行功能;停止功能;转速调节;霍尔传感器;工程原理图;源码;AD9工程;电机型号。,"300W电机驱动的BLDC控制板:STM32 CAN总线、多功能接口的电机控制技术资料"
西门子S7-1200PLC与KTP700触摸屏协同控制松下伺服电机:运动控制、位置显示与以太网通讯,西门子S7-1200PLC和KTP700触摸屏控制松下伺服电机运动控制程序4 程序简介:可以实现伺服电机的正转、反转控制,相对运动,显示电机的当前位置、速度和运行状态 硬件平台:西门子S7-1200PLC(CPU1215C)+西门子KTP700触摸屏+伺服电机+伺服电机控制器 软件平台:博图V13 SP1,(V14版本可以兼容打开) 通讯协议:以太网通讯 触摸屏ip地址:192.168.0.3 PLC的IP地址:192.168.0.1 ,S7-1200PLC; KTP700触摸屏; 松下伺服电机; 正反转控制; 相对运动控制; 位置显示; 速度显示; 运行状态显示; 以太网通讯; IP地址。,西门子PLC与KTP700触摸屏控制松下伺服电机运动程序——高效精准的运动控制方案
见证取样员题库与答案.doc
Qt网络请求客户端服务器源码:并发处理、多种连接与回复格式、个性化配色、灵活拓展与跨平台支持,Qt网络请求客户端服务器源码 ### (一)、功能特点 1. 支持多个客户端连接并发同时处理, 2. 可设置http请求是长连接还是短连接,默认长连接。 3. 支持多种回复数据格式,其中包括网页内容、json数据等。 4. 服务端示例中同时包含读取文件回复、读取数据库回复。 5. 支持8种配色方案(暗黑、灰黑、深绿、浅黄、深蓝、深黑、暗蓝、默认)。 6. 客户端可指定请求地址,服务端可指定和端口进行监听。 7. 所有请求和连接都有计数,所有在线请求的IP和端口都显示在表格中。 8. 可自由拓展增加权限校验等,作为一个http请求。 9. 代码框架整洁,注释完整,支持任意Qt版本、任意编译器、任意操作系统。 ,Qt网络请求; 客户端服务器; 并发处理; 长短连接设置; 多种回复数据格式; 服务端文件数据库回复; 配色方案; 指定请求地址和监听端口; 请求连接计数; 在线IP端口显示; 权限校验; 跨平台兼容性。,Qt网络通信:多客户端并发处理、灵活配置的HTTP请求服务器源码
基于FPGA的永磁同步电机FOC三闭环控制策略研究,基于FPGA的永磁同步电机控制,FOC控制,三闭环控制 ,基于FPGA的永磁同步电机控制; FOC控制; 三闭环控制。,"基于FPGA的永磁同步电机FOC控制:三闭环控制策略"
TMS320F28335核心控制的光伏离网并网逆变器设计:Boost升压与单相全桥逆变电路结构结合方案,量产光伏离网并网逆变器设计资料(TMS320F28335) 这个是单项的,三相价格一样 本装置DC-DC采用Boost升压,DCAC采用单相全桥逆变电路结构,以TI公司的浮点数字信号控制器TMS320F28335 DSP为控制电路核心,采用规则采样法和DSP片内ePWM模块功能实现PWM和SPWM波。 PV最大功率点跟踪(MPPT)采用了恒压跟踪法(CVT法)来实现,并用软件锁相环进行系统的同频、同相控制,控制灵活简单。 注:系统DCDC和DCAC的驱动PWM都由TMS320F28335提供,离网运行。 包含:原理图 PCB 文档 源码 ,核心关键词: 1. 量产光伏离网并网逆变器设计 2. TMS320F28335 3. Boost升压 4. 单相全桥逆变电路 5. 浮点数字信号控制器 6. 规则采样法 7. MPPT(最大功率点跟踪) 8. 恒压跟踪法(CVT法) 9. 软件锁相环 10. 原理图; PCB文档; 源码,基于TMS320F28335的光伏离网并网逆变器设计资料:
西门子S7-200编程软件实战:污水处理系统全自动控制及触摸屏操作实践(包含电气原理图和主程序与子程序),西门子S7-200编程软件,触摸屏,电气原理图。 污水处理系统。 主程序及子程序,过滤,反洗,正洗,PH,加药等全自动控制。 分手动和自动控制。 供新手学习和实践。 ,关键词:西门子S7-200编程软件; 触摸屏; 电气原理图; 污水处理系统; 主程序及子程序; 过滤; 反洗; 正洗; PH控制; 加药控制; 手动控制; 自动控制; 新手学习; 实践。,西门子S7-200编程软件在污水处理系统的应用实践
谈开关电源的指标及检测