毕业论文 基于modbus的plc与上位机的通信

作者&投稿:俟萱 (若有异议请与网页底部的电邮联系)
我的毕业论文 基于modbus的plc与上位机的通信~

先熟悉MODBUS协议规范 网上一搜一堆 对于上位机通讯 只需要定义4个区 OX0 OX1 OX3 OX4OX0 离散量只读 相当于DI OX1离散量读写 相当于DO OX3 读取过程量 OX4 读写数据 相当于位内存M区 不同的PLC对应的MODBUS地址也不同 如果是施耐得的TWIDO或者M340 只支持M区读取 对于上位机变量只是OX1 OX4 上位机那边简单 把通讯配置好 波特率 奇偶校验 停止位等 在该连接下按照上述我说的建立变量连接就可以

你是要做上位的程序还是PLC的程序。其实MODBUS RTU 跟别的通讯没有多大的区别,主要区别就是后面加了CRC16的冗余校验。通讯协议就这么编,我想你也明白了吧。
至于PLC程序把XO-X7赋值给VB0,从MODBUS里设定起始通讯地址为VB0就行了。
要什么需要具体帮助你。

1 引言
随着微电子技术和计算机技术的进步,可编程控制器以其可靠性高、抗干扰强、开发周期短,已经成为一种较为普及的、适应多种应用环境的工业控制器。现已从最初的简单顺序控制、逻辑控制发展到可进行模拟量控制、位置控制,特别是PLC与PLC、PLC与计算机通信功能的实现,可组成多级控制系统,形成工厂自动化网络。PLC可以多种方式如直接采用现有的组态监控软件与上位监控机通信,但针对小规模的控制系统,找到一种高性价比的通信方法,具有积极的实际意义。本文就是讨论如何利用Modbus通信协议来实现施耐德电器公司的NanoPLC与上位监控PC机的通信。2 硬件描述及串口设置
2.1 接口电路设计
PLC与PC间实现通信,可使二者互补功能上的不足,PLC用于控制方面既方便又可靠,而PC机在图形显示、数据处理、打印报表以及中文显示等方面有很强的功能。因此,各PLC制造厂家纷纷开发了适用于本公司的各种型号PLC机通信的接口模块,不同的通信方式,有着不同的成本价格和不同的适用范围。NanoPLC的CPU单元本身带有1个RS-485扩展口,可不配备专用通讯模块,而通过此接口与上位机进行串行通信。在此介绍一种通过PLC的RS485扩展口与PC机的RS-232串行口进行通信的方法。
由于NanoPLC的扩展口采用RS-485标准,RS485是RS422的变型。RS422为全双工,可同时发送与接收;RS485则为半双工,在某一时刻,1个发送另1个接收。RS485是一种多发送器的电路标准,允许双导线上1个发送器驱动32个负载设备,负载设备可以是被动发送器、接收器或收发器。而计算机的串行口采用RS-232标准。因此,作为实现PLC与计算机通信的接口电路,必须将RS-485标准转换成RS-232标准。我们利用SC-485转换器实现RS485与RS232之间的转换。转换电路如图1所示。图1 RS485与RS232转换电路图2.2 PLC串行口设置
施耐德的NanoPLC对通信参数的设置通过设置扩展口来实现,系统采用PC 机作为Modbus通信网络主站,NanoPLC作为从站。通信格式设置如下:波特率4800bps,图2 PLC串行口设置8位数据位,1位停止位,无奇偶校验。如图2所示。
2.3 PC机的串口初始化
在微机数据通信中,经常使用大规模集成串行接口电路芯片,它们的种类和型号很多,如UART、USRT、USART等。能完成异步通信的硬件电路称为UART。作为可编程的异步串行通信芯片UART,应根据协议的要求对其初始化。可编程串行异步通信控制器8250是IBM PC串行通信控制器I/O接口电路的核心,通过对8250的编程,可以控制串行数据传送格式和速度。PC机有2个串行通信接口COM1和COM2。若选COM1,则8250各寄存器地址为3F8H~3FEH;选COM2,则8250各寄存器地址为2F8H~2FEH。这里介绍用Tubro C直接对PC机中的UART 8250中各寄存器进行初始化。本例采用COM2口,初始化如下:
outportb(0x2fb,0x80); /*btp=4800*/
outportb(0x2f8,0x18);
outportb(0x2f9,0x0);
outportb(0x2fb,0x1b); /*initialize (8、1、n)*/
outportb(0x2f9,0x0);
outportb(0x2fc,0x3);3 软件描述
3.1系统通信协议
NanoPLC采用Modbus通信协议。任何根据此通信协议进行通信的主、从机之间进行数据信息交换时,信息格式都必须遵守通信协议所规定的格式。Modbus的数据交换模式有2种,1种为ASCII编码制,1种为RTU编码制。本例采用RTU码传输模式,它包括一些特殊标志码、PLC站号、呼叫字和校验码等,其数据帧格式如附表。(1) 帧开始:数据帧以至少3.5个字符间隔时间(T1-T2-T3-T4)标志开始和结束。整个信息帧必须以连续的信号进行传输,从而保证CRC的校验正确。
(2) 从站地址:1个字节。各从站识别码,站号取值范围01H-F7H,共有247种不同站。但Nano系列PLC通讯网络最多允许32个从站。
(3) 功能号:1个字节。表示主站对从站的各种操作工作,主机发功能号给从机,如果从机响应正常,则回送相同的功能码;如有错误发生,则将原功能码符号位置“1”后回送,并将错误代码写入数据区回送。各功能号具体功能如下:
01或02:读n个内部位%Mi
03或04:读n个内部字%Mwi
05:写1个内部位%Mi
06:写1个内部字%Mwi
15:写n个内部位% Mi
16:写n个内部字%Mwi
(4) 数据区:数据区由一串2位16进制数据组成,从00-FFH。如果通信正确,数据区存放PLC回应上位机的信息;如发送数据有误,则返回异常代码。
NanoPLC处理的2种异常代码:
*01:功能未知(PLC不支持的请求)
如发送: 01H 16H 00H 00H FFH 00H 09H F9H
返回: 01H 96H 01H 8EH 60H
*03:无效数据(位或字的数据错误,如写位时数据既非16#FF00,又非16#0000)
如发送:01H 05H 00H 00H 03H 06H 4DH 38H
返回:01H 85H 03H 02H 91H
(5) 校验码:2个字节。采用CRC循环冗余码。它的基本原理是将一段信息看成一个很长的二进制数,然后用一个特定的数(如11021H)去除它,最后将余数作为校验码附在信息代码之后一起传送(或存储),在进行接收(或读出)时进行同样的处理,如有差错就可发现。需特别注意的是,如果发送信息中的CRC校验码计算错误,则通信不能成功。3 按通信协议编程
根据Modbus通信协议,主、从机之间的通信过程应为:先由PC机(主站)按协议格式发出命令帧,PLC(从站)用响应帧应答,PC机接收响应帧并对其内容作出判断、处理。
3.1 命令帧的形成
(1) 读PLC1个内部位(以%M70为例)3.2 通信过程
采用Tubro C编写主机与PLC的通信程序。首先必须对COM2口进行初始化,前面已经述及。PC机通过串行接口与PLC进行通信时,首先由PC机发出命令帧给PLC(发送过程),然后PLC将立即作出响应,PC机同时接收响应帧(接收过程),所有的通信均由PC机来启动和接收,PLC方无需编制通信程序。所以在PC机的通信应用程序中,在需要与PLC交换数据时,先调用发送命令帧子程序,随后调用接收响应帧子程序,并对响应帧进行处理。将8250各寄存器初始化后,就可以通过读取并判断状态寄存器(2FDH)中的D5位(发送保持寄存器空)是否为1,来决定是否将要发送的数据写入发送保持寄存器(2F8H),发送数据的子程序流程图如图3所示,为了避免PC机出现死循环,在进入循环之前,先读取一个时间T1,进入循环后,每循环一次读一次当时的时间T2,并判断此T2与T1两时间的差,如超过2s,则不再读取状态,而显示超时出错并退出。在接收数据子程序中,通过读取并判断状态寄存器(2FDH)中的D0位(接收数据就绪)是否为1,来决定是否从接收数据寄存器(2F8H)读取一帧接收的数据。同样,为了避免出现死循环,设置了超时出错处理,接收数据子程序的流程图如图4所示。图3 发送数据子程序的流程图 图4 接收数据子程序的流程图PC机发送1帧数据的C语言子程序(子函数)如下:
unsigned char fasong(char data )
{
T1=time(NULL);
While(1)
{T2=time(NULL);<br> if(difftime(T2-T1)>=2.00)<br> {<br> printf("over time in fasong( ) ");<br> exit(0);<br> }
st=inportb(0x2fd);
if((st&0x20)!=0)
{
outportb(0x2f8,data);
break;
}
else continue;
}
}
PC机接收1帧数据C语言子程序(子函数)如下:
unsigned char jieshou(char data )
{
T1=time(NULL);
While(1)
{T2=time(NULL);<br> if(difftime(T2-T1)>=2.00)<br> {<br> printf("over time in jieshou( ) ");<br> exit(0);<br> }
st=inportb(0x2fd);
if((st&0x01)!=0)
{
head=inportb(0x2f8);
break;
}
}
return(head);
} 4 结束语
用以上方法设计的通信软件在现场控制系统已经得到了可靠运行,显示出较好的实用性。