第一篇:电动车控制器介绍
电动车控制器介绍
电动车控制器是用来控制电动车电机的启动、运行、进退、速度、停止以及电动车的其它电子器件的核心控制器件,它就象是电动车的大脑,是电动车上重要的部件。
我们开发的智能型无刷电动车控制器采用了美国cypress公司的方案,采用性能非常优异单片机作为主控芯片,来实现控制和保护电动车的电机、电池,使电动车驱动系统工作在最佳状态,从而提高产品的可靠性和使用寿命;采用霍尔电子无级调速系统,具有欠压保护、过流保护、堵转保护等保护功能,可靠的对电动车电机和电池进行保护,确保电动车使用及安全;加入了全新的无刷电机控制器理论,具有反充电/EABS刹车功能,用户在关掉电源的情况下可把电机锁死,使车子很难推行,另外还加入1+1助力系统,具有巡航功能,模式切换功能,实现了真正的智能型控制。
一、控制器功能:
1、工作电压: DC 48V;
2、功率: 350W 450W 500W;
3、欠压保护: DC 41.5V ±1V(也可根据用户要求设定);
4、电动模式:霍尔电子无级调速系统,调速范围 0~100%,1.1~4.2V;
5、限流电流:≤17A(平均值),最大脉冲电流35A(根据用户要求设定);
6、限速功能:最高车速可达35km/h~45km/h(根据电机而定),限速行驶速度控制在20km/h以内;
7、启动方式:手柄控制启动快慢,控制灵活;
8、刹车:EABS+机械刹,高/低电平;
9、巡航模式:具有自动巡航和手动巡航两种功能可选,8秒进入巡航,稳定行驶速度,无须手柄控制;
10、1+1助力功能:控制器根据骑车者脚踏力的大小(速度快慢),给出相应比例的电机动力,实现了在骑行中辅以动力,让骑行者感觉更轻松,中轴转速智能型;
11、堵转保护功能:自动判断电机在过流时是处于完全堵转状态还是在运行状态
或电机短路状态,如过流时是处于运行状态,控制器将限流值设定在固定值,以保持整车的驱动能力;如电机处于纯堵转状态,则控制器2秒后将限流值控制在10A以下,起到保护电机和电池,节省电能;如电机处于短路状态,控制器则使输出电流控制在2A以下,以确保控制器及电池的安全。
12、防飞车功能:解决了无刷控制器由于转把或线路故障引起的飞车现象,同时
具有启动防飞车功能,提高了系统的安全性。
13、电机锁功能:在关闭电门锁的情况下,控制器能自动将电机锁死,实现了部
件级的防盗功能,解决了防盗型控制器在警戒状态下控制器还必须工作,工作电流大的不利因素。
14、遥控功能:在关闭电门锁的情况下,控制器通过遥控报警器自动在将电机锁
死的同时具有报警功能,实现了遥控与部件级的双重防盗功能,解决了防盗型控制器在警戒状态下控制器还必须工作,工作电流大的不利因素。并可在车场中通过遥控器寻车。
15、反充电功能:滑行时可对电池进行反充电,在延长了电池的行驶时间的同时
增加了电池的使用寿命,解决了电池在行驶时的行驶时间短和使用寿命不长的问题。
16、电机选择:解决了正、反相绕阻电机之间不兼容的现象,方便了用户的使用。17、120º/60º选择:120º与60º电机可相互切换。
18、指示灯显示代码:
1、指示灯常灭:控制器进入运行状态;
2、指示灯亮0.5灭0.5秒闪烁一次,灭1秒:控制器进入待机状态;
3、指示灯亮0.5灭0.5秒闪烁二次,灭1秒:刹车信号;
4、指示灯亮0.5灭0.5秒闪烁三次,灭1秒:MOS损坏;
5、指示灯亮0.5灭0.5秒闪烁四次,灭1秒:飞车保护;
6、指示灯亮0.5灭0.5秒闪烁五次,灭1秒:电流故障;
7、指示灯亮0.5灭0.5秒闪烁六次,灭1秒:电源电压低保护;
8、指示灯亮0.5灭0.5秒闪烁七次,灭1秒:霍尔信号故障;
9、指示灯亮0.5灭0.5秒闪烁八次,灭1秒:手柄信号未接。
二、使用方法:
1、在接线前先切断电源,按接线图所示连接各根导线;
2、该控制器应安装在通风、防水、防震部位;
3、控制器限速控制插头应放置容易操作的地方;
4、控制器接插件应接插到位,禁止将控制器电源正负极反接;
5、测试后装进铝壳之前,建议放电。
第二篇:电动车控制器设计方案
电动自行车控制器设计
电动自行车控制器方案
2012/11/5
电动自行车控制器设计
目录
第一章 概述-------------3
第二章 系统需求分析-------4
第三章 控制器分析---------6
一、电动车控制器框图------6
二、控制器关键功能分析-----7
第四章 控制器设计----------9
一、硬件设计---------9
二、软件设计----------12
电动自行车控制器设计
第一章 概述
近年来,随着改革开放和经济发展日益深刻,人民生活水平日渐提高,出行交通工具也发生前所未有的变化。老百姓出行不仅考虑快捷、方便,还追求时尚环保,因此近年来电动自动自行车日益受老百姓喜爱。作为电动自行车,其核心控制器则是电动自行车的关键,控制的好坏决定车子的平稳、安全、舒适,因此一个功能全面、可靠性强、符合要求的控制器决定了电动自行车的质量。为了使得电动自行车有良好的体验和可靠的质量保证,因此本文介绍一种控制器的设计方案。
电动自行车控制器设计
第二章 系统需求分析
1、具有安全检测功能,检测电池电压,电流
需要检测电池中电流,电池电流不能过大,防止损伤电池;
需要检查电机中的电流,并且识别是否是电机堵转还是车子上坡或者负载过大,并且限制电机电流17A以下,在15~17A间切换,防止大电流长时间烧坏电机;
检测电池电压,电池电压大于电机额定电压120%时,发出报警铃声,提醒电压过大,不能驱动电机;
2、显示速度和里程数
利用三位数码管显示里程数,范围0~999Km,保证每分钟更新一次;
用5个发光二极管显示速度,表示5个档位,每个档位间隔速度为10Km/h,即表示的速度为10Km/h、20Km/h、30Km/h、40Km/h、50Km/h,速度在哪个档位,对应发光二极管闪亮。
3、具有转向灯控制电路
当打开转向灯开关时,对应的转向灯每隔0.5秒闪一次,每次持续0.5秒
电动自行车控制器设计
4、照明灯控制电路
当打开照明灯时,在仪表盘上显示照明打开,用一个发光二极管。
5、具有报警功能
当钥匙开关不再车上时,若轮子速度有变化,即发出报警声音。
电动自行车控制器设计
第三章 系统分析
一、电动车控制器框图
上图是整车的控制系统框图,主要有电源、电机、控制器等,其中控制器位于核心地位,是整个控制系统的关键,也是负责组织各个部分协调工作的中心。其具体的控制框图如下图所示:
电动自行车控制器设计
电源降压模块灯管驱动电路照控速盘电压信号刹车信号信号转换电路WM灯P向、转明灯转向灯、照明灯信号信号转换电路PIC芯片信号转换电路MOS驱动电路电机电源输出电路电机电路电流、电机电压蜂鸣器P信号转换电路WM三极管驱动电路电机霍尔信号电压、里程显示输出数码管显示电路电源
从图中可以看出,控制器由单片机及其外围电路构成,包括输入信号处理电路、输出信号处理电路、电源电路等。
二、控制器关键功能分析 控制器功能:
1、改变电机速度
即调速功能,检测车把电压,根据车把设定速度来进行速度设定。同时检测霍尔传感器计数值,作为当前速度,通过PID调节来计算应该输出的PWM波。
2、刹车功能
检测刹车信号,当刹车有效时,将速度设定值强制变为零,输出PWM也变为零。
电动自行车控制器设计
3、有防过压、过流检测电路
检测电源电压,低压报警,防止损伤电池; 检测电源电流,当电流过大时适当降速,限制电流在合理区间,防止烧坏电机、电源。
4、显示电池电压、车速、里程数
将车子的速度用数码管显示在仪表盘上,将电池电压通过发光二极管显示在仪表盘上。
5、防盗
当车子锁上时,车轮子有转动则报警。
6、照明灯控制开关、转向灯控制开关
可以采用双刀双掷开关,一个可控制强电信号,另一个给单片机进行检测。
电动自行车控制器设计
第四章 控制器设计
控制器是电动自行车的核心,要实现的功能有:
1、可以改变电机速度
2、可以刹车
3、有防过压、过流检测电路
4、显示电池电压、车速、里程数
5、防盗
控制器不仅要具有所有功能并且引出相关信号线,而且要有合适的外观尺寸,并且可以对内部电路进行保护。
一、硬件设计
1、电机驱动电路设计
由V1~V6六只功率管构成的驱动全桥可以控制绕组的通电状态。按照功率管的通电方式,可以分为两两导通和三三导通两种控制方式。由于两两导通方式提 供了更大的电磁转矩而被广泛采用。在两两导通方式下,每一瞬间有两个功率管导通,每隔1/6周期即60°电角度换相一次,每只功率管持续导通 120°电角度,对应每相绕组持续导通120°,在此期间相电流方向保持不变。
电动自行车控制器设计
为保证产生最大的电磁转矩,通常需要使绕组合成磁场与转子 磁场保持垂直。由于采用换相控制方式,其定子绕组产生的是跳变的磁场,使得该磁场与转子磁场的位置保持在60°~120°相对垂直的范围 区间。
2、照明灯、转向灯、速度显示仪表
单片机检测到照明灯亮暗,转向灯亮暗及方向,将其显示在仪表盘上,灯的亮暗是通过三个发光二极管来显示的。由于一般的发光二极管20mA的电流就可以驱动,因此可以用单片机I/O引脚直接驱动。
至于速度显示,可以通过数码管显示,数码管可以用三个,显示范围是0.0 ~99.9KM/h,可以用三极管控制选择端,每次选择一个数码管,进行给值,单片机输出的是四位信号,可以显示0~9的BCD码,通过数码管显示驱动芯片转换为数码管的7段码,则选中的数码管显示对应的数字,通过不断给数码管写值则可以达到看起来连续的效果。
电动自行车控制器设计
或者要节省成本,其实速度显示可以仅显示档位,比如0~5km/h、5~10km/h、10~15km/h、15~20km/h、20~25km/h 分为5档,每档对应一个发光二极管,当速度在对应的档位时,对应的发光二极管亮,其他的不亮。
3、电池电压检测电路
检测电池电压需要对电池电压进行采样,采样电路的作用是强弱分离,对单片机引脚进行保护,同时对电池电压进行变换,变到适合单片机A/D引脚采样的范围。
采样电路可以先用电容进行滤波,然后接上一个输入电阻很大的变换电路,可以通过741等放大器实现,然后对比较后的电压进行电阻分压转换,转换到0~3.3V,适合单片机采样。
4、电机电流检测、电池电流检测、漏电检测
在待检测的电路中串入阻值很小的电阻(注意大电流电路中电阻必须要有较大的功率),然后对电阻两侧的电压取样,经过后级差值比较电路得出压差。差值转换可以采用741,然后在进行放大缩小变化,转换成0~3.3V的范围,可以接入单片机A/D引脚进行电压检测,然后除以电阻及变比等即可得到对应线路的电流。通过和每个线路设定电流阈值及车状态检测,即可得到是否过流、是否漏电等信息。
电动自行车控制器设计
5、报警电路
单片机通过I/O引脚输出报警信号开关,然后通过三极管驱动蜂鸣喇叭来提示是否有紧急情况。通过不同频率的信号分辨不同的报警信息。
6、防盗电路
防盗检测其实是检测轮子是否转动来实现的,即利用霍尔器件检测速度,若速度大于某个去掉干扰后的阈值就认为有被盗的可能,就驱动蜂鸣喇叭报警。
二、软件设计
1、软件流程图设计
电动自行车控制器设计
上电检查进入主循环检测速度输入,设定速度输入,刹车信号输入,电源电压检测输入速度PID计算,将PWM控制信号输出仪表盘显示速度
程序流程图 1,主要流程图,包括初始化、主循环。
电动自行车控制器设计
检测速度设定值,用单片机A/D转换功能将模拟电压转换为数字信号,低通滤波读出单片机光码盘计数器值,低通滤波增量式PID计算输出值,并且进行限速处理PWM输出设定
程序流程图 2,速度调整程序流程图
电动自行车控制器设计
已经检测到实际速度值,并且进行低通滤波处理将速度信号分成三位,分别是十位,个位,小数位计算三位数字转换成数码管设定值,并且进行输出时序设置调用显示子函数
程序流程图 3,显示子函数程序流程图
电动自行车控制器设计
速度PID计算刹车信号是否有效否进行增量式PID计算,设定是将设定速度设为零,进行PID计算,输出PWM设定子函数
程序流程图 4,速度调控流程图
电动自行车控制器设计
安全检测子函数电源电流是否过大是否否进行正常处理,显示电压是电流过大,进行漏电判断或者速度限制下一程序
程序流程图 5,安全检测程序流程图
2、软件功能设计
速度PID设计:
1)可以采用增量式PID,在不同电压、不同速度下比例积分微分系数有所不同;
2)带刹车检测,刹车时将设定速度设为0,电机PWM输出为零;
3)超速限制,当速度超过20Km/h时,进行适当减速,限制在20Km/h以下;
电动自行车控制器设计
4)起步限速,开始时速度慢慢上升,防止突然启动。
安全检测设计:
1)检测电压电流,当电压较低时报警,以免损坏电池; 2)电流检测,防止超过限制电流烧坏电机、电源或者电线,当电流大于最大电流时,减速是电流在最大电流值以下附近一个区间内波动;
3)上电检测,当电机未开动时,若有较大电流则可能漏电进行报警;
4)当车钥匙拔出来,并且开启报警功能后,若车轮子光码盘有读数说明车子可能被盗,要进行报警。
显示设计:
1)速度显示设计,用三段数码管显示速度的十位、个位和小数位,采用共阴极数码管,LM373锁存数字,三个IO口选通数码管,一次显示一位,每个循环周期控制一次; 2)照明灯显示,主控电路用开关实现,单片机仅检测开关是否开启,并用一个IO口来控制三极管电路驱动发光二极管来显示是否开启照明灯,左右的转向灯采用相同的设计; 3)电源电压显示,将检测到的电压用多个发光二极管显示,亮的越多电压越高,当电压低于报警电压时,所有二极管熄灭,驱动电路采用三极管驱动,每个循环周期进行一次显示。
第三篇:struts2_控制器介绍
struts2 控制器介绍
核心控制器FilterDispatcher
核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。
Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。Struts 2框架按照模块来划分,可以分为Servlet Filters、Struts核心模块、拦截器和用户实现部分。Struts 2框架结构图如图3.1所示。
图3.1 Struts 2框架结构图
一个请求在Struts 2框架中的处理大概分为以下几个步骤。
客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入
http://localhost: 8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)请求。
请求被提交到一系列(主要是3层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。
FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心。
FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。例如,用户注册示例将找到UserReg类。
ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。Struts 2的核心控制器是FilterDispatcher,有3个重要的方法:destroy()、doFilter()和Init(),可以在Struts 2的下载文件夹中找到源代码,如代码3.1所示。
代码3.1 核心控制器FilterDispatcher
public class FilterDispatcher implements StrutsStatics, Filter {
/**
* 定义一个Log实例
*/
private static final Log LOG = LogFactory.getLog(FilterDispatcher.class);
/**
* 存放属性文件中的.STRUTS_I18N_ENCODING值
*/
private static String encoding;
/**
* 定义ActionMapper实例
*/
private static ActionMapper actionMapper;
/**
* 定义FilterConfig实例
*/
private FilterConfig filterConfig;
protected Dispatcher dispatcher;
/**
* 创建一个默认的dispatcher,初始化filter
* 设置默认的packages
*
*/
public void init(FilterConfig filterConfig)throws ServletException {
this.filterConfig = filterConfig;
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
String param = filterConfig.getInitParameter(“packages”);
String packages = “org.apache.struts2.static template org.apache.struts2.interceptor.debugging”;
if(param!= null){
packages = param + “ ” + packages;
}
this.pathPrefixes = parse(packages);
}
//销毁filter方法
public void destroy(){
if(dispatcher == null){
LOG.warn(“something is seriously wrong, Dispatcher is not initialized(null)”);
} else {
dispatcher.cleanup();
}
}
/**
* 处理一个Action或者资源请求
*
* filter尝试将请求同action mapping相匹配
* 如果找到,将执行dispatcher的serviceAction方法
* 如果Action处理失败, doFilter将建立一个异常
*
* 如果请求静态资源
* 资源将被直接复制给 response
*
* 如果找不到匹配Action 或者静态资源,则直接跳出
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {
HttpServletRequest request =(HttpServletRequest)req;
HttpServletResponse response =(HttpServletResponse)res;
ServletContext servletContext = getServletContext();
String timerKey = “FilterDispatcher_doFilter: ”;
try {
UtilTimerStack.push(timerKey);
request = prepareDispatcherAndWrapRequest(request, response);
ActionMapping mapping;
try {
mapping=actionMapper.getMapping(request, dispatcher.getConfigurationManager());
} catch(Exception ex){
LOG.error(“error getting ActionMapping”, ex);
dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
return;
}
if(mapping == null){
String resourcePath = RequestUtils.getServletPath(request);
if(“".equals(resourcePath)&& null!= request.getPathInfo()){
resourcePath = request.getPathInfo();
}
if(serveStatic && resourcePath.startsWith(”/struts“)){
String name = resourcePath.substring(”/struts“.length());
findStaticResource(name, request, response);
} else {
//为一个普通的request, 则通过
chain.doFilter(request, response);
}
return;
} /**
*这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,*如果ActionMapper决定需要调用某个Action,*FilterDispatcher则把请求的处理交给ActionProxy
dispatcher.serviceAction(request, response, servletContext, mapping);
} finally {
try {
ActionContextCleanUp.cleanUp(req);
} finally {
UtilTimerStack.pop(timerKey);
}
} }
… …
}
在doFilter()方法中,将调用dispatcher.serviceAction,该方法如果找到相应的Action,将把用户请求交给ActionProxy。serviceAction()代码在Dispatcher.java中,如代码3.2所示。
代码3.2 Dispatcher类
public class Dispatcher {.../**
* 为mapping加载类,并调用相应的方法或者直接返回result
*
* 根据用户请求的参数,建立Action上下文
* 根据指定的Action’名称和包空间名称,加载一个Action代理 ActionProxy
* 然后Action的相应方法将被执行,*/
public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping)throws ServletException {
Map
//如果存在一个值栈,则建立一个新的并复制以备Action使用
ValueStack stack =(ValueStack)request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
if(stack!= null){
extraContext.put(ActionContext.VALUE_STACK, ValueStackFactory.getFactory().createValueStack(stack));
}
String timerKey = ”Handling request from Dispatcher“;
try {
UtilTimerStack.push(timerKey);
String namespace = mapping.getNamespace();
String name = mapping.getName();
String method = mapping.getMethod();
Configuration config = configurationManager.getConfiguration();
//FilterDispatcher把请求的处理交给ActionProxy
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, extraContext, true, false);
proxy.setMethod(method);
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
//ActionMapping 直接返回一个result
if(mapping.getResult()!= null){
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}
if(stack!= null){
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
}
} catch(ConfigurationException e){
LOG.error(”Could not find action or result", e);
sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);
} catch(Exception e){
throw new ServletException(e);
} finally {
UtilTimerStack.pop(timerKey);
}
} …
}
从上面代码中可以看出来,Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理。关于Action代理相关内容,读者可以参考拦截器章节的介绍。
★ 提示 ★
前面一直在说Action可以是一个普通的Java类,与Servlet API完全分离,但是为了实现业务逻辑,Action需要使用HttpServletRequest内容。
Struts 2设计的精巧之处就是使用了Action代理,Action代理可以根据系统的配置,加载一系列的拦截器,由拦截器将HttpServletRequest参数解析出来,传入Action。同样,Action处理的结果也是通过拦截器传入HttpServletResponse,然后由HttpServletRequest传给用户。
其实,该处理过程是典型的AOP(面向切面编程)的方式,读者可以在后面详细了解到。Struts 2处理过程模型如图3.2所示。
图3.2 Struts 2处理过程模型
★ 说明 ★
拦截器是Struts 2框架的核心,通过拦截器,实现了AOP(面向切面编程)。使用拦截器,可以简化Web开发中的某些应用,例如,权限拦截器可以简化Web应用中的权限检查。
3.1.2
业务控制器Action
业务控制器Action是由开发者自己编写实现的,Action类可以是一个简单的Java类,与Servlet API完全分离。Action一般都有一个execute()方法,也可以定义其他业务控制方法,详细内容将在后面介绍。
Action的execute()返回一个String类型值,这与Struts 1返回的ActionForward相比,简单易懂。Struts 2提供了一个ActionSupport工具类,该类实现了Action接口和validate()方法,一般开发者编写Action可以直接继承ActionSupport类。编写Action类后,开发者还必须在配置文件中配置Action。一个Action的配置应该包含下面几个元素:
1、该Action的name,即用户请求所指向的URL。
2、Action所对应的class元素,对应Action类的位置。
3、指定result逻辑名称和实际资源的定位。
Action是业务控制器,笔者建议在编写Action的时候,尽量避免将业务逻辑放到其中,尽量减少Action与业务逻辑模块或者组件的耦合程度。
3.1.3
业务模型组件
业务模型组件可以是实现业务逻辑的模块,可以是EJB、POJO或者JavaBean,在实际开发中,对业务模型组件的区分和定义也是比较模糊的,实际上也超出了Struts 2框架的范围。不同的开发者或者团队,都有自己的方式来实现业务逻辑模块,Struts 2框架的目的就是使用Action来调用业务逻辑模块。例如一个银行存款的业务逻辑模块,如代码3.3所示。
代码3.3 模拟一个银行业务的实现模块
package ch3;
public class Bank {
//定义银行账户
private String accounts;
//定义操作金额
private double money;
//属性的getter和setter方法
public String getAccounts(){
return accounts;
}
public void setAccounts(String accounts){
this.accounts = accounts;
}
public double getMoney(){
return money;
}
public void setMoney(double money){
this.money = money;
}
//模拟银行存款方法
public boolean saving(String accounts, double money){
//调用DAO等模块读写数据库
return dosomeing();
}
}
上面实例在实际开发中没有任何意义,这里只是作为业务逻辑模块来说明,在执行saving(String accounts,double money)方法时,可以调用相应的数据库访问其他组件,来实现存款操作。使用Action调用该业务逻辑组件可以在execute()方法中实现,如代码3.4所示。
代码3.4 业务控制器Bank_Saving_Action
package ch3;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Bank_Saving_Action extends ActionSupport {
//定义银行账户
private String accounts;
//定义操作金额
private double money;
public String execute()throws Exception {
//创建Bank实例
Bank bk=new Bank();
//调用存款方法
if(bk.saving(accounts, money)){
return SUCCESS;
}else{
return ERROR;
} }
//属性的getter和setter方法
public String getAccounts(){
return accounts;
}
public void setAccounts(String accounts){
this.accounts = accounts;
}
public double getMoney(){
return money;
}
public void setMoney(double money){
this.money = money;
}
Bank_Saving_Action演示了对银行存款业务逻辑组件的调用,这里是通过在Action中创建业务逻辑组件实例的方式实现的。在实际开发中,可以使用静态工厂获得业务逻辑组件的实例或者使用IoC容器来管理。Action中不实现任何业务逻辑,只是负责组织调度业务逻辑组件。调用关系如图3.3所示。
图3.3 调用业务逻辑组件
★ 说明 ★
业务控制器Action一般情况下不是直接创建业务逻辑组件实例,而是使用工厂模式或者是从Spring容器中获得业务逻辑组件实例,这样可以提高系统的性能。
3.1.4
视图组件
Struts 1只能支持JSP作为视图资源,而Struts 2的进步之处就是可以使用其他视图技术,如FreeMarker、Velocity等。通过前面的学习和示例,读者会知道Action的返回结果只是一个简单的字符串,也就是一个逻辑上的视图名称,要与实际视图资源对应,必须通过配置文件来实现。
在struts.xml配置文件中,每一个Aciton定义都有name和class属性,同时还要指定result元素。result元素指定了逻辑视图名称和实际视图的对应关系。每个result都有一个type属性,前面介绍的struts.xml中并没有显式指定type值,即使用了默认的type类型:dispatcher,该结果类型支持JSP所谓视图资源。
对于Struts 2的视图技术和result返回类型,后面将详细介绍。
第四篇:电动车控制器的标准和电动车控制器购买需要注意事项
电动车控制器的标准和电动车控制器购买需要注意事项 提到电动车最重要的部件,首先想到的就是电动车控制器,而提到电动车控制器品牌,首先想的一定是高标科技。
作为一家集研发、生产、销售为一体的国家级高新技术企业,高标科技目前拥有电动车控制器、摩托车/电动车防盗器、电动车充电器以及电动交通工具解决方案四大产品线,是国内领先的电动交通工具控制系统解决方案供应商。现在光高标科技一家就占了电动车控制器32%的市场份额,特别威武霸气啊对不对!
我的电动车控制器被偷了之后,打算自己买一个,然后听了朋友介绍,听说高标控制器很好,就去网上搜了下。高标科技有自己的官方网站,就叫高标商城,电动车控制器、电动车充电器、电动车防盗器,在上面都有卖的。高标本来就是大企业,他们的合作伙伴都是全国整车制造前30强,只生产高端先进的产品,质量好性能好,特别有保障。他们官网卖的东西也比较权威可信,而且不会出现自己去一般配件店买东西,人家恶意加价的情况。
正好我买的时候,高标商城搞活动,还有折扣呢,感觉特别划算。另外就是高标控制器有自学习功能,能够自动识别电机角度、相位、相线,方便消费者自己更换电动车控制器。而且高标控制器从外观上甩出其他品牌几条街啊,就拿我原来那个充电器来说,做工真的一般,外观真的真的很一般。我以前没感觉,结果这次拿到高标控制器,才发现原来控制器可以做的那么高大上。整个控制器都是那种拉丝工艺做成的,颜色很正,用料也很考究。最后就是高标控制器的防水性能也特别好,马上夏天了,会经常下雨,用个好点的控制器自己也省心啊。
第五篇:机房空调控制器系统介绍
上海中光信息工程有限公司
机房空调控制器介绍
通信运营商在基站建设中绝大部分基站采用民用舒适性空调,由于舒适空调设计目的是为了在有人空间内,将温度调整到人体比较舒适的温度,其设计温度为设定温度正负1度左右。而基站内的空调主要服务于设备,设备的温度范围根据规范要求有10度左右的温宽。这就为通过节能型智能空调控制器对舒适性空调的温度范围进行智能化控制,实现在基站这样特定应用场景中通过宽温控制手段,从而避免空调压缩机相对频繁启动所造成的不必要的能源浪费,以实现节能的目的。
博德尔节能型空调智能节电器技术特点:
1.全智能自动控制:采用单片机进行编程,所有设置功能全自动执行;
面板直观显示:控制器面板可直观显示设定的开关机温度,及机房温度,方便本地查询;
2.设置功能:可设置空调开关机的温度,适应不同应用场景的需求。
3.空调控制方式:具有空调电源、面板、红外控制等至少2种以上的控制方式,适不同类
型空调。
4.监控功能:设备配有RS485通信接口,提供开放的通信协议(接口通信协议满足
YD/T1363.3-2005中B.13要求)。方便客户纳入监控系统,可直接接入监控采集器或其他智能采集设备。
5.电源安全性:多重防雷设计,包括输入电源、接口、器件均根据基站防雷相关标准设计了防雷保护措施。宽电压设计工作稳定。从而达到运营商级的产品。绝非民用级产品。
6.权限设置:系统设置了使用权限设定,避免了误操作及越权操作。
7.消防安全:全金属外壳,所以线缆均采用阻燃电缆及辅材。并设有消防联动接口,避免在火灾情况下启动空调。接入后火灾状态下立即关闭空调。
8.程序自保护设计:程序中对于空调设定温度范围设计有一点区间,任何误设定或违反节能逻辑目的的设定均为无效设定。
9.低功耗:设备本身设计功耗极低,为毫安级功耗。
10.空调工作状态反馈:具有空调工作状态反馈设计,确保空调的开关可靠。
11.接口冗余设计:可根据用户需求预留增值功能接口,如空调过滤网堵塞状态告警,方便维护人员的运维工作。
12.免维护:设备安装后无需维护,设备内置自检程序,如发现自身器件发生故障将自动切出,恢复空调自运行模式。