APP下载

用VB编写CAN总线以太网通讯协议

2012-02-15韩立立

通信技术 2012年12期
关键词:模拟量控件字节

韩立立

(中国石油大学 理学院实验中心,山东 青岛266580)

0 引言

随着计算机、网络技术、软件工程、自动控制等多个高新技术的发展,越来越多的工业现场情况需要用计算机实现对CAN设备的监控。当CAN设备没有通讯协议时,就需要编写符合CAN总线传输的通讯协议。

文中将着重阐述该系统通讯方法的实现。由于计算机不能直接发送数据到CAN总线上去,必须经过CAN-以太网网关或CAN-232串口服务器转换才能实现。

1 通讯介绍

控制器局域网络(CAN,Control Area Network),它最初是由德国的 BOSCH公司为汽车监测、控制系统而设计的。目前,CAN总线是唯一已成为国际标准的,被公认为是几种最有前途的现场总线之一。

CAN具有下列主要特性[1]:单根双绞线最远传输距离10km/5kb/s,最高传输速率1Mb/s/40m。非破坏性总线仲裁技术,采用干扰概率低的短帧结构多地址传送; CAN可与输入输出设备、单片机、控制器、收发器等多种设备配合使用。全系统数据兼容性;错误检测和出错信息自动判别、自动重发、自动脱离。

在总线中传送的报文,每帧由7 部分组成,详细说明如下:

1)00:A 口(一般CAN-以太网网关有1-4个CAN端口)收到的数据,0-3 对应A-D 4个CAN 端口,为报文接收到的第1个字节。

2)10 00 00 00:接收到的CAN ID(CAN ID 为1,低位字节在前,高位在后)。

3)08:此CAN 数据包中的CAN 数据区长度(最大8 个字节)。

4)01 02 03 04 05 06 07 08:8 个字节的CAN数据区数据。

5)01:1 为扩展帧(CAN2.0B)格式,0 为标准帧(CAN2.0A)。

6)00:远程传输位,0-非RTR 数据包,1-为RTR数据包。

7)00 00 00 00:保留的4 个数据字节,为报文接收的最后字节。

CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11 位,扩展格式为29 位。报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。

2 用VB进行以太网通讯

VB中通过Winsock控件与远程计算机或以太网设备建立连接,并通过用户数据交换协议(UDP)或者传输控制协议(TCP)进行数据交换。Microsoft Access、Visual Basic、Visual c++等的开发人员都可使用它。用VB的Winsock 控件来编写客户端和服务器应用程序,只需设置控件的属性并调用其方法就可轻易连接到一台远程机器上去;并且还可在两应用程序间进行双向交换数据,完成两机间的通信,编程简单、快捷、安全[2]。

3 通讯协议的编写

CAN的报文格式分两种:扩展帧和标准帧。标准帧每次只能传送8个数据(16进制),而现场需要传输的数据类型不仅有开关量,还有模拟量,且一般所需要传输的数据都很多。所以我们将CAN的8个数据(例如FFFF006E43301000)分成两部分:前两为FFFF代表开关量,如果将16进制转换成2进制为1111 1111 1111 1111,代表16个开关量数据,从左到右分别是 D1、D2…D16;后 6位006E43301000代表2个模拟量,前一个模拟量为整数(006E转换成10进制分别是110),后一个模拟量为小数编码传输(43301000用IEEE754编码,转换成小数为176.0652,具体转换方法如下:176.0652转换成2进制为10110000.0001,规格化二进制数:1.01100000001*2^7 (小数点移了7位),计算指数:7+127=134 (127是个标准数值),按照IEEE754编码排列为 0 10000110 01100000001 000000000000(不足32位,后面补0,直到补足32位),二进制结果是0100 0011 0011 0000 0001 0000 0000 0000,十六进制结果是0x43301000)。这样每个CAN标准帧传输16个开关量和1个10进制0—65535的整数值和1个10进制任意的小数值(如果实际需要传输的整数数据大于 65535,可以作为小数传输),实际需要传输的开关量或模拟量有多少,就发送相应倍率的CAN标准帧就可以了。例如实际需要传输500个开关量和70个模拟量,500除以16取整应该是32;70除以2取整为35;所以应该传输35个CAN标准帧。这35个CAN标准帧的区分就在CAN ID中,举例说明(发送数据为P1—P600):

软件发送 001400000008FFFF006E43301000000 000000000到CAN设备。代表从上位电脑写P1—P19到CAN设备其中P1-P16为1,P17为16进制006E,10进制为110;P38为16进制43301000实际值为176.0652;

软件发送 001500000008FFFF006E43301000000 000000000到CAN设备。代表从上位电脑写P21—P39到CAN设备其中P21-P36为1,P37为16进制006E,10进制为110;P38为16进制43301000实际值为176.0652[3];

每组20个数据(第20个数据不用),在编制软件时用循环很容易完成。

4 软件通讯的实现

将 CAN-以太网网关的工作模式设置成服务器方式;将CAN-以太网网关CAN总线的通讯速率设置成和CAN设备一样的速率;将计算机的IP地址设置成和CAN-以太网网关同一个网段里的不同IP地址;用VB新建个工程,将Winsock控件添加到工程中,其属性中的RemoteHost属性设置成CAN-以太网网关的IP地址,其属性中的 RemotePort属性设置成 CAN-以太网网关的侦听端口,在窗体上添加 Command1、Command2、Text1.Text3个控件,编写代码如下:

Private Sub Command1_Click()

Winsock1.Connect

End Sub

Private Sub Command2_Click()’发送0014000 00008FFFF006E00780064000000000000

Dim X(19) As Byte

'X(0) = &H0

X(1) = &H14

X(2) = &H0

X(3) = &H0

X(4) = &H0

X(5) = &H8

X(6) =&HFF

X(7) = &HFF

X(8) = &H0

X(9) = &H6E

X(10) = &H0

X(11) = &H78

X(12) = &H0

X(13) = &H64

X(14) = &H0

X(15) = &H0

X(16) = &H0

X(17) = &H0

X(18) = &H0

X(19) = &H0

Winsock1.SendData X()

End Sub

接收数据代码如下:

Private Sub Winsock 1_DataArrival (ByVal bytes Total as Long)

Dim p1, buf, data1 As String

Dim InByte, I

Buf = ""

Winsock 1.GetData data1

InByte = data1

For I = LBound(InByte) To UBound(InByte)

If Len(Hex(InByte(I))) = 1 Then Buf = Buf+ "0" + Hex(InByte(I))

If Len(Hex(InByte(I))) = 0 Then Buf = Buf+ "00"

If Len(Hex(InByte(I))) = 2 Then Buf = Buf+ Hex(InByte(I))

Next I

Text1.Text = Buf ‘将接收的数据放到Text1.Text里显示

End Sub

将设备连接好,加电后,运行软件点击Command1,和 CAN设备建立通讯链路,点击Command2,将数据发送到CAN设备。当CAN设备返回数据时,将自动显示在Text1.Text里。

5 结语

用以上方法将数据读上来后,可以自己编写监控界面,也可以用DDE 或OPC的方式将采集数据放到任何组态软件中,用组态软件监控设备运行[4]。基于嵌入式系统的智能节点在CAN总线中的应用灵活稳定[5]。CAN总线技术下设计企业的生产监控系统,提高现代制造企业生产的信息化与网络化水平。

[1] 京金华(北京)有限公司.CAN产品配置手册[M].北京:出版者不详,2007:2-22.

[2] 李天启.Visual Basic 6学习捷径[M].北京:清华大学出版社,1994:68-98.

[3] 王道义.VisualBasic 6使用详解[M].北京:机械工业出版社,1997:32-55.

[4] 张亚娟.基于嵌入式系统的智能节点在 CAN总线中的应用[J].通信技术,2006(06):51-54.

[5] 蔡连君.基于 CAN总线的生产监控系统研究[J].通信技术,2009,42(10):151-152.

猜你喜欢

模拟量控件字节
No.8 字节跳动将推出独立出口电商APP
基于.net的用户定义验证控件的应用分析
No.10 “字节跳动手机”要来了?
基于信号集中监测的轨道电路模拟量报警分析
基于MSP430的四旋翼飞行器的S-BUS通信协议的设计与实现
关于.net控件数组的探讨
关于600MW火电机组模拟量控制系统设计和研究
一种通用模拟量及开关量信号采集板卡的设计
基于S7-200PLC 模拟量扩展模块使用问题的研究
基于嵌入式MINIGUI控件子类化技术的深入研究与应用