打印
[STM32F1]

MODBUS通讯协议

[复制链接]
1799|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电脑基于MODBUS协议,通过485模块读取单片机上的温度测量值   问大神怎么实现  请求指导一下
沙发
明天及以后| | 2017-2-15 17:17 | 只看该作者
单片机写modbus协议咯

使用特权

评论回复
板凳
计量研究僧一枚|  楼主 | 2017-2-16 09:00 | 只看该作者
明天及以后 发表于 2017-2-15 17:17
单片机写modbus协议咯

请问怎么写呢  不会啊

使用特权

评论回复
地板
jszy1987| | 2017-2-16 09:19 | 只看该作者
其实就是写一个串口接收协议解包函数,你需要看一下modbus的协议,附件是modbus rtu 协议详细说明,希望对你有所帮助。

Modbus+RTU+标准通讯协议格式.pdf

145.52 KB

使用特权

评论回复
5
计量研究僧一枚|  楼主 | 2017-2-16 09:40 | 只看该作者
jszy1987 发表于 2017-2-16 09:19
其实就是写一个串口接收协议解包函数,你需要看一下modbus的协议,附件是modbus rtu 协议详细说明,希望对 ...

好的 谢谢

使用特权

评论回复
6
sonicll| | 2017-2-16 10:30 | 只看该作者
参照协议说明,搞清楚命令格式,比如说发查询命令需要发送哪些字节,设备返回的响应,每个字节代表什么含义,搞清楚这些就没有什么难度了

使用特权

评论回复
7
zzqwy| | 2017-2-16 11:02 | 只看该作者
如果只是简单的一两个数值上传到PC,可以做成固定的协议,用调试工具把通讯代码确定后,单片机识**按固定格式会传!

使用特权

评论回复
8
计量研究僧一枚|  楼主 | 2017-2-16 11:11 | 只看该作者
sonicll 发表于 2017-2-16 10:30
参照协议说明,搞清楚命令格式,比如说发查询命令需要发送哪些字节,设备返回的响应,每个字节代表什么含义 ...

谢谢

使用特权

评论回复
9
计量研究僧一枚|  楼主 | 2017-2-16 11:11 | 只看该作者
zzqwy 发表于 2017-2-16 11:02
如果只是简单的一两个数值上传到PC,可以做成固定的协议,用调试工具把通讯代码确定后,单片机识**按固定 ...

谢谢

使用特权

评论回复
10
Brand2| | 2017-2-16 19:36 | 只看该作者
需要了解modbus的协议

使用特权

评论回复
11
捉虫天师| | 2017-2-16 21:49 | 只看该作者
12
捉虫天师| | 2017-2-16 21:51 | 只看该作者
首先,要下载一个freemodbus,自己写的modbus协议也可以,但考虑到时间和可扩展性还是选择开源的比较妥当些。这个协议最核心部分我感觉就是对寄存器的读写,当然如果涉及到PLC当然还有继电器等,其他部分已经把接口给你了,然后自己就按照说明去添加就可以。对了,在移植中当时对这个过程        

          *pucRegBuffer++ = ( uint8_t )( usRegHoldingBuf[iRegIndex] >> 8 );
          *pucRegBuffer++ = ( uint8_t )( usRegHoldingBuf[iRegIndex] & 0xFF );

有点模糊,但在纸上画一下就豁然开朗了。其他的就没有难度了。下面就进入正文:

首先需要改动的部分还主要是

eMBRegInputCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNRegs)、

eMBRegHoldingCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNRegs,

eMBRegisterMode eMode)、

eMBRegCoilstCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNCoils,

eMBRegisterMode eMode)、

eMBRegInputCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNDiscrete)

这四个函数,其他部分主要是对portserial.c和porttimer.c这两个文件(相对于你下载的freemodbus-v1.5.0)的改动。而main函数你可以把下载的freemodbus文件中的demo文件下有一个BARE文件,这个文件夹有一个demo.c程序直接把main函数copy过来就大功告成了。。

使用特权

评论回复
13
捉虫天师| | 2017-2-16 21:53 | 只看该作者
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus 协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式
Modbus 是一个请求/应答协议
Modbus
以下是要分解的Modbus热图



使用特权

评论回复
14
捉虫天师| | 2017-2-16 21:54 | 只看该作者
Modbus消息帧

了解了它,会使你对串口通信有一个清晰的认识!

通用消息帧


ASCII消息帧 (在消息中的每个8Bit 字节都作为两个ASCII字符发送)
十六进制,ASCII字符0...9,A...F
消息中的每个ASCII字符都是一个十六进制字符组成
每个字节的位
1个起始位
n个数据位,最小的有效位先发送
1个奇偶校验位,无校验则无
1个停止位(有校验时),2个Bit(无校验时)
错误检测域
LRC(纵向冗长检测)


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


CRC校验 (http://baike.baidu.com/view/1664507.htm)

使用特权

评论回复
15
拉克丝| | 2017-2-18 14:32 | 只看该作者
Modbus 协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的

使用特权

评论回复
16
Rangar| | 2017-2-21 21:19 | 只看该作者
写一个串口接收协议解包函数

使用特权

评论回复
17
ayrz2010| | 2017-3-8 10:59 | 只看该作者
看样子楼主只是简单的了解了一些modbus基础知识,但是不够系统和全面。
其实,modbus虽然比较简单,但是如果不注意有很多坑,
特别是寄存器的位数,大小端处理,浮点数,长整数的处理等等。
目前也没有什么合适的书籍系统介绍,帮助理解的。

刚刚搜了一下,只有最近清华出版的《Modbus软件开发实战指南》不错,
应该是Modbus开发方面第一书,很系统很全面,各种代码都是开源的。
内容着重讲述如何快速入门并精通Modbus软件开发技术,
适用于初学Modbus通信协议的读者,可以看看。
item.jd.com/11536091028.html

使用特权

评论回复
18
hotpower| | 2017-5-2 15:57 | 只看该作者
http://www.21ic.com/tools/HotWC3_V1.23.html

呵呵,这个是绝版了,正在折腾HotWC3_V1.26。
新版本太凶猛,不敢放出来~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝