西门子6ES7222-1BD22-0XA0诚信经营
基于CAN-bus网络的虚拟串口
在工业串行通讯领域中,RS-232与RS-485都是会被经常用到的数据传输标准之一。例如,普通PC一般会提供1~4个标准RS-232端口,分别被标注为COM1~COM4端口。用户可以通过这些现成的RS-232端口连接外部设备,比如键盘、IC读卡器、条码阅读器、数字化仪、打印机、数据记录仪,或者由用户自己定制的串行通讯仪器,等等。操作或编程这些标准的COM端口也是非常方便的,因为市场上有众多的串口软件调试工具可供通讯测试,也有功能齐全的DLL程序开发库可供编程时调用。
传统RS-232串行通讯存在着数据可靠性、通讯距离、端口数量等多个方面的限制。例如,在工业控制等现场环境中,常会有电气噪声干扰传输线路,使用RS-232通讯时经常因外界的电气干扰而导致信号传输错误;在不增加缓冲器的情况下,RS-232通讯的大传输距离只可以达到15米;还有,同1个RS-232端口只能够连接1个RS-232通讯设备。上述因素大大限制了RS-232通讯的应用领域。
本文介绍了一种简单、可靠的方法,通过利用ZLGCAN接口卡、CAN232MB转换器等设备,可以在1条普通双绞线上连接多达2048个RS-232设备,通讯距离可以长达10公里甚至更远的距离。
下面,先介绍实现远程RS-232通讯的设备驱动软件:虚拟串口服务器,即VCOM服务器。虚拟串口服务器是一款专用的配置工具;运行此服务器软件,即可以在同一台PC上安装一个或多个虚拟串口,虚拟串口的数目可以多达2048个。这些虚拟串口可以同真实串口执行完全一致的操作;实际上,通过普通双绞线构成的CAN-bus网络,在这些虚拟串口上通讯的数据被快速映射到CAN-bus网络中远端CAN232MB转换器的RS-232通讯端口。这样,在同一CAN-bus网络中连接n个CAN232MB转换器,即可以映射成本地的n个远程虚拟串口。通过软件的无缝衔接,远程虚拟串口和本地串口在操作上并不存在任何差异。例如,将一些设备的串口程序升级到通过远程虚拟串口来实现时,升级软件可以不作任何修改,只需在打开串口时设定所操作的远程虚拟串口号,就可以实现正常的串行数据通讯。
虚拟串口的建立
下面以一个提供8个串口的虚拟串口网络实例为原型,说明如何在同一台PC建立多个虚拟串口,并且提供了虚拟串口测试网络的实现方法。如需要建立更多数目的虚拟串口,可以参考建立上述网络的方法,步骤基本一致;只需要在CAN-bus网络中增加CAN232MB转换器的数目,并通过软件适当配置参数即可以工作。
虚拟串口服务器可以在安装PCI-9810/9820/9840接口卡的PC上添加多达2048个远程虚拟串口。
同一台PC上可安装多块CAN接口卡。无论安装有多少块CAN卡,虚拟串口服务器都会把它们统一管理起来。不同的CAN接口卡以及同一块CAN接口卡上的不同CAN通道将共同分享0~2048的CANID号。每一个ID号对应一个串口号,这样CAN-bus网络中的任一个CAN232MB转换器就对应着PC上的一个虚拟串口。
例如,当前PC上安装了一个虚拟串口,名称为COM33。用户向COM33端口写入的数据将直接送到CAN-bus网络中,由一个ID设置为33值的CAN232MB转换器接收,并在其RS-232端口输出;同理,连接到ID设置为33值的CAN232MB转换器的用户RS-232设备所发出的数据,将通过CAN-bus网络送到PC机,保存在PC上虚拟串口COM33的数据缓冲区内。当用户读取COM33数据的时候,虚拟串口服务器就把这些数据返回给用户。
上图所示的CAN-bus网络中连接有8个CAN232MB转换器,每个CAN232MB转换器的串口都被映射成第1台工作PC的1个虚拟串口,共8个虚拟串口;每个串口都和MOXA多串口卡(型号:CP-168U8路多串口卡)的其中一个串口相连,用于提供各个串口数据的测试与验证。第1台工作PC安装有1个PCI-9840接口卡,连接在CAN-bus网络中;用户也可以连接其他型号的CAN接口卡,同样可以实现这一个虚拟串口的网络实例。
虚拟串口服务器的配置
下面介绍虚拟串口服务器的配置软件。软件启动界面如下:
通过服务器软件安装虚拟串口,和远程RS-232设备建立通讯,需要新建一个配置文件,并进行一些相关配置。点击界面左上角的“新建”按钮,此时弹出保存配置文件对话框,在其中选定保存路径以及保存文件名。
CAN-bus网络的优势
CAN-bus是国际上应用广泛的现场总线之一,被广泛应用于欧洲的中汽车中,用作ECU单元的串行数据传输网络;近几年来,CAN-bus开始进入中国各个行业的数据通讯应用,并于2002年被确定为电力通讯产品领域的国家标准。
与RS-485类似,CAN-bus网络使用普通双绞线作为传输介质,采用直线拓朴结构,单条网络线路至少可连接110个节点,网络总长度大可达10公里。在CAN-bus网络中,数据收发、硬件检错均由CAN控制器硬件完成,大大增强了CAN-bus网络的抗电磁干扰能力,即由硬件来保证CAN-bus网络运行的可靠性。据国际CiA协会统计,2001年仅在欧洲就销售了超过1亿个CAN-bus节点,几乎淘汰了欧洲所有的RS-485系统。目前,国内的汽车、电梯行业已是CAN-bus应用的典型领域,工业控制、智能楼宇、煤矿设备等行业也是日见更多型号的应用CAN-bus总线设备与产品。
CAN-bus总线的优点:可靠性高,可以支持硬件节点的即插即用;故障节点可自动关闭,不影响其他网络节点;采用芯片硬件ID方式管理网络,故障节点界定十分方便,网络维护成本比较低。CAN-bus网络可以保证良好的通讯实时性。
CAN-bus总线的适用范围:可适用于节点数目很多,传输距离在10公里以内,安全性要求高的场合;也可适用于对实时性、安全性要求十分严格的机械控制网络。
1 前言
Visual Basic6.0(以下简称VB)以其简单易学、32位面向对象的程序设计等特点,倍受广大计算机开发者的青睐,已广泛地应用于各个领域;在实时监测系统中串行端口通信是其一项基础功能,我们使用VB6编写实时液位控制系统的上位机通讯软件。
传统的应用程序开发过程可以分为三个明显的步骤:编码、编译和测试代码。VisualBasic与传统的语言不同,它使用交互式方法开发应用程序,使三个步骤之间不再有明显的界限。由于VisualBasic的交互特性,代码运行效果可以在开发时进行测试,而不必等到编译完成以后。
2 液位控制系统的工艺流程
本装置由过程调节系统(电动执行机构、调节阀、变频器、透明水槽、储水槽、水泵等)、过程控制系统(进口智能控制器、分配器、转换器、电源等)、计算机网络及软件等组成。
系统有两个液位水槽(罐)和一个储水槽组成。管路采用不锈钢塑料复合管,阀门、水管管件、仪表柜采用900*2100*500的全封闭形式、控制器选用PLC和智能调节器、液位变送器采用压力传感器、调节阀采用气动薄膜调节阀、变频器对水泵转速控制、为了增加流量实验采用了流量变送器。
整个系统由网络级、监控级、控制级、现场级构成DCS过程控制系统,网络级可于Internet连接,实现远程网络操作与控制,监控级完成工艺过程可视化、模块化组态、实时的参数采集设置和控制、实时和历史趋势、数据采集与数据管理网络功能、用户综合报表、报警与报警管理、通讯与打印管理等。控制级完成控制规律与参数设定、控制算法运算、控制信号输出、实时准确的完成控制执行机构的动作;现场级执行控制信号、在线实时调节输出幅值,并将检测到的液位和流量的过程值回送到控制器。流程图如图1。
图1 工艺流程图
3 软件设计、实现
3.1根据实际的工艺过程分析软件功能的要求。如需要与下位机采集数据的顺序,数据的范围条件,采集数据的周期(采样周期)无效或错误数据的舍取与纠正等。操作方式(手动,自动,本地监控,远程监控等)。
3.2 根据控制系统控制方案的要求构造软件的模块。
3.3 根据控制要求确定的用户输入,输出设备,据此确定软件的人机交互功能表,进行程序设计。
4 功能模块划分(如图2)
图2
根据设计的任务和要求, 上位机所要完成的功能主要包括:人机交互界面,数据通讯模块,输入输出处理三大部分。
4.1人机界面要实现控制量的输入(到下位机),控制过程状态变量的采集,显示和保存(时实曲线、历史曲线、数据库操作等),数据处理结果的输出打印(打印功能)。
4.2 数据的传输主要依靠通讯协议来完成,在软件中是重要的部分。上位机与PLC采用RS---422/485串口通讯协议,上位机每隔50ms就要完成一次数据采集过程(主要是容器的液位值等)。允许操作者通过软件设定控制参数,改变控制状态。也就是,执行控制信号、在线实时调节输出幅值,并将检测到的液位的过程值发送到上位机。
4.3输入输出处理是指上位机通过通讯端口把采集到的原始数进行处理,以用户可以读懂的形势表现出来,采集到的数据先通过数据库保存,用图形或列表等比较直观的形势显示在用户面前。
过程数据处理的结果就是在整个试验过程中控制量和反馈结果的集合,通过上位机保存到数据库中,我们就是通过分析这些数据的变化规律达到学习和理解过程控制的内在实质。即完成控制规律的与参数设定、控制算法运算、控制信号输出、实时准确的控制执行机构的动作。
5 串行通讯的实现
5.1在VB中实现串口通信的控件Mscomm是容易实现串口通讯的(在工程部件中添加Microsoft Comm Control6.0),Mscomm控件提供了功能完善的串口数据的发送和接收功能,Mscomm控件具有两种处理方式:1事件驱动方式:由Mscomm控件的OnComm事件捕获并处理通信错误及事件;2查询方式:通过检查CommEvent属性的 值来判断事件和错误。
Mscomm控件的通信功能实现,实际上是调用了API函数,而API函数是由Comm.drv解释并传给设备驱动程序执行的,对于我们开发程序时只需知道Mscomm控件的属性和事件的用法即可以实现串口的操作。
以下是Mscomm控件的主要属性和方法:
1) CommPort:设置或返回串行端口号,其取值范围为1~99,缺省 为1(表示选取的串口是Com1)。
2) Setting设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位。如:Mscomm.Setting="9600,N,8,1"(表示串口端口的波特率是9600bps,奇偶校验位无,数据位8位,停止位1位)。
3) PortOpen:打开或关闭串行端口,格式为:Mscomm.PortOpen={TRUE|FALSE}(这是当上述串口初始化完成后必须设置打开串口)。
4) InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字 节。
5) InBufferC ount:返回接收缓冲区内的等待读取的字节个数,可通过设置该属性为0来清除接收缓冲区。
6) RThresho ld:该属性为一阀值,它确定当接收缓冲区内字节个数达到或超过该值后就产生代码为MSCOMM_EV_RECEIVE的OnComm事件 。
7) bbbbbLen: 设置或返回接收缓冲区内用bbbbb读入的个数。若取0,则bbbbb读取整个缓冲区的内容。
8) bbbbb: 该属性表示从接收缓冲区移走一串字符。
9) OutBufferSize:设置或返回发送缓冲区,缺省为512字节。
10) OutBufferC ounter:返回发送缓冲区内等待发送的字符数,可 用来清空缓冲区。
11) Output:向发送缓冲区传送一字符串。
12) EOFEnable:若置TRUE,则当输入中出现EOF,就停止输入并产 生OnComm事件。
如果在通信过程中发生错误或事件,就会引发OnComm事件并且改 变属性值,由CommEvent属性代码反映错误类型,在通信程序的设计中 可根据该属性值来执行不同的操作,以下是部分属性常数值及其含义:
1) ComEvSend: 其值为1,发送缓冲区的内容少于SThreshold指定 的值。
2) ComEvReceive: 其值为2,接收缓冲区内字符数达到 RThresho ld值,该事件在缓冲区中数据被移走前将持续产生。
3) ComEventFrame: 其值为1004,硬件检测到帧错误。
4) ComEventRxOver: 其值为1008,接收缓冲区溢出。
5) ComEventTxFull: 其值为1010,发送缓冲区溢出。
6) ComEventRxParity: 其值为1009,奇偶校验。
7) ComEvEOF: 其值为7,接收数据中出现文件结束(ASCII 码为 2 6)字符。
5.2用Mscomm控件实现串口通信时,添加Mscomm控件到窗体中,该控件一般不在通用工具窗口中,而是需通过菜单项"工程(P)→部 件(O)"进入选择窗口,在控件tab页中选取MicrosoftComm Control 6 .0 ,此时工具窗口中出现Mscomm图标,即可被使用。
以下是事件驱动方式的接收程序主要代码部分:
初始化串口程序
Mscomm1.Commport=1 ' 选择COM1
Mscomm1.Settings="9600,N,8,2" ' 设置通信参数
Mscomm1.bbbbblen=0 ' 读入接收缓冲区全部字符
Mscomm1.OutbufferSize=256 ' 设置发送缓冲区大小
Mscomm1.InbufferSize=512 ' 设置接收缓冲区大小
Mscomm1.PortOpen=True '打开COM1
软件与PLC进行数据采集发送命令程序编写也有规律可寻,比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有:
Dim Command, node, begin, number as bbbbbb
Dim Answerlen as integer
node="03" '节点号
Command="RR" '命令为读IR区
begin="0000" '从IR000开始
number=10 '读取长度
Answerlen=51 '计算接收字符串长度
进行命令发送和接收应答处理:
Dim FCS, I as integer
Dim s ,f as bbbbbb
s="@"+node+Commad+begin+number
FCS=0
For i=1 to Len(s)
FCS=FCS xor Asc(Mid$(s,i,1) ) '帧校验码FCS
Next i
f=Hex$(FCS)
If Len(f)=1 Then f="0"+f
Commfrm.MSComm1.Output=s + f + "*" + CHR$(13) '命令帧发送
Do
Dummy=DoEvents()
Loop Untill Commfrm.MSComm1.InbufferC ount >= Answerlen'等待应答帧
Do tag1= Commfrm.MSComm1.bbbbb
Loop Untill Commfrm.MSComm1.InbufferC ount=0 '读完应答帧
可以通过液位系统PLC的地址表,利用以上的类似程序进行数据的收发。
5.3在设计过程中,不同模块之间需要进行相互的通讯,就是所谓的“节点自身通讯”,节点自身的“通信”是一种形象的说法,严格说来应是VB应用程序利用DDE技术与本节点其它bbbbbbs应用程序进行数据交换。DDE(DynamicDataExchange)即动态数据交换,它是bbbbbbs支持的三种内部通信机制之一,是应用程序间通过共享内存进行进程间通信的一种形式。应用程序间进行数据交换称为“会话”(Conversation),申请会话端叫客户(Client),响应申请端叫服务器(Server)。一旦客户与服务器间建立起DDE所需的数据链路就可自动进行数据交换。
在监控系统开发中,工控软件以其功能强大、使用方便等特点得到广泛应用,但在处理复杂数据时其计算功能受到一定限制,而VB可以较好地弥补这一不足,并且还能承担数据采集、报表打印等功能。这就需要在VB应用程序与组态软件应用程序间进行动态数据交换。
VB中只有TextBox、PictureBox、Label和Form可以与其它应用程序进行动态数据交换,控件用于DDE的属性项有bbbbTopic(连接主题)、bbbbItem(连接项)、bbbbMode(连接模式)和bbbbTimeout(连接等待时间)。
以下为当遇到事件处理时的通用程序,flag为一静态变量记录读取次数,以便改变接收数据的长度,可根据实际需要添加其它处理内容:
Private Sub MSComm1_OnComm()
S elect Case MSComm1.CommEvent
Case comEvReceive
If flag > 246 Then
MSComm1.bbbbbLen = 0: MSComm1.RThreshold = 32
End If
buffer = MSComm1.bbbbb
temp = buffer
Print #hfile, temp
c ounter = Timer + 10
Do While Timer > c ounter
Do Events
Loop
flag = flag + 1
Case comEvEOF
Case comFrame
ERMsg$ = "帧出错!!!"
Case comRxParity
ERMsg$ = "奇偶错!!!"
End S elect
If Len(EVMsg$) Then
Text1.Text = "Status: " & EVMsg$
ElseIf Len(ERMsg$) Then
Text1.Text = "Status: " & ERMsg$
Beep
Ret = MsgBox(ERMsg$, 1, "Click Cancel to
quit, OK to ignore.")
MSComm1.PortOpen = False
End If
End Sub
5.4在程序设计过程中,无法直接将数据存入数据库,同样也无法直接将数据库中的数值发送到PLC或调用到图形显示中去,相应的解决办法是构造数组函数,把数据暂时放到构造的函数中,再利用VB中的OADB数据操作存入库中。在涉及MicrosoftJet数据库管理方面,数据的结构,它们之间的关系,读写的权限等要做到非常的熟悉是很困难的,要经常性的进行数据和程序代码的有效性检查和调试,以避免有错误的隐患。
6 调试运行
当程序编译调试结束后,就要对软件进行模拟实验环境下的调试和修改。目的就是要测试软件与PLC通讯是否正常,采样周期时间是否合理,数据库记录的添加、读取、修改是否正确,用户交互报表有无异常,记录查询是否合乎条件等等。
当程序在仿真环境下测试成功后,就需要到现场环境下进行后的测试。经过多次反复的测试和调整,软件工作情况良好。