MODBUS通讯协议及编程

发布者:Joyful444Life最新更新时间:2015-02-11 来源: diangon关键字:MODBUS  通讯协议  编程 手机看文章 扫描二维码
随时随地手机看文章

   ModBus通讯协议分为RTU协议和ASCII协议,我公司的多种仪表都采用ModBus RTU通讯协议,如:YD2000智能电力监测仪、巡检表、数显表、光柱数显表等。下面就ModBus RTU协议简要介绍如下:

一、通讯协议

 

(一)、通讯传送方式:

通讯传送分为独立的信息头,和发送的编码数据。以下的通讯传送方式定义也与MODBUS RTU通讯规约相兼容:

编 码

8位二进制

起始位

1

数据位

8

奇偶校验位

1位(偶校验位)

停止位

1

错误校检

CRC(冗余循环码)

初始结构 = 4字节的时间

地址码 = 1 字节

功能码 = 1 字节

数据区 = N 字节

错误校检 = 16CRC

结束结构 = 4字节的时间

 

 

  地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。

 

  功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。

 

  数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。

 

   CRC码:二字节的错误检测码。

 

(二)、通讯规约:

 

   当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。

 

1.  信息帧结构

地址码

功能码

数据区

错误校验码

8

8

N × 8

16

地址码:地址码是信息帧的第一字节(8),从0255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。

   功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及操作

代码

含义

操作

03

读取数据

读取当前寄存器内一个或多个二进制值

06

重置单一寄存器

把设置的二进制值写入单一寄存器

数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。

  错误校验码:主机或从机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其它一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或从机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。

注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。

2.错误校验

   冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的 CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。[page]

  CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。

   在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。

   这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。

   计算CRC码的步骤为:

·         预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;

·         把第一个8位数据与16CRC寄存器的低位相异或,把结果放于CRC寄存器;

·         把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;

·         如果最低位为0:重复第3(再次移位); 如果最低位为1CRC寄存器与多项式A0011010 0000 0000 0001)进行异或;

·         重复步骤34,直到右移8次,这样整个8位数据全部进行了处理;

·         重复步骤2到步骤5,进行下一个8位数据的处理;

·         最后得到的CRC寄存器即为CRC码。

3.功能码03,读取点和返回值:

  仪表采用Modbus RTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”) 或返回值(“输入寄存器” )的操作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。

4.功能码06,单点保存

  主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信息。

二、编程举例

  下面是一个用VC编写的ModBus RTU通讯的例子

(一)、通讯口设置

DCB dcb;
hCom=CreateFile("COM1",

     GENERIC_READ|GENERIC_WRITE,
     0,
     NULL,
     OPEN_EXISTING,
     0,
     NULL);
if(hCom==INVALID_HANDLE_VALUE)
{

  MessageBox("createfile error,error");
}
BOOL error=SetupComm(hCom,1024,1024);
if(!error)

  MessageBox("setupcomm error");
error=GetCommState(hCom,&dcb);
if(!error)

  MessageBox("getcommstate,error");
dcb.BaudRate=2400;
dcb.ByteSize=8;

dcb.Parity=EVENPARITY;//NOPARITY;
dcb.StopBits=ONESTOPBIT;

error=SetCommState(hCom,&dcb);

(二)、CRC校验码计算

UINT crc
void calccrc(BYTE crcbuf)
{
BYTE i;

crc=crc ^ crcbuf;
for(i=0;i<8;i++)
{
BYTE TT;
TT=crc&1;
crc=crc>>1;
crc=crc&0x7fff;
if (TT==1)
crc=crc^0xa001;
crc=crc&0xffff;
}
}

(三)、数据发送

zxaddr=11;//读取地址为11的巡检表数据
zxnum=10;//读取十个通道的数据

writebuf2[0]=zxaddr;
writebuf2[1]=3;
writebuf2[2]=0;
writebuf2[3]=0;
writebuf2[4]=0;
writebuf2[5]=zxnum;
crc=0xffff;
calccrc(writebuf2[0]);
calccrc(writebuf2[1]);
calccrc(writebuf2[2]);
calccrc(writebuf2[3]);
calccrc(writebuf2[4]);
calccrc(writebuf2[5]);

writebuf2[6]=crc & 0xff;
writebuf2[7]=crc/0x100;
WriteFile(hCom,writebuf2,8,&comnum,NULL);

(四)、数据读取

ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据
可增加错误处理程序,如地址码错误、CRC码错误判断、通讯故障处理等。

关键字:MODBUS  通讯协议  编程 引用地址:MODBUS通讯协议及编程

上一篇:CAN现场总线的基础知识
下一篇:如何正确选用现场总线产品(新手必看)

推荐阅读最新更新时间:2024-05-02 23:30

JTAG口及其对Flash的在线编程
摘要:通过JTAG实现对Flash在线编程。首先,介绍JTAG的定义、结构及引脚的定义,并阐述JTAG状态机的工作原理。然后,介绍JTAG口的边界扫描寄存器,给出实现JTAG在线写Flash的电路,和如何通过JTAG实现Flash的编程及程序流程图。 关键词:JTAG Flash 在线编程 随着嵌入式技术的发展,在一些高端的掌上设备中,都使用了Flash芯片,如Compaq的iPAQ、联想的天祺系列等产品。但对于研发人员来说,在开发阶段需要大量的程序调试,就意味着要对Flash进行擦除和改写的工作,因此,如何对Flash进行在线编程是问题的关键所在。本文介绍一种通过JTAG对Flash进行的在线编程方法。 1 JTAG简介
[嵌入式]
芯慧同用与信息设备资源共享协同服务标准化工作组合作开发支持IGRS 协议的首个芯片
-- 芯慧同用加入信息设备资源共享协同服务标准化工作组 -- 媒体处理器提供商为闪联 Smart TV,机顶盒以及手持媒体播放器 北京5月29日电 /新华美通/ -- 5月28日,在数字媒体处理器领域处于领先地位的芯慧同用半导体技术公司(Vivace Semiconductor,Inc. 下称芯慧同用)宣布,与闪联信息技术工程中心有限公司(下称闪联工程中心)签订合作协议,共同开发基于芯慧同用芯片产品的参考设计方案,将用于系统 OEM 厂商加速开发兼容家庭网络 IGRS 标准的新产品。同时芯慧同用宣布正式加入闪联工作组及标准化工作,共同开发首个由本土公司提供的能够支持 IGRS 标准的媒体处理器芯片。芯慧同用作为闪联推广会员,与
[焦点新闻]
s3c2440串口编程
0、串口总线标准:RS-232C RS-422A RS-485 1、串口通讯,分为同步通讯和异步通讯,我们通常使用的都是异步串口。通讯时,双方先约定好数据帧的格式,即波特率,数据位,停止位,奇偶校验位等。 2、串口通信数据格式 3、串口接线 1) 两端的插头上有1-9的标号,如果用万用表测相对应号码的针都是短通的,就是直连线。 不是一对一通的就是交叉。 交叉就是收-发,发-收,一样设备用平行就会发-发,收-收 我们用的是交叉串口线。 2) 进行TTL与EIA电平转换:CPU和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。 正逻辑:高电平---1
[单片机]
s3c2440串口<font color='red'>编程</font>
用在系统可编程模拟器件实现双二阶型滤波器
用在系统可编程模拟器件实现双二阶型滤波器 阐述了在系统可编程模拟器件的特点以及用它设计双二阶型、连续时间低通和带通滤波器的方法。 关键词: 在系统可编程模拟器件 双二阶型电路 数字在系统可编程(ISP)技术和复杂可编程器件(CPLD)在电子工业领域已得到了广泛的应用。Lattice公司最近推出的在系统可编程模拟电路(in system programmability Programmable Analog Circuits),简称ispPAC,允许设计者使用EDA开发软件、利用计算机设计和修改模拟电路,进行电路特性模拟,最后通过编程电缆将设计方案下载至芯片中。 在系统可编程电路提供三种可编程性能:(1)可编程功能
[嵌入式]
用在系统可<font color='red'>编程</font>模拟器件实现双二阶型滤波器
ICC AVR精确定时的编程实验
#include io8515.h /*====================================== 微秒级精确延时函数,晶振8M: Delay = 0.125 *((tt*4-1)+9)微秒 其中9包括了调用方的 r16 赋值 1t rcall 3t nop 1t ret 4t brne指令在当判断条件不成立时是单周期 最后一次判断只有1个周期,补一个nop 简化计算 = 0.5tt + 1 (us) ======================================*/ void shortdelay(unsigned char tt) { asm( _L2: subi R16
[单片机]
Windows环境下转塔数控冲床监控与编程系统的设计
1 前言   随着计算机技术的发展,Windows作为一个多窗口、多任务的新型的图形窗口操作环境,具有许多DOS不可比拟的优点。它可完成任务、文件输出设备等的并行管理工作,并提供了强大的功能以及友好的图形用户界面(GUI),它不仅广泛用作管理事务型工作的支持平台,而且也被工业领域的工程人员所关注。随着工业PC大举进入数控领域,数控冲床监控和编程系统的开发也愈来愈多地应用PC机的最新硬件和软件成果。随着CNC技术和计算机技术的发展,在Windows环境下,采用先进的“5C”(Computer、Control、Communication、CRT、C/C 语言)技术,开发数控冲床的监控和编程系统,已成为一个潮流和方向。   基于
[嵌入式]
一种基于ATmega8单片机的串行编程
通常进行单片机实验和开发,编程器是必不可少的。仿真、调试完的程序要借助编程器写入单片机的存储器中,随着单片机技术的发展出现了MTP(可多次编程)存储器技术和ISP(在系统可编程)技术,这样就可以省去昂贵的仿真器,只要通过计算机接口和一条串行下载线就可直接在目标芯片上编程。ATmega8就是一种具有MTP与ISP功能的单片机,他也是AVR单片机中价格性能比最高的单片机,因此研究他的串行编程特性对利用他的上述功能来开发应用单片机有很高的实用价值。 1 ATmega8的体系结构与主要性能特点 ATmega8是ATMEL公司在2002年推出的一款新型的AVR高档单片机,他的芯片内部集成了较大容量的存储器和丰富强大的硬件接口电路,具备AVR高
[单片机]
从制造迈向智造,可编程逻辑控制器方案的设计与实现
近年来,随着科技的飞速发展,从“制造”向“智造”转型的故事正在全球迅速上演。无论是井然有序的自动化工厂还是数字化的信息管理系统,无一不在彰显智造时代的到来。然而智能制造这件事在20世纪60年代之前,可没有这么容易。当时在工厂生产线中,大部分使用的是继电器、接触器等控制系统,这些系统存在着修改难、体积大、噪声大、维护不方便以及可靠性差等弊端。为了改进这些问题,美国某汽车生产商向社会公开招标,号召大家设计一种新的系统来替换继电器系统,并提出了著名的“通用十条”招标指标。于是在1969年,第一台可编程控制器诞生,此后在工业环境中得到广泛使用。 【导读】近年来,随着科技的飞速发展,从“制造”向“智造”转型的故事正在全球迅速上演。无论是
[嵌入式]
从制造迈向智造,可<font color='red'>编程</font>逻辑控制器方案的设计与实现
小广播
热门活动
换一批
更多
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved