一、Modbus通信协议简介

1. Modbus协议

Modbus 是一个请求/应答协议,并且提供功能码规定的服务。Modbu协议是 OSI 模型第 7 层上的应用层报文传输协议。

MODBUS协议支持传统的RS-232、RS-422、RS-485和以太网设备。

Modbus 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的 Modbus 协议映射能够在应用数据单元(ADU)上引入一些附加域。

Modbus的数据包格式为:

2. 串行Modbus协议

在物理层,Modbus 串行链路系统可以使用不同的物理接口(RS485、RS232)。支持RS485两线制与四线制接口,当只需要短距离的点到点通信时,RS232 串行接口也可以使用。

串行通信栈对应与OSI七层协议的关系:

2.1 Modbus主站/从站协议

Modbus 串行链路协议是一个主-从协议。 在同一时刻,只有一个主节点连接于总线,一个或多个子节点 (最大编号为 247 ) 连接于同一个串行总线。子节点之间从不会互相通信。

主节点有两种方式与子节点发出请求:

(1) 单播模式 :点对点发送,主节点发送请求,子节点回应。

(2) 广播模式 :广播发送,主节点发送,子节点不回应。

Modbus串行链路PDU构成如下:

二、 Modbus( 串行)开源库代码学习

1. Modbus主节点与子节点的状态

1.1主节点状态

1.2 子节点状态

2. Modbus协议源代码简介

2.1 关于modbus中的常见两种寄存器区别

保持寄存器:指可以通过通信命令读或者写的寄存器;通常是一些功能控制寄存器或者输出寄存器等。不同的设计中,有些保持寄存器是掉电保持;有些则不然。

输入寄存器:指只能读不能写的寄存器,通常是状态寄存器或者是输入结果寄存器等。

线圈寄存器,可以类比为开关量,每一个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。

离散输入寄存器:相当于线圈寄存器的只读模式,每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,无法写入。

2.2  Modbus开源库常用配置接口

1)modbus_t* modbus_new_rtu(const char *device,

int baud, char parity, int data_bit,

int stop_bit)

modbus_new_rtu函数用于生成Modbus的句柄,在本函数中可以设置通

信协议中的波特率、校验位、数据长度以及停止位,其返回值为通过设置后生成的句柄,用于在读写数据时使用,每个句柄可以执行一个modbus指令。如果这些配置参数有误,就会返回一个空指针。

2)static int _modbus_rtu_connect(modbus_t *ctx)

本函数主要功能是将通信串口设置为rtu模式。

3)int modbus_set_slave(modbus_t *ctx, int slave)

本函数设置本句柄的从机号。

2.3 Modbus主机通信常用接口

1)int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src)

本函数为将数组中的数据写入到远端设备(从机)的寄存器中,写入的地址位addr,长度为nb个寄存器。

2)int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)

本函数将远端设备(从机)保持寄存器中的数据复制到数组dest中。

3)int modbus_read_input_registers(modbus_t *ctx, int addr, int nb,

uint16_t *dest)

本函数读取远端设备(从机)地址为addr输入寄存器中的数据,数据长度为nb。

2.4 Modbus从机通信主要接口

1)int _modbus_receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type)

本函数可以用于处理来自主机的请求,返回接受到的字符的数量,如果成功,则返回uint8_t数组中的消息(即主机发送的命令),否则返回-1。

2)int modbus_reply(modbus_t *ctx, const uint8_t *req,

int req_length, modbus_mapping_t *mb_mapping)

本函数负责在接受到请求后,分析请求并生成响应消息,并且发送到主机。如果请求属性为广播,那么不发送响应消息。

三、 调试问题分享

  在调试中,从机的Server进程会经常出现崩溃,最后发现在Server经常每次处理配置变更时,都会重新new出新的modbus句柄,但却不释放原有句柄,这种处理会导致多次修改Modbus通信配置时,从机Server进程崩溃。

解决方案:在程序中判断,当modbus句柄已经存在时,此时更新配置后,不再new出新的句柄,而是调用接口 modbus_close(), modbus_free()释放句柄中的配置,然后用更新后的配置重新设置句柄参数。

Modbus串行通信的更多相关文章

  1. MODBUS串行通信协议详细说明

    第一章  简介 本文详细地描述了装置在MODBUS 通讯模式下的输入和输出命令.信息和数据,以便第三方使用和开发. 1.1 串行通讯协议的目的 通信协议的作用是使信息和数据在上位机主站和装置之间有效地 ...

  2. 认识Modbus协议

    1.什么是Modbus? Modbus协议是应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间,控制器经由网络(例如以太网)和其它设备之间可以通信.Modbus协议定义了一个控制器能认识使用 ...

  3. MODBUS协议整理——功能码简述

    1.Modbus简介——来自维基百科 Modbus是一种串行通信协议,是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表的.Modbus是工业领域通信协议的业界标准,并且现在是工业电 ...

  4. Modbus 通讯协议

    摘要 工业控制已从单机控制走向集中监控.集散控制,如今已进入网络时代,工业控制器连网也为网络管理提供了方便.Modbus就是工业控制器的网络协议中的一种. 关键词 Modbus协议,串行通信,LRC校 ...

  5. RS485通信和Modbus协议(转)

    转自:http://www.51hei.com/bbs/dpj-23230-1.html 在工业控制.电力通讯.智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换.最初采用的方式是RS232接 ...

  6. C# ModBus 读取数据

    简单介绍: 项目上需要与多家公司做接口对接.我们提供接口的有,其他公司提供的接口也有.所有的接口全部对接完了,遇到一个非常棘手的问题,需要获取甲方船厂设备上的状态,就给了一个文档,文档上写了IP.端口 ...

  7. 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus

    物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...

  8. 【阿里云IoT+YF3300】9.快速开发modbus设备驱动

    Modbus是一种串行通信协议,是莫迪康公司为PLC(编程逻辑控制器)通信而设计的协议.Modbus目前已经成为工业领域通信协议的业界标准,大部分的仪器仪表都支持该通信协议.很早以前就开发过基于Mod ...

  9. C#ModBus Tcp的学习及Master的实现

    Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式. 所以这也是我们工控领域软件开发的所必懂的通讯协议,我也是初次学习,先贴上我的学习笔记 一 ...

随机推荐

  1. LA 4794 状态DP+子集枚举

    状态压缩DP,把切割出的面积做状态压缩,统计出某状态下面积和. 设f(x,y,S)为在状态为S下在矩形x,y是否存在可能划分出S包含的面积.若S0是S的子集,对矩形x,y横切中竖切,对竖切若f(x,k ...

  2. LeetCode 122 Best Time to Buy and Sell Stock II(股票买入卖出的最佳时间 II)

    翻译 话说你有一个数组,当中第i个元素表示第i天的股票价格. 设计一个算法以找到最大利润. 你能够尽可能多的进行交易(比如.多次买入卖出股票). 然而,你不能在同一时间来多次交易. (比如.你必须在下 ...

  3. TDD尝试:nodejs单元测试

    单元测试是最小化的测试方式,也是TDD的做法. TDD概念如下图: 通过测试反馈推进开发,ruby是推崇这种编程方式的. nodejs有如下常用单元测试模块 1.mocha Mocha是一个基于nod ...

  4. centos改动sshport

    vi /etc/ssh/sshd_config 找到#Port 22一段,这里是标识默认使用22port.加入一行例如以下: Port 34981 然后保存退出 然后service sshd rest ...

  5. 使用Django框架实现游戏站点搭建

    完整project链接点击打开链接 上一篇中我们使用了Javascript和Html5实现了弹球游戏.而在本文中我们希望以其为基础实现游戏站点,可以实现用户的注冊登录.游戏成绩记录,排名显示.微博分享 ...

  6. luogu1514 引水入城

    题目大意 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个NN 行\times M×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  7. Angularjs+Bootstrap实现分页指令

    本插件的开发目的主要给前端同学使用,本人是专注于后台开发的,对css样式不熟悉,但逼于前端要求做一个共公组件方便日常开发,所以这个插件在样式上可能不适合大部分人,喜欢的拿走吧,不喜欢的也请别喷.  一 ...

  8. 利用存储过程插入50W+数据

    转自:https://www.aliyun.com/jiaocheng/1396184.html 首先,建立部门表和员工表: 部门表:   create table dept(   id int un ...

  9. 2-2 第二天 利用 QQ 浏览器代理调试端口

    在没有域名服务器的情况下微信代理的方案 echo "api_key: N3DYn5356kYDvcd67fRxoecKxQV7fTE0" > ~/.ultrahook gem ...

  10. 洛谷 P2129 L国的战斗续之多路出击(模拟)

    P2129 L国的战斗续之多路出击 题目背景 广而告之:背景见其他L国的战斗!!大家一起刷 题目描述 这一次,L国决定军队分成n组,分布在各地,若以L国为原点,可以看作在一个直角坐标系内.但是他们都受 ...