一、MODBUS通讯协议
1、 MODBUS通讯协议简介:
Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给IDA(Interface for Distributed Automation,分布式自动化接口)组织,并成立了Modbus-IDA组织,为Modbus今后的发展奠定了基础。在中国,Modbus已经成为国家标准GB/T19582-2008。
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。
当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。
而在一个系统中,对具体命令代码执行的动作就需要对协议按照协议公约进行解析(相当于翻译的过程,确定此代码具体包含何种信息)。应用到公司生产的逆变器设备,就需要掌握公司制定的光伏并网逆变器通讯协议。
2、 MODBUS的特点:
(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。
(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
(3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。
3、 MODBUS的分类:
MODBUS通讯协议分为RTU协议和ACSII协议两种。
ASCII模式:当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8位字节都作为一个ASCII码(两个十六进制字符)发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
RTU模式: 当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8位字节包含两个4位的 十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。 (为什么公司的通讯协议选用RTU模式???) 两种协议的区别:
ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验(纵向冗长检测) 也比较容易。
RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII就需要传输’F’’9’的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用RTU协议。RTU协议采用CRC校验(循环冗长检测) 。
二、光伏并网逆变器通讯协议
1、报文格式(上位机发送或下位机响应的报文,十六进制): 数据格式: 数据长度:
地址码 1字节
功能码 1字节
数据区 N字节
错误校验 CRC码
地址码:设备的地址,即逆变器上设置的485通讯地址;
功能码:
作为上位机请求发送,通过功能码告诉从机执行什么动作。 作为下位机响应,下位机发送的功能码与从上位机发送来的功能码一样,并表明下位机已响应上位机进行操作。
MODBUS通讯规约定义功能码为0x01到0xff。公司光伏并网逆变器仅使用功能码0x03、0x04、0x06、0x10。 各功能码定义如下: 功能码功能码功能码功能码
0x03: 读取保持寄存器(读取4x地址类型) ; 0x04: 读取输入寄存器(读取3x地址类型) ;
0x06: 向保持寄存器写单个字(写入4x地址类型) ; 0x10: 向保持寄存器写多个字(写入4x地址类型)。
两类地址类型区别如下(此处地址为机器电路板上通讯芯片内部寄存器的地址,和机器的485通讯地址不同): 3x地址类型 该区域地址空间只读 ; 4x地址类型 该区域地址空间可读可写。
数据区: 分三种情况
(1) 对于功能码0x03和0x04(读取数据):
上位机读取下位机数据:[要读取的寄存器前一位地址高8位(注意:是前一位,比如要读地址5000的数据,就是地址4999)] [低8位] [读取几个寄存器高8位] [低8位]
此时下位机响应的数据:[返回几个数据][数据1][数据2]...[数据n] (2) 对于功能码0x06(写入单个数据): 上位机写入下位机数据:[需写入的寄存器前一位地址高8位] [低8位] [写入的数据高8位] [低8位] 下位机响应的数据:[需写入的寄存器前一位地址高8位] [低8位] [写入的数据高8位] [低8位] (同发送的数据一样) (3) 对于功能码0x10(写入多个数据): 上位机写入下位机数据:[需写入的寄存器前一位地址高8位] [低8位] [写入几个寄存器高8位] [低8位] [数据1][数据2]...[数据n] 下位机响应的数据:[需写入的寄存器前一位地址高8位] [低8位] [写入几个寄存器高8位] [低8位]
错误校验:CRC校验,在COMTEST里由COMTEST软件自动完成。
2、光伏并网逆变器通讯协议的解析: 光伏并网逆变器地址定义表如下所示
“地址”栏中为需要读写的内部寄存器的地址,“数据范围”栏中为寄存器中的数据,“地址类型”栏中分3x地址和4x地址两种。
其中“设备状态”寄存器5038中的数据对应于“附录一”中的“状态码”(即逆变器的实时工作状态)一栏
如果逆变器发生故障,则在“设备状态”寄存器5038中的数据为0x0200(硬件故障)或者0x0800(模块故障),此时需要进一步读取“状态数据1”寄存器5045中的数据(对应“附录一”中的“状态数据”一栏),以确定具体的故障信息。
针对SG630KTL机型, 专门开辟了地址区间:5050~5070,用于记录更多
的机器状态和故障信息。
仅当机型为SG630KTL,“设备状态”寄存器5038中的数据才有可能为0x5500(故障),此时需要进一步读取“故障状态”寄存器5050和5051中的数据(对应“附录一”中的“状态数据”一栏),以确定具体的故障信息。
注:此时故障信息为按位读取,不再是按字节读取。
另外SG630KTL机器增加了许多节点状态检测,可以在“节点状态”寄存器5058和5059中读取,状态信息也是按位读取的。
3、利用COMTEST软件对通讯进行模拟
现场调试通讯时,由于现场情况复杂,很多情况下利用SolarInfo软件搜索设备时搜索不到,无法正常建立通讯,此时可以利用COMTEST软件直接发送报文对通讯进行模拟。 操作界面
应用实例:
以公司发布的光伏并网逆变器通讯协议上的例子来分析: (1) 获取逆变器型号(假设逆变器为SG4KTL)
假设逆变器通讯地址为1,需要获取逆变器型号(3x地址类型的5000地址数据)。 上位机发送(HEX):
01 04 13 87 00 01 85 67 逆变器回应(HEX):
01 04 02 00 22 39 29
注释:SG4KTL 设备类型码为 0x0022
在COMTEST里输入:01 04 13 87 00 01 (85 67 不用输入,由COMTEST软件自行CRC校验)
按报文解析:
01 —— 逆变器485通讯地址 注意:十六进制,如果此处为11,则逆变
器通讯地址为17(1x161+1x160),通讯地址为10的应为0A。
04 —— 功能码,读取输入寄存器(仅限3x地址类型)
13 87 —— 地址4999的十六进制,1x163+3x162+8x161+7x160=4999 00 01 —— 地址4999后一个地址,即读取地址4999+1=5000的数据 逆变器回应报文解析: 01 04 02 00 22 39 29
01 —— 响应的逆变器地址 04 —— 功能码
02 —— 返回两个数据
00 22 —— 返回的机器型号(对照并网逆变器型号对应编码表可确定型号
为SG4KTL)
39 29 —— CRC校验,软件自动完成
并网逆变器型号对应编码表
序号 1 2 3 4 5 6 7 8 9 10 11 12
型号 SG1K5TL SG2K5TL SG3K-B SG5K-B SG5K-C SG6K-B SG6K-C SG3KTL SG4KTL SG5KTL SG6KTL SG8KTL
编码 0x1F 0x20 0x0B 0x0C 0x0D 0x0E 0x0F 0x21 0x22 0x23 0x24 0x25
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 SG10KTL SG30KTL SG15KTL SG12KTL SG20KTL
SG10K3 SG30K3 SG50K3 SG100K3 SG100K3SG250K3 SG250KTSG500K3 SG500KTSG1000KSG250KLSG630KTSG100KSG100K WG1K5TWG2K5TWG3K WG5K WG10K WG10K-WG10K3 WG20K WG20K3 WG30K WG30K3 WG50K3 SC22020 SC4860 SC48200WEL2K WEL4K WEL6K WEL10K WEL20K 0x26 0x27 0x28 0x29 0X2A 0x8D 0x8F 0x90 0x91 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9A 0x33 0x34 0x35 0x36 0x37 0x3A 0xA1 0x38 0xA2 0x39 0xA3 0xA4 0xC9 0xCA 0xCD 0x47 0x48 0x49 0x4A 0x4B 52 WEL30K 0x4C 53 SDCPG 0x61 54 GCI1500(0x 51 55 GCI5000(0x 52 56 PVS-6M 0x D0 57 PVS-16M 0x D1 PVS-16M 59 PVS-12M 0x D3 60 PVS-8M 0x D4 61 SS100K 0x E0 62 SS100KL0x E1 (2) 获取逆变器运行信息
假设逆变器地址为1,需要获取3x地址类型的5000地址开始的10个地址的数据。 上位机发送(HEX):
01 04 13 87 00 0A C4 A0 逆变器回应(HEX):
01 04 14 00 22 00 28 00 00 00 00 00 05 00 00 00 26 00 00 00 00 00 00 AF F8 注释:读取 SG4KTL 设备类型码为 0x0022,额定输出功率4.0kW,两相,日发电量为0,总发电量为5 kWh,总运行时间为38h,机内空气温度为0。
按报文解析:
上位机发送:01(地址) 04(功能码,读数据) 13 87(地址4999) 00 0A(取4999后10
个寄存器数据,即5000~5009) C4 A0(CRC校验)
逆变器回应:01(地址) 04(功能码) 14(不是14个,而是1x161+4x160=20
个,返回20个字节数据) 00 22(地址5000,机器型号,SG4KTL) 00 28(地址5001,转为十进制为40,单位为0.1KW,即额定输出功率40x0.1=4KW) 00 00 (地址5002,两相)00 00(地址5003,日发电量为0) 00 05 00 00(地址5004~5005,其中5004为低位字,5005为高位字,总发电量为5KW) 00 26 00 00(地址5006~5007,总运行时间2x161+6x160=38h) 00 00(地址5008,机内空气温度0) 00 00(地址5009,保留,未用) AF F8(CRC校验)
(3) 读取一条设置数据
假设逆变器地址为 1,需要获取4x地址类型的5000地址数据。 上位机发送(HEX):
01 03 13 87 00 01 30 a7 逆变器回应(HEX): 01 03 02 07 D8 BA 2E 注释:读取 2008 年
报文解析:
上位机发送:01(地址) 03(功能码) 13 87(地址4999) 00 01(读取地址5000) 30
a7(CRC校验) 逆变器回应:01(地址) 03(功能码) 02(返回2个字节数据) 07 D8(2008年) BA
2E(CRC校验)
(4) 读取多条设置数据
假设逆变器地址为 1,需要获取4x地址类型的5000地址开始的10个地址的数据。
按报文解析:
上位机发送(HEX):
01 03 13 87 00 0A 71 60 逆变器回应(HEX):
01 03 14 07 DA 00 0A 00 1E 00 09 00 28 00 25 00 CE 00 AA 01 F4 00 00 80 53
注释:读取时间:2010 年 10 月 30 日 9 时 40 分 37 秒;关机;限功率启用,且限功率设置为 50.0% 按报文解析:
上位机发送:01(地址) 03(功能码) 13 87(地址4999) 00 0A(读取地址5000~5009)
71 60(CRC校验)
逆变器回应:01(地址) 03(功能码) 14(返回20个字节数据) 07 DA(地址
5000,2008年) 00 0A(地址5001,10月) 00 1E(地址5002,30日) 00 09(地址5003,9时) 00 28(地址5004,40分) 00 25(地址5005,37秒) 00 CE(地址5006,关机状态) 00 AA(地址5007,限功率开关启用状态) 01 F4(地址5008,限制功率500x0.1%=50%) 00 00(地址5009,保留,未用) 80 53(CRC校验)
(5) 设置一条数据
假设逆变器地址为 1,需要设置4x地址类型的5000地址(系统时钟:年)数据。 上位机发送(HEX):
01(地址) 10(功能码,写多个数据) 13 87(地址4999) 00 01(写地址5000) 02(写两个字节数据) 07 DA(写入的数据,2010年) 19 4d(CRC校验) 逆变器回应(HEX):
01(地址) 10(功能码) 13 87(地址4999) 00 01(确认已写入地址5000) B5 64(CRC校验)
或上位机发送(HEX):
01(地址) 06(功能码,写单个数据) 13 87(地址4999) 07 DA(写入的数据,2010年) BE CC(CRC校验) 逆变器回应(HEX):
01(地址) 06(功能码) 13 87(地址4999) 07 DA(写入的数据,2010年) BE CC(CRC校验) 注释:设置为 2010 年
(6) 设置多条数据
假设逆变器地址为1,需要设置4x地址类型的5000地址开始的10个地址的数据 上位机发送(HEX):
01(地址) 10(功能码,写多个数据) 13 87(地址4999) 00 0A(地址5000~5009) 14(写入20个字节数据) 07 d9(地址5000,设为2009年) 00 0a(地址5001,设为10月) 00 1e(地址5002,设为30日) 00 09(地址5003,设为9时) 00 10(地址5004,设为16分) 00 00(地址5005,设为0秒) 00 CE(地址5006,设为关机) 00 AA(地址5007,设为限功率) 01 F4(地址5008,设为50%) 00 00(地址5009,保留,设置无效) 3e 65(CRC校验) 逆变器回应(HEX):
01(地址) 10(功能码) 13 87(地址4999) 00 0A(已设置地址5000~5009数据) F4 A3(CRC校验)
注释:时间设置为:2009 年 10 月 30 日 9 时 16 分 0 秒;设置为关机;限功率启用,且限功率设置为 50.0%
附:
如何利用WINDOWS系统自带计算器进行十六进制和十进制转换: 点击计算器——>查看——>科学型
选择十六进制
输入字符后再选择十进制即可自动转换为十进制数
因篇幅问题不能全部显示,请点此查看更多更全内容