本帖最后由 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从机初始化 输入参数:选择所需要使用的串口并确定好波特率和校验方式;从机地址:指从机的地址,从机的地址必须唯一,主机可以通过从机地址寻找到从机并进行数据读写;
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-范例代码-STC32G 1.读写线圈
在程序写线圈,使用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校验)
|