利用VB实现PLC与PC机的通讯 下载本文

内容发布更新时间 : 2024/11/17 12:55:15星期一 下面是文章的全部内容请认真阅读。

利用VB实现PLC与PC机的通讯

【摘 要】本文详细介绍了FX-2N系列PLC的通信协议,并以VB为开发工具设计界面以及接收数据从而实现了PC机与FX-2N系列的PLC的串行通讯。在生产中可利用VB的可视化特性,采用串行通讯的方式,对整个装置的运行情况进行实时监控,达到随时掌握现场情况的目的。

【关键词】PLC;自动控制;串行通讯;VB

0 引言

目前,PLC在国内外已广泛应用于钢铁、石油、华工、电力、建材、机械制造、汽车、轻纺、交通运输、环保及文化娱乐各个行业。在工业用途中,液体混和装置常常会用于会用于各种场合。PLC以卓越的可靠性和方便的可编程性广泛应用于工业控制领域。实现PC机与PLC通信的目的是为了向用户提供诸如工艺流程图显示、动态数据画面显示、报表显示、窗口技术等多种功能,为PLC提供良好的人机界面。PLC与计算机通信是PLC通信中最简单、最直接的一种通信方式。与PLC通信的计算机称之为上位计算机,PLC与计算机之间的通信又叫上位通信。PLC与计算机通信主要是通过RS-232C或RS-422接口进行的。计算机上的通信接口是标准的RS-232接口;若PLC上的通信接口也是RS-232C接口时,PLC与计算机连接是可以直接使用适配电缆进行连接,实现通信。本课题便也是采用这种方法进行连接的。

1 硬件连接

PC机与FX系列的PLC可经过FX2N-232-BD 通讯模块连接,下图表示它们之间的连接关系:

图1 硬件连接

2 FX系列PLC的通讯协议

(1)数据格式

FX系列的PLC采用异步格式,由1位起始位、7位数据位、1位偶检验位及1位停止位组成,波特率为9600bps,字符为ASCII码。格式如下:

(2)通讯命令

FX 系列PLC有4个通讯命令,它们是读命令、写命令、强制通命令、强制断命令,如表所示。表中X-输入继电器;Y-输入继电器;M-辅助继电器;S-状态元件;T-定时器;C-计数器;D-数据寄存器。

(3)通讯控制字符

FX 系列PLC采用面向字符的传输规程,用到5个通讯控制字符,如表所示:

(4)报文格式

PC机向PLC发送的报文格式如下:

报文格式

其中STX为开始标志:02H;ETX为结束标志:03H;CMD为命令的ASCII码:SUMH,SUML为从CMD到ETX按字节求累加和,溢出不计。由于每字节十六进制数变量变为两字节的ASCII码,故检验和为SUMH与SUML。

数据段格式与定义如下:

数据格式

写命令的数据段有数据,读命令的数据段则无数据。

读/写字节数为01H-04H(1-64)个。

PLC向PC几发送的应答报文格式如下:

应答报文

对读命令的应答报文数据段为要读取的数据,一个数据占两个字节,分上下位。

对写命令的数据报文无数据段,而用ACK及NAK作为应答内容。

(5)传输过程

PC机与FX系列PLC之间采用应答方式通讯,传输出错则组织从发。其传输过程如下:

PLC根据PC机命令,在每个循环扫描结束处的END语句后组织自动应答,无需用户在PLC一方编写。

3 PLC内部通用寄存器的地址

PLC中通用数据寄存器共有200个,分别是D0~D200。因为通讯程序中需要传送PLC中的寄存器数据,因此需要知道通用寄存器的物理地址。PLC中通

用寄存器的物理地址是这样分布的:D0的物理地址为1000,以后每个寄存器占用2个地址的单元,直至D200的物理地址1190为止。本程序中用到的寄存器有两个,分别是D123(10F6)和D200(1190)。

4 VB控件的使用

在计算机的右下角的[开始] [程序][Microsoft Visual Basic 6.0中文版]中选择Microsoft Visual Basic 6.0命令。VB中有许多选项,在不同的目的下必须选择不同的开发工程,通常我们选择[标准EXE]作为开发的工程,这类工程被开发出来后可以编译成窗口环境下的执行文件,并且可以做成安装程序,安装到其他计算机上执行。

打开Visual Basic后发现在工具箱中只有一些默认的控件,在VB通讯事件中我们必需用到MSComm控件,这就需要用到部件的引用。打开[工程][部件]后,在控件选项中选择“Microsoft Comm Control 6.0”工具栏中就会出现我们需要的控件了。如图2所示。

5 结束语

以上就是程序的初始过程,针对不同的数据量情况还要进行更多的设置改变,在这里就不一一说明了。这种通讯方式非常简便易行,并且在可视化的框架内可对各种设备进行远程操控,十分有利于工控设备的运行。

附上控件初始化所需程序代码:

MSComm1.Portopen=False

MSComm1.commport=2 MSComm1.InBufferSize = 1024

MSComm1.OutBufferSize = 1024

MSComm1.InputLen = 0

MSComm1.Settings = “9600,E,7,1”

MSComm1.InputMode = comInputModeText

MSComm1.Handshaking = comNone

MSComm1.PortOpen = True

MSComm1.InBufferCount = 0

MSComm1.OutBufferCount = 0