基于modbus的plc与上位机的通信.doc

上传人:b****3 文档编号:2490960 上传时间:2022-10-30 格式:DOC 页数:7 大小:166.50KB
下载 相关 举报
基于modbus的plc与上位机的通信.doc_第1页
第1页 / 共7页
基于modbus的plc与上位机的通信.doc_第2页
第2页 / 共7页
基于modbus的plc与上位机的通信.doc_第3页
第3页 / 共7页
基于modbus的plc与上位机的通信.doc_第4页
第4页 / 共7页
基于modbus的plc与上位机的通信.doc_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

基于modbus的plc与上位机的通信.doc

《基于modbus的plc与上位机的通信.doc》由会员分享,可在线阅读,更多相关《基于modbus的plc与上位机的通信.doc(7页珍藏版)》请在冰豆网上搜索。

基于modbus的plc与上位机的通信.doc

摘要

随着微电子技术和计算机术的进步,可编程控制器以其可靠性高、抗干扰强、开发周期短,已经成为一种较为普及的、适应多种应用环境的工业控制器。

现已从最初的简单顺序控制、逻辑控制发展到可进行模拟量控制、位置控制,特别是PLC与PLC、PLC与计算机通信功能的实现,可组成多级控制系统,形成工厂自动化网络。

PLC可以多种方式如直接采用现有的组态监控软件与上位监控机通信,但针对小规模的控制系统,找到一种高性价比的通信方法,具有积极的实际意义。

本文就是讨论如何利用Modbus通信协议来实现施耐德电器公司的NanoPLC与上位监控PC机的通信。

关键词 modbus;plc;自动化网络;pc

1硬件描述及串口设置

1.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所示。

图1RS485与RS232转换电路图

1.2PLC串行口设置

施耐德的NanoPLC对通信参数的设置通过设置扩展口来实现,系统采用PC机作为Modbus通信网络主站,NanoPLC作为从站。

通信格式设置如下:

波特率4800bps,

图2PLC串行口设置

8位数据位,1位停止位,无奇偶校验。

如图2所示。

1.3PC机的串口初始化

在微机数据通信中,经常使用大规模集成串行接口电路芯片,它们的种类和型号很多,如UART、USRT、USART等。

能完成异步通信的硬件电路称为UART。

作为可编程的异步串行通信芯片UART,应根据协议的要求对其初始化。

可编程串行异步通信控制器8250是IBMPC串行通信控制器I/O接口电路的核心,通过对8250的编程,可以控制串行数据传送格式和速度。

PC机有2个串行通信接口COM1和COM2。

若选COM1,则8250各寄存器地址为3F8H~3FEH;选COM2,则8250各寄存器地址为2F8H~2FEH。

这里介绍用TubroC直接对PC机中的UART8250中各寄存器进行初始化。

本例采用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);

2软件描述

2.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不支持的请求)

如发送:

01H16H00H00HFFH00H09HF9H

返回:

01H96H01H8EH60H

*03:

无效数据(位或字的数据错误,如写位时数据既非16#FF00,又非16#0000)

如发送:

01H05H00H00H03H06H4DH38H

返回:

01H85H03H02H91H

(5)校验码:

2个字节。

采用CRC循环冗余码。

它的基本原理是将一段信息看成一个很长的二进制数,然后用一个特定的数(如11021H)去除它,最后将余数作为校验码附在信息代码之后一起传送(或存储),在进行接收(或读出)时进行同样的处理,如有差错就可发现。

需特别注意的是,如果发送信息中的CRC校验码计算错误,则通信不能成功。

3按通信协议编程

根据Modbus通信协议,主、从机之间的通信过程应为:

先由PC机(主站)按协议格式发出命令帧,PLC(从站)用响应帧应答,PC机接收响应帧并对其内容作出判断、处理。

3.1命令帧的形成

(1)读PLC1个内部位(以%M70为例)

3.2通信过程

采用TubroC编写主机与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语言子程序(子函数)如下:

unsignedcharfasong(chardata)

{

T1=time(NULL);

While

(1)

{T2=time(NULL);

if(difftime(T2-T1)>=2.00)

{

printf("overtimeinfasong()");

exit(0);

}

st=inportb(0x2fd);

if((st&0x20)!

=0)

{

outportb(0x2f8,data);

break;

}

elsecontinue;

}

}

PC机接收1帧数据C语言子程序(子函数)如下:

unsignedcharjieshou(chardata)

{

T1=time(NULL);

While

(1)

{T2=time(NULL);

if(difftime(T2-T1)>=2.00)

{

printf("overtimeinjieshou()");

exit(0);

}

st=inportb(0x2fd);

if((st&0x01)!

=0)

{

head=inportb(0x2f8);

break;

}

}

return(head);

}

4结束语

用以上方法设计的通信软件在现场控制系统已经得到了可靠运行,显示出较好的实用性。

5

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1