• 6ES7321-1CH20-0AA0性能参数
  • 6ES7321-1CH20-0AA0性能参数
  • 6ES7321-1CH20-0AA0性能参数

产品描述

产品规格模块式包装说明全新品牌西门子

6ES7321-1CH20-0AA0性能参数


1 引言

提高连铸自动化水平,对保证铸坯质量、提高连铸机的劳动生产率、增加连铸机的金属收得率起着至关重要的作用。为了提高产品的市场竞争力以及与世界接轨,某炼钢厂于1999年新上两台8流方坯连铸机。这种连铸机一次可拉出8条钢坯,成材,是世界冶金生产的发展方向。由于该连铸机流数多,设计拉速高,生产场地狭小,如果由人工手动控制生产流程,容易造成铸坯输送不畅,这一问题在短铸坯生产中尤为严重。因此,在连铸生产过程中实现全自动控制非常重要。
2 控制对象及控制任务
连铸电气控制系统由公用PLC和流用PLC两部分组成。公用PLC的控制对象包括拉矫液压站、推钢机及步进式翻转冷床。其中,拉矫液压站的控制包括油泵启/停控制、电磁溢流阀得电/失电控制、油箱油温控制以及液位高低限和油泵起动故障的声光报警;对于推钢机及步进式翻转冷床,主要是控制推钢机的前进/退回及冷床的正反转及启/停动作。流用PLC的控制对象为引锭杆、火焰切割机、辊道及翻钢机,主要控制自动送引锭过程、切割机全自动/半自动切割、输送辊道启动/停止、翻钢机翻起/退回以及翻钢活动挡板的升/降动作等。

3 控制系统的硬件组成

连铸电气控制系统的上位机采用两台研华工控机,下位机采用18套西门子S7-300 PLC,分别完成两台连铸机公用设备和流用设备的控制任务。
公用PLC采用CP314*处理单元,由接口模板IM360和IM361实现*机架和扩展机架之间的数据传送,由 CP342-5通讯模板建立S7-300 PLC与Profibus-S7网络的联接。I/O模块为9块SM321-1FF数字输入模块及6块SM322-1HF数字量输出模块。流用PLC设计为一套PLC单独控制*生产设备,其构成与公用PLC 的不同之处在于:(1)流用PLC使用2个扩展机架;(2) I/O模块为10块SM321-1FF、1块SM321-1BH和9块SM322-1HF。

两台连铸机的控制硬件组成完全相同,图1为一台连铸机的电气控制系统PLC硬件配置图。



4 控制系统的设计策略

4.1 拉矫液压站

拉矫液压站为自动工作方式时,首先进行工作油泵的选择。当系统压力≤5.5Mpa时,工作油泵启动,经过1分钟延时后相应的电磁阀得电,油泵向系统供油;当系统压力≥7Mpa时, 电磁阀失电,油泵停止供油。为了**异常状况时的设备安全,在油泵和电磁阀的控制回路中串入了油箱液位低限信号,以保证在管路严重泄漏而造成低液位报警时,延时一段时间后系统自动关闭油泵和电磁阀。此时,不但在拉矫液压站进行声光报警,而且相应的报警信息也将显示在上位机的监控画面中。

4.2 自动送引锭过程

自动送引锭过程的控制主要是引锭杆存放电机和拉矫机的运转/停止以及拉矫辊和脱矫辊的自动抬起/压下。在连铸生产中要切实保证操作的安全,这一点在引锭杆工作过程的控制中尤为**,因为如果引锭杆控制不当,不但会导致巨大的经济损失,严重的还会危及人身安全,因此在程序设计中采用了限位开关和时间联锁的双重控制方案,即在正常情况下,由限位开关完成设备的控制;如果限位开关发生故障,则由计时器实现控制功能,从而确保了控制的可靠性和操作的安全性。

4.3 铸坯切割过程

在自动工作状态下,铸坯切割分为全自动和半自动两种方式。全自动方式的切割指令为定尺仪发出的定尺信号;半自动切割方式为当铸坯达到定长时,人为发出切割指令。在接收到切割指令后,抱夹缸电磁阀及预热燃气、预热氧、切割氧电磁阀分别得电,切割机开始进行铸坯切割。当铸坯切断后,上述电磁阀一并失电,回程缸电磁阀得电,切割机返回至初始位置。经延时后回程缸电磁阀失电。至此,铸坯的自动切割过程结束。

4.4 辊道输送及翻钢过程

辊道输送系统包括剪前I组辊道、剪后II组III组辊道及冷床IV组辊道。在冷床IV组辊道上,按铸坯输送方向依次布置了1#~3#控制挡板及1#~3#活动挡板。剪前I组辊道主要用于连铸浇钢结束时的尾坯处理,在程序中仅做正反转互锁设计。因此,该部分的控制对象是剪后II组、III组辊道、冷床IV组辊道及翻钢机,而且生产铸坯的长度不同,程序设计亦有所不同,即12米长铸坯的输送及翻钢控制仅使用3#控制挡板及1#活动挡板的动作信号, 3.2米短铸坯的辊道及翻钢控制设计则需要使用1#~3#控制挡板及1#~3#活动挡板的动作信号。

4.5 推钢机

推钢机的工作行程由主令控制器的推钢接点和退回接点控制,其控制设计主要基于安全联锁方面的考虑:(1)步进式翻转冷床工作时,禁止推钢机推钢;(2)为了避免推钢机动作时推头与正在翻钢过程中的翻钢机冲突,在推钢机进行推钢时,翻钢机禁止翻钢;(3)推钢机完成一个推钢周期后,解锁对翻钢机的动作封锁,翻钢机可以进行下一个翻钢过程。

4.6 步进式翻转冷床

步进式翻转冷床的反转一般仅用于缩短冷床上铸坯的存放间隔,冷床的正转动作则可以实现铸坯输送。冷床的正反转停止动作由安装在减速机轴上的主令控制器的正反转接点进行控制。由于停止在上齿位的冷床会阻碍推钢机的推钢操作,因此要保证冷床停止时停在下齿位,这一控制任务通过精确调整主令控制器接点来实现。

冷床处于自动工作方式时,如果冷床在推钢机退回后马上动作,则会与推钢机发生碰撞,造成设备损坏,所以,程序中设计推钢机退回动作一段时间后,冷床方可连续正转。另外,应根据冷床电机转速、减速机减速比及主令控制器减速比等技术参数精确计算冷床正转动作时间,以确保冷床连续正转8周,从而完成一次较多8根铸坯的输送工作。程序设计还保证了主令接点的闭合动作将立即停止冷床,从而避免了在控制冷床停止时,电机的惯性造成主令接点旋即打开从而使得冷床继续动作而无法停下来的情况。



5 结束语

连铸系统的控制要点及难点主要有两个方面:(1)确保操作安全。如前所述,在引锭杆的控制中着重考虑了这一点,因此在程序设计中采用了限位开关和时间联锁的双重控制方案,即在正常情况下,由限位开关的动作控制引锭杆存放电机停止;当限位开关失灵时,则由计时器完成这一功能,从而确保了控制的可靠性。S7-300 PLC功能齐全的计时器指令为这一功能的实现带来设计上的便利。(2)各部分之间存在着复杂的联锁关系。如必须在闭锁现场操作箱和平台操作箱的前提下才能在操作台进行自动送引锭操作,而当引锭杆工作方式转为手动时,应该自动解除对现场操作箱和平台操作箱的操作闭锁;又比如,为了避免推钢机推头动作时与正在翻钢过程中的翻钢机冲突,在翻钢机的控制中,设计了翻钢机翻钢后的动作自锁和推钢机完成一个推钢周期后对翻钢机的操作解锁。诸如此类的复杂联锁关系还有很多,在此不作一一赘述。借助于S7-300 PLC的闭锁及解锁指令可以很方便、灵活地实现这些复杂的联锁任务,从而确实保证了控制的严谨与可靠。

另外,S7-300 PLC丰富的网络功能可以充分满足不同控制系统的需求。S7-300 PLC既有快速响应远程I/O的Profibus-DP网络,又有采用西门子内**化协议─S7 functions 协议的Profibus-S7网络,等等。在该系统中,由于公用PLC与流用PLC在控制功能上相对独立,而且彼此之间需要互相传送数据,因此不宜于采用主从方式的DP 网络结构,故采用了Profibus-S7网络。公用PLC与流用PLC的CP314*处理单元均由CP342-5模块建立与网络的连接,因此,2台公用PLC、16台流用PLC及2台上位机均为Profibus-S7上的主站,各站之间的通信由FDL(fieldbus data bbbb)完成,通过FDL便利的连接组态和简单的编程工作,很容易地实现了连铸控制系统的要求。

实践证明,该系统设计合理,,减轻了工人的劳动强度,提高了生产效率,为唐钢取得良好的经济效益以及通过产品结构调整增强市场竞争力提供了技术上的**。同时也充分地表明,西门子S7-300 PLC在唐钢连铸电气控制系统中的应用是非常成功的。


202202221739073128824.jpg202202221739072455394.jpg


口不适用于C#,因此我们可以创建一个C#类库,把这些函数进行封装,每次开发监控界面调用此类库即可。

一、 C#中调用DLL库的方法

1、 在名称空间之前使用:
using System.Runtime.InteropServices; //用于调用动态库的接口,一定要引用
2、 导入每一个库函数,均要在函数声明之前使用属性字段:
[DllImport("w95_s7.dll")]
譬如与PLC建立连接的库函数load_tool(),应使用如下的方式进行声明:
[DllImport("w95_s7.dll")]
private extern static int load_tool(byte nr,bbbbbb device,byte[,] adr_table);

二、 ProDave中的重要库函数介绍

1、 与PLC建立通讯连接的库函数:load_tool()
该函数必须在其他所有函数调用之前被调用,在C中的声明为:int load_tool(int nr,char* device,char* adr_table);由于C#在安全模式下不容许使用指针,因此我们把它转换成C#模式:
private extern static int load_tool(byte nr,bbbbbb device,byte[,] adr_table);
参数 nr: *连接号1-4,一般设为1
device: 设备名称,西门子的示例是设为"s7online",测试时,若改成其他名称好像连不上。
adr_table: 一个二维数组,*一系列连接参数,依次为:MPI地址、保留为0、CPU槽号、CPU机架号。在一个MPI网络中若有多个CPU时,可*一个以上的连接列。最后一列的参数的MPI地址应制定为0,以标志参数列结束。
e.g.一个MPI网中有两个CPU,他们的MPI地址分别为2和3,槽号均为2,机架号均为0,则可按如下方式调用: byte[,] bt={{2,0,2,0},{3,0,2,0},{0,0,0,0}};
int err=load_tool(1, "s7online",bt);
注:ProDave中的所有库函数均返回整数数据,为0表示调用该函数成功,为其他十进制数时,可以查找西门子文档,看是什么错误。
可以看出,上面的函数不利于我们使用,我们可对他进行封装:
<1>、在类之前声明用于传递参数列表的结构:
#region 定义与外部联系的结构变量
///
/// 定义MPI链接参数
///
public struct ConnectionInfo{
///
/// 定义CPU的MPI地址
///
public byte Addres;
///
/// 定义CPU的机架号
///
public byte Rack;
///
/// 定义CPU的槽号
///
public byte Slot;
}
#endregion
<2>、编写实现上述功能的公有方法:
#region 与动态库函数相对应的公开函数
///
/// 建立连接,同一个连接只容许调用一次
///
/// 连接号1-4
/// *链接参数
/// 返回10进制错误号,0表示没有错误
public static int Open(byte cnnNo,ConnectionInfo[] cnnInfo){
int err;
//传递参数不正确
if(cnnInfo.Length<=0){
return -1;
}
byte[,] btr=new byte[cnnInfo.Length+1,4];
//转换链接表
for(int i=0;i btr[i,0]=cnnInfo[i].Addres;
btr[i,1]=0;
btr[i,2]=cnnInfo[i].Slot;
btr[i,3]=cnnInfo[i].Rack;
}
btr[cnnInfo.Length,0]=0;
btr[cnnInfo.Length,1]=0;
btr[cnnInfo.Length,2]=0;
btr[cnnInfo.Length,3]=0;
//调用初始化函数
err=load_tool(cnnNo,"s7online",btr);
return err;
}

#endregion

这样,我们需要打开连接时,可以使用如下方式:
ConnectionInfo[] cnn=new ConnectionInfo[2];
Cnn[0] .Addres=2;
Cnn[0].Slot=2;
Cnn[0].Rack=0;
Cnn[1] .Addres=3;
Cnn[1].Slot=2;
Cnn[1].Rack=0;
int err=Open(1,Cnn);
2、 断开连接的unload_tool()函数
该函数与load_tool()正好相反,用于断开与PLC的连接,一般在退出组态软件之前调用,该函数没有参数,C#声明方式如下:
private extern static int unload_tool();
3、 某一个连接的函数new_ss()
该函数用于设定与MPI网中的哪一个CPU通讯,其参数与load_tool中的参数adr_table所传递的连接参数顺序对应,譬如针对上例:new_ss(1)则**个连接,即与MPI地址为2的PLC通讯,类似的new_ss(2)则与MPI地址为3的PLC通讯。若的连接在MPI网中没有,则返回错误号517。 C#声明方式如下:
private extern static int new_ss(byte no);
4、 读取PLC中的M字节的函数在C#中声明方式如下:
private extern static int m_field_read (short no,short anzahl,ref long buffer);
参数 no : *M字节号,譬如要读取MB10的值,则*no等于10
Anzahl :*读取的字节数,譬如需要读取MB10至MB14之间的值,则可*为5
Buffer : 返回获取的值,这是一个十进制的值,如果需要获取某一个M位的状态,需要把它转换成二进制,后面有介绍。
5、 向PLC中的M字节写入值在C#中声明方式如下:
private extern static int m_field_write(short no,short anzahl,ref long buffer);
参数 no和anzahl与m_field_read的一样,而buffer*的是向PLC中写入的值。
例如:向MB15中写入值3,即将m15.0和m15.1强制为1,可调用函数如下:
int err= m_field_write(15,1,3);

三、 ProDave中的其他一些函数的C#声明方式如下:

///
/// 读取Output值
///
/// *号
/// *有多少个字节需要读出
/// 返回读出的值
///
[DllImport("w95_s7.dll")]
private extern static int a_field_read (int no,int anzahl,ref long buffer);
///
/// 向Output写入值
///
/// *号
/// *有多少个字节需要写入
/// *写入值
///
[DllImport("w95_s7.dll")]
private extern static int a_field_write (int no,int anzahl,ref long buffer);
///
/// 获取PLC的运行状态
///
/// 返回0或者1,0表示Run;1表示Stop或者Restart
///
[DllImport("w95_s7.dll")]
private extern static int ag_zustand (ref byte buffer);
///
/// 测试*的DB块是否存在
///
/// 返回一系列块的存在状态,=0不存在,!=0存在
///
[DllImport("w95_s7.dll")]
private extern static int db_buch (ushort[] buffer);
///
/// 从DB中读取数据
///
/// *DB块号
/// *读取的起始字序号,=0表示DBW0,=1表示DBW2
/// *读取的对象有多少个字
/// 返回值
///
[DllImport("w95_s7.dll")]
private extern static int db_read(int dbno, int dwno, ref int anzahl, ref long buffer);
///
/// 向DB中写入数据
///
/// *DB块号
/// *写入的起始字序号,=0表示DBW0,=1表示DBW2
/// *写入的对象有多少个字
/// 写入值
///
[DllImport("w95_s7.dll")]
private extern static int db_write(int dbno, int dwno, ref int anzahl, ref long buffer);

///
/// 读取bbbbb的值
///
/// *IB号
/// *有多少个IB字节需要读出
/// 读取返回的值
///
[DllImport("w95_s7.dll")]
private extern static int e_field_read (int no,int anzahl,ref long buffer);
///
/// 获取MB变量的位状态值
///
/// *M字节号
/// *位号,范围为0-7
/// 返回值,>0表示该位为1,=0表示该位为0
///
[DllImport("w95_s7.dll")]
private extern static int mb_bittest(short mbno,short bitno,ref short retwert);
///
/// 复位MB变量的位状态
///
/// *M字节号
/// *位号范围为0-7,
///
[DllImport("w95_s7.dll")]
private extern static int mb_resetbit (short mbno,short bitno);
///
/// 置位MB变量的位状态
///
/// *M字节号
/// *位号,范围为0-7
///
[DllImport("w95_s7.dll")]
private extern static int mb_setbit (short mbno,short bitno);
每一个函数都有详尽的注释,我这里就不详细的介绍。

四、 编写自己的函数,使开发软件易于实现

1、 ProDave中除了M变量有对位的操作函数外,其他的要么是对字节操作,要么是对字操作,因此有必要编写函数提取字或者字节中的位状态信息。下面是我编写的一个函数,它可以从一个*的整数中提取一个位状态。
///
/// 获取整数的位状态
///
/// 传送过来的整数
/// 转换成二进制后,*的第几位,0表示由右至左的较右边的**位,范围为0-31
/// 返回*的位状态,true表示为1,false表示为0
public static bool GetBit(int data,int bitNo){
int[] bta=new int[1];
bta[0]=data;
System.Collections.BitArray myBA =new System.Collections.BitArray(bta);
return myBA.Get(bitNo);
}
例如:现在需要读取Q15.0的状态值,可以如下编程:
long val=0;
int err= a_field_read (15,1,ref val);
bool stau= GetBit(int.Parse(val),0); //stau即为Q15.0的值

当然,我们可把该函数进行重载,可以返回整个字节、字或者双字的每一个位的状态值,下面是我编写的另一个扩展函数:
///
/// 根据给定的32位整数,返回这32位中每一位的状态值
///
/// *32位整数
/// 返回表示每一位状态信息的数组
public static bool[] GetBit(int data){
bool[] stau=new bool[32];
int[] bta=new int[1];
bta[0]=data;
System.Collections.BitArray myBA =new System.Collections.BitArray(bta);
for(int i=0;i<32;i++){
stau[i]=myBA.Get(i);
}
return stau;
}
例如:现在需要读取QW14的所有位的状态值,可以如下编程:
long val=0;
int err= a_field_read (14,2,ref val);
bool[] staus= GetBit(val);
然后staus[0], staus[1], staus[2]…分别对用Q15.0,Q15.1,Q15.2的值

2、 针对函数调用时的错误信息进行编码。
西门子提供的错误信息是英文的,我们可以把它翻译成中文,并存入字典,当需要获取错误信息时,可以通过调用函数时返回的错误码进行索引。
<1>、首先在类中声明 private static bbbbtable errbbbb;
<2>、在类的构造函数中编程进行错误信息的初始化:
static S7MPI(){
#region 初始化故障信息
int code=0;
errbbbb=new bbbbtable(213);
errbbbb.Add(code,"执行成功");
code=202;
errbbbb.Add(code,"没有可用资源");
code=203;
errbbbb.Add(code,"配置错误");
code=205;
errbbbb.Add(code,"非法调用");
code=206;
errbbbb.Add(code,"没有发现模块");
. . .
#endregion
}
<3>、然后编写一个错误索引函数
///
/// 根据提供的错误码返回错误信息
///
/// 错误码
/// 返回错误信息
public static bbbbbb GetErrInfo(int errCode){
bbbbbb val=errbbbb[errCode];
if(val!=null)
return val.Tobbbbbb();
else
return "没有相关的错误信息";
}
<4>、调用函数时则可以使用如下编程方式:

int err=new_ss(1);
sring errorInbbbbation= GetErrInfo(err);

五、 编写软件需要注意的问题

1、 一定要设定与PLC的通讯周期,比如500ms,则可以使用一个定时器,把触发时间设为500MS,在其触发事件中可以编写程序,把当前监控界面中用到的所有PLC变量进行一次性读取或者写入,不要在程序的不同地方进行零散的读写,这样会影响读写数据的一致性,导致的结果就是,一个监控画面中用到的PLC变量不是在一个PLC扫描周期内读写的。

2、 对PLC变量进行写入时,不需要周期性的写入,写一次即可,当用户需要再次改写变量时,可编写一个按钮程序,每改一次值,按一下按钮,然后程序才把值送入PLC,这样也可以提高性能。

3、 向PLC中写入的变量,一定不要和PLC的写变量重复,譬如,PLC编程那边有对M5.0的置位操作,则监控程序这边就不能再对M5.0进行写操作。


http://zhangqueena.b2b168.com

产品推荐