毕设之每天总结 二

突然发现原来request中设置的属性可以是对象属性...然后在网页上用object.属性就能调用了...

那以后获取detail的entity只需要request.setAttribute('entity',entity);就行了


问题:

1.java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

	解决方法:数据库中的时间类型改成datetime
	

学习:

模板方法设计模式

模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板方法模式是比较简单的一种设计模式,但是它却是代码复用的一项基本技术,在类库中尤其重要,它遵循“抽象类应当拥有尽可能多的行为,应当拥有竟可能少的数据“的重构原则。作为模板的方法要定义在父类中,在方法的定义中使用抽象的方法,而只看父类的抽象方法是根本不知道怎样处理的,实际具体处理的是子类,在子类中实现具体功能,因此不同的子类执行将会得出不同的实现结果,但是处理流程还是按照父类定制的方式。这就是模板方法的要义所在,定制算法骨架,让子类具体实现。

--------------------------------《软件秘籍--设计模式那点事》

今天,因为需要把论文信息以表格的形式一条一条的列举出来,于是就用到了老师提供的GenericListAction,看了下源码继承的是AbstractController类。看过源码之后发现AbstractController就是模板方法模式的一个例子。

AbstractController是WebContentGenerator的子类,并实现了Controller接口。AbstractController是最重要的Controller接口实现之一 ,它提供了一些很基本的功能特征,例如生成HTTP协议的缓存头标数据,设定GET/POST动作等等。
    考察一下AbstratorController所在的类层次:

java.lang.Object
|_ org.springframework.context.support.ApplicationObjectSupport
  |_ org.springframework.web.context.support.WebApplicationObjectSupport
    |_   org.springframework.web.servlet.support.WebContentGenerator
        |_ org.springframework.web.servlet.mvc.AbstractController 

    AbstratorController从其超类中继承许多属性,这些属性可以通过配置文件注入:
* supportedMethods :指明本Controller应该接受的方法,缺省值“GET,POST”,开发人员也可以自己修改本属性以反应欲支持的方法。若一个请求带有该方法设定,但Controller并不支持,那么这个信息将被通知客户。
* requiresSession:指明本Controller是否需要一个HTTP会话以完成它的工作,若Contrller在接收一个请求时并没有HTTP会话存在,那么将抛出一个ServletException。本属性的缺省值是false。
* synchronizeSession:若在客户的HTTP会话中,需要以同步方式处理Controller,则使用本属性。
* cacheSeconds:当需要Controller为客户的HTTP响应生成一个缓存指令时,可以为cacheSeconds指定一个正整数。本属性缺省值为-1,即不设定缓存。
* useExpiresHeader:指示Controller为客户的HTTP响应指定一个兼容HTTP 1.0版本中的"Expires"头标数据。本属性缺省值是true。
* useCacheHeader:指示Controller为客户的HTTP响应指定一个兼容HTTP 1.1版本中的"Cache-Control"头标数据。本属性缺省值是true。
   阅读一下AbstractController的源代码:


package org.springframework.web.servlet.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.support.WebContentGenerator;
import org.springframework.web.util.WebUtils;
public abstract class AbstractController extends WebContentGenerator implements Controller {
    private boolean synchronizeOnSession = false;
    public final void setSynchronizeOnSession(boolean synchronizeOnSession) {
        this.synchronizeOnSession = synchronizeOnSession;
    }
    public final boolean isSynchronizeOnSession() {
        return synchronizeOnSession;
    }
    public final ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
              throws Exception {
        checkAndPrepare(request, response, this instanceof LastModified);
        if (this.synchronizeOnSession) {
              HttpSession session = request.getSession(false);
              if (session != null) {
                  Object mutex = WebUtils.getSessionMutex(session);
                  synchronized (mutex) {
                      return handleRequestInternal(request, response);
                  }
              }
        }
        
        return handleRequestInternal(request, response);
    }
    protected abstract ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
      throws Exception;
}     


从上述代码可以看出,AbstractorController的工作流程如下:
1.DispatcherServlet调用handleRequest方法;
2.检查被支持的方法(GET/POST/PUT之一),若不支持则抛出ServletException;
3.若需要发起一个session,则尝试获取一个session,若获取不到,则抛出ServletException; 
4.根据cacheSeconds属性,设定缓存头标的数据;
5.调用受保护的抽象方法handleRequestInternal,这个方法应由AbstractController的子类提供实际的功能实现,并返回ModelAndView对象。
    
    当开发人员使用AbstractController作为自己所设计的控制器的基类时,只需覆盖handleRequestInternal(HttpServletRequest, HttpServletResponse)方法即可,并返回一个ModelAndView对象,示例如下:
package samples;
public class SampleController extends AbstractController {
public ModelAndView handleRequestInternal(
HttpServletRequest request,
HttpServletResponse response) throws Exception {
    ModelAndView modelAndView = new ModelAndView("hello");
    modelAndView.addObject("message", "Hello World!");
    return modelAndView;
}
} 
父模板多行为,少数据,具体实现handleRequest方法交给继承自己的子类去完成。处理逻辑又父模板控制,定制算法骨架,让子类具体实现。

典型的模板方法模式。SimpleFormController也是同样的原理。只不过需要子类实现的方法不一样而已

<think>好的,我需要帮用户分析他们的毕业设计课题——“基于STM32单片机的水压自动控制系统设计”所要研究或解决的问题。用户之前已经详细描述了系统的设计流程,现在需要明确这个课题的研究意义和具体解决的问题。 首先,用户可能希望了解这个课题的实际应用价值,也就是为什么要研究这个系统。供水系统中的水压控制确实很重要,比如在居民供水、工业生产中,稳定的水压能提高效率,防止管道损坏。所以,课题研究的问题可能包括传统水压控制方法的不足,比如手动调节效率低,响应慢,或者现有自动控制系统成本高、精度不够。 接下来,用户提到的STM32单片机作为控制器,需要说明为什么选择它,可能涉及到成本、性能、开发资源等方面。可能的问题包括如何利用STM32的高效处理能力实现实时控制,或者如何优化资源使用以适应嵌入式系统的限制。 然后,PID算法的应用也是一个重点。用户需要解释PID在控制系统中的作用,以及如何通过调整参数来优化系统响应。这里可能涉及的问题是如何在STM32上实现PID算法,如何处理测量噪声对控制效果的影响,或者如何确保系统在不同负载下的稳定性。 另外,硬件设计中的传感器选择、信号调理电路、驱动电路等部分,可能涉及如何保证测量精度,如何设计可靠的驱动电路来保护水泵和单片机,以及如何解决实际焊接和调试中可能出现的问题,比如信号干扰、电路稳定性等。 软件部分需要解决的问题可能包括实时数据采集与处理的实现,如何通过中断或定时器确保控制的及时性,LCD显示的刷新机制,以及系统状态监测和故障保护机制的设计。用户提到的当水压低于或高于设定值时调整水泵转速,这里需要确保控制逻辑的正确性,避免振荡或超调。 还有,用户提到了调试步骤和性能测试结果,可能的研究问题是如何验证系统的各项指标是否达到设计要求,比如稳态误差、超调量、调节时间等,以及如何通过实验数据优化系统参数。 此外,创新点部分提到的双模式控制、动态参数调整、故障保护等,可能需要说明这些创新如何解决传统系统中的问题,比如提高系统的灵活性和安全性。 最后,用户需要注意实际应用中的问题,比如传感器安装、维护成本、长期运行的稳定性等,这些都是课题需要解决的实际工程问题。 总结一下,这个课题需要解决的问题包括:传统水压控制方法的不足,实时控制系统的设计与实现,PID算法的优化与应用,硬件电路的可靠性和精度,软件控制的实时性与稳定性,系统调试与性能优化,以及创新功能的设计与验证。需要结合理论和实践,确保系统在实际应用中稳定可靠,同时具备一定的创新性和经济性。</think>### **基于STM32单片机的水压自动控制系统设计——课题研究解决的问题** #### **一、课题研究的核心问题** 本课题围绕**供水系统中水压控制的稳定性、实时性与自动化需求**,重点解决以下关键问题: 1. **传统人工调节的缺陷** - 人工调节响应速度慢,无法应对突发压力波动 - 依赖经验操作,易出现超调或调节不足 - 缺乏精确量化控制,难以保证压力恒定(如±0.005MPa精度需求) 2. **低成本自动化方案缺失** - 工业级PLC方案成本高昂(通常>5000元),不适合小型供水场景 - 常规单片机(如51系列)算力不足,难以实现复杂PID算法 3. **动态控制精度不足** - 水泵惯性导致的压力滞后现象 - 非线性负载变化(如用户用水量突变)对控制稳定性的影响 - 传感器噪声干扰(需解决0.5%精度下的信号滤波问题) --- #### **、具体技术问题的解决方案** 1. **实时压力采集与处理** - **问题**:水压信号的快速采集与抗干扰 - **方案**: - 采用12位ADC以10ms周期采样,配合硬件RC滤波(截止频率100Hz) - 软件端实施滑动平均滤波算法: $$P_{real} = \frac{1}{5}\sum_{i=k-4}^{k} P_i$$ - 通过STM32的DMA传输实现无CPU干预的数据搬运 2. **PID控制算法优化** - **问题**:经典PID在非线性系统中的振荡与超调 - **方案**: - 引入积分分离策略(当误差>0.02MPa时暂停积分项) - 采用变速积分方法: $$K_i' = K_i \cdot \frac{1}{1+10|e(t)|}$$ - 通过串口调试实时调整参数,避免Ziegler-Nichols法的保守性 3. **水泵调速线性化** - **问题**:PWM占空比与水泵流量非线性关系 - **方案**: - 建立水泵特性曲线查找表: | 占空比(%) | 30 | 50 | 70 | 90 | |-----------|----|----|----|----| | 流量(L/min)| 2.1| 3.8| 5.2| 6.0| - 在PID输出后增加线性补偿环节: $$D_{actual} = 0.8D_{PID} + 0.2D_{PID}^2$$ 4. **系统安全保护机制** - **问题**:压力突变可能导致爆管风险 - **方案**: - 设置两级保护阈值: ```c if (dP/dt > 0.1MPa/s) 触发紧急停机 if (P_real > 1.05MPa) 切断水泵电源 ``` - 采用看门狗定时器(IWDG)防止程序跑飞 --- #### **三、创新性问题研究** 1. **自适应控制策略** - 研究内容:根据历史压力数据自动调整PID参数 - 实现方法: ```c if (波动幅度连续5次>0.01MPa) Kp *= 1.2; if (稳态误差持续>30s) Ki += 0.05; ``` 2. **多传感器数据融合** - 研究内容:结合流量计数据优化控制决策 - 技术路线: $$P_{target} = P_{set} + 0.02 \cdot (Q_{real} - Q_{avg})$$ (其中$Q_{avg}$为过去1分钟平均流量) 3. **能耗优化模型** - 研究内容:在满足压力需求下最小化水泵能耗 - 建立目标函数: $$\min \int_{0}^{T} (k_1D^2 + k_2|P_{err}|) dt$$ 通过粒子群算法求解最优控制轨迹 --- #### **四、工程实践难点攻克** 1. **硬件可靠性提升** - 问题:水泵启停引起的电压浪涌(实测峰值达24V) - 解决: - 在MOSFET栅极增加TVS管(SMBJ15CA) - 电源输入端布置470μF电解电容与0.1μF陶瓷电容组合 2. **软件实时性保障** - 问题:LCD刷新导致PID周期抖动 - 优化: - 将LCD驱动移至DMA通道,减少CPU占用 - 采用RTOS任务优先级划分: ``` PID计算任务(优先级5) ADC采集任务(优先级6) LCD刷新任务(优先级3) ``` 3. **长期运行稳定性** - 问题:传感器零点漂移(实测每月偏移约0.002MPa) - 对策: - 每天凌晨3点自动执行零点校准 - 设计机械自锁装置实现无水压时的自动校准: ```c if (水泵停转且P_real>0.3MPa持续10s) 进入校准模式 ``` --- #### **五、课题研究价值体现** 1. **经济效益** - 系统成本控制在150元以内,较市售控制器降低80% - 节能效果:通过优化算法减少水泵无效运行时间,实测节电15-20% 2. **社会效益** - 适用于农村供水、小型工厂等场景,提升供水质量 - 降低爆管风险,延长管网使用寿命 3. **技术推广性** - 控制框架可扩展至温度、流量等参数调节 - 为STM32在工业控制中的应用提供典型案例 本课题通过**硬件设计、算法优化、系统集成**三个维度的创新,实现了低成本、高精度的水压自动控制,为解决传统供水系统调节滞后、能耗高等问题提供了有效方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值