1 引言
工业自动化通用组态软件-组态王软件系统与最终工程人员使用的具体的PLC或现场部件无关。对于不同的硬件设施,只需为组态王配置相应的通讯驱动程序即可。组态王支持的硬件设备包括:可编程控制器(PLC)、智能模块、板卡、智能仪表、变频器等等。
PLC以卓越的可靠性和方便的可编程性广泛应用于工业控制领域[1]。实现PC机和PLC通讯的目的是为了向用户提供诸如工艺流程图显示、动态数据画面显示、报表显示、窗口技术等多种功能,为PLC提供良好的人机界面。
本工程采用西门子公司的S7-200系列的可编程控制器[2],及上位工控机组成控制系统。上位机监控软件采用北京亚控科技发展有限公司的6.5“组态王”组态软件,实现对转辙机测试台的过程监控及数据处理。
2 系统简介
转辙机是铁路上常见的用于控制火车前进方向的设备。转辙机活动杆的伸出或者缩回决定火车不同的前进方向。
转辙机实时监控系统以组态王为主要运行画面,首先在组态王界面上对被监控系统的参数进行设置,然后起动被测的转辙机测试台,在组态王的界面上可以动态显示下位机的运行状态以及完成对多种电动直流转辙机各项电器性能指标的测试,如工作电流、工作电压、摩擦电流(故障电流)、转换力及转换时间(动作时间)等。由于组态王只提供这类西门子可编程控制器PLC的驱动程序,没有提供其通讯协议,因此,在功能并不很强大的组态王内部直接开发可编程控制器PLC的通讯协议是有较大难度的。一般采用的方法是:利用Visual Basic提供的串行通讯功能[3]、[4],实现与可编程控制器PLC之间的通讯,再利用 VB的DDE功能完成组态王与Visual Basic之间的动态数据交换。这样就把从可编程控制器PLC采集到的外部信号通过Visual Basic 间接动态的显示在组态王界面上。其系统结构如图1所示。
3 VB与可编程控制器PLC之间串行通讯的实现
带异步通讯适配器的PC机与PLC只有满足如下条件,才能互联通信[5]:带有异步通讯接口的PLC才能与带异步通讯适配器的PC机互联;双方采用的总线标准一致,否则要通过“总线标准变换单元”变换之后才能互联;双方的初始化、波特率、数据位数、停止位数、奇偶效验都相同。只有在对PLC的通讯协议分析清楚的情况下,严格的按照协议的规定及帧格式来编写PC机的通讯程序。PLC中配有通讯机制,一般不需要用户编程。
PC机与西门子PLC不能直接连接,要通过一条PC/PPI电缆进行RS232/RS485的变换,图2表示了它们之间的连接关系。
3.1可编程控制器PLC的通讯协议
设定可编程控制器PLC的通讯协议是通过对其自由端口的初始化来完成的。在自由端口模式下,通讯协议完全由梯形图控制。只有CPU处于RUN模式时,才能进行自由端口通讯。SMB30(用于端口0)和SMB31(用于端口1)用于选择波特率、奇偶校验和数据位数。自由端口的控制字节描述如下:
BBB 自由口波特率
000= 38400波特 100= 2400波特
001= 19200波特 101= 1200波特
010= 9600波特 110= 600波特
011= 4800波特 111= 300波特
PP 奇偶选择 MM 协议选择
00= 无奇偶校验 00= 点到点协议(PPI/从站模式)
01= 偶校验 01= 自由口协议
10= 无奇偶校验 10= PPI/主站模式
D 每个字符的数据位
0= 每个字符8位 1= 每个字符7位
这里选择的是SMB30(用于端口0),设置的字节为9(0 0001 001H),即:该协议为自由口协议,自由口波特率为9600,无奇偶校验,每个字符的数据位为8位。
发送 发送指令(XMT)激活发送数据缓冲区(TBL)中的数据。数据缓冲区的第一个数据指明了要发送的字节数。PORT指定了用于发送的端口。
XMT指令发送一个或多个字符,最多有255个字节的缓冲区。如果有一个中断程序连接到发送结束事件上,在发完缓冲区中的最后一个字符时,则会产生一个中断 (对端口0为中断事件9,对端口1为中断事件26)。XMT指令可以监视发送完成状态位SM4.5或SM4.6的变化,而不是用中断进行发送。
接收 接收指令(RCV)激活初始化或结束接收信息的服务。通过指定端口(PORT)接收的信息存储于数据缓冲区(TBL)。数据缓冲区的第一个数据指明了接收的字节数。RCV指令接收一个或多个字符,最多有255个字符,这些字符存储在缓冲区中。如果有一个中断程序连接到接收完成事件上,在接收到缓冲区中的最后一个字符时,则会产生一个中断(对端口0为中断事件23,对端口1为中断事件24)。可以监视SMB86或SMB186状态的变化,而不是用中断进行信息接收。
本程序展示了接收和发送的使用,它将接收一串字符,直到接收到回车符,信息又发回到发送方。
MAIN:
LD SM0.1
MOVB 16#9, SMB30 //选择9600波特率,8位数据,无校验
MOVB 16#B0, SMB87 //初始化RCV信息控制信息
MOVB 16#0A, SMB89 //设定信息结束为回车符
MOVW 5, SMW90 //设置空闲超时为5ms
MOVB 100, SMB94 //最大字符数为100
ATCH 0, 23 //接收完成事件连接到中断
ATCH 1, 9 //发送完成事件连接到中断
ENI //允许中断
RCV VB100, 0 //接收信箱缓冲区指向VB100
INT_0: INT_1:
LDB= SMB86, 16#20 LD SM0.0
MOVB 10, SMB34 DTCH 10
ATCH 2, 10 XMT VB100, 0
CRETI INT_2:
NOT LD SM0.0
RCV VB100, 0 RCV VB100, 0
3.2 VB的通讯协议
在VB中MSComm控件可以采用轮询或事件驱动的方法从端口获取数据[6]。这里采用的是事件驱动的方法。这种方法就是在一个事件发生的时候,让程序自动的跳到一段程序。该控件的Oncomm事件执行这个功能。Oncomm程序负责对诸如在串口的硬件中断或者一个软件缓存的计数器到达了一个触发值这样的事件时做出反应。
在VB中放置一个TextBox控件。通过设定其Settings、CommPort、InputMode、Handshaking、 PortOpen属性来实现设定VB的通讯协议。这里设定Settings属性为:9600,n,8,1,即:该协议的自由口波特率为9600,无奇偶校验,每个字符的数据位为8位。
4 VB与组态王软件数据交换的实现
VB与“组态王”之间通讯的实现主要是通过“组态王”提供的动态数据交换(DDE)来完成的。DDE是Windows平台上的一个完整的通信协议,它使应用程序能彼此交换数据和发送指令。DDE过程可以比喻成两个人的对话。提问的一方称为“顾客”(Client),回答的一方称为“服务器” (Server)。一个应用程序可以同时是“顾客”和“服务器”:当它向其他程序中请求数据时,它充当的是“顾客”;若有其他程序需要它提供数据,它又成了“服务器”。这里的关键是要实现的是“组态王”作为顾客程序从VB得到数据。
使VB成为“服务器”很简单,只需在“组态王”中设置服务器程序的三个标识名(应用程序名、主题名、项目名),并把VB应用程序中提供数据的窗体的 LinkMode属性设置为1,不必在VB中增加任何程序。值得注意的是,将VB的FormTopic的属性,设定成和在组态王中定义DDE设备时的“话题名”一样;在组态王定义要显示出指定的VB可执行文件中指定的TextBox控件的值。
5 结束语
当系统开始运行前,要求首先运行VB的可执行文件作为后台运行程序,然后才能运行组态王系统。当可编程控制器PLC发送数据的时候,由VB接受到此数据,再通过组态王提供的DDE功能,将该数据显示到组态王界面上。这样,就把从可编程控制器PLC采集到的外部信号通过VB间接动态的显示在组态王界面上。
该方法实现了组态王对西门子系列PLC的实时监控。经过测试可知,系统的实时响应速度能达到ms级,并且这种实现系统实时监控的方法可移植性强,对于监控其他类型的可编程控制器PLC或单片机也适用。