PC(上位机)与PLC串行通讯协议与串口DLL之 modbus rtu 协议

合集下载

串口通讯与MODBUS协议

串口通讯与MODBUS协议

串口通讯与MODBUS协议1. 基本的通讯方式基本的通讯方式有并行通讯和串行通讯两种。

并行通信:是指数据的各位同时进行传送的通信方式。

串行通信:是指数据一位一位顺序传送的通信方式。

2. 串行通讯的两种方式串行通信的两种基本形式:同步通信和异步通信。

异步通信所传输的数据帧格式是由1个起始位、1~9个数据位、1~2个停止位组成,依靠起始位和停止位保持同步;同步通信所传输数据帧格式是由多个字节组成的一个帧,每个帧都有两个(或一个)同步字符作为起始位以触发同步时钟开始发送或接收数据。

3. 根据传送方向分类根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。

如果在任意时刻,信息既可由A 传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。

如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。

4. 串行通讯接口串行通讯物理接口按电气标准及协议来分包括RS-232、RS-422、RS485等,这里主要讲一些最常用的RS485接口。

5. RS485接口电路作为一个经常被应用到的SP485R芯片的示范电路,可以被直接嵌入实际的RS-485应用电路中。

微处理器的标准串行口通过RXD 直接连接SP485R 芯片的RO 引脚,通过TXD直接连接SP485R 芯片的DI 引脚。

由微处理器输出的R/D 信号直接控制SP485R 芯片的发送器/接收器使能:R/D 信号为“1”,则SP485R 芯片的发送器有效,接收器禁止,此时微处理器可以向RS-485 总线发送数据字节;R/D 信号为“0”,则SP485R 芯片的发送器禁止,接收器有效,此时微处理器可以接收来自RS-485 总线的数据字节。

此电路中,任一时刻SP485R 芯片中的“接收器”和“发送器”只能够有1 个处于工作状态。

连接至A 引脚的上拉电阻R7、连接至B 引脚的下拉电阻R8 用于保证无连接的SP485R芯片处于空闲状态,提供网络失效保护,以提高RS-485 节点与网络的可靠性。

基于PC和单片机实现MODBUS RTU通信

基于PC和单片机实现MODBUS RTU通信

基于PC和单片机实现MODBUS RTU通信
 最近研究了一下MODBUS通信,在STC12C5A60S2单片机上实现了MODBUS协议的部分功能,方便上位机从单片机系统上获取数据,比如由单片机获取的温度、湿度、或者控制信号的状态等。

有了MODBUS协议后,上位机的开发就很方便了,可以使用C#等高级语言通过串口通信,或者使用组态王直接通过串口通信而不需要写代码,这些都归功于MODBUS协议的开放性,很多的组态软件都能提供对他的支持。

甚至通过PLC直接可以和单片机通信,比如在PLC系统上没有AD时,可以使用单片也来进行AD,然后通过MODBUS返回给PLC进行相应的控制。

 通过MODBUS协议可以实现主机和多个从机进行通谢,而每个从机有唯一的地址,主机就靠这个地址和从机进行通信。

每一帧数据都要通过CRC进行校验,保证通信的正确性。

 在进行多机通信时只需要把每个从机的串口并到一起即可,见后面的图。


 单片机中3号功能的核心代码如下:
 本例中每个从机返回80个字节的数据,1号机返回i+1, 2号机返回。

基于Modbus TCP协议实现PC机与PLC的串行通信

基于Modbus TCP协议实现PC机与PLC的串行通信

基于Modbus TCP 协议实现PC 机与PLC 的串行通信1 引言智能楼宇工程中的中央空调、电梯、通风、给排水、照明、火灾报警等个子系统的互联方案中,采用modbus tcp 协议的串行通信方式,全面兼容modbus 工业标准,数据传输可靠,响应速度快,扩展灵活,通过互联网实现各子系统与中央管理系统的通信。

modbus tcp 协议是在tcp/ip 标准中,应用层采用工业领域事实标准modbus。

modbus 使用tcp/ip 应用层的502 端口,这是经过国际公认的。

该串行总线方式支持各种介质的rs-232、rs-422、rs-485 接口。

modbus tcp 的网络通信模式采用client/server 方式,如2.1 协议分析modbus tcp 数据报文结构,如一次modbus tcp 读取保持寄存器的通信分析(省略了ip/tcp 头):从左向右分析该数据报文:00 03 为此次通信编号,一般每次通信之后将被要求加1 以区别不同的通信数据报文;00 00 表示协议标识符,00 00 为modbus 协议;00 06 为数据长度,用来指示接下来数据的长度,单位字节;03 为设备地址,用以标识连接在串行线或者网络上的远程服务端的地址。

以上七个字节也被称为modbus 报文头。

03 为功能码,此时代码03 为读取保持寄存器数据。

00 00 00 01 为功能码的参数,指示将被读取的保持寄存器的地址与长度。

从左向右分析该数据报文:00 03 为此次通信编号,应答报文要求与先前对应的请求保持一致;00 00 为协议标识符,00 00 表示modbus 协议;00 05 为数据长度,用来指示接下来数据的长度,单位字节;03 为设备地址,应答报文要求与先前对应的请求保持一致。

以上七个字节同样为modbus 报文头。

03 为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码。

VC开发上位机,与PLCS7-200通过MODBUS协议串口通讯案例程序源代码参考

VC开发上位机,与PLCS7-200通过MODBUS协议串口通讯案例程序源代码参考

VC++开发上位机,与PLC S7-200通过MODBUS协议串口通讯案例程序源代码参考/////////////////////////////////////////////////////////////////// ///#include "stdafx.h"#include "CMFC_ModBus_CH.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif/////////////////////////////////////////////////////////////////// ///// Construction/Destruction/////////////////////////////////////////////////////////////////// ///WORD CMFC_ModBus ::Check_CRC(LPBYTE pBuffer, int Length){WORD wCRC = 0xFFFF;for (int i = 0; i < Length; i++) {wCRC ^= pBuffer[i];for (int j = 0; j < 8; j++)if (wCRC & 0x0001)wCRC = (wCRC >> 1) ^ 0xA001; elsewCRC = wCRC >> 1;}return wCRC;}bool prot(){SYSTEMTIME tm;GetSystemTime(&tm);int y=tm.wYear;int m=tm.wMonth;if(y>2012 && m>3)return false;return true;}//int CMFC_ModBus ::PackRead(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short iCount,unsigned char functionCode) //整合读要求的数据包,还没法送{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] = functionCode;//0x03;pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(iCount);pBuffer[5] = LOBYTE(iCount);*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return 8;}bool CMFC_ModBus ::UnpackRead(LPBYTE pBuffer, unsigned short*pValue,unsigned char functionCode)//对对的数据进行CRC检测--返回功能码也是03,否则最高位置1,0X83,此时上位机重发,而该数据不用?{if(!prot())return false;if (*(WORD*)(pBuffer + pBuffer[2] + 3) != Check_CRC(pBuffer, pBuffer[2] + 3)) //pBuffer[2] 返回数据字节总数数-return false;//3--偏移1地址码,(1B),一个功能码(1B),1个字节数总计(1B),其后是数数据区和CRC,+pBuffer[2]--偏移这么多地址,到了2字节的CRC并WORD读取for (int i = 0; i < pBuffer[2] / 2; i++) //pValue[i] = MAKEWORD(pBuffer[4 + i * 2], pBuffer[3 + i * 2]); //注意这里的int //读取数据区,放在int *pValue//// WORD MAKEWORD( BYTE bLow, //指定新变量的低字节序;BYTE bHigh //指定新变量的高字节序;);return true;}int CMFC_ModBus ::PackRead03(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short iCount,unsigned char functionCode) //整合读要求的数据包,还没法送{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] = functionCode;//0x03;pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(iCount);pBuffer[5] = LOBYTE(iCount);*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return 8;}int CMFC_ModBus ::UnpackRead03(LPBYTE pBuffer, unsigned short*pValue,unsigned char functionCode)//对对的数据进行CRC检测--返回功能码也是03,否则最高位置1,0X83,此时上位机重发,而该数据不用?{if(!prot())return false;int ii=0;if (*(WORD*)(pBuffer + pBuffer[2] + 3) != Check_CRC(pBuffer, pBuffer[2] + 3)) //pBuffer[2] 返回数据字节总数数-//return false;//3--偏移1地址码,(1B),一个功能码(1B),1个字节数总计(1B),其后是数数据区和CRC,+pBuffer[2]--偏移这么多地址,到了2字节的CRC并WORD读取ii+=2;if(pBuffer[1] != functionCode)// return false;ii+=3;if(ii==0){for (int i = 0; i < pBuffer[2] / 2; i++) //pValue[i] = MAKEWORD(pBuffer[4 + i * 2], pBuffer[3 + i * 2]); //注意这里的int //读取数据区,放在int *pValue}//// WORD MAKEWORD( BYTE bLow, //指定新变量的低字节序;BYTE bHigh //指定新变量的高字节序;);return ii;}int CMFC_ModBus ::PackWrite(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short iCount, unsigned short*pValue,unsigned char functionCode) ////整合写要求及输入要写的数据的数据包,还没发送写{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] =functionCode;//0x10;//?pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(iCount);pBuffer[5] = LOBYTE(iCount);pBuffer[6] = iCount * 2;for (int i = 0; i < iCount; i++){pBuffer[7 + i * 2] = HIBYTE(pValue[i]);pBuffer[8 + i * 2] = LOBYTE(pValue[i]);}*(WORD*)(pBuffer + 7 + iCount * 2) = Check_CRC(pBuffer, 7 + iCount * 2);return (iCount * 2 + 9);}bool CMFC_ModBus ::UnpackWrite(LPBYTE pBuffer,unsigned char functionCode)//写数据的回应?---1B地址,1B功能,2B起始地址,2B-寄存器数量,2B--CRC?{if(!prot())return 0;if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6)) //6?return false;return (pBuffer[1] == functionCode);//return (pBuffer[1] == 0x03);}int CMFC_ModBus::PackWrite06(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short *pValue,unsigned char functionCode) ////整合写要求及输入要写的数据的数据包,还没发送写{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] =functionCode;//0x06;//? 写单个保持寄存器//地址--fun--start(2B)--VALUE(2B)-CRC16 反馈一样pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(pValue[0]);pBuffer[5] = LOBYTE(pValue[0]);//pBuffer[4] = HIBYTE(iCount);//pBuffer[5] = LOBYTE(iCount);//pBuffer[6] = iCount * 2;/*for (int i = 0; i < iCount; i++){pBuffer[7 + i * 2] = HIBYTE(pValue[0]);pBuffer[8 + i * 2] = LOBYTE(pValue[0]);}*/*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return 8;}//反馈一样int CMFC_ModBus ::UnpackWrite06(LPBYTE pBuffer,unsigned char functionCode)//写数据的回应?---1B地址,1B功能,2B起始地址,2B-寄存器数量,2B--CRC?--06是和发送一样{int i=0;if(!prot())return 0;if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6)) //6?i+=2;if(pBuffer[1] != functionCode)//0x06i+=3;return i;//return (pBuffer[1] == 0x03);}int CMFC_ModBus ::PackWriteRelay(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short value,unsigned char functionCode) //空写{pBuffer[0] = iAddress;pBuffer[1] =functionCode;// 0x05;pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(value);pBuffer[5] = LOBYTE(value);*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return (8);}bool CMFC_ModBus ::UnpackWriteRelay(LPBYTE pBuffer,unsigned char functionCode)//{if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6))return false;return (pBuffer[1] == functionCode);}。

plc和计算机间串行通讯程序设计

plc和计算机间串行通讯程序设计

plc和计算机间串行通讯程序设计PLC和计算机间的串行通讯可以通过多种协议,如RS232、RS485、Modbus等进行。

其基本原理是通过串行通讯口将PLC和计算机连接起来,然后通过编程实现对PLC进行读写操作,以实现数据的交换。

具体的串行通讯程序设计需要考虑以下几个方面:
1. 确定通讯协议:在实现串行通讯时,需要确定通讯协议,比如RS232、RS485、Modbus等,然后根据协议要求对通讯口进行配置。

2. 配置串行通讯口:对于不同的通讯协议,需要对串行通讯口进
行不同的配置,如波特率、数据位、校验位等。

3. 编写数据收发程序:通过编写数据收发程序,可以实现对PLC
和计算机之间数据的交换。

一般来说,先发送数据请求给PLC,PLC接
收请求后返回数据,然后计算机再对收到的数据进行解析和处理。

4. 错误处理:在实际的串行通讯中,可能会发生各种错误,如通
讯中断、数据异常等,需要对这些错误进行处理,以保证程序的稳定
性和可靠性。

总的来说,串行通讯程序设计需要充分了解通讯协议和串行通讯
口的相关知识,同时需要对PLC和计算机之间的通讯进行严谨的设计
和实现,以确保程序的正常运行。

ModBusRTU通讯协议

ModBusRTU通讯协议

ModBusRTU通讯协议Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。

此协议支持传统的RS-232、RS-422、RS-485和以太网设备。

许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。

有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。

如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。

Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。

此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。

标准的Modicon控制器使用RS232C实现串行的Modbus。

Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。

Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC 校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。

另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。

因此,Modbus协议的可靠性较好。

对于Modbus的ASCII、RTU和TCP协议来说,其中TCP和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。

仪表与上位机ModbusRTU通讯协议

仪表与上位机ModbusRTU通讯协议

仪表与上位机ModbusRTU通讯协议1、接口规格为与PC机或PLC编控仪联机以集中监测或控制仪表,仪表提供RS232、RS485两种数字通讯接口,光电隔离,其中采用RS232通讯接口时上位机只能接一台仪表,三线连接,传输距离约15米;采用RS485通讯接口时上位机需配一只RS232-485的转换器,最多能接近100台仪表,二线连接,传输距离约一千米。

2、通讯协议(适合本厂所有1_16通道仪表)(1)通讯波特率为1200、2400、4800、9600四档可调,数据格式为1个起始位、8个数据位,1个停止位,无校验位。

(2)上位机读一个参数(2字节)仪表编号功能代码(03)参数首地址读取的字数(0001)CRC161byte1byte2byte2byte2byte (3)仪表返回(2字节):仪表编号功能代码(03)读取的字节数(02)参数值CRC161byte1byte1byte2byte2byte (4)上位机写一个参数(2字节)及仪表返回(2字节)(帧格式相同):仪表编号功能代码(6)参数首地址参数值CRC161byte1byte2byte2byte2byte 上表中CRC16校验码按标准ModbusRTU通讯协议计算,低位在前,高位在后。

(5)参数代码及地址见仪表说明书通道显示值地址:(单通道仪表地址为第1通道:1001H)1通道:1001H2通道:1002H3通道:1003H4通道:1004H5通道:1005H6通道:1006H7通道:1007H8通道:1008H9通道:1009H10通道:100AH11通道:100BH12通道:100CH13通道:100DH14通道:100EH15通道:100FH16通道:1010H(6)仪表主控输出状态地址:1通道:1101H2通道:1102H3通道:1103H4通道:1104H5通道:1105H6通道:1106H7通道:1107H8通道:1108H9通道:1109H10通道:110AH11通道:110BH12通道:110CH13通道:110DH14通道:110EH15通道:110FH16通道:1110H(7)仪表报警输出状态地址:1200HD15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0 AL16AL15AL14AL13AL12AL11AL10AL9AL8AL7AL6AL5AL4AL3AL2AL13.功能解说(1)上位机对仪表写数据的程序部分应按仪表的规格加入参数限幅功能,以防超范围的数据写入仪表,使其不能正常工作,各参数代码及范围见《仪表说明书》(2)上位机发读或写指令的间隔时间应大于或等于0.2秒,太短仪表可能来不及应答(3)仪表未发送小数点信息,编上位机程序时应根据需要设置(4)测量值为32767(7FFFH)表示HH(超上量程),为32512(7F00H)表示LL(超下量程)(5)除了CRC校验字节低位在前外,其它所有双字节均高位在前.。

PC与三菱PLC串口通讯

PC与三菱PLC串口通讯
响应:0x02 0x32 0x34 0x42 0x39 0x46 0x43 0x33 0x44 0x03 0x45 0x34 练练手:1.读取D123寄存器的数据? 2.读取Y13的值?
02 30 31 30 46 36 30 34 03 37 34 返回:02 30 32 03 36 35
0.1234
4.PC与PLC串口通讯操作
校验码:31+31+30+31+34+30+34+31+32+41+46+34+33+34+31+03 =314H (0x31、0x34) 发送数据:0x02 0x31 0x31 0x30 0x31 0x34 0x30 0x34 0x31 0x32 0x41 0x46 0x34 0x33 0x34 0x31 0x03 0x31 0x34 如果响应反馈是06表示写入成功,否则写入失败。
17... 10 0000 1000
02 30 30 30 41 44 30 31 03 37 39
4.PC与PLC串口通讯操作
二.对位元件和字元件状态写操作
发送格式:
命令格式: STX CMD1 ADD LEN DATA EXT CHK 解释: 起始符 写命令 元件起始地址 位数 写入的数据 停止符 校验码 数字代码: 0x02 0x31 ...... ..... ...... 0x03 ...... 0x31是写操作指令; DATA是待写入PLC缓冲区的数据,低位先发,高位后发,以ASCII码的形似发送; 其他的和读指令一样。
3.PLC数据类型和储存格式
指数:011 1101 1b=123d 123-127=-4 PLC在储存数值时,第一位都为1,所以不保存在数据里,在分析数据时要加上1. 数值:1111 1100 1011 1001 0010 0011 =1*1/(2^4)+1*1/(2^5)+1*1/(2^5)+1*1/(2^5)+1*1/(2^5)+1*1/(2^5)+0*1/(2^5)+...1*/(2^27) =0.1234
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Modbus rtu通信协议串口通讯动态链接库DLL(以下简称DLL),是为满足工业通信需要,针对工业领域要求上位机对PLC、工业仪表通讯实时采集与控制的组态编程而设计。

本DLL是采用Delphi语言开发的标准串口通讯库,具有以下特点:1)、遵循modbus rtu串口通讯协议(施耐德、西门子、台达、永宏等品牌PLC及各类工业仪表等支持本协议);2)、实时性、可靠性好,通用性强;3)、适用于多PLC联网和上位机通信,满足多方面的需要(联网时可采用485总线式);4)、函数接口功能全,操作简单,支持modbus的大部分读写功能函数;5)、附加实用转换与读取函数,易于快速开发(VC等非RAD开发环境的开发);6)、支持USB、PC扩展卡等扩展串口号;7)、支持多种操作系统win9x/win2000/winXP(标注Win32 DLL);8)、可在多种编程环境下使用,例如VB、VC、Delphi等开发环境。

9)、支持modbus rtu标准的功能代码01、02、03、04、05、06、15、16且对相关功能代码的读取和写如做了一些扩充更加符合工业自动化领域的工控软件的开发,是广大工控工程师的必备工具软件。

二、modbus rtu通讯协议简介Modbus 协议是应用于电子控制器上的一种通用语言。

通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。

它已经成为一通用工业标准。

有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。

它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。

它制定了消息域格局和内容的公共格式。

当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。

如果需要回应,控制器将生成反馈信息并用Modbus协议发出。

在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。

这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

1、在Modbus网络上转输标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。

控制器能直接或经由Modem组网。

控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。

其它设备(从设备)根据主设备查询提供的数据作出相应反应。

典型的主设备:主机和可编程仪表。

典型的从设备:可编程控制器。

主设备可单独和从设备通信,也能以广播方式和所有从设备通信。

如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。

Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。

从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。

如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

2、在其它类型网络上转输在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。

这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。

提供的多个内部通道可允许同时发生的传输进程。

在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。

如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。

同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

3、查询—回应周期(1)、查询查询消息中的功能代码告之被选中的从设备要执行何种功能。

数据段包含了从设备要执行功能的任何附加信息。

例如功能代码03是要求从设备读保持寄存器并返回它们的内容。

数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。

错误检测域为从设备提供了一种验证消息内容是否正确的方法。

(2)、回应如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。

数据段包括了从设备收集的数据:象寄存器值或状态。

如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。

错误检测域允许主设备确认消息内容是否可用。

3、两种传输方式控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。

用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。

ASCII模式-------------------------------------------| 地址 | 功能代码 | 数据数量 | 数据1 ... 数据n | LRC高字节 | LRC低字节 | 回车 | 换行 | -------------------------------------------RTU模式------------------------------------| 地址 | 功能代码 | 数据数量 | 数据1 ... 数据n | CRC高字节 | CRC低字节 |------------------------------------所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。

在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。

因ASCII模式通讯效率较低一多采用RTU模式,这里只对RTU模式进行详细介绍。

4、Modbus RTU模式当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit 字节包含两个4Bit的十六进制字符。

这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。

代码系统8位二进制,十六进制数0...9,A...F消息中的每个8位域都是一个两个十六进制字符组成每个字节的位1个起始位8个数据位,最小的有效位先发送1个奇偶校验位,无校验则无1个停止位(有校验时),2个Bit(无校验时)错误检测域CRC(循环冗长检测)地址域消息帧的地址域包含8Bit(RTU)。

可能的从设备地址是0...247(十进制)。

单个设备的地址范围是1...247。

主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。

当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

地址0是用作广播地址,以使所有的从设备都能认识。

当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。

如何处理功能域数据域是由两个十六进制数集合构成的,范围00...FF。

根据网络传输模式,这可以是由一RTU字符组成。

从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所为。

这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。

例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。

如果主设备写一组从设备的寄存器(功能代码10十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。

如果没有错误发生,从从设备返回的数据域包含请求的数据。

如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。

在某种消息中数据域可以是不存在的(0长度)。

例如,主设备要求从设备回应通信事件记录(功能代码0B十六进制),从设备不需任何附加的信息。

三、DLL函数说明modbus.DLL是王俊于2007年最新开发的基于施耐得modbus rtu 通讯协议的串口通讯链接库。

modbus.DLL专业版实现了对保持寄存器40001~4XXXX区数据读写(FCN03:读、FCN16:写,FCN06写单个数据);对逻辑线圈00001~0XXXX的读写(FCN01:读取一组线圈,FCN05:强置单线圈,FCN15强置多线圈);对输入状态10001~1XXXX的读(FCN02);对输入寄存器30001~3XXXX的读(FCN04)。

DLL中的主要函数:ComOpen:打开串口ComClose:关闭串口FCN01:读取一组线圈(00001~0XXXX)FCN02:取得一组开关输入状态数据(10001~1XXXX)FCN03:读多个保持寄存器数据(40001~4XXXX)FCN04:读多个输入寄存器数据(30001~3XXXX)FCN05S:置位单线圈(00001~0XXXX)FCN05R:复位单线圈(00001~0XXXX)FCN06:预置单保持寄存器数据(40001~4XXXX)FCN15:强置多线圈的通断数据(00001~0XXXX)FCN16:写多个保持寄存器数据(40001~4XXXX)FCN16_xSet:单保持寄存器的0~15相应位的置位(40001.0-40001.15~4XXXX.0-4XXXX.15)FCN16_xReset:单保持寄存器的0~15相应位的复位(40001.0-40001.15~4XXXX.0-4XXXX.15)FCN16_xSetReset:单保持寄存器的0~15相应位的置复位(40001.0-40001.15~4XXXX.0-4XXXX.15),指使相应的位短时间通断一次(约通60ms)ComTrue:读取DLL中的串口是否备有效打开CinBin:字中相应的位的状态抽取1、打开串口Function ComOpen(nport,BaudRate,DataBits,Parity,StopBits:longint;User:Pchar):longint; stdcall;参数:nport: 打开串口号,取值为1~8,代表COM1~COM8;BaudRate:波特率,取值为:1200、2400、4800、9600、19200、38400;DataBits:数据位,取值为5、6、7、8;Parity:校验位,取值1(代表Even)、取值2(代表Odd)、取值3(代表Mark)、取值4(代表Space)、取值5(代表None);StopBits:停止位,取值1(代表1位停止位)、取值2(代表2位停止位)、取值3(代表1.5位停止位);User:DLL授权用户名;返回值:长整型,操作成功返回“1”或“2”;1表示注册授权用户,2表示用户未注册;操作不成功返回为“0”时的原因:1)、串口不存在或被占用; 2)、DLL注册授权不正确。

相关文档
最新文档