内容发布更新时间 : 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