RS485通信和Modbus协议实例分析
MODBUS中485传输例程分析(参考)
case 0x0076:
{
Uart0_send_buff[i] = Out_current & 0xff;
i++;
Uart0_send_buff[i] = (Out_current >> 8) & 0xff;
{
unsigned char i;
unsigned short crc = 0xFFFF;
if(len==0)
{
len = 1;
}
while(len--)
{
crc ^= *ptr;
Uart0_send_buff[i] = (Mkgz_bz >> 8) & 0xff; //高8位
i++;
}//后面不放break的目的是继续往下执行
case 0x0066:
{
Uart0_send_pointer = Uart0_send_buff;
USART_SendData(USART2, *Uart0_send_pointer++);
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
i++;
}
case 0x00A6:
{
Uart0_send_buff[i] = OutX_current & 0xff;
i++;
Uart0_send_buff[i] = (OutX_current >> 8) & 0xff;
Uart0_send_buff[2] = 2 * Uart0_rev_buff[5]; //读的字节数
485通信讲解(附案例)解析
2
3
4
状 态 字
5
实际 运行 数据
6
实际 运行 数据
7
异 或 校 验
校验
起 始 字 节
从 状 机 态 地 字 址
字节定义 头 地址 状态区
数据区
RS485通讯协议
长帧(起始字节=02H)
发送顺序 1 (字节) 控制器至变频器:
2 3 4 5 6 7 8 9 10 11
起 始 字 节
从 功 命 功能 机 能 令 码设 地 码 字 定值 址 号
1 0
RS485通讯协议
响应字定义 控制字 (位)
bit5
值
1 0
含义
停机2状态 非停机2状态
功能描述
变频器执行停机2命令,处于停机状态
bit6
1 0
控制禁止状态 控制允许状态 上位机控制 本地控制方式
到达设定频率/ 速度 未到达设定频率 /速度
因停机1或停机2或变频器故障或异常命令使变 频器停机的状态,需控制字恢复到准备运行状态 使其复位
bit9
1 0
bit10
1 0
变频器只允许本地控制(面板和端子)
RS485通讯协议
响应字位定义 控制字 (位)
bit11
值
1 0
含义 变频器运行状态 变频器停止状态 变频器接受出错
功能描述
bit15
1
0
bit0 bit7~8 bit12~1 4,
变频器接收正确
预留 预留 预留
本位表示来自控制器的通讯帧经 校验出错,控制器应再次发送该 帧。
RS485通讯协议
控制字定义 控制字 (位) bit0 值 1 0 bit1 含义 运行命令 方式0停车 功能描述 起动变频器 减速停车
ZNJC2 RS485通讯 modbus 协议
_MODBUS 通讯协议说明1. 通讯相关的参数2.通讯说明2.1 数据格式说明控制器采用RS-485总线,协议符合ModBus 规约,数据格式有标准MODBUS-RTU 、 非标准MODBUS-RTU(16进制)和ASC(ASC Ⅱ码)3种格式。
数据传输均采用8位数据位、1位停止位、无奇偶校验位。
波特率可设为2400、4800、9600和19200 bit/s 。
通讯传送分为独立的信息头,和发送的编码数据。
以下的通讯传送方式定义与RTU通讯规约相兼容:2.2 非标准MODBUS-RTU(16进制)数据格式详细说明下面以RTU(16进制)数据格式进行详细说明,ASC Ⅱ码数据格式只是把16进制代码转换成ASC Ⅱ码字符。
地址码:这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。
并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。
主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
功能码:通讯传送的第二个字节。
ModBus 通讯规约定义功能号为01H 到7FH 。
本控制器利用其中的一部分功能码。
作为主机请求发送,通过功能码告诉从机执行什么动作。
作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。
如果从机发送的功能码的最高位 (比如功能码大于7FH),则表明从机没有响应操作或发送出错。
数据区:数据区是根据不同的功能码而不同。
CRC码:二字节的错误检测码。
当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。
返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。
如果出错就不发送任何信息。
2.2.2 信息帧格式:(1)地址码:地址码是信息帧的第一字节(8位),从1到255。
这个字节表明由用户设置地址的从机将接收由主机发送来的信息。
MODBUS实例485通讯解析
用RS485端口控制TVF2000使用说明:一、硬件连接:1.RS485/RS485:(1)终端设备:将J2用终端方式短接;(2)非终端设备:将J2用非终端方式短接;(3)A、B、AGND对接;(4)如果使用屏蔽线,SCR对接。
2.RS485/RS232(PC机):(1)用RS485/RS232转换器;(2)PC机串口与转换器RS232口连接;(3)TVF2000的CN1与转换器的RS485口的A、B、AGND连接。
二、用MODBUS与TVF2000通讯(RTU方式):1.TVF2000键盘设置:a)键盘菜单设置说明:i.1001=10:外端子1用通讯控制;ii.5005=2:标准MODBUS通讯方式;iii.5201=1-247:从机号(缺省=1);iv.5202=5:通讯速度为9600bps(缺省=5);v.5203=0:无效验(缺省=0);vi.其它=缺省值;b)键盘具体操作:i.9952 = 1:参数初始化;ii.1001 = 10;iii.5005 = 2;这样设置后,就可以与TVF2000通讯了。
2.TVF2000使用的MODBUS命令:a)读存储寄存器:03命令;b)写单个寄存器:06命令;c)写多个寄存器:16命令;3.MODBUS单寄存器写入命令说明(其它说明见附录):a)主机发送:i.[地址]:从机地址1-247;ii.[命令]:06,单寄存器写入命令;iii.[寄存器地址_H]:寄存器地址高8位;iv.[寄存器地址_L]:寄存器地址低8位;v.[数据_H]:写入数据高8位;vi.[数据_L]:写入数据低8位;vii.[CRC_H]:CRC效验高8位;viii.[CRC_L]:CRC效验低8位;b)从机返回(正常):i.[地址]:从机地址1-247(相同地址);ii.[命令]:06,单寄存器写入命令;iii.[寄存器地址H]:寄存器地址高8位;iv.[寄存器地址L]:寄存器地址低8位;v.[数据_H]:写入数据高8位;vi.[数据_L]:写入数据低8位;vii.[CRC_H]:CRC效验高8位;viii.[CRC_L]:CRC效验低8位;c)通讯具体操作(菜单1102=7为例):i.主机发送:[01][06][04][4E][00][07][CRC_H][CRC_L];ii.从机返回(正常):[01][06][04][4E][00][07][CRC_H][CRC_L];4.用通讯命令设置菜单值(调速前必须设置):i.1102=7;外部1有效;ii.1103=8;由串行通讯给定;iii.0002=初始频率;如果不设置,为菜单1104的值;iv.0001=0x06;命令寄存器:0001;v.0001=0x0f;vi.0001=0x2f;启动;vii.0001=0x6f;到达设定频率;5.用通讯命令调速(给定寄存器1:0002):i.0002=0-20000;调速:0对应1104的值,20000对应1105的值;ii.通过03命令读取状态寄存器(0004)的值;iii.通过03命令读取保持寄存器(0005、0006)的值;iv.用通讯命令停车:0001 = 0x06;6.7.给定寄存器1:0002(MODBUS为40002)说明如下:i. 输出频率与给定值成正比例;ii. 输出频率=(0002的值)*(1105的值)/20000;8.状态寄存器:0004(MODBUS为40004)说明如下:9.保持寄存器:0005(MODBUS为40005):实际输出频率(单位:Hz);10.保持寄存器:0006(MODBUS为40006):实际输出电流(单位:0.1A);11.状态寄存器、保持寄存器均为只读;12.如果想保存通讯设置,必须用键盘设置菜单1607=1。
modbus通讯协议与485
Modbus通讯协议与4851. 什么是Modbus通讯协议?Modbus通讯协议是一种用于串行通信的协议,常用于工业自动化领域中的设备间通讯。
该协议设计简单、易于实现,因此被广泛应用于工业现场中。
Modbus协议支持多种物理介质,包括串口(如RS-232、RS-485)和以太网(如TCP/IP),其中,Modbus-RTU和Modbus-TCP是较为常见的两种实现方式。
2. 485总线介绍485总线是一种串行通信标准,广泛用于远距离数据传输。
它能实现多个设备通过同一条总线进行通信,且可实现传输距离高达1200米,通信速率可达到10 Mb/s。
相较于RS-232,RS-485是一个全双工的通信接口,并且支持多主设备,能够同时连接多个设备,使多个设备能够实现互相通信。
3. Modbus-RTU协议Modbus-RTU是一种基于二进制的Modbus协议实现方式,主要用于串口通信。
以下是Modbus-RTU常用的帧格式:起始符地址功能码数据区 CRC校验其中,起始符为11位的低电平信号,用于起始帧的标识,地址为设备的唯一标识符,功能码表示操作的具体功能,数据区包含要发送或接收的数据,CRC校验用于验证数据的完整性。
Modbus-RTU支持多种功能码,包括读取单个寄存器、读取多个寄存器、写单个寄存器等。
其通信速率可根据设备需要进行设置。
4. Modbus-TCP协议Modbus-TCP是Modbus协议的一种基于以太网的实现方式。
它使用常用的TCP/IP网络进行通信,能够实现高速、可靠的数据传输。
Modbus-TCP与Modbus-RTU相比,最明显的区别是使用了不同的物理介质和通信协议。
Modbus-TCP通过以太网进行数据传输,其帧格式与Modbus-RTU有所不同。
Modbus-TCP协议使用了标准的TCP/IP协议作为传输层协议,因此具有较高的灵活性和互操作性。
它可以与现有的以太网基础设施无缝集成,并且支持在局域网或广域网上进行远程数据传输。
RS485实验一报告模板
实验一基于RS485和牛顿模块的A/D、D/A实验一、实验目的和要求(1)熟悉RS485总线与牛顿模块的结构组成,了解其工作过程,认识其结构形式。
(2)熟悉牛顿模块的基本工作原理。
(3)掌握应用RS485和牛顿模块进行电压输出和电压采集的方法。
二、主要仪器设备计算机、R-8017、R-8024、R-8043D、R-8053、RS232转RS485模块、24V稳压源三、实验内容和原理(1)RS485网络分析RS485采用差分信号负逻辑,+2V~+6V表示“0”,- 6V~- 2V表示“1”。
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓扑结构在同一总线上最多可以挂接32个结点。
在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。
很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。
而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有二个原因:1>.共模干扰问题:RS-485接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。
但人们往往忽视了收发器有一定的共模电压范围,RS-485收发器共模电压范围为-7~+12V,只有满足上述条件,整个网络才能正常工作。
当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。
2>.EMI问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。
由于PC机默认的只带有RS232接口,有两种方法可以得到PC上位机的RS485电路:1>.通过RS232/RS485转换电路将PC机串口RS232信号转换成RS485信号,对于情况比较复杂的工业环境最好是选用防浪涌同时带隔离栅的产品。
485通信讲解(附案例)
RS485通讯协议
控制字定义
控制字 (位)
值
bit9
1
含义
点动反转
0
点动反转停止
bit10
1
主站控制有效
0
主站控制无效
bit14
1
运行方向正转
0
运行方向反转
bit11~13 ,bit15 、4
未定 义
预留
功能描述
主站下发的当前控制字和运行设定值 有效 主站下发的当前控制字和运行设定值 无效,变频器保持前一次的控制字和 运行设定值
发送顺序 1 2 3 4 5
6
(字节)
变频器至控制器:
起 始 字 节
从 机 地 址
响 应 字
功 能 码 号
功能 码实 际值
功能 码实 际值
控制区
78
数据区 校验
9
10 11
状 态 字
状 态 字
实际 运行 数据
实际 运行 数据
异 或 校 验
字节定义 头 地址 命令区
参数区
控制区 数据区 校验
RS485通讯协议
67
起 始 字 节
从 机 地 址
控 制 字
控 制 字
运行 数据 设定
运行 数据 设定
异 或 校 验
字节定义头地址控制区 数据区 校验
发送顺序 1 2 3 4 5 (字节)
67
变频器至控制器:
起 始 字 节
从 机 地 址
状 态 字
状 态 字
实际 运行 数据
实际 运行 数据
异 或 校 验
字节定义头地址状态区 数据区 校验
1、以50Hz运行2#变频器。(此例需要将变频器频率设定成F0.03=6)
485通信讲解
485通信讲解标题:485通信协议与相关案例分析摘要:本文将详细介绍485通信协议的基本原理、通信模式以及相关案例分析,旨在帮助读者全面了解和应用485通信协议。
引言:485通信协议是一种用于串行通信的工业标准协议,常被应用于在工控系统等环境中实现设备之间的可靠通信。
本文将从原理到应用进行全面解析,通过案例分析展示其在实际项目中的应用场景和效果。
一、485通信协议的基本原理(400字)1.物理层:485通信协议采用差分信号传输,通过两个信号线(A和B)来传输数据。
A线传输逻辑高电平,B线传输逻辑低电平,两者之间产生差分电压用以表示二进制数据的0和12.数据链路层:485通信协议采用主从模式,一个设备作为主站,其他设备作为从站。
主站负责发送指令,从站接收并响应主站的指令。
通信中使用标准的帧结构,包括起始位、数据位、校验位和停止位。
3.电气特性:由于485通信协议可支持长距离通信和多个设备的连接,因此需要考虑电气特性。
主要包括传输速率、传输距离、驱动能力等方面。
二、485通信协议的通信模式(200字)1.单主从模式:由一个主站设备控制多个从站设备,主站负责发起通信请求,从站接收并响应请求。
这种模式常用于工业自动化系统中的智能仪表、传感器等设备的通信。
2.多主从模式:允许多个主站设备同时控制多个从站设备,主站之间通过总线共享信息。
每个主站设备都可控制总线上的任意一个从站设备,并实现数据的读取、写入等操作。
这种模式适用于需要多个主站设备同时交互的应用场景。
三、485通信协议的应用案例分析(600字)1.工业自动化控制系统:485通信协议被广泛应用于工业自动化控制系统中,实现不同设备之间的数据交换和控制。
例如,工厂的温度控制系统中,主站设备负责发送温度设定指令给多个从站设备,从站设备接收指令并控制温度设备进行调节。
通过485通信协议,实现了系统的自动化控制和数据的收集。
2.楼宇自动化系统:在楼宇自动化系统中,485通信协议常用于控制和监测设备之间的通信。
RS232RS485RJ45以及Modbus协议
RS232,RS485,RJ45,以及Modbus协议设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。
相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。
注意到这里有三个必须满足的条件:第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应,否则无法完成接插操作。
这一点规定了插头组合的物理结构和管脚定义。
第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。
这一点决定了插头组合的电平规范。
第三是电源的输出阻抗与负载的输入阻抗必须匹配,否则不能实现完善的供电。
这一点决定了电源的工作性质。
这三点其实就是电源插头组合在物理层面上的规范性协议。
再看通信接口。
在有关计算机信息交换的ISO/OSI模型里,物理层是最底层(第一层),它规定了接口的机械外形、接口管脚定义、接口电平和字节格式。
这里的字节格式,指的是一个字节中有几个数据位,有几个起始位/停止位,有几个奇偶校验位。
一般地,一个字节有8个数据位,1个起始位(停止位),和1个奇偶校验位。
注意:起始位和停止位可以合并。
再看通信接口和通信网络的工作制问题。
当我们拿手机挂电话时,我们发现通信双方在通话的同时也可以接听,这叫做全双工(双向工作制);如果说话的时候不能听,而接听的时候不能说,但任何一方都具有说和听的能力,也即对讲机的通话型式,这叫做半双工。
RS422接口和RS232接口是全双工接口,而RS485则是半双工接口。
对于半双工接口,显然需要有通信的发起者,所以RS485接口和网络一定具有主站和若干从站,并且从站的数量也有规定。
一般地,从站的数量是32个。
RS485主站与从站的关系问题,看似只是通信工作制的不同,其本质是通信各方对通信总线控制权的合理分配。
我们再看总线连接问题。
我们还是以电源为例。
我们可以从电源引出一条主干线,然后再并联若干个支路并分别送到若干个负载。
只要满足电源的功率要求,显然这是可行的。
RS-485和Modbus通信协议及工作原理
RS-485和Modbus通信协议及工作原理在(工业控制)、电力通讯、(智能)仪表等领域,通常情况下是采用串口(通信)的方式进行数据交换。
最初采用的方式是(RS)232接口,由于(工业)现场比较复杂,各种(电气)设备会在环境中产生比较多的电磁千扰,会导致(信号)传输错误。
1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus 协议,所以今天我们来了解下RS485通信和Modbus通信协议。
什么是串口通信串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并目可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
(RS-485)协议概述RS-485和RS-232一样,都是审行通信标准,现在的标准名称是(TI)A485/EIA-485-A,但是人们会习惯称为RS485标准,RS-485常用在工业、自动化、汽车和建筑物管理等领域。
RS-485总线弥补了RS-232通信距离短,速率低的缺点,RS-485的速率可高达10Mbit/s,理论通讯距离可达1200米;RS-485和RS-232的单端传输不一样是差分传输,使用一对双绞线,其中一根线定义为A,另一个定义为B。
通常情况下,RS485的信号在传送出去之前会先分解成正负对称的两条线路(即我们常说的A、B信号线),当到达接收端后,再将信号相减还原成原来的信号。
拓扑结构RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线拓扑结构,在同一总线上最多可以挂接32个节点RS-485总线同12C总线一样支持主从模式,支持点对点单从机模式,也支持多从机模式,不支持多主机模式。
RS485通信和Modbus协议培训讲学
R S485通信和M o d b u s协议在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。
最初采用的方式是RS232接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。
除此之外,RS232接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到几十米,不能满足远距离通信要求。
而RS485则解决了这些问题,数据信号采用差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200米,并且允许多个收发设备接到同一条总线上。
随着工业应用通信越来越多,1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus协议,本节课我们要讲解一下RS485通信和Modbus协议。
单单使用一块KST-51开发板是不能够进行RS485实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB转485通信模块。
18.1 RS485通信实际上在RS485之前RS232就已经诞生,但是RS232有几处不足的地方:1、接口的信号电平值较高,达到十几V,容易损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必须加转换电路。
2、传输速率有局限,不可以过高,一般到几十Kb/s就到极限了。
3、接口使用信号线和GND与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
4、传输距离有限,最多只能通信几十米。
5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对RS232接口的不足,就不断出现了一些新的接口标准,RS485就是其中之一,他具备以下的特点:1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。
RS485与Modbus通信协议教程
RS485与Modbus通信协议教程1979年施耐德电气订立了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采纳Modbus协议,所以今日我们来了解下RS485通信和Modbus通信协议。
【一】/前言在工业掌控、电力通讯、智能仪表等领域,通常情况下是采纳串口通信的方式进行数据交换。
最初采纳的方式是RS232接口,由于工业现场比较多而杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。
1979年施耐德电气订立了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采纳Modbus协议,所以今日我们来了解下RS485通信和Modbus通信协议。
【二】/RS485通信1、实际上在RS485之前RS232就已经诞生,但是RS232也有不足:1)接口的信号电平值较高,达到十几V,简单损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必需加转换电路。
2)接口使用的信号线与其他设备形成共地模式的通信,这种共地模式传输简单产生干扰,并且抗干扰性能也比较弱。
3)传输距离、速率都有限,最多只能通信几十米;只能两点之间进行通信,不能够实现多机联网通信。
2、针对RS232接口以上不足,显现了RS485等新的接口标准,RS485具备以下的特点:1)逻辑“1”以两线间的电压差为+(2—6)V表示;逻辑“0”以两线间的电压差为(2—6)V表示。
接口信号电平比RS232降低了,不易损坏电路的芯片,且该电平与TTL电平兼容,可便利与TTL电路连接。
2)RS485通信速度快,数据最高传输速率为10Mbps以上;其内部的物理结构,采纳的是平衡驱动器和查分接收器的组合,抗干扰本领大大加添。
3)传输距离最远可达到1200米左右,但传输速率和传输距离是成反比的,只有在100KB/s以下的传输速率,才能达到最大的通信距离,假如需要传输更远距离可以使用中继。
485通信讲解(附案例)解析
1
2
3
4
5
6
控制器至变频器:
起 始 字
从 机 地
A A
5 5
A 5
异 或 校
节址H H H 验
变频器至控制器:
发送顺序 (字节)
12345
6
起 从软软 机 异 始 机件件 器 或 字 地版版 型 校 节 址本本 号 验
RS485通讯协议
短帧(起始字节=7EH)
控制器至变频器:
发送顺序 1 2 3 4 5 (字节)
RS485 通讯
目录
RS485基础 通讯协议 通讯案例 超级终端
RS485基础
通信接口方式 RS485接口:异步,半双工,串行
数据格式 1位起始位、8位数据位、1位停止位、无校验 1位起始位、8位数据位、1位停止位、奇校验 1位起始位、8位数据位、1位停止位、偶校验 波特率 1200bps、2400bps、4800bps、9600bps、19200bps、38400bps、125K
起始字节 (字节)
从机地址 (字节)
功能码操作 命令/响应 (字节)
功能码号 (字节)
功能码设 定/实际值
(字)
控制/状 态字
(字)
主设定/ 实际值
(字)
异或校验 (字节)
帧头
参数数据
用户数据
过程数据
帧尾
RS485通讯协议
特殊报文(起始字节=68H),用于获取从站的软件版本和机器型号
发送顺序 (字节)
通信方式 采用主机“轮询”,从机“应答”的点对点通信方式,变频器为从机。 主机使用广播地址发送命令时,从机不允许应答。 从机在最近一次对主机轮询的应答帧中上报当前故障信息。 通信准备 用从机键盘设置变频器串行接口通信参数:本机地址、波特率、数据格式。 具备RS232的主机可以使用通信接口转换器( OCI-6A)完成到RS485的转换。
安可信RS485通讯协议(V1.2)
HTX48501操作手册该产品的功能是负责把控制器的信号转换为标准的modbus协议信号。
一、硬件接口该产品使用RS485接口与modbus协议的主站进行通信。
RS485接口采用3线进行通信,分别为A,B,PGND。
二、软件接口使用modbus标准协议对可燃气体报警系统的信号进行解析。
使用到modbus协议的功能代码为1,2,3,4,5。
三、Modbus协议说明1.传输协议modbus传输模式:RTU波特率:9,600bps传输字节特性:起始位:1位数据位(最小位优先):8位奇偶校验:奇校验停止位:1位错误校验:CRC校验2.协议解析该协议支持两种数据访问模式,分别为位地址和寄存器地址(16位)。
a.地址表示该从modbus设备的通信地址(该地址的范围为1~247),该地址由控制器进行设置。
b.c.数据访问地址数据访问地址:就是访问的寄存器起始地址。
各种类型数据的具体起始访问地址(十进制表示)如下:x000:探测器的浓度x064:探测器的状态x128:模块的开关状态x168:控制器状态控制器中最多允许接入128个探测器,64个外部模块,4个内部模块。
地址以十进制数进行表示,千位为X,表示x的值可以为1~9。
其它位数的值固定。
数据访问地址的增量为2,比如:x000表示1号探测器,x001也表示1号探测器,x002和x003表示2号探测器。
(即访问地址除以2然后加1就是具体设备的编号)。
d.数据数据:通信发送要处理的实际数据。
注意:应答数据不能够超过255个字节。
e.CRC校验Modbus协议采用16位的CRC校验。
3.设备状态说明探测器状态如下:0:探头短路1:探头断线2:探头老化3:其它故障4:未标定5:零点变化7:无响应9:探头自检a:正常d:预报警e:低限报警f:高限报警4.modbus消息例子a.读取模块的开关状态实例1:发送:表示1,2,3,4号模块都断开。
实例2:应答:表示模块2闭合,内部模块3断开,模块4~6闭合。
485通信和modbus协议
{ TI = 0; //手动清零发送中断标志位
flagOnceTxd = 1; //设置单次发送完成标志
}
} /***********************main.c 文件程序源代码*************************/
cntbkp = cntRxd; idletmr = 0; } else { if (idletmr < 30) //接收计数器未改变,即总线空闲时,累积空闲时间 {
idletmr += ms; if (idletmr >= 30) //空闲时间超过 30ms 即认为一帧命令接收完毕 {
cmdArrived = 1; //设置命令到达标志 } } } } else { cntbkp = 0; } } void InterruptUART() interrupt 4 //UART 中断服务函数 { if (RI) //接收到字节 { RI = 0; //手动清零接收中断标志位 if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时, { bufRxd[cntRxd++] = SBUF; //保存接收字节,并递增计数器 } } if (TI) //字节发送完毕
#include <intrins.h> sbit RS485_DIR = P1^7; //RS485 方向选择引脚
bit flagOnceTxd = 0; //单次发送完成标志,即发送完一个字节
bit cmdArrived = 0; //命令到达标志,即接收到上位机下发的命令
unsigned char cntRxd = 0; unsigned char pdata bufRxd[40]; //串口接收缓冲区
手把手教你学51单片机之十八RS485通信与Modbus协议
在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。
最初采用的方式是 RS232 接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。
除此之外,RS232 接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到几十米,不能满足远距离通信要求。
而 RS485 则解决了这些问题,数据信号采用差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200 米,并且允许多个收发设备接到同一条总线上。
随着工业应用通信越来越多, 1979 年施耐德电气制定了一个用于工业现场的总线协议 Modbus 协议,现在工业中使用RS485 通信场合很多都采用 Modbus 协议,本节课我们要讲解一下 RS485 通信和Modbus 协议。
单单使用一块KST-51 开发板是不能够进行RS485 实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB 转 485 通信模块。
18.1 RS485通信实际上在 RS485 之前 RS232 就已经诞生,但是RS232 有几处不足的地方:1、接口的信号电平值较高,达到十几V ,容易损坏接口电路的芯片,而且和TTL 电平不兼容,因此和单片机电路接起来的话必须加转换电路。
2、传输速率有局限,不可以过高,一般到几十Kb/s 就到极限了。
3、接口使用信号线和GND 与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
4、传输距离有限,最多只能通信几十米。
5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对 RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一,他具备以下的特点:1、我们在讲A/D 的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。
MODBUS实例485通讯解析
用RS485端口控制TVF2000使用说明:一、硬件连接:1.RS485/RS485:(1)终端设备:将J2用终端方式短接;(2)非终端设备:将J2用非终端方式短接;(3)A、B、AGND对接;(4)如果使用屏蔽线,SCR对接。
2.RS485/RS232(PC机):(1)用RS485/RS232转换器;(2)PC机串口与转换器RS232口连接;(3)TVF2000的CN1与转换器的RS485口的A、B、AGND连接。
二、用MODBUS与TVF2000通讯(RTU方式):1.TVF2000键盘设置:a)键盘菜单设置说明:i.1001=10:外端子1用通讯控制;ii.5005=2:标准MODBUS通讯方式;iii.5201=1-247:从机号(缺省=1);iv.5202=5:通讯速度为9600bps(缺省=5);v.5203=0:无效验(缺省=0);vi.其它=缺省值;b)键盘具体操作:i.9952 = 1:参数初始化;ii.1001 = 10;iii.5005 = 2;这样设置后,就可以与TVF2000通讯了。
2.TVF2000使用的MODBUS命令:a)读存储寄存器:03命令;b)写单个寄存器:06命令;c)写多个寄存器:16命令;3.MODBUS单寄存器写入命令说明(其它说明见附录):a)主机发送:i.[地址]:从机地址1-247;ii.[命令]:06,单寄存器写入命令;iii.[寄存器地址_H]:寄存器地址高8位;iv.[寄存器地址_L]:寄存器地址低8位;v.[数据_H]:写入数据高8位;vi.[数据_L]:写入数据低8位;vii.[CRC_H]:CRC效验高8位;viii.[CRC_L]:CRC效验低8位;b)从机返回(正常):i.[地址]:从机地址1-247(相同地址);ii.[命令]:06,单寄存器写入命令;iii.[寄存器地址H]:寄存器地址高8位;iv.[寄存器地址L]:寄存器地址低8位;v.[数据_H]:写入数据高8位;vi.[数据_L]:写入数据低8位;vii.[CRC_H]:CRC效验高8位;viii.[CRC_L]:CRC效验低8位;c)通讯具体操作(菜单1102=7为例):i.主机发送:[01][06][04][4E][00][07][CRC_H][CRC_L];ii.从机返回(正常):[01][06][04][4E][00][07][CRC_H][CRC_L];4.用通讯命令设置菜单值(调速前必须设置):i.1102=7;外部1有效;ii.1103=8;由串行通讯给定;iii.0002=初始频率;如果不设置,为菜单1104的值;iv.0001=0x06;命令寄存器:0001;v.0001=0x0f;vi.0001=0x2f;启动;vii.0001=0x6f;到达设定频率;5.用通讯命令调速(给定寄存器1:0002):i.0002=0-20000;调速:0对应1104的值,20000对应1105的值;ii.通过03命令读取状态寄存器(0004)的值;iii.通过03命令读取保持寄存器(0005、0006)的值;iv.用通讯命令停车:0001 = 0x06;6.7.给定寄存器1:0002(MODBUS为40002)说明如下:i. 输出频率与给定值成正比例;ii. 输出频率=(0002的值)*(1105的值)/20000;8.状态寄存器:0004(MODBUS为40004)说明如下:9.保持寄存器:0005(MODBUS为40005):实际输出频率(单位:Hz);10.保持寄存器:0006(MODBUS为40006):实际输出电流(单位:0.1A);11.状态寄存器、保持寄存器均为只读;12.如果想保存通讯设置,必须用键盘设置菜单1607=1。
雷达水位计RS485 MODBUS通讯协议规范
26GHz脉冲雷达水位计RS485 MODBUS
通讯协议规范
1.MODBUS协议介绍
Modbus 协议是应用于电子控制器上的一种通用语言。
通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。
Modbus 协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。
Modbus遵从主从模式,协议在一根通讯线上使用应答式连接(半双工),协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换,这就不会在使它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。
传输方式是一个信息帧内一系列独立的数据结构以及用于传输数据的有限规则,雷达水位计是以RTU(远程终端单元)模式在Modbus总线上进行通讯。
代码系统
●8位二进制,十六进制数0...9,A...F
●消息中的每个8位域都是一个两个十六进制字符组成
每个字节的位
●1个起始位
●8个数据位,最小的有效位先发送
●1个奇偶校验位,无校验则无
●1个停止位(有校验时),2个Bit(无校验时)
错误检测域
●CRC(循环冗长检测)
2.RTU模式的数据结构
3.通讯配置
4.雷达水位计通讯协议定义
5.雷达水位计通讯示范
2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18.1 RS485通信实际上在RS485之前RS232就已经诞生,但是RS232有几处不足的地方:1、接口的信号电平值较高,达到十几V,容易损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必须加转换电路。
2、传输速率有局限,不可以过高,一般到几十Kb/s就到极限了。
3、接口使用信号线和GND与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
4、传输距离有限,最多只能通信几十米。
5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对RS232接口的不足,就不断出现了一些新的接口标准,RS485就是其中之一,他具备以下的特点:1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。
而RS485就是一种差分通信方式,它的通信线路是两根,通常用A和B或者D+和D-来表示。
逻辑“1”以两线之间的电压差为+(0.2~6)V表示,逻辑“0”以两线间的电压差为-(0.2~6)V来表示,是一种典型的差分通信。
2、RS485通信速度快,最大传输速度可以达到10Mb/s以上。
3、RS485内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增加。
4、传输距离最远可以达到1200米左右,但是他的传输速率和传输距离是成反比的,只有在100Kb/s 以下的传输速度,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。
5、可以在总线上进行联网实现多机通信,总线上允许挂多个收发器,从现有的RS485芯片来看,有可以挂32、64、128、256等不同个设备的驱动器。
RS485的接口非常简单,和RS232所使用的MAX232是类似的,只需要一个RS485转换器,就可以直接和我们单片机的UART串行接口连接起来,并且完全使用的是和UART一致的异步串行通信协议。
但是由于RS485是差分通信,因此接收数据和发送数据是不能同时进行的,也就是说它是一种半双工通信。
那我们如何判断什么时候发送,什么时候接收呢?RS485类的芯片很多,这节课我们以MAX485为例讲解RS485通信,如图18-1所示。
图18-1 MAX485硬件接口MAX485是美信(Maxim)推出的一款常用RS485转换器。
其中5脚和8脚是电源引脚,6脚和7脚就是485通信中的A和B两个引脚,而1脚和4脚分别接到我们单片机的RXD和TXD引脚上,直接使用单片机UART进行数据接收和发送。
而2脚和3脚就是方向引脚了,其中2脚是低电平使能接收器,3脚是高电平使能输出驱动器。
我们把这两个引脚连到一起,平时不发送数据的时候,保持这两个引脚是低电平,让MAX485处于接收状态,当需要发送数据的时候,把这个引脚拉高,发送数据,发送完毕后再拉低这个引脚就可以了。
为了提高RS485的抗干扰性能,需要在靠近MAX485的A和B引脚之间并接一个电阻,这个电阻阻值从100欧到1K都可以。
在这里我们还要介绍一下如何使用KST-51单片机开发板进行外围扩展实验。
我们的开发板只能把基本的功能给同学们做出来提供实验练习,但是同学们学习的脚步不应该停留在这个实验板上。
如果想进行更多的实验,就可以通过单片机开发板的扩展接口进行扩展实验。
大家可以看到蓝绿色的单片机座周围有32个插针,这32个插针就是把单片机的32个IO引脚全部都引出来了。
在原理图上体现出来的就是我们的J4、J5、J6、J7这4个器件,如图18-2所示。
图18-2 单片机扩展接口这32个IO口不是所有的IO口都可以用来对外扩展,其中既作为数据输出,又可以作为数据输入的引脚是不可以用的,比如P3.2、P3.4、P3.6引脚,这三个引脚是不可用的。
比如P3.2这个引脚,如果我们用来扩展,发送的信号如果和DS18B20的时序吻合,会导致DS18B20拉低引脚,影响通信。
除这3个IO口以外的其他29个IO口,都可以使用杜邦线接上插针,扩展出来使用。
当然了,如果把当前的IO口应用于扩展功能了,板子上的相应的功能就实现不了了,也就是说需要扩展功能和板载功能二选一。
在进行RS485实验中,我们通信用的引脚必须是P3.0和P3.1,此外还有一个方向控制引脚,我们使用杜邦线将其连接到P1.7上去。
RS485的另外一端,大家可以使用一个USB转485模块,用双绞线把开发板和模块上的A和B分别对应连起来,USB那头插入电脑,然后就可以进行通信了。
学习了第13章的实用串口通信的方法和程序后,做这种串口通信的方法就很简单了,基本是一致的。
我们使用实用串口通信的思路,做了一个简单的程序,通过串口调试助手下发任意个字符,单片机接收到后在末尾添加“回车+换行”符后再送回,在调试助手上重新显示出来,先把程序贴出来。
程序中需要注意的一点是:因为平常都是将485设置为接收状态,只有在发送数据的时候才将485改为发送状态,所以在UartWrite()函数开头将485方向引脚拉高,函数退出前再拉低。
但是这里有一个细节,就是单片机的发送和接收中断产生的时刻都是在停止位的一半上,也就是说每当停止位传送了一半的时候,RI或TI就已经置位并且马上进入中断(如果中断使能的话)函数了,接收的时候自然不会存在问题,但发送的时候就不一样了:当紧接这向SBUF写入一个字节数据时,UART硬件会在完成上一个停止位的发送后,再开始新字节的发送,但如果此时不是继续发送下一个字节,而是已经发送完毕了,要停止发送并将485方向引脚拉低以使485重新处于接收状态时就有问题了,因为这时候最后的这个停止位实际只发送了一半,还没有完全完成,所以就有了UartWrite()函数内DelayX10us(5)这个操作,这是人为的增加了延时50us,这50us的时间正好让剩下的一半停止位完成,那么这个时间自然就是由通信波特率决定的了,为波特率周期的一半。
/***********************RS485.c文件程序源代码*************************/#include <reg52.h>#include <intrins.h>sbit RS485_DIR = P1^7; //RS485方向选择引脚bit flagOnceTxd = 0; //单次发送完成标志,即发送完一个字节bit cmdArrived = 0; //命令到达标志,即接收到上位机下发的命令unsigned char cntRxd = 0;unsigned char pdata bufRxd[40]; //串口接收缓冲区void ConfigUART(unsigned int baud) //串口配置函数,baud为波特率{RS485_DIR = 0; //RS485设置为接收方向SCON = 0x50; //配置串口为模式1TMOD &= 0x0F; //清零T1的控制位TMOD |= 0x20; //配置T1为模式2TH1 = 256 - (11059200/12/32) / baud; //计算T1重载值TL1 = TH1; //初值等于重载值ET1 = 0; //禁止T1中断ES = 1; //使能串口中断TR1 = 1; //启动T1}unsigned char UartRead(unsigned char *buf, unsigned char len) //串口数据读取函数,数据接收指针buf,读取数据长度len,返回值为实际读取到的数据长度{unsigned char i;if (len > cntRxd) //读取长度大于接收到的数据长度时,{len = cntRxd; //读取长度设置为实际接收到的数据长度}for (i=0; i<len; i++) //拷贝接收到的数据{*buf = bufRxd[ i];buf++;}cntRxd = 0; //清零接收计数器return len; //返回实际读取长度}void DelayX10us(unsigned char t) //软件延时函数,延时时间(t*10)us{do {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();} while (--t);}void UartWrite(unsigned char *buf, unsigned char len) //串口数据写入函数,即串口发送函数,待发送数据指针buf,数据长度len{RS485_DIR = 1; //RS485设置为发送while (len--) //发送数据{flagOnceTxd = 0;SBUF = *buf;buf++;while (!flagOnceTxd);}DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定RS485_DIR = 0; //RS485设置为接收}void UartDriver() //串口驱动函数,检测接收到的命令并执行相应动作{unsigned char len;unsigned char buf[30];if (cmdArrived) //有命令到达时,读取处理该命令{cmdArrived = 0;len = UartRead(buf, sizeof(buf)-2); //将接收到的命令读取到缓冲区中buf[len++] = '\r'; //在接收到的数据帧后添加换车换行符后发回buf[len++] = '\n';UartWrite(buf, len);}}void UartRxMonitor(unsigned char ms) //串口接收监控函数{static unsigned char cntbkp = 0;static unsigned char idletmr = 0;if (cntRxd > 0) //接收计数器大于零时,监控总线空闲时间{if (cntbkp != cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时 {cntbkp = cntRxd;idletmr = 0;}else{if (idletmr < 30) //接收计数器未改变,即总线空闲时,累积空闲时间{idletmr += ms;if (idletmr >= 30) //空闲时间超过30ms即认为一帧命令接收完毕{cmdArrived = 1; //设置命令到达标志}}}}else{cntbkp = 0;}}void InterruptUART() interrupt 4 //UART中断服务函数{if (RI) //接收到字节{RI = 0; //手动清零接收中断标志位if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时,{bufRxd[cntRxd++] = SBUF; //保存接收字节,并递增计数器 }}if (TI) //字节发送完毕{TI = 0; //手动清零发送中断标志位flagOnceTxd = 1; //设置单次发送完成标志}}/***********************main.c文件程序源代码*************************/#include <reg52.h>unsigned char T0RH = 0; //T0重载值的高字节unsigned char T0RL = 0; //T0重载值的低字节void ConfigTimer0(unsigned int ms);extern void ConfigUART(unsigned int baud);extern void UartRxMonitor(unsigned char ms);extern void UartDriver();void main (){EA = 1; //开总中断ConfigTimer0(1); //配置T0定时1msConfigUART(9600); //配置波特率为9600while(1){UartDriver();}}void ConfigTimer0(unsigned int ms) //T0配置函数{unsigned long tmp;tmp = 11059200 / 12; //定时器计数频率tmp = (tmp * ms) / 1000; //计算所需的计数值tmp = 65536 - tmp; //计算定时器重载值tmp = tmp + 34; //修正中断响应延时造成的误差T0RH = (unsigned char)(tmp >> 8); //定时器重载值拆分为高低字节T0RL = (unsigned char)tmp;TMOD &= 0xF0; //清零T0的控制位TMOD |= 0x01; //配置T0为模式1TH0 = T0RH; //加载T0重载值TL0 = T0RL;ET0 = 1; //使能T0中断TR0 = 1; //启动T0}void InterruptTimer0() interrupt 1 //T0中断服务函数{TH0 = T0RH; //定时器重新加载重载值TL0 = T0RL;UartRxMonitor(1); //串口接收监控}现在看这种串口程序,是不是感觉很简单了呢?串口通信程序我们反反复复的使用,加上随着我们学习的模块越来越多,实践的越来越多,原先感觉很复杂的东西,现在就会感到简单了。