施耐德ATV31变频器通信问题 点击:6381 | 回复:18



王显

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 1回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2002年2月14日
发表于:2004-12-19 19:28:00
楼主
我需要PC机通过485总线与施耐得ATV31变频器通信给定运行频率并控制电机起停同时读回电机运行速度,PC机拟采用VB编程,那位高手能给以指点。非常感谢!



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2005-08-23 16:53:00
1楼
31的变频器有CAN,直接使用CAN总线简单方便。

yachengw

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 12回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2004年2月27日
发表于:2005-11-27 23:14:00
2楼
可以使用ATV31的MODBUS通信

laoC

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:23
  • 注册:2004年4月27日
发表于:2005-11-30 12:32:00
3楼
用VB实现基于Modbus的计算机和变频器之间的通讯
施耐德(苏州)变频器有限公司  郁陈华
摘要:文章对施耐德变频器所采用的Modbus协议进行了简要的介绍。同时,列举了用VB实现Modbus RTU协议需要注意的几个问题,并以例程阐述了相应的解决方法。最后,对变频器内参数与Modbus 协议的对应关系进行了简单描述。
关键词:Modbus    VB     串行通讯


一.    引言
随着工控技术的飞速发展,目前,几乎所有的变频器都带有能和上位机进行通讯的RS485串行接口。与传统的用模拟量监控变频器的方式相比,用串行口进行监控的优势是明显的―――用模拟量信号进行监控,每传递一个信号,就需要物理上的一个回路;用RS485串行口的方式,则只需一个物理链路就可以监控多台变频器内的全部信号。并且,由于目前的变频器都由微机进行控制,其内部信号均为数字信号,用通讯方式避免了信号的A/D,D/A转换,因此信号的传输精度也较高。因此,在一些实时性要求不高、需要一台主机监控多台变频器的场合,越来越多的用户选择了串行通讯技术。
通常,上位机为PLC或工业PC。PLC的编程视品牌和型号的不同,其编程方法有很大的区别。而PC机的编程,多数用户都会选择VB,因为VB的编程比较简单,而且提供标准的通讯控件。
多数品牌的变频器内置一个简单的RS485通讯协议,一般基于ASCII编码,采用和校验(check sum)的检错方式。而施耐德的变频器采用Modbus协议中的RTU模式,直接传送二进制数据,检错方式为CRC-16。采用VB编程时,需要作一些特殊的处理。

二.    Modbus简介
Modbus是由Modicon公司提出的用于可编程控制器之间进行信息交换的一种串行通讯协议。随着Modicon公司归入施耐德电气的旗下,Modbus 成为施耐德电气产品的主要串行通讯协议之一。
和许多工业控制协议一样,Modbus也采用主从通讯的方式,即由主机发起通讯,从机只能被动应答主机的“问询”。
Modbus有两种工作模式,分别是ASCII模式和RTU模式。在ASCII模式下,每一个8位的字节被编为两个ASCII字符。采用ASCII模式的主要优点是允许字符之间的间隔可长达1秒。在RTU模式下,数据直接以字节方式传输。显然,在波特率相等的情况下,RTU模式的传输效率更高。由于RTU模式下以线路空闲作为帧结束的标志,所以同一帧数据必须连续传送。
处于传输效率的考虑,多数支持Modbus的工控设备采用RTU模式,本文将以Modbus RTU模式为例。
RTU模式的报文格式如下:

START    ADDRESS    FUNCTION    DATA    CRC CHECK    END
T1-T2-T3-T4    8 BITS    8 BITS    n x 8 BITS    16 BITS     T1-T2-T3-T4

图1
图1中的START, END作为一帧报文的开始和结束标志, 在RTU模式中,物理上是3.5个字符长度的线路空闲。
ADDRESS部分是地址信息,占用一个字节。
FUNCTION部分是本报文的功能代码,以一个字节表示。如03代表主机向从机发出的参数读取请求。
DATA部分是实际传输的数据。
CRC CHECK部分为16位校验码,校验方式为CRC-16。

三.    VB实现Modbus RTU的几个特述问题
VB提供了标准的通讯控件 MSCOMM,因此,编制串行通讯程序比较简单。有关该控件的应用许多文章都有介绍,这里不再赘述。
由于Modbus RTU模式涉及到一些低层的二进制操作,而VB是一种面向对象的高级语言,因此在实现Modbus RTU时,会碰到一些特殊的问题。
1.    传送二进制字节问题
缺省情况下,VB的MSComm控件的Inputmode属性为0,代表Text。这时,计算机将把接收到的字节视为ASCII字符。而Modbus RTU下,从机返回的将是二进制数,这样,计算机处理数据是就会出错。因此,必须将MSComm控件的该属性改为1,VB将以二进制字节的方式处理收到的数据,就可获得正确的结果。
2.CRC-16的计算
CRC(循环冗余码)是一种漏检率极低的校验方法,它通过由报文数据组成的多项式对特定的生成多项式进行二进制除法,发送方将余数作为校验码发送,接收方以接收到的数据组成多项式对同一生成多项式作除法计算,然后视余数是否为零来决定传输是否出错。如传输过程中未发生错误,则余数应该为零。CRC-16是指生成多项式为:X16+X12+X5+1.的CRC校验方法。 CRC-16能检查出所有的1位,2位出错;所有字节数为奇数的报文的出错;所有字节数少于16位的报文的出错;对17位以上报文的正确检错概率为99.997以上。正因如此,CRC-16是通讯中最常用的检错方法之一。
Modbus协议给出了CRC-16的计算方法,以伪代码形式表示如下:
Initialize the CRC (16-bit register) to H’FFFF.
Enter the first to the last byte of the message :
    CRC XOR <byte> —> CRC
    Enter 8 times
         Move the CRC one bit to the right
           If the output bit = 1, enter CRC XOR H’A001—> CRC
    End enter
End enter
首先将校验结果(CRC)初始化为十六进制数“FFFF”。然后,对报文的每个字节做如下运算:首先与当前的CRC作异或运算,然后再将运算结果做8次右移,如果移出的一位为1,则将当前的CRC和十六进制数”A001”作异或运算,结果代回CRC。直至8次移位运算全部完成。对报文中的每个字节进行上述计算,最后的结果就是需要求取的CRC项。
以下是一个用VB编的用于进行CRC-16运算的函数:
 

Public Function crc(data() As Byte, stanum As Integer, num As Integer) As Long
   
   crc = &HFFFF&
   For i = stanum To num
    crc = crc Xor data(i)
      For j = 1 To 8
       lsp = crc And &H1      '取将要移出的一位。
       crc = crc \ 2
       crc = crc And &H7FFF
       If lsp = 1 Then
         crc = crc Xor &HA001&  '同样因为HA001的首位为1
       End If
     Next j
   Next i

End Function
VB并没有提供二进制移位算法。由于右移相当于除以2,因此,上例中用“\2”代替右移运算。还有一点值得注意:当使用十六进制立即数,而其最高位为“1”(如上例中的H’FFFF,H’A001等)时,需在数据后加上”&”,以将此立即数声明为BYTE类型,否则VB自动认为这些数据为整型数,而把最高位为”1”的那些数看作负数来进行“\2”运算,将得不到正确的结果。
3.负数处理
Modbus协议规定,负数以补码表示。在有的变频器中(如施耐德公司的PDL变频器),以负数表示反向值,如+50表示正向速度为50个单位,则-50就表示反方向50单位大小的速度。VB的MSComm控件无法自动分辨负数,必须由用户自己编程解决。由于补码为原码求反后加1,同时,有的数据占用两个以上的字节,因此编程时要将接收到的字节先求反,再组合成一个数,然后再加1,即可求得负数的绝对值,然后再按需要对此值进行处理。下面的程序完成接收一个两字节负数,再进行显示的功能。
Private Sub cmdRec_Click()
  Dim buf$
  Dim data As Long
  Dim FlagOfNeg As Boolean 
  Dim neg1 As Integer
  Dim neg2 As Integer
  Dim spset As Single
  
  InByte = MSComm.Input
  If InByte(3) >= 128 Then
    FlagOfNeg = True
   Else
     FlagOfNeg = False
  End If
  
  If FlagOfNeg Then
  
 neg1 = (Not InByte(3))    
        neg2 = (Not InByte(4))
 data = (neg1 And &HFF&) * 256 + (neg2 And &HFF&) + 1   
        spset = data / 2048 * 250
        txtSet.Text = "-" + CStr(spset \ 10) + "." + CStr(spset Mod 10) + "%"
   Else
  
 data = (InByte(3) And &HFF&) * 256 + (InByte(4) And &HFF&)  
       spset = data / 2048 * 250                                    
       txtSet.Text = CStr(spset \ 10) + "." + CStr(spset Mod 10) + "%"
 End If
 
End Sub

四.    变频器中Modbus报文的表达
变频器通讯所用的Modbus协议其实只是Modbus的一个功能子集。通常只用到03,06,10(十六进制)功能代码,在Modbus协议中,其含义分别为读多个寄存器值,写数据到一个寄存器,写数据到多个寄存器。而在变频器中诸如频率,电流等参数值存放在相应的寄存器中;运行、停止、报警等开关量信息则被表达为寄存器的位。因此,上位机通过读写相应的寄存器就实现了对变频器的监控。
当然,不同型号的变频器的参数和寄存器的对应关系以及参数值的标定方法会有所不同。
以施耐德公司最新推出的工程型矢量变频器PDL为例,03H功能代码所对应的报文格式如下:
03读多个参数

字节含义    实例(十六进制)
从机地址    0AH
功能代码    03
寄存器首地址高位    00
寄存器首地址地位    00
需读取的寄存器数量高位字节    00
需读取的寄存器数量低位字节    03
CRC校验    04H,B0H
按Modbus协议规定,寄存器的地址为对40001(十进制)的偏移量。因此上例报文的功能为读取地址为40001,40002,40003三个寄存器的数值。按PDL手册,此三个寄存器分别存储电机的额定电流,额定电压,额定频率。
从变频器返回的典型报文如下:
 


字节含义    实例(十六进制)
从机地址    0AH
功能代码    03H
数据字节数    06H
40001内数据    1DH 71H
40002内数据    00H E6H
40003内数据    00H 32H
CRC校验    4DH E1H

返回数据的大小由变频器手册约定的数据对应关系有关,如PDL手册规定,40001寄存器存储的数据范围为1638―――12288(十进制),表示20―――150%的变频器额定电流。40002寄存器存储的数据范围为0―――999,表示电机电压从0―――999V。
对于写操作10H,也有类似的报文格式,不再赘述。

五.结束语
施耐德变频器采用Modbus RTU协议进行通讯,提高了数据发送的效率,但给习惯用VB编程的用户带来了一定的困难。本文提出了针对这些问题的解决办法。按照这些基本的处理方法,加上一些时序处理、画面处理的工作,就可以编制功能强大、界面友好的计算机监控程序。

QING78

  • 精华:4帖
  • 求助:0帖
  • 帖子:21帖 | 230回
  • 年度积分:0
  • 历史总积分:682
  • 注册:2006年2月14日
发表于:2006-08-14 11:03:00
4楼

zoulim

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2005年4月21日
发表于:2006-08-28 10:58:00
5楼
请教各位,新买的ATV31,通电后LED右边二个CAN指示灯RUN和ERR不停的闪烁,RUN快一点,ERR慢一点,是否正常?

wkm9304

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 2回
  • 年度积分:0
  • 历史总积分:66
  • 注册:2006年9月16日
发表于:2006-09-16 12:04:00
6楼
“小张》”:你好!6SE3225-5DJ40 MMV 的“操作手册”能发给一份吗?wkm9304@163.com 谢谢!

皓月

  • 精华:9帖
  • 求助:0帖
  • 帖子:483帖 | 5271回
  • 年度积分:0
  • 历史总积分:8863
  • 注册:2003年11月09日
发表于:2006-10-15 23:51:00
7楼
用modbus通讯是最实际的方法,不过需要一块232-485转换模块

专搞施耐德

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 25回
  • 年度积分:0
  • 历史总积分:24
  • 注册:2004年4月05日
发表于:2006-11-29 00:00:00
8楼
通电后LED右边二个CAN指示灯闪烁是使用了canopen通讯控制,如果不用,去掉就好了

acmilanyao

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 22回
  • 年度积分:0
  • 历史总积分:40
  • 注册:2004年6月10日
发表于:2006-12-14 20:15:00
9楼
modbus太慢了,还是用CAN比较好,而且31本身自带CAN接口,找一块支持CANOPEN协议的PLC就可以了,不过atv31的CANOPEN协议好像有点问题,关于PDO映射表的!当然,用默认映射表是没有问题的!

骷髅反上帝

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 165回
  • 年度积分:0
  • 历史总积分:5085
  • 注册:2006年5月17日
发表于:2008-04-21 09:17:26
10楼
建议用CAN ,很好的,PDO不行,可以用SDO啊

飞翔我心

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 48回
  • 年度积分:0
  • 历史总积分:97
  • 注册:2007年10月19日
发表于:2008-07-11 23:30:21
11楼

用MODBUS通讯不是很好吗?在说变频器调速的实时性要求不是很高,如果要用CAN通讯就需要增加成本的呀.其实通讯设定是很简单的,你可以到施耐德网站去下载个变频器的手册,查以下对应的通讯地址,然后写值,按顺序操作就可以了

chensuo6688

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 73回
  • 年度积分:0
  • 历史总积分:188
  • 注册:2007年8月15日
发表于:2008-08-29 17:27:53
12楼

CAN还可以.........................................

 

bandit

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 132回
  • 年度积分:0
  • 历史总积分:1520
  • 注册:2003年7月19日
发表于:2008-09-23 21:57:52
13楼
很好的东西,学习下。

坤哥

  • 精华:0帖
  • 求助:0帖
  • 帖子:40帖 | 472回
  • 年度积分:0
  • 历史总积分:1123
  • 注册:2005年3月16日
发表于:2008-11-03 10:03:59
14楼
modbus通讯是最实际

坤哥

  • 精华:0帖
  • 求助:0帖
  • 帖子:40帖 | 472回
  • 年度积分:0
  • 历史总积分:1123
  • 注册:2005年3月16日
发表于:2008-11-03 10:08:45
15楼
要是实在是不明白的话,找我吧,QQ:6101967

坤哥

  • 精华:0帖
  • 求助:0帖
  • 帖子:40帖 | 472回
  • 年度积分:0
  • 历史总积分:1123
  • 注册:2005年3月16日
发表于:2008-11-03 10:12:14
16楼
要是实在是不明白的话,找我吧,QQ:6101967

小小蒙童

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 58回
  • 年度积分:0
  • 历史总积分:92
  • 注册:2003年7月17日
发表于:2008-11-03 15:06:01
17楼

更多ATV变频器的通信,可以上施耐德中国网站

http://www.schneider-electric.cn/schneider/otherTypeIndex.jsp?PID=0604&ID=06040706

填写调查表还可以赢纪念品那

longen19810210

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 11回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2008-11-04 05:11:22
18楼

上面的郁陈华的论点很不错,可以借谏一下!

 


热门招聘
相关主题

官方公众号

智造工程师