单片机通过Modbus协议与HMI通信

上传人:s****a 文档编号:192665066 上传时间:2023-03-07 格式:DOCX 页数:6 大小:18.42KB
收藏 版权申诉 举报 下载
单片机通过Modbus协议与HMI通信_第1页
第1页 / 共6页
单片机通过Modbus协议与HMI通信_第2页
第2页 / 共6页
单片机通过Modbus协议与HMI通信_第3页
第3页 / 共6页
资源描述:

《单片机通过Modbus协议与HMI通信》由会员分享,可在线阅读,更多相关《单片机通过Modbus协议与HMI通信(6页珍藏版)》请在装配图网上搜索。

1、如何用单片机通过MODBUS协议与HMI通信一. Modbus 简介Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化 (SchneiderAutomation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此 协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS, 智能仪表等都在使用Modbus协议作为他们之间的通讯标准。Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。Modbus的ASCII、RTU协议 规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/S

2、lave方式,Master端 发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求; Master端也可以直接发消息修改Slave端的数据,实现双向读写。Modbus协议需要对数据进 行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校 验。ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便, 而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验 也比较容易。但是因为它传输的都是可见的ASCII字符,RTU传输的数据每一个字节ASCII 都要用两个字节来传输

3、,比如RTU传输一个十六进制数0xF9,ASCII就需要传输 F 9的 ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需 要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用 RTU协议。二. ModBus消息帧使用ASCII模式,消息以冒号(:ASCII码3AH)开始,以回车换行(ASCII码0DH,0AH) 符结束。其它域可以使用的传输字符0.9,A.F。网络上的设备不断侦测:字符,当有一 个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将

4、认为传输错误。个典型消息帧如下所示:模式起始地址功能数据校验结束ASCII:设备地址功能代码起地址数据数数据数据nLRC高字节LRC低字节例如:0 60300 6B00 03使用RTU模式,两个消息间至少要有3.5个字符时间的停顿间隔,整个消息帧必须作为 一连续的流转输,如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将假定下一 字节是一个新消息的地址域。同样,如果一个新消息在小于3.5个字符时间内接着前个消息 开始,接收的设备将会认为它是前一消息的延续。这将导致一个错误,所以每一帧间的间隔 必须大于3.5个字符时间,而在一帧内每个数据间隔不应大于1.5个字符时间.模式起始地址功能数

5、据校验结束RTU(4T)设备地址功能代码起地址数据数数据数据nCRC高字节CRC低字节(4T)例如0 60300 6B00 03三.参考程序:下面以MCS-51单片机作为Modbus RTU从站与eView MD204L通信例子.1. 联接方式通信按RS232可RS485方式联接.通信速率为19200,数据位为8位,停止位1位,无 校验.2. MD204L选用Modbus RTU协议,按相同方式设置好通信参数.3. 工作原理MCU处理事务的过程中,串口处于侦听状态,当收到数据时,启动计时器,在发现一个 大于3.5T的间隔后,判断报文的地址域是否与本身的设备地址一致,如果是的话,对收到 的缓冲区

6、内容进行校验,如果通过校验则认为是一个合法的Modbus报文帧,对该报文进行 解释,并产生回送报文.4. 示例报文发出:01 04 00 0200 01 90 0A解释:01为站号,0002为起地址,0001为长度(1个字) 回复:01 04 02 10 00 B4 F0 解释:01为回复站,02为字节数,10 00为数据5. 参考程序如下对MCU串口进行设置void protocol_init(void)/波特率 19200,8,1,odd/都用工作方式3,不需要第9位时就将TB8赋1SCON = 0xD0;工作方式3PCON &= 0X7F;确保 smod1=0;TMOD = 0x21;

7、/0x21,timer1,mode 2,timer0 mode 1TH1 = 0xfd;TR1 = 1;/ TR1: timer 1 run超时等待3.5个字符位以判断帧结束。则3.5个字符至多需要12*3.5 = 42个位,就是42*stop_timest2_time_out=(signed char)TH1*(42*6);if(!(PCON&0x80) t2_time_out=1;T2CON =0 ;T2MOD = 0;TR1 = 1;/ TR1: timer 1 run超时等待3.5个字符位以判断帧结束。TI=0;RI=0;EA=1;ES=1;prepare_recv();初始化接收状态

8、的函数如下void prepare_recv(void) small准备接收TR2=0; /初始化 T2ET2=1;T2REG=RCAP2=t2_time_out;receiving=1;frame_timeout=0;recv_index=0;recv_error=0;RW485 = Rs485Rx;REN = 1;串行通信中断处理程序void protocol_serial_process(void) smallunsigned char tmp;if(_testbit_(TI)trans_index+; 下一个字节if(trans_index= BUF_MAX_LEN)/帧越界,出错,重

9、收receiving = 0;recv_error = 1;T2定时器用于作为帧结束判断定时器,当发生中断时,意味已经有超过了 3.5T的间隔void timer2 (void) interrupt 5 计时中断2,用于帧超时计时TR2=0;TF2=0;if(receiving)receiving=0;receive_finished=1;if(recv_index7)&(CommBuf0=protocol.device_addr)&(!recv_error) 如果与当前设备地址一致并且报文长度有效,则报文进一步分析 protocol.buff_len=recv_index;TH2=RCAP2

10、H=DELAY_TIME_H;TL2=RCAP2L=DELAY_TIME_L;ET2=1;TR2=1;REN=0;elseprepare_recv();否则丢弃这次接收,重新开始elseif(!recv_error)AnalyzeRecieve(); /分析并生成回复报文send_frame_comm();/开始回复报文,按设定的参数格式进行发送else prepare_recv();校验采用CRC校验,函数代码如下/* Table Of CRC Values for high-order byte */unsigned char code auchCRCHi = 0x00, 0xC1, 0x

11、81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01,

12、 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00

13、,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01

14、,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00

15、,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40;/* Table of CRC values for low-order byte */ unsigned char code auchCRCLo = 0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0

16、C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x3

17、5,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA

18、6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x5

19、3,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40;参照示例报文,校

20、正CRC高低字节在报文中的位置unsigned int crc16(unsigned char *puchMsg,unsigned char usDataLen) small/ puchMsg message to calculate CRC uponunsigned char uchCRCHi = 0xFF ;unsigned char uchCRCLo = 0xFF ;unsigned int uIndex ;while (usDataLen-)uIndex = uchCRCHi *puchMsg+ ;/ usDataLen quantity of bytes in message/ high byte of CRC initialized/ low byte of CRC initialized/ will index into CRC lookup table/ calculate the CRC/ Pass through message bufferuchCRCHi = uchCRCLo auchCRCHiuIndex;uchCRCLo = auchCRCLouIndex;return (unsigned int)(uchCRCHi) 8) | uchCRCLo);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!