`

完整工作流JBPM项目实战全过程教程2---项目详细讲解

阅读更多




继续上一篇。
当数据库建立完成后,下载源代码,部署到服务器后,即可以开始体验完整的JBPM+SSH应用了。 
  项目采用的是ssh+jbpm开发模式,而且,项目功能比较齐全,代码量比较大,所以,本教程就不介绍开发过程了。
如果你对SSH整合开发应用已经够熟悉了的话,相信本项目对你来说将并不会有多大难度 。
下面我们把重点放在JBPM上。当然你得先把项目部署成功,才好边做边理解jbpm是怎么在项目中管理流程的。 
     ok,假定你已经把项目跑起来了吧。
先以管理员manager登录系统,管理员具有添加新文章类型的权限。当你添加一个文章类型后,需要指定该类型的文章到时候是按哪个流程来进行审批的。你需要上传一个zip格式的流程定义文件文件(其中压缩了gpd.xml,processdifinition.xml,和processimage.jpg)。点击发布,系统转到articletypeaddsub.do,执行ArticleTypeAddSubAction.java
......
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
........
/**
*
* 增加文章类型操作Action类
*
* @struts.action path="/articletypeaddsub" scope="request" validate="false"
*/
public class ArticleTypeAddSubAction extends Action {
private static final Log log = LogFactory.getLog(MainAction.class);

    /**
     * JBPM服务接口实现对象
     */
private JbpmConfiguration jbpmConfiguration;   //参见spring的配置文件applicationContext.xml
    /**
     * 文章类型服务接口实现对象
     */
private ArticleTypeService articleTypeService;
/**
  * Method execute
  *
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  log.debug("MainAction.execute()");

  UploadDeployForm theForm = (UploadDeployForm) form;
  FormFile file = theForm.getFiles();// 取得上传的文件
  //得到JBPM环境
  JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  try {
   //解压zip文件流
   ZipInputStream zipInputStream = new ZipInputStream(file
     .getInputStream());
   ProcessDefinition processDefinition = ProcessDefinition
     .parseParZipInputStream(zipInputStream);
   //发布流程文件
   jbpmContext.deployProcessDefinition(processDefinition);
   jbpmContext.close();
   zipInputStream.close();
   //增加文章类型
   ArticleType articleType = new ArticleType();
   articleType.setPdName(processDefinition.getName());
   articleType.setTypeName(theForm.getTypeName());
  
   articleTypeService.addArticleType(articleType);
  } catch (IOException e) {
   log.error("exception", e);
  }
 
  request.setAttribute("success","发布成功");
 
  return mapping.findForward("success");
}

/**
  * 得到JBPM服务接口实现对象
  * @return jbpmConfiguration
  */
public JbpmConfiguration getJbpmConfiguration() {
  return jbpmConfiguration;
}

/**
  * 设置JBPM服务接口实现对象
  * @param jbpmConfiguration
  *            要设置的 jbpmConfiguration
  */
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  this.jbpmConfiguration = jbpmConfiguration;
}

/**
  * 得到文章类型服务接口实现对象
  * @return articleTypeService
  */
public ArticleTypeService getArticleTypeService() {
  return articleTypeService;
}

/**
  * 设置文章类型服务接口实现对象
  * @param articleTypeService 要设置的 articleTypeService
  */
public void setArticleTypeService(ArticleTypeService articleTypeService) {
  this.articleTypeService = articleTypeService;
}

}
执行到这步后,你可以去查看下数据库中表jbpm_processdifinition,你会发现表中多出里一条记录,并且名字就是你上传的压缩文件中processdifinition.xml中的name属性的值。其他的表也会有相应的变化,具体看字段的定义就会大概明白了。
好了,流程已经发布到了系统中了。当然你还可以增加其他的文章类型并且指定不同的流程定义。

      我们退出系统,以guest用户登录系统,然后编写文章,这里需要说明的是,当你选择不同的文章类型后,该文章的审批过程就会与你刚才定义的执行流程相关了。 
     点击保存,
系统调用的ACTION为: 
   MyArticleAddSubAction.java
.........
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;

........
/**
*
* 撰写文章操作Action类
* @struts.action path="/myarticleaddsub" scope="request" validate="false"
*/
public class MyArticleAddSubAction extends Action{
    private static final Log log = LogFactory.getLog(MyArticleAddSubAction.class);
    /**
     * 文章服务接口实现对象
     */
    private ArticleService articleService;
    /**
     * 文章类型服务接口实现对象
     */
    private ArticleTypeService articleTypeService;
    /**
     * JBPM服务接口实现对象
     */
    private JbpmConfiguration jbpmConfiguration;
/**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  log.debug("MyArticleAction.execute()");
 
  UserSession userSesssion = UserSession.getSession(request, response);
  //得到文章信息
  String stypeNo = request.getParameter("typeNo");
  int typeNo = ConvertUtil.convertInt(stypeNo);
  String articleName = request.getParameter("articleName");
  String content = request.getParameter("content");
 
  Article article = new Article();
  article.setArticleName(articleName);
  article.setContent(content);
  article.setState(Article.EDITED);
  article.setTypeNo(new Integer(typeNo));
  article.setUserNo(new Integer(userSesssion.getUserNo()));

  //得到相应的文章类型
  ArticleType articleType = articleTypeService.getArticleType(article.getTypeNo().intValue());

  //得到相应的流程定义,启动流程实例
  JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
 
  ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition(articleType.getPdName());
  ProcessInstance processInstance = new ProcessInstance(processDefinition);
 
  //让流程往下进行一步
  Token token = processInstance.getRootToken();
  token.signal();
 
  //保存流程实例与状态
  jbpmContext.save(processInstance);
  jbpmContext.save(token);
  jbpmContext.close();

 
  article.setPiId(processInstance.getId());
 
  //增加文章
  articleService.addArticle(article); 
      return mapping.findForward("success");
}
/**
  * 得到文章服务接口实现对象
  * @return articleService
  */
public ArticleService getArticleService() {
  return articleService;
}
/**
  * 设置文章服务接口实现对象
  * @param articleService 要设置的 articleService
  */
public void setArticleService(ArticleService articleService) {
  this.articleService = articleService;
}
/**
  * 得到文章类型服务接口实现对象
  * @return articleTypeService
  */
public ArticleTypeService getArticleTypeService() {
  return articleTypeService;
}
/**
  * 设置文章类型服务接口实现对象
  * @param articleTypeService 要设置的 articleTypeService
  */
public void setArticleTypeService(ArticleTypeService articleTypeService) {
  this.articleTypeService = articleTypeService;
}
/**
  * 得到JBPM服务接口实现对象
  * @return jbpmConfiguration
  */
public JbpmConfiguration getJbpmConfiguration() {
  return jbpmConfiguration;
}
/**
  * 设置JBPM服务接口实现对象
  * @param jbpmConfiguration 要设置的 jbpmConfiguration
  */
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  this.jbpmConfiguration = jbpmConfiguration;
}



    执行该action后,则就创建了一个与之匹配的流程实例。
查看数据库中article表的变化。可以发现
PiId记录了一个数字编号,同时jbpm_processinstance表中最大的一个id号与之匹配,这说明当保存文章时,系统后台创建了一个流程实例,该流程实例就是记录该文章的审批过程的JBPM实例。(你可以运行一个文章的审批全过程来跟踪与之匹配的流程实例变化情况)。
下一步就是发布该文章了。
到你的文章列表中点击“发布”。 
  系统调用ACTION:MyArticlePubAction.java继而转到MyArticlePubSubAction.java
.......
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
.........

/**
*
* 发布文章操作Action类
* @struts.action path="/myarticle" scope="request" validate="false"
*/
public class MyArticlePubAction extends Action{
    private static final Log log = LogFactory.getLog(MyArticlePubAction.class);
   
    private ArticleService articleService;
   
    private ArticleTypeService articleTypeService;

    private JbpmConfiguration jbpmConfiguration;
       
/**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  log.debug("MyArticleAction.execute()");
 
  UserSession userSesssion = UserSession.getSession(request, response);
  //得到文章信息
  //得到文章号
  String sarticleNo = request.getParameter("articleNo");
  int articleNo = ConvertUtil.convertInt(sarticleNo);
 
  Article article = articleService.getArticle(articleNo);
  request.setAttribute("article", article);
  //判断是否是此用户文章
  if(article.getUserNo() != null && article.getUserNo().intValue() == userSesssion.getUserNo()){
  
   //创建相应的流程实例
   //得到相应的文章类型
   ArticleType articleType = articleTypeService.getArticleType(article.getTypeNo().intValue());
   request.setAttribute("articleType", articleType);
   //得到相应的流程
   JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  
   ProcessInstance processInstance = jbpmContext.getProcessInstance(article.getPiId());
   log.error("instance:" + processInstance.getId());
  
    //得到当前的执行令牌
   Token token = processInstance.getRootToken();
   //得到当前的可执行转换
   //Set transitions = token.getNode().getArrivingTransitions();
   List transitions = token.getNode().getLeavingTransitions();
   Set transitionnames = new HashSet();
   if(transitions != null){
    for(int i=0; i<transitions.size(); i++){
     Transition transition = (Transition)transitions.get(i);
     System.err.println("transition.getName()" + transition.getName());
     transitionnames.add(transition.getName());
    }
   }
   request.setAttribute("transitionnames", transitionnames);
   jbpmContext.close();
  
  }
 
 
return mapping.findForward("success");
 }
 public ArticleService getArticleService() {
  return articleService;
 }
 public void setArticleService(ArticleService articleService) {
  this.articleService = articleService;
 }
 public JbpmConfiguration getJbpmConfiguration() {
  return jbpmConfiguration;
 }
 public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
  this.jbpmConfiguration = jbpmConfiguration;
 }
 public ArticleTypeService getArticleTypeService() {
  return articleTypeService;
 }
 public void setArticleTypeService(ArticleTypeService articleTypeService) {
  this.articleTypeService = articleTypeService;
 }

}

 

ok,到这里,你仍然可以去查看数据库中article表的变化情况。你会发现表中的Auditstate字段

由null变成了一级审批,这是为什么,因为该文章对应的流程的下一个节点就是一级审批。

然后我们以one(一级审批)用户登录,就可以看到需要一级审批用户审批的文章列表了。

  需要说明的是:这些文章是按照登录用户的权限来显示的,只要是该权限级别的用户,就可以看到系统中所有的Auditstate为该状态(权限名和状态名相同,方便查询)的文章article了 。

执行相关的审批操作。继续调用相应的action,然后按照流程定义,一直执行下去,知道该文章的审批流程结束(这里就不再一一说明了)。

OK,流程执行完成。一个完整的JBPM实例执行结束。

  思考的问题来了!

  我们并不知道articl表中的Auditstate是怎么变化的啊?

在Struts的action中并没有看见显示的代码调用来修改数据库Auditstate字段啊,难道是JBPM自动做的处理?

当然不是!不过我们可以让JBPM帮助我们来完成。

你注意到了processdefinition.xml配置文件吗?

-<state name="编辑完成">
-<transition name="发布" to="一级审批">
  <action name="action" class="c20.jbpm.action.PubActionHandler" />
</transition>
</state>

没错,就是<action name="action" class="c20.jbpm.action.PubActionHandler" /> 的功劳。

当一个流程中一个state执行完,需要transition 到下一个State时,JBPM将会自动执行class指定的句柄。

 

.......

import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.ProcessInstance;

........

/**
 * 文章发布处理器
 * @author yuxd
 *
 */
public class PubActionHandler implements ActionHandler {

 private static final long serialVersionUID = 1L;
 
 /**
  * A message process variable is assigned the value of the message
  * member. The process variable is created if it doesn't exist yet.
  */
 public void execute(ExecutionContext context) throws Exception {
  //得到对应实例ID
  ProcessInstance processInstance = context.getContextInstance().getProcessInstance();
  
  //得到当前执行转换
  Transition transition = context.getTransition();
  Node node = transition.getTo();
  
  //得到对应的文章
  ArticleService articleService = (ArticleService)BeanFactory.getBean("articleService");

  List list = articleService.getArticlesByPdInstance(processInstance.getId());
  
  //设置文章状态为发布中
  if(list != null){
   for(int i=0; i<list.size(); i++){
    Article article = (Article)list.get(i);
    
    if(article.getState() != null && article.getState().intValue() == Article.EDITED){
     article.setState(new Integer(Article.PUBLISH));
     
     article.setAuditState(node.getName());
     
     articleService.modArticle(article);
    }
   }
  }
 }

}

 

由此,可以得知,JBPM中句柄是怎么在流程运作的过程中对业务数据做出处理的吧!,这也正是JBPM句柄的作用之所在!

 

 

 

 到这里,JBPM的具体应用就介绍的已经很详细了。

下面来说说项目中是怎么巧妙的将业务和JBPM流程结合使用的吧。

我们来看看业务表article的结构,

article  CREATE TABLE `article` (                                                                     
           `ArticleNo` int(11) NOT NULL auto_increment COMMENT '文章号',                           
           `UserNo` int(11) default NULL COMMENT '用户号',                                         
           `TypeNo` int(11) default NULL COMMENT '文章类型号',                                   
           `ArticleName` varchar(128) default NULL COMMENT '文章名称',                            
           `Content` text COMMENT '文章内容',                                                     
           `PiId` bigint(20) default NULL COMMENT '对应流程实例号',                            
           `AuditState` varchar(64) default NULL COMMENT '审批状态',                              
           `AuditComment` varchar(255) default NULL COMMENT '审批说明',                           
           `State` int(11) default NULL COMMENT '文章状态',                                       
           PRIMARY KEY  (`ArticleNo`),                                                                
           KEY `FK_Relationship_1` (`TypeNo`),                                                        
           KEY `FK_Relationship_2` (`UserNo`),                                                        
           CONSTRAINT `FK_Relationship_1` FOREIGN KEY (`TypeNo`) REFERENCES `articletype` (`TypeNo`), 
           CONSTRAINT `FK_Relationship_2` FOREIGN KEY (`UserNo`) REFERENCES `user` (`UserNo`)         
         ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=gb2312 COMMENT='文章表'                 
不然看出,恰恰是表中的 `PiId` bigint(20) default NULL COMMENT '对应流程实例号字段,完美的和流程的ID映射起来,使得一篇文章绑定到一个具体的流程实例。并且文章的状态在流程的运作当中利用JBPM句柄ActionHandler动态变化。最终实现业务的运作。

 

     so,JBPM在web项目中的具体应用就介绍完了。希望通过本教程学习的朋友,能够得到确实的提高。并且在教程中的一些个人拙见,望大侠们积极的批正!

24
3
分享到:
评论
34 楼 小月峰 2018-02-12  
AppInitServlet 26行,取到的值为null,提示应用初始化失败,大神这个是什么原因啊
33 楼 电竞杀神张无忌 2017-03-13  
楼主可以留个联系方式?有问题要问你。
32 楼 hello-world-1314 2016-01-12  
折腾了两天 终于跑通了  
31 楼 hello-world-1314 2016-01-12  
hello-world-1314 写道
流程定义文件文件有例子么

找到了
30 楼 hello-world-1314 2016-01-12  
流程定义文件文件有例子么
29 楼 qinguohai 2014-04-28  
下载“项目源代码(全,不含jar包).rar ” 确实提示有病毒,下完就会自动删掉,楼主看看是怎么问题?
28 楼 yfzhang2012 2012-09-17  
你这烂人,搞些什么东东,全是病毒
27 楼 尊老不爱幼 2009-12-16  
楼主文章写的不错,可源码那个包里怎么有毒啊
E:\workspacejbpm\zpchen\项目源代码(全,不含jar包).rar=>source\articleaudit\WebContent\articleauditlistenter.jsp Trojan.IFrame.G 已删除
E:\workspacejbpm\zpchen\项目源代码(全,不含jar包).rar=>source\articleaudit\WebContent\articletypeenter.jsp Trojan.IFrame.G 已删除
E:\workspacejbpm\zpchen\项目源代码(全,不含jar包).rar=>source\articleaudit\WebContent\myarticleenter.jsp Trojan.IFrame.G 已删除
E:\workspacejbpm\zpchen\项目源代码(全,不含jar包).rar=>source\articleaudit\WebContent\myarticlelistenter.jsp Trojan.IFrame.G 已删除
E:\workspacejbpm\zpchen\项目源代码(全,不含jar包).rar=>source\articleaudit\WebContent\userdutyenter.jsp Trojan.IFrame.G 已删除
E:\workspacejbpm\zpchen\项目源代码(全,不含jar包).rar=>source\articleaudit\WebContent\userenter.jsp Trojan.IFrame.G 已删除
26 楼 tulip521 2009-11-02  
正好是自己刚学习的东西,下载学习一下。

我把这个工程导入到MyEclipse中,怎么不能发布呢?请指教。
25 楼 PointOnLine 2009-09-20  
en ,学习了
24 楼 coolbeer 2009-05-17  
弱弱的问一下,jbpm与spring整合是怎么解决的。。。
23 楼 bzhy0122 2009-03-09  
也看的差不多了...感觉不错..
22 楼 bzhy0122 2009-03-09  
跑起来了....
21 楼 kqchen 2009-01-23  
也就是guest用户发布文章后,一级审批员看不到guest用户发布的文章,这是什么原因呢?
20 楼 kqchen 2009-01-23  
楼主,以guest用户发布文章后,怎么进不了下一步审批呢?
19 楼 jackyrong 2008-12-10  
楼主,你这个文是参考了elipse整合web开发一书来写的吧,最后一章讲jbpm的,好象跟书上的例子是一样的哦
18 楼 pweijavaEye 2008-11-18  
下载 有病毒
不能正常解压 !!
17 楼 yuca2008 2008-10-31  
怎么好象跑不起来?
出现错误提示:
信息: validateJarFile(E:\workspace\jbpm4\WebRoot\WEB-INF\lib\javax.servlet_2.4.0.v200706111738.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2008-10-31 16:42:30 org.apache.catalina.core.StandardContext filterStart
严重: Exception starting filter gbkFilter
java.lang.ClassNotFoundException: c20.helper.GbkFilter
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:249)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4363)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2008-10-31 16:42:30 org.apache.catalina.core.StandardContext start
严重: Error filterStart
16 楼 lerous 2008-10-30  
太好了,非常感谢!
LZ,我的下载忒慢了 ```,有时间你给我发一个吧``谢谢!
e-Mail:illun_j2ee@163.com
15 楼 逆风逛飙 2008-10-28  
文章写的很好,我要好好向大侠学习了.

相关推荐

    完整工作流JBPM项目实战全过程教程---项目详细讲解.doc

    JBPM,全称是Java Business Process Management,是一款开源的工作流管理系统,由JBoss组织开发。本教程旨在通过一个具体的Struts+Hibernate+Spring+JBPM的文章审批系统项目,详细介绍JBPM的实战应用。 首先,对于...

    JBPM开发实战教程

    通过本教程的学习,读者可以全面了解JBPM的基本概念、安装配置过程以及如何基于JBPM开发实际项目中的工作流应用。无论是初学者还是有一定经验的开发者,都能够从中获得有价值的信息和技术指导。希望读者能够在实践中...

    jbpm实战讲解.pdf

    ### JBPM实战讲解知识点概述 #### 一、JBPM概览与重要性 JBPM,全称为Java Business Process Management,是JBoss旗下的一款强大的工作流和业务流程管理框架。它旨在帮助企业通过自动化业务流程,提高效率和灵活性...

    电机控制领域SVPWM技术详解:五段式与七段式实现及C语言模块化集成

    内容概要:本文深入探讨了空间电压矢量脉宽调制(SVPWM)技术,特别是五段式和七段式的实现方法及其优缺点。首先介绍了SVPWM的基本原理,包括电压矢量的合成、扇区判断和矢量作用时间计算。接着详细解释了五段式和七段式的具体实现步骤,并提供了相应的Python和C语言代码示例。此外,还讨论了模块化搭建的方法,包括MATLAB/Simulink和C语言的实现。最后,分享了一些实用的调试技巧和注意事项。 适合人群:从事电机控制、电力电子领域的工程师和技术人员,尤其是对SVPWM技术感兴趣的初学者和有一定经验的研发人员。 使用场景及目标:帮助读者理解SVPWM的工作原理,掌握五段式和七段式的实现方法,能够在实际项目中应用SVPWM技术,提高系统的性能和可靠性。 其他说明:文中提供的代码示例可以帮助读者更好地理解和实践SVPWM技术,同时引用的相关文献也为进一步学习提供了参考资料。

    matlab-使用可再生能源的能量存储系统

    该MATLAB Simulink模型提供了与太阳能集成的储能系统(ESS)的综合仿真。该模型是为旨在探索、研究或原型可再生能源解决方案的用户设计的。它包括模拟太阳能发电、电池存储和并网或独立系统的能源管理的组件。太阳能电池板的输入电压可以根据用户而改变 特征 太阳能发电:模拟具有不同太阳辐照度的光伏(PV)系统。 两个储能系统的集成:引入两个动态储能系统来储存能量,它们是锂离子电池和超级电容电池。超级电容器电池被引入来处理由可再生能源引起的波动,锂离子电池被用于支持电网 电池储能:为锂离子电池和超级电容电池实施高效的充电和放电机制 能量管理系统(EMS):平衡光伏系统、电池和负载之间的能量流动。 负载动力学:支持可变负载条件,以测试系统的健壮性。 用户友好的设计:模块化和可定制的模型架构,易于适应。 应用程序 可再生能源的电网整合。 离网储能系统的开发。 理解ESS和太阳能概念的教育目的。 可再生能源技术的研究和开发。

    新能源汽车VCU电控开发:核心技术解析及其应用

    内容概要:本文详细探讨了新能源汽车VCU(整车控制器)电控开发的关键技术和应用场景。首先介绍了VCU的重要性和主要职责,强调它是汽车的大脑,负责处理驾驶员操作信号并协调多个子系统的工作。接着阐述了VCU电控开发的具体流程,包括需求分析、硬件设计、软件开发以及测试验证四个主要环节。在软件开发部分,着重讲解了控制算法实现和通信协议的设计,展示了具体的代码示例。此外,文中还提到了一些实际开发过程中遇到的技术难题及解决方案,如信号滤波、故障诊断等。 适合人群:从事新能源汽车行业研究和技术开发的专业人士,尤其是对VCU电控开发感兴趣的工程师。 使用场景及目标:适用于希望深入了解新能源汽车VCU电控开发全过程的学习者;帮助开发者掌握从需求分析到最终产品落地的完整开发链路;提供实用的技术指导,提高开发效率和产品质量。 其他说明:文章不仅提供了理论知识,还有丰富的实战经验分享,对于理解和解决实际开发中的问题是很有价值的参考资料。

    信捷XD3 PLC六轴机器人:梯形图与C语言编程的复杂挑战

    内容概要:本文详细介绍了信捷XD3 PLC驱动的六轴机器人项目,涵盖了硬件组合、梯形图编程、C语言编程以及维纶通触摸屏的应用。信捷XD3 PLC作为核心控制器,通过梯形图实现基本逻辑控制,如启动、停止、互锁等;C语言则用于处理复杂的运动轨迹规划和算法计算。维纶通触摸屏提供了友好的人机交互界面,便于参数设置和任务示教。文中还分享了许多实际项目中的经验和技巧,如梯形图的安全互锁设计、C语言中的浮点运算优化、触摸屏的通信配置等。 适合人群:具备一定PLC编程基础和技术背景的工程师,尤其是从事工业自动化领域的技术人员。 使用场景及目标:适用于需要深入了解PLC编程、C语言应用及人机交互设计的技术人员,帮助他们更好地理解和解决六轴机器人控制系统中的复杂问题。 其他说明:文章不仅提供了理论知识,还结合了大量的实际案例和代码示例,有助于读者在实践中快速上手并解决问题。

    超过100个项目组成的项目资料.rar

    超过100个项目组成的项目资料

    西门子博途PLC S型速度曲线加减速与位置轨迹规划在自动化控制领域的应用

    内容概要:本文详细介绍了西门子博途PLC中S型速度曲线加减速及其与位置轨迹规划相结合的技术。S型速度曲线通过平滑处理加速度,使得设备启动和停止时的速度变化更为柔和,减少了对机械设备的冲击。文中不仅解释了S型速度曲线的工作原理,还给出了具体的LAD语言和SCL语言代码示例,展示了如何在博途平台上实现这一功能。此外,文章还讨论了位置轨迹规划的具体方法,如利用目标位置数组和循环条件判断来实现多点位置的平滑过渡。最后,文章分享了一些调试技巧和实践经验,强调了参数选择和优化的重要性。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是那些对PLC编程有一定基础的人群。 使用场景及目标:适用于需要高精度和平稳运动控制的工业设备,如包装机械、数控机床等。主要目标是减少设备启动和停止时的冲击,提高生产效率和产品质量。 其他说明:文中提供的代码示例和调试技巧可以帮助读者更好地理解和应用S型速度曲线加减速及位置轨迹规划技术。建议读者在实践中结合具体设备特性和需求进行参数调整和优化。

    用SSI设计组合逻辑电路

    仿真

    基于EKF的15状态INS/GPS松组合导航系统设计与实现 - 北东地(NED)坐标系下的状态估计

    内容概要:本文详细介绍了基于扩展卡尔曼滤波(EKF)的15状态INS/GPS松组合导航系统的实现方法。首先定义了15个状态变量,包括位置误差、速度误差、姿态误差以及陀螺仪和加速度计的零偏。接着阐述了状态转移矩阵F的设计,重点讨论了速度误差与姿态误差之间的耦合关系,以及IMU零偏的建模。文中还探讨了GPS量测更新的具体实现,特别是在GPS信号丢失时的处理方法。此外,强调了协方差矩阵的初始化和调参技巧,如将GPS的HDOP融入观测噪声矩阵,以及处理姿态误差发散等问题。最后,提到了一些常见的调试陷阱,如姿态误差线性化范围和地理系更新周期的选择。 适合人群:从事导航系统开发的研究人员和技术工程师,尤其是对EKF、INS和GPS融合感兴趣的从业者。 使用场景及目标:适用于需要精确导航的应用场景,如无人机、自动驾驶汽车等。目标是通过EKF实现高精度的位置和姿态估计,确保在GPS信号不稳定的情况下仍能维持较长时间的导航精度。 其他说明:文章提供了大量代码片段作为辅助解释,帮助读者更好地理解和实现该系统。同时,文中提到的实际调试经验和常见错误也为初学者提供了宝贵的指导。

    三菱PLC张力控制系统设计:锂电分切机的锥度与恒张力控制实现

    内容概要:本文详细介绍了一种适用于锂电行业分切机的三菱PLC张力控制通用程序模板。该模板涵盖锥度计算、模拟量输入输出、张力检测与PID调节、电气控制逻辑四大模块。通过动态调整伺服电机的转速和张力,确保材料收卷的均匀性和稳定性。文中提供了详细的代码示例和技术细节,如锥度计算中的加权平均滤波、模拟量处理中的非线性补偿、PID调节中的死区控制等。此外,还包括完整的程序注释和电气图纸,便于二次开发和实际应用。 适合人群:从事PLC编程和自动化控制的工程师,尤其是专注于锂电行业的技术人员。 使用场景及目标:① 锂电分切机的张力控制优化;② 提升材料收卷的质量和效率;③ 快速掌握张力控制的核心逻辑和实现方法。 其他说明:该模板不仅提供代码实现,还包含了大量实战经验和调试技巧,有助于解决实际应用中的常见问题。

    电力电子领域双极性SPWM控制单相全桥逆变电路仿真实现及电压电流双闭环控制

    内容概要:本文详细探讨了双极性SPWM控制的单相全桥逆变电路及其电压电流双闭环控制方法。首先介绍了电路的基本参数设定,如直流输入电压范围10-40V,输出交流峰值正负10-40V,频率可在1-200Hz之间调节。接着阐述了双极性SPWM控制原理,并提供了Python代码用于生成SPWM波形。随后深入讲解了电压电流双闭环控制的具体实现,包括电压环和电流环的PI调节器参数设置及优化方法。最后讨论了仿真过程中的一些注意事项和技术细节,如死区时间设置、滤波器参数选择、过流保护等。 适合人群:从事电力电子研究的技术人员、高校师生及相关领域的研究人员。 使用场景及目标:适用于需要进行逆变电路设计、仿真和优化的研究项目,旨在提高逆变电路的性能和稳定性,确保其能够适应不同应用场景的需求。 其他说明:文中提供的代码片段和参数配置有助于读者更好地理解和实践双极性SPWM控制及双闭环控制技术,同时也指出了常见问题及解决方案。

    基于Matlab仿真的市场模式下光伏用户群电能共享与需求响应模型研究

    内容概要:本文探讨了市场模式下光伏用户群体的电能共享与需求响应模型。研究指出,通过集群方式实现电能共享能够为光伏用户提供更高的经济效益。文中介绍了基于光伏电能供需比(SDR)的内部价格模型,用于合理确定电能交易价格;以及用户参与需求响应(DR)的效用成本模型,旨在平衡经济性和舒适度。此外,文章还讨论了非合作博弈与分布式优化算法的应用,确保用户在现有电价机制下实现效用最大化。最终,通过实际算例验证了模型的有效性,结果显示整体用电成本降低,光功率互用水平提高。 适合人群:对光伏能源管理、智能电网、需求响应等领域感兴趣的科研人员和技术开发者。 使用场景及目标:适用于研究和开发光伏用户群的电能管理和需求响应系统,目标是提高清洁能源利用率,降低用电成本,增强系统的稳定性和效率。 其他说明:文章不仅提供了理论模型,还包括具体的Matlab代码实现,便于读者理解和实践。

    基于51单片机protues仿真的烘干机控制系统(仿真图、源代码、AD原理图、流程图)

    基于51单片机protues仿真的烘干机控制系统(仿真图、源代码、AD原理图、流程图) 设计一款以单片机作为主控的便于携带的衣物快速烘干装置,具有定时烘干、过热保护等功能。 1、利用电机带动风扇,电热丝加热,实现热空气在烘干袋中流动,促进衣物快速干燥。 2、烘干袋中带有温度和湿度传感器,实时监测,保证安全的同时可以调节相关参数满足用户烘干需求。 3、设置一个总开关,有温湿度传感器,有显示屏可以实时监测数据 4、具有定时功能,温湿度超出范围自动断电。 5、仿真图、源代码、AD原理图、流程图;

    图像与信号处理领域的低秩矩阵分解Matlab实现及其应用

    内容概要:本文详细介绍了利用Matlab实现低秩矩阵分解的方法,特别针对图像和信号处理中的杂波去除问题。文中首先解释了为何选择低秩矩阵分解这一方法,即很多实际数据矩阵虽然看起来复杂,但实际上具有低维结构,可以通过分解为低秩矩阵和稀疏矩阵来分别表示主要结构和杂波。接着展示了具体的Matlab代码实现,包括参数设置、初始化、迭代更新规则以及收敛条件的检查。此外,还提供了多个应用场景的具体实例,如处理含噪图像、老照片修复等,并讨论了一些优化技巧,如采用随机SVD提高效率。 适合人群:从事图像处理、信号处理的研究人员和技术开发者,尤其是对低秩矩阵分解感兴趣的学者。 使用场景及目标:适用于需要从含噪数据中提取有用信息的各种场合,如医学影像、遥感图像、音频信号等领域。目的是通过去除杂波,提高数据质量,增强后续分析的有效性和准确性。 其他说明:文中不仅给出了完整的代码示例,还深入探讨了各个步骤背后的数学原理,帮助读者理解算法的工作机制。同时提醒使用者注意处理大规模数据时可能出现的问题及解决方案。

    基于LS-DYNA的轿车碰撞仿真:安全气囊对驾驶员保护机制的研究与应用

    内容概要:本文详细介绍了利用LS-DYNA进行轿车碰撞仿真的方法和技术要点,特别关注安全气囊在碰撞过程中对驾驶员的保护作用。文章首先解释了K文件中关于气囊配置的关键参数设定,如气囊起爆逻辑、接触定义、摩擦系数等。接着探讨了如何通过特定的输出设置来获取驾驶员关键节点的速度、加速度以及力的变化情况,并展示了如何使用Python脚本处理仿真结果,评估头部伤害指数(HIC)和其他重要指标。此外,文中还提到了一些实际案例,比如调整气囊泄气孔尺寸对胸腔压缩量的影响,以及如何识别并解决仿真中可能出现的问题。 适合人群:从事车辆安全研究的专业人士、碰撞仿真工程师、汽车制造商的研发团队成员。 使用场景及目标:适用于希望深入了解安全气囊工作原理及其对乘员保护效果的技术人员;旨在提高车辆安全性设计水平,优化安全气囊及其他被动安全系统的性能。 其他说明:文章不仅提供了理论指导,还包括了许多实用的操作技巧和注意事项,对于初次接触此类仿真的读者尤其有帮助。同时强调了参数选择的重要性,指出即使是细微的变化也可能导致显著不同的结果。

    基于容腔法的Simulink涡喷发动机动态模型构建与扰动模拟

    内容概要:本文详细介绍了如何利用Simulink和Matlab构建涡喷发动机动态模型,特别是采用容腔法对发动机各个关键部件进行建模。文章首先解释了容腔法的基本思想及其优势,接着展示了具体模块(如进气道、压气机、燃烧室、涡轮、尾喷管等)的数学模型和相应的Matlab函数实现。文中还探讨了扰动模拟的方法,包括高度、马赫数以及燃油量的扰动,并提供了具体的代码示例。此外,作者分享了一些调试技巧和常见错误,强调了模型参数调整的重要性。最后,通过一系列可视化图表展示了模型的动态响应特性。 适合人群:航空航天工程领域的研究人员和技术人员,尤其是从事航空发动机设计、仿真和优化工作的专业人士。 使用场景及目标:适用于需要深入了解涡喷发动机构造及其动态特性的场合,帮助工程师们更好地理解和预测发动机在不同工况下的行为表现,从而改进控制系统的设计和提高飞行安全性。 其他说明:文章不仅提供了理论知识,还包括了大量的实用代码段和实践经验,使得读者能够动手实践并深入理解所讨论的内容。

    基于Matlab/Simulink的LLC并网/离网逆变器双闭环控制仿真及优化

    内容概要:本文详细介绍了利用Matlab/Simulink进行LLC并网/离网逆变器的建模与仿真。主要内容涵盖主电路设计(LLC谐振腔、全桥逆变)、坐标变换(abc转dq)、双闭环控制(电流电压环)、调制方法(SVPWM vs SPWM)以及各种优化技巧。文中强调了锁相环(PLL)的应用、参数整定、死区时间设置、谐波抑制等关键技术点,并提供了具体的MATLAB代码示例。通过这些技术手段,实现了并网模式下THD小于3%,离网模式下电压畸变率不超过1.8%的优异性能。 适合人群:从事电力电子、新能源发电领域的研究人员和技术人员,尤其是对逆变器设计和仿真感兴趣的工程师。 使用场景及目标:适用于希望深入了解LLC逆变器工作原理及其仿真优化的人群。目标是在实际应用中提高逆变器的效率和稳定性,减少谐波失真,确保系统的可靠性和高性能。 其他说明:文章不仅提供了详细的理论解释,还分享了许多实际调试经验和代码片段,帮助读者更好地理解和掌握相关技术。

Global site tag (gtag.js) - Google Analytics