西门子保定授权代理商
西门子保定授权代理商
在开发微机控制系统的过程中,我们经常需要通过RS-232串行接口与外部设备进行通信。例如分级控制系统中上位机与下位机的数据交换以及数据采集系统中计算机与数字仪表的通信等。在DOS时代,编写串行通信程序是一件相当复杂的工作,程序员需要具备相当的硬件知识,对可编程串行通信接口芯片的内部寄存器定义、工作方式、指令字等相关内容有所了解,才有可能着手编写程序,大量的时间和精力都花在了如何与硬件打交道上,而不是花在我们的主要目的——获取与处理数据上;在bbbbbbs下,Win32API提供了使用CreateFile/WriteFile等文件I/O函数进行串行口操作的方法,但是在实现上仍然是相当烦琐的。幸运的是,bbbbbbs平台先进的ActiveX技术使我们在对串行口编程时不再需要处理烦琐的细节。利用已有的ActiveX控件,我们只需要编写少量的代码,就可以轻松高效地完成任务。本文以bbbbbbs 98下用Visual C++6.0开发PT650C秤重显示器的通信模块为例,探讨了使用Microsoft Communications Control控件进行串行通信的方法。 |
1 ActiveX控件介绍 |
ActiveX是bbbbbbs下进行应用程序开发的崭新技术,它的核心内容是组件对象模型COM(Component bbbbbb Model)。ActiveX控件包括一系列的属性、方法和事件,使用ActiveX控件的应用程序和ActiveX控件之间的工作方式是客户/服务器方式,即应用程序通过ActiveX控件提供的接口来访问ActiveX控件的功能。 |
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化bbbbbbs下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。 |
1.1 事件驱动法 |
在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将解发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。这种方法的优点是程序响应及时,可靠性高。 |
1.2 查询法 |
这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。例如,当程序向串行设备发送了某个命令后,可能只是在等待收到一个特定的响应字符串,而不是对收到的每一个字符都立刻响应并处理。 |
MSComm控件有许多重要的属性,其中首要的几个如表1所示。 |
表1属性说明CommPort设置/获取控件对应的串行口Settings设置/获取波特率、校验方式、数据位、停止位PortOpen打开/关闭通信口bbbbb读取数据Output发送数据 |
2 编程实现 |
在使用MSComm控件开发PT650C秤重显示器通信程序时,采用了事件驱动法,主要是在comEvReceive(接收到数据)事件发生时响应并获取缓冲区中的数据。以下具体介绍实现方法。 |
打开Visual C++6.0集成开发环境,创建一个基于对话框的MFC应用程序项目,命名为MyCOM,记住在设置项目选项时必须选上ActiveX Controls,其他的按照缺省设置。完成这一步后,选择菜单项Project/Add to Project/Components and Controls……,将弹出一个对话框以选择系统中已有的组件(Components)和控件(Controls)。选择Registered ActiveX Controls文件夹下的Microsoft Communications Control项并按下Insert按钮,将MSComm控件支持加入到本项目中。这时将生成一个名为CMSComm的C++类,并且在对话框编辑器里的工具栏将出现MSComm控件图标。CMSComm类是由MSComm控件导出的一系列接口函数构成的,利用它将可以访问MSComm控件的属性(Property)和方法(bbbbbb)。 |
假设PT650C秤重显示器接在计算机COM1口上,那么打开资源编辑器,在程序主对话框(资源ID为IDD_MYCOM_DIALOG)上面放置一个MSComm控件,并用Class Wizard为该对话框类添加对应该控件的成员变量m_wnd COM1。由于PT650C秤重显示器与计算机进行串行通信时采用7个数据位、1个停止位、偶校验方式,并且波特率为2400/4800/9600可选,这里我采用9600波特率,在对话框编辑器中设置MSComm控件的属性如下: |
ID:IDC_COM1(资源ID)CommPort:1 (COM1)Settings:9600,e,7,1(波特率9600,偶校验,7个数据位,1个停止位)RThreshold:(每接收到1个字符就触发一个接收数据事件)SThreshold:0(不触发发送缓冲区空事件)bbbbbLen:1(每次读操作从缓冲区中取一个字符)[NextPage] |
其他选项按照缺省设置或者根据具体设备的要求进行设置。如果需要通过多个串行口与多台设备通信,那么每一个串行口对应于一个单独的MSComm控件。串行口的设置参数既可以在对话框编辑器里设定,也可以在程序代码中通过调用CMSComm类的成员函数设定。例如,我们可以在MyCOMDlg类的OnInitDialog成员函数中初始化MSComm控件的参数,代码如下: |
BOOL CMyCOMDlg::OnInitDialog(){CDialog:OnInitDialog();//以上为MFC框架自动生成的代码,在此不列出//TODO:Add extra initialization herem_wndCOM1.SetCommPort(1);m_wndCOM1.SetSettings("9600,e,7,1");m_wndCOM1.SetRThreshold(1);m_wndCOM1.SetSThreshold(0);m_wndCOM1.SetbbbbbLen(1);m_wndCOM1.SetPortOpen(TRUE);//打开通信口return TRUE;//return TRUE unless you set the focus to a control} |
接下来为程序主对话框建立响应MSComm事件的处理函数,每当MSComm控件触发事件时该函数将被调用。在对话框编辑器中用鼠标左键双击MSComm控件图标,在弹出的对话框中输入函数名OnCommCOM1,该事件处理函数的原型定义和消息映射入口将自动被添加到CMyCOMDlg类中,我们所要做的只是在OnCommCOM1函数中给出具体的数据处理程序段 |
也许每位自动化领域的同仁都有同感,在工程施工中,让我们头疼的是通信控制。通过对EMC理论的学习,我们可以解决这方面的问题。
我们往往会遇到这种情况,当我们完成一个工程项目,经过反复检测没有问题,可等到真正通电测试时,却出现各种各样的问题,不是仪表设备信号乱跳,就是找不到某个通信子站……我曾经遇到过两个类似的问题。其中一个是市政污水行业的plc通信问题,业主方为了节约运行成本,将提升泵站的5台工频提升泵的其中两台换成了变频泵,两台变频器、电磁流量计、分布式I/O子站与PLC主站之间均采用Profibus现场总线通信,项目前期调试阶段一切运行正常,但没过多久,甲方技术人员就联系我们说,变频器正常开启后,通信出现时断时续的症状,并且找不到后一个子站了,经过我们多名技术人员去现场反复测试,终于找到故障原因,原来是我们的施工人员在连接电磁流量计Profibus现场总线时,没有将总线电缆屏蔽层连接到流量计主板的屏蔽螺丝上,按照EMC电磁兼容规范正常连接后,故障消除;另外一个也是找不到通信子站问题。我到项目现场后,发现机柜内PS 307电源的PE保护接地端均悬空,也就是所谓的“浮地”,测量PE端子对机柜背板的交流电压,我们看到有60多伏的电压降出现,打电话咨询西门子技术人员了解到,西门子PS 307大承受电压降为40多伏,按照规范将PS 307保护地端子可靠接地,故障消除。类似以上的故障现象还有很多,这些大多是由于不规范地设计及施工造成的。由此可见,EMC电磁兼容理论在自动化控制领域占有很重要的地位。
要想了解EMC电磁兼容,先让我们引入两个概念:电磁骚扰和电磁干扰。电磁骚扰(EMD, ElectroMagnetic Distur-bance):任何可能引起装置、设备或系统性能降级或对有生命或无生命物质产生作用的电磁现象。电磁骚扰可能是电磁噪声、无用信号或传播媒介自身的变化;电磁干扰(EMI, Elec-troMagnetic Interference):是电磁骚扰引起的设备、传输通道或系统性能的下降。电磁干扰有三大因素:(1)电磁干扰源;(2)耦合路径(传输通道);(3)敏感设备。而电磁兼容(EMC, ElectroMagnetic Compatibility)一般指电气及电子设备在共同的电磁环境中能执行各自功能的共存状态,正常工作而互不干扰,达到“兼容”。在IEC的定义中,EMC是设备的一种能力,它在其电磁环境中能完成自身的功能而不致于在其环境中产生不允许的干扰。
为了实现自动化控制系统的内、外电磁兼容性,需要分别从技术和组织上来采取措施:首先,从技术上就是要分析电磁干扰三要素,抑制干扰源,减少不必要的发射;消除或减弱干扰耦合;增加敏感设备的抗干扰能力,削弱不必要的响应,如接地、屏蔽、滤波限幅等。另外,从组织上考虑,需要成立认证机构并制订相应的标准。
设备接地不是EMC的要求,而是出于安全考虑(防止电击)。这主要包括四个方面:(1)减小电位差,包括雷击电流产生的电位差;(2)允许自动断开的情况被检测到;(3)确定故障电流的路径(短路电流);(4)降低分布电容。这里需要注意的是,闭合电路总是存在电流的,这部分电流不是流入大地,而是流入源端。因此,如果接地点之间本身就存在电位差,则在这些接地点之间将形成地环流,不但不能避免干扰,反而更容易产生这些EMC问题。
下面我们来简单谈谈设备的接地问题,总的来说有三种基本的参考接地方法,即浮地、单点接地和多点接地。(1)浮地:采用浮地的目的是将设备或电路与公共地或可能引起环流的公共导体隔离开来,减少外来设备的共模干扰。浮地还可以使不同电位的电路间配合(通过光耦或变压器)变得容易。
图1 浮地接地方式
从图1中我们可以看出,低频时电容与电阻并联的阻抗大,近似开路,高频时电容与电阻并联的阻抗减小,共模电流I1/I2,流经ZL产生差模电压。
(2)单点接地:单点接地是在一个电路或设备中,只有一个物理点被定义为参考接地点,其他凡是需要接地的点都被连接到这一点上。如果在一个系统中包含有许多机柜,则每个机柜的“地”都是独立的(即机柜内的电路采用自己的单点接地),然后各机柜的“地”再被连到系统中唯一的参考点上。我们平时在自控仪表的工程项目中,仪表信号屏蔽电缆多数就是采用的这种单点接地方式。
单点接地又分为串联单点接地和并联单点接地。从噪声观点看,串联单点接地是差的接地方式,因任何导线都有电阻,流经导线的电流都会在导线上产生压降,造成相互间干扰。
串联单点接地 并联单点接地
图2 单点接地方式
图3 串联单点接地等效电路
图3中各接地点的电位是:
Va=(I1+I2+I3)R1;
Vb=(I2+I3)R2+(I1+I2+I3)R1;
Vc=I3R3+(I2+I3)R2+(I1+I2+I3)R1
对于地线电流大,而线径细的场合,三点电位将相差很多,高频阻抗将产生共阻抗干扰。因此,我们在进行自控系统设计时,在选用单点接地方式时尽可能采用并联单点接地方式外,还应考虑将参考点分开(数字量参考点、模拟量参考点、电源参考点),然后将它们连接到系统参考点。有可能的话,将系统参考点连接到现有的金属外壳(可以减小共振和天线效应)。
图4 单点接地系统原理图
单点接地方式大的优点就是简单,但它也有很大的缺陷:当系统工作频率很高,以致波长小到与系统接地线长度可以比拟时(如达到λ/4时),就不能再用单点接地了。此时,这根接地线就好像是一根天线,通过它向外辐射电磁波,影响周围设备和电路的工作,在这种情况下,我们应当转而采用多点接地。
(3)多点接地:多点接地是指设备(或系统)中凡是需要接地的点都是直接接到离它近的接地平面上(就近接地),以便使接地线的长度为短。这里所说的接地平面可以是设备的底板、专用接地母线、甚至是设备的框架。多点接地的这一特点使得它在高频场合下的应用有上佳表现(而单点接地在低频时的性能为好)。多点接地的形式看似比较简单,但对系统中的众多接地线的维护提出了更高的要求。因为任何接地点上的腐蚀、松动都会使接地系统出现高阻抗,从而使接地效果变差。目前我们常见的多点接地方式为等电位接地网,网格的宽度应尽可能小(15~50米),见下图5:
图5 等电位接地网
图6 多点接地系统原理图
EMC电磁兼容是一门相当复杂的技术知识,它不仅包含了我们以上提到的设备接地问题,还囊括了涉及多个学科的知识点,如高、低压变频器如何通过区分电场、磁场的概念来消除电磁干扰,等等,这都需要我们大家一同去学习和探讨,这里由于篇幅问题,不在赘述。另外,需要值得一提的是,自控系统的防雷及浪涌保护功能也属于EMC范畴,随着近期雷雨天气增多,设备的雷击损坏问题频现,这也需要引起大家的高度重视