- 浏览: 600064 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (268)
- ext基础 (72)
- Java基础 (68)
- jquery (14)
- oracle (21)
- sqlserver (7)
- linux (2)
- webserver (1)
- C/C++ (1)
- sql (9)
- IDE (2)
- java 智能卡 (1)
- mysql (6)
- ibatis (2)
- struts2 (3)
- cvs (1)
- 服务器 (1)
- html (11)
- freemarker (4)
- liferay (2)
- jMS (1)
- iphone (1)
- c# (1)
- Android (11)
- wince (6)
- javascript (4)
- ps (1)
- hibernate (1)
- 其他 (3)
最新评论
-
ilyq:
请问,px.gif 在哪里
斜线表头 -
jisang:
没看懂,第一个org.js和最后的js什么关系,可否发我一份完 ...
用ExtJS 实现动态载入树(Load tree) -
JavaStudyEye:
我去,能否搞个正确点的,,,
<#list ...
freemarker 遍历map 对象 -
PangSir:
大爱,简直是大爱!!困扰这么久以来的问题,虽然知道是CSS的问 ...
ExtJs checkbox radiobox 问题 汇总 -
skynet_java:
有demo嘛!邮箱:think_world@foxmail.c ...
消息推送服务需求 - 服务器开发、客户端开发
ext.data store reader proxy
Ext.data.Record 就是一个设定了内部数据类型的对象,为store最基本组成部分,如果把store看为一张二维表,则record即为对应的一行
record 主要功能为保存数据,并且在内部数据发生改变的时记录修改的状态,它还可以保留修改之前的原始值
var PersonRecord=Ext.data.Record.create([
{name:'name',type:'string'},
{name:'sex',type:'int'}
]);
PersonRecord就为新定义的类型,包含name sex两个属性
然后使用“new”创建personRecord实例
var boy=new PersonRecord({
name:'boy',
sex:0
});
以下三种看、都可以获得name属性
alert(boy.data.name);
alert(boy.data['name']);
alert(boy.get('name'));
修改boy属性值应该使用set()函数
boy.set('name','body name');
set函数会判断属性值是否变化,如果改变,就当当前对象的dirty属性值设为true,并将修改之前的值放入 modify对象中,工其他函数使用,修改后执行
commit() 设置dirty为false 删除modify 对象中的值
reject()撤销 回复原来的值 ,,其他同上面
getChanges()获取修改的部分 返回类型为 {name:'body name'}
isModified()判断当前record中的值是否修改
ext.data.Store
它包含一个Record数组,最少需两个组件支持,为proxy reader proxy从某个途径获取数据 ,reader 将原始数据转换成record实例
var data=[['boy',0],['girl',1]];
var store=new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data);
reader:new Ext.data.ArrayReader({},PersonRecord)
});
srore.load();
对数据排序
var store=new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader:new Ext.data.ArrayReader({},PersonRecord),
sortInfo:{fiels:name,direction:'DESC'}
});
与排序相关参数有remoteSort,这个参数实现后台排序功能,
store.setDefaultSort('name','DESC');
获取排序信息:getSortState() 返回{field:"name",direction:"DESC"}json对象
还有RemoteSort,这个参数实现后台排序功能,当remoteSort:true store在向后台请求数据的时自动加入sort,dir两个参数,会每次导致执行sort()时,都要到后台重新加载数据,而不能对本地数据进行排序
从store中获取数据
store.getAt(0).get('name')
for(var i=0;i<store.getCount();i++){
var record=store.getAt(i);
alert(record.get('name');
}
或者
store.each(function(record){
alert(record.get('name');
}
也可以使用getRange()函数练习获取多个record,只需要制定开始于结束的索引值
var records=store.getRange(0,1);
for(var i=0;i<records.length;i++){
var record=records[i];
alert(record.get('name');
}
不知record id,也可以根据record
find(String property, String/RegExp value,[Number startIndex],[Boolean anyMatch],[Boolean caseSensitive]):Number
第一个 代表搜索的字段名。第二个value 匹配的字符串或正则表达式,第三个从第几行开始
第四个为TRUE时,不必从头开始匹配;第五个 为TRUE 是区分大小写.前两个必填
var index=store.find('name','g');
alert(store.getAt(index).get('name');
与find对应还有findBy
findBy(Function fn,[Object scope],[Nmber index])Number
index=store.findBy(function(record,id){
return record.get('name')=='girl'&&record.get('sex')==1;
});
alert(store.getAt(index).get('name'));
还可以通过query和queryBy对store查询,与find不同的是query queryBy返回一个MixCollection对象,里面包含所搜索到得数据
alert(store.query('name','boy'));
alert(store.queryBy(function(record){
return record.get('name')=='girl'&& record.get('sex')==1;
}));
更新store中的数据
add(Ext.data.Record[] records)向store末尾添加一条或多条record,参数可以是一个record实例
store.add(new PersonRecord({
name: 'other',
id: 0
}));
添加一个record数组,
store.add([new PersonRecord({
name:'other1',
sex:0
}),
new PersonRecord({
name:'other2',
sex: 0
})]);
使用add函数会破坏原有的排序
故使用addSorted(),会在添加新数据后,立即对store进行排序,可以保证store中的数据有序显示
store.addSorted(new PersonRecord({
name:'1111',
sex:1
}));
插入:store.insert(3,new PersonRecord({
name:'other',
sex:0
})); //数组同样适用
删除:store.remove(store.getAt(0));
store.removeAll();
store中没有专门提供修改某一行record的操作,需要先获取一个record,对这个record的内部数据的修改会直接反应到store上
store.getAt(0).set('name','XXXXX');
修改之后有2种选择:1.rejectChanges()撤销所有修改,恢复到最初额状态
2.commitChanges()提交修改
在撤销或提交之前,可getModifiedRecords()获取store中修改过的record数组
与修改数据相关的参数是pruneModifiedRecords,如果将它设为true,当每次执行完删除,,或reload操作后,都会清空所有数据。这样,,getModifiedRecords()返回一个空数组,否则,依然会是上次修改过的record记录
加载及显示数据
store.load({
params:{start:0,limit:20},//加载时发送附加参数
callback:function(records,options,success){
//records 获得的参数
//options 执行load()传递的参数
//success 是否加载成功
Ext.Msg.alert('info','加载完毕');
},
scope:store //回调函数执行时的作用域
add:true //为TRUE 添加在原来store数据末尾。否则将原数据清空,,
//再将得到的 数据放入store
});
通常 为了对store中的数据进行初始化,load()函数只需执行一次,如果用params参数指定了需要使用的参数,以后再次执行reload()重新加载数据时,
store会自动使用上次load()包含的params参数内容
过滤数据 filter 使用方法同find
store.filter('name','boy');
store.filter(function(record){
return record.get('name')=='girl'&& record.get('sex')==-1;
});
取消过滤,并显示所有数据,调用clearFilter()
store.clearFilter();
判断store是否设置了过滤器,通过isFiltered()判断
==================================================================================
Ext.data.Record 就是一个设定了内部数据类型的对象,为store最基本组成部分,如果把store看为一张二维表,则record即为对应的一行
record 主要功能为保存数据,并且在内部数据发生改变的时记录修改的状态,它还可以保留修改之前的原始值
var PersonRecord=Ext.data.Record.create([
{name:'name',type:'string'},
{name:'sex',type:'int'}
]);
PersonRecord就为新定义的类型,包含name sex两个属性
然后使用“new”创建personRecord实例
var boy=new PersonRecord({
name:'boy',
sex:0
});
以下三种看、都可以获得name属性
alert(boy.data.name);
alert(boy.data['name']);
alert(boy.get('name'));
修改boy属性值应该使用set()函数
boy.set('name','body name');
set函数会判断属性值是否变化,如果改变,就当当前对象的dirty属性值设为true,并将修改之前的值放入 modify对象中,工其他函数使用,修改后执行
commit() 设置dirty为false 删除modify 对象中的值
reject()撤销 回复原来的值 ,,其他同上面
getChanges()获取修改的部分 返回类型为 {name:'body name'}
isModified()判断当前record中的值是否修改
ext.data.Store
它包含一个Record数组,最少需两个组件支持,为proxy reader proxy从某个途径获取数据 ,reader 将原始数据转换成record实例
var data=[['boy',0],['girl',1]];
var store=new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data);
reader:new Ext.data.ArrayReader({},PersonRecord)
});
srore.load();
对数据排序
var store=new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader:new Ext.data.ArrayReader({},PersonRecord),
sortInfo:{fiels:name,direction:'DESC'}
});
与排序相关参数有remoteSort,这个参数实现后台排序功能,
store.setDefaultSort('name','DESC');
获取排序信息:getSortState() 返回{field:"name",direction:"DESC"}json对象
还有RemoteSort,这个参数实现后台排序功能,当remoteSort:true store在向后台请求数据的时自动加入sort,dir两个参数,会每次导致执行sort()时,都要到后台重新加载数据,而不能对本地数据进行排序
从store中获取数据
store.getAt(0).get('name')
for(var i=0;i<store.getCount();i++){
var record=store.getAt(i);
alert(record.get('name');
}
或者
store.each(function(record){
alert(record.get('name');
}
也可以使用getRange()函数练习获取多个record,只需要制定开始于结束的索引值
var records=store.getRange(0,1);
for(var i=0;i<records.length;i++){
var record=records[i];
alert(record.get('name');
}
不知record id,也可以根据record
find(String property, String/RegExp value,[Number startIndex],[Boolean anyMatch],[Boolean caseSensitive]):Number
第一个 代表搜索的字段名。第二个value 匹配的字符串或正则表达式,第三个从第几行开始
第四个为TRUE时,不必从头开始匹配;第五个 为TRUE 是区分大小写.前两个必填
var index=store.find('name','g');
alert(store.getAt(index).get('name');
与find对应还有findBy
findBy(Function fn,[Object scope],[Nmber index])Number
index=store.findBy(function(record,id){
return record.get('name')=='girl'&&record.get('sex')==1;
});
alert(store.getAt(index).get('name'));
还可以通过query和queryBy对store查询,与find不同的是query queryBy返回一个MixCollection对象,里面包含所搜索到得数据
alert(store.query('name','boy'));
alert(store.queryBy(function(record){
return record.get('name')=='girl'&& record.get('sex')==1;
}));
更新store中的数据
add(Ext.data.Record[] records)向store末尾添加一条或多条record,参数可以是一个record实例
store.add(new PersonRecord({
name: 'other',
id: 0
}));
添加一个record数组,
store.add([new PersonRecord({
name:'other1',
sex:0
}),
new PersonRecord({
name:'other2',
sex: 0
})]);
使用add函数会破坏原有的排序
故使用addSorted(),会在添加新数据后,立即对store进行排序,可以保证store中的数据有序显示
store.addSorted(new PersonRecord({
name:'1111',
sex:1
}));
插入:store.insert(3,new PersonRecord({
name:'other',
sex:0
})); //数组同样适用
删除:store.remove(store.getAt(0));
store.removeAll();
store中没有专门提供修改某一行record的操作,需要先获取一个record,对这个record的内部数据的修改会直接反应到store上
store.getAt(0).set('name','XXXXX');
修改之后有2种选择:1.rejectChanges()撤销所有修改,恢复到最初额状态
2.commitChanges()提交修改
在撤销或提交之前,可getModifiedRecords()获取store中修改过的record数组
与修改数据相关的参数是pruneModifiedRecords,如果将它设为true,当每次执行完删除,,或reload操作后,都会清空所有数据。这样,,getModifiedRecords()返回一个空数组,否则,依然会是上次修改过的record记录
加载及显示数据
store.load({
params:{start:0,limit:20},//加载时发送附加参数
callback:function(records,options,success){
//records 获得的参数
//options 执行load()传递的参数
//success 是否加载成功
Ext.Msg.alert('info','加载完毕');
},
scope:store //回调函数执行时的作用域
add:true //为TRUE 添加在原来store数据末尾。否则将原数据清空,,
//再将得到的 数据放入store
});
通常 为了对store中的数据进行初始化,load()函数只需执行一次,如果用params参数指定了需要使用的参数,以后再次执行reload()重新加载数据时,
store会自动使用上次load()包含的params参数内容
过滤数据 filter 使用方法同find
store.filter('name','boy');
store.filter(function(record){
return record.get('name')=='girl'&& record.get('sex')==-1;
});
取消过滤,并显示所有数据,调用clearFilter()
store.clearFilter();
判断store是否设置了过滤器,通过isFiltered()判断
==================================================================================
<script type="text/javascript" src="../../ext-all.js"></script> <script type="text/javascript"> Ext.onReady(function(){ var cm = new Ext.grid.ColumnModel([ {header:'编号',dataIndex:'id',width:35}, {header:'名称',dataIndex:'name',width:80}, {header:'描述',dataIndex:'descn',width:120} ]); var data = [ ['1','name1','descn1'], ['2','name2','descn2'], ['3','name3','descn3'], ['4','name4','descn4'], ['5','name5','descn5'] ]; var store = new Ext.data.Store({ proxy: new Ext.data.MemoryProxy(data), reader: new Ext.data.ArrayReader({}, [ {name: 'id'}, {name: 'name'}, {name: 'descn'} ]) }); store.load(); var grid = new Ext.grid.GridPanel({ autoHeight: true, renderTo: 'grid', store: store, cm: cm, viewConfig: { forceFit: true } }); grid.on('mouseover',function(e){//添加mouseover事件 var index = grid.getView().findRowIndex(e.getTarget());//根据mouse所在的target可以取到列的位置 if(index!==false){//当取到了正确的列时,(因为如果传入的target列没有取到的时候会返回false) var record = store.getAt(index);//把这列的record取出来 var str = Ext.encode(record.data);//组装一个字符串,这个需要你自己来完成,这儿我把他序列化 var rowEl = Ext.get(e.getTarget());//把target转换成Ext.Element对象 rowEl.set({ 'ext:qtip':str //设置它的tip属性 },false); } }); var win = new Ext.Window({ id:'window', el:'window-win', layout:'fit', width:500, height:270, closeAction:'hide', items: [grid] }); win.show(); Ext.QuickTips.init();//注意,提示初始化必须要有 }); </script>
发表评论
-
将博客搬至CSDN
2023-02-06 16:57 413https://www.iteye.com/blog/user ... -
Liferay Portal 应用之开发(1)
2012-02-27 14:09 18361.下载安装Eclipse Eclipse ... -
liferay Portal (1) 应用之配置
2012-02-27 13:59 1352Liferay Portal缺省只有一 ... -
ext form
2011-05-18 15:25 1058//grid1定义的grid var record = gr ... -
combox
2011-04-27 10:55 16261.服务器数据作为ComboBox的数据源 实例 首先从服务 ... -
ext grid 单元格
2010-12-29 11:17 1100listeners : { cellcli ... -
combox 默认值
2010-12-20 10:35 3053[ {"abbr":&quo ... -
Ext.DateField 格式
2010-12-17 10:11 1516Ext.DatePicker,该类为我们提供了一个占地面积很广 ... -
extjs的grid控件如何根据值来设置某行的背景颜色
2010-12-17 09:40 8141根据不同的值来设置grid的背景颜色 在viewConfig ... -
动态组件
2010-12-16 17:05 1096Ext.onReady(function() { ... -
js 获取路径
2010-12-13 19:02 1438<br>以下为输出: <br> ... -
矫正对象 信息登记
2010-12-08 14:10 1011矫正对象登记 { frame : true ... -
转 ext Demo
2010-12-05 13:17 1530下面这个是主界面的设计 Ext.onReady(funct ... -
下拉框 控制 列是否可读
2010-11-12 08:33 1155Ext EditorGrid单元格控制小记 http://d ... -
extjs formpanel 怎么显示图片
2010-10-02 10:13 3637//可加普通的panel,html属性直接添加html代码 ... -
动态 改变 column样式
2010-09-30 16:35 1241grid.getView().getCell(rowNum , ... -
js 应用
2010-09-29 14:38 1069JS里 面的new Date("xxxx/xx/xx ... -
grid 表头 鼠标事件
2010-09-24 16:04 1965grid.addListener("cellclic ... -
格式化
2010-08-26 00:32 1468//创建edgrid.js Ext.onReady(func ... -
ext (增 ,删,改 ,查,导出excel)
2010-08-26 00:03 1908下面为扩张grid的 代码 ...
相关推荐
基于S7-300PLC与MCGS6.2的饮料罐装生产线自动化控制系统设计,包含仿真、程序、IO表与电气原理,实现自动操作、灌装报警及瓶数记录功能。,基于PLC的饮料罐装生产线控制系统设计。 S7-300PLC MCGS6.2仿真 仿真,程序,IO表,电气原理图,6500字说明。 实现功能有: (1)系统通过开关设定为自动操作模式,一旦启动,则传送带的驱动电机启动并一直保持到停止开关动作或罐装设备下的传感器检测到一个瓶子时停止;瓶子装满饮料后,传送带驱动电机必须自动启动,并保持到又检测到一个瓶子或停止开关动作。 (2)当瓶子定位在灌装设备下时,停顿1秒,罐装设备开始工作,灌装过程为5秒钟,罐装过程应有报警显示,5秒后停止并不再显示报警。 (2)用两个传感器和若干个加法器检测并记录空瓶数和满瓶数,一旦系统启动,必须记录空瓶和满瓶数,设最多不超过99999999瓶。 (4)可以手动对计数器清零(复位)。 ,关键词:S7-300PLC; MCGS6.2仿真; 传送带驱动电机; 传感器检测; 瓶装; 空瓶数; 满瓶数; 报警显示; 自动操作模式; 灌装设备。,基于S7-300PLC的饮料罐装
python加密货币时间序列预测源码+数据集-最新出炉 加密货币分析: 对各种加密货币的数据进行分析和研究。可能会使用到从各种来源收集的数据,包括但不限于加密货币的价格、市值、交易量、交易时间等信息。 探索加密货币市场的趋势和模式,例如价格的波动情况、不同加密货币之间的相关性等。 数据处理与操作: 可能使用 Python 语言(Kaggle 上常用的数据分析语言),并运用一些数据处理和分析的库,如 pandas 用于数据的读取、清洗、整理和转换操作,将原始的加密货币数据转换为更易于分析的格式。 可视化展示: 通过可视化工具,如 matplotlib 或 seaborn 库,将加密货币的信息以图表的形式展示出来,以帮助直观地理解数据中的关系和趋势。 统计分析或预测: 可能会进行一些基本的统计分析,如计算加密货币价格的均值、中位数、标准差等统计量,以描述数据的特征。 或者使用机器学习或时间序列分析的方法对加密货币的价格进行预测,根据历史数据预测未来价格走势。 例如,使用 scikit-learn 进行简单的回归分析: 数据挖掘与特征提取: 挖掘加密货币数据中的特征,如找出影响价格的关键因素,对数据中的特征进行筛选和提取,以帮助更好地理解加密货币的市场行为。
类和对象、继承、封装、多态、接口、异常
gee python相关教程
夜间灯光强度(平均灯光强度)的高低反映了一个地区城市化发展的水平,平均灯光强度越高,说明该地区城市群越多,城市化程度越高。夜间灯光数据现在越来越广泛地应用于经济增长分析、经济地理、城市经济学、数字经济等众多领域。 本数据包括三套: [1]中国类DMSP-OLS灯光数据1992-202 [2]中国超长序列灯光数据1984-2020 [3]全球类NPP-VIIRS夜间灯光数据2000-2022 包括:全国各省、市、县夜间灯光数据 矫正后夜间灯光数据 细分:标准差、平均值、总值、最大值和最小值
工程项目总监绩效考核表
首先解释一下什么叫转移支付。其实,这和养老金的中央调剂是一样的。 每年,地方都要向中央缴纳财政。而中央又要根据各地方的财政实力,给予转移支付。比如一些经济弱省,本身财政收入就不够支出的,还得上交一部分给中央,怎么维持财政运转?由于各省市直接的财政收入能力存在差异,中央为实现各个地方的公共服务水平平等,于是便有了财政转移支付制度。 简单理解就是富省养穷省。 2022年全国一般预算内财政收入203703亿元,给地方转移支付了97144.75亿元,转移支付数额创下新高。
基于门控卷积和堆叠自注意力的离线手写汉字识别算法研究.pdf
【数据介绍】 作为第二大人类部门用水,高质量的工业用水格网数据对于水资源研究和管理至关重要。中国工业用水格网数据(China Industrial Water Withdrawal dataset, CIWW)基于超过 40 万家企业数据、月度工业产品产量数据和连续工业用水统计数据制作得到的一套1965-2020年逐月中国工业用水数据集,其空间分辨率为 0.1°和 0.25°。数据集包括工业用水、企业数量和企业生产总值(辅助数据)等变量,可被用于水文、地理学、环境、可持续发展等方面科学研究。 【数据来源】 数据来源为《中国经济普查年鉴》(省级工业取水量、工业产出)、《中国工业企业数据库》(企业地理位置、产值)、《中国工业产品产量数据库》(工业产品月生产量),以及《中国水资源公报》和(Zhou et al, 2020, PNAS)的工业用水量数据。 【数据处理】 首先通过2008年企业分布数据、经济普查年鉴中分省分部门的工业用水量和工业产值计算得到分省分部门工业用水效率和工业产品产量数据,得到了2008年逐月工业用水数据。然后结合中国水资源公报和相关文献中省级工业用水数据,以2008年工业用水的时空格局作为基础分配工业用水数据,最终得到1965-2020年逐月工业用水的格网数据。详细方法见High-resolution mapping of monthly industrial water withdrawal in China from 1965 to 2020 (Hou et al, 2024, ESSD). 将数据集与统计数据记录和其他数据集进行了验证,结果表示在时间尺度和空间尺度上都与统计数据具有一致性,相比已有工业用水数据有更好的精度。
65 -质量管理部经理绩效考核表1
11 -电脑部经理绩效考核表1
内容概要:本文提供了针对大学生英语竞赛写作准备的重要资源——一系列通用的英文句子模板。这些模板涵盖了现代经济社会的各种话题,从科技进步到环境保护,以及个人品质和社会责任等,并且适用于论述类文章、观点对比和个人见解的表达。文章通过对每一句话的应用环境解释和语法提示,确保使用者可以在实际写作中正确且有效地应用这些表达方式。 适合人群:正在准备参加大学生英语竞赛的学生及其他希望提高书面表达能力的学习者。 使用场景及目标:考生能够在竞赛时间内迅速构建思路完整的文章,增强语言表达的流利性和规范性;帮助学习者积累高级词汇,提升英语写作水平并培养良好的思维逻辑。 阅读建议:结合历年优秀范文进行深入学习,熟悉不同类型话题下的表述方法;练习将提供的句子融入自身创作的文章中,通过不断修订和完善来巩固记忆。同时也可以用于日常的英语写作训练当中。
法律事务专员绩效考核表
1、文件内容:apache-commons-digester-javadoc-1.8.1-19.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/apache-commons-digester-javadoc-1.8.1-19.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
永磁同步电机磁场定向控制(矢量控制)Simulink仿真模型波形展现与解析,永磁同步电机的磁场定向控制(矢量控制)simulink仿真模型,波形完美 ,核心关键词:永磁同步电机; 磁场定向控制(矢量控制); Simulink仿真模型; 波形完美;,永磁同步电机矢量控制仿真模型:磁场完美调控,波形精确无误
07 -储运部经理绩效考核表1
OQC检验员(成品出货检验员)绩效考核表
基于Matlab2020b的电机控制算法:无传感FOC算法Simulink仿真模型及实践指导,定位+电流闭环强拖+ 角度渐变切+ 速度电流双闭环+ 无传感器角度估算SMO+ PLL 控制方式 Simulink 仿真模型 (Matlab2020b版本)以及教授模型搭建 这是一种常用的无传感FOC电机控制算法,掌握这种算法的基本原理,并有仿真模型在手,就可以用它来指导实践中的程序调试,做到实际项目不盲目调试。 模型特点: 1. 所有模块都做到了模块化,各个模块分区清楚,结构清晰。 2. 所有电机和控制参数均在m文件中体现,变量注释清楚,随用随改。 3. 速度环和电流环PI参数均实现自动整定。 4. 模型采用标幺值系统。 5. 各状态切使用stateflow,模型结构清晰。 6.通用表贴和内嵌式电机。 ,定位;电流闭环强拖;角度渐变切换;速度电流双闭环;无传感器角度估算SMO;PLL控制方式;Simulink仿真模型;Matlab2020b版本建模;教授模型搭建;模块化设计;参数自动整定;标幺值系统;Stateflow应用;通用表贴和内嵌式电机。,基于Matlab 2020b的FOC电机