西门子6GK7243-1GX00-0XE0参数选型
西门子6GK7243-1GX00-0XE0参数选型
1 引言
随着PLC应用范围的不断扩大,PLC与PC之间通信技术的应用需求越来越广泛。通过PLC的编程口进行通讯不仅可以减少系统的成本及复杂性,同时可以减少PLC方面软件的复杂程度和编程量。本文根据实际工程中的经验进行总结,介绍了利用VC++中MFC实现PC与松下FP0系列PLC编程口进行串行通信的程序设计基本方法。
2 PC与FP0 PLC之间的通信协议和接口
在一个规模较大的纺织工业控制系统中,常常有几十个、几百个甚至更多的测温和控制对象。即使速度很高的系统,也很难满足要求。为了降低危险,提高可靠性,必须将任务分散,而分散的设备需要通过一定的手段连接起来,其中数据通信和系统互连是该系统的关键技术之一。松下FP0系列PLC具有较强的通信功能,可以适合各种工业自动化网络的不同需要, 其中包括以太网协议及通用接口、H型链接通信系统(H-bbbb)、P型链接系统(OPTICAL bbbb)、W型链接系统(WIRE-bbbb)和C-NET链接系统,还有远程I/O通信系统(REMOTE I/O),它们通过RS-485、RS-232或专用网络插座在PLC-PLC、计算机与PLC之间进行通信。但是要利用这些系统协议,必须采用专用通信单元,这势必增加系统的成本。为了节省开支,纺织工业系统可以直接采用松下电工基础的专用通信协议-NEWTOCOL。
NEWTOCOL分为两部分:一是NEWTOCOL-COM,即关于计算机通信的协议;二是NEWTOCOL-DATA,即关于数据传输协议。
2.1 NEWTOCOL-COM的帧格式
(1) 命令发送帧
(2) 正确响应帧
img]周奉磊-b2.jpg border=0>
(3) 错误响应帧
img]周奉磊-b3.jpg border=0>
2.2 NEWTOCOL-DATA的帧格式
(1) 命令发送帧
img]周奉磊-b4.jpg border=0>
(2) 正确响应帧
img]周奉磊-b5.jpg border=0>
(3) 错误响应帧
img]周奉磊-b6.jpg border=0>
通过该协议可更加快捷地传送系统所需的数据,设置PLC所需的参数。FP0 PLC与上位机链接通信协议如图1所示:
图1 FP0 PLC 与上位机链接通信协议
3 通信程序设计
在PC机和松下FP0系列PLC进行串行通信时,由于PC与PLC之间的信息传送是通过PLC编程口实现的,采用的是FP0 PLC专用协议通信指令。因此,在PC编程方面需要严格的遵循PLC编程口通讯协议。具体实现介绍如下:
3.1 串口设备的打开
在Visual C++中,利用MFC CFile类来实现串行通讯。这种通信方式与访问磁盘普通文件没有太大不同。打开串口设备需作以下操作:
CFile file;
CFileException e
File.open(
portName, // example "com1",com2"
CFile::modeReadWrite,
&e);
3.2 串口设备的初始化
串行端口创建时,必须对其进行设置以匹配与其对话的设备。FP0系列PLC的波特率为固定的9600bps,奇偶校验采用奇校验,1位停止位,8位数据位。一般地,可用如下程序设置它们:
DCB dcb;
::GetCommState((HANDLE)file.m_hFile,&dcb);
dcb.BaudRate=9600;
dcb.StopBits=1;
dcb.ByteSize=8;
dcb.Parity=1;
::setCommState((HANDLE)file.m_hFile,&dcb);
为了更好的控制端口可以利用SetCommTimeouts()函数打开或关闭串口超时功能,具体程序如下:
COMMTIMEOUTS cto;
::GetCommTimeouts((HANDLE)file.m_hFile,&ct0);
cto.ReadIntervalTimeout=0;
cto.ReadTotalTimeoutMultiplier=0;
cto.ReadTotalTimeoutConstant=0;
cto.WriteTotalTimeoutMultiplier=0;
cto.WriteTotalTimeoutConstant=0;
::SetCommTimeouts((HANDLE)file.m_hFile,&cto);
3.3 PC与FP0 PLC之间的通信实现
在FX2系列PLC与PC机的通信中,数据是以帧为单位发送和接收的。其中字符ENQ(0x05)、ACK(0x06)、和NAK(0x15)作为单个字符,可以构成单字符帧。若通讯正常,则应答字符$;若通信有错,则应答字符!。其余的字符在发送和接收时必须用字符%和CR分别表示该字符帧的起始标志和结束标志,否则将构成帧错。一个多字符帧由%、地址码、站号、数据、和校验以及CR五部分组成,其中和校验值是其初值为0,然后从起始符开始与该帧报文中每一字节按位进行异或运算得到。
(1) 应用MFC CFile类实现对串口设备的读、写操作的代码
//读串口
char m_Readbuff[UINT n];
uint nByte=file.read(
&m_ReadBuff, //缓存储冲
UINT nCount //所读字节数
//写串口
char m_WriteBuff[UINT n];
file.Write(
&m_WriteBuff, //存储缓冲
UINT nCount //缩写字节数
);
(2) PC机实现与PLC通信的程序代码
char m_WriteBuff[10];
char m_ReadBuff[10];
UINT nByte=0;
m_WriteBuff[0]=0x05 //ENQ
//写串口
file.Write(
m_WriteBuff, //存储缓冲
//所读字节数
);
//读串口
nByte=file.Read(
m_ReadBuff, //存储缓冲
//所写字节数
);
switch (m_ReadBuff[0])
{
case : 0x24 //应答$,通信正常
//添加相关处理代码
break;
case : 0x21
//应答!,通讯故障
//添加相关处理代码
break;
}
3.4 PC对PLC内各软设备进行读、写操作
FP0系列PLC的所有开关量输入、输出以及各软设备对PC机都是透明的,只有当PLC的计时器和计数器的设定值采用常数时,以及文件寄存器内的数据,PC机不能对其进行读写。不论PLC处在“STOP”状态还是“RUN”状态,PC机都可以按1.1所列的命令对PLC进行读、写操作。这里仅给出PC机与PLC通信所用多字符帧的格式及简单示例,实际应用时只需将多字符帧中的字符ASCII码(十六进制)按顺序赋予相应的字符数组
m_WriteBuff,m_ReadBuff,即可实现对PLC的操作。
(1) 读操作
img]周奉磊-b7.jpg border=0>
(2) 写操作
微机对PLC软设备进行写操作的多字符帧的编制格式如下表所示:
img]周奉磊-b8.jpg border=0>
PLC接收到写操作多字符帧格式后,若接收到数据有效,则应答$(0x24),该字符帧如下表所示:
img]周奉磊-b9.jpg border=0>
若接收数据无效或和校验出错,则应答字符!(0X21),该字符帧如下表所示:
img]周奉磊-b10.jpg border=0>
3.5 关闭串口设备
PC机与PLC通信完毕后,PC机关闭一个已打开的串口设备只需如下一条语句即可完成。
File.Close();
4 应用实例
以上介绍了利用MFC实现PC与FX2系列PLC串行通讯的基本方法及其关键部分程序代码。上面的程序代码为基础,不仅可以编制用于以PLC为现场主控机的监控系统软件,而且可编制出微机与其他具有串行通信能力设备的串行通信程序。本人已成功使用VC5.0实现PLC与上位机之间的通信,并应用于青岛大学纺织服装学院开发的掉毛量测试仪。该测试仪控制系统采用PLC 控制步进电机方案,有效地提高了工作效率,使操作人员通过PC的显示可以监测并控制仪器的工作。兔毛织物掉毛量测试仪已可靠运行一年,实践证明它具有控制灵活、使用简单、功能扩充方便、抗干扰性能强的特点。没有出现任何通讯连接的问题
能否为马达、阀门等功能块添加更多的状态,并在上位机上的block icon和faceplate中进行相应的显示?
答:可以,可以借助功能块的ustatus输入端来完成该功能。
pcs7库中的大部分功能块都有一个dword格式的“vstatus”输出管脚。该管脚包含了功能块当前各种状态信息(功能块在线帮助中详细解释了各位所代表的状态信息),通过相应的控件即可在上位机的画面上实时显示该功能块的各种状态。细心的人可能会发现,该管脚格式为32位的dword形式,而我们通过功能块的在线帮助却只能查询到vstatus的低16位的状态,那么高16位用来做什么用处的呢?
功能块有一个word格式的“ustatus”输入管脚,该管脚的注释是”status word in vstatus, can be configured user-specific”,也就是说ustatus是vstatus的一部分,可以用来进行用户自定义的状态输入,将其组合到vstatus中。如下图pic1所示,ustatus输入为16#1时,仿真motor回路的就地控制,输出vstatus为16#10200。ustatus被加入到vstatus的高16位中了。因此,通过ustatus输入管脚,我们可以为motor等功能块定制更多的状态。
pic1.motor回路ustatus示例
一般来说,我们通常使用某些功能块(motor,valve等)的vstatus状态返回值和智能图形对象”status display extend”来实现状态的上位机显示。 vstatus状态返回值是一个输出类型的32位状态字,其高16位为ustatus(数据类型为word)输入,低16位由相应的功能块类型决定。因此,当用户希望自定义的ustatus状态用status display extend功能显示出来时,只要知道其对应于vstatus的关系即可,ustatus的位对应vstatus的第17位,依此类推。
这里以motor块为例说明,我们希望给该电机一个现场就地/远程选择开关状态指示(1表示就地,0表示远程),此状态可由status display extend功能显示出来。 这里可以用ustatus低位代表,用status display extend功能显示出来;当然,其它位的状态设置方法类似。
√首先明确,用户定义的ustatus为16#0001时,vstatus的第17位(bit16)就对应于该位且值为1。
√为观察该电机vstatus的值,打开对应的picture,其中self_motor/1块标识为上面cfc块1(motor块)经os编译自动生成的的block icon。
pic2.motor的上位机图标
√在其下方添加一个status display extend对象,用于显示该电机就地/远程状态。
√打开其config diaglog属性,在general中定义bit为from statusword1,bit no.为16。
pic3. 设置status display extended
√为该状态位定义相应图片,即:电机为就地操作状态时由索引1连接的图形表示;远程操作状态由索引0连接的图形表示,如pic4所示。
pic4.设置相应状态的显示图片
√同时在其图形属性组态中,将属性status1 与self_motor.vstatus 标签连接,见pic5。 其中该位为1,表示就地状态时显示;0,表示远程状态时显示。
pic5.关联status1和相应的vstatus
注:这里定做了两个图形文件localc.bmp和remote.bmp(存放在;\winproject\;\gracs录下),表示1,0两种位状态对应的本地/远程控制状态。
√检查测试结果,由图1知道vstatus为16#10200表示其第17位1(即:ustatus低位的值);同时,参照前面给出的motor块vstatus低十六位定义表可知:低字16#0200表示qrun=1,qman_aut=0(手动),即:电机正以手动方式运行。
√运行该画面,该status display extend显示为1,表示该电机正处于就地状态,见pic6所示。
pic6.马达就地控制显示图标