Joda-Time 令时间和日期值变得易于管理、操作和理解。事实上,易于使用是 Joda 的主要设计目标。其他目标包括可扩展性、完整的特性集以及对多种日历系统的支持。并且 Joda 与 JDK 是百分之百可互操作的,因此您无需替换所有 Java 代码,只需要替换执行日期/时间计算的那部分代码。
本文将介绍并展示如何使用它。我将介绍以下主题:
日期/时间替代库简介
Joda 的关键概念
创建Joda-Time 对象
以Joda 的方式操作时间 style
以Joda 的方式格式化时间
Joda 简介
为什么要使用 Joda?考虑创建一个用时间表示的某个随意的时刻 — 比如,2000 年 1 月 1 日 0 时 0 分。我如何创建一个用时间表示这个瞬间的 JDK 对象?使用 java.util.Date
?事实上这是行不通的,因为自 JDK 1.1 之后的每个 Java 版本的 Javadoc 都声明应当使用java.util.Calendar
。Date
中不赞成使用的构造函数的数量严重限制了您创建此类对象的途径。
然而,Date
确实有一个构造函数,您可以用来创建用时间表示某个瞬间的对象(除 “现在” 以外)。该方法使用距离 1970 年 1 月 1 日子时格林威治标准时间(也称为 epoch)以来的毫秒数作为一个参数,对时区进行校正。考虑到 Y2K 对软件开发企业的重要性,您可能会认为我已经记住了这个值 — 但是我没有。Date
也不过如此。
那么 Calendar
又如何呢?我将使用下面的方式创建必需的实例:
Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0);
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);这一行简单代码没有太大的区别。但是现在我将使问题稍微复杂化。假设我希望在这个日期上加上 90 天并输出结果。使用 JDK,我需要使用清单 1 中的代码:
清单 1. 以 JDK 的方式向某一个瞬间加上 90 天并输出结果
Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0); SimpleDateFormat sdf = new SimpleDateFormat("E MM/dd/yyyy HH:mm:ss.SSS"); calendar.add(Calendar.DAY_OF_MONTH, 90); System.out.println(sdf.format(calendar.getTime()));使用 Joda,代码如清单 2 所示:
清单 2. 以 Joda 的方式向某一个瞬间加上 90 天并输出结果
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0); System.out.println(dateTime.plusDays(90).toString("E MM/dd/yyyy HH:mm:ss.SSS");两者之间的差距拉大了(Joda 用了两行代码,JDK 则是 5 行代码)。
现在假设我希望输出这样一个日期:距离 Y2K 45 天之后的某天在下一个月的当前周的最后一天的日期。坦白地说,我甚至不想使用 Calendar
处理这个问题。使用 JDK 实在太痛苦了,即使是简单的日期计算,比如上面这个计算。正是多年前的这样一个时刻,我第一次领略到 Joda-Time 的强大。使用 Joda,用于计算的代码如清单 3 所示:
清单 3. 改用 Joda
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0); System.out.println(dateTime.plusDays(45).plusMonths(1).dayOfWeek() .withMaximumValue().toString("E MM/dd/yyyy HH:mm:ss.SSS");清单 3 的输出为:
Sun 03/19/2000 00:00:00.000如果您正在寻找一种易于使用的方式替代 JDK 日期处理,那么您真的应该考虑 Joda。如果不是这样的话,那么继续痛苦地使用
Calendar
完成所有日期计算吧。当您做到这一点后,您完全可以做到使用几把剪刀修建草坪并使用一把旧牙刷清洗您的汽车。Joda 和 JDK 互操作性
JDK Calendar
类缺乏可用性,这一点很快就能体会到,而 Joda 弥补了这一不足。Joda 的设计者还做出了一个决定,我认为这是它取得成功的构建:JDK 互操作性。Joda 的类能够生成(但是,正如您将看到的一样,有时会采用一种比较迂回的方式)java.util.Date
的实例(和Calendar
)。这使您能够保留现有的依赖 JDK 的代码,但是又能够使用 Joda 处理复杂的日期/时间计算。
例如,完成 清单 3 中的计算后。我只需要做出如清单 4 所示的更改就可以返回到 JDK 中:
清单 4. 将 Joda 计算结果插入到 JDK 对象中
Calendar calendar = Calendar.getInstance(); DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0); System.out.println(dateTime.plusDays(45).plusMonths(1).dayOfWeek() .withMaximumValue().toString("E MM/dd/yyyy HH:mm:ss.SSS"); calendar.setTime(dateTime.toDate());就是这么简单。我完成了计算,但是可以继续在 JDK 对象中处理结果。这是 Joda 的一个非常棒的特性。
Joda 的关键日期/时间概念
Joda 使用以下概念,它们可以应用到任何日期/时间库:
- 不可变性(Immutability)
- 瞬间性(Instant)
- 局部性(Partial)
- 年表(Chronology)
- 时区(Time zone)
我将针对 Joda 依次讨论每一个概念。
不可变性
我在本文讨论的 Joda 类具有不可变性,因此它们的实例无法被修改。(不可变类的一个优点就是它们是线程安全的)。我将向您展示的用于处理日期计算的 API 方法全部返回一个对应 Joda 类的新实例,同时保持原始实例不变。当您通过一个 API 方法操作 Joda 类时,您必须捕捉该方法的返回值,因为您正在处理的实例不能被修改。您可能对这种模式很熟悉;比如,这正是 java.lang.String
的各种操作方法的工作方式。
瞬间性
Instant
表示时间上的某个精确的时刻,使用从 epoch 开始计算的毫秒表示。这一定义与 JDK 相同,这就是为什么任何 Joda Instant
子类都可以与 JDK Date
和 Calendar
类兼容的原因。
更通用一点的定义是:一个瞬间 就是指时间线上只出现一次且唯一的一个时间点,并且这种日期结构只能以一种有意义的方式出现一次。
局部性
一个局部时间,正如我将在本文中将其称为局部时间片段一样,它指的是时间的一部分片段。瞬间性指定了与 epoch 相对的时间上的一个精确时刻,与此相反,局部时间片段指的是在时间上可以来回 “移动” 的一个时刻,这样它便可以应用于多个实例。比如,6 月 2 日 可以应用于任意一年的 6 月份(使用 Gregorian 日历)的第二天的任意瞬间。同样,11:06 p.m. 可以应用于任意一年的任意一天,并且每天只能使用一次。即使它们没有指定一个时间上的精确时刻,局部时间片段仍然是有用的。
我喜欢将局部时间片段看作一个重复周期中的一点,这样的话,如果我正在考虑的日期构建可以以一种有意义的方式出现多次(即重复的),那么它就是一个局部时间。
年表
Joda 本质 — 以及其设计核心 — 的关键就是年表(它的含义由一个同名抽象类捕捉)。从根本上讲,年表是一种日历系统 — 一种计算时间的特殊方式 — 并且是一种在其中执行日历算法的框架。受 Joda 支持的年表的例子包括:
- ISO(默认)
- Coptic
- Julian
- Islamic
Joda-Time 1.6 支持 8 种年表,每一种都可以作为特定日历系统的计算引擎。
时区
时区是值一个相对于英国格林威治的地理位置,用于计算时间。要了解事件发生的精确时间,还必须知道发生此事件的位置。任何严格的时间计算都必须涉及时区(或相对于 GMT),除非在同一个时区内发生了相对时间计算(即时这样时区也很重要,如果事件对于位于另一个时区的各方存在利益关系的话)。
DateTimeZone
是 Joda 库用于封装位置概念的类。许多日期和时间计算都可以在不涉及时区的情况下完成,但是仍然需要了解 DateTimeZone
如何影响 Joda 的操作。默认时间,即从运行代码的机器的系统时钟检索到的时间,在大部分情况下被使用。
介绍的差不多了,接下来直接看代码:
- package com.bijian.study;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Locale;
- import org.joda.time.DateTime;
- import org.joda.time.Days;
- import org.joda.time.LocalDate;
- import org.joda.time.format.DateTimeFormat;
- import org.joda.time.format.DateTimeFormatter;
- public class JodaTest {
- public static void main(String[] args) {
- // 初始化时间
- DateTime dateTime = new DateTime(2012, 12, 13, 18, 23, 55);
- // 年,月,日,时,分,秒,毫秒
- DateTime dt3 = new DateTime(2011, 2, 13, 10, 30, 50, 333);// 2010年2月13日10点30分50秒333毫秒
- // 下面就是按照一点的格式输出时间
- String str2 = dateTime.toString("MM/dd/yyyy hh:mm:ss.SSSa");
- String str3 = dateTime.toString("dd-MM-yyyy HH:mm:ss");
- String str4 = dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa");
- String str5 = dateTime.toString("MM/dd/yyyy HH:mm ZZZZ");
- String str6 = dateTime.toString("MM/dd/yyyy HH:mm Z");
- DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
- // 时间解析
- DateTime dateTime2 = DateTime.parse("2012-12-21 23:22:45", format);
- // 时间格式化,输出==> 2012/12/21 23:22:45 Fri
- String string_u = dateTime2.toString("yyyy/MM/dd HH:mm:ss EE");
- System.out.println(string_u);
- // 格式化带Locale,输出==> 2012年12月21日 23:22:45 星期五
- String string_c = dateTime2.toString("yyyy年MM月dd日 HH:mm:ss EE",
- Locale.CHINESE);
- System.out.println(string_c);
- DateTime dt1 = new DateTime();// 取得当前时间
- // 根据指定格式,将时间字符串转换成DateTime对象,这里的格式和上面的输出格式是一样的
- DateTime dt2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
- .parseDateTime("2012-12-26 03:27:39");
- // 计算两个日期间隔的天数
- LocalDate start = new LocalDate(2012, 12, 14);
- LocalDate end = new LocalDate(2013, 01, 15);
- int days = Days.daysBetween(start, end).getDays();
- // 计算两个日期间隔的小时数,分钟数,秒数
- // 增加日期
- DateTime dateTime1 = DateTime.parse("2012-12-03");
- dateTime1 = dateTime1.plusDays(30);
- dateTime1 = dateTime1.plusHours(3);
- dateTime1 = dateTime1.plusMinutes(3);
- dateTime1 = dateTime1.plusMonths(2);
- dateTime1 = dateTime1.plusSeconds(4);
- dateTime1 = dateTime1.plusWeeks(5);
- dateTime1 = dateTime1.plusYears(3);
- // Joda-time 各种操作.....
- dateTime = dateTime.plusDays(1) // 增加天
- .plusYears(1)// 增加年
- .plusMonths(1)// 增加月
- .plusWeeks(1)// 增加星期
- .minusMillis(1)// 减分钟
- .minusHours(1)// 减小时
- .minusSeconds(1);// 减秒数
- // 判断是否闰月
- DateTime dt4 = new DateTime();
- org.joda.time.DateTime.Property month = dt4.monthOfYear();
- System.out.println("是否闰月:" + month.isLeap());
- // 取得 3秒前的时间
- DateTime dt5 = dateTime1.secondOfMinute().addToCopy(-3);
- dateTime1.getSecondOfMinute();// 得到整分钟后,过的秒钟数
- dateTime1.getSecondOfDay();// 得到整天后,过的秒钟数
- dateTime1.secondOfMinute();// 得到分钟对象,例如做闰年判断等使用
- // DateTime与java.util.Date对象,当前系统TimeMillis转换
- DateTime dt6 = new DateTime(new Date());
- Date date = dateTime1.toDate();
- DateTime dt7 = new DateTime(System.currentTimeMillis());
- dateTime1.getMillis();
- Calendar calendar = Calendar.getInstance();
- dateTime = new DateTime(calendar);
- }
- }
运行结果:
- 2012/12/21 23:22:45 星期五
- 2012年12月21日 23:22:45 星期五
- 是否闰月:true
下面是一个小例子用来计算小宝宝从出生到现在总共的天数小时数等,首先用jdk的类去做,不用joda,然后再用joda去做,以做比较。
用jdk做的例子,这里算的从出生到现在的时间间隔是准确的,如果是输入的某天来算的话就不是很准确,多一秒就算一天。可以看到用jdk去做的话,要写的代码还是挺繁琐的。
- package com.bijian.study;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Scanner;
- public class CalBaby {
- private final static String birthday = "2012-3-10 08:20:55";
- /**
- * @param args
- */
- public static void main(String[] args) {
- while(true){
- String format1 = "yyyy-MM-dd";
- String format2 = "yyyy-MM-dd HH:mm:ss";
- Scanner s = new Scanner(System.in);
- System.out.println("########################################");
- cutTwoDateToDay(convertToDate1(birthday,format2),new Date(),false);
- System.out.println("请选择操作");
- System.out.println("请输入日期(格式例如:2012-11-08)");
- System.out.println("########################################");
- String endDateStr = s.nextLine();
- Date endDate = convertToDate1(endDateStr,format1);
- if(endDate == null){
- System.out.println("输入格式错误!请重新输入.");
- continue;
- }
- boolean inputFlag = true;
- cutTwoDateToDay(convertToDate1(birthday,format2),endDate,inputFlag);
- }
- }
- /**
- * 计算两个日期之间的差距天数
- *
- * @param a
- * @param b
- * @return
- */
- public static void cutTwoDateToDay(Date beginDate, Date endDate,boolean inputFlag) {
- Calendar calendar = Calendar.getInstance();
- long intervalDays = 0;
- calendar.setTime(beginDate);
- long begin = calendar.getTimeInMillis();
- calendar.setTime(endDate);
- long end = calendar.getTimeInMillis();
- long totalM = end - begin;
- System.out.println((end -begin));
- System.out.println(24*60*60*1000);
- intervalDays = totalM /(24*60*60*1000);
- long intervalHours = (totalM - (intervalDays*24*60*60*1000))/(60*60*1000);
- long intervalMin = (totalM - intervalDays * (24*60*60*1000) - intervalHours*60*60*1000)/(60*1000);
- if(inputFlag){
- if(totalM > 0L && totalM %(24*60*60*1000) > 0L){
- intervalDays = intervalDays + 1;
- }
- System.out.println("宝宝从出生到"+formatDate(endDate,"yyyy-MM-dd")+"已经"+intervalDays+"天了");
- }else{
- System.out.println("宝宝来到这个世界已经"+intervalDays+"天"+intervalHours+"小时"+intervalMin+"分钟了");
- }
- }
- /**
- * 将字符串日期转换为Date yyyy-MM-dd HH:mm:ss yyyy-MM-dd
- *
- * @param s
- * @return
- */
- public static Date convertToDate1(String s,String format) {
- if (s == null) {
- return null;
- }
- try {
- SimpleDateFormat df = new SimpleDateFormat(format);
- return df.parse(s);
- } catch (Exception e) {
- return null;
- }
- }
- public static String formatDate(Date date, String strType)
- {
- if (date == null)
- {
- return null;
- }
- SimpleDateFormat sdf = new SimpleDateFormat(strType);
- try
- {
- return sdf.format(date);
- }
- catch (Exception e)
- {
- return null;
- }
- }
- }
运行测试结果:
- ########################################
- 124288757170
- 86400000
- 宝宝来到这个世界已经1438天12小时39分钟了
- 请选择操作
- 请输入日期(格式例如:2012-11-08)
- ########################################
- 2012-11-08
- 20965145000
- 86400000
- 宝宝从出生到2012-11-08已经243天了
- ########################################
- 124288786437
- 86400000
- 宝宝来到这个世界已经1438天12小时39分钟了
- 请选择操作
- 请输入日期(格式例如:2012-11-08)
- ########################################
- 2014-02-18
- 61313945000
- 86400000
- 宝宝从出生到2014-02-18已经710天了
- ########################################
- 124288799223
- 86400000
- 宝宝来到这个世界已经1438天12小时39分钟了
- 请选择操作
- 请输入日期(格式例如:2012-11-08)
- ########################################
下面是用joda来做,用这个来做就简单的多了,而且也很准确。
- package com.bijian.study;
- import java.util.Scanner;
- import org.joda.time.DateTime;
- import org.joda.time.Days;
- import org.joda.time.LocalDate;
- import org.joda.time.format.DateTimeFormat;
- import org.joda.time.format.DateTimeFormatter;
- public class CalBabyJoda {
- private final static String birthday = "2012-3-10 08:20:55";
- public static void main(String[] args) {
- while(true){
- Scanner s = new Scanner(System.in);
- System.out.println("########################################");
- DateTimeFormatter format1 = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss");
- DateTimeFormatter format2 = DateTimeFormat .forPattern("yyyy-MM-dd");
- DateTime startDateTime = DateTime.parse(birthday, format1);
- System.out.println("宝宝来到这个世界已经");
- calDateToDay(startDateTime,new DateTime());
- System.out.println("如选择其它日期请输入(格式例如:2012-11-08 14:24:54或着2012-11-08)");
- System.out.println("########################################");
- String endDate = s.nextLine();
- DateTime endDateTime = null;
- try{
- endDateTime = DateTime.parse(endDate,format1);
- }catch(Exception e){
- try{
- endDateTime = DateTime.parse(endDate,format2);
- }catch(Exception e1){
- System.out.println("输入格式错误!请重新输入.");
- continue;
- }
- }
- System.out.println("宝宝从出生到" + endDateTime.toString("yyyy-MM-dd HH:mm:ss") + "已经");
- calDateToDay(startDateTime,endDateTime);
- }
- }
- public static void calDateToDay(DateTime startDateTime,DateTime endDateTime){
- LocalDate start=new LocalDate(startDateTime);
- LocalDate end=new LocalDate(endDateTime);
- Days days = Days.daysBetween(start, end);
- int intervalDays = days.getDays();
- int intervalHours = endDateTime.getHourOfDay() - startDateTime.getHourOfDay();
- int intervalMinutes = endDateTime.getMinuteOfHour() - startDateTime.getMinuteOfHour();
- int intervalSeconds = endDateTime.getSecondOfMinute() - startDateTime.getSecondOfMinute();
- if(intervalSeconds < 0){
- intervalMinutes = intervalMinutes -1;
- intervalSeconds = 60 + intervalSeconds;
- }
- if(intervalMinutes < 0){
- intervalHours = intervalHours -1;
- intervalMinutes = 60 + intervalMinutes;
- }
- if(intervalHours < 0){
- intervalDays = intervalDays -1;
- intervalHours = 24 + intervalHours;
- }
- System.out.println(intervalDays + "天" + intervalHours +
- "小时" + intervalMinutes + "分钟" + intervalSeconds + "秒");
- System.out.println("############################");
- }
- }
运行测试结果:
- ########################################
- 宝宝来到这个世界已经
- 1438天12小时41分钟57秒
- ############################
- 如选择其它日期请输入(格式例如:2012-11-08 14:24:54或着2012-11-08)
- ########################################
- 2012-11-08
- 宝宝从出生到2012-11-08 00:00:00已经
- 242天15小时39分钟5秒
- ############################
- ########################################
- 宝宝来到这个世界已经
- 1438天12小时42分钟0秒
- ############################
- 如选择其它日期请输入(格式例如:2012-11-08 14:24:54或着2012-11-08)
- ########################################
- 2014-02-18
- 宝宝从出生到2014-02-18 00:00:00已经
- 709天15小时39分钟5秒
- ############################
- ########################################
- 宝宝来到这个世界已经
- 1438天12小时42分钟7秒
- ############################
- 如选择其它日期请输入(格式例如:2012-11-08 14:24:54或着2012-11-08)
- ########################################
介绍的比较详细:
http://www.ibm.com/developerworks/cn/java/j-jodatime.html
示例写得比较好:
http://bijian1013.iteye.com/blog/2276805
还可以简单看一下:
http://shanruifeng.cc/archives/31#14
相关推荐
7. **日期时间API**:Java.util.Date和Calendar类用于处理日期和时间,Joda-Time或Java 8中的java.time包提供了更强大和易用的日期时间处理功能。 8. **国际化和本地化**:Locale类和ResourceBundle支持不同地区的...
- **joda-time.jar**:用于处理日期和时间的工具库。 以上步骤完成后,即可开始使用 JBPM 4.4 进行业务流程的设计与实施。对于初学者来说,通过实践一个简单的请假审批流程是一个很好的起点。随着经验的积累,可以...
计算机术语.pdf
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
内容概要:本文详细介绍了基于PLC(可编程逻辑控制器)和组态软件的智能停车场收费系统的实现方法和技术细节。首先,文章概述了系统的总体架构,指出PLC用于控制停车场的电气设备,而组态软件则提供直观的操作界面。接着,深入解析了PLC梯形图程序的具体逻辑,包括车辆检测、闸门控制、收费计算等功能模块。此外,文章还讨论了接线图的设计原则和注意事项,如防止电磁干扰、确保系统稳定性的措施。最后,介绍了组态画面的设计思路及其优化方法,如动态显示车位状态、实时更新收费信息等。通过这些内容,读者能够全面了解智能停车场收费系统的内部运作机制。 适合人群:从事自动化控制、工业物联网、智能交通等领域的工作技术人员,尤其是对PLC编程和组态软件应用感兴趣的工程师。 使用场景及目标:适用于新建或改造停车场项目的规划与实施阶段,帮助工程师理解和设计类似的自动化控制系统,提高停车场管理效率和服务质量。 其他说明:文中提供了大量实际案例和技术细节,有助于读者更好地掌握相关技术和应对实际工程中的挑战。
内容概要:本文详细介绍了利用MATLAB及其工具箱YALMIP和求解器CPLEX/Gurobi构建电-气-热综合能源系统耦合优化调度模型的方法。首先,文章描述了电网部分采用39节点系统进行直流潮流建模,气网部分则使用比利时20节点配气网,并对Weymouth方程进行了线性化处理,将非线性问题转化为线性规划问题。热网部分引入了热电联产(CHP)和电转气(P2G)设备,实现了热电耦合。通过模块化设计,代码能够灵活地添加新的能量存储或转换设备。实验结果显示,相比单一网络优化,三网耦合优化降低了12.6%的系统总成本,并显著改善了负荷峰谷差。 适合人群:从事能源系统优化研究的专业人士,尤其是熟悉MATLAB编程和优化理论的研究人员和技术人员。 使用场景及目标:适用于希望深入了解综合能源系统耦合优化调度机制的研究人员和技术人员。主要目标是掌握如何使用MATLAB搭建电-气-热耦合优化模型,理解各个子系统的数学建模方法以及它们之间的相互作用。 其他说明:文中提供了详细的代码片段和解释,帮助读者更好地理解和复现模型。此外,还讨论了一些实际应用中的注意事项,如求解器的选择、参数调优等。
计算机三级网络机试考试试题及答案(下).pdf
内容概要:本文详细介绍了使用NX MCD进行机械臂抓取仿真的方法和技术要点。首先探讨了运行时参数的配置,如夹爪力度的动态调整和位置控制的脚本编写。接着讨论了条件仿真序列的设计,包括状态机跳转、阻塞等待、异步响应和超时保护等关键概念。此外,文章还讲解了与PLC的联合仿真,展示了如何通过TIA Portal实现抓取力度的动态补偿以及信号同步。最后分享了一些实用的调试技巧,如使用半速模式观察力学变化、设置碰撞检测触发器等。 适合人群:从事自动化设备开发、机械臂控制系统设计的技术人员,尤其是对NX MCD和PLC有一定了解的工程师。 使用场景及目标:适用于需要进行复杂机械臂抓取仿真的项目,帮助工程师更好地理解和掌握NX MCD与时序仿真的核心技术,提高仿真精度和可靠性。 其他说明:文中提供了大量具体的代码片段和配置示例,便于读者快速上手实践。同时强调了参数化配置的重要性,指出这是为了在现场调试时提供更大的灵活性。
计算机数控系统.pdf
本人创作,禁止商用
内容概要:本文详细介绍了一款大型流水线贴膜机的PLC程序和触摸屏程序,涵盖多个控制工艺如上下气缸控制、输送带电机控制、贴膜伺服控制等。程序适用于西门子S7-1200 PLC和KTP700触摸屏,支持V13及以上版本。文中提供了详细的代码示例和分析,解释了各个控制部分的工作原理及其优化技巧。此外,还介绍了异常处理机制、报警处理模块、以及触摸屏界面上的一些实用功能,如动画流程图显示和参数微调。 适合人群:工业自动化领域的初学者,尤其是对PLC编程和运动控制感兴趣的工程师和技术人员。 使用场景及目标:① 学习PLC编程和触摸屏程序设计的基础知识;② 掌握常见工业控制元件的编程方法和优化技巧;③ 提高对复杂控制系统的设计和调试能力。 其他说明:文章强调了程序中的关键技术和注意事项,如定时器保护、光电开关连锁、位置补偿算法等,有助于初学者避免常见错误并提高系统的可靠性和安全性。
内容概要:本文详细介绍了基于51单片机的多点测温系统的构建方法。系统采用五个DS18B20数字温度传感器进行温度采集,并将数据实时显示在LCD1602屏幕上。文中涵盖了硬件连接、单总线通信协议、温度读取与显示的具体实现细节,以及常见问题的解决方案。特别强调了ROM匹配算法的应用,确保多个传感器在同一总线上能够正确通信。此外,还提供了Proteus仿真的注意事项和一些调试技巧。 适合人群:对嵌入式系统开发感兴趣的初学者和有一定单片机基础的研发人员。 使用场景及目标:适用于恒温箱监控、多房间温控等应用场景,旨在帮助开发者掌握多点温度监测系统的搭建方法和技术要点。 其他说明:文中附有完整的硬件连接图和核心代码片段,便于读者理解和实践。同时提到了一些扩展功能,如温度单位切换、阈值报警等,增加了项目的趣味性和实用性。
内容概要:本文详细介绍了将模糊控制与传统PID相结合应用于直流电机控制的方法。首先阐述了传统PID控制在面对负载突变或转速大幅变化时的局限性,随后引入模糊PID的概念并展示了具体的实现步骤。文中提供了完整的Python和C语言代码示例,涵盖模糊规则表的设计、隶属度函数的选择以及参数自适应调整机制。此外,作者还分享了多个实用的经验技巧,如参数调整范围限制、误差量化因子选择、抗积分饱和算法的应用等。并通过实验数据对比证明了模糊PID相比传统PID在响应速度和稳定性方面的优势。 适合人群:具有一定自动化控制理论基础和技术实践经验的研发人员,尤其是从事电机控制系统开发的技术人员。 使用场景及目标:适用于需要提高直流电机控制系统鲁棒性和响应速度的实际工程项目。主要目标是在保持系统稳定的前提下,缩短调节时间和减少超调量,从而提升整体性能。 其他说明:尽管模糊PID能够显著改善某些特定条件下的控制效果,但仍需注意合理设置初始参数和调整幅度限制。同时,对于不同类型的电机和应用场景,可能还需要进一步优化模糊规则和隶属度函数。
计算机试题office应用.pdf
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
内容概要:本文详细介绍了用于冷热电联供系统(CCHP)的多目标粒子群优化(MOPSO)算法MATLAB实现。该代码通过动态惯性权重、轮盘赌全局最优选取和约束集成等特性,解决了燃气轮机出力与风光发电波动的平衡问题,优化了电制冷机和锅炉的启停策略,从而提高系统的经济性和环保性能。文中展示了核心代码片段,如粒子位置更新、适应度函数构建、约束处理策略以及帕累托前沿筛选等,强调了工程化思维的应用,如设备启停控制、风光预测处理等。 适合人群:从事能源系统优化的研究人员、工程师和技术爱好者,尤其是对MATLAB编程和多目标优化算法有一定了解的人士。 使用场景及目标:适用于需要优化冷热电联供系统运行策略的场合,旨在实现系统运行成本最小化和碳排放量最低的目标。具体应用场景包括但不限于:工业园区能源管理、分布式能源系统调度、智能电网优化等。 其他说明:该代码不仅提供了理论上的优化方案,还通过实际案例验证了其有效性,如在夏季负荷高峰场景下的动态调度策略。此外,代码具有良好的扩展性和实用性,支持多种设备模型和目标函数的定制化修改。
计算机求职笔试内容与分类
内容概要:本文详细介绍了欧洲进口料箱分拣系统的程序架构及其核心技术。系统采用西门子S7-1500 PLC作为控制器,通过Socket接口实现WCS(仓储控制系统)与PLC之间的高效通信。文中展示了PLC端的Socket服务端代码,以及分拣逻辑的具体实现,包括动态权重算法优化分拣路径、异常处理机制、变频器控制和报警处理模块的设计。此外,文章还探讨了硬件配置如扫码枪、直流辊筒电机和变频器的作用,以及程序中的模块化设计和工业级代码规范。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程、WCS集成和工业物联网感兴趣的读者。 使用场景及目标:适用于需要深入了解料箱输送线控制系统的工作原理、优化分拣效率、提高系统可靠性和稳定性的应用场景。目标是帮助读者掌握WCS与PLC的Socket通信设计、分拣逻辑优化及硬件配置的最佳实践。 其他说明:文章不仅提供了详细的代码示例,还分享了许多实际调试经验和设计思路,有助于读者更好地理解和应用相关技术。
内容概要:本文详细介绍了基于三菱FX5U PLC的螺丝机项目的ST语言程序,涵盖了轴控制、气缸逻辑以及威纶通触摸屏交互的设计与实现。程序采用功能块(FB)封装的方式,将复杂的运动控制和气缸操作简化为易于理解和使用的模块。轴控制部分利用状态机实现了伺服回原点等功能,并加入了类型校验和异常处理机制。气缸控制则通过状态机和超时保护确保可靠性。触摸屏程序通过严格的变量映射和结构化设计,实现了PLC与HMI的无缝对接。此外,还包括详细的注释和报警处理机制,使得系统更加健壮。 适合人群:具备PLC编程基础的技术人员,尤其是对三菱FX系列PLC和ST语言感兴趣的工程师。 使用场景及目标:适用于需要深入了解PLC编程和工业自动化系统的工程师,帮助他们在实际项目中快速掌握ST语言的应用技巧,提高开发效率并减少调试时间。 其他说明:文中提供了大量实际案例和技术细节,如轴控制、气缸控制、触摸屏交互等,有助于读者更好地理解和应用相关技术。同时,丰富的注释和错误处理机制也为后续维护提供了便利。
帮助用户规划地铁出行路线