组态王驱动开发
第三章 开发MCGS设备驱动 虽然MCGS提供了大多数常用设备的驱动程序,但在实际应用
中,或因为所用设备的特殊性、或因为实际工程的需要,MCGS所提供的设备驱动程序总会有
些不尽人意。为解决这些问题,MCGS提供了一...
第三章 开发MCGS设备驱动 虽然MCGS提供了大多数常用设备的驱动程序,但在实际应
用中,或因为所用设备的特殊性、或因为实际工程的需要,MCGS所提供的设备驱动程序总会
有些不尽人意。为解决这些问题,MCGS提供了一...
第三章 开发MCGS设备驱动 虽然MCGS提供了大多数常用设备的驱动程序,但在实际应
用中,或因为所用设备的特殊性、或因为实际工程的需要,MCGS所提供的设备驱动程序总会
有些不尽人意。为解决这些问题,MCGS提供了一套规范的设备驱动程序接口,允许用户根据
自己的需要来定制设备驱动程序。 在学习完本章之前,你可能会觉得开发设备驱动程序
是件难事,而编制能在Win95和WinNT下能同时运行的设备驱动程序更是不可思议。MCGS设备驱动的开发既不需用复杂的汇编语言,也不需用难懂的C语言,而只须使用简单易用、大
多数工程人员都会使用的Visual Basic。MCGS把和操作系统底层打交道的内容全部包装起来,
以函数调用的方式提供给你,同时,MCGS的高级开发向导能为你自动生成设备驱动程序的框
架,MCGS大多数设备驱动程序的源程序代码也都随系统提供给你。只要你会VB,熟悉你所使用的硬件设备,你就完全可以按照你自己的需要来开发定制你自己的设备驱动程序。 本章下面各节将详细介绍开发设备驱动程序的方法和步骤,请在开始之前,先安装Visual Basic6.0(中文专业版或企业版),然后安装MCGS高级开发工具包,建议你按下面各节介绍的
方法和步骤来一步一步地学习开发设备驱动程序。 3.1 设备驱动构件的实现方法 MCGS用Active DLL构件的方式来实现设备驱动程序,通过规范的OLE接口挂接到MCGS中,使其构成一个整体,所以MCGS把设备驱动程序叫做设备驱动构件。由于设备驱动构件和MCGS运行在同一个进程内,故设备构件的运行速度快,可靠性高,不存在传统DDE方式连接设备驱动时的数据流通不畅和数据传输速度慢等问题。同时,OLE是一个可扩充的开放标准,用
于实现不同软件之间的相互操作,而不管软件本身是使用什么编程语言。因此,只要遵守MCGS的接口规范,可以使用VB、VC、Delphi等语言来编制MCGS的设备驱动程序。鉴于Visual Basic通用性和简单性,建议使用VB来开发MCGS的设备驱动程序,本书也只讲解使用VB进行开发的技术问题。由于VB6.0以上版本是以二进制码来编译执行程序,其运行速度已接近或超过
VC,完全能满足设备驱动构件所需的速度要求。 MCGS把实际外部设备分为独立的设备、
父设备和子设备三类,独立的设备是可独立工作、完成特定数据输入输出功能的设备,如用
于模拟量输入输出、数字量输入输出的PC接口卡等;父设备是本身不直接处理数据输入输出,
但起到管理其它设备工作的设备,如串行口设备、IDCN-893的通讯卡等;子设备是本身具有
处理数据输入输出的功能,但只有和对应的父设备一起才构成完整工作系统的设备:如PLC设备、带智能通讯功能的仪器仪
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
等;不同类型的设备的工作方式有所不同,其对应的设备
驱动程序的处理方法也有所不同。本章只重点介绍独立设备(PC接口卡)和通讯类子设备设备驱动程序的开发,如需要进行父设备和其它类型子设备的设备驱动程序的开发,请和MCGS开发小组联系。 3.2 设备驱动构件接口规范 MCGS设备构件的实现方法和原理与标
准VB的ActiveDLL完全一致,但MCGS规定了一套接口规范,只有遵守这些接口规范的
ActiveDLL才能用作MCGS的设备驱动构件。MCGS设备驱动构件必须具有如下5个属性和8个方法: 属性:DevType 标识设备的类型 属性:DevStyle 标识设备的类别 属性:DevChannel 标识设备的通道个数 属性:DevBaseIO 标识设备所用IO的基地址 属性:DevIONumber 标识设备所用IO地址的个数 方法:GetDevName 读取设备构件类型名称 方法:GetDevHelp 调用设备构件的在线帮助内容 方法:SetDevPage 调用设备的内部属性页 方法:InitNewDev 初试化设备的初试值 方法:GetChlType 读取
设备构件各通道的数据类型和注释 方法:InitDevRun 运行时对设备进行初试化工作 方法:RunDevCommand 执行指定的设备命令 方法:CollectDevDat 定时操作设备,采集或输出数据 开发MCGS设备驱动的过程,实际上就是根据设备的特性
和含义来完成8个方法功能的编程过程。下面详细讲述各个接口的含义和用法: 属性接口:DevType 接口作用:本接口用于Mcgs确定设备构件的类型。对独立的设备构件固定
为0;对通讯子设备,固定为1。本属性为只读属性。 语法形式:Public Property Get DevType() As Long 属性接口:DevStyle 接口作用:本接口用于Mcgs确定设备构件的类别。对独立的设备构件固定为0;对通讯子设备,固定为1。本属性为只读属性。 语法形式:Public Property Get DevStyle() As Long 属性接口:DevChannel 接口作用:本接口用于Mcgs确定设备构件通道个数。一般把本属性设置为只读属性。 语法形式:Public Property Get DevChannel() As Long 属性接口:DevIONumber 接口作用:本接口用于Mcgs确定设备构件所用IO地址的个数。本属性为只读属性 语法形式:Public Property Get DevIONumber() As Long 属性接口:DevBaseIO 接口作用:本接口用于
Mcgs确定设备构件所用IO基地址。本属性为读写属性,在设备属性页中以16进制数表示 语法形式:Public DevBaseIO As Long或Public Property Get DevBaseIO() As Long 注意:对不占用IO地址的设备,把本属性设置为只读属性,且属性值为0。 方法接口:GetDevName 接口作用:本接口在组态环境装载时被MCGS组态环境调用,返回设备构件对
应的设备类型名称,比如“Omron 200 PLC”等。MCGS组态软件将把这个名称显示在设备工
具框中。对于不同的设备,应该返回不同的设备类型名称。 语法形式:GetDevName() as string 返 回 值:设备类型名称。 参数说明:无。 方法接口:InitNewDev 接口作用:当用户在组态环境的设备组态新增加一个设备时调用本接口,用于初始化新设备的
缺省参数值。 语法形式:InitNewDev(SavObj As Object) as Long 返 回 值:=0:设备初始化成功,<>0:设备初始化失败。 参数说明:SavObj ,存盘服务对象,接口程
序中通过该对象来保存和读取数据。 方法接口:SetDevPage 接口作用:本接口在组
态环境中当用户要修改设备的内部属性时被调用,他将打开设置设备构件内部属性的对话框,
并设置设备构件的属性。 语法形式:SetDevPage(SavObj as Object) as Long 返 回 值:=0:属性设置有效,要保存,=1:属性设置无效,不保存。 参数说明:SavObj ,存盘服务对象,接口程序中通过该对象来保存和读取数据。 方法接口:GetChlType 接口作用:本接口在组态环境中调用,读取设备通道的数据类型及通道内容说明当用户要修改
设备的内部属性时被调用,他将打开设置设备构件内部属性的对话框,并设置设备构件的属
性。 语法形式:GetChlType(Dat As Variant, msg As Variant) As Long 返 回 值:=0:设备通道有效,=1:设备通道无效。 参数说明:Dat ,长整型数组,标识设备各通
道的数据类型和输入输出类型。=1开关型;=2数值型;=3字符型;大于0表示把设备通道的数据采集到MCGS中,小于0表示把MCGS中的数据输出到设备构件中; msg,字符型数组,标识各设备通道内容注释。 方法接口:InitDevRun 接口作用:本接口在MCGS运行环境启动设备构件开始采集之前被调用一次,用于对设备硬件进行初始化工作。 语法形式:InitDevRun(SavObj As Object, DatObj As Object) as long 返 回 值:=0:设备工作正常, =1:设备工作不正常,MCGS运行环境将弹出对话框,提示用户设备出错。 参数说明:SavObj ,存盘服务对象,接口程序中通过该对象来保存和读取数据。 DataObj,实时数据库对象,接口程序中通过该对象来操作实时数据库对象的属性和方法。 方法接口:CollectDevDat 接口作用:本接口由MCGS运行环境在每一次设备采集中调用,运行
时,按设定的时间周期定时调用本方法采集数据,并送入实时数据库,或把实时数据库中的
数据送进来,供设备驱动构件处理。 语法形式:CollectDevDat(DatF As Variant, Dat As
Variant, msg As Variant) as long 返 回 值:= -1:设备故障; =0:采集数据有
效,但只对返回的输入数据进行处理; =1:采集数据有效,但对返回的输入输出数据都
进行处理; =2:采集数据无效,不须进行处理。 参数说明:DatF, 长整型数组, 标明对应设备通道有效,=0无效,=1有效; Dat, 浮点数组, 存放设备通道的数值型或开
关型数据; Msg, 字符数组, 存放设备通道的字符型或事件型数据。 方法接口:RunDevCommand 接口作用:本接口在Mcgs运行环境中,当在设备策略构件、用户脚本程
序或OLE Automation调用中要求执行特定的设备命令时,被调用。 语法形式:RunDevCommand(DatObj As Object, ByVal Cmd As String) as Long 返 回 值:=0:命令正确执行,Mcgs将对返回的输入输出数据进行处理; =1:命令执行错误,Mcgs不对返回的输入输出数据进行处理; =2:无效的设备命令,Mcgs不对返回的输入输出数据进行
处理。 参数说明:DataObj,实时数据库对象,接口程序中通过该对象来操作实时数据库
对象的属性和方法; Cmd, 字符型, 下达给设备的设备命令字符串。 3.3 利用开发向导生成框架 MCGS提供了一个高级开发工具包,能快速为用户生成设备驱动构件的源程
序框架,在此基础上编程既快速,又可减少出错的可能性。请按如下的步骤来生成设备驱动
构件的框架: 确保MCGS的高级开发工具包已安装正确; 启动Visual Basic6.0(中文专业版或企业版); 选择“外接程序”菜单,单击该菜单下的MCGS开发向导菜单项;弹出开发向导窗口后,按“下一步”按钮,弹出如下图所示窗口: 选择扩展构件的类型为设备驱动构件,且设置设备驱动构件为独立设备;按“下一步”按钮,弹出如下图所
示的窗口: 设置构件工程名为“MyDev”,构件类型名为“我的设备构件”。构件工
程名为设备构件在VB下源程序的工程名,编译生成的Active DLL构件的名称为MyDev.DLL。构件类型名用于标识对应的构件,最后可显示在MCGS的设备工具箱中。 按“下一步”按钮,出现如下图所示的窗口,设置生成
目录
工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录
和输出目录都为“D:\Dev”,使开发向导自动生成
的源程序和编译生成的构件都位于同一目录下。在一此按“下一步”按钮,然后按“完成”
按钮,MCGS即开始自动生成设备驱动构件的源程序框架。 开发向导完成工作后,
自动生成一个名位“MyDev”的工程组,如下图所示,在VB的工程组窗口中可以看到该工程
组包含如下二个VB工程: MyDev工程对应于设备驱动构件,该工程包含一个类模块和一
个程序模块。类模块DevObj完成了设备构件所需的所有接口。 TestDev工程只用于在VB环境下对设备构件进行调试,该工程包含两个窗体和两个程序模块,在实际编程时,无需对
该工程进行任何修改工作。 MCGS开发向导生成的所有源程序代码和编译生成的输
出文件都放在D:\Dev目录下。程序模块DevBas是包含一些和硬件设备操作相关的常量、数
据结构的定义和外部子程序的定义。 注意:MCGS开发向导生成的只是设备驱动构件的源
程序框架,没有任何具体的功能,要完成特定的设备驱动,还需要在此基础上,针对具体设
备的功能进行进一步的编程和调试工作。通讯子设备驱动构件程序框架的自动生成方法和上
述步骤相同。 3.4 利用样例程序移植 MCGS把大多数设备驱动构件的源程序代码都
随系统一起提供,在实际应用中,开发定制自己的设备驱动程序的最好方法就是在MCGS提供的源程序代码的基础上进行。由于OLE技术本身的复杂性,建议按照本节给定的方法和步骤
来进行你的开发工作,避免产生不可预料的错误。如果你能严格按照本节的步骤进行开发工
作,则你可以省去对Active DLL编程技术及有关概念的学习和了解,直接集中精力实现设备
构件的功能。 从MCGS高级开发工具包中找到你所需要的样例源程序代码,假定安装高级
开发工具包时所选的安装目录为D:\Mcgssdk,则对应的源程序位于目录
D:\Mcgssdk\samples\Device下,而且按设备的名称来命名对应的目录,如:中泰PC6319接口卡对应的设备驱动程序源代码的目录为ZTPC6319,欧姆龙PLC对应的设备驱动程序源代码
的目录为OmronPLC。为方便说明,下面各步骤中假定选取中泰PC6319接口卡的设备驱动程序为样例程序。 建立一个新目录:D:\MyDev,把ZTPC6319目录内的所有内容拷贝到
D:\MyDev目录下。新的设备驱动构件的源程序将位于本目录下。 启动Visual Basic6.0,
打开工程组该文件(本例中为TestDev.vbg)。如下图所示,在VB工程组窗口中,包含有二
个工程:DevZT6319、 TestDev。 先在工程组窗口中选中工程DevZT6319(被选中工程下面显示蓝条),用鼠标右键弹出下拉菜单或从“工程”菜单中,单击“DevZT6319属性”,打开该工程的属性窗口,如下图所示,把“通用”和“生成”两个属性页中的DevZT6319改为MyDev(修改工程名称)。 在“部件”属性页中,把“版本兼容”中的选项设置
成“不兼容”。修改完成后,按“确认”按钮返回。注意:对工程属性页中的其它属性不要做
任何修改。 在VB的“文件”菜单中,单击“ZT6319.vbp另存为”菜单,把工程另
存为MyDev.vbp。在VB的“文件”菜单中,单击“生成ZT6319.dll”菜单,弹出“生成工程”
窗口,对工程继续编译,把要生成的文件名改为“MyDev.dll”,按“确定”按钮开始编译。 编译完成后,打开工程MyDev的属性窗口,如下图所示,在“部件”属性页中,把“版本兼
容”中的选项设置成“二进制兼容”,同时把其下面的输入框中的内容由ZT6319R.dll改为MyDev.dll。按“确认”按钮返回 打开类模块DevSetObj的编程窗口,对接口GetDevName进行如下修改: GetDevName = “我自己的设备构件“ 选中工程TestDev,在VB“工程“菜单中,单击“引用”菜单项,把工程TestDev对于DevZT6319的引用取消,改为对工程MyDev的引用。 上述步骤完成后,把整个工程组存盘,就完成了开始移植前所有
必须的准备工作。接下来,你就可以在源程序的基础上进行修改,实现你自己特定功能的设
备构件。 对通讯子设备,如欧姆龙PLC对应的设备驱动程序进行移植时,基本方法和步
骤上面所述相同。 3.5 测试和挂接设备驱动构件 MCGS为设备驱动构件提供了一套
在VB环境下进行在线调试的运行机制,使用户能随时对所做的修改进行测试调试、检验其正
确性,其简单程度和方便性是其它组态软件系统使用汇编或C语言编制设备驱动通过DDE挂接设备驱动的方式所无法比拟的。MCGS的这一机制,使得大多数普通工程用户都能动手编制
自己的设备驱动程序。 使用MCGS开发向导生成的程序框架或系统提供的样例源代码中,
都包含有一个用于在VB下进行测试的工程--TestDev,通过该工程模拟MCGS的工作状态,直接调用设备驱动构件的接口函数,从而做到对构件的每个接口函数在VB源代码一级进行测试,实际应用中不要对该工程进行任何修改工作。 下面详细介绍测试和挂接设备驱动构件的
方法和步骤: 按照前节所讲述的步骤,用开发向导生成一个设备驱动构件的框架,生成
的源程序所在目录为--D:\Dev,构件工程名为--MyDev,构件的类型名为--我的设备构件。完成自动生成后,在VB的工程组窗口中会看到二个工程:MyDev和TestDev。 启动MCGS的组态环境,并打开或新建一个MCGS工程。注意:进行在线调试时,必须启动MCGS,且要保证MCGS中有一个打开的工程,否则,在VB中无法进行在线调式。 在VB环境下,按F5键运行工程组,出现如下图所示的设备调试窗口,该窗口中的两个按钮分别用于调用组态
环境的接口和运行环境的接口;中间的输入框用来显示设备构件的类型名称。 按“设备构件组态环境接口测试”按钮,中间输入框中将显示“我的设备构件”,同时弹出如下图所
示的设备属性设置窗口。由于开发向导只是生成构件的框架,在设备属性设置窗口中,只有
设备IO端口基地址属性和设备在线帮助及内部属性接口,设备构件所需的其它属性,,等待
你自己进一步编程实现。 对构件的组态环境部分不断进行修改,同时按照上面的步
骤不断运行,对所编制的程序进行测试,直到完成所有工作和没有错误产生为止。 在设备测试窗口中,按“设备构件组态环境接口测试”按钮,弹出如下图所示的接口测试窗口。
由于开发向导只是生成构件的框架,运行时的接口都是空的,等待你自己进一步编程实现。
在该窗口中,按不同的按钮可对不同接口进行测试,直到完成所有工作和没有错误产生为止。 完成所有的编程调试工作以后,把工程MyDev重新编译一遍,生成最后可以使用的dll文件:MyDev.dll,把这个文件拷贝到D:\MCGS\Program\Driver目录下(假定MCGS系统安装时的目录为D:\Mcgs,拷贝时先退出MCGS系统)。完成上述步骤后,就完成了用户定制设备驱动构
件的编制、调试和挂接工作,下面介绍如何在MCGS系统下使用定制的设备驱动构件。 启
动MCGS组态环境,在工作台中打开设备组态窗口。开始时,设备工具箱内没有定制的设备驱
动构件,按设备工具箱内的“设备管理”按钮,弹出设备管理窗口,再按“浏览”按钮,在
D:\MCGS\Program\Driver目录下找到MyDev.dll文件,把其装入到设备管理窗口,如下图所
示,“我的设备构件”一项将会出现在设备构件列表中,选中该设备构件项(方框内显示ü表
示选中),按“确认”按钮返回,“我的设备构件”将会显示在设备工具箱内,将其选到设备
组态窗口内,就可在MCGS系统中对其进行操作。 3.6 IO端口的操作 编写接口卡的设备驱动程序时,经常要用到对计算机硬件的IO端口进行读和写的操作。在以前的
DOS或Windows3.1等16操作系统以及在Win95操作系统下,可以在程序中直接使用对应的
函数进行操作。而WinNT操作系统下,IO端口作为系统的资源,由操作系统管理,对IO端口进行读和写的操作之前要进行登记工作,用户熟悉的IO端口读写函数也不能使用。 为使用户能编制出Win95和WinNT下通用的设备驱动程序,MCGS把和底层IO打交道的部分包装起来,自动完成登记工作,同时提供一组用于端口读写外部函数来实现端口的读写工作,
保证存它们在Win95和WinNT环境下都能正常工作,你所需要做的就是使用和DOS下基本相同的函数和方法来完成对IO端口的操作。设备驱动构件中处理端口操作的具体步骤如下: 使用OpenPort函数取到操作端口所需的句柄Handle。 利用上一步得到的句柄Handle作为参数,调用函数Inp、InpW、Outp、OutpW对端口进行读写操作。 操作完成后,调用ClosePort函数进行关闭清理工作。 在实际应用中,一般在设备构件中定义一个全局的
变量mHandle,在设备构件的方法接口InitDevRun中调用一次OpenPort函数,把取到的端口操作句柄保存在该变量中,对端口进行读写的函数直接使用mHandle作为参数;最后,当退出系统时,在Class_Terminate函数中使用ClosePort函数进行关闭清理工作。 函数:OpenPort 函数意义:用于设备驱动构件中,把打开要操作的IO端口,并取回端口的句柄。 语法形式:Public Declare Function OpenPort Lib “mcgsext.dll“ (Handle As Long) As Long 返 回 值:=0,打开端口成功;<>0,打开端口失败。 参数说明:Handle, 取回的端口句柄。 函数:ClosePort 函数意义:用于设备驱动构件中,当端口操作完成,
关闭对应的IO端口,如不进行关闭清理工作,则下次不能正常工作。 语法形式:Public Declare Function ClosePort Lib “mcgsext.dll“ (ByVal Handle As Long) As Long 返 回 值:=0,关闭端口成功;<>0,关闭端口成功失败。 参数说明:Handle, IO端口的句柄。 函数:Inp 函数意义:用于设备驱动构件中,从IO端口中读取一个字节的数据
(8位)。 语法形式:Public Declare Function Inp Lib “mcgsext.dll“ (ByVal Handle As Long, ByVal PortAddress As Long) As Long 返 回 值:<0,读端口错误;>=0,从端口读回的数据。 参数说明:Handle, IO端口的句柄; PortAddress, IO端口地址。 函数:InpW 函数意义:用于设备驱动构件中,从IO端口中读取两个字节的数据(16位)。 语法形式:Public Declare Function InpW Lib “mcgsext.dll“ (ByVal Handle As Long,
ByVal PortAddress As Long) As Long 返 回 值:<0,读端口错误;>=0,从端口读回的数据。 参数说明:Handle, IO端口的句柄; PortAddress, IO端口地址。 函数:Outp 函数意义:用于设备驱动构件中,把一个字节的数据(8位)写到IO端口中。 语法形式:Public Declare Function Outp Lib “mcgsext.dll“ (ByVal Handle As Long, ByVal
PortAddress As Long, ByVal Value As Long) As Long 返 回 值:=0,写IO端口成功;<>0,写IO端口失败。 参数说明:Handle, IO端口的句柄; PortAddress, IO端口地址。 Value,要写到IO端口中的数据。 函数:OutpW 函数意义:用于设备驱动
构件中,把两个字节的数据(16位)写到IO端口中。 语法形式:Public Declare Function
OutpW Lib “mcgsext.dll“ (ByVal Handle As Long, ByVal PortAddress As Long, ByVal
Value As Long) As Long 返 回 值:=0,写IO端口成功;<>0,写IO端口失败。 参数说明:Handle, IO端口的句柄; PortAddress, IO端口地址。 Value,要写到IO
端口中的数据。 3.7 串行口的操作 编写通讯子设备驱动程序时,主要使用的就是对
串行端口进行操作。MCGS根据驱动程序的实现特点,充分运用32操作系统多任务多线程的
优势,把复杂的对串行端口的设置、初始化和读写操作全部封装在MCGS提供的串行通讯父设备中,在通讯子设备驱动程序中只需调用父设备提供的标准串口读写函数,即可完成各种功
能通讯子设备驱动程序的开发编程工作。 由于在MCGS中,每个设备构件都独立地运行在
自己的线程内,当设备构件等待下位机的返回信息时,它会把自己“挂”起来,处于不占用
CPU资源的睡眠状态,不用担心在等待过程中会影响系统其他部分的运行。 串行通讯父设备提供的读写串行端口函数的使用方法如下所述: 函数:ComOutDat 函数意义:把数据写到串行端口输出到通讯设备。 语法形式:Function ComOutDat(ByVal OutNum As
Long, OutByte() As Byte) As Long 返 回 值:=0,成功;<>0,失败。 参数说明:OutNum,长整型,要从串行口输出的字节数; OutByte,字节数组,要从串行口输出的信
息; 函数:ComInDat 函数意义:从串行端口中读取数据。 语法形式:Function ComInDat(InByte() As Byte, ByVal InputFlag As Long, ByVal InputNum As Long, ByVal
InputChar As Long, ByVal DelayTime As Long) As Long 返 回 值:>0,从端口实际读回数据的字节数;<=0,没有数据或通讯出错。 参数说明:InputByte,字节数组,从串行口读取的信息; InputFlag ,长整型,从串口读取信息的方式; InputNum,长整型,要读回信息的字节数; InputChar,长整型,要读回信息最后一个字符的ASCII码; DelayTime,长整型,读等待延时时间,单位ms。 本函数的工作特性和InputFlag的值密切相关: InputFlag = 0:等待返回信息,直到接收到ASCII值等于InputChar的字符为止(如等待时间超过DelayTime设置的延时时间,返回)。 InputFlag = 1:等待返回信息,直到接收到的信息的长度等于InputNum为止(如等待时间超过DelayTime设置的延时时间,返回)。 InputFlag = 2:发送完信息后,等待DelayTime设置的时间(ms),然后从串行口读取数据返回。 InputFlag = 3:等待返回信息,直到接收到ASCII值等于InputChar的字符或接收到的信息的长度等于InputNum为止(如等待时间超过DelayTime设置的延时时间,返回)。 3.8 设备驱动构件的运行机制 MCGS把设备驱动程序实现成
Active DLL构件,通过调用构件的不同接口来完成设备驱动所需的功能,下面详细讲解MCGS是如何来操作构件各接口、按什么样的顺序来操作: 在MCGS要操作一个设备,必须首先
确保对应设备已被选入设备工具箱。在设备管理窗口中,打勾的设备将被选入设备工具箱。
通过“浏览”按钮,选中设备驱动构件对应的Active DLL文件,MCGS将首先检查该构件是否满足接口要求,同时调用设备构件的GetDevName接口,返回设备构件的类型名称,该类型
名称最后显示在设备工具箱中,用于标识对应的设备构件。 从工具箱中把需要使用的设
备构件选入到MCGS的设备窗口中,此时,MCGS依次调用InitNewDev接口,对设备的属性进行初始化设置;读取DevType属性,确定设备的类型(=0父设备,=1子设备);读取DevStyle属性,确定设备的类别(=0独立设备,=1通讯子设备)。 打开设备属性窗口,设置设备
的属性。在属性窗口的基本属性页中,MCGS把构件的所有读写属性列在该页中,供用户修改。
当用户按设备在线帮助对应的按钮时,MCGS调用GetDevHelp接口,以显示设备构件的在线
帮助;按设备内部属性对应的按钮时,MCGS调用SetDevPage接口,以显示设备构件的特定
属性页。(如对应的接口为空,则不执行任何功能)。MCGS调用GetChlType接口,读取设备通道的信息,显示在通道连接属性页中。 当切换到设备调试属性页中,MCGS定时调用CollectDevDat接口,把采集进来的数据显示在窗口中。 在MCGS运行环境中,首先调用一次InitDevRun接口,以便对设备进行一些必须的初试化工作。 在运行的过程中,MCGS按设定的采集周期,调用CollectDevDat接口,从设备采集或向设备输出数据。 运行时,当用户在脚本程序中调用!SetDevice函数或在运行策略中调用设备操作功能构件时,MCGS调用RunDevCommand接口,以执行设备的特定功能。 3.9 增加设备构件的属性 在设
备属性窗口的基本属性页中,前6行是每个设备构件都必须的公共属性,由MCGS负责管理,设备构件可根据设备功能的需要,来增加构件的属性,以便用户能在设备属性中对设备的属
性进行组态设置。 增加设备构件的属性的方法就是增加Active DLL的属性,请参考Visual Basic中关于这部分的说明。设备属性页中,只显示可读写的属性,只读属性不被显
示在属性页中。 在MCGS设备接口中,属性DevType、DevStyle、DevIONumber为只读属性,用户在组态时不能修改。属性DevBaseIO可设置为读写属性,也可设置为只读属性(对
不需要IO端口地址的设备,如通讯子设备,设为只读)。 定义一个读写属性方法有两种,
一是在类模块DevObj.cls的定义部分,用Public定义属性,如Public DevBaseIO as Long;一是在VB的“工具”菜单中,选取“添加过程„”菜单项,在弹出的对话框中输入属性名,
并把选取“属性”选项和“公有的”选项,完成后则在类模块DevObj.cls中生成如下代码: Public Property Get DevBaseIO() As Long End Property Public Property
Let DevBaseIO(ByVal vNewValue As Long) End Property 在上述代码中,如只保留前一部分,则表示该属性为只读。在通讯子设备中,用于属性DevBaseIO无用,不需要在设备属性页中进行设置,故把其实现为只读属性: Public Property Get DevBaseIO()
As Long DevBaseIO = 0 End Property 用Property Get和Property Let的方法实现读写属性的目的,是为了在属性值的改变过程中,能对其进行必要的处理;如不需对
属性进行处理,则可直接用Public来定义属性。例如:某设备有个属性ProTTT,其值只能在0和100之间有效,为防止用户在组态时的误操作,应按如下方法来定义ProTTT属性 Dim mProTTT as Long Public Property Get ProTTT() As Long ProTTT=
mProTTT End Property Public Property Let ProTTT(ByVal vNewValue As Long)
if vNewValue>=0 and vNewValue<=100 then mProTTT= vNewValue End Property 在设备属性页中,用户组态设置设备属性值有两种方法:一种是在输入框中直接输入属性的值;
一种是弹出下拉框,选中属性的值。如对PC6319模拟量输入采集板,一般要允许用户组态时
能对输入量程进行修改,故定义有输入量程属性InputRange: Public Enum dInputRange
d0_10V = 0 d?5V = 1 d?10V = 2 End Enum Public InputRange as
dInputRange 注意:在定义枚举类型时,字符串的前面加一个字符d,MCGS装载属性时,自动把字符“d”去掉,同时把“_”转换成“~”、把“点”转换成“.”、把“负”转换成“-”;因为枚举类型的字符串中不能出现“~”、“.”、“-”等字符,故为了显示直观,在构件中定义
枚举字符串时,应做相应的转换工作。 在编制设备构件时,为了简便,一般都用字母来
拼写设备的属性值,而在设备属性页中,最好能用汉字表示属性的内容,以便用户理解,因
此,MCGS使用属性的注释显示在设备属性页的左边,只有在没有注释时,才直接显示属性的
名称。 设置设备属性内容注释的具体操作步骤如下: 打开类模块DevObj.cls,使其成为当前激活窗口; 在VB“工具”菜单中,选取“过程属性„”菜单项,弹出如下窗口; 在名称下拉框中找到InputRange属性; 在描述编辑框中输入属性的内容注释。
请问各位呀!MCGS 6.2通用版连接ABB ACS600变频器,用MODBUS RTU通讯连接,读数据反映很慢怎么解决啊?数据最小采集周期设定200ms 异步采集,通讯速度 9600 还有怎么不能用19200啊?用19200就通讯不起来
TOP