2。简述输入输出变频器三种控制方式式

中国工控|PLC与变频器 三种硬件联机方式 & 注意事项
技术文章来源提供
三种连接方式
1、开关量联机
利用PLC的开关量输出控制变频器。PLC的开关输出量一般可以与变频器的开关量输入端直接相连。这种控制方式的接线简单,抗干扰能力强。利用PLC的开关量输出可以控制变频器的启动/停止、正/反转、点动、多段速和加减时间等,能实现较为复杂的控制要求,但只能有级调速。
2、模拟量联机
利用PLC的模拟量输出模块控制变频器。PLC的模拟量输出模块输出0~10V电压信号或4~20mA电流信号,作为变频器的模拟量输入信号,控制变频器的输出频率。
这种控制方式接线简单,但需要选择与变频器输入阻抗匹配的PLC输出模块,且PLC的模拟量输出模块价格较为昂贵,此外还需采取分压措施使变频器适应PLC的电压信号范围,在连接时注意将布线分开。
3、通讯联机
PLC与变频器通过RS-485通信接口的连接。很大一部分变频器都有一个RS-485串行接口(有的也提供RS-232C接口),采用双线连接,其设计标准适用于工业环境的应用对象。
单一的RS-485链路最多可以连接30台变频器,而且根据各变频器的地址或采用广播信息,都可以找到需要通信的变频器。链路中需要有一个主控制器(主站),而各个变频器则是从属的控制对象(从站)。
采用串口通讯方式的优点
①大大减少布线的数量。
②无需重新布线即可更改控制功能。
③可以通过串行接口设置和修改变频器的参数。
④可以连续对变频器的特性进行监测和控制。
联机注意事项
1、开关量信号注意事项
变频器通常利用继电器接点或具有继电器接点开关特性的元器件(如晶体管)与PLC相连,得到运行状态指令,如图1(A)、(B)所示。
图1 A 继电器型PLC输出与变频器连接的运行方式
图1 B 晶体管型PLC输出与变频器连接的运行方式
在使用继电器接点时,经常由于接触不良而带来误动作;使用晶体管进行连接时,则需考虑晶体管本身的电压、电流容量等因素,以保证系统的可靠性。
在设计变频器的输进信号电路时还应该留意,当输进信号电路连接不当时也会造成变频器的误动作。例如,当输进信号电路采用继电器等感性负载时,继电器开闭产生的浪涌电流有可能引起变频器内部元器件的损坏或失效进而导致变频器误动作,因此应尽量避免这种情况的发生。图2与图3给出了正确与错误的接线例子。
图2 变频器输进信号连接方式
图3 变频器输进信号的错误接法
当输进开关信号进进变频器时,有时会发生外部电源和变频器控制电源(DC24V)之间的串扰。正确的连接是利用PLC电源,将外部晶体管的集电极经过二极管接到PLC。如图4所示。
图4 输进信号的防干扰接法
2、模拟量信号注意事项
模拟输进则通过接线端子由外部给定,通常通过0~10V/5V的电压信号或0/4~20mA的电流信号输进。由于接口电路因输进信号而异,因此必须根据变频器的输进阻抗选择PLC的输出模块。
当变频器和PLC的电压信号范围不同时,如变频器的输进信号为0~10V,而PLC的输出电压信号范围为0~5V时;或PLC的一侧的输出信号电压范围为0~10V而变频器的输进电压信号范围为0~5V时,由于变频器和晶体管的答应电压、电流等因素的限制,需要用并、串联的方式接进电阻,以次来限制电流或分往部分电压,以保证进行开闭时不超过PLC和变频器相应的容量。此外,在连线时还应留意将控制电路和主电路分开,控制电路最好采用屏蔽线,保证主电路一侧的噪音不传到控制电路。
无论哪种情况,都应留意:PLC一侧的输进阻抗的大小要保证电路中电压和电流不超过电路的答应值,以保证系统的可靠性和减少误差。
另外,在使用PLC进行顺序控制时,由于进行数据处理需要时间,以及程序编写时排列的顺序不同和指令的使用不同等都会导致系统在运行时存在一定的时间延迟,故在较精确的控制时应予以考虑以上因素。
由于变频器在运行中会产生较强的电磁干扰,为保证PLC不由于变频器主电路断路器及开关器件等产生的噪音而出现故障,故将变频器与PLC相连接时应该留意以下几点:
(1)对PLC本身应按规定的接线标准和接地条件进行接地,而且应留意避免和变频器使用共同的接地线,且在接地时使二者尽可能分开。
(2)当电源条件不太好时,应在PLC的电源模块及输进/输出模块的电源线上接进噪音滤波器、电抗器和能降低噪音用的器件等,另外,若有必要,在变频器输进一侧也应采取相应的措施。
(3)当把变频器和PLC安装于同一操纵柜中时,应尽可能使与变频器有关的电线和与PLC有关的电线分开。
(4)通过使用屏蔽线和双绞线达到进步噪音干扰的水平。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点伺服电机的三种控制方式
学工控技术,拿10万年薪
马上注册,免费学习超过100课时视频教程,免费下载海量学习资料
速度控制和转矩控制都是用模拟量来控制的。位置控制是通过发脉冲来控制的。具体采用什么控制方式要根据客户的要求,满足何种运动功能来选择。
如果您对电机的速度、位置都没有要求,只要输出一个恒转矩,当然是用转矩模式。
如果对位置和速度有一定的精度要求,而对实时转矩不是很关心,用转矩模式不太方便,用速度或位置模式比较好。
如果上位控制器有比较好的闭环控制功能,用速度控制效果会好一点。
如果本身要求不是很高,或者,基本没有实时性的要求,用位置控制方式对上位控制器没有很高的要求。
就伺服驱动器的响应速度来看,转矩模式运算量最小,驱动器对控制信号的响应最快;位置模式运算量最大,驱动器对控制信号的响应最慢。
对运动中的动态性能有比较高的要求时,需要实时对电机进行调整。那么如果控制器本身的运算速度很慢(比如PLC,或低端运动控制器),就用位置方式控制。如果控制器运算速度比较快,可以用速度方式,把位置环从驱动器移到控制器上,减少驱动器的工作量,提高效率(比如大部分中高端运动控制器);如果有更好的上位控制器,还可以用转矩方式控制,把速度环也从驱动器上移开,这一般只是高端专用控制器才能这么干,而且,这时完全不需要使用伺服电机。
一般说驱动器控制的好不好,每个厂家的都说自己做的最好,但是现在有个比较直观的比较方式,叫响应带宽。当转矩控制或者速度控制时,通过脉冲发生器给他一个方波信号,使电机不断的正转、反转,不断的调高频率,示波器上显示的是个扫频信号,当包络线的顶点到达最高值的70.7%时,表示已经失步,此时的频率的高低,就能显示出谁的产品牛了,一般的电流环能作到1000Hz以上,而速度环只能作到几十赫兹。
换一种比较专业的说法:
1、转矩控制:转矩控制方式是通过外部模拟量的输入或直接的地址的赋值来设定电机轴对外的输出转矩的大小,具体表现为例如10V对应5Nm的话,当外部模拟量设定为5V时电机轴输出为2.5Nm:如果电机轴负载低于2.5Nm时电机正转,外部负载等于2.5Nm时电机不转,大于2.5Nm时电机反转(通常在有重力负载情况下产生)。可以通过即时的改变模拟量的设定来改变设定的力矩大小,也可通过通讯方式改变对应的地址的数值来实现。
应用主要在对材质的受力有严格要求的缠绕和放卷的装置中,例如饶线装置或拉光纤设备,转矩的设定要根据缠绕的半径的变化随时更改以确保材质的受力不会随着缠绕半径的变化而改变。
2、位置控制:位置控制模式一般是通过外部输入的脉冲的频率来确定转动速度的大小,通过脉冲的个数来确定转动的角度,也有些伺服可以通过通讯方式直接对速度和位移进行赋值。由于位置模式可以对速度和位置都有很严格的控制,所以一般应用于定位装置。
应用领域如数控机床、印刷机械等等。
3、速度模式:通过模拟量的输入或脉冲的频率都可以进行转动速度的控制,在有上位控制装置的外环PID控制时速度模式也可以进行定位,但必须把电机的位置信号或直接负载的位置信号给上位反馈以做运算用。位置模式也支持直接负载外环检测位置信号,此时的电机轴端的编码器只检测电机转速,位置信号就由直接的最终负载端的检测装置来提供了,这样的优点在于可以减少中间传动过程中的误差,增加了整个系统的定位精度。
4、谈谈3环,伺服一般为三个环控制,所谓三环就是3个闭环负反馈PID调节系统。
最内的PID环就是电流环,此环完全在伺服驱动器内部进行,通过霍尔装置检测驱动器给电机的各相的输出电流,负反馈给电流的设定进行PID调节,从而达到输出电流尽量接近等于设定电流,电流环就是控制电机转矩的,所以在转矩模式下驱动器的运算最小,动态响应最快。
第2环是速度环,通过检测的电机编码器的信号来进行负反馈PID调节,它的环内PID输出直接就是电流环的设定,所以速度环控制时就包含了速度环和电流环,换句话说任何模式都必须使用电流环,电流环是控制的根本,在速度和位置控制的同时系统实际也在进行电流(转矩)的控制以达到对速度和位置的相应控制。
第3环是位置环,它是最外环,可以在驱动器和电机编码器间构建也可以在外部控制器和电机编码器或最终负载间构建,要根据实际情况来定。由于位置控制环内部输出就是速度环的设定,位置控制模式下系统进行了所有3个环的运算,此时的系统运算量最大,动态响应速度也最慢。
伺服电机的使用寿命是多久?
额定转速不用管它,伺服电机有堵转扭矩这一说法,实际就是在1rpm的情况下测定出来的。只有你的电机质量没问题,且使用的时候过载不严重,在承受范围以内,基本不会有什么影响。
电机的寿命主要取决于轴承,轴承算是电机里寿命最短的玩意儿了。你安装精度高点,同心度好点,放心用吧。真烧了那也是驱动器的责任,谁让它不接温控保护了。
交流伺服电机的转子通常做成鼠笼式,但为了使伺服电机具有较宽的调速范围、线性的机械特性,无“自转”现象和快速响应的性能,它与普通电动机相比,应具有转子电阻大和转动惯量小这两个特点。
目前应用较多的转子结构有两种形式:一种是采用高电阻率的导电材料做成的高电阻率导条的鼠笼转子,为了减小转子的转动惯量,转子做得细长;另一种是采用铝合金制成的空心杯形转子,杯壁很薄,仅0.2-0.3mm,为了减小磁路的磁阻,要在空心杯形转子内放置固定的内定子.空心杯形转子的转动惯量很小,反应迅速,而且运转平稳,因此被广泛采用。
将控制卡断电,连接控制卡与伺服之间的信号线。以下的线是必须要接的:控制卡的模拟量输出线、使能信号线、伺服输出的编码器信号线。复查接线没有错误后,电机和控制卡(以及PC)上电。此时电机应该不动,而且可以用外力轻松转动,如果不是这样,检查使能信号的设置与接线。用外力转动电机,检查控制卡是否可以正确检测到电机位置的变化,否则检查编码器信号的接线和设置。
对于一个闭环控制系统,如果反馈信号的方向不正确,后果肯定是灾难性的。通过控制卡打开伺服的使能信号。这是伺服应该以一个较低的速度转动,这就是传说中的“零漂”。一般控制卡上都会有抑制零漂的指令或参数。使用这个指令或参数,看电机的转速和方向是否可以通过这个指令(参数)控制。如果不能控制,检查模拟量接线及控制方式的参数设置。确认给出正数,电机正转,编码器计数增加;给出负数,电机反转转,编码器计数减小。如果电机带有负载,行程有限,不要采用这种方式。测试不要给过大的电压,建议在1V以下。如果方向不一致,可以修改控制卡或电机上的参数,使其一致。
3、抑制零漂
在闭环控制过程中,零漂的存在会对控制效果有一定的影响,最好将其抑制住。使用控制卡或伺服上抑制零飘的参数,仔细调整,使电机的转速趋近于零。由于零漂本身也有一定的随机性,所以,不必要求电机转速绝对为零。
伺服电机本身具备发出脉冲的功能,所以伺服电机每旋转一个角度,都会发出对应数量的脉冲,这样,和伺服电机接受的脉冲形成了呼应,或者叫闭环,如此一来,系统就会知道发了多少脉冲给伺服电机,同时又收了多少脉冲回来,这样,就能够很精确的控制电机的转动,从而实现精确的定位,可以达到0.001mm。
直流伺服电机分为有刷和无刷电机。有刷电机成本低,结构简单,启动转矩大,调速范围宽,控制容易,需要维护,但维护不方便(换碳刷),产生电磁干扰,对环境有要求。因此它可以用于对成本敏感的普通工业和民用场合。
来源:互联网
推荐学习相关视频:
西门子工程师
线下培训课程
免费视频教程详解python的几种标准输出重定向方式
转载 & & 投稿:daisy
这篇文章是基于Python2.7版本,介绍常见的几种标准输出(stdout)重定向方式。显然,这些方式也适用于标准错误重定向。学习python的小伙伴们可以参考借鉴。
在Python中,文件对象sys.stdin、sys.stdout和sys.stderr分别对应解释器的标准输入、标准输出和标准出错流。在程序启动时,这些对象的初值由sys.__stdin__、sys.__stdout__和sys.__stderr__保存,以便用于收尾(finalization)时恢复标准流对象。
Windows系统中IDLE(Python GUI)由pythonw.exe,该GUI没有控制台。因此,IDLE将标准输出句柄替换为特殊的PseudoOutputFile对象,以便脚本输出重定向到IDLE终端窗口(Shell)。这可能导致一些奇怪的问题,例如:
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 :19) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
&&& import sys
&&& for fd in (sys.stdin, sys.stdout, sys.stderr): print fd
&idlelib.PyShell.PseudoInputFile object at 0x&
&idlelib.PyShell.PseudoOutputFile object at 0x&
&idlelib.PyShell.PseudoOutputFile object at 0x&
&&& for fd in (sys.__stdin__, sys.__stdout__, sys.__stderr__): print fd
&open file '&stdin&', mode 'r' at 0x00FED020&
&open file '&stdout&', mode 'w' at 0x00FED078&
&open file '&stderr&', mode 'w' at 0x00FED0D0&
可以发现,sys.__stdout__与sys.stdout取值并不相同。而在普通的Python解释器下(如通过Windows控制台)运行上述代码时,两者取值相同。
print语句(statement)不以逗号结尾时,会在输出字符串尾部自动附加一个换行符(linefeed);否则将一个空格代替附加的换行符。print语句默认写入标准输出流,也可重定向至文件或其他可写对象(所有提供write方法的对象)。这样,就可以使用简洁的print语句代替笨拙的object.write('hello'+'\n')写法。
由上可知,在Python中调用print obj打印对象时,缺省情况下等效于调用sys.stdout.write(obj+'\n')
示例如下:
&&& import sys
&&& print 'Hello World'
Hello World
&&& sys.stdout.write('Hello World')
Hello World
二. 重定向方式
本节介绍常用的Python标准输出重定向方式。这些方法各有优劣之处,适用于不同的场景。
2.1 控制台重定向
最简单常用的输出重定向方式是利用控制台命令。这种重定向由控制台完成,而与Python本身无关。
Windows命令提示符(cmd.exe)和Linux Shell(bash等)均通过"&"或"&&"将输出重定向。其中,"&"表示覆盖内容,"&&"表示追加内容。类似地,"2&"可重定向标准错误。重定向到"nul"(Windows)或"/dev/null"(Linux)会抑制输出,既不屏显也不存盘。
以Windows命令提示符为例,将Python脚本输出重定向到文件(为缩短篇幅已删除命令间空行):
E:\&echo print 'hello' & test.py
E:\&test.py & out.txt
E:\&type out.txt
E:\&test.py && out.txt
E:\&type out.txt
E:\&test.py & nul
注意,在Windows命令提示符中执行Python脚本时,命令行无需以"python"开头,系统会根据脚本后缀自动调用Python解释器。此外,type命令可直接显示文本文件的内容,类似Linux系统的cat命令。
Linux Shell中执行Python脚本时,命令行应以"python"开头。除"&"或"&&"重定向外,还可使用tee命令。该命令可将内容同时输出到终端屏幕和(多个)文件中,"-a"选项表示追加写入,否则覆盖写入。示例如下(echo $SHELL或echo $0显示当前所使用的Shell):
[wangxiaoyuan_@localhost ~]$ echo $SHELL
[wangxiaoyuan_@localhost ~]$ python -c "print 'hello'"
[wangxiaoyuan_@localhost ~]$ python -c "print 'hello'" & out.txt
[wangxiaoyuan_@localhost ~]$ cat out.txt
[wangxiaoyuan_@localhost ~]$ python -c "print 'world'" && out.txt
[wangxiaoyuan_@localhost ~]$ cat out.txt
[wangxiaoyuan_@localhost ~]$ python -c "print 'I am'" | tee out.txt
[wangxiaoyuan_@localhost ~]$ python -c "print 'xywang'" | tee -a out.txt
[wangxiaoyuan_@localhost ~]$ cat out.txt
[wangxiaoyuan_@localhost ~]$ python -c "print 'hello'" & /dev/null
[wangxiaoyuan_@localhost ~]$
若仅仅想要将脚本输出保存到文件中,也可直接借助会话窗口的日志抓取功能。
注意,控制台重定向的影响是全局性的,仅适用于比较简单的输出任务。
2.2 print &&重定向
这种方式基于print语句的扩展形式,即"print obj && expr"。其中,obj为一个file-like(尤其是提供write方法的)对象,为None时对应标准输出(sys.stdout)。expr将被输出到该文件对象中。
示例如下:
memo = cStringIO.StringIO(); serr = sys. file = open('out.txt', 'w+')
print &&memo, 'StringIO'; print &&serr, 'stderr'; print &&file, 'file'
print &&None, memo.getvalue()
上述代码执行后,屏显为"serr"和"StringIO"(两行,注意顺序),out.txt文件内写入"file"。
可见,这种方式非常灵活和方便。缺点是不适用于输出语句较多的场景。
2.3 sys.stdout重定向
将一个可写对象(如file-like对象)赋给sys.stdout,可使随后的print语句输出至该对象。重定向结束后,应将sys.stdout恢复最初的缺省值,即标准输出。
简单示例如下:
import sys
savedStdout = sys.stdout #保存标准输出流
with open('out.txt', 'w+') as file:
sys.stdout = file #标准输出重定向至文件
print 'This message is for file!'
sys.stdout = savedStdout #恢复标准输出流
print 'This message is for screen!'
注意,IDLE中sys.stdout初值为PseudoOutputFile对象,与sys.__stdout__并不相同。为求通用,本例另行定义变量(savedStdout)保存sys.stdout,下文也将作此处理。此外,本例不适用于经由from sys import stdout导入的stdout对象。
以下将自定义多种具有write()方法的file-like对象,以满足不同需求:
class RedirectStdout: #import os, sys, cStringIO
def __init__(self):
self.content = ''
self.savedStdout = sys.stdout
self.memObj, self.fileObj, self.nulObj = None, None, None
#外部的print语句将执行本write()方法,并由当前sys.stdout输出
def write(self, outStr):
#self.content.append(outStr)
self.content += outStr
def toCons(self): #标准输出重定向至控制台
sys.stdout = self.savedStdout #sys.__stdout__
def toMemo(self): #标准输出重定向至内存
self.memObj = cStringIO.StringIO()
sys.stdout = self.memObj
def toFile(self, file='out.txt'): #标准输出重定向至文件
self.fileObj = open(file, 'a+', 1) #改为行缓冲
sys.stdout = self.fileObj
def toMute(self): #抑制输出
self.nulObj = open(os.devnull, 'w')
sys.stdout = self.nulObj
def restore(self):
self.content = ''
if self.memObj.closed != True:
self.memObj.close()
if self.fileObj.closed != True:
self.fileObj.close()
if self.nulObj.closed != True:
self.nulObj.close()
sys.stdout = self.savedStdout #sys.__stdout__
注意,toFile()方法中,open(name[, mode[, buffering]])调用选择行缓冲(无缓冲会影响性能)。这是为了观察中间写入过程,否则只有调用close()或flush()后输出才会写入文件。内部调用open()方法的缺点是不便于用户定制写文件规则,如模式(覆盖或追加)和缓冲(行或全缓冲)。
重定向效果如下:
redirObj = RedirectStdout()
sys.stdout = redirObj #本句会抑制"Let's begin!"输出
print "Let's begin!"
#屏显'Hello World!'和'I am xywang.'(两行)
redirObj.toCons(); print 'Hello World!'; print 'I am xywang.'
#写入'How are you?'和"Can't complain."(两行)
redirObj.toFile(); print 'How are you?'; print "Can't complain."
redirObj.toCons(); print "What'up?"
redirObj.toMute(); print '&Silence&'
#无屏显或写入
os.system('echo Never redirect me!')
#控制台屏显'Never redirect me!'
redirObj.toMemo(); print 'What a pity!' #无屏显或写入
redirObj.toCons(); print 'Hello?'
redirObj.toFile(); print "Oh, xywang can't hear me" #该串写入文件
redirObj.restore()
print 'Pop up' #屏显
可见,执行toXXXX()语句后,标准输出流将被重定向到XXXX。此外,toMute()和toMemo()的效果类似,均可抑制输出。
使用某对象替换sys.stdout时,尽量确保该对象接近文件对象,尤其是涉及第三方库时(该库可能使用sys.stdout的其他方法)。此外,本节替换sys.stdout的代码实现并不影响由os.popen()、os.system()或os.exec*()系列方法所创建进程的标准I/O流。
2.4 上下文管理器(Context Manager)
本节严格意义上并非新的重定向方式,而是利用Pyhton上下文管理器优化上节的代码实现。借助于上下文管理器语法,可不必向重定向使用者暴露sys.stdout。
首先考虑输出抑制,基于上下文管理器语法实现如下:
import sys, cStringIO, contextlib
class DummyFile:
def write(self, outStr): pass
@contextlib.contextmanager
def MuteStdout():
savedStdout = sys.stdout
sys.stdout = cStringIO.StringIO() #DummyFile()
except Exception: #捕获到错误时,屏显被抑制的输出(该处理并非必需)
content, sys.stdout = sys.stdout, savedStdout
print content.getvalue()#; raise
sys.stdout = savedStdout
使用示例如下:
with MuteStdout():
print "I'll show up when &raise& is executed!" #不屏显不写入
raise #屏显上句
print "I'm hiding myself somewhere:)" #不屏显
再考虑更通用的输出重定向:
import os, sys
from contextlib import contextmanager
@contextmanager
def RedirectStdout(newStdout):
savedStdout, sys.stdout = sys.stdout, newStdout
sys.stdout = savedStdout
使用示例如下:
def Greeting(): print 'Hello, boss!'
with open('out.txt', "w+") as file:
print "I'm writing to you..."
with RedirectStdout(file):
print 'I hope this letter finds you well!' #写入文件
print 'Check your mailbox.'
with open(os.devnull, "w+") as file, RedirectStdout(file):
Greeting()
#不屏显不写入
print 'I deserve a pay raise:)' #不屏显不写入
print 'Did you hear what I said?'
可见,with内嵌块里的函数和print语句输出均被重定向。注意,上述示例不是线程安全的,主要适用于单线程。
当函数被频繁调用时,建议使用装饰器包装该函数。这样,仅需修改该函数定义,而无需在每次调用该函数时使用with语句包裹。示例如下:
import sys, cStringIO, functools
def MuteStdout(retCache=False):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
savedStdout = sys.stdout
sys.stdout = cStringIO.StringIO()
ret = func(*args, **kwargs)
if retCache == True:
ret = sys.stdout.getvalue().strip()
sys.stdout = savedStdout
return ret
return wrapper
return decorator
若装饰器MuteStdout的参数retCache为真,外部调用func()函数时将返回该函数内部print输出的内容(可供屏显);若retCache为假,外部调用func()函数时将返回该函数的返回值(抑制输出)。
MuteStdout装饰器使用示例如下:
@MuteStdout(True)
def Exclaim(): print 'I am proud of myself!'
@MuteStdout()
def Mumble(): print 'I lack confidence...'; return 'sad'
print Exclaim(), Exclaim.__name__ #屏显'I am proud of myself! Exclaim'
print Mumble(), Mumble.__name__
#屏显'sad Mumble'
在所有线程中,被装饰函数执行期间,sys.stdout都会被MuteStdout装饰器劫持。而且,函数一经装饰便无法移除装饰。因此,使用该装饰器时应慎重考虑场景。
接着,考虑创建RedirectStdout装饰器:
def RedirectStdout(newStdout=sys.stdout):
def decorator(func):
def wrapper(*args,**kwargs):
savedStdout, sys.stdout = sys.stdout, newStdout
return func(*args, **kwargs)
sys.stdout = savedStdout
return wrapper
return decorator
使用示例如下:
file = open('out.txt', "w+")
@RedirectStdout(file)
def FunNoArg(): print 'No argument.'
@RedirectStdout(file)
def FunOneArg(a): print 'One argument:', a
def FunTwoArg(a, b): print 'Two arguments: %s, %s' %(a,b)
FunNoArg()
#写文件'No argument.'
FunOneArg(1984) #写文件'One argument: 1984'
RedirectStdout()(FunTwoArg)(10,29) #屏显'Two arguments: 10, 29'
print FunNoArg.__name__
#屏显'wrapper'(应显示'FunNoArg')
file.close()
注意FunTwoArg()函数的定义和调用与其他函数的不同,这是两种等效的语法。此外,RedirectStdout装饰器的最内层函数wrapper()未使用"functools.wraps(func)"修饰,会丢失被装饰函数原有的特殊属性(如函数名、文档字符串等)。
2.5 logging模块重定向
对于代码量较大的工程,建议使用logging模块进行输出。该模块是线程安全的,可将日志信息输出到控制台、写入文件、使用TCP/UDP协议发送到网络等等。
默认情况下logging模块将日志输出到控制台(标准出错),且只显示大于或等于设置的日志级别的日志。日志级别由高到低为CRITICAL & ERROR & WARNING & INFO & DEBUG & NOTSET,默认级别为WARNING。
以下示例将日志信息分别输出到控制台和写入文件:
import logging
logging.basicConfig(level = logging.DEBUG,
format = '%(asctime)s [%(levelname)s] at %(filename)s,%(lineno)d: %(message)s',
datefmt = '%Y-%m-%d(%a)%H:%M:%S',
filename = 'out.txt',
filemode = 'w')
#将大于或等于INFO级别的日志信息输出到StreamHandler(默认为标准错误)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('[%(levelname)-8s] %(message)s') #屏显实时查看,无需时间
console.setFormatter(formatter)
logging.getLogger().addHandler(console)
logging.debug('gubed'); logging.info('ofni'); logging.critical('lacitirc')
通过对多个handler设置不同的level参数,可将不同的日志内容输入到不同的地方。本例使用在logging模块内置的StreamHandler(和FileHandler),运行后屏幕上显示:
[CRITICAL] lacitirc
out.txt文件内容则为:
(Fri)17:10:53 [DEBUG] at test.py,25: gubed
(Fri)17:10:53 [INFO] at test.py,25: ofni
(Fri)17:10:53 [CRITICAL] at test.py,25: lacitirc
除直接在程序中设置Logger、Handler、Formatter等外,还可将这些信息写入配置文件。示例如下:
#logger.conf
###############Logger###############
keys=root,Logger2F,Logger2CF
[logger_root]
level=DEBUG
handlers=hWholeConsole
[logger_Logger2F]
handlers=hWholeFile
qualname=Logger2F
propagate=0
[logger_Logger2CF]
handlers=hPartialConsole,hPartialFile
qualname=Logger2CF
propagate=0
###############Handler###############
[handlers]
keys=hWholeConsole,hPartialConsole,hWholeFile,hPartialFile
[handler_hWholeConsole]
class=StreamHandler
level=DEBUG
formatter=simpFormatter
args=(sys.stdout,)
[handler_hPartialConsole]
class=StreamHandler
level=INFO
formatter=simpFormatter
args=(sys.stderr,)
[handler_hWholeFile]
class=FileHandler
level=DEBUG
formatter=timeFormatter
args=('out.txt', 'a')
[handler_hPartialFile]
class=FileHandler
level=WARNING
formatter=timeFormatter
args=('out.txt', 'w')
###############Formatter###############
[formatters]
keys=simpFormatter,timeFormatter
[formatter_simpFormatter]
format=[%(levelname)s] at %(filename)s,%(lineno)d: %(message)s
[formatter_timeFormatter]
format=%(asctime)s [%(levelname)s] at %(filename)s,%(lineno)d: %(message)s
datefmt=%Y-%m-%d(%a)%H:%M:%S
此处共创建三个Logger:root,将所有日志输出至控制台;Logger2F,将所有日志写入文件;Logger2CF,将级别大于或等于INFO的日志输出至控制台,将级别大于或等于WARNING的日志写入文件。
程序以如下方式解析配置文件和重定向输出:
import logging, logging.config
logging.config.fileConfig("logger.conf")
logger = logging.getLogger("Logger2CF")
logger.debug('gubed'); logger.info('ofni'); logger.warn('nraw')
logger.error('rorre'); logger.critical('lacitirc')
logger1 = logging.getLogger("Logger2F")
logger1.debug('GUBED'); logger1.critical('LACITIRC')
logger2 = logging.getLogger()
logger2.debug('gUbEd'); logger2.critical('lAcItIrC')
运行后屏幕上显示:
[INFO] at test.py,7: ofni
[WARNING] at test.py,7: nraw
[ERROR] at test.py,8: rorre
[CRITICAL] at test.py,8: lacitirc
[DEBUG] at test.py,14: gUbEd
[CRITICAL] at test.py,14: lAcItIrC
out.txt文件内容则为:
(Fri)20:31:21 [WARNING] at test.py,7: nraw
(Fri)20:31:21 [ERROR] at test.py,8: rorre
(Fri)20:31:21 [CRITICAL] at test.py,8: lacitirc
(Fri)20:31:21 [DEBUG] at test.py,11: GUBED
(Fri)20:31:21 [CRITICAL] at test.py,11: LACITIRC
以上就是关于Python标准输出的重定向方式的全部内容,希望对学习python的朋友们能有所帮助,如果有疑问欢迎大家留言讨论。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 流量控制的三种方式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信