【外设移植】Ai-WB2+Modbus 485 RTU 远程控制

[复制链接]
查看287 | 回复5 | 2024-9-10 13:08:55 | 显示全部楼层 |阅读模式
1.什么是Modbus, RS485 Modbus就是一种用在工业上的简单协议!
    顾名思义,它是一个Bus,即总线协议。比如串口协议、IIC协议、SPI都是通信协议。

    RS485是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485设备放在同一条总线上,这使得多个节点可以相互连接。
   RS-485(目前称为EIA/TIA-485)是通信物理层的标准接口,一种信号传输方式,OSI(开放系统互连)模型的第一级。创建 RS-485是为了扩展RS-232接口的物理功能。
串行EIA-485连接是使用两根或三根电线的电缆完成的:一根数据线、一根带反转数据的电线,通常还有一根零线(接地,0V)。这样,发射器和接收器通过2224AWG 实心线的双绞线电缆交换数据。

1.1RS485RS232比较?
RS485RS232串行通信协议已经使用了50多年,并且仍在整个商业和工业中广泛使用。扩展RS232标准的功能是开发RS485协议的动力。下表概述了这两个标准。
                        协议

                        RS232

                        RS485

协议类型
双工
半双工
信号类型
不平衡
均衡
设备数量
                        1 个发射器和1个接收器
                        多达 32个发射器和43 个接收器
     最大数据传输
                        19.2Kbps     15
                        15     10Mbps
       最大电缆长度
                        约 15.25  米,19.2Kbps
                        大约 1220   米,100   Kbps
输出电流
                        500mA
                        250mA
  最小输入电压
                        +/-   3V
                        0.2V    差分

1.2 现在,让我们来看看这两种协议之间的主要区别。

1.2.1发射器和接收器的数量
    RS232串行接口设计用于连接两个设备。该协议支持单个发射器和接收器之间的通信。
    RS485接口,最多可以将32个串行设备连接到一个变送器。

1.2.2操作距离
    使用RS232协议的设备在发送器和接收器之间的距离限制为15米,同时仍能实现最大数据传输速率。如果可以容忍较慢的数据速率,则可以延长此长度。
   RS485协议大大延长了操作距离。它支持1200米长度的最大数据速率,使RS485协议成为物理上相距遥远的设备之间通信的绝佳选择。
1.2.3数据传输速度
    RS232接口的传输速度为1Mb/s,传输距离可达15米。RS48515米的距离内提供高达10Mb/s的更高速度。当达到1200米的最大长度时,RS485协议以100Kb/s的速度传输数据。

1.2.4电气噪声问题和接地电位
    RS232接口是一种基于电压电平的系统,在接地电位差异最小的情况下性能最佳。表现出高水平电噪声和可变接地电位的环境会影响RS232有效传输数据的能力,并可能导致数据丢失或损坏。
    RS485协议采用差分电压系统,使其能够在具有较高电噪声水平的环境中有效运行。差分电压系统的一个副产品是数据传输距离的延长、传输速度的提高以及RS485所见的更低电压的使用。

1.3Modbus的内容是什么?
Modbus-RTUModbus-ASCIIModbus-TCP以上三种协议,一个设备只会有一种协议,如果你的设备使用的是Modbus-RTU,只需查看以下对应部分,一般来说大部分的设备都是Modbus-RTU协议的。

1.4帧结构   帧结构=地址+功能码+数据+校验

地址:占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)

功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。

数据:根据功能码不同,有不同结构,在下面的实例中有说明。

校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。

这是一个基于ModbusRTU协议的Ai-WB2modbus库,它支持以下几种modbus协议命令:

*0x01: 读一个或多个线圈寄存器;
*0x02: 读一个或多个离散输入寄存器;
*0x03: 读一个或多个保持寄存器;
*0x04: 读一个或多个输入寄存器;
*0x05: 写单个线圈寄存器;
*0x06: 写单个保持寄存器;
*0x0F: 写多个线圈寄存器;
*0x10: 写多个保持寄存器;

1.5Modbus指令实例
1.5.1查询从机地址为01的数据。

   主机发送:01 03 00 00 00 01 84 0A
   从机回复:01 03 02 19 98 B2 7E
发送数据解析
1.png

回复数据解析
2.png

查询数据基本流程就是:

发送:从机的地址+要干嘛的功能码+要查的寄存器的地址+要查的寄存器地址的个数+校验码
回复:从机的地址+主机发我的功能码+要发送给主机数据的字节数 + 数据  +  校验码

1.5.2修改从机地址为01的数据。

    主机发送:01 06 00 00 00 01 48 0A
    从机回复:01 06 00 00 00 01 48 0A

发送数据解析
3.png
4.png 数据解析


1.6 Modbus-RTU协议只需要看懂功能码0x030x060x10这三个基本的就已经足够了,分别回想下其数据域部分:

0x03—主机需要发送起始地址+寄存器数量,从机回复总字节数+数据
0x06—主机发送起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机返回起始地址+数据内容(发现居然一样!)
0x10—主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量

2.外设介绍:

    RS485TTL模块,      
5.png


RS485远程I/O联网模块IODO控制器modbus
6.png



   3.3V5.0V电源、信号兼容的RS485自动流向控制模块无需“收—发”控制,使用本模块跟您操作串口一样简单,透传模块实现了TTL信号与RS485信号的互转,但大家一定要知道,485是半双工通信,这种通信方式可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行;也就是说,通信信道的每一端都可以是发送端,也可以是接收端,但同一时刻里,信息只能有一个传输方向。波特率:支持110128000bps

模块亮点:
1)供电范围宽:3.3V5.5V
23.3V5.0V信号兼容。
3)采用原装进口芯片,工业级设计,抗干扰能力强,同时采用更为有效的485防雷设计,可在工业现场及野外恶劣的环境下使用,工作温度为—40℃+85℃,传输距离可达千米(用的850米的2*1.5的线缆做的测试,建议在800米内使用,超过800米请加中继器)。
4)采用半孔工艺设计,板厚0.8mm,可轻松作为子母板使用,也可焊接端子使用。
5)具有RXDTXD信号指示灯,收发状况尽收眼底。

模块特点:
1)本模块充分考虑了485总线防雷设计和抗干扰设计,在野外长距离传输
时,将模块的“接大地”端接入大地,可以起到很好的抗干扰和防雷的作用,使485总线更安全;室内短距离传输时可以不接入大地。
2)采用标准的2.54间距设计,方便您的二次开发。
3)具有120欧匹配电阻,短接RO即可使能匹配电阻,长距离传输时建议短接。
4)支持多机通讯,允许接在最多128个设备的总线上
5)本模块可以进行热插拔,不会出现其他485芯片热插拔出现的信号栓死现象。
6)大面积铺铜,防止信号干扰。


2.1常用芯片选择

2.2初始化过程
2.2.1引入头文件

#include<stdio.h>
#include<string.h>
#include<FreeRTOS.h>
#include<task.h>
#include<blog.h>
#include"bl_sys.h"
#include<hosal_uart.h>
#include"softcrc.h"
#include"stdint.h"
#include"string.h"

2.2.2设置初始化参数
    波特率:默认串口配置为9600波特率,8位数据位,无校验位,1位停止位。

hosal_uart_dev_tuart_dev_log = {
  .config= {
    .uart_id= 1,
    .tx_pin= 16,  // TXD GPIO
    .rx_pin= 7,   // RXD GPIO
    .cts_pin= 255,
    .rts_pin= 255,
    .baud_rate= 115200,
    .data_width= HOSAL_DATA_WIDTH_8BIT,
    .parity= HOSAL_NO_PARITY,
    .stop_bits= HOSAL_STOP_BITS_1,
    .mode= HOSAL_UART_MODE_POLL,
  },
};

     hosal_uart_init(&uart_dev_log);

2.2.3配置用到的引脚
    默认使用串口引脚:硬件串口
    使用板载引脚4个:TXRX3.3VGND(接线方法见模块说明书或下图)
    RS485引脚:A+连接A+B-连接B-,数据有干扰的情况下GND接地。

3.移植过程(资料介绍、移植至工程、引脚选择);
3.1资料介绍
    地址和命令可以直接以16进制的方式写到数组里,CRC16校验需要计算或查表获得;
    参考网上CRC教程,使用本地CRC库文件二次封装完成CRC校验及校验值追加与打印函数;有关更多CRC计算请参考网上教程。

    由于手头方便的仅有modubusRS485远程控制IO模块,仅以此模块完成命令发送控制其输出继电器开关的例程。

3.1.1电路连线图
    Ai-WB2 => 串口TTL=> MAX485 => AB双绞线=>RS485设备
AI-WB2与模块之间连线时,RX连接RXTX连接TX。请根据模块说明自行调整接线!
7.png
8.png
3.2示例参考程序代码

RS485发送示例代码如下:
----------------------
#include<Ai_WB2_RS485.h>

intcounter = 0;

voidsetup() {
  RS485.begin(9600);
}

voidloop() {
  RS485.beginTransmission();
  RS485.print("hello");
  RS485.println(counter);
  RS485.endTransmission();

  counter++;

  delay(1000);
}
-------------------------------
RS485接收并串口打印示例代码如下:
-----------------------------------
#include<Ai_WB2_RS485.h>

voidsetup() {
  Serial.begin(9600);
  while(!Serial);

  RS485.begin(9600);

  //enable reception, can be //disabled with: RS485.noReceive();
  RS485.receive();
}

voidloop() {
  if(RS485.available()) {
    Serial.write(RS485.read());
  }
}
--------------------------------
注:通过串口助手直接输出指令,有可能因为不是十六进制,或指令尾部被增加回车换行(0D0A)而导致失败!
注:通过串口助手直接输出指令,有可能因为不是十六进制,或指令尾部被增加回车换行(0D0A)而导致失败!
    程序运行过程:wb2通过串口向RS485TTL模块发送指令,远程IO模块通过Modbus端口AB接收数据并解析,然后执行指令动作。
    程序运行现象:RS485TTL模块,TX指示灯每隔两秒点了一下,远程IO模块输出端口1234顺序开启,然后顺序关闭。
    若无硬件,则可以使用串口助手观察命令发送情况。请注意勾选HEX显示。见下图

9.png

程序代码见附件:
程序太过简单,未制作成库文件,各位可直接修改使用。
make相关内容同helloworld文件一样。

PS:感谢,园长,银,狗哥,杰哥,妖哥等各位大佬热情帮助!
编译烧录请参考论坛教程!想不到的问题请大家提问,我尽量协助回答、解决!


编译环境+Ubuntu系统+wsl 我真的搞了不下10多回。。。(给环境优化一下吧,谢谢)
本次研学,时间大都用在了编译环境搭建,还消耗了一个wb2-32S(固件烧错了,变砖了,求教怎么能变回来)和一堆馒头和咖啡,没准还有一两根头发!

wb2_modbus_crc_hanshu_ok.zip

895 Bytes, 下载次数: 3

C代码

Modbus_485.zip

42.09 KB, 下载次数: 6

bin烧录文件

Modbus_Application_Protocol_V1_1b3 (1).pdf

794.74 KB, 下载次数: 2

协议文档

sscom.zip

409.65 KB, 下载次数: 0

串口调试工具

本帖被以下淘专辑推荐:

回复

使用道具 举报

爱笑 | 2024-9-10 13:37:16 | 显示全部楼层
哈哈哈辛苦老师了,必须给鸡腿补补!
用心做好保姆工作
回复 支持 反对

使用道具 举报

putin | 2024-9-10 13:57:15 | 显示全部楼层
不错不错
回复

使用道具 举报

bzhou830 | 2024-9-10 15:20:05 | 显示全部楼层
教师节快乐。
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

iiv | 2024-9-10 20:57:08 | 显示全部楼层
教师节快乐
回复 支持 反对

使用道具 举报

WangChong | 2024-9-11 00:40:42 | 显示全部楼层
头发掉的太亏了 要多吃点补回来
回复 支持 反对

使用道具 举报

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

本版积分规则