IO控制器

2024-07-09

IO控制器(共9篇)

IO控制器 篇1

1概述

仿生学是20世纪60年代出现的一门综台性边缘学科, 它由生命科学与工程技术科学相互渗透、相互结合而成。它在精密雷达、水中声纳、导弹制导等许多应用领域中都功不可没。

当代机器人研究的领域已经从结构环境下的定点作业中走出来, 向航空航天、星际探索、军事侦察攻击、水下地下管道、疾病检查青疗、抢险救灾等非结构环境下的自主作业方面发展。人们也把目光对准了生物界, 力求从丰富多彩的动植物身上获得灵感, 将它们的运动机理和行为方式运用到对机器人运动机理和控制的研究中。这就是仿生学在机器人科学中的应用, 这一应用已经成为机器人研究领域的热点之一, 势必推动机器人研究的蓬勃发展。

仿生机器人的移动方式有轮、腿、履带和无肢运动等。多足机器人的运动方式是典型的足肢运动。美国、日本、德国、英国、法国等国家都开展了多足机器人工作, 并研制出许多样机。国内, 上海交通大学、中国科学院、沈阳自动化所、国防科技大学等单位也相继研制出了多足机器人样机。如中科院沈阳自动化所研制成功水下的六足步行机, 清华大学开发出的DTWN框架式双三足不行机器人, 上海交通大学研制出的JTUWM系列四足行足机器人等。

文章就是对爬行类仿生机器人的研究, 通过对高性能IO模块的仿生机器人的研究设计, 最终实现通过上位机控制IO模块来实现使仿生机器人的运动的目标。文章先从理论方面分别介绍了仿生机器人的概念、高性能的IO模块、485串口通信、Modbus通讯协议以及仿生机器人的运动控制逻辑。

2系统的方法与理论

2.1仿生机器人

根据上述仿生机器人的定义, 我们将机器人设计成带有六足步行功能的蜘蛛型多足机器人, 此类机器人用途广泛, 灵活度高且更具代表性, 具备系统移植的条件。

正是因为仿生机器人的高度灵活性, 所以也就造成了仿生机器人结构的复杂性。为了完成复杂精准的控制动作, 需要多部件的共同作用。为了达到这样的效果, 我们需要使用能同时输出多路控制开关的串口通讯即485串口通信。

2.2 485串口通信

典型的串口通信标准是RS232和RS485, 它们定义了电压, 阻抗等, 但不对软件协议给予定义, 区别于RS232, RS485的特性包括:

(1) RS-485的电气特性:RS-485接口信号电平低, 不易损坏电器元件。

(2) RS-485的数据最高传输速率为10Mbps。

(3) RS-485接口是采用平衡驱动器和差分接收器的组合, 抗共模干扰能力增强, 即抗噪声干扰性好。

(4) RS-485接口拥有最远3000米的传输距离, 而且RS-485接口在总线上是允许连接多达128个收发器。

为了实现点对多的传输方式以及保证传输过程具有较强的抗干扰能力, 我们选用RS485串口通信。

2.3 Mod Bus通讯协议

Mod Bus网络是一个工业通信系统, 由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。Mod Bus网络只有一个主机, 所有通信都由他发出。网络可支持247个之多的远程从属控制器, 但实际所支持的从机数要由所用通信设备决定。

在Mod Bus系统中有2种传输模式可选择。这2种传输模式与从机PC通信的能力是同等的。选择时应视所用Mod Bus主机而定, 每个Mod Bus系统只能使用一种模式, 不允许2种模式混用。一种模式是ASCII (美国信息交换码) , 另一种模式是RTU (远程终端设备) 。

3系统的设计与实现

3.1场景描述

本系统所采用的机器人就是多足型的仿生机器人, 该机器人的足肢可以实现奇数足和偶数足的分开控制, 当奇数足运动时, 偶数组用于支撑躯体;同样, 当奇数足运动时, 偶数组用于支撑躯体。这样反复运动, 机器人就可以实现前后移动。该机器人足肢的往复运动不同与轮子或履带的旋转运动, 足肢的往复运动能更好地适应复杂的地形。而且, 多足肢共同运动也可避免单个足肢故障造成机器人不能运动的情况。

3.2硬件选型与实现

3.2.1硬件选型

高性能IO模块:为了达到多路控制开关同时输入同时输出, 选用腾控科技的STC系列高性能IO模块。该模块可同时输入输出多达16路。输入和输出模块分选用STC-101、STC-102。通讯协议采用适用于工业现场总线的modbus协议。该模块通过485串口通信与上位机连接。该模块的额定最大输入电压是220v, 与上位机传输的485接口有两路, 驱动电压是24V。该模块可是通过地址码进行区分, 如果使用485串口通信, 理论上最多可实现256个模块同时连接。

3.2.2硬件实现

线路连接如图1所示。

3.3软件实现

3.3.1 modbus通讯协议形成

modbus通讯协议由上位机软件实现, 首先根据命令要求确定命令代码、设备地址、寄存器起始地址、寄存器个数等息息, 将以上信息通过CRC校验算法生成CRC校验码。将上述信息与CRC校验码按通讯格式合并, 合并后通过485串口发给IO设备。设备接收到指令代码后会进行CRC校验, 只有校验成功才会执行该指令, 保证指令的完整性。IO设备执行完指令后还会返回给上位机一个指令, 表示执行完毕。流程图如图2所示

(1) Modbus传输模式

用户选择想要的模式, 包括串口通信参数 (波特率、校验方式等) , 在配置每个控制器的时候, 在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。所选的ASCII或RTU方式仅适用于标准的Modbus网络, 它定义了在这些网络上连续传输的消息段的每一位, 以及决定怎样将信息打包成消息域和如何解码。

ASCII可打印字符便于故障检测, 而且对于用高级语言 (如Fortran) 编程的主计算机及主PC很适宜。RTU则适用于机器语言编程的计算机和PC主机。因此, 该系统选用RTU传输模式。

(2) Modbus传输格式

上位机发送的指令:[设备地址][命令号01][起始寄存器地址高8位][低8位][读取的寄存器数高8位][低8位][CRC校验的低8位][CRC校验的高8位]

每一个括号内有两位十六进制数组成。

a.设备地址:在一个485总线上可以挂接多个设备, 此处的设备地址表示想和哪一个设备通讯。

b.命令号:不同的命令号执行不同的功能, 例如:读取数字量的命令号为01。

c.起始地址高8位、低8位:表示想读取的开关量的起始地址。每个设备都有自己的寄存器地址。

d.寄存器数高8位、低8位:表示从起始地址开始读多少个开关量, 与起始寄存器地址共同使用。

e.CRC校验:数据的最后一部分, 对前面的数据进行校验。此处需要注意, CRC校验在命令中的高低字节的顺序和其他的相反。

Modbus传输格式如图3所示。

(3) CRC校验码生成过程

CRC域是两个字节, 包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC, 并与接收到的CRC域中的值比较, 如果两值不同, 则有误。

CRC是先调入一值是全“1”的16位寄存器, 然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效, 起始位和停止位以及奇偶校验位均无效。

CRC产生过程中, 每个8位字符都单独和寄存器内容相或 (OR) , 结果向最低有效位方向移动, 最高有效位以0填充。LSB被提取出来检测, 如果LSB为1, 寄存器单独和预置的值或一下, 如果LSB为0, 则不进行。整个过程要重复8次。在最后一位 (第8位) 完成后, 下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值, 是消息中所有的字节都执行之后的CRC值。CRC校验过程如图4所示。

3.3.2运动控制及限位开关的设计实现

仿生机器人的运动过程是整个系统按照一定的控制逻辑运行的。将蜈蚣型仿生机器人的步足以左右分别划分为奇数足和偶数足, 左右奇数足为一组共同运动, 左右偶数足为另一组共同运动。蜈蚣型仿生机器人足步的前向运动行为周期仿生为抬起、前划、落下、后划四个行为动作;后向运动行为周期仿生为抬起、后划、落下、前划四个运动行为。抬起和落下为一个低速电机控制, 前划和后划为一个低速电机控制。运动过程如图5所示。

每只步足的前后上下设置一个金属触点用于读取步足当前的位置并实现限位开关的功能。当运动着的步足接触到某一位置的金属触点时, 由系统读取到该触点闭合, 并停止该动作驱的低速电机, 此动作完成, 系统进入下一运动周期。限位开关设计如图6所示。

4系统的试验与稳定性验证

4.1系统功能简介

上位机用户界面如图7所示, 该界面可用于控制仿生机器人的运动并实时显示。当点击前进按钮时, 机器人向前行走:当奇数足运动时, 奇数足显示为绿色, 如图8所示;当偶数足运动时, 偶数足显示为红色, 如图9所示。后退时实时显示相同。按下暂停按钮时, 机器人属于暂停状态, 所有足肢显示为黑色, 如图7所示。

4.2试验场景设定

本系统适用于对多足机器人的运动控制, 试验场景设定为控制蜈蚣型仿生机器人在路面行走。实现该种机器人的前进、后退等运动行为。该型机器人可适用于多种路面状况, 对环境有较强的适应性。尤其是在一些常规机器人和大型机器人达不到的复杂场景中, 该种机器人可以自如的穿梭。

在现实场景中, 该控制系统还可适配多种具有开关量的复杂仿生机器人, 实现对该类型的运动控制。如蛇形机器人, 鱼形机器人等。适配该系统时, 只需要将IO模块的输出线缆连接至机器人的驱动开关处, 并适配好正确的驱动电源, 即可使用该系统控制一些仿生机器人。

4.3功能稳定性验证

在多次测试实验的过程中, 该系统并没有出现故障, 多次对控制机器人运动的开关量进行的开闭动作准确及时, 能够正确完成前进、后退等动作。因此, 经多次测试验证证明该系统实现控制功能的成功率高, 故障率低, 能够完成具有一定要求的仿生机器人的控制任务。准确率高达99%。实验数据如图10所示。

5结束语

文章针对控制软件和仿生机器人的接口控制方案, 提出了基于485串口和Modubus通讯协议的控制方案, 设计了通信协议, 并基于软件仿真验证了控制软件的有效性。硬件部分用到了高性能IO模块、485串口、简易限位开关;软件部分主要应用到了CRC校验、Modbus通讯协议、配合限位开关的软件部分。

在以后的研究中可以针对仿生机器人的多种运动方式进行进一步的研究, 如蛇形机器人的爬行, 昆虫机器人的飞行以及运动方向的灵活性。

参考文献

[1]庄红超, 高海波, 邓宗全, 等.电驱动重载六足机器人关节转速分析方法[J].机械工程学报, 2013, 49 (23) :44-52.

[2]许宏岩, 付宜利, 王树国, 等.仿生机器人的研究[J].机器人, 2004, 3:283-288.

[3]吉爱红, 戴振东, 周来水.仿生机器人的研究进展[J].机器人, 2005, 3:284-288.

[4]迟冬祥, 颜国正.仿生机器人的研究状况及其未来发展[J].机器人, 2001, 5:476-480.

[5]宋红生, 王东署.仿生机器人研究进展综述[J].机床与液压, 2012, 13:179-183+139.

[6]陈甫.六足仿生机器人的研制及其运动规划研究[D].哈尔滨工业大学, 2009.

[7]戴伟琛, 赖舜生, 秦松林, 等.蜈蚣机器人创新项目培养学生综合科研能力[J].上海工程技术大学教育研究, 2012, 2:41-42+50.

IO控制器 篇2

引起的分区错误。单击右键属性看到的是RAW格式。移动硬盘的话,很大程度是因为摔碰。强拔之类的操作,也可能是坏道。病毒,硬盘本身质量问题引起的。经常会因为系统读取移动硬盘信息困难,只能读取一部分,而且无法打开。有时候会引起系统假死,卡机。

有数据的话,一定不要重分区,格式化之类的操作。那样的话恢复的数据不完整。保持现状。正确的分析处理很大程度上是可以完整的恢复出原来的数据的。而不需要数据恢复软件扫描恢复。单纯使用数据恢复软件扫描恢复的话,耗时,效果也很难说。很多时候都是100%完整恢复原来的分区,这些分区的数据出现这种问题的关键是要保护好出现问题的.硬盘状态。

如果要自己尝试恢复,参考使用数据恢复软件扫描恢复,记住不要对出现问题的硬盘写入找到的文件。而应该把找到的数据先恢复到别的硬盘上。确定正确后再处理出现问题的分区。换台电脑插这硬盘进去,把里面的资料拷出来。

远程IO数据采集器的开发 篇3

在复杂的工业现场环境中,存在着许多干扰信号,各种干扰信号都具有一定的随机性和不确定性。可能会造成逻辑混乱,系统控制失灵,产生误动作,甚至造成生产设备损坏和人身伤害等。严重影响了工业生产的稳定运行和可靠性,影响了产品的质量和生产效率,因此,有效地排除和抑制各种干扰,是现代工业必须深入探讨和急待解决的问题。

另外,在工业现场中,常常遇到被控对象和被测信号分布在各个不同的地方,并且他们与控制站之间也有相当长的距离,连接的信号线和控制线都比较长。一方面存在着导线用量大、接线复杂、故障率高、安装工期长、维修困难等问题。另一方面,过长而且又多的导线在一起很容易产生电感电容耦合,而产生干扰信号,严重影响生产的稳定运行,值得探索相应的措施来解决。

现场总线控制是当今工业控制的潮流,现场总线技术的应用能有效地解决一些实际问题。然而,对于一些中小型设备的改造或者对现有的一些老设备大修改造时,原来的PLC系统还完好,如果改为现场总线控制就会造成很多不必要的浪费。并且,工业现场的一些机械控制对实时性和可靠性的要求也越来越高。那么就需要有更简单方便的方法来解决这类实际问题。

例如在电镀线行车的控制中,以前是把行车上的接近开关、按钮、限位开关直接连到PLC的输入端,行车拖带着很多导线,各种干扰使行车无法正常运行,按照传统的方法,采用电阻电容进行滤波,其效果并不显著,而且还影响了响应的时间。使行车定位不准,对偶尔出现的大的干扰信号无法过滤掉。由于行车拖带的导线长(可达100多m)而多,长时间很容易使导线折断,更换导线也非常困难,而且还产生干扰信号。这些现实问题的存在,必须进行深入探讨,寻找出有效的解决方案。

针对上述工业现场的各种干扰问题、大量复杂的配线带来的一系列问题,以及过滤器的失灵等实际问题,研制开发了远程IO信号采集器(本文简称采集器)。

2 采集器的系统组成和工作原理

所谓采集器是将输入口的位信号以数字形式通过现场总线传递给输出口的一种装置。采集器也是一种形式的总线,它有更好的实时性,而且简单方便。

2.1 系统的组成

采集器系统的组成框图见图1。

通过采集器将现场信号传递给PLC,既保证了集中控制,又保证了长距离信号传输的可靠性。采集器最多可代3个扩展,可传送64位。

采集器设有主机和扩展单元。

主机有3种型号:M01-OC 16点继电器输出,M01-OD 16点晶体管输出,M01-ID 16点晶体管双向输入bilateral。

扩展3种型号:E01-OD 16点晶体管输出,E01-OC 16点继电器输出,E01-ID 16点晶体管双向输入。

其中M01-OC 16点继电器输出主机,可以和16点输入的任意一款集线器相配合。也可单独做为总线式远程IO。M01-OC 16点继电器输出主机,可以和16点输入的任意一款集线器相配合。也可单独做为总线式远程IO。

2.2 工作原理

远程IO信号采集器是采用RS485总线的方式进行通讯,标准帧格式和CRC校验。波特率采用115.2 kb/s。一组采集器最多可传送64位,采集器如果在100 ms内没有进行有效应答则会将所有输出口置零,利用这个特点可对采集器的工作情况进行监视,使上位机做出相应的保护措施。

3 采集器的功能特点

1)点对点的通讯方式,提高了系统运行的可靠性。网络控制存在着单点故障容易扩散的问题,进而造成整个网络系统瘫痪的弊端,采集器采用了点对点的通讯方式,能够有效地克服单点故障殃及周围的问题,使系统运行更加安全可靠。

2)使用方便,便于安装。无须用户做任何编程工作,只需将采集器当作接线端子即可。使用方便,易于安装和掌握。

3)速度快,可靠性高,实时性好。采集器是采用专线专用方式配线,无站号分配。所以速度快,可靠性高,实时性好,安全性高。

4)接线简单、成本低。采集器仅用2根导线就可以取代原有的远距离的诸多繁杂接线,既降低了安装成本、又减少了安装工期,使安装接线更加容易,降低了故障率。

5)监视功能强、维修方便。每组采集器的状态都有相应的指示灯,运行状态一目了然,具有监视功能强、便于故障诊断、维修极为方便的特点。

6)配置灵活,通用性强。根据生产要求,选择的系统配置各不相同,然而,采集器能够和任何一种PLC配合使用,可以灵活配置,具有通用性强的特点。

7)抗干扰能力强。采集器采用了差分输入方式,工业信号实现现场采集数字传送时,采集器能有效地防止信号在传输过程中受到的各种干扰,具有较强的抗干扰能力。

8)取代了原来的过滤器,节省了大量的导线,减少了干扰信号,提高了抗干扰能力。

4 效果验证

以采集器在电镀生产线上的应用为例。电镀生产线上通常有2个至5个行车运行,其中一台行车的控制大约需要6个接近开关、5个限位开关等控制元件,控制线和电机的驱动线共用16棵线走在同一个扁平电缆内,电缆长度约100余m,对2个以上行车的控制就需要几十个开关控制,控制线和电机驱动线就更多,诸多的电缆线在系统运行时必然产生一定的电磁干扰。另一方面,行车的行走是采用变频器来控制的,变频器是将固定频率的交流电变换为频率连续可调的交流电的装置[3],当变频调速系统的容量足够大时,所产生的高频信号将足以对周围各种电子设备的工作形成干扰,影响周围设备正常工作,为了避免控制信号、变频器等带来的各种干扰,传统的方法是采用PLC现场信号过滤器来抑制干扰,现场信号过滤器主要是阻容吸收电路,电容小了过滤效果不好,电容太大又会影响响应时间,并且电网的波动有时也会造成过滤器失灵,使得行车常常发生定位不准,误动作等故障,严重影响了生产效率和产品质量。

电镀线对行车的基本要求是:行走速度快,定位准确,行走时平稳性能好。

采用远程IO信号采集器取代现场信号过滤器后,充分体现了其优越性:

1)由于采集器是采用点对点的通讯方式,所以具有更好的速度性和可靠性。有效地解决了变频器对控制信号的干扰问题,消除了误动作,提高了系统运行的可靠性;

2)用传统的现场信号过滤器时,行车计位用接近开关的检测距离是20 mm,采用采集器时,行车计位用接近开关的检测距离是10 mm,检测距离提高了一倍,从而提高了器件的响应时间,大大提高了行车的运行速度和行车的定位精度,解决了现场信号过滤器响应时间慢使定位不准确的问题;

3)取代了原来的现场信号过滤器,增强了抗干扰能力,还将原来的几十根导线减少为2根线,大大减少了导线用量,进而减少了由于导线折断等因素而引起的故障,既降低了成本,又提高了生产效率和系统运行的可靠性;

4)采用采集器配线少,安装简单,减少了安装周期;

5)采集器上具有相应的状态指示灯,使运行状态一目了然,便于故障诊断,给维修带来了极大的方便。

行车控制的原理图见图2。

系统的开关量接在采集器主机的输入单元,主机的输入单元安装在现场,主机的输出单元安装在控制柜里,取代了原来的过滤器,也取消了原来在现场和控制柜之间连接的大量导线,输入单元与输出单元之间只需两屏蔽线,大大减少了导线的根数。使接线和维护变得极为简单。经过1 a多现场使用证明,其可靠性大大高于原来的方法,1 a多来,行车运行稳定,从未出现过现场信号干扰等因素带来的错误动作。

5 结论

通过生产实际的验证,应用采集器能够有效地抑制复杂工业现场中的各种干扰信号,实现了系统的安全稳定运行,克服了网络控制单点故障容易扩散的弊端,解决了原来采用过滤器的不足,并且,对生产线的改造耗时少,费用低,安装接线简单,系统运行安全可靠,故障显示一目了然,维修方便,给用户带来了极大的方便和良好的效益。

摘要:针对工业现场中各种干扰信号对生产的严重影响和工程安装中的接线复杂问题,研制开发了远程IO数据采集器,通过大量的试验证明,远程IO数据采集器能有效地抑制现场的信号干扰,由于采用了点对点的通讯方式,使系统运行具有良好的可靠性和实时性。并且仅用两根导线就能取代原有的繁杂接线问题,使安装变得简单方便。

关键词:抗干扰,远程,点对点

参考文献

[1]刘高鏁.单片机实用技术[M].北京:清华大学出版社,2004.

[2]陶权.探析自动化控制系统的抗干扰设计[J].制造业自动化,2012,34(2):132-134.

JAVA,IO流学习总结 篇4

一、什么是流?

流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流,流机制是java及c++中的一个重要机制,通过流我们可以自由地控制文件、内存、io设备等数据的流向。而io流就是用于处理设备上的数据,如:硬盘、内存、键盘录入等。io流根据处理类型的不同可分为字节流和字符流,根据流向的不同可分为输入流和输出流。

二、字节流和字符流的区别:字符流,因为文件编码的不同,就有了对字符进行高效操作的字符流对象,它的原理就是基于字节流读取字节时去查了指定的码表。它和字节流的区别有两点:1.在读取数据的时候,字节流读到一个字节就返回一个字节,字符流使用了字节流读到一个或多个字节(一个中文对应的字节数是两个,在utf-8码表中是3个字节)时,先去查指定的编码表,再将查到的字符返回;2.字节流可以处理所有类型的数据,如jpg、avi、mp3、wav等等,而字符流只能处理字符数据。所以可以根据处理的文件不同考虑使用字节流还是字符流,如果是纯文本数据可以优先考虑字符流,否则使用字节流。

三、io体系,所具备的基本功能就是读和写: 1.字符流

|--reader(读)|--writer(写)reader |--inputstreamreader |--filereader:用于处理文件的字符读取流对象 writer |--outputstreamwriter |--filewriter:用于处理文件的字符写入流对象

其实很容易就可以看出来,io体系中的子类名后缀绝大部分是父类名称,而前缀则是体现子类特有功能的名称。reader中常见的方法: |--int read()读取一个字符,并返回读到的这个字符,读到流的末尾则返回-1。|--int read(char[])将读到的字符存入指定的数组中,返回的是读到的字符个数,读到流的末尾则返回-1。|--close()读取字符其实用的是window系统的功能,就希望使用完毕后,进行资源的释放。filereader除了自己的构造函数外没有特有的方法: |--用于读取文本文件的流对象。

|--用于关联文本文件。在读取流对象初始化时,必须要指定一个被读取的文件,如果该文件不存在则会发生filenotfoundexception异常。writer中常见的方法: |--write()将一个字符写入到流中。|--write(char[])将一个字符数组写入到流中。|--writer(string)将一个字符写入到流中。|--flush()刷新流,将流中的数据刷新到目的地中,流还存在。|--close()关闭资源,在关闭钱会先调用flush(),刷新流中的数据到目的地。filewriter,除了自己的构造函数外没有特有的方法: |--该类的特点

|--用于处理文本文件 |--没有默认的编码表 |--有临时缓冲

|--构造函数,在写入流对象初始化时,必须要有一个存储数据的目的地。|--filewriter(string filename),该构造器是干什么用的呢? |--调用系统资源

|--在指定位置创建一个文件,如果该文件已经存在则被覆盖。

|--filewriter(string filename,boolean append),这构造器的作用是当传入的boolean类型的值为true时,会在指定文件末尾处进行数据的续写。

清单1,将文本数据保存到文件中代码 private static void test1(){filewriter fw=null;//初始化filewriter对象,指定文件名已经存储路径 fw=new filewriter(d:/test.txt);fw.write(将字符串写入流);//将流中的数据刷新到目的地,流还在 fw.flush();fw.write(将字符串写入流);} catch(ioexception e){ e.printstacktrace();}finally{ if(fw!=null){ try {fw.close();} catch(ioexception e1){e1.printstacktrace();}}} } 清单2,读取一个已有文本文件,并将文本内容打印出来代码 private static void test2(){filereader fr=null;try { //初始化filereader对象,指定文件路径 fr=new filereader(d:/test.txt);int ch=0;while((ch=fr.read())!=-1){ //每次读取一个字符,直到读到末尾-1为止 system.out.println((char)ch);} catch(ioexception e){ e.printstacktrace();}finally{ if(fr!=null){ try {fr.close();} catch(ioexception e1){e1.printstacktrace();}}} } 这样每读到一个字符就打印出来,效率很不高,能不能按指定大小读取完后再打印出来呢?答案是当然可以的。

清单3,读取一个已有文本文件,读完1kb再将其读到的内容打印出来代码 private static void test3(){filereader fr=null;try { //初始化filereader对象,指定文件路径 fr=new filereader(d:/test.txt);char[] buf=new char[1024];int len=0;while((len=fr.read(buf))!=-1){ //每次读取1kb大小的字符,直到读到末尾-1为止

system.out.println(new string(buf,0,len));}} catch(ioexception e){篇二:java io流学习总结 java流操作有关的类或接口:

java流类图结构:流的概念和作用

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。io流的分类

? 根据处理数据类型的不同分为:字符流和字节流 ? 根据数据流向不同分为:输入流和输出流

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

? 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射 字符,一次可能读多个字节。

? 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处 理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。java io流对象

1.输入字节流inputstreamio 中输入字节流的继承图可见上图,可以看出: 1.inputstream 是所有的输入字节流的父类,它是一个抽象类。

2.bytearrayinputstream、stringbufferinputstream、fileinputstream 是三种基本的介质

流,它们分别从byte 数组、stringbuffer、和本地文件中读取数据。pipedinputstream 是从与其它线程共用的管道中读取数据,与piped 相关的知识后续单独介绍。3.objectinputstream 和所有filterinputstream 的子类都是装饰流(装饰器模式的主角)。2.输出字节流outputstream io 中输出字节流的继承图可见上图,可以看出:

1.outputstream 是所有的输出字节流的父类,它是一个抽象类。2.bytearrayoutputstream、fileoutputstream 是两种基本的介质流,它们分别向byte 数 组、和本地文件中写入数据。pipedoutputstream 是向与其它线程共用的管道中写入数据,3.objectoutputstream 和所有filteroutputstream 的子类都是装饰流。3.字节流的输入与输出的对应

图中蓝色的为主要的对应部分,红色的部分就是不对应部分。紫色的虚线部分代表这些流一般要搭配使用。从上面的图中可以看出java io 中的字节流是极其对称的。“存在及合理”我们看看这些字节流中不太对称的几个类吧!

1.linenumberinputstream 主要完成从流中读取数据时,会得到相应的行号,至于什么 时候分行、在哪里分行是由改类主动确定的,并不是在原始中有这样一个行号。在输出部分没有对应的部分,我们完全可以自己建立一个linenumberoutputstream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号,看起来也是可以的。好像更不入流了。

2.pushbackinputstream 的功能是查看最后一个字节,不满意就放入缓冲区。主要用在 编译器的语法、词法分析部分。输出部分的bufferedoutputstream 几乎实现相近的功能。3.stringbufferinputstream 已经被deprecated,本身就不应该出现在inputstream 部分,主要因为string 应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容而已。

4.sequenceinputstream 可以认为是一个工具类,将两个或者多个输入流当成一个输入 流依次读取。完全可以从io 包中去除,还完全不影响io 包的结构,却让其更“纯洁”――纯洁的decorator 模式。

5.printstream 也可以认为是一个辅助工具。主要可以向其他输出流,或者

fileinputstream 写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。一样可以踢出io 包!system.out 和system.out 就是printstream 的实例!4.字符输入流reader在上面的继承关系图中可以看出: 1.reader 是所有的输入字符流的父类,它是一个抽象类。

2.charreader、stringreader 是两种基本的介质流,它们分别将char 数组、string中 读取数据。pipedreader 是从与其它线程共用的管道中读取数据。

3.bufferedreader 很明显就是一个装饰器,它和其子类负责装饰其它reader 对象。4.filterreader 是所有自定义具体装饰流的父类,其子类pushbackreader 对reader 对 象进行装饰,会增加一个行号。

5.inputstreamreader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。filereader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将fileinputstream 转变为reader 的方法。我们可以从这个类中得到一定的技巧。reader 中各个类的用途和使用方法基本和inputstream 中的类使用一致。后面会有reader 与inputstream 的对应关系。5.字符输出流writer 在上面的关系图中可以看出:

1.writer 是所有的输出字符流的父类,它是一个抽象类。2.chararraywriter、stringwriter 是两种基本的介质流,它们分别向char 数组、string 中写入数据。pipedwriter 是向与其它线程共用的管道中写入数据,3.bufferedwriter 是一个装饰器为writer 提供缓冲功能。

4.printwriter 和printstream 极其类似,功能和使用也非常相似。5.outputstreamwriter 是outputstream 到writer 转换的桥梁,它的子类filewriter 其 实就是一个实现此功能的具体类(具体可以研究一sourcecode)。功能和使用和outputstream 极其类似,后面会有它们的对应图。6.字符流的输入与输出的对应 7.字符流与字节流转换 转换流的特点:

1.其是字符流和字节流之间的桥梁

2.可对读取到的字节数据经过指定编码转换成字符 3.可对读取到的字符数据经过指定编码转换成字节 何时使用转换流?

1.当字节和字符之间有转换动作时; 2.流操作的数据需要编码或解码时。具体的对象体现:

1.inputstreamreader:字节到字符的桥梁 2.outputstreamwriter:字符到字节的桥梁

这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。8.file类

file类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。file类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。篇三:java io流学习总结 java流操作有关的类或接口:

java流类图结构:流的概念和作用

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。io流的分类

根据处理数据类型的不同分为:字符流和字节流 ? 根据数据流向不同分为:输入流和输出流 ? 字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

? 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。? 结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。

输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。java io流对象

1.输入字节流inputstreamio 中输入字节流的继承图可见上图,可以看出: 1.inputstream 是所有的输入字节流的父类,它是一个抽象类。

2.bytearrayinputstream、stringbufferinputstream、fileinputstream 是三种基本的介质流,它们分别从byte 数组、stringbuffer、和本地文件中读取数据。pipedinputstream 是从与其它线程共用的管道中读取数据,与piped 相关的知识后续单独介绍。3.objectinputstream 和所有filterinputstream 的子类都是装饰流(装饰器模式的主角)。2.输出字节流outputstream io 中输出字节流的继承图可见上图,可以看出:

1.outputstream 是所有的输出字节流的父类,它是一个抽象类。2.bytearrayoutputstream、fileoutputstream 是两种基本的介质流,它们分别向byte 数组、和本地文件中写入数据。pipedoutputstream 是向与其它线程共用的管道中写入数据,3.objectoutputstream 和所有filteroutputstream 的子类都是装饰流。3.字节流的输入与输出的对应

图中蓝色的为主要的对应部分,红色的部分就是不对应部分。紫色的虚线部分代表这些流一般要搭配使用。从上面的图中可以看出java io 中的字节流是极其对称的。“存在及合理”我们看看这些字节流中不太对称的几个类吧!1.linenumberinputstream 主要完成从流中读取数据时,会得到相应的行号,至于什么时候分行、在哪里分行是由改类主动确定的,并不是在原始中有这样一个行号。在输出部分没有对应的部 分,我们完全可以自己建立一个linenumberoutputstream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行 号,看起来也是可以的。好像更不入流了。2.pushbackinputstream 的功能是查看最后一个字节,不满意就放入缓冲区。主要用在编译器的语法、词法分析部分。输出部分的

bufferedoutputstream 几乎实现相近的功能。3.stringbufferinputstream 已经被deprecated,本身就不应该出现在inputstream 部分,主要因为string 应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容而已。4.sequenceinputstream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从io 包中去除,还完全不影响io 包的结构,却让其更“纯洁”――纯洁的decorator 模式。5.printstream 也可以认为是一个辅助工具。主要可以向其他输出流,或者fileinputstream 写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。一样可以踢出io 包!system.out 和system.out 就是printstream 的实例!4.字符输入流reader 在上面的继承关系图中可以看出:

1.reader 是所有的输入字符流的父类,它是一个抽象类。

2.charreader、stringreader 是两种基本的介质流,它们分别将char 数组、string中读取数据。pipedreader 是从与其它线程共用的管道中读取数据。

3.bufferedreader 很明显就是一个装饰器,它和其子类负责装饰其它reader 对象。4.filterreader 是所有自定义具体装饰流的父类,其子类pushbackreader 对reader 对象进行装饰,会增加一个行号。

5.inputstreamreader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。filereader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将fileinputstream 转变为reader 的方法。我们可以从这个类中得到一定的技巧。reader 中各个类的用途和使用方法基本和inputstream 中的类使用一致。后面会有reader 与inputstream 的对应关系。5.字符输出流writer 在上面的关系图中可以看出:

1.writer 是所有的输出字符流的父类,它是一个抽象类。2.chararraywriter、stringwriter 是两种基本的介质流,它们分别向char 数组、string 中写入数据。pipedwriter 是向与其它线程共用的管道中写入数据,3.bufferedwriter 是一个装饰器为writer 提供缓冲功能。

IO控制器 篇5

RNC是多板卡组成的多处理机系统, 其内部的IO通信机制是RNC高效运作的基础, 因此, 必须确保RNC系统中高流量的IO消息能够稳定可靠地传输和运行。对于IO通信机制, 所谓的安全稳定性就要求通信连接的可持续性和消息传送的高成功性。

但是, 对于传统的网络设计和板卡设计来说, 一旦遇到硬件故障或者软件故障, 往往造成通信瞬时中断, 而且恢复性措施耗时长, 很难保证IO通信的接续性和成功性。本文基于这些因素, 提出IO通信机制的优化措施, 加强通信连接的接续性和消息传送的可靠性, 并基于该优化策略实现IO通信机制的共通性。

1 优化IO通信机制的设计与实现

1.1 MAC地址和IP地址的优化设置

在建立RNC板卡间的TCP连接之前, 首先我们来讨论板卡的MAC地址和IP地址的优化设置规则。

数据链路层使用的MAC地址是统一设置的, MAC地址中应该包含主备网络信息。

DHCP协议是动态主机配置协议, 大部分操作系统的内核都集成了该协议。

接着, 我们来讨论如何利用DHCP协议来优化配置IP地址, 以增加IP地址的可解析性。

众所周知, 32位的IP地址由4段8比特十进制地址组成, 记为“a.b.c.d”。RNC内部的IP地址分配一般采用DHCP协议。为了增强IP地址的可解析性, 我们可以根据RNC的网络特点来定制DHCP用法。

比如, 我们可以人为地设置“a”段信息, 该信息可以存储在RNC内部一块特殊的板卡上, 该板卡通常被叫做操作管理板卡 (O&Mprocessor) , 我们把这块板卡作为DHCP服务器端, 其他板则作为DHCP客户端。在系统或板卡启动时, 通过DHCP协议, 客户端向服务器端发起请求, 从服务器端获取IP地址的“a”段信息。而“b.c.d”段的信息则由板卡所处的物理槽位确定, 通过操作系统的接口函数可以直接获取物理信息。

嵌入式操作系统拥有ARP (Address Resolution Protocol地址解析协议) 协议的功能, 我们可以使用ARP表来管理MAC地址和IP地址, 它提供两者间的相互转换, 以确保数据信息准确无误地到达目的地。

1.2 逻辑地址的定义

IP地址和逻辑地址也是一一对应的, 我们可以建立一张表来管理这两者的对应关系, IO通信模块负责维护这张对应表, 当主备板发生切换时, 逻辑地址随之切换, 而IP地址保持不变, 因此需要相应地更新IP地址和逻辑地址的匹配关系表。

1.3 TCP连接的实现

下面我们来讨论TCP连接设计的几个关键技术。

(1) TCP连接数目的确定。TCP连接是点对点的连接, 我们考虑与RNC内所有的板卡都建立TCP连接, 因为每一块板卡都可能和其他任何板卡通信。同时如果考虑到主用和备用的两套网络, 则需要建立的TCP连接总数采取如下算法。

TCP连接的数目= (RNC内板卡总数-1) *网络数目

减去1, 意味着不需要和自身板卡建立连接。在我们讨论的主备用网络系统中, “网络数目”等于2。

(2) 创建通信任务和TCP连接。通信任务有三种, server task (服务端任务) , client task (客户端任务) 和socket task (套接字任务) 。为了建立板卡之间的TCP连接, 我们需要在每一块板卡上建立server task和client task。TCP连接建立之后, 为每一个连接创建一个socket task, 由socket task负责IO通信。

R N C内部的网络采取主用和备用配置, 这样我们可以为每块板卡建立两个server task, 分别对应主用网络端口和备用网络端口, server task用于接收client task的TCP连接建立请求。

Client task有很多定义方法, 我们可以结合RNC的硬件特点来设计, 根据RNC配置的机框数目来确定client task的数量。在建立了server task和client task后, 就可以开始建立TCP连接了。我们把物理槽位编号较小的板卡作为服务器端, 反之, 物理槽位编号大的为客户端。物理槽位有三部分信息组成:机架号, 机框号, 槽位号, 可以定义一个16比特的数据来表示, 如图1所示。

根据上述定义规则, 由client task向相应板卡的server task发起连接请求, 建立T C P连接后, 为每个T C P连接创建一个socket task。所建立的TCP连接总数, 等于所创建的socket task总数, 每一个socket task用于监视相对应的TCP连接, 实现IO消息的收发机制。

1.4 I O消息收发机制的优化实现

建立TCP连接之后, 就可以开始执行IO消息通信了。IO消息的优化收发机制描述如下。

(1) 首先上层模块发送消息给IO通信模块, 该消息指定了目标板卡的逻辑地址。

(2) IO通信模块的消息接收任务把这个新的消息通知给消息发送任务。

(3) 消息发送任务再把该消息送到消息队列中, 同时使用管道pipe方式通知套接字任务。

(4) 套接字任务总是处于等待状态 (使用select功能) , 接受消息发送任务的管道通知。

(5) 监测到管道通知后, 套接字任务从消息队列中读取消息, 送到IO bus上。

(6) 通过select功能, 目标板卡上的套接字任务可以检测到来自IO bus上的消息然后读取。

(7) 目标板卡上的套接字任务把刚刚收到的消息插入到消息队列中。

(8) 目标板卡上的消息接受任务使用OS的接受函数msgQReceive () 来收取消息队列中的消息。

(9) 最后, 消息接受任务把消息分发给目标任务 (应用层, 平台层或固件层) 。

1.5 主备用优化机制的实现

本章节我们来讨论在IO通信过程中如何实现主备用切换机制, 优化IO通信功能。

1.5.1 主备用板卡切换

在该切换处理处理流程中, 特别指出以下几个关键技术。

(1) 在切换期间, IO控制模块需要负责控制IO流, 建立缓冲机制, 以防止消息丢失。

(2) 需注意合理设置消息队列的大小以免消息队列溢出, 特别要注意主备用板切换所消耗的时间大小, 切换速度越快, 所需要消息队列的size就越小。

(3) 同时可以在发起消息的板卡上设置监视时钟, 如果在规定的时间内主备用板切换还未完成, 就放弃消息队列中所有的目标消息, 以免造成垃圾消息长时间占用队列空间。

(4) 当备用板卡成功地切换为主用板卡后, 上层模块将通知IO通信模块, 之后由其发出广播消息, 通知其他所有的板卡切换结束。这样其他板卡就开始检查缓冲队列中是否存在发送给目标板卡的IO消息, 如果存在, 则把这些消息发送给目标板卡, 此时的目标板卡是刚刚从备用状态切换到主用状态的板卡, 但是对于发起消息的板卡来说, 它只关心目标板卡的逻辑地址, 它总是把消息发送给主用逻辑地址所对应的目标板卡。这正是逻辑地址设计思想的优点加强了IO处理的共通性。

前面已经提到, 主用板和备用板发生切换时, 逻辑地址也随之切换, 但是IP地址不切换, 这样IO通信模块就需要更新IP地址和逻辑地址的匹配表。在发送IO消息时根据逻辑地址, 选择可用的主用板卡。

根据上面的设计思想, 我们就可以设计出相应的软件算法来维护IP地址和逻辑地址的匹配表, 选择正确的目标板卡, 从而加强了IO通信机制的共通性, 透明性, 以及可持续性。

1.5.2 主备用网络的选择

本章节我们来讨论如何通过主备用网络机制来保障IO通信的可持续性, 结合图2进行阐述。在IO通信模块发送IO消息之前, TCP连接状态的检查是必需的。由于RNC内部有两套网络, 因此从消息的发起板卡到消息的目标板卡存在两条可行的线路, 这两个TCP连接线路分别位于主备用网络中, 在发送IO消息之前, 我们需要选择一个可行的线路, 以确保IO消息成功到达目的地。其选择机制流程如下: (1) 检查主用网络上的TCP连接, 如果正常, 则选择该连接, 然后退出该流程;否则继续下面的步骤。 (2) 检查备用网络上的TCP连接, 如果正常, 则选择该连接, 然后退出该流程;否则继续下面的步骤。 (3) 如果主备网络上的TCP连接都不正常, 则把消息放入缓冲队列, 同时启动监视时钟。 (4) 如果在监视时钟超时之前, TCP连接恢复正常, 则重新发送IO消息到目标板卡, 否则放弃该消息。此时说明目标板卡或者发端板卡遇到某种问题, 那么RNC内部的状态监视系统将会监测到该问题, 并做出相应的动作, 以自动恢复该问题板卡, 使该板卡重新恢复到服务状态, 比如, 触发状态告警, 触发板卡重启动等等。

根据上面思想, 我们就可以设计出相应软件算法来选择可行的网络连接从而提高IO通信的可持续性。

2 结语

随着3G的全球化, 3G产品已经被普遍使用。本文所讨论的IO通信优化机制已经被多家开发商所采用, 比如Evolium 3G RNC项目, 其先后推出的R4和R5两个新版本均采用了本文所讨论的IO通信优化机制并且在多个国家的现用局上线使用, 包含法国, 德国, 意大利, 土耳其, 卡塔尔和马来西亚等国家。

目前, 很多开发商所已经开始研究和使用扩展操作系统方案, 除了Evolium 3G RNC, 日本最大移动通信运营商DoCoMo公司相关项目也采用了包含IO通信优化机制的扩展操作系统方案, 在不久的未来包含IO通信优化机制的扩展操作系统方案将成为一个高弹性的中间件。

摘要:无线网络控制器 (RNC) 是3G通用移动通信系统 (UMTS) 中的主要网元, 是接入网络 (UTRAN) 的组成部分, 负责移动性管理、呼叫处理、链路管理和移交机制等等。RNC是一个多板卡构成的多处理机系统, 其内部的IO通信机制是衡量RNC性能的重要指标。因此, 如何设计和实现一个安全稳定的IO通信机制, 已经成了各通信开发商研究的重点之一。本文以此为课题, 讨论IO通信机制的优化与实现。

关键词:RNC,优化,IO通信,主备用,切换,网络

参考文献

[1]周明天, 汪文勇.TCP/IP网络原理与技术[M].清华大学出版社, 2005.

[2]吴旭光, 何军红.嵌入式操作系统原理与应用[M].化学工业出版社, 2007.

电子测量仪器IO模拟器设计 篇6

自动测试系统经常使用各种电子测量仪器进行系统集成。由于订货周期限制, 这些仪器可能要到系统集成的后期才能到货, 因此软件系统被迫延迟到到货后才能进行与仪器设备进行联调。由于联调中发现的问题引发的设计更改, 将大大延缓系统交付的时间。

通过预先得到的技术资料设计IO模拟器, 模拟实际设备的IO响应, 可以在仪器设备到货前开始与软件系统的联调。另一方面, 开发人员常常需要并行进行系统和分机调试, 采用模拟器也可解决实际设备数量限制问题, 提高系统开发效率。

本文提出的I O模拟器, 根据输入IO数据流进行状态转换, 并由当前状态实现模拟数据输出。由于采用文本格式的自定义数据文件控制模拟器实例化过程, 测试系统内可以同时模拟多种不同测量仪器的IO响应, 并具有良好的可扩展性。

模拟器工作原理

如图1所示, 应用程序的IO操作由虚拟IO驱动程序传递入模拟设备。IO模拟器通过加载描述设备工作模式的数据文件实现设备IO行为仿真。当物理IO驱动与虚拟IO驱动程序继承于同一个父类时, 应用程序可以通过配置驱动程序在运行时进行物理设备IO与模拟设备IO的动态切换。对实际设备的写入操作就自动转发给模拟设备, 并由模拟设备对读出等操作进行响应, 返回相应数据流到应用程序。

IO模拟器根据数据文件实现一个用户定义的有限状态机。如图2所示:继承自抽象基类 (IOManager) 的VISimulator类用于实现IO模拟器。将模拟器替代实际IO管理器对象 (VisaIOManger) 进行配置后, 模拟器将截获上层应用程序发出的IO指令, 并模拟实际设备进行响应。

VISimulator的成员states为模拟器可用状态表, variables为变量表, current为当前状态。状态表是状态类 (VIState类) 对象的集合, 变量表为变量类 (VIVariable类) 对象的集合, 变量值可用于状态和变量值的入口检查及计算。

当写入操作 (Write) 发生时, 模拟器遍历所有的变量及状态, 检查其入口条件 (entrance) , 对符合入口条件的变量, 更新 (U p d a t e) 变量值 (value) 。如符合状态入口条件, 则将该状态设置为当前状态。对于当前状态, 还需检查其出口条件 (exitus) , 如符合则设置当前状态为空。

当读出操作 (Read) 发生时, 模拟器由当前状态的模拟方法 (Simulate) 计算并返回模拟实际测量结果的数据。如当前状态设置读操作为出口条件, 则模拟器在读出完成后返回空闲状态。如当前状态为空或非可读状态, 模拟器将按照变超时设置延迟后返回无效数据, 真实地模拟IO指令序列错误造成的测试过程现象。

Vi Simulator的Load方法用于数据文件装入, 由数据文件的描述建立状态表和变量表。由状态和变量的静态方法Parse完成解析并返回实例对象。

实现及模拟结果

笔者在实际测试系统开发过程中设计了前述模拟器, 并根据仪器程控手册编写Agilent公司的HP8753E和E5071C等矢量网络分析仪的数据文件, 实现了对这些实际仪器IO功能的模拟。下面以HP8753E电压驻波比测量为例详细介绍IO模拟器实现方法。

矢量网络分析仪用于测量射频元件的端口特性, 常用于测量端口电压驻波比、衰减、阻抗等参数。因此其测量结果就包括多种格式不同的数据组合。当用HP8753E进行电压驻波比测试时, 网络分析仪会返回一个坐标数组, 坐标的两维分别是驻波测量值和测量频率。

根据H P 8 7 5 3 E程控手册定义状态SWRWaveform用于模拟电压驻波比测量状态:

以上文本描述了状态的工作模式, 当在写入数据流中检测到字符串outpform时, 如模拟器变量表中变量Format=swr时模拟器进入状态SWRWaveform。此时如收到读出指令, 模拟器将由SWRWaveform状态模拟输出电压驻波比波形, 返回一个101点的两维坐标数组, 其中X为1到1.1之间的随机数, Y为从模拟器变量表中变量StartFreq到EndFreq的线性递增数值。

图3为测试系统由模拟器实际得到的测量波形, 模拟器根据IO数据流正确地进入了SWRWaveform状态, 并以正确的频率范围返回了仿真数据。

结语

本文介绍的模拟器适用于文本格式的控制指令集, 在电子测量系统开发过程中已得到了验证和实际应用。

摘要:本文介绍一种电子测量仪器IO模拟器实现方法。以网络分析仪HP8753E为例讨论了模拟器的部分实现细节及模拟结果。

关键词:仪器,IO模拟器,状态机,网络分析仪

参考文献

[1]. Meilir Page-Jones, UML面向对象设计基础, 人民邮电出版社, 2001.4

IO控制器 篇7

传统的Web信息交互应用通常是客户端浏览器向服务端发送一个请求, 服务器端接受到请求然后相应客户端返回消息, 然后客户端显示这些消息所含信息。这种信息交换方式对那种实时性要求不是很高的应用来说没有太大的影响, 而对于那种实时性要求很高的应用, 如在线游戏, 各类协同应用, 实时监控, RSS订阅等, 客户端在收到这些消息的时候可能消息已经不是最新的, 所以保持信息的同步性是构建Web实时应用的难题。

Web Socket技术出来之前, 开发人员想要实现实时应用主要采用轮询 (Polling) 和Comet技术, 而Comet技术本身就是轮询技术的一种改进, 这些技术在性能表现上或多或少都存在缺陷。HTML5 WebSocket的诞生就是为了取代以上两种技术, 该技术通过客户端的Java Script脚本与服务器发送连接请求, 连接建立之后, 客户端就是可以通过TCP协议直接交互数据了。因此, Web Socket本质上是由TCP协议完成传输的。

当前的B/S架构的协同应用 (如协同标绘, 协同文档编辑等) 也主要是采用以上两种方式来完成数据的推送, 在实时性上很难保证。本文研究将Web Socket引入广域网络环境中分布式实时协同应用研究中, 基于Node Js编程技术, Web Socket的库Socket.io, 结合本部门的Web图形服务支撑接口和地图的Web GIS服务, 研究和实现了一个简易的Web环境下的协同标绘系统[1]。

1 基本概念和介绍

1.1 Web Socket简介

Web Socket的出现是为了满足Web环境中日益增加的实时通信需求。在传统的Web环境中, 要实现实时通信, 通用的方式是采用HTTP协议不断的发送请求。但这种方式有一定的缺陷, HTTP的头部 (header) 比较大, 又占用服务端的资源 (即使没有任何信息也需要接受请求) 。而采用Web Socket技术, 则会大幅降低上所提到的消耗, 如图:

在Web Socket的API中, 浏览器和服务器只需要做一个握手的动作, 然后, 浏览器和服务器之间就形成的了一条快速通道。然后两者之间的就可以直接互相发送数据。在Web Socket协议中, 为我们实现实时应用带来了两大好处:1.更小的header, Web Socket的header大概只有两字节左右。2.服务器端推送, 服务器可以主动推送数据给客户端[2]。

1.2 Socket.io简介

Socket.io是Node JS下的一个实现Web Socket的Java Script库, 它可以在不同的浏览器和移动设备上实现实时应用。Socket.io会自动的根据浏览器从Web Socket, AJAX长轮训, iframe等等各种方式中选择最佳的方式来实现网络实时协同应用, 非常方便和人性化, 而且支持的浏览器的最低达IE5.5, 应该可以满足大部分需求。Socket.io可以用来做实时分析 (Real-time Analytics) , 二进制数据流传输包括图片、音频、视频, 即时消息、聊天对话, 和文档协同。

1.3协同应用的技术要素

1.信息对称性

信息对称性也叫信息同步性, 应用必须同步多个客户端的数据变化。

2.上下文明确

能够针对特定对象更新数据。

3.可持续运行

应用能够缓存必要的数据, 应对各种各样的网络状况[3,4,5,6,7]。

2 协同标绘应用的设计

2.1 协同模型的选择

实时协同设计有两种基本模型:集中式模型和复制式模型。在集中式模型中, 协同工作的参与者“同时”使用安装在某一站点的上的应用软件, 其他站点显示与该站点一样的用户界面。同时该站点也接受其他站点对应用的操作。在复制模型中, 协同工作的各个站点都运行程序的一个拷贝, 各站点将用户操作广播到其他站点, 使其做出相同的处理的操作。基于实时性考虑, 和Web图形接口是服务化的特点, 这里我们选择复制式模型。在这种模型下, 各个站点都有一份运行程序的拷贝, 数据传输只是程序的“执行命令”, 消息内容涵盖比较小, 这样可以减少数据的载荷[8,9,10,11,12]。

2.2协同标绘系统的结构框架

如图:

上图中客户层, 客户端主要有事件监听器, 事件触发器, 事件控制器, 事件缓存器这样几个事件功能模块。客户端与服务端通过Socket.io与协同服务器传递消息, Name Space是一个模块命名空间, 客户端通过Socket.io创建了一个与协同服务器的一个Web Socket长连接进行消息传递, 在这个连接对象后面加上不同的服务器端模块名称就可以向服务器端不同的模块触发消息, 不同的连接对象又由一个Socket.io的对象来保存着, 用户处理客户端发来消息。通过协同服务器端返回的数据, 再请求对应的图形服务, 就可以完成同步。在各个命名空间下客户端也对应着不同的连接对象。这样命名空间的划分不仅是为了系统的模块分离, 同时, 一个连接对象也对应着一个TCP连接, 这样也可以尽可能减少TCP连接的数目。

2.3 客户端与服务器交互

客户端在Web GIS加载完毕后, 便会绑定需要监听的协同事件, 比如标号的创建, 删除, 选中编辑标号属性等, 事件发生后, 首先会把事件的数据打包成消息推进消息队列 (也就是事件缓存器) , 并在事件监听器中监听该消息的返回确认, 表明该“事件”已经同步到其他协同用户, 系统流程图, 如图:

事件控制器主要就是为了保证协同用户间的事件发生时序, 事件控制器采用Deferred的异步模型。Deferred是一个双链参数加工的参数流水线模型。双链是指它内部把回调分成两种, 一种叫做成功回调, 用于正常时执行, 一种叫错误回调, 用于出错时执行。各自组成两个队列, 这里姑且叫成功队列与错误队列。添加回调时时一组一组的添加的。每组回调的参数都是上一组回调的处理结果, 当然只有第一组的参数是用户传入的。说的是流水线, 是说每个回调可能不是紧挨着执行, 有时需要消耗时间。如图:

2.4 协同标绘消息设计

整体上来说, 协同消息的结构分为消息标识, 消息数据。这两者合成一个JSON对象简单的结构就是:var mes={mid:……, data:……}。

2.4.1 消息标识

消息标识主要有三个类型:1、事件标识, 用于区分事件;2、用户标识, 用于区分用户;3、用户组标识, 用于区分用户组。

用户触发事件的时候会生成一个日期对象var t=new Date () , 然后用t.get Time () 来获取一个13位的大整数作为事件标识。这个整数是距1970 年1月1 日之间的毫秒数。标识本来是没有大小的含义的, 以毫秒数作为标识的好处就是可以利用标识的大小来确定事件的发生次序。

Socket.io的每个Socket.io的连接对象都包含一个id属性, 这个属性是一个20 位随机字符串, 并且是唯一的。参考官方给的例子:http://socket.io/demos/chat/, 它便是以Socketid这个属性来区分用户。实际测试过程中发现当浏览器刷新的时候Socket.io会先触发自身的disconnect事件, 然后再重新连接, 然后这时候id的属性会改变加一, 如果以这个作为标识, 考虑到如果用户刷新浏览器这种情况会比较麻烦, 会增加许多多余的操作。所以这里是定义一个20 位的随机字符串作为用户id。

用户组标识比较简单, 由用户创建协同过程的时候确定, 创建协同过程的时候同时在Socket.io中创建对应的room, 这样的一个room可以称作一个协同空间, 是协同活动的发生的“容器”, 用户连接的时候可以用连接对象的join () 方法把用户安置在这个空间。

2.4.2 消息数据

消息数据内主要是用来发送用户触发事件内的标号的数据信息, 该数据信息根据不同的事件类型, 可能包括标号的生成代码, 标号的位置信息等

2.5 协同应用前端设计

Back Bones是一个轻量级的前端MVC框架, 用于结构化管理页面中大量的Java Script, 建立与服务器、视图间的无缝连接, 为复杂应用提供基础的框架。Back Bones最适合的应用场景是单页应用, 并且页面上有大量的数据模型, 模型之间需要进行复杂的信息沟通。

在构建Web协同标绘应用中, 页面中有着大量的数据模型, 这些数据实时改变, Back Bones无疑是一个很好的选择, 它可以帮助我们很好的存储用户的数据模型, 检测数据的变化, 渲染视图。

2.6 网络情况处理

网络情况复杂性就需要系统有断线重连这个功能, 由于socket.io自身的事件中没有“reconnect”这个事件, 所以在socket.io的基础上重新封装一个对象用于处理各种网络情况, 主要的思路就是在服务端在增加一个计数器count, 统计连接的次数, 每次连接后count加一, 根据count来返回不同的数据。

3 效果展示

该应用采用Node Js作为服务端, 客户端是运行在浏览器里面的HTML文件。环境准备:windows XP系统, 在Node Js官网 (nodejs.org) 上下载最新的windows 32 位node-v0.12.3-x86.msi并安装. 并用Node Js包管理工具NPM (Node Js Package Mannager) 安装Socket.io的模块。此外, 客户端的HTML文件还需要引入Java Script文件socket.io.js。

效果展示, 红蓝双方的标注如图:

4 结束语

本文简要说明了, 如何采用Socket.io等技术来构建一个协同应用, 应用功能还不算很全面, 需要进一步完善流程控制, 权限控制等方面的问题。

参考文献

[3]马芳芳. (2011) .基于xml的态势图协同标绘系统设计与实现.计算机与数字工程, 39, :51-53.

[4]武严严, 王玉玫.基于以活动为中心的协同标绘集成系统[J].计算机工程与设计, 2009, (22) :5248-5252.

[6]张俊升.在分布环境下态势图协同标绘系统设计与实现[D].华中科技大学, 2004.DOI:doi:10.7666/d.y693117:65-71

[8]莫磊, 胥布工.基于分布式估计及任务分配的WSANs协同机制[J].新型工业化, 2013, 3 (12) :15-27.

[9]张翀, 王彦恺.航天器编队姿态与轨道耦合协同控制器设计[J].新型工业化, 2014, 4 (8) :30-36.

[10]何美荣, 郑玉甫, 李敏之, 等.协同网络编码系统中最优伙伴选择算法的研究[J].新型工业化, 2012, 2 (7) :30-35.

[11]刘兴华, 奚宏生.视频业务的分布式协同接入控制建模[J].新型工业化, 2013, 3 (1) :68-78.

IO控制器 篇8

传统的硬盘在IO时, 磁头需要来回移动以定位读写位置, 所以在做顺序读写操作时效率较高, 执行随机乱序读写时效率较低。而对于闪存类存储设备, 随机读写和顺序读写基本没有速度区别。闪存设备在执行写操作时较为特殊, 闪存设备不能像磁盘设备那样, 在已有数据存在的地方直接重写。对于SD卡而言, 如果需要进行写操作, 不能在单个数据单元上直接进行, 而是要先将整个块上的数据全部擦除, 然后将包括修改后数据的一整块重新写入。正是由于传统硬盘与闪存类设备的IO原理存在大的差异, 使得Linux内核原本针对磁盘这种存储设备所做的一些默认设置并不适用于闪存设备, 比如:针对磁盘设备而默认选择的IO调度策略, 对于闪存设备而言, 性能并不是最优的。

本文首先对Linux内核存储IO[1]过程进行分析, 提出了存储IO调优方案, 包括文件预读取、IO调度策略、EXT4文件系统3个方面的优化, 最后基于OMAP4平台环境进行测试并分析。

1 Linux存储IO

对Linux系统存储IO性能进行优化需要充分理解整个IO流程, Linux系统IO子系统体系架构如图1所示, 对于用户空间进程的读写操作, 需跨越虚拟文件层 (VFS Layer) 、页缓存层 (Page Cache) 、通用块层 (Block Layer) 、IO调度层、设备驱动层和物理设备层[2], 以write () 操作为例的Linux内核IO流程如下所述: (1) 用户进程通过write () 系统调用请求向文件中写入数据。 (2) 内核更新文件相关的页面缓存。 (3) Pdflush内核线程负责将页面缓存内容回写到磁盘。 (4) 文件系统层将缓存块组织成BIO, 并将写请求提交给块设备层。 (5) 块设备层接收到写请求, 据IO调度策略, 将IO请求放入请求队列中。 (6) 调用设备驱动直接操作物理存储设备完成最终的写操作。

参照Linux系统IO子系统的层次结构[3], 文中针对每个层次所执行的具体操作, 对内核参数进行调优, 主要包括虚拟文件系统层次页缓存、通用块层IO调度策略与文件系统本身3个方面进行了优化。

2 优化方案

2.1 页缓存

Linux内核会将最近访问过的文件页面缓存在内存中, 这个文件缓存被称为页缓存。来自用户进程发起的read () 操作发生在应用程序提供的缓冲区与页缓存之间, 而预读机制则负责填充页缓存。用户进程的读写数据缓冲一般都比较小, 比如, 文件拷贝命令cp的读写缓冲粒度就是4 k B。内核的预读算法则会以其认为更合适的大小进行预读I/O, 比如16~128 k B。Linux内核页缓冲的预读算法工作流程如下[4]:

(1) 顺序性检测。只针对顺序读操作采用预读算法。

(2) 流水线预读。当程序在处理一批数据时, 希望内核能在后台把下一批数据事先准备好, 以便CPU和硬盘能流水线作业。

(3) 确定预读粒度。Linux采用一个快速窗口扩张算法确定预读粒度大小。首次预读:readahead_size=read_size*2 (或readahead_size=read_size*4) , 后续预读:readahead_size*=2;后续的预读窗口将逐次倍增, 直到达到系统设定的最大预读粒度大小, 其缺省值为128 k B。

通过调整Linux内核参数“/sys/block/mmcblk0p3/bdi/read_ahead_kb”, 修改文件预读取粒度上限, 测试闪存设备读取数据的性能, 确定最优的参数设置。

2.2 IO调度策略选择

通用块层I/O调度器的作用是为上层应用的IO请求做优化处理, 主要完成请求合并与分类, 以达到提高系统吞吐量、缩短响应时间的目的。进行合并和分类的原因在于:传统硬盘作IO时的寻道开销很大, 如果能对相邻物理地址的请求顺序作优化, 则可大幅提高读写性能。I/O调度器的调度策略包括[5]:

(1) 完全公平队列 (CFS) 。实现了请求的合并和分类。每个进程的IO请求形成一个队列, 这个队列是对寻道地址进行排序, 尽量减少寻道时间。

(2) 最后期限 (Deadline) 。实现了请求的合并和分类, 然后为每个请求分配一个超期时间, 这样就避免了某个请求被饿死的情况。

(3) NOOP。按照简单的FIFO方式管理请求, 仅简单实现了合并而没有分类操作。

Linux系统针对传统磁盘默认选择了CFS调度策略, 并且性能相比其他两种调度策略有很大的优势, 但随着闪存存储设备的出现, 针对寻道时间所做的种种优化失去意义, 而且尝试进行优化操作所带来的开销反而对IO性能带来负面影响。针对闪存设备, 调整Linux的内核参数“/sys/block/mmcblk0/queue/scheduler”, 选择不同的调度策略进行对比测试, 找出针对闪存设备性能最优的调度策略。

2.3 文件系统分区对齐

对于SD卡这类常用闪存设备而言, 如果需要进行写操作, 不能在单个数据单元上直接进行, 而是要先将整个块上的数据全部擦除, 然后将包括修改后数据的一整块重新写入。在SD卡上创建文件系统时, 如果文件系统分区的边界未与闪存擦除块对齐, 那么数据很可能就会跨越两个相邻擦除块的边界, 对于写操作, 就要涉及到两个块的擦除操作, 严重降低了SD卡的写性能。文中在SD卡上建立分区对齐文件系统, 并进行对比测试。

(1) 使用Flash Bench工具测试SD卡擦除块大小本文使用的SD卡擦除块大小为4 MB。

(2) 分区对齐。根据擦除块大小, 在SD卡上创建分区对齐的文件系统, 文中采用ext4文件系统Mkfs.ext4-o^has_journal-b 4096-L rootfs/dev/mmcblk0p1

(3) 结果测试。为测试分区是否对齐对SD卡读写速度的影响, 为了有较明显的对比效果, 本文采用的测试数据大小为16 MB。具体操作如下:

3 测试与结果分析

测试环境为OMAP4 Pandaboard ES[6], 是基于德州仪器OMAP4460片上系统开发的低功耗、低成本的单板计算机, 系统配置ARM Cortex-A9 MPCore双核处理器, 使用金士顿SD卡作为存储设备 (容量为8 GB, 速度等级为Class 4) , 操作系统采用Fedora17, 测试工具为FIO[7]。首先在采用内核默认参数的情况下, 对SD卡的IO性能进行测试;然后根据SD卡的存储原理与特性, 参照上述方案有针对性地对内核参数做出调整, 并进行对比测试。

页缓存大小调优测试[8]结果图3和图4所示, “read_ahead_kb”对于顺序读操作的性能影响较大。当从默认值128改为512时, 性能提升了20%以上。该参数调整对随机读操作无效。

不同调度策略测试结果如图5~图7所示, noop和deadline的调度方式相比cfq表现出更好的性能。对于智能终端, 文件操作的进程并发度不高, 建议用deadline。

SD卡分区对齐测试结果如图8所示。SD卡制作文件系统时采用分区对齐方式, 写入速度提高至未对齐时的3.4倍。

4 结束语

针对移动终端系统存储IO的典型环境, 提出了存储IO调优方案, 包括文件预读取、IO调度策略、EXT4文件系统3个方面的优化, 并基于OMAP4平台环境进行测试。实验结果表明, 本文提出的调优方法能明显提升系统存储IO的性能。所提出的调优方法对移动终端的系统配置优化具有较强的指导意义, 可提升移动终端系统的存储设备IO性能。

参考文献

[1]Robert Love.Linux内核设计与实现[M].陈莉君, 康华, 译.北京:机械工业出版社, 2011.

[2]赵健博.Read系统调用剖析[EB/OL]. (2008-03-13) [2013-12-01]https://www.ibm.com/developerworks/cn/linux/l-cn-read.

[3]GERO S.DS8800 Performance Monitoring and Tuning[M].USA:IBM, 2012.

[4]中国IT实验室.Linux内核的文件预读详细解析[M].北京:中国IT实验室, 2009.

[5]Kreindler.I/O SD card speed tuning[EB/OL]. (2013-5-15) [2013-12-01]www.ibm.com.

[6]System Reference Manual, Schematics Pandaboard.OMAP4460pandaboard ES system reference manual[EB/OL]. (2011-9-29) [2013-12-01]http://pandaboard.org.

基于IO板卡的高仿真虚拟机械手 篇9

传统的PLC实验箱输入输出都靠用按纽, 用发光二极管等电子元件对控制对象进行模拟。在实际教学中存在以下缺点:

(1) 形象不直观, 难以激发学生的兴趣;

(2) 仿真度不高, 不能仿真一些复杂的控制对象, 特别是涉及到模入模出的闭环控制, 如PLC的典型控制对象——变频恒压供水系统及电梯控制等;

(3) 由于传统实验箱靠PLC外接实验电路板进行仿真, 无法对其进行功能扩充和改动;

(4) 学生无法对进行PLC的接线操作, 由于传统实验箱的接线已固定于实验板上, 仅靠输入输出端子部分的跳线难以让学生搞清PLC全系统的接线情况。

针对传统实验箱的以上缺点, 开发以PC机和PLC的通信为基础的虚拟的仿真实验系统是必然发展趋势。该系统基于组态软件, 能完成目前PLC各类教材中所有典型实验及部分实际工程的高度仿真, 系统具有以下优点:

(1) 仿真度高。本系统可结合工程实践, 将典型控制对象的各控制环节的实际产品参数和系统参数仿真在计算机中, 实现对实际工程的真实模拟。

(2) 形象直观。利用PC机丰富的软件资源, 可在上位机上仿真出各控制对象对应的声音、图像、动画及各模拟传感器、执行器的实时运行参数等, 大大改善了教学条件, 且极易激发学生的学习兴趣。

(3) 节省经费。由于本系统本质是计算机软件模拟的虚拟仪器和对象, 不需配置各类传感器、执行器, 更不需购买或制作典型对象的实物模型, 可大大节省宝贵的实验经费。

(4) 易升级, 易移植。系统本质是计算机软件, 因此可随时根据教学内容进行修改和功能扩充, 且在一般个人PC上都能使用。

(5) 可培训学生的PLC接线能力。本系统可在界面中提供接线操作模块, 如学生接线错误, 则界面中控制对象亦显示错误的运行结果或出错提示。同时, 如对实际控制对象的仿真度作进一步升级后, 可作为特定对象的辅助设计及技工培训工具。

2 系统介绍

操作者首先在本系统提供的界面中进行PLC的模拟接线, 然后在PLC编程软件中进行编程。当PLC运行所编程序后, 运行结果将通过串口送入PC, 直接对控制对象的动作进行控制, 控制对象的动作将以高度仿真的多媒体方式在PC机上显示出来。

系统如图1所示, 前三块构成了该虚拟仿真系统的被控对象, PLC控制被控对象, 研华I/O板卡发出信号通过电平转换让PIC接收到信号, 实现了与真实被控对象的连线, 再由装有组态王软件的计算机显示被控对象, 实现高度仿真的实验效果。

2.1 I/O板卡 (研华4711A) 的介绍

USB-4700系列包括即插即用数据采集模块, 因此无需再打开计算机机箱来安装板卡。仅需插上模块, 便可以采集到数据。它在工业应用中足够可靠和稳定, 却并不昂贵。USB-4700是增加任何带有USB端口的计算机测量和控制能力的最佳的途径。本系统使用的USB-4711A是完全的即插即用设计, 具备支持USB 2.0、16路模拟输入通道、12位分辨率、采样速率高达150k S/s、8路DI、8路DO、2路AO和1路32位计数器等特点, 它通过USB端口获得所有所需的电源, 无需外部的电源连接, 非常便于使用。

2.2 转换电路的介绍

由于所使用的PLC最低响应电平大于3.3V, 但从研华USB-4711A所发出的电平只有3.3V, 所以必须将该电平转换或者放大至PLC能够响应的电平, 故使用三极管来转换该电平信号。

该电路板所使用的是9018的NPN型三极管和10K的电阻通过三极管转换电路使电平信号转换, 如图2所示。

3 虚拟机械手系统设计

本系统设计以实际工程应用中的机械手为例, 最终设计是让PLC通过I/O板卡对被控对象 (虚拟机械手) 实施控制, 完成和真实条件下一样运动过程。最终实现效果图如图3所示。

3.1 连接设备定义

在“COM1”下新建设备, 出现设备配置导向, 选择智能模块子类下本系统使用的研华PCI板卡USB4711系列。在选择串口号, 暂且选“COM1”, 设备地址应当是PLC通信的远程地址, 通信参数默认。这样就创建了一个新的设备, 并且可以在工程浏览器中查看到。

3.2 定义变量

部分变量定义如下界面:

变量类型为I/O离散, 连接设备为新I/O设备, 寄存器根据PLC程序中的设计定义成相应位置, 数据类型为Bit位数据, 设为只读 (显示监控) 。

3.3 命令语言

为了让监控画面和实际工程应用相符, 必须有命令语言与其配合, 在组态画面中的部分命令语言如下:

if ( (工件1水平位置<100) &&标志位==1)

{工件1水平位置=工件1水平位置+10;

工件1垂直位置=工件1垂直位置+10;}

if (!传送带驱动&&传送带旋转角度<360)

{传送带旋转角度=传送带旋转角度+10;}

else{if (!传送带驱动&&传送带旋转角度==360)

{传送带旋转角度=0;}}……

if (工件夹紧状态==1)

{工件水平位置=机械手水平位置;工件垂直位置=机械手垂直位置;}

if (工件1水平位置==100&&工件1垂直位置==100&&工件水平位置==0&&工件垂直位置==100) {LS0=1;标志位=0;}else{LS0=0;}……

4 虚拟机械手仿真实验系统的调试

设备测试完成后, 将编写的程序下载到PLC中测试并反复调试。部分PLC梯形图如下:

在PLC的控制下被控对象 (虚拟机械手) 有序的按要求进行每一步动作。

5 结束语

通过实验比较得到如下结果:

从结果可以清晰地看出, 本系统的虚拟高仿真实验系统的优越性远远超过了传统的实验设备, 具有非常广泛的实用性。

摘要:在现在传统的PLC仿真实验系统中, 实验系统存在形象不直观, 仿真度不高, 特别是一些复杂的控制对象, 或涉及到模入模出的闭环控制, 大多采用实物构建小型实验系统, 但存在投资较多、占地较大等诸多缺陷和不足, 无法保证每个操作者进行操作, 最后变成仅供演示使用, 无法升级。文章系统以机械手为例, 充分利用PLC、I/O板卡以及组态软件的优点, 设计一个全新的虚拟仿真实验模式, 使学生能更好地培养和发挥学生良好的动手能力, 以及能够直观的感受真实的实验系统, 从而达到与真实的机械手接线一致的高仿真的虚拟实验系统。

关键词:PLC,机械手,虚拟仿真实验系统

参考文献

[1]汪志锋.可编程序控制器原理与应用[M].西安:西安电子科技大学出版社, 2008.

[2]张建民.机电一体化系统设计[M].北京:高等教育出版社, 2010.

[3]苗常初.PLC编程及应用[M].北京:机械工业出版社, 2013.

上一篇:洪江古商城下一篇:商务英语专业教学