打印
[应用方案]

新唐Modbus方案介绍(上)

[复制链接]
3447|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Modbus简介

        Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。 [1]  Modbus比其他通信协议使用的更广泛的主要原因有: [2]  公开发表并且无版权要求 易于部署和维护 对供应商来说,修改移动本地的比特或字节没有很多限制 Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。 Modbus的传输模式有ASCII,RTU,TCP。

使用特权

评论回复
沙发
wangjiahao88|  楼主 | 2021-11-13 16:17 | 只看该作者

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2021-11-13 16:17 | 只看该作者
Modbus协议

•Modbus协议有主(master)/从(Slave)通信协议

•每个Slave必须有唯一的地址,最多接247个装置

•传输格式为RTU/ASCII/TCP模式


使用特权

评论回复
地板
wangjiahao88|  楼主 | 2021-11-13 16:19 | 只看该作者
Modbus RTU模式

•使用16进制编码

•2个byte的CRC校验码

•消息中的每个8 Bit字节包含两个4 Bit的十六进位字元

•一在同样的波特率下,可比ASCII方式传送更多的数据

•每两个字节之间发送或者接收的时间间隔不能超过3.5倍字元传输


使用特权

评论回复
5
wangjiahao88|  楼主 | 2021-11-13 16:20 | 只看该作者

使用特权

评论回复
6
wangjiahao88|  楼主 | 2021-11-13 16:21 | 只看该作者

Modbus TCP模式

•包含MBAP(Modbus Application Protocol)Header和Protocol Data Unit(PDU)两部分

•MBAP Header共有7 Bytes,包含:

–Transaction Identifier(2 Bytes):传输配对,server会将request的Transaction Identifier复制到response中

–Protocol Identifier(2 Bytes):Modbus为0

–Length Field(2 Bytes):包含Unit ID以及PDU的Byte长度

–Unit ID(1 Bytes):ID码

•PDU包含:

–功能码(1 Byte)

–数据

•不包含CRC校验码

•使用port 502,以Big-endian传输数据


使用特权

评论回复
7
wangjiahao88|  楼主 | 2021-11-13 16:28 | 只看该作者
Modbus RTU通信示例

1.采用Modbus-RTU从方式
2.地址:地址设定范围1 - 247(出厂预设值为01H)
3.波特率可设置为1200bps,2400bps,4800bps,9600bps(出厂预设值),19200bps,38400bps

4.字节格式:
数据位:8位
起始位:1位
停止位:1位

5.同位检查位:
可设定为偶校验(默认)、奇数同位检查、不校验
•Slave address/Slave ID设备端ID当要读写slave时,必须先知道该设备的address/ID
•常用的modbus功能码(function code)–0×03 0×03功能码(function code)所定义的功能为读取多个寄存器,用来读取一连续位址的数据。
•master读取格式:设备ID(slave address/ID)+ 0×03 +读取起始位置(2 byte)+读取的数量(2byte)+ CRC16
•slave回复格式:设备ID(slave address/ID)+ 0×03 +回复数据的byte数+数据1(4byte)+…+数据n(byte)+ CRC16

使用特权

评论回复
8
wangjiahao88|  楼主 | 2021-11-13 16:47 | 只看该作者

使用特权

评论回复
9
wangjiahao88|  楼主 | 2021-11-13 16:48 | 只看该作者

使用特权

评论回复
10
wangjiahao88|  楼主 | 2021-11-13 16:48 | 只看该作者
portserial.c

•void vMBPortSerialEnable(BOOL xRxEnable,BOOL xTxEnable)
接收、传送中断的开启或关闭功能

•void vMBPortClose(void)
关闭串口

•BOOL xMBPortSerialInit(UCHAR ucPORT,ULONG ulBaudRate,UCHAR ucDataBits,eMBParity eParity)
串口初始化、波特率、数据位长度、奇偶校验位

•BOOL xMBPortSerialPutByte(CHAR ucByte)
传送字元

•BOOL xMBPortSerialGetByte(CHAR * pucByte)
接收字元

•void UART0_IRQHandler(void)
串口中断处理

使用特权

评论回复
11
wangjiahao88|  楼主 | 2021-11-13 16:49 | 只看该作者
porttimer.c

•BOOL xMBPortTimersInit(USHORT usTim1Timerout50us)
设定定时器,时间间格单位为50us


•void vMBPortTimersEnable(void)
致能timer

•void vMBPortTimersDisable(void)
关闭timer

•void TMR0_IRQHandler(void)
定时器中断

使用特权

评论回复
12
wangjiahao88|  楼主 | 2021-11-13 16:52 | 只看该作者
main

/* ----------------------- Defines ------------------------------------------*/
#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 4
#define PLLCON_SETTING CLK_PLLCON_50MHz_HXT
#define PLL_CLOCK 50000000
/* ----------------------- Static variables ---------------------------------*/
static USHORT usRegInputStart = REG_INPUT_START;
static USHORT usRegInputBuf[REG_INPUT_NREGS];
int32_t main()
{
eMBErrorCode eStatus;
/* Unlock protected registers */
SYS_UnlockReg();
/* Enable IRC22M clock */
CLK->PWRCON |= CLK_PWRCON_IRC22M_EN_Msk;
/* Waiting for IRC22M clock ready */
CLK_WaitClockReady(CLK_CLKSTATUS_IRC22M_STB_Msk);
/* Enable the Modbus Protocol Stack. */
eStatus = eMBEnable( );
for( ;; )
{
( void )eMBPoll( );
/* Here we simply count the number of poll cycles. */
usRegInputBuf[0]++;
}
}

Program Size: Code=6112 RO-data=940 RW-data=260 ZI-data=2436
•Project Path:
NUC230_240BSPv3 freemodbus\SampleCode\Modbus_UART\KEIL

使用特权

评论回复
13
wangjiahao88|  楼主 | 2021-11-13 16:53 | 只看该作者

使用特权

评论回复
14
match007| | 2021-11-18 17:22 | 只看该作者
这个就是一个通信协议吧?不是谁家的~~

使用特权

评论回复
15
weiwei4dk| | 2021-11-19 14:26 | 只看该作者
Modbus应用还是很广的

使用特权

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

本版积分规则

474

主题

7520

帖子

30

粉丝