查看: 2398|回复: 32

扩展库使用说明——modbus从机

[复制链接]

28

主题

66

帖子

1149

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1149
发表于 2023-7-17 19:50:37 | 显示全部楼层 |阅读模式
本帖最后由 LZY825597017 于 2023-7-17 19:50 编辑

在这里Modbus主要指Modbus-RTU协议,下面的说明均以Modbus-RTU协议进行说明。如果对Modbus协议不了解,建议先下载最下方的“Modbus协议.pdf”文档熟悉该协议。
1-协议简介
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
2-硬件连接
Modbus协议实际应用一般基于RS485物理层,下图为RS485模块接线图:


在测试协议时,可以通过串口与电脑上位机软件通信进行测试,下面的测试程序都是直接通过电脑上位机进行测试。
3-图形块说明
在这里会挑一些重要或者特殊的进行说明。各类寄存器作用以及代表数据位数等这里不做解释,如有需求,请先熟悉modbus协议。图形化所有接收数据均为无符号8位整数,以下不在赘述。

1、modbus从机初始化
image.png
输入参数:选择所需要使用的串口并确定好波特率和校验方式;从机地址:指从机的地址,从机的地址必须唯一,主机可以通过从机地址寻找到从机并进行数据读写;

2、modbus设置寄存器的数量(根据需要设置数量,默认如下)
image.png
输入参数:输入数值,确定好各种寄存器的数量(不一定每一种都需要设置,请根据自己需求选择添加);
注:后续读写各类寄存器时,读写数量不得超过此时设置的数量

3、modbus设置寄存器初始地址
image.png
输入参数:输入数值,确定好各类寄存器的初始地址,如没有特殊要求,默认即可。

4、modbus定时器回调函数
image.png
需将此函数放在100us定时器中,以达到100us调用一次。

5、从机轮循环数
image.png
一般将此函数放入主函数中(主函数尽量不要阻塞,导致实时性不好),在ASRPRO图形化中,该函数与上述定时器回调函数合并。

6、设置和读取线圈寄存器
image.png
设置线圈寄存器:参数:1、需要设置线圈的地址 2、写入线圈的值(写入线圈的值为0或1)。  
获取线圈寄存器:输入参数:需要获取线圈的地址    返回参数:输入地址错误返回-1,成功返回0或者1。
注:设置或获取线圈的地址必须大于等于线圈初始地址且小于等于初始地址加上线圈寄存器的数量

7、设置和读取离散寄存器
image.png
设置离散寄存器:参数:1、需要设置离散寄存器的地址 2、写入离散寄存器的值(写入离散寄存器的值为0或1)。  
获取离散寄存器:输入参数:需要获取离散寄存器的地址    返回参数:输入地址错误返回-1,成功返回0或者1。
注:设置或获取离散寄存器的地址必须大于等于离散寄存器初始地址且小于等于初始地址加上离散寄存器的数量

8、设置和读取输入寄存器
image.png
设置输入寄存器:参数:1、需要设置输入寄存器的地址 2、写入输入寄存器的值(写入寄存器数据类型无符号16位整数)。  
获取输入寄存器:输入参数:需要获取输入寄存器的地址    返回参数:输入地址错误返回0,成功返回无符号16位整数。
注:设置或获取输入寄存器的地址必须大于等于输入寄存器初始地址且小于等于初始地址加上输入寄存器的数量

9、设置和读取保持寄存器

image.png
设置保持寄存器:参数:1、需要设置保持寄存器的地址 2、写入保持寄存器的值(写入寄存器数据类型为无符号16位整数)。  
获取保持寄存器:输入参数:需要获取保持寄存器的地址    返回参数:输入地址错误返回0,成功返回无符号16位整数。
注:设置或获取输入寄存器的地址必须大于等于输入寄存器初始地址且小于等于初始地址加上输入寄存器的数量


4-范例代码-STC32G
1.读写线圈
在程序写线圈,使用Modbus Poll读取查看线圈值
image.png
Modbus Poll中的数据和程序中的一样
image.png
发送16进制 01 01 00 00 00 0A BC 0D
依次分析 01(从机地址)01(01功能码)00 00(从地址0开始读)00 0A(读10个数据)BC 0D(对前面6个数据CRC校验)
接收16进制 01 01 02 55 01 47 6C
依次分析 01(从机地址)01(01功能码)02(返回数据长度)55 01(字节返回)47 6C(对前面5个数据CRC校验)

2.读写保持寄存器
程序中随机写保持寄存器
image.png
Modbus Poll中的数据
image.png
发送16进制 01 03 00 00 00 0A C5 CD
依次分析 01(从机地址)03(03功能码)00 00(从地址0开始读)00 0A(读10个数据)C5 CD(对前面6个数据CRC校验)
接收16进制 01 03 14 00 FF 00 24 00 2D 00 0C 00 0A 00 06 00 00 00 00 00 00 00 00 2A C5
依次分析 01(从机地址)03(03功能码)14(返回数据长度)00 FF 00 24 00 2D 00 0C 00 0A 00 06 00 00 00 00 00 00 00 00 (读10个数据) 2A C5(对前面6个数据CRC校验)



image.png
image.png

Modbus协议.pdf

1.04 MB, 下载次数: 54

ModbusPoll7.0.1 ModbusSalve6.1.3 SN.zip

5.66 MB, 下载次数: 65

modbus_保持.zip

1.52 KB, 下载次数: 83

回复

使用道具 举报

1

主题

4

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2023-7-31 12:31:39 | 显示全部楼层
0.0.3版本的modbus 从机在asr-one上编译有问题  一个是rs485pin的地方,一个是SerialInit方法里。修改之后链接也报错如图 QQ图片20230731123045.png
这个是啥问题大概什么解决思路
回复

使用道具 举报

0

主题

2

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2023-9-8 14:35:53 | 显示全部楼层
一样的代码为啥我的不行呢
发送了没回复
回复

使用道具 举报

0

主题

2

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2023-9-15 08:13:55 | 显示全部楼层
这个串口的中断还能另行使用吗?我想知道什么时候寄存器的值被改变了。
回复

使用道具 举报

28

主题

66

帖子

1149

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1149
 楼主| 发表于 2023-9-21 18:11:50 | 显示全部楼层
shanqs 发表于 2023-7-31 12:31
0.0.3版本的modbus 从机在asr-one上编译有问题  一个是rs485pin的地方,一个是SerialInit方法里。修改之后 ...

堆栈重叠,你可以查看485和串口缓存地址是否有重叠
回复

使用道具 举报

28

主题

66

帖子

1149

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1149
 楼主| 发表于 2023-9-21 18:13:51 | 显示全部楼层
bshs8353 发表于 2023-9-8 14:35
一样的代码为啥我的不行呢
发送了没回复

那先检查一下接线是否正确,串口引脚是否反了。
回复

使用道具 举报

28

主题

66

帖子

1149

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1149
 楼主| 发表于 2023-9-21 18:16:39 | 显示全部楼层
bshs8353 发表于 2023-9-15 08:13
这个串口的中断还能另行使用吗?我想知道什么时候寄存器的值被改变了。

不可以另外使用的,你可以在主函数中阻塞判断,依次检查判断每一个寄存器的值是否与上一次相同,如果不同就打印出来
回复

使用道具 举报

1

主题

6

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2023-10-10 20:31:10 | 显示全部楼层
如果是两个串口都当主站,分别读不同设备,应该如何指定呢?
回复

使用道具 举报

0

主题

1

帖子

4

积分

注册会员

Rank: 2

积分
4
发表于 2023-11-7 22:13:17 | 显示全部楼层
这个功能码是如何更改的
回复

使用道具 举报

0

主题

3

帖子

12

积分

注册会员

Rank: 2

积分
12
发表于 2023-11-16 00:36:48 | 显示全部楼层
你好,我用的是stc32g我就初始化添加了modbus初始化串口波特率啥的就报错了
C251 COMPILER V5.60.0.0-SN: Eval VersionCOPYRIGHT ARM Germany GmbH 2018C251 COMPILATION COMPLETE. O WARNING(S), O ERROR(S)MACRO ASSEMBLER A251 V4.69.13.0-Serial Number Eval Version COPYRIGHT ARM Germany GmbH 2014-2018ASSEMBLY COMPLETE. 0 WARNING(S), O ERROR(S).L251 LINKER/LOCATER V4.66.93.0-SN: Eval Version COPYRIGHT ARM Germany GmbH 1995-2018\STC32G\keilout\main.obj, \STC32G\keillib\STC16_MDU32_V10.LIB TO\STC32G\keilout\main PRINT (\STC32G\keilout\main.map)DISABLEWARNING (57) CLASSES (EDATA(OXO-OX1FFF), HDATA(OXO-0X1FFF))*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS NAME: LMUL/STC_MDU32WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSNAME: SLDIV/STC_MDU32RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED:1B5AH BYTE (341%) *★Program Size: data=8.1 edata+hdata=828 xdata=1682 const=2292 code=4849***WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSNAME: LMUL/STC_MDU32*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSNAME: SLDIV/STC_MDU32*** ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED LIMIT: 0800H BYTESMCS 51/251 OBJECT TO HEX FILE CONVERTER V1.47.0.0 COPYRIGHT ARM Germany GmbH 2000-2018ERROR: CANNOT OPEN FILE '\STC32G\keilout\main
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|好好搭搭在线 ( © 好好搭搭在线 浙ICP备19030393号-1 )

GMT+8, 2024-4-29 04:45 , Processed in 0.349784 second(s), 25 queries .

Powered by Discuz!

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表