Fork me on GitHub

C# MODBUS TCP的学习

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

一 、协议概述

1、Modbus协议是应用于控制器上的一种通用语言,实现控制器之间,控制器通过网络和其他设备之间的通信,支持传统RS232/RS422/RS485和以太网设备,它已经成为一种通用的工业标准,有了它不同厂商生产的控制设备可以连成工业网络,进行集中控制,此协议定义了一个控制器能认识使用的消息结构。

2、如果按照国际 ISO/OSI 的 7 层网络模型来说,标准 MODBUS 协议定义了通信物理层、链路层及应用层;

        物理层:定义了基于 RS232 和 RS485 的异步串行通信规范;

        链路层:规定了基于站号识别、主 / 从方式的介质访问控制;

        应用层:规定了信息规范(或报文格式)及通信服务功能;

 

二、协议要点

1、MODBUS 是主 / 从通信协议。主站主动发送报文 , 只有与主站发送报文中呼叫地址相同的从站才向主站发送回答报文。

2、报文以 0 地址发送时为广播模式,无需从站应答,可作为广播报文发送,包括:

  ①修改线圈状态;

  ②修改寄存器内容;

  ③强置多线圈;

  ④预置多寄存器;

  ⑤询问诊断;

3、MODBUS 规定了 2 种字符传输模式: ASCII 模式、 RTU (二进制)模式;两种传输模式不能混用;

 

 

4、传输错误校验

  传输错误校验有奇偶校验、冗余校验检验。

  当校验出错时,报文处理停止,从机不再继续通信,不对此报文产生应答;

  通信错误一旦发生,报文便被视为不可靠; MODBUS 主机在一定时间过后仍未收到从站应答,即作出“通信错误已发生”的判断。

 

 

 

三、异常应答

1、从机接收到的主机报文,没有传输错误,但从机无法正确执行主机命令或无法作出正确应答,从机将以“异常应答”回答之。

2、异常应答报文格式

例:主机发请求报文,功能码 01 :读 1 个 04A1 线圈值

 

 由于从机最高线圈地址为 0400 ,则 04A1 超地址上限,从机作出异常应答如下(注意:功能码最高位置 1 ):

 

 3.异常应答码

 

 

四、寄存器和功能码

modbus的功能码很多,且不同功能码对应的报文也不一致,后续博客我会借用开源库实现一个modbus master 测试功能码 解析报文,下边我用表格总结一下寄存器,功能码,报文格式

 

 

 

注:

(1)、报文中的所有字节均为16进制

(2)、由上图我们总结出不同的功能码的报文(无论询问报文还是响应报文)前8个字节都是一致的 都是2字节消息号+2字节ModBus标识+2字节长度+1字节站号+1字节功能码 后边根据功能码不同而不同

(3)、报文中,指定线圈通断标志  FF00 置线圈为ON  0000置线圈为OFF

 

--------------------- 先简单介绍一下NModbus中的几个重要方法

 

 

 

 

 

 

简单说明一下,这里我实现了常用的几个功能码

0x01 读一组线圈

0x02 读一组输入线圈/离散量线圈

0x03 读一组保持寄存器

0x04 读一组输入寄存器

0x05 写单个线圈

0x06 写单个保持寄存器

0x0F 写多个线圈

0x10 写多个保持寄存器

 

posted @   -悟空  阅读(2748)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示