`
lihong11
  • 浏览: 459274 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

深入浅出Rhino:Java与JS互操作

阅读更多

深入浅出Rhino:Java与JS互操作

2011年11月11日00:00 it168网站原创 作者:DoubleLife 编辑:皮丽华 评论:0

【IT168 专稿】2011年10月6日,一年一度的JavaOne大会隆重举行。JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition)、标准版(SE,Standard Edition)以及企业版(EE,Enterprise Edition)。

  Java SE的亮点之一就是Oracle详细阐述Java SE 8路线图。我们先来看看Java SE 8新增了哪些主要功能:

  Java SE 8 新增主要功能

  1、为提高开发人员工作效率,更好地利用多核处理器和增强对Java集合APIs的大容量数据处理功能,推出的Lambda表达式(“关闭”)。

  2、原始Java模块系统(“项目Jigsaw”)将简化应用程序的构建、包装以及部署,让一个完全模块化的Java平台能在服务器、客户和嵌入式系统上进行定制化部署。

  3、在JVM上的JavaScript改进,包括一个为JVM优化的全新JavaScript引擎Nashorn和全面的Java / JavaScript互操作性。

  4、具有JavaFX 3.0形式的下一代Java客户端。包括多点触摸功能的现代设备支持。

  5、完成的HotSpot / JRockit JVM集聚项目,包括性能增强和第二代的Java Flight Recorder。

  其中,笔者最关心的是第三条,即JVM对JavaScript的改进。它的核心组件是JavaScript引擎Nashorn,它实现了Java与JavaScript互操作性。Nashorn一词与Rhino类似,汉语意思均为犀牛。而巧合的是,Rhino就是JavaScript引擎,它的目的就是实现Java与JavaScript的互操作性。那么Rhino究竟是什么呢?为什么说Nashorn是新一代JavaScript引擎?Rhino有什么特性?Rhino与Java及JavaScript有什么关系呢?本文将会为您一一解答。

  什么是Rhino?

  Rhino 是 JavaScript 的一种基于Java的实现,原先由Mozilla开发,现在被集成进入JDK 6.0。下面这两行代码恰好说明了这一点。

  import sun.org.mozilla.javascript.internal.Context;

  import sun.org.mozilla.javascript.internal.Scriptable;

  Rhino汉语意思为犀牛,它的名字来源于 O'Reilly 关于 JavaScript 的书的封面,如图一所示。

  图一 “犀牛“的来源

  Rhino的特点如下:

  JavaScript 1.5的全部特性

  允许使用脚本直接操作Java

  提供JavaScript Shell执行其它JavaScript脚本

  提供JavaScript编译器将JavaScript源程序转换成Java类文件

  Rhino相关背景

  Rhino的历史可追溯到1997 年。Netscape计划开发Java版的Navigator,即Javagator。它也就是 Rhino 的前身。虽然 Javagator 未能开花结果,但是Rhino,作为Netscape 对 JavaScript 的移植语言,经过时间考验存活了下来。

  如今,随着 Rhino 开放源代码,越来越多的开发者参与了 Rhino 的开发。随着Rhino的愈加成熟,越来越多的用户选择使用了Rhino。

  Rhino语言特点

  Java是一种面对对象的编译型语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。

  JavaScript是一种动态、弱类型、基于原型的客户端脚本语言。JavaScript 包括一个基于对象的 API,称为文档对象模型(Document Object Model)或 DOM,用以访问和操作 Web 页面的内容,给HTML网页添加动态功能。

  Rhino是一个介于Java与JavaScript之间的语言。它的基础是 Java 语言,这使得它简单易学,但相比于JavaScript脚本语言来说,它又太过复杂。不过,Rhino 的主要缺点也正是它的强大之处,Rhino 是一种轻量级的、功能强大的脚本语言。Rhino 使用原型而不是类,这使它比很多脚本语言更适合开发 GUI 应用程序,在考虑性能和风格等因素时更是如此。

  Rhino语言特点的优缺点

  一方面,作为一种动态类型的、基于原型的脚本语言,Rhino借用了很多JavaScript语法。比如,Rhino不再使用语句结束符( ; ),放宽了变量声明规则,并且极大地简化了修改和检索对象属性的语法。另一方面,作为JavaScript 的Java实现,Rhino语法非常类似于Java编程语言。比如,Rhino采用了与 Java 编程语言相似的循环和条件结构,并且遵循类似的语法模式来表示这些结构。

  Rhino 和 Java 语言之间有一些显著的区别。Rhino 是一种基于原型的(prototype-based)语言,而不是一种基于类的(class-based)语言。Rhino中,函数和变量的声明中看不到类型,取而代之的是,使用 function关键字声明函数,使用 var关键字声明局部变量。

  Rhino的原始想法是将JavaScript 编译成Java字节码执行,即采用编译执行的方式。由于由于JVM存在垃圾收集、编译和装载过程的开销过大等限制,Rhino采用了解释执行的方式。

  如何下载Rhino安装包

  用户可以从官网http://www.mozilla.org/rhino/ 下载Rhino,笔者下载的版本为rhino1.7R3.zip。

  其中,主要的目录与文件的如下:

  Src:Rhino相关Jar包对应的源代码

  Javadoc:Rhino相关Jar包对应的Java说明文档

  Examples:Rhino相关示例

  build.xml:Rhino工程对应的Ant文件

  js.jar:Rhino对应的Jar包

 

【IT168 专稿】Rhino环境配置

  在使用之前,我们需要配置环境及运行js脚本。具体如下:

  1、 将下载包中的js.jar文件加入系统CLASSPATH中。

  2、 运行js解释器java org.mozilla.javascript.tools.shell.Main。进入交互模式:

Rhino 1.7 release 3 2011 05 09

  js>

  注:第一行为js解释器的版本号,后面跟着提示符 js>

    

下面我们将利用js shell,使用JavaScript操纵Java对象。

  JavaScript操纵Java对象

  1. Rhino如何访问Java包与类文件

  Java语法规定,任何代码都必须以class文件的形式存在,而每个class文件必须属于一个package,默认为default。而JavaScript并没有类似package的层级结构概念,那么如何使用Rhino访问Java类文件呢?

  Rhino定义了一个top-level变量Packages。变量Packages对应的所有属性均对应Java包名。比如,我们需要访问某一个Java的Package com.example.

js> Packages.com.example

  [JavaPackage com.example]

  简单起见,我们也可以去掉变量Packages,直接输入Java包名。因此,上述Package com.example等价与com.example,如下:

js> com.example

  [JavaPackage com.example]

  刚才演示了如何通过js shell访问Java包,访问Java类的方式类似。假如我们需要访问标准的Java 文件类java.io.File,如下。

  js> java.io.File

  [JavaClass java.io.File]

  或者,为避免输入全名,我们先导入包,然后输入Class类名,如下:

js> importPackage(java.io)

  js> File

  [JavaClass java.io.File]

  这里的importPackage(java.io),在效果上等价于Java声明import java.io.*; 不同的是,Java会隐式import java.lang.*,而Rhino不会。因为Rhino定义的对象Boolean, Math, Number, Object, String等与Java语法完全不同,两者无法等价。

  这里需要注意的是,Rhino对该语法的错误处理机制,当被访问的类存在时,Rhino加载该class,而当其不存在时,则把它当成package名称,而并不会报错。例如,当访问一个不存在的类com.example.AAA时,输入如下。

  js> com.example.AAA

  [JavaPackage com.example.AAA]

  仅当访问类AAA时,Rhino才会报错。

  2. Rhino如何与Java对象交互

  与Java类似,Rhino使用new操作符创建对象。

  js> new java.util.Date()

  Thu Nov 03 16:19:04 CST 2011

  可以使用JavaScript变量存储Java对象,并调用其方法,如下:

  js> f = new java.io.File("sample.txt")

  sample.txt

  js> f.isDirectory()

  false

  对于static方法与变量,调用如下:

js> java.lang.Math.PI

  3.141592653589793

 js> java.lang.Math.cos(0)

  1

【IT168 专稿】在JavaScript中,方法本身就是对象,这一点与Java不同。我们可以通过下列方式查看方法的重载:

js> f.listFiles

  function listFiles() {/*

  java.io.File[] listFiles()

  java.io.File[] listFiles(java.io.FilenameFilter)

  java.io.File[] listFiles(java.io.FileFilter)

  */}

  输出中列出三个重载方法。第一个为无参函数,第二与第三个对应的参数分别为FilenameFilter与FileFilter。

  另一个比较有意思的特点是通过构造for..in,查看对象对应的所有方法与变量。如下:

  js> for (i in f) { print(i) }

  exists

  parentFile

  mkdir

  toString

  wait

  [44 others]

  这里列出的方法一部分来自于父类,比如wait来自父类java.lang.Object。

  对于JavaBean,Rhino也提供按名字访问的简单方式。比如,通过下面这种方式,我们就可以调用File对象的getName与isDirectory方法:

  js> f.name

  test.txt

  js> f.directory

  false

  3. Rhino如何实现Java接口

  JavaScript当中,方法本身就是对象。下面我们通过JavaScript语法{propertyName: value}声明一个JavaScript方法,并调用该方法如下:

  js> obj = { run: function () { print("\nrunning"); } }

  [object Object]

  js> obj.run()

  running

  现在我们构造一个JavaScript对象,实现Runnable接口。并将该对象作为参数,构造一个新的线程,并启动该线程。

  js> r = new java.lang.Runnable(obj);

  adapter1@291aff

  js> t = new java.lang.Thread(r)

  Thread[Thread-0,5,main]

  js> t.start()

  js>

  running

  最后的js>提示符与新线程的打印输出running的先后顺序是随机的,取决于线程的调度策略。

  从后端的处理流程来讲,Rhino首先为Runnable接口的实现类生成Java字节码文件。然后调用JavaScript对象定义的Run方法。

  4. Rhino如何创建Java 数组

  Rhino使用Java的发射机制生成数组。下面是生成2个String对象的代码:

  js> array = java.lang.reflect.Array.newInstance(java.lang.String, 2);

  [Ljava.lang.String;@a20892

  js> array[0] = "Double"

  Double

  js> array[1] = "Life"

  Life

  js> array[0] + array[1]

  DoubleLife

  js>

  5. Rhino如何捕获与处理异常

  与Java类似,Rhino使用try...catch关键字处理异常。

  js> function classForName(name) {

  try {

  return java.lang.Class.forName(name);

  } catch (e if e.javaException instanceof java.lang.ClassNotFoundException) {

  print("Class " + name + " not found");

  } catch (e if e.javaException instanceof java.lang.NullPointerException) {

  print("Class name is null");

  }

  } > > > > > > > >

  js> classForName("NonExistingClass");

  Class NonExistingClass not found

  js> classForName(null);

  Class name is null

  【IT168 专稿】6. Rhino如何调用js文件

  当然,除了在命令行的方式,我们还可以使用操纵JavaScript文件。下面是一段JavaScript代码,主要目的是判断该数是否为质数。代码如下:

function isPrime (num)

  {

  if (num <= 1) {

  print("Enter an integer no less than 2.")

  return false

  }

  var prime = true

  var sqrRoot = Math.round(Math.sqrt(num))

  for (var n = 2; prime & n <= sqrRoot; ++n) {

  prime = (num % n != 0)

  }

  return prime

  }

  我们保存文件为C:\isPrime.js。然后我们需要调用load方法加载该脚本。最后,我们可以调用isPrime方法来判断是否为质数。

  js> load("C:/isPrime.js")

  js> isPrime(33);

  false

  js> isPrime(31)

  true

  需要注意的是,注意:文件分隔符需要调整,是“/”而不是“\”。

  上述部分示例可以参见Rhino官方网站https://developer.mozilla.org/en/Scripting_Java。另外examples目录下很多例子都值得参考与学习。

  刚才使用JavaScript操纵Java对象。接下来我们看看如何使用Java程序访问JavaScript

  Java对象操纵JavaScript

  下面是一段Java代码,用来运行数学表达式。代码如下:

  

package com.example;

  import sun.org.mozilla.javascript.internal.Context;

  import sun.org.mozilla.javascript.internal.Scriptable;

  publicclass Test {

  publicstaticvoid main(String[] args) {

  Context cx = Context.enter();

  try {

  Scriptable scope = cx.initStandardObjects();

  String str = "3/(1+2)";

  Object result = cx.evaluateString(scope, str, null, 1, null);

  System.out.println(str + "=" + Context.toNumber(result));

  } finally {

  Context.exit();

  }

  }

  }

  运行Java com.example.Test,输出结果如下:

  3/(1+2)=1.0

  之所以是1.0而不是1,是因为Context.toNumber(result)返回的类型为double。另一个值得注意的是,这里import的package属于JDK 6.0。因此,在不需要Rhino提供的js.jar,该程序仍能独立运行。

  虽然Rhino作为JavaScript运行时,功能非常强大,但在性能上却无法与其他的JavaScript运行时(比如Google Chrome的V8 JavaScript Engine)相提并论。值得注意的是,JRuby专家Charles Oliver Nutter也开始参与Rhino项目中,以提升Rhino JavaScript运行时的速度,进而实现与V8的竞争。而Oracle在对JVM上的JavaScript改进与优化,我们有理由期待,在未来,新一代JavaScript运行时Nashorn的速度将会得到极大的提升。

<!--EndFragment-->
分享到:
评论

相关推荐

    基于Matlab与Yalmip的多用户储能电站日前经济调度优化模型

    内容概要:本文详细介绍了利用Matlab及其Yalmip工具箱,结合Gurobi求解器,实现多用户(如工业园区内的多个工厂)储能电站的日前经济调度优化。主要内容涵盖模型建立、变量定义、目标函数设定、约束条件配置以及求解过程。文中通过具体的代码实例展示了如何根据分时电价和各用户的用电需求,制定最优的储能充放电计划,从而达到降低总体电费的目的。此外,还讨论了一些常见的实现细节和技术难点,如充放电效率的正确处理、初始荷电状态(SOC)的设定等。 适合人群:具有一定编程基础并对电力系统优化感兴趣的工程师或研究人员。 使用场景及目标:适用于希望减少电费支出并提高能源利用效率的企业或机构。通过学习本文提供的方法,能够掌握如何构建和求解类似的优化问题,进而应用于实际工程项目中。 其他说明:文中提到的技术手段不仅限于储能调度,还可以扩展到其他类型的资源分配问题。对于想要深入了解优化理论及其工程应用的人来说,这是一个很好的入门案例。

    OFDRserver.zip

    OFDR分布式传感python代码 包括激光器远程控制 数据解调 这个是一个基于 PC 端的 **OFDR 系统(Optical Frequency Domain Reflectometry,光学频域反射测量)服务端程序**,主要用于控制光纤分布式传感实验中的硬件设备、采集数据并进行初步处理。 以下是该仓库的主要内容与功能总结: --- ### **项目功能简介** 该项目是一个 PC 端服务程序,用于实现 **光纤频域反射测量(OFDR)系统** 的控制和数据采集功能。其核心用途包括: 1. **与实验设备通信**: - 控制波长扫描光源(如 Santec、Yokogawa 等); - 控制 DAQ(数据采集卡,如 Advantech PCIE-1840); - 通过串口与其他设备通信(如温控模块)。 2. **数据采集与同步控制**: - 启动光源扫描; - 通过触发机制同步采集数据; - 采样数据存储为二进制或文本格式,供后续分析。 3. **图形化界面(GUI)操作**: - 使用 Qt 框架实现基本的图形界面,支持设备配置、参数设置、采集控制等功能。 4. **数据处理与显示**: - 实现基本的 FFT 处理; - 可视化信号波形; - 有部分代码实现数据的预处理和拟合操作。 OFDR 光线分布式传感 光频域反射技术 python

    西门子S7-1200 PLC Modbus RTU控制步进电机的梯形图程序实现及调试技巧

    内容概要:本文详细介绍了使用西门子S7-1200 PLC及其485信号板通过Modbus RTU协议控制步进电机的方法。主要内容涵盖硬件配置、关键程序代码、数据处理方法以及常见的调试技巧。文中提供了具体的梯形图代码示例,如初始化Modbus主站、主站轮询、数据指针配置等,并针对实际应用中可能出现的问题给出了详细的解决办法,例如波特率和校验位的正确设置、数据传输时的字节交换处理、通信超时等问题。此外,还强调了硬件连接的重要性,如正确的485接线方式和终端电阻的使用。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要使用PLC进行设备控制并熟悉西门子博途软件平台的用户。 使用场景及目标:帮助读者掌握利用西门子S7-1200 PLC和Modbus RTU协议控制步进电机的具体实现步骤,提高系统的可靠性和稳定性。适用于工厂自动化生产线、机械设备控制等领域。 其他说明:文中提到的一些细节问题(如波特率的实际值、校验方式的选择等)对于初次接触此类项目的开发者来说非常有价值。同时,作者还分享了一些实用的小贴士,如使用抓包工具来辅助调试,这有助于加快项目进度并减少不必要的麻烦。

    3dmax插件A自动道路.ms

    3dmax插件

    ChromeSetup.exe

    gugeliulanqi

    121311-基于MATLAB的混沌序列图像加密程序.doc

    121311_基于MATLAB的混沌序列图像加密程序.doc

    3dmax插件026-摆瓦片.ms

    3dmax插件

    四相开关磁阻电机Maxwell+Simplorer联合仿真优化及波形分析

    内容概要:本文详细介绍了四相开关磁阻电机在Maxwell和Simplorer联合仿真中的优化技巧和波形分析方法。首先,在Maxwell中,绕组匝数设置避免使用整数,正确选择磁滞回线模型,确保材料定义无误。其次,在Simplorer中,精确设置PWM生成模块的角度区间触发逻辑,防止因不合理设置导致转矩抖动。文中还强调了联合仿真过程中需要重点关注的三个波形:相电流波形、转矩波形以及径向力波形,并提供了针对不同波形异常的具体解决方案。此外,文章分享了一些实用的仿真加速技巧,如调整仿真步长、手动设置气隙网格层数等。最后,通过实例展示了如何利用FFT分析转矩脉动,并提出了降低转矩脉动的有效措施。 适合人群:从事电机设计、电磁场仿真及相关领域的工程师和技术人员。 使用场景及目标:帮助用户掌握四相开关磁阻电机联合仿真的关键技术要点,提高仿真效率和准确性,减少实验成本,为实际产品开发提供理论支持和技术指导。 其他说明:文章不仅涵盖了详细的仿真步骤和技术细节,还包括了许多基于实践经验得出的小贴士,有助于读者更好地理解和应用相关知识。

    信捷PLC与触摸屏在伺服自立袋灌装旋盖设备中的自动化控制实现

    内容概要:本文详细介绍了基于信捷PLC和触摸屏的伺服自立袋灌装旋盖设备及其全自动转盘式整机程序实例。文章首先阐述了项目的背景与需求,强调了设备需要实现高效、精准的灌装和旋盖操作,并确保自动化运行。其次,详细描述了电气图的设计,涵盖PLC的输入输出连接、伺服驱动器与电机的连接、传感器的接入以及触摸屏与PLC的通讯线路等。然后,展示了信捷PLC程序的具体实现,包括梯形图语言编写的灌装量控制程序片段,解释了各个指令的功能和流程。接下来,讨论了触摸屏程序设计,描述了如何通过触摸屏进行参数设置和设备状态监控。最后,总结了整个系统的实现过程,强调了各个环节之间的紧密联系,确保设备的稳定、高效运行。 适合人群:从事自动化设备编程的技术人员,尤其是对PLC编程和触摸屏应用有一定基础的人群。 使用场景及目标:适用于需要开发或优化类似自动化设备的企业和技术团队,旨在提高设备的自动化程度和工作效率,减少人工干预,确保生产过程的稳定性和准确性。 其他说明:文中不仅提供了详细的程序代码和电路图,还分享了许多调试经验和实用技巧,有助于读者更好地理解和应用相关技术。

    蓝桥杯嵌入式全部各个模块程序(模块化编程-例程)

    模块化代码,多个工程

    1.6 技能提升:设计一份个人简历.rp

    1.6 技能提升:设计一份个人简历.rp

    VS2010旗舰版的VB.NET版本任意进制互相转换程序源代码QZQ.zip

    VS2010旗舰版的VB.NET版本任意进制互相转换程序源代码QZQ

    电力系统基于深度强化学习的微网储能系统控制策略研究:优化充放电降低购电成本(含详细可运行代码及解释)

    内容概要:本文深入研究了基于深度强化学习(DRL)的微网储能系统控制策略。首先介绍了微网系统的组成及其特性,重点探讨了光伏发电、储能系统和负荷系统的关键组件数学模型。接着详细描述了Simulink仿真设计实现,包括微网环境模拟类(MicrogridEnv)、双重深度Q网络(Double DQN)算法的实现以及训练过程。为了验证该方法的有效性,文章还进行了对比实验,分别测试了规则策略、传统优化方法和DDQN策略的表现。实验结果显示,DDQN策略在成本节约、SOC合规率等方面明显优于其他两种方法。最后,本文提出了创新点与贡献总结,包括仿真-学习一体化框架、改进的DRL算法以及多维度验证,并展望了后续研究方向如多时间尺度优化、多能源协同、不确定性处理等。 适用人群:从事电力系统、微网技术研究的专业人士,以及对深度强化学习应用于能源领域感兴趣的科研人员和工程师。 使用场景及目标:①掌握微网储能系统的基本构成与工作原理;②理解如何利用深度强化学习优化微网储能控制策略;③学习具体的算法实现细节,包括环境搭建、DDQN算法实现和训练流程;④对比不同控制策略的效果,评估DDQN策略的优势。 其他说明:本文不仅提供了理论分析和技术实现,还展示了详细的实验验证过程,通过具体的实验数据证明了所提方法的有效性。此外,文中提及的多种改进措施和技术细节对于实际工程项目具有重要的参考价值。阅读本文有助于读者全面了解微网储能控制领域的最新进展,为相关研究和技术开发提供有益的指导。

    NET_ORM框架_多数据库支持_复杂数据模型_自动数据库架_1744170807.zip

    NET_ORM框架_多数据库支持_复杂数据模型_自动数据库架_1744170807.zip

    3dmax插件CGOMax物体隔离显示.ms

    3dmax插件

    基于MATLAB/Simulink的V2G微电网24小时仿真:柴油机、风光发电与电动汽车协同调度

    内容概要:本文详细介绍了利用MATLAB/Simulink构建的一个24小时微电网仿真模型,涵盖了柴油机、光伏发电、风力发电和V2G(车辆到电网)四个主要组成部分。文中探讨了各个组件的工作原理及其相互之间的协作机制,特别是在应对功率波动时的表现。具体来说,柴油机作为基荷电源,通过精确的转速控制确保稳定的电力供应;光伏和风力发电则引入了随机性和不确定性因素,如天气突变和风速波动,增加了仿真的真实性;V2G部分展示了电动汽车如何根据电网需求进行智能充放电调度,尤其在应对突发情况时表现出色。此外,文章还提到了一些常见的仿真错误及解决方法,强调了参数设置的重要性。 适合人群:对微电网仿真、V2G技术和MATLAB/Simulink有一定兴趣的研究人员和技术爱好者。 使用场景及目标:适用于希望深入了解微电网内部运作机制的人士,尤其是那些想要研究不同类型能源如何协同工作的专业人士。通过本案例的学习,读者能够掌握如何构建复杂的电力系统仿真模型,并理解各种能量来源在实际应用中的行为特征。 其他说明:文中提供了大量具体的代码片段和参数配置建议,有助于读者更好地理解和复现实验结果。同时,作者分享了一些实践经验,如如何处理数据归一化、避免单位换算错误等,对于初学者非常有帮助。

    【嵌入式竞赛】蓝桥杯嵌入式客观题备考指南:知识点详解与答题技巧提升蓝桥杯嵌

    内容概要:本文详细介绍了蓝桥杯嵌入式比赛的背景、赛制、硬件平台及软件环境,并着重分析了嵌入式客观题的重要性、考试范围及重点内容。蓝桥杯嵌入式比赛采用封闭、限时的比赛方式,硬件平台为STM32G431RBT6,软件环境涉及STM32CubeMX和MDK535。客观题占总分的15%,虽占比不大但每分关键,能影响最终排名和选手心态。考试范围涵盖模电、数电、单片机及STM32数据手册,具体包括放大器、逻辑门电路、寄存器配置等内容。文中通过真题示例与解析,阐述了答题技巧,如先易后难、排除法、注意细节及利用数据手册。备考建议包括选择合适的教材、官方资料和在线课程,建立知识体系,理论与实践结合,总结归纳错题,并合理规划时间。; 适合人群:对嵌入式开发感兴趣并准备参加蓝桥杯嵌入式比赛的学生或爱好者。; 使用场景及目标:①帮助参赛者了解蓝桥杯嵌入式比赛的赛制和要求;②指导参赛者掌握客观题的答题技巧;③提供详细的备考建议,帮助参赛者系统学习和复习相关知识。; 其他说明:嵌入式开发是一门实践性很强的学科,本文强调理论与实践相结合的学习方法,鼓励参赛者通过实验加深理解。同时,合理的时间规划和错题总结有助于提升学习效果。最后,文章表达了对参赛者的祝福和支持,希望他们在比赛中取得优异成绩。

    生态环境物联网AI精细化监测监管系统.doc

    生态环境物联网AI精细化监测监管系统.doc

    WinCC报表零代码配置与优化:从日报到时段报表的全面解析

    内容概要:本文详细介绍了如何利用WinCC自带工具和控件实现零代码的报表生成功能,涵盖日报表、月报表及时段报表的配置方法。主要内容包括:使用WinCC Report Control控件生成日报表,通过VBS脚本处理累计值和差分计算,利用内置函数如DateSerial和TimeInfo处理特殊日期问题,以及通过动态配置和性能优化提高报表生成效率。此外,还提供了避坑指南,确保配置过程中少走弯路。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对WinCC报表功能有一定了解并希望进一步掌握零代码配置技巧的人群。 使用场景及目标:适用于需要定期生成生产报表的企业,帮助工程师快速高效地完成报表配置,减少对SQL和数据库的依赖,降低配置难度,提高工作效率。 其他说明:文中提供的代码片段和配置步骤经过多个WinCC版本测试,确保兼容性和稳定性。同时,强调了配置完成后进行模拟测试的重要性,以确保报表的正确性和完整性。

Global site tag (gtag.js) - Google Analytics