Modbus RTU通讯笔记

您所在的位置:网站首页 1200rtu通讯 Modbus RTU通讯笔记

Modbus RTU通讯笔记

2024-03-24 00:32| 来源: 网络整理| 查看: 265

目录 1 modbus通讯1.1 modbus 通讯数据格式1.2 功能码1.3 数据区1.3.1 格式1.3.2 寄存器地址 1.4 CRC校验1.4.1 CRC校验算法步骤1.4.2 CRC校验算法C语言程序 1.5 MODBUS主问从答1.5.1 读输出线圈1.5.2 读输入线圈1.5.3 读输出寄存器1.5.4 读输入寄存器1.5.5 主机写当个线圈寄存器 2 西门子PLC Modbus通讯2.1 S7-200SMART地址转换MODBUS地址2.2 CM1241模块2.3 S7-1200 MODBUS通讯指令介绍

1 modbus通讯 1.1 modbus 通讯数据格式 地址码功能码数据区校验码1个字节1个字节N个字节16位CRC 1.2 功能码 功能码描述说明MOUBUS地址01读输出线圈寄存器位操作00001 ~ 0999902读离散输入寄存器位操作10001 ~ 1999903读保持(输出)寄存器字操作40001 ~ 4999904读输入寄存器字操作30001 ~ 3999905写单线圈寄存器位操作00001 ~ 0999907读取异常状态获得8个内部线圈的逻辑状态06写单线圈保持寄存器字操作40001 ~ 4999910写多路寄存器字操作15写多线圈寄存器位操作00001 ~ 0999916写多个保持寄存器字操作40001 ~ 4999917报告从机标识可使主机判断从机标识的类型及其该从机运行指示灯的状态 1.3 数据区 1.3.1 格式

数据区格式不固定,一般需要查看从机设备的通讯手册 数据区格式示例:

开始编号/寄存器地址数据个数数据1……数据n2个字节2个字节2个字节2个字节2个字节 1.3.2 寄存器地址

通常Modbus地址由5位数字组成,包括起始的数据类型代号,以及后面的偏移地址。Modbus Master协议库把标准的Modbus地址映射为所谓Modbus功能号,读写从站的数据。 Modbus Master协议库支持如下地址:

编号范围含义00001~09999数字量输出(线圈)10001~19999数字量输入(触点)30001~39999输入数据寄存器(通常为模拟量输入)40001~49999数据保持寄存器

由上表可知,Modbus通讯的地址是从1开始的,如果遇到从机设备的寄存器编号从0开始,那么就需要考虑给通讯地址加1处理。

即:

Modbus地址数据地址 (参数地址)1021……nn-1 1.4 CRC校验 1.4.1 CRC校验算法步骤 第一步:设置CRC变量存储器初始值位0xFFFF;第二步:把第一个参与校验的数据和CRC变量的低八位进行异或运算,结果仍存到CRC存储器中;第三步:把CRC右移一位,最高位补0;第四步:检查刚移出的最低位b0,如果b0=1,则CRC变量和0xA001进行异或运算,结果仍存在CRC变量存储器中,然后执行下一步。如果b0=0,则直接执行下一步;第五步:重复3、4两步,只到右移8次。这样第一个数据处理就完成了,结果仍存在CRC变量存储器中。第六步:重复2~5步,处理下一个数据,只到参与校验的数据均处理完毕。注:最后获得的16位CRC校验值,在传输时,低八位在前,高八位在后; 1.4.2 CRC校验算法C语言程序 #include #define num 6 //需要生成CRC校验的数据个数 int main() { //unsigned char buf[8]={0x01,0x06,0x10,0x00,0x27,0x10,0x97,0x36};//最后两位是校验位 unsigned char buf[num]={0x01,0x04,0x00,0x0a,0x00,0x0a};//待生成校验位的数据 //01 04 00 02 00 02 int i,n; unsigned int crc16; unsigned int temp; crc16=0xffff;//CRC变量初始化为0xffff i=0;n=0; for(n=0;n 1; //循环右移一次 if(temp) //判断刚才移出的最后一位是1? { crc16 = 0xa001^crc16; } printf("CRC校验为:%x\n",crc16); } printf("---------------------------------\n"); } printf("CRC校验为:%x\n",crc16); } 1.5 MODBUS主问从答 1.5.1 读输出线圈 主机询问格式 从机地址功能码寄存器起始地址寄存器个数CRC校验010100 0200 015C 0A 从机应答格式 从机地址功能码字节个数数据1…CRC校验01010101-- 1.5.2 读输入线圈 主机询问格式 从机地址功能码寄存器起始地址寄存器个数CRC校验010200 0100 01E8 0A 从机应答格式 从机地址功能码字节个数数据1…CRC校验010201FF-E1 C8 1.5.3 读输出寄存器 主机询问格式 从机地址功能码寄存器起始地址寄存器个数CRC校验010300 0100 01D5 CA 从机应答格式(数据字节个数为偶数) 从机地址功能码字节个数数据1数据2…CRC校验0103020205-79 27 1.5.4 读输入寄存器 主机询问格式 从机地址功能码寄存器起始地址寄存器个数CRC校验010400 0400 0170 0B 从机应答格式(数据字节个数为偶数) 从机地址功能码字节个数数据1数据2…CRC校验0104025599-16 0A 1.5.5 主机写当个线圈寄存器 主机询问格式 从机地址功能码寄存器起始地址寄存器个数CRC校验010500 03FF 007C 3A 从机应答格式 无应答 该节与1.5.1 读输出线圈互为读写 2 西门子PLC Modbus通讯 2.1 S7-200SMART地址转换MODBUS地址 Modbus地址S7-200数据区00001~00128Q0.0~Q15.710001~10128I0.0~I15.730001~30032AIW0~AIW6240001~4xxxx如下

Modbus地址映射中:40001表示保持性寄存器,是一个字(两个字节),若对应是VW0。这 40001的高位字节存在VB0中,低位字节存在VB1中,而一个字节里位的权重是一样的,也就是一一对应。因此40001的第0位对应VB1的第0位,40001的第15位对应VB0的第7位。简言之,近似下面的表达: 40001.0 = V1.0 40001.1 = V1.1 40001.2 = V1.2 40001.3 = V1.3 40001.4 = V1.4 40001.5 = V1.5 40001.6 = V1.6 40001.7 = V1.7 40001.8 = V0.0 40001.9 = V0.1 40001.10 = V0.2 40001.11 = V0.3 40001.12 = V0.4 40001.13 = V0.5 40001.14 = V0.6 40001.15 = V0.7

2.2 CM1241模块 CM1241指示灯DIAG指示灯:亮红色:模块没有被PLC识别;亮绿色闪烁:模块已经被PLC识别,但是软件没有进行配置;亮绿色常亮:模块已经被PLC识别,而且软件中配置正确; cm1241最多带12个485从机设备 2.3 S7-1200 MODBUS通讯指令介绍

MB_COMM_LOAD指令:用于设置Modbus(RTU)端口。 在这里插入图片描述

参数说明EN使能REQ上升沿启动该指令PORT扩展模块的硬件标识符BAUD波特率PARITY0:无校验;1:奇校验;2:偶校验RESP_TO每个从站的读取延时时间MB_DBMB_MASTER / MB_SLAVE 指令的背景数据块

一个端口只能执行一次这个指令,可以选择放置到OB100中。

MB_MASTER指令 在这里插入图片描述

参数说明EN使能REQ上升沿发送有一个读/写请求MB_ADDR从站地址MODE读写控制位;0:读;1:写;PARITY0:无校验;1:奇校验;2:偶校验DATA_ADDR将要读/写的从机寄存器地址DATA_LEN访问寄存器的连续数量DNE完成标志位,可以用来激活下一个指令BUSY繁忙标志位ERROR错误标志位STAUS错误代码


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3