modbus通信协议与程序示范

2020-01-12 17:25发布

RT.
MODBUS协议内通信,发送与回收格式。
另附stc12c5a60s2单片机上运行成功的modbus代码。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
77条回答
blavy
1楼-- · 2020-01-20 08:53
zuu0 发表于 2016-7-6 15:10
上面明白了,,没错

if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num)

rbuf与tbuf就是做为接收或者发送的数组。只是限定的寄存器数量为120个,哪里有只能从0开始的。
        if(bHost_protocol)//当做主机
        {
                reg_num = ModbusPara.tBuf[4];                //输出数量---利用发送的数据
                reg_num <<= 8;
                reg_num += ModbusPara.tBuf[5];
                byteCount = reg_num *2;                                // 字节数=         输出数量*2
                if(ModbusPara.rBuf[2] <= LENGTH_HoldingREG && byteCount == ModbusPara.rBuf[2])
                。
                。
        }
        else//当做从机
        {
                addr_data = ModbusPara.rBuf[2];                //起始地址
                addr_data <<= 8;
                addr_data += ModbusPara.rBuf[3];
                reg_num = ModbusPara.rBuf[4];
                reg_num <<= 8;
                reg_num += ModbusPara.rBuf[5];
                if(reg_num >= 1 && reg_num <= SUM_HoldingREG_WORD)        //有读取寄存器,且数量在120个以内
                {// 保持寄存器个数判断OK
                        if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num) <= SUM_HoldingREG_WORD)
        }
zuu0
2楼-- · 2020-01-20 11:14
本帖最后由 zuu0 于 2016-7-7 11:02 编辑
blavy 发表于 2016-7-7 09:19
rbuf与tbuf就是做为接收或者发送的数组。只是限定的寄存器数量为120个,哪里有只能从0开始的。
        if(bHost ...


谢谢你的解答

主要是这里

if(addr_data < SUM_HoldingREG_WORD && (addr_data + reg_num) <= SUM_HoldingREG_WORD)  这个我是实在没看明白

addr_data 数据起始地址,SUM_HoldingREG_WORD寄存器数量      这二个的比较关系,没看明白,,,因为我以前这个起始地址都是乱来的,0x100,0x1000随便来

(addr_data + reg_num) <= SUM_HoldingREG_WORD  

再加上这句,我就更不明白了  addr_data起始地址, reg_num实际的寄存器数量,,,SUM_HoldingREG_WORD 最大的寄存器数量

后面                                ModbusPara.tBuf[k + 3] =  HoldingREGPara[addr_data];//                       
                                addr_data++;

addr_data不应该是从0开始的么?所以我觉的,是不是约定了起始地址应该0开始的

哎啊,疯了,,能解释一下么
blavy
3楼-- · 2020-01-20 13:46
zuu0 发表于 2016-7-7 09:48
谢谢你的解答

主要是这里

读取回来的数据都是放在HoldingREGPara[120*2]这个数组里,每个寄存器对应其中的HoldingREGPara[2*addr_data],HoldingREGPara[2*addr_data+1]这两字节,为什么addr_data要约定为0.
zuu0
4楼-- · 2020-01-20 14:01
blavy 发表于 2016-7-7 13:35
读取回来的数据都是放在HoldingREGPara[120*2]这个数组里,每个寄存器对应其中的HoldingREGPara[2*addr_d ...

我主要做从机,主机这部分基本删了。。。主机这块也没怎么看,就是看到这个数组,下标 addr_data  一般情况这个地址我会比较任意的,只要双方对应好就可以了

这个地址可以0-fffff都随意,那这个数组得有多大啊

liulingang_1205
5楼-- · 2020-01-20 17:10
 精彩回答 2  元偷偷看……
李程宏
6楼-- · 2020-01-20 18:53
谢谢分享,MODBUS还是挺不错的。

一周热门 更多>