微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Modbus协议完全资料与程序解析

Modbus协议完全资料与程序解析

时间:12-01 来源:互联网 点击:

下面开始分析定时器,定时器的目的其实就1个,判断一帧是否接收完毕,如果完毕,则进入下一步。在定时器中断函数中,首先要对定时器值进行初始化,这个就不多说了,然后是判断程序是否处于接受状态if(Modbus_recevie_flag == 1),这个状态只有在串口中断函数中才会被置位,其他的情况不会被置位。若程序不是接收状态,则直接跳出定时器中断,若程序处于接收状态,则定时计数自加Modbus_timeout_cnt++;,自加后进入判断if(Modbus_timeout_cnt >

首先判断程序是否处于命令解析状态if(Modbus_cmd_flag == 1)。命令解析状态标志只有在超时后置位,其他情况下不置位。之后是判断接收数据是否大于4字节,if(Modbus_recevie_count >

Modbus_send_buf[temp] = modbus_crc >>

Modbus_send_buf[4] = modbus_crc >>

Modbus_send_buf[i+3]=(data_v&0xff00)>>

for(i=8; i>

ACC = ACC >>

ds1302->

ds1302->

ds1302->

ds1302->

ds1302->

ds1302->

ds1302->

ds1302->timestr[0] = ds1302->

ds1302->timestr[1] = ds1302->

ds1302->

ds1302->

ds1302->

ds1302->timestr[3] = ds1302->

ds1302->timestr[4] = ds1302->

ds1302->

ds1302->crc校验了可以利用返回字节数来确定crc的校验个数temp = temp + 3;,最后计算发送字节的个数

send_cnt = Modbus_recevie_buf[5]*2 + 5 ; //数据发送个数 数据+地址+命令+返回数据个数+crc低+crc高

最后将数据发送出去即可。

5.4 04读只可读模拟量寄存器(输入寄存器)

和03的区别是04就是读ad,ad输入输入模拟两,只能读,不能改,同样也是以模拟两的方式来进行传输的。其程序 与03类似

5.5 05写数字量(线圈状态)

05则是修改io口输出状态,数字量输出。

计算机发送命令:[设备地址] [命令号05] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

设备响应:若执行成功,则原样返回

写程序时,首先确定需要修改的io口,然后根据0xff00或0x0000来置位或清零该数据位。执行完成后,将接收到的数据重新发送即可 Uart0_senddata(Modbus_recevie_buf,8);

5.6 06写单个模拟量寄存器(保持寄存器)

06为修改设备da数据,模拟量传输数据。

计算机发送命令:[设备地址] [命令号06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

设备响应:若执行成功,原样返回即可

5.7 16主机设置寄存器

简单的说,就是一次设置多个da,以一个偏移量为准,一次设置多个输出模拟里量

计算机发送命令:[设备地址] [命令号10] [开始地址高8位] [低8位] [寄存器个数高8位] [低8位] [第一个寄存器数据高][第一个寄存器数据低][第二个寄存器数据高][第二个寄存器数据低]……[CRC校验的低8位] [CRC校验的高8位]

命令响应:功能码[0x10],寄存器起始地址高字节,低字节,要写的寄存器数量的高字节,低字节,CRC校验低字节,高字节

在程序中,首先要获取寄存器个数

num = Modbus_recevie_buf[6] - 2;

然后进入循环,一次把寄存器数据提取出来for(i = 0; i < num; i = i + 2)

在循环的内部提取数据temp = (((unsigned int)(Modbus_recevie_buf[i+7])<8)|(Modbus_recevie_buf[i+8]));

以上就是我在项目中涉及到的一点modbus的通讯的下位机程序,不全,但总体的思路,接收数据并解析,解析后提取数据在设备上加载或采集,然后再按照响应的方式发送回去。

下回改进的方向,1,增加功能码2,增加宏定义及编译定义,3增加单片主机的程序,和pc主从机的程序。4,增加ascii的程序,和rtu同时设置。Pc机程序,采用c#号编写。

完整的程序请参考:http://www.51hei.com/bbs/dpj-23230-1.html

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top