stm32_实现Modbus-rtu
所属分类:单片机开发
开发工具:C/C++
文件大小:14KB
下载次数:86
上传日期:2017-07-26 15:42:13
上 传 者:
文文wen
说明: 这是modbus协议在stm32上的使用
(This is the use of the Modbus Protocol on the stm32)
文件列表:
User (0, 2011-04-19)
User\main.c (9020, 2011-03-28)
User\modbus.c (10462, 2011-03-29)
User\modbus.h (857, 2011-03-28)
User\stm32f10x_conf.h (3212, 2011-03-27)
User\stm32f10x_it.c (2416, 2011-03-28)
User\stm32f10x_it.h (1898, 2011-02-20)
User\stm32f10x_vector.c (6009, 2008-05-27)
本模块采用ModBus RTU 通讯规约,具体如下:
通讯数据的类型及格式:
信息传输为异步方式,并以字节为单位。每个字节由8位二进制数组成。主机和从机之间传递的通讯信息是10位的字格式:
字格式(串行数据) 10位二进制
起始位 1位
数据位 8位
奇偶校验位 无奇偶校验位
停止位 1位
桢格式:
序号 1 2 3 4 5 6
定义 模块地址 功能代码 起始地址 数据长度 数据内容 校验码
字节数 1 1 2 2 n 2
★ 注:1、本文件中后缀为“H”的数据为16进制数据,如1AH;后缀为“B”的为二进制数据,如11111111B;无后缀的均为10进制数据。
2、每字节数据的顺序是低位在前高位在后,桢数据的顺序是高字节在前低字节在后,校验码低字节在前高字节在后。
(一)、通讯信息传输过程:
1.0 时间间隔:
通讯波特率:9600。监控器和模块的接收一直开着,模块在接收完所有字节后判断是否与本机地址相同,相同则置接收完毕标志等待处理,否则重新初始化串口计数器开始接收。
1.1 地址码:
地址码是每次通讯信息帧的第一字节(8位),从5到13。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的地址码表明该信息来自于何处。
1.2 功能码:
功能码是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为1到127。GKDM-21直流电源模块仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,并表明从机已响应主机并且已进行相关的操作。
表1 MODBUS部分功能码
功能码 定 义 操 作
03H 读多路寄存器 读取一个或多个寄存器的数据
06H 写一路寄存器 把一个数据写入指定寄存器
1.3 数据区:
数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据、参考地址等。
1.4错误校验码(CRC校验):
主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的安全和效率。
MODBUS通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部(CRC低字节在前)。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。
在进行CRC计算时只用8个数据位,而起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。
CRC码的计算方法是:
计算CRC码的步骤为:
(1).预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
(2).把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
(3).把CRC寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(注意:这时的最低位指移位前的最低位,不是移位后的最低位);
(4).如果最低位为0:重复第3步(再次移位)
如果最低位为1:CRC寄存器与多项式A001H(1010000000000001B)进行异或;
(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6).重复步骤2到步骤5,进行下一个8位数据的处理;
(7).最后得到的CRC寄存器即为CRC码。
(二)、功能码简介
2.1 功能码“03”:读多路寄存器
模块中,功能码“03”能够访问的寄存器地址为0120H―0131H,最大数据长度为18。
例如:主机要读取地址为05,起始地址为0120H的9个从机寄存器数据。
主机发送的报文格式:
主机发送 字节数 发送的信息 备 注
从机地址 1 05H 发送至地址为05的从机
功能码 1 03H 读取寄存器
起始地址 2 0120H 起始地址为0120H
数据长度 2 0009H 读取9个寄存器(共18个字节)
CRC码 2 84H 7EH 由主机计算得到CRC码(高位在后)
从机响应返回的报文格式
从机响应 字节数 返回的信息 备 注
从机地址 1 05H 来自从机05
功能码 1 03H 读取寄存器
读取字节数量 1 12H 9个寄存器共18个字节
模块故障 2 XXXXH 地址为0120H、0121H内存的内容
输出电压 2 XXXXH 地址为0122H、0123H内存的内容
输出电流 2 XXXXH 地址为0124H、0125H内存的内容
模块状态 2 XXXXH 地址为0126H、0127H内存的内容
备用 2 XXXXH 地址为0128H、0129H内存的内容
输出限流 2 XXXXH 地址为012AH、012BH内存的内容
均充电压 2 XXXXH 地址为012CH、012DH内存的内容
浮充电压 2 XXXXH 地址为012EH、012FH内存的内容
备用 2 XXXXH 地址为0130H、0131H内存的内容
CRC码 2 XXXXH 由从机计算得到CRC码
0120H为模块故障寄存器的低字节,0121H为模块故障寄存器的高字节。
2.2 功能码“6”:写一路寄存器
模块中,功能码“06”能够访问的输入寄存器地址为0126H―012FH。
例如:主机要向地址为05的模块,起始地址为012CH的寄存器写入数据。
主机发送的报文格式:
主机发送 字节数 发送的信息 备 注
从机地址 1 05H 发送至地址为05的从机
功能码 1 06H 写入一路寄存器
起始地址 2 012CH 起始地址为012CH
均充电压 2 XXXXH 地址为012CH、012DH内存的内容
CRC码 2 XXXXH 由主机计算得到CRC码
从机响应返回的报文格式:与主机发送的报文格式及数据内容完全相同。
模块寄存器信息表
保持寄存器内容均为二进制16位无符号整数数值
地址 表示参数或状态 数值计算方法或含义 备注
0120H 模块故障 0输入异常 1过压 2欠压 3过温 4输出过流过压 只读
0122H 输出电压 输出电压值=寄存器内容值(V) 只读
0124H 输出电流 输出电流值=寄存器内容值/10(A) 只读
0126H 模块状态 0充电方式 2开关机 读|写
0128H 备用 读|写
012AH 输出限流 输出限流值=寄存器内容值/100(A) 读|写
012CH 均充电压 均充电压值=寄存器内容值/10(V) 读|写
012EH 浮充电压 浮充电压值=寄存器内容值/10(V) 读|写
模块状态内容:0126H见下表,0127H为备用。
位 位定义 状态 意义
0 充电方式 0 浮充
1 均充
2 开关机 0 开机
1 关机
1、3~7 备用
故障状态内容:0120H见下表,0121H为备用。
位 位定义 状态 意义
1 输入异常 0 无
1 故障
2 输出过压 0 无
1 故障
4 过温 0 无
1 故障
0、3、5~7 备用
(三)、通讯错误信息及数据的处理:
模块从主机接收到的信息如有CRC码或非法功能码错误,将不予理会 。
近期下载者:
相关文件:
收藏者: