MD320 串行通讯协议
MD320 串行通讯协议
附件说明:本文件与深圳市汇川技术有限公司所设计之通讯卡一起配送给用户。
在 MD320 系列变频器中,提供 RS232/RS485 通信接口,用户可通过 PC/PLC 实现集中控制
(设定变频器运行命令,功能码参数,读取变频器的工作状态及故障信息),以适应特定的使用要求。
1. 相关功能参数
FD-00:选择通讯xx率。 FD-01:数据格式
当选用偶校验或奇校验时,每一个字节长度为 11 位,其中 1 位起始位(0),8 位数据位,1 位校验位,1 位结束位(1)。
当选择无校验时,每个字节长度为 10 位,其中一位起始位(0),8 位数据位,1位结束位(1)。
FD-02:本纪地址,用来设定从机的地址。
FD-03:应答延时,当变频器收到与地址匹配的帧后到开始返回应答帧的延迟时间。应答延时过短可能导致上位机来不及接收。
FD-04:通讯超时时间,当经过该时间变频器仍未检查到通讯线上有信号时,将报通讯错误故障。此参数设为 0 时,不检测通讯超时。
FE-05:通讯协议选择,设为 1 时为标准的 MODBUS 协议,设为 0 时,读命令返回字节数比标准的 MODBUS 协议多一个字节。
2. 协议内容
该串行通信协议定义了串行通信中传输的信息内容及使用格式。其中包括:主机轮询(或广播)格式;主机的编码方法,内容包括:要求动作的功能码,传输数据和错误校验等。从机的响应也是采用相同的结构,内容包括:动作确认,返回数据和错误校验等。如果从机在接收信息时发生错误,或不能完成主机要求的动作,她将组织一个故障信息作为响应反馈给主机。
3. 应用方式
变频器接入具备 RS232/RS485 总线的“单主多从”PC/PLC 控制网络。
4. 总线结构
(1) 接口方式
RS232/RS485 硬件接口
(2) 传输方式
异步串行,半双工传输方式。在同一时刻主机和从机只能有一个发送数据而另一个只能接收数据。数据在串行异步通信过程中,是以报文的形式,一帧一帧发送。
(3) 拓扑结构
单主机多从机系统。从机地址的设定范围为 1~247,0 为广播通信地址。网络中的从机地址必须是唯一的。
5. 协议说明
MD320 系列变频器通信协议是一种异步串行的主从 ModBus 通信协议,网络中只有一个设备(主机)能够建立协议(称为“查询/命令”)。其他设备(从机)只能通过提供数据响应主机
的“查询/命令”,或根据主机的“查询/命令”做出相应的动作。主机在此是指个人计算机(PC),工业控制设备或可编程逻辑控制器(PLC)等,从机是指 MD320 变频器。主机既能对某个从机单独进行通信,也能对所有下位从机发布广播信息。对于单独访问的主机“查询/命令”,从机都要返回一个信息(称为响应),对于主机发出的广播信息,从机无需反馈响应给主机。
6. 通讯资料结构
MD320 系列变频器的 ModBus 协议通信数据格式如下:
使用 RTU 模式,消息发送至少要以 3.5 个字符时间的停顿间隔开始。在网络xx率下多样的字符时间,这是最容易实现的(如下图的 T1-T2-T3-T4 所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的 0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少 3.5 个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过 1.5 个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于 3.5 个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的 CRC 域的值不可能是正确的。
⚫ RTU 帧格式:
帧头 START | 3.5 个字符时间 |
从机地址 ADR | 通讯地址:1~247 |
命令码 CMD | 03:读从机参数;06:写从机参数 |
数据内容 DATA(N-1) | 资料内容: 功能码参数地址,功能码参数个数,功能码参数值等。 |
数据内容 DATA(N-2) | |
…… | |
数据内容 DATA0 | |
CRC CHK 高位 | 检测值: CRC 值。 |
CRC CHK 低位 | |
END | 3.5 个字符时间 |
⚫ CMD(命令指令)及 DATA(资料字描述)
命令码:03H,读取 N 个字(Word)(最多可以读取 12 个字)
例如:从机地址为 01 的变频器的启始地址 F002 连续读取连续 2 个值
主机命令信息
ADR | 01H |
CMD | 03H |
启始地址高位 | F0H |
启始地址低位 | 02H |
寄存器个数高位 | 00H |
寄存器个数低位 | 02H |
CRC CHK 低位 | 有待计算其 CRC CHK 值 |
CRC CHK 高位 |
FE-05 设为 0 时:
从机回应信息
ADR | 01H |
CMD | 03H |
字节个数高位 | 00H |
字节个数低位 | 04H |
资料 F002H 高位 | 00H |
资料 F002H 低位 | 00H |
资料 F003H 高位 | 00H |
资料 F003H 高位 | 01H |
CRC CHK 低位 | 有待计算其 CRC CHK 值 |
CRC CHK 高位 |
FE-05 设为 1 时
ADR | 01H |
CMD | 03H |
字节个数 | 04H |
资料 F002H 高位 | 00H |
资料 F002H 低位 | 00H |
资料 F003H 高位 | 00H |
资料 F003H 低位 | 01H |
CRC CHK 低位 | 有待计算其 CRC CHK 值 |
CRC CHK 高位 |
命令码:06H,写一个字(Word)
例如:将 5000(1388H)写到从机地址 02H 变频器的 F00AH 地址处。
主机命令信息
ADR | 02H |
CMD | 06H |
资料地址高位 | F0H |
资料地址低位 | 0AH |
资料内容高位 | 13H |
资料内容低位 | 88H |
CRC CHK 低位 | 有待计算 CRC CHK 值 |
CRC CHK 高位 |
从机回应信息
ADR | 02H |
CMD | 06H |
资料地址高位 | F0H |
资料地址低位 | 0AH |
资料内容高位 | 13H |
资料内容低位 | 88H |
CRC CHK 低位 | 有待计算 CRC CHK 值 |
CRC CHK 高位 |
⚫ 校验方式——CRC 校验方式:CRC(Cyclical Redundancy Check)
使用 RTU 帧格式,消息包括了基于 CRC 方法的错误检测域。CRC 域检测了整个消息的内容。CRC 域是两个字节,包含 16 位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的 CRC,并与接收到的 CRC 域中的值比较,如果两个 CRC 值不相等,则说明传输有错误。
CRC 是先存入 0xFFFF,然后调用一个过程将消息中连续的 8 位字节与当前寄存器中的值进行处理。仅每个字符中的 8Bit 数据对 CRC 有效,起始位和停止位以及奇偶校验位均无效。
CRC 产生过程中,每个 8 位字符都单独和寄存器内容相异或(XOR),结果向最低有效位方向移动,最高有效位以 0 填充。LSB 被提取出来检测,如果 LSB 为 1,寄存器单独和预置的值相异或,如果 LSB 为 0,则不进行。整个过程要重复 8 次。在最后一位(第 8 位)完成后,下一个 8 位字节又单独和寄存器的当前值相异或。最终寄存器中的值,是消息中所有的字节都执行之后的 CRC 值。
CRC 添加到消息中时,低字节先加入,然后高字节。 CRC 简单函数如下:
unsigned int crc_chk_value(unsigned char *data_value,unsigned char length)
{
unsigned int crc_value=0xFFFF; int i;
while(length--)
{
crc_value^=*data_value++; for(i=0;i<8;i++)
{
if(crc_value&0x0001)
{
}
else
{
}
}
}
crc_value=(crc_value>>1)^0xa001;
crc_value=crc_value>>1;
return(crc_value);
}
⚫ 通信参数的地址定义
该部分是通信的内容,用于控制变频器的运行,变频器状态及相关参数设定。读写功能码参数(有些功能码是不能更改的,只供厂家使用):
功能码参数地址标示规则:
以功能码组号和标号为参数地址表示规则:高位字节:F0~FF
低位字节:00~FF
如:F3-12,地址表示为 F30C;注意:
F1 组:只能读取参数,不可更改参数;FF 组:既不可读取参数,也不可更改参数;有些参数在变频器处于运行状态时,不可更改;有些参数不论变频器处于何种状态,均不可更改;更改功能码参数,还要注意参数的范围,单位,及相关说明。
另外,由于 EEPROM 频繁被存储,会减少 EEPROM 的使用寿命,所以,有些功能码在通讯的模式下,无须存储,只要更改 RAM 中的值就可以了。要实现该功能,只要把该功能码地址的高位 F 变成 0 就可以实现。
相应功能码地址表示如下:高位字节:00~0F
低位字节:00~FF
如:功能码 F3-12 不存储到 EEPROM 中,地址表示为 030C;该地址表示只能做写 RAM,不能做读的动作,读时,为无效地址。
FH 组功能参数:
有些带有扩展功能的机型,如 MD330 或带有供水卡的机型,增加了 FH 组参数,
FH 组参数在通讯中的地址为 D0**(不存储)E0**(存储)
参数地址 | 参数描述 |
1000 | 通信设定值(-10000~10000) (十进制) |
1001 | 运行频率 |
1002 | 母线电压 |
1003 | 输出电压 |
1004 | 输出电流 |
1005 | 输出功率 |
1006 | 输出转矩 |
1007 | 运行速度 |
1008 | DI 输入标志 |
1009 | DO 输出标志 |
100A | AI1 电压 |
100B | AI2 电压 |
100C | AI3 电压 |
100D | 计数值输入 |
100E | 长度值输入 |
100F | 线速度 |
1010 | PID 设置 |
1011 | PID 反馈 |
例如:FH-05,地址表示为 D005H 或 E005H。FH-30,地址表示为 D014H 或 E014H。停机/运行参数部分:
1012 | PLC 步骤 |
1013 |
命令字地址 | 命令功能 |
2000 | 0001:正转运行 |
0002:反转运行 | |
0003:正转点动 | |
0004:反转点动 | |
0005:自由停机 | |
0006:减速停机 | |
0007:故障复位 |
注意:通信设定值是相对值的百分数(-100.00%~100.00%),可做通信读写操作。控制命令输入到变频器:(只写)
读取变频器状态:(只读)
状态字地址 | 状态字功能 |
3000 | 0001:正转运行 |
0002:反转运行 | |
0003:停机 |
参数锁定密码校验:(如果返回为 8888H,即表示密码校验通过)
密码地址 | 输入密码的内容 |
4000 | ***** |
参数锁定命令:(只写)
锁定密码命令地址 | 锁定密码命令内容 |
5000 | 0001:锁定系统命令码 |
数字输出端子控制:(只写)
锁定密码命令地址 | 锁定密码命令内容 |
6000 | BIT0:DO1 输出控制 BIT1:DO2 输出控制 BIT2:RELAY1 输出控制 BIT3:RELAY2 输出控制 BIT4:FMR 输出控制 |
模拟输出 AO1 控制:(只写)
锁定密码命令地址 | 锁定密码命令内容 |
7000 | 0~7fff 表示 0%~100.00 % |
模拟输出 AO2 控制:(只写)
锁定密码命令地址 | 锁定密码命令内容 |
9000 | 0~7fff 表示 0%~100.00 % |
脉冲(PULSE)输出控制:(只写)
锁定密码命令地址 | 锁定密码命令内容 |
A000 | 0~7fff(十进制)表示 0 %~100.00% |
变频器故障描述:
变频器故障地址 | 变频器故障信息 |
8000 | 0000:无故障 0001:逆变单元保护 0002:加速过电流 0003:减速过电流 0004:恒速过电流 0005:加速过电压 0006:减速过电压 0007:恒速过电压 0008:控制电源故障 0009:欠压故障 000A:变频器过载 000B:电机过载 000C:输入缺向 000D:输出缺向 000E:散热器过热 000F:外部故障 0010:通讯故障 0011:接触器故障 0012:电流检测故障 0013:电机调谐故障 0014:码盘故障 0015:保留 0016:保留 0017:保留 0018:保留 |
通讯故障信息描述数据(故障代码):
通讯故障地址 | 故障功能描述 |
8001 | 0000:无故障 0001:密码错误 0002:命令码错误 0003:CRC 校验错误 0004:无效地址 0005:无效参数 0006:参数更改无效 0007:系统被锁定 |
7. FD 组通讯参数说明
FD-00 | xx率 | 出厂值 | 5 |
设定范围 | 0 | 300BPS | |
1 | 600BPS | ||
2 | 1200BPS | ||
3 | 2400BPS | ||
4 | 4800BPS | ||
5 | 9600BPS | ||
6 | 19200BPS | ||
7 | 38400BPS |
此参数用来设定上位机与变频器之间的数据传输速率。注意,上位机与变频器设定的xx率必须一致,否则,通讯无法进行。xx率越大,通讯速度越快。
FD-01 | 数据格式 | 出厂值 | 0 |
设定范围 | 0 | 无校验:数据格式<8,N,2> | |
1 | 偶检验:数据格式<8,E,1> | ||
2 | 奇校验:数据格式<8,O,1> |
上位机与变频器设定的数据格式必须一致,否则,通讯无法进行。
FD-02 | 本机地址 | 出厂值 | 1 |
设定范 围 | 1~247,0为广播地址 |
当本机地址设定为 0 时,即为广播地址,实现上位机广播功能。
本机地址具有唯一性(除广播地址外),这是实现上位机与变频器点对点通讯的基础。
FD-03 | 应答延时 | 出厂值 | 10ms |
设定范 围 | 0~20ms |
应答延时:是指变频器数据接受结束到向上位机发送数据的中间间隔时间。如果应答延时小于系
统处理时间,则应答延时以系统处理时间为准,如应答延时长于系统处理时间,则系统处理完数据后,要延迟等待,直到应答延迟时间到,才往上位机发送数据。
FD-04 | 通讯超时时间 | 出厂值 | 0.0 s |
设定范 围 | 0.0 s(无效),0.1~60.0s |
当该功能码设置为 0.0 s 时,通讯超时时间参数无效。
当该功能码设置成有效值时,如果一次通讯与下一次通讯的间隔时间超出通讯超时时间,系统将报通讯故障错误(Err16)。
通常情况下,都将其设置成无效。如果在连续通讯的系统中,设置次参数,可以监视通讯状况。
8. 以下 C 代码为 PC 上串口通信模仿程序,可供用户参考(在 TURBO C2.0 环境下编译执行):
/*RS485&RS232 communication test program*/ #include<stdio.h>
#include<conio.h> #include<process.h> #include<dos.h>
unsigned int crc_chk_value(unsigned char *data_value,unsigned char length);
#define PORT 0x03F8 /*the address of COM1*/
/*the address offset value relative to COM1*/
#define IER | 0x0001 |
#define BRDH | 0x0001 |
#define LCR | 0x0003 |
#define MCR | 0x0004 |
#define LSR | 0x0005 |
#define MSR | 0x0006 |
unsigned char send_data_table[8]={0x01,0x06,0x20,0x00,0x00,0x02}; unsigned char receive_data_table[50];
void main()
{
unsigned int i; unsigned char *p; unsigned int crc_value;
outportb(PORT+MCR,0x08); /*interrupt enable*/ outportb(PORT+IER,0x01); /*interrupt as data in*/ outportb(PORT+LCR,(inportb(PORT+LCR)|0x80));
outportb(PORT,12); /*set baudrate=9600,12=115200/9600*/ outportb(PORT+BRDH,0x00);
outportb(PORT+LCR,0x1b); /*<8,N,2>=07H;<8,E,1>=1BH;<8,O,1>=0BH*/
p=send_data_table; crc_value=crc_chk_value(p,6); send_data_table[6]=crc_value&0x00ff; send_data_table[7]=(crc_value>>8)&0x00ff; i=0;
for(i=0;i<8;i++)
{
while(!(inportb(PORT+LSR)&0x20)); /*wait until THR empty*/
{
}
} i=0;
outportb(PORT,send_data_table[i]); /*send data to THR*/ printf("send data table %x = %x\n",i,send_data_table[i]);
while(!kbhit())
{
if(inportb(PORT+LSR)&0x01)
{
receive_data_table[i]=inportb(PORT); /*read data from RDR*/ printf("receive data table %x = %x\n",i,receive_data_table[i]); i++;
}
}
clrscr();
}
/******************************************************/ unsigned int crc_chk_value(unsigned char *data_value,unsigned char length)
{
unsigned int crc_value=0xFFFF; int i;
while(length--)
{
crc_value^=*data_value++; for(i=0;i<8;i++)
{
if(crc_value&0x01)
{
}
else
{
}
}
}
crc_value=(crc_value>>1)^0xa001;
crc_value=crc_value>>1;
return(crc_value);
}