LZY825597017 发表于 2023-7-17 19:50:37

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

本帖最后由 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模块接线图:
https://www.haohaodada.com/new/bbs/data/attachment/forum/202111/24/101623h9jw9ixi94dsc9ic.png

在测试协议时,可以通过串口与电脑上位机软件通信进行测试,下面的测试程序都是直接通过电脑上位机进行测试。3-图形块说明在这里会挑一些重要或者特殊的进行说明。各类寄存器作用以及代表数据位数等这里不做解释,如有需求,请先熟悉modbus协议。图形化所有接收数据均为无符号8位整数,以下不在赘述。
1、modbus从机初始化输入参数:选择所需要使用的串口并确定好波特率和校验方式;从机地址:指从机的地址,从机的地址必须唯一,主机可以通过从机地址寻找到从机并进行数据读写;
2、modbus设置寄存器的数量(根据需要设置数量,默认如下)输入参数:输入数值,确定好各种寄存器的数量(不一定每一种都需要设置,请根据自己需求选择添加);注:后续读写各类寄存器时,读写数量不得超过此时设置的数量
3、modbus设置寄存器初始地址输入参数:输入数值,确定好各类寄存器的初始地址,如没有特殊要求,默认即可。
4、modbus定时器回调函数需将此函数放在100us定时器中,以达到100us调用一次。
5、从机轮循环数一般将此函数放入主函数中(主函数尽量不要阻塞,导致实时性不好),在ASRPRO图形化中,该函数与上述定时器回调函数合并。
6、设置和读取线圈寄存器设置线圈寄存器:参数:1、需要设置线圈的地址 2、写入线圈的值(写入线圈的值为0或1)。获取线圈寄存器:输入参数:需要获取线圈的地址    返回参数:输入地址错误返回-1,成功返回0或者1。注:设置或获取线圈的地址必须大于等于线圈初始地址且小于等于初始地址加上线圈寄存器的数量
7、设置和读取离散寄存器设置离散寄存器:参数:1、需要设置离散寄存器的地址 2、写入离散寄存器的值(写入离散寄存器的值为0或1)。获取离散寄存器:输入参数:需要获取离散寄存器的地址    返回参数:输入地址错误返回-1,成功返回0或者1。注:设置或获取离散寄存器的地址必须大于等于离散寄存器初始地址且小于等于初始地址加上离散寄存器的数量
8、设置和读取输入寄存器设置输入寄存器:参数:1、需要设置输入寄存器的地址 2、写入输入寄存器的值(写入寄存器数据类型无符号16位整数)。获取输入寄存器:输入参数:需要获取输入寄存器的地址    返回参数:输入地址错误返回0,成功返回无符号16位整数。注:设置或获取输入寄存器的地址必须大于等于输入寄存器初始地址且小于等于初始地址加上输入寄存器的数量
9、设置和读取保持寄存器


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

4-范例代码-STC32G1.读写线圈
在程序写线圈,使用Modbus Poll读取查看线圈值Modbus Poll中的数据和程序中的一样发送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.读写保持寄存器程序中随机写保持寄存器
Modbus Poll中的数据发送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校验)


shanqs 发表于 2023-7-31 12:31:39

0.0.3版本的modbus 从机在asr-one上编译有问题一个是rs485pin的地方,一个是SerialInit方法里。修改之后链接也报错如图
这个是啥问题大概什么解决思路

bshs8353 发表于 2023-9-8 14:35:53

一样的代码为啥我的不行呢
发送了没回复

bshs8353 发表于 2023-9-15 08:13:55

这个串口的中断还能另行使用吗?我想知道什么时候寄存器的值被改变了。

LZY825597017 发表于 2023-9-21 18:11:50

shanqs 发表于 2023-7-31 12:31
0.0.3版本的modbus 从机在asr-one上编译有问题一个是rs485pin的地方,一个是SerialInit方法里。修改之后 ...

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

LZY825597017 发表于 2023-9-21 18:13:51

bshs8353 发表于 2023-9-8 14:35
一样的代码为啥我的不行呢
发送了没回复

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

LZY825597017 发表于 2023-9-21 18:16:39

bshs8353 发表于 2023-9-15 08:13
这个串口的中断还能另行使用吗?我想知道什么时候寄存器的值被改变了。

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

liuguangfeng 发表于 2023-10-10 20:31:10

如果是两个串口都当主站,分别读不同设备,应该如何指定呢?

1170082316 发表于 2023-11-7 22:13:17

这个功能码是如何更改的

sumissping 发表于 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
页: [1] 2 3 4
查看完整版本: 扩展库使用说明——modbus从机