详细介绍: 西门子变频器6SL3211-0KB17-5UB1,西门子变频器6SL3211-0KB17-5UB1 {心中有空间,梦想就有可能} {西门子与客户携手,让关键所在,逐一实现} 联 系 人: 黄勇《黄工》 24小时联系手机: 13701633515 直线销售 电 话: 021-31660605 在 线 商 务 QQ: 77956468 单位:台 产品单价:电议 供货数量:不限 最小定量:1 包装说明:齐全 产品规格:全新原装   比较简单的实现PID闭环控制的方法 PID控制的难点在于整定控制器的参数。为了学习整定PID控制器参数的方法,必须做闭环实验,开环运行PID程序没有任何意义。用硬件组成一个闭环需要PLC的CPU模块、模拟量输入模块和模拟量输出模块,此外还需要被控对象、检测元件、变送器和执行机构。例如可以用电热水壶作为被控对象,用热电阻检测温度,用温度变送器将温度转换为标准电压,用移相控制的交流固态调压器作执行机构。 有没有比较简单的实现PID闭环控制的方法呢? 在控制理论中,用传递函数来描述被控对象、检测元件、执行机构和PID控制器。 被控对象一般是串联的惯性环节和积分环节的组合。在实验室可以用以运算放大器为核心的模拟电路来模拟广义的被控对象(包括检测元件和执行机构)的传递函数。我曾将这种运放电路用于S7-200和S7-1200的PID参数自动调节实验。 用运算放大器模拟被控对象一般需要做印刷电路板,还是比较麻烦。有没有更简单的方法呢? 除了用运算放大器来模拟被控对象的传递函数,也可以用PLC的程序来模拟。为此我编写了用来模拟被控对象的S7-200的子程序,它也可以用于S7-200 SMART。使用模拟的被控对象的PID闭环示意图如下图所示,虚线右边是被控对象,DISV是系统的扰动输入值。虚线左边是PLC的PID控制程序。

被控对象的数学模型为3个串联的惯性环节,其增益为GAIN,3个惯性环节的时间常数分别为TIM1~TIM3。其传递函数为

分母中的“s”为自动控制理论中拉普拉斯变换的拉普拉斯算子。将某一时间常数设为0,可以减少惯性环节的个数。图中被控对象的输入值INV是PID控制器的输出值。被控对象的输出值OUTV作为PID控制器的过程变量(反馈值)PV。 下图是模拟被控对象的子程序,实际上只用了两个惯性环节,其时间常数分别为5000ms和2000ms。用与PID的采样周期相同的定时中断时间间隔来调用这个子程序。

下图是用来监视PID回路运行情况的STEP 7-Micro/WIN的PID调节控制面板,可以用它进行PID参数自整定或手动调节PID参数的实验。标有PV(即被控量)的是过程变量的阶跃响应曲线。

将上图中的积分时间由0.03min(分钟)增大到0.12min,下图的超调量有明显的减小。通过修改PID的参数,观察被控量阶跃响应曲线给出的超调量和调节时间等特征量的变化情况,可以形象直观、快速地学习和掌握PID参数的整定方法。 
STEP7如何使用多重背景数据块《PLC和变频器》 多重数据块是数据块的一种特殊形式,如在OB1中调用FB10,在FB10中又调用FB1和FB2,则只要FB10的背景数据块选择为多重背景数据块就可以了,FB1和FB2不需要建立背景数据块,其接口参数都保存在FB10的多重背景数据块中。建立多重背景数据块的方法是:在建立数据块只要在数据类型选项中选择“实例的DB”就可以了,见下例。 下面通过一例简单介绍一下多重背景数据块使用的一些注意事项和方法。 例如,PLC控制两台电机,且控制两台电机的接口参数均相同。一般的作法,我们可以编写功能块FB1控制两台电机,当控制不同的电机时,分别使用不同的背景数据块就可以控制不同的电机了(如第一台电机的控制参数保存在DB1中,第二台电机的控制参数保存在DB2中,我们可以在控制第一台电机调用FB1时以DB1为背景数据就可以了,第二台同样以DB2为背景数据块)。这样就需要使用两个背景数据,如果控制的电机台数更多,则会使用更多的数据块。使用多重背景数据块就是为了减少数据块的数量。 像这种情况,我们就可以利用多重背景数据块来减少数据块的使用量。拿本例来说,我们就可以在OB1中调用FB10,再在FB10中分别调用(每台电机各调用一次)FB1来控制两台电机的运转。对于每次调用,FB1都将它的数据存储在FB1的背景数据块DB1中。这样就无需再为FB1分配数据块,所有的功能块都指向FB10的数据块DB10。原理图如下:
 首先,我们需要先后插入一个功能块FB10和数据块DB10,DB10就为FB10的多重背景多重数据块。如下图:
 其次,需要在FB10中指定其所包含的背景数据块。方法如下:在FB10局部变量定义窗口中,在“STAT”变量区中(必须在此变量区中)为每台电机的控制取好名称后,数据类型选择FB <nr>,确认后,再把<nr>改为1,即功能块FB1。如果你在变量表中已经定义了FB1的符号,则会自动出现其符号名。地址一般由CPU根据FB1的接口参数数量自动计算得到,采用默认值就可以了。
 因为控制两台电机,所以需要在STAT中定义两个这样的变量。结果如下:
 经过以上步骤,FB的背景数据块DB10中就完全包含了1#和2#电机所需的数据,如下图,其中地址2.0~8.0是第一台电机的接口区控制参数,10.0~16.0是第二台电机接口区控制参数。
 这时,在FB10的指令列表中“多重实例”中就会出现已经添加的两个局部背景,如下图。

在程序中就可以分别调用这两个局部背景控制1号和2号电机了。程序如下:
 这样,就可以在OB1中通过调用OB10就可以分别控制1#和2#电机了。如下图:
 西门子S7-200PLC的RS485通信口易损坏的原因分析和解决办法 一、 S7-200PLC内部RS485接口电路图:电路图见附件 图中R1、R2是阻值为10欧的普通电阻,其作用是防止RS485信号D+和D-短路时产生过电流烧坏芯片,Z1、Z2是钳制电压为6V,最大电流为10A的齐纳二极管,24V电源和5V电源共地未经隔离,当D+或D-线上有共模干扰电压灌入时,由桥式整流电路和Z1、Z2可将共模电压钳制在±6.7V,从而保护RS485芯片SN75176(RS485芯片的允许共模输入电压范围为:-7V~+12V)。该保护电路能承受共模干扰电压功率为60W,保护电路和芯片内部没有防静电措施。

二、常发生的故障现象分析: 当PLC的RS485口经非隔离的PC/PPI电缆与电脑连接、PLC与PLC之间连接或PLC与变频器、触摸屏等通信时时有通信口损坏现象发生,较常见的损坏情况如下: ●R1或R2被烧断,Z1、Z1和SN75176完好。这是由于有较大的瞬态干扰电流经R1或R2、桥式整流、Z1或Z1到地,Z1、Z2能承受最大10A电流的冲击,而该电流在R1或R2上产生的瞬态功率为:102×10=1000W,当然会将其烧断。 ●SN75176损坏,R1、R2和Z1、Z2完好。这主要可能是受到静电冲击或瞬态过电压速度快于Z1、Z2的动作速度造成的,静电无处不在,仅人体模式也会产生±15kV的静电。 ●Z1或Z2、SN75176损坏,R1和R2完好。这可能是受到高电压低电流的瞬态干扰电压将Z1或Z2和SN75176击穿,由于电流较小和发生时间较短因而R1、R2不至于发热烧断。 由以上分析得知PLC接口损坏的主要原因是由于瞬态过电压和静电造成,产生瞬态过电压和静电的原因很多也较复杂,如由于PLC内部24V电源和5V电源共地,24V电源的输出端子L+、M为其它设备混合供电可能导致地电位变化,从而造成共模电压超出允许范围。所以EIA-485标准要求将各个RS485接口的信号地用一条低阻值导线连接在一起以保证各节点的地电位相等,消除地线环流! 当带电插拔未隔离的连接电缆时,由于两端电位不相等电路中又存在诸多电感、电容之类的器件,插拔瞬间必然产生瞬态过电压或过电流。 连接在RS485总线上的其它设备产生的瞬态过电压或过电流同样会流入到PLC,总线上连接的设备站点数越多,产生瞬态过电压的因素也越多。 当通信线路较长或有室外架空线时,雷电必然会在线路上造成过电压,其能量往往是巨大的,常有用户沮丧地说:“联网的几十台PLC全部遭打坏了!”。 三、 解决办法: 1、从PLC内部考虑: ●采用隔离的DC/DC将24V电源和5V电源隔离,分析了三菱、欧姆龙、施耐德PLC以及西门子的PROFIBUS接口均是如此。 ●选用带静电保护、过热保护、输入失效保护等保护措施完善的高挡次RS485芯片,如:SN65HVD1176D、MAX3468ESA等,这些芯片价格一般在十几元至几十元,而SN75176的价格仅为1.5元。 ●采用响应速度更快、承受瞬态功率更大的新型保护器件TVS或BL浪涌吸收器,如P6KE6.8CA的钳制电压为6.8V,承受瞬态功率为500W,BL器件则可抗击4000A以上大电流冲击。 ●R1和R2采用正温度系数的自恢复保险PTC,如JK60-010,正常情况下的电阻值为5欧,并不影响正常通信,当受到浪涌冲击时,大电流流过PTC和保护器件TVS(或BL),PTC的电阻值将骤然增大,使浪涌电流迅速减小。 2、从PLC外部考虑: ● 使用隔离的PC/PPI电缆,尽量不用廉价的非隔离电缆(特别是在工业现场)。西门子公司早期出产的PC/PPI电缆(6ES7 901-3BF00-0XA0)是不隔离的,现在也改成隔离的电缆了! ● PLC的RS485口联网时采用隔离的总线连接器. ● 与PLC联网的第三方设备,如变频器、触摸屏等的RS485口均使用RS485隔离器BH-485G进行隔离,这样各RS485节点之间就无“电”的联系,也无地线环流产生,即使某个节点损坏也不会连带其它节点损坏。 ● RS485通信线采用PROFIBUS总线专用屏蔽电缆,保证屏蔽层接到每台设备的外壳并最后接大地。 ● 对于有架空线的系统,总线上最好设置专门的防雷击设施。
找到了解决S7-200通讯口损坏的办法了
在我们单位众多的S7-200PLC中,不时有通讯口损坏,致使不能连接PC或不能进行通讯,在对PLC解体时发现,在PLC通讯口出有一芯片--75176,这就是通讯接口芯片,在芯片周围有5个FB,标识FB1~FB5,这其实就是5个保险,在通讯连不上时,一般就是这5个保险中的某个烧毁了,可用同等型号的保险代替,也可用导线直接短路。一般就能解决问题。不过更换时要注意,由于元件时贴片的,十分小,空间也小,所以焊接时注意不要短路。 西门子STL间接寻址常问问题集 1.1如何获得指针或者间接寻址有关的信息? 指针的类型包括16位指针、32位指针、Pointer(6Byte)和Any(10Byte)。16位指针用于定时器、计数器、程序块的寻址;32位指针用于I/Q/M/L/数据块等存储器中位、字节、字以及双字的寻址,其中第0~2位表示位地址(0~7)、第3~18位为字节地址,其余位未定义;Pointer和Any一般应用在复杂数据类型(比如Date_and_Time /Array/String等)在FB、FC之间的传递。而Any可以看做是对Pointer的延伸,因为由10Byte组成的Any中Byte4~Byte9就是一个Pointer。 了解指针的格式十分重要,为正确使用指针,应阅读如下内容: 1、 "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 参数类型 2、文档:1008用于S7-300 和S7-400 的语句表(STL)编程 3、文档:F0215,S7-300和S7-400寻址 1.2为什么语句 LAR1 P##PointerInput 在一个函数(FC)中是无效的,然而,同样的语句在一个功能块(FB)中是有效的? 在FC被调用时,复杂数据类型例如指针是被复制到调用者的临时变量区中,在FC内部对此V区地址直接取址放入到地址寄存器AR1或AR2是不被编译器规则接受的(导致MC7寄存器信息过长),也就是说在FC内部通过P#进行地址寄存器取址仅能支持Temp临时变量。因此如果需要在FC中操作指针等复杂输入输出变量地址需要使用累加器进行中转。 考虑到程序的一致性、遵守编译器规则和STL手册中LAR1指令说明,建议用户使用如下指令操作: L P##PointerInput LAR1 1.3 STEP 7 中哪些操作会覆盖DB/DI寄存器或者地址寄存器AR1/AR2的内容? 下面说明了可能引起DB/DI寄存器或者地址寄存器AR1/AR2内容改变的一些操作: - DB寄存器和AR1受到影响的操作
1. 使用完整的DB路径(如L DB20.Val)或者调用FC/FB时使用DB块完整地址作为其参数,则DB寄存器内容被覆盖。 例如在OB1中调用FC1后,DB寄存器变成20。 OPN DB1 Call FC1 Input(bit):DB20.DBX0.2 因此在编程的时候,OPN 指令打开数据块,通过DBX x.y的方式访问其中内容, 但是如果在打开数据块后DB寄存器的内容被修改了,则DBX x.y的方式访问变量则 会访问到错误的地址。可以通过使用符号寻址的方式或者使用完整路径编程避免,当 然重新使用 OPN指令也是可以的。 2. 调用FC时使用string, array, structure ,UDT作为其形参或者调用FB时使用string, array, structure 或者UDT作为其in out形参,在FC/FB程序中访问这些地址则AR1寄存器内容被覆盖,因此当使用AR1进行间接寻址时需要注意AR1内容的正确性。 - AR2地址寄存器和DI寄存器在FB中作为参数和静态变量的基址寻址使用。AR2和DI如果被修改,会影响FB的参数访问,如果希望在FB中使用DI寄存器或者地址寄存器AR2,必须预先保存它们中的内容,并在使用后恢复它们,例如:
TAR2 #AR2_SAVE; //AR2寄存器状态保存到#AR2_SAVE L DINO; T #DB2_SAVE; //DI寄存器状态保存到#DB2_SAVE User Program LAR2 #AR2_SAVE; //AR2寄存器恢复到使用前状态 OPN DI [#DB2_SAVE]; //DI寄存器恢复到使用前状态 1.4 如何得到多重背景FB中的变量在背景DB里的绝对偏移量呢? 可以用下面的方法处理: TAR2 (得到多重背景FB在背景DB里的偏移地址) AD DW#16#00FFFFFF (屏蔽掉存储区ID,可参考32位指针格式) L P##Variable (得到变量在多重背景FB里的地址) +D (多重背景FB的偏移地址与变量在多重背景FB里地址相加,即得到实际绝对偏移量) LAR1 上述语句就是就得到了变量在背景DB中的绝对偏移量,从而供后续程序处理。 1.5如何在程序中使用ANY 型指针? 简要说明如下: L P##Input //指向存储地址指针Input首地址 //这个参数是一个Any类型,P##Input指向参数Input的值所在地址,这就是指针的指针 LAR1 //装载到地址寄存器AR1中。 L W [AR1,P#4.0] //打开DB块 // 由Any类型结构知道Any类型的Byte4、Byte5存放的数据块号 T #BLOCK_NO OPN DB [#BLOCK_NO] //如果是DB块,打开指定的DB块。 L W [AR1,P#2.0] //判断ANY指针中数据长度 // Any类型的Byte2、Byte3是重复系数,如P#DB1.DBX0.0 Byte 8后面的Byte 8 _001:T #DATA_LEN //通常此处做loop循环!! L D [AR1,P#6.0] //找出需要计算数据区的开始地址 // Any类型Byte6~Byte9是32位区域地址 理解Pointer、Any的类型的数据结构,对于正确使用指针有很大帮助。 为正确使用指针,应仔细阅读如下内容: "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 参数类型 如下的程序实现了SFC20的部分功能,可以作为Any使用的参考。 FUNCTION FC 1 : VOID TITLE = VERSION : 0.1 VAR_INPUT SRCBLK : ANY ; END_VAR VAR_OUTPUT RETVAL : INT ; DSTBLK : ANY ; END_VAR VAR_TEMP LOOP : INT ; BLOCK_NO_DB : WORD ; BLOCK_NO_DI : WORD ; SRC_ADD : DWORD ; DST_ADD : DWORD ; END_VAR BEGIN NETWORK TITLE = L P##SRCBLK; //读取输入any的首地址 LAR1 ; //装载到ar1 L P##DSTBLK; //读取输出any的首地址 LAR2 ; //装载到ar2 L W [AR1,P#4.0]; //打开DB块 T #BLOCK_NO_DB; L W [AR2,P#4.0]; //打开DI块 T #BLOCK_NO_DI; OPN DB [#BLOCK_NO_DB]; //打开DB块 OPN DI [#BLOCK_NO_DI]; //打开DI块 L D [AR1,P#6.0]; T #SRC_ADD; //读取地址 L D [AR2,P#6.0]; T #DST_ADD; //读取地址 L W [AR1,P#2.0]; //读取循环次数 _001: T #LOOP; L DBB [#SRC_ADD]; T DIB [#DST_ADD]; //赋值 //地址偏移1个字节 L P#1.0; L #SRC_ADD; +D ; T #SRC_ADD; L P#1.0; L #DST_ADD; +D ; T #DST_ADD; L #LOOP; //循环 LOOP _001; END_FUNCTION 1.6 当FC 或FB的输入参数类型为:BLOCK_DB, TIMER或者 COUNTER,如何确定其编号? 例1 :FB 块 FB1 变量声明中定义了“ Timer” 类型的变量“ Time_1” ,在 FB2 中调用 FB1,将定时器“T5”传递给变量“ Time_1”。如图 01 所示程序代码中数值 5 表示“T5”。
图 01 FB中确定定时器编号 在使用多重实例时,需要在图 01 所示程序中增加以下代码: TAR2 //多重实例偏移地址 LAR1 P##Time_1 +AR1 //多重实例偏移地址与当前地址相加 L W[AR1,P#0.0] T MW0 例 2 FC FC1 变量声明中定义了“ Timer” 类型的变量“ Time_1” ,在 FC2 中调用 FC1,将定时器“T8”传递给变量“ Time_1”。如图 02 所示程序代码中数值 8 表示“T8”。
|