这是一个学习C#、Winform的自我回顾过程,用来发现存在的不足,也为了推动自己继续学习。
大学通信专业毕业之后,进入了一家电力科技公司从事软件开发工作,主要用的是Delphi语言进行电力通信协议的上位机开发。因为上位机需要与下位机通信才好进行测试,而事实上没有那么多现成的装置给你借用调试,加上公司慢慢的开始推行C#/WPF来做一些定制软件,所以想学习一下C#,刚好现在也有一个自身的需求出现--上位机程序调试困难,所以就从最易入手的winform程序切入,慢慢的加深对于C#语言的理解。于是就打算做一个常见协议Modbus的数据源工具,于是就有了本文。
一、Modbus协议简介
{来自百度百科}
Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。
ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。
ModBus网络只有一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。
二、Modbus协议特点
{来自百度百科}
(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种。
(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
(3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。
三、Modbus数据包结构描述
每个Modbus 数据包都由以下几个部分组成:
(1) 地址域
(2) 功能码域
(3) 数据域
(4) 校验域
地址域:0~247,0一般作为广播地址,1~247作为装置(下位机)使用的地址号。
功能码:用来确认该包报文的具体功能。(常见03码、10码)
0x03 | 读寄存器 |
0x10 | 写寄存器 |
0x05 | 遥控操作 |
数据域:Modbus 数据域长度不定,依据其具体功能而定。
校验域:CRC16校验方法,2个字节长度。
四、串口、以太口Modbus报文
串口下:ModbusRTU
以太网:ModbusRTU,报文格式为:[事务元标识符(2字节)]+[协议标识(2字节)]+[长度(2字节)]+ModbusRTU-CRC校验(2字节)
总而言之,ModbusTCP比ModbusRTU报文,多了6个字节的报文头,少了末尾的2个字节的CRC校验
以下主要以ModbusRTU说明:
0x03码
读寄存器数据包格式 |
响应格式 |
||
从站地址 |
1 字节 |
从站地址 |
1 字节 |
功能码 |
1 字节 |
功能码 |
1 字节 |
寄存器起始地址高位 |
1 字节 |
字节数n |
1 字节 |
寄存器起始地址低位 |
1 字节 |
Data1 高位 |
1 字节 |
寄存器数量高位 |
1 字节 |
Data1 低位 |
1字节 |
寄存器数量低位 |
1 字节 |
…… |
|
Datan/2 高位 |
1 字节 |
||
Datan/2 低位 |
1 字节 |
||
CRC校验码低位 |
1 字节 |
CRC低位 |
1 字节 |
CRC校验码高位 |
1 字节 |
CRC高位 |
1 字节 |
0x10码
写寄存器数据包格式 |
响应格式 |
||
从站地址 |
1 字节 |
从站地址 |
1 字节 |
功能码 |
1 字节 |
功能码 |
1 字节 |
寄存器起始地址高位 |
1 字节 |
寄存器起始地址高位 |
1 字节 |
寄存器起始地址低位 |
1 字节 |
寄存器起始地址低位 |
1 字节 |
寄存器数量高位 |
1 字节 |
寄存器数量高位 |
1 字节 |
寄存器数量低位 |
1 字节 |
寄存器数量低位 |
1 字节 |
字节数(n) |
1 字节 |
CRC校验码低位 |
1 字节 |
Data1 高位 |
1 字节 |
CRC校验码高位 |
1 字节 |
Data1 低位 |
1 字节 |
||
…… |
|||
Data(n/2) 高位 |
1 字节 |
||
Data(n/2) 低位 |
1 字节 |
||
CRC校验码低位 |
1 字节 |
||
CRC校验码高位 |
1 字节 |
0x05码
请求格式 |
响应格式 |
||
从站地址 |
0x11 |
从站地址 |
0x11 |
功能码 |
0x05 |
功能码 |
0x05 |
预置地址高 |
0 x 23 |
预置地址高 |
0 x 23 |
预置地址低 |
0 x 8C |
预置地址低 |
0 x 8C |
设置数据高 |
0 x FF |
设置数据高 |
0 x FF |
设置数据低 |
0x00 |
设置数据低 |
0x00 |
CRC 校验码低 |
44 |
CRC 校验码低 |
44 |
CRC 校验码高 |
C5 |
CRC 校验码高 |
C5 |