YMLXLF 发表于 2009-7-21 22:12:07

初学MODBUS的几点疑问,需要高手们给解决一下,不胜感激

几个基本的问题希望不要见笑:
1.MODBUS协议里强调的是至少大于3.5个字符时间停顿时间计算:(1/BPS)*(3.5*8)是这样算吧?另外在程序中如何实现?
2.在功能代码中的线圈和寄存器都是指的什么啊?继电器?

3.协议中RTU模式的数据结构是

    起始位          设备地址         功能码          数据区         错误校验          结束符

T1-T2-T3-T4      1 个字节      1 个字节       多个字节         2 个字节      T1-T2-T3-T4

这个起始位T1-T4就是3.5个字符时间停顿时间?而设备地址是第一个无数据即receBuf【0】;而receBuf【1】就是功能码,记如下程序所写?这样理解对吗?

//检查uart1数据
void checkComm1Modbus(void)
{
        uint16 crcData;
        uint16 tempData;
       
        if(receCount > 4)         
        {
                switch(receBuf)   //MODBUS功能代码第二个字节?//设备地址?

那么在程序中的receCount > 4这个4是如何计算的呢?

void uart1_rx_isr(void)   //receCount 在此出现======》串口接收中断

{
        uint8 status;
       
//uart has received a character in UDR
        status = UCSR1A;
    receBuf = UDR1;   //receCount接受字节个数
       
    if(status & 0x1c)            //通信出错   查看UCSRA寄存器便知0x1c全是通信出错
           checkoutError = 2;             //偶校验出错

        //testRegister = status;               
    receCount++;                             //接收地址偏移寄存器加1
    receCount &= 0x1f;                //最多一次只能接收32个字节
    receTimeOut = 10;                 //通讯超时值
}

这个程序还有一个疑问就是   receTimeOut = 10;                 //通讯超时值这个10是如何得出的呢?根据波特率不同选择?

oldtom 发表于 2009-7-21 22:37:48

1.3.5个字符是标准的要求间隔时间,可以用定时器来实现。
2.线圈通常是指开出,寄存器有输入寄存器,也有保持型寄存器,读输入寄存器 (0x04)读保持寄存器 (0x03)。
3.你的程序看不懂。

stefgq 发表于 2009-7-21 22:40:36

看看

shinehjx 发表于 2009-7-22 09:22:37

一个线圈就是一个bit。寄存器就是类同mcu的寄存器,modbus所指的寄存器是16bit的

YMLXLF 发表于 2009-7-23 21:43:56

谢谢大家,最近一直在调试,但是还是很不明白,在modbus调试助手中我已经能读出数据,但是只能读出12位多了就是通信错误,写就是通信超时,这又是咋了呢?这个写数据位数和读数据位数都是怎么定义的呢?在在程序中?

ouyanghaoyang 发表于 2010-5-1 20:42:21

新手 恳切 求助呀

fish198868 发表于 2013-3-13 16:05:31

很好的帖子,可惜没有高手回答,我也是有同样的疑惑呀!!

fish198868 发表于 2013-3-18 21:27:28

不懂,路过!!

sunbensen 发表于 2013-4-11 19:13:32

MODBUS协议有3中,RTU,是一种,主要跟PLC通讯的,读写指令有专门定义,如:03 ,06,10等。可以用CRC工具调试。我们公司的看板产品就是用标准的MODBUS-RTU协议。
页: [1]
查看完整版本: 初学MODBUS的几点疑问,需要高手们给解决一下,不胜感激