VC下实现基于Modbus协议的DCS与远程I/O系统通信 |
摘 要:本文在分析Modbus协议及其通信原理的基础上,结合工程实际,提出了一种在工业PC机上实现串行通信的方法,并在Visual C++6.0环境下开发了通信的应用程序,实现了基于Modbus协议的DCS与远程I/O系统通信。 关键词:Modbus协议; DCS; 远程I/O; 串行通信 1 引言 近年来随着工控领域自动化水平的大幅提高,许多厂、矿企业原有的控制系统陆续开始各种软硬件的升级和改造。改造过程中,数据通信的合理、可靠关系到现场一系列大型设备的安全。由于整个工程往往由不同的单位分别完成,各部分之间的整合性必须得到保证,因此工业控制系统中常使用标准的协议进行接口通信。 Modbus协议 是一种工业通信和分布式控制系统协议,由MODICON公司出品,现已被众多的硬件生产厂商所支持并广泛应用于工业控制领域。DCS即集散控制系统,是以微处理器为核心的操作显示集中、控制功能分散的工业控制系统。安全可靠的性能和成熟的使用技术使得DCS广泛地应用于电力、冶金、石油化工、造纸、制药等行业。 陕西某电厂改扩建工程包括两部分系统:DCS,远程I/O数据采集系统。这两部分之间采用Modbus协议进行接口串行通信 。 2 Modbus通信协议 2.1 协议简介 Modbus是一种主从网络,允许一个主机(Master)和一个或多个从机(Slave)通信,支持两种有效的传送方式 :RTU(Remote Terminal Unit,远程终端装置)和 ASCII(美国标准信息交换码)。两种方式的命令格式是相同的,采用何种方式取决于对通信速度的要求。要求速度快的要用RTU方式,而对通信速度要求不高的可用ASCⅡ码方式。协议的内容主要包括寄存器读写、开关量I/O等命令的格式。 本项目工程通信要求采用RTU方式,以下介绍、分析的命令格式均为标准的Modbus协议格式,所用的数据示例均引自工程中的应用实例。 2.2 主、从机命令格式 主机和从机之间采用查询与应答方式进行通信,每一种查询命令报文都对应着一种应答报文。主机发出的查询命令报文格式如表1所示: 表1 主机查询命令报文格式 地址码“02”表示主机要求查询02号从机,功能码“04”表示主机要求读保持寄存器操作,起始数据“00 00”表示从第1个数据开始读,数据长度“00 40”表示要求读取64个模拟量数据。 CRC校验码:即循环冗余校验码,当本机计算得的CRC码与接收到的CRC码一致时 方认为命令校验正确并进行操作,否则返回出错信息或放弃此命令。具体参见下文2.3。 从机接收到表1所示命令时的正确信息应答报文格式如表2所示: 表2 从机应答命令报文格式 表中“02、04”如前所述,“80”为从机发送数据的字节个数,即数据共发送了128个字节(64个数据);“00 10 … 01 3A”为第1~64个数据的高、低字节值。 从机应答命令中的地址码、功能码必须与主机查询命令相同;命令中的模拟量数据必须按高位字节在前、低位字节在后的顺序放置,而CRC码与此相反,是低位字节在前、高位字节在后。 如果发生错误或异常,从机将返回主机出错命令,格式如表3所示: 表3 从机返回出错命令报文格式 “84”是与主机查询命令中功能码“04”相对应的出错功能码,出错码“03”表明主机查询命令中的“数据长度”项有错,例如超出了最大数据量等。 在其他工程应用中,Modbus协议的各种功能码、出错码的含义及其具体选择、使用可参见参考文献[1]。 2.3 错误检测方法 标准的Modbus协议串行通信网络采用两种错误检测方法。一是奇偶校验,对每个字符都可用;二是帧检测(CRC 或LRC),应用于整个命令报文。 RTU方式下帧检测采用的是CRC校验,方法是先调入一值是全“1”的16位寄存器,然后调用一过程对命令中连续的8位字节各当前寄存器中的值进行处理 。最终寄存器中的值,就是命令字符串中所有的字节都执行之后的CRC校验码值。 下面给出Visual C++ 6.0下CRC校验码计算函数: WORD CRC_Calc (PBYTE buf, UINT num) { UINT i, j; WORD temp, crc = 0xFFFF; for ( i = 0; i < num; i ++){ temp = buf[ i ] & 0x00FF; crc ︿= temp; for ( j = 0; j < 8; j ++){ if ( crc & 0x0001) {crc >>= 1;crc ︿= 0xA001;} else crc >>= 1; } } return crc; } 计算得的CRC校验码添加到命令中时,必须按低位字节在前、高位字节在后的顺序放置。例如,对表1所示的主机查询命令调用计算函数得到其CRC码为C9F1,则命令中最后两个字节是F1、C9。 3 硬件构架 系统中通信网络采用点对点方式,即网络中只有一台主机和一台从机。将一台工业PC机模拟PLC作为从机(远程I/O数据采集系统),采用RS-485信号与DCS主机进行串口通信。通信的模拟量参数为#1机组217点、#2机组217点和公用部分48点,共计三个数据块482点。 系统的硬件实现如图1所示: 主机、从机之间装有一对台湾研华公司的ADAM4520转换器,用于完成RS-232与RS-485信号的转换,实现长距离的通信。另外,此转换器还需要+24V直流电源。 4 软件设计 4.1 软件功能 主机通信子程序已内嵌在DCS系统中,以下介绍从机通信子程序的设计和开发。 从机操作系统为Win2000,程序设计平台为VC++6.0 ,通信程序采用Win32的API函数读、写串口。 程序的界面设计主要包括:一个复选框,用于选择通信的数据块;一系列下拉列表,用于设置通信的串口参数;网络状态显示控件。复选框的内容是#1、#2及公用部分三个数据块,下拉列表主要包括设定波特率(9600bps)、起始位(1位)、数据位(7位)、奇偶校验位(1位)、停止位(1位),有无奇偶检验(无)等,设置的内容均可以调整。 程序的功能设计请参见通信子程序以及解析应答模块的流程图,分别如图2、3所示: 从机通信子程序采取了多线程的工作方式。程序首先设置与DCS相同的串口参数以进行串口初始化,并按照DCS的要求选定通信的数据块,之后创建一个侦听串口事件线程CommWatchThread( ),由此线程监测网络状态及主机发送来的命令消息等各种串口事件,再调用相应的函数对事件进行处理。 解析应答模块共有两个函数:RecvData( )、SendData( )。当RecvData( )函数成功读取到主机的查询命令后,首先对数据量和校验码进行校验,如果有错,则由SendData( )向主机返回相应的出错命令报文;如果正确,则由SendData( )按照命令中要求的起始数据和数据量读取数据库,准备应答命令报文,并调用CRC计算函数计算出CRC码添加到命令的最后两个字节中,发送给主机。 由于通信系统网络采用点对点方式且只进行模拟量数据的通信,所以从机程序的解析、应答模块在对命令进行校验的时候只进行了数据量和CRC校验,省略了地址码和功能码等的校验,以节省时间,提高通信的效率。 4.2 软件特点 1、 采用VisualC++面向对象的设计方法编写通信软件程序,模拟PLC通信的原理在工业PC机上实现基于Modbus协议的串行通信,操作方便。 2、 采用多线程技术和消息驱动的工作方式,可以充分利用计算机系统的资源,避免瓶颈的产生,达到将系统进行合理组织的目的,有效地避免了网络数据的冲突,使得数据通信安全可靠。 5 结束语 本文介绍了使用工业PC机通过Modbus协议实现DCS与远程I/O系统进行串口数据通信的过程,采用VC开发的通信软件已成功应用于陕西某电厂的改造工程,这种通信方式灵活方便,可靠性高,完全达到了预期的要求。了解Modbus协议是我们掌握PLC、智能仪表、单片机等通信机制的重要内容,对过程监控、数据采集等系统中使用PC机进行串行通信的软件开发本文不失为具有普遍的意义。 |