完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
Modbus TCP协议学习笔记
1 简介 modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的modbus协议:modbusTCP。 Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。 标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。 2 ModbusTCP数据帧 ModbusTCP的数据帧可分为两部分:MBAP+PDU。 2.1 报文头MBAP MBAP为报文头,长度为7字节,组成如下: [tr]事务处理标识协议标识长度单元标识符[/tr]2字节2字节2字节1字节 事务处理标识 :可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。 协议标识符 :00 00表示ModbusTCP协议。 长度 :表示接下来的数据长度,单位为字节。 单元标识符 :可以理解为设备地址。 2.2 帧结构PDU PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。 2.2.1 功能码 modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。 线圈:PLC的输出位,开关量,在MODBUS中可读可写 离散量:PLC的输入位,开关量,在MODBUS中只读 输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读 保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写 根据对象的不同,modbus的功能码有: 0x01:读线圈 0x05:写单个线圈 0x0F:写多个线圈 0x02:读离散量输入 0x04:读输入寄存器 0x03:读保持寄存器 0x06:写单个保持寄存器 0x10:写多个保持寄存器 2.2.2 PDU详细结构 0x01:读线圈 在从站中读1~2000个连续线圈状态,ON=1,OFF=0 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节) 响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位) 如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位 00 01 00 00 00 06 01 01 00 02 00 08 回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF 00 01 00 00 00 04 01 01 01 01 0x05:写单个线圈 将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节) 响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节) 如:将地址为0x0003的线圈设为ON 00 01 00 00 00 06 01 05 00 03 FF 00 回:写入成功 00 01 00 00 00 06 01 05 00 03 FF 00 0x0F:写多个线圈 将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF 请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L 响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 0x02:读离散量输入 从一个从站中读1~2000个连续的离散量输入状态 请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节) 响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8)) 如:从地址0x0000开始读0x0012个离散量输入 00 01 00 00 00 06 01 02 00 00 00 12 回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF 00 01 00 00 00 06 01 02 03 01 04 00 0x04:读输入寄存器 从一个远程设备中读1~2000个连续输入寄存器 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节) 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2) 如:读起始地址为0x0002,数量为0x0005的寄存器数据 00 01 00 00 00 06 01 04 00 02 00 05 回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00 00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00 0x03:读保持寄存器 从远程设备中读保持寄存器连续块的内容 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节) 响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2) 如:起始地址是0x0000,寄存器数量是 0x0003 00 01 00 00 00 06 01 03 00 00 00 03 回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00 00 01 00 00 00 09 01 03 06 00 21 00 00 00 00 0x06:写单个保持寄存器 在一个远程设备中写一个保持寄存器 请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节) 响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节) 如:向地址是0x0000的寄存器写入数据0x000A 00 01 00 00 00 06 01 06 00 00 00 0A 回:写入成功 00 01 00 00 00 06 01 06 00 00 00 0A 0x10:写多个保持寄存器 在一个远程设备中写连续寄存器块(1~123个寄存器) 请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2) 响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节) 如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F 00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F 回:写入成功 00 01 00 00 00 06 01 10 00 00 00 01 3 ModbusTCP通信 3.1 通信方式 modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。 主站请求:功能码+数据 从站正常响应:请求功能码+响应数据 从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型 注意:需要超时管理机制,避免无期限的等待可能不出现的应答 3.2 在linux下使用modbusTCP连接 IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。 通信过程 1.connect 建立TCP连接 2.准备modbus报文 3.使用send命令发送报文 4.在同一连接下等待应答 5.使用recv命令读取报文,完成一次数据交换 6.通信任务结束时,关闭TCP连接 4 Modbus poll / Modbus slave modbus poll 和modbus slave是一组modbus仿真软件,可以实现modbus RTU、TCP、串口仿真等。 在modbusTCP中,modbus poll 作为客户端请求数据,modbus slave 作为服务器端处理请求。 使用c语言编写客户端连接modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。 使用软件时,需要指定功能码,在setup-》slave definition或者poll definition中进行设置。 – slave ID:从站编号(事务标识符) – function:功能码,0x01对应线圈操作,0x02对应离散量操作,0x03对应保持寄存器操作,0x04对应输入寄存器操作 – address:开始地址 – quantity:寄存器/线圈/离散量的数量 Linux C作为客户端连接modbus slave的源码。 |
|
|
|
只有小组成员才能发言,加入小组>>
864浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 15:45 , Processed in 0.447534 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号