目录
•1..............简介
•1.1...........目标
•2............. pvicom.dll编程
•2.1...........PVI安装文件
•2.2...........对PVI编程的要求
•2.2.1........Automation Studio项目
•2.2.2........Visual Studio编程环境
•3..............PVI客户端应用程序
•3.1...........PVICOM功能
•3.2...........建立与PVI管理器的连接
•3.3...........设置过程对象
•3.3.1........设置临时流程对象
•3.3.2........设置静态进程对象
•3.3.3.........创建一个链接对象
•3.3.4.........删除一个链接对象
•3.4............评估响应数据
•3.4.1.........关于评估响应数据的一般信息
•3.4.2.........没有数据的回调
•3.4.3.........带数据的回调
•3.5............读和写访问
•3.5.1.........写入一个值
•3.5.2.........改变事件掩码
•3.5.3.........读取控制器的时间
•4................总结
•
本培训模块介绍了如何使用PVI功能对PVICOM.DLL进行编程,以创建一个Windows可视化或服务工具。
使用Visual Basic 6.0来描述PVICOM.DLL的功能和进程,因为大多数的应用程序都是用这种编程语言创建的。
对于在Visual Studio.NET开发环境中创建的应用程序,推荐使用培训模块 "TM712 PVIServices"。
Fig. 1: PVI DLL programming
练习实例将帮助学员创建PVI客户端应用程序。
学员将了解PVI功能的应用和可能性。
PVI用户文档将提供有关PVI客户端应用可能性的更深入知识。
Fig. 2: Overview
PVICOM接口被所有基于Windows的具有PVI访问权限的应用程序所使用。
就性能而言,这是最理想的PVI接口。
Fig. 3: PVI Client programming
通过PVICOM接口的通信是由PVI通信库 "PviCom.dll "中的功能来处理的。
PVI通信库是一个基于Windows标准的DLL(动态链接库)。如果应用程序使用DLL的功能,那么DLL必须明确地加载功能,或将静态库 "PviCom.lib "捆绑到程序中(隐式加载)。
该程序可以在各自的编程语言手册中找到。
支持以下开发环境。
▪Visual C++ (Version 6.0 and up)
▪Visual Basic (Version 6.0 and up)
▪Borland C++ Builder (Version 3 and up)
▪Borland Delphi (Version 4 and up)
安装完PVICOM后,各编程语言的PVICOM定义文件被安装在以下目录中 PVI Server & Runtime / Development Package:
PVI Server&Runtime Setup:
BrAutomation\Pvi\Inc BrAutomation\Pvi\Lib
PVI Development Setup:
Program Files\BrAutomation\Pvi\%Version%\Pvi\Inc Program Files\BrAutomation\Pvi\%Version%\Pvi\Lib
PVICOM定义文件包含所有PVICOM接口函数、类型、使用的结构和PVI常量的定义和/或声明。
File |
描述 |
PviCom.lib |
用于Visual C的静态库 |
PviCom.h |
Visual C的定义文件(包含文件)。 |
PviCom.bas |
用于Visual Basic的定义文件(模块)。 |
PviCom.pas |
DELPHI的定义文件(包括文件)。 |
安装PVI软件包时,通信库 "PviCom.dll"被安装在以下目录中。
Windows\System32
AR000用于与控制器通信。用于此的变量和相应的数据类型在本培训模块中有记录。
Automation Studio必须用于一个用户任务,其中使用了一些变量。这些变量在与本培训模块一起创建的PVI客户端应用程序中被读取和写入。
也可以使用现有的Automation Studio项目,但本培训模块中的变量名称必须相应替换。
第一步需要一个带有变量"Lifesign"和 "PV1"的任务 "pvitest"。
Fig. 4: Automation Studio test project
本培训模块中描述的所有功能都是使用Visual Basic 6.0程序代码进行解释。
所有的PVI功能在PVI用户文档中使用Visual C++程序代码进行描述。
此外,为Visual Basic、Visual C++、Borland Delphi和Borland C程序员编写的教程也在PVI服务器和运行时/开发安装过程中放在".../Pvi/Tutorial "目录下。教程中的步骤在PVI用户文档中有所描述。
本章将逐步创建一个小型的PVI客户端应用程序。练习和任务将被用来描述大部分PVI功能及其应用。
本练习实例将涵盖哪些内容。
▪PVICOM功能
▪建立与PVI管理器的连接
▪设置具有同步/异步功能的过程对象
▪评估响应数据
▪读和写功能
第一步,定义文件 "PVICOM.BAS"将被添加到新创建的项目中。现在就可以使用PVI函数了。
练习。将文件PVICOM.BAS插入到新创建的VB项目中。 从目录中选择模块 "...\Pvi\Inc\PviCom.bas". |
Fig. 5: Adding the PVICOM.BAS module
从 "添加模块 "对话框中选择一个现有模块
Fig. 6: Add Module – Add existing module.
注意:
插入模块后只创建一个文件的引用。如果项目目录被改变(例如,将项目传给其他人),该引用将不再起作用。在这种情况下,建议将该模块复制到VB项目目录。
PVICOM.BAS模块现在显示在项目资源管理器中。
Fig. 7: Project explorer – PviCom.bas
所有 PVICOM 常量、结构 和 函数描述都包含在这个模块中.
注意。
用户不允许对该模块做任何修改。
这些功能的描述可以在PVI用户文档中找到。
Fig. 8: PVICOM Help
正如你在第一个函数中已经看到的,对于同一任务,总有一个Pvi...和PviX...函数。
Pvi...函数对于一个简单的PVI客户端应用来说是足够的。然而,如果应用程序将访问分布式网络上的多个服务器PC,则必须使用PviX...函数。
本培训模块只使用Pvi...函数。
与PVI管理器的连接是通过 "PviInitialize"函数建立的。
练习一下:建立并取消与PviManager的连接。 PviInitialize()"函数及其参数被用于表单的 "Load"事件中。PviDeinitialize()"函数在"Unload"事件中被调用。 |
该函数的参数可以在PVI用户文档中找到。
这个例子显示了PVI应用程序和PVI管理器之间的本地通信。使用参数 PN 和 IP 与参数 "InitParameter"进行远程连接的传输 。
InitParameter = "LM=0 PT=0 PN=20000 IP=HostName"
请注意。
应该始终使用 "PviDeinitialize "函数。在这一点上,应用程序和PVI管理器之间的通信被取消了。如果不调用这个函数,应用程序可能会崩溃,因为累积的回调不能再被处理。
结果: 在启动应用程序后,PVI管理器被启动 。然后可以在已经存在的PVI对象上创建或访问PVI对象。 如果PVI管理器已经在运行,那么应用程序就在PVI管理器上注册--PVI管理器检测到一个新的客户。现有的PVI对象(静态)可以被访问。 |
一旦应用程序与PVI管理器建立了连接,就可以根据PVI对象的层次结构将过程对象放在一起。
在这样做的时候,你应该在创建对象之前确定这些对象将被设置为静态的还是临时的(见TM710或PVI用户文档)。
使用的功能:
▪PviCreate / PviCreateRequest
▪PviLink / PviLinkRequest
在设置临时进程对象时,进程对象的创建包括链接对象(创建+链接)。当断开链接对象(unlink)或终止PVICOM应用程序时,临时进程对象也会再次断开连接(即在PVI管理器中删除)。
练习:用同步的PVI函数创建临时过程对象。 所有过程对象,包括变量对象,都被设置好了,"Lifesign "变量的响应数据(也见3.4)被显示在一个文本框中。 |
创建进程对象的步骤。
•添加一个名为 "myPviFunc"的模块,用于创建全局变量和评估数据的回调函数。
•在表单中放置一个按钮,名称为 "cmdCreateTempSync"。
•放置一个文本框,名称为 "txtLifesign"。
•在 模块 "myPviFunc"中创建 回调函数。
必须在 "myPviFunc"模块中为每个PVI对象设置一个 变量。这些变量对于返回PVI对象的句柄(引用)是必需的。这个句柄可用于在运行期间对PVI对象的读或写访问。
下面的代码被输入到按钮的 "点击 "事件中。
设置程序的描述。
•为对象名称(路径名称)、连接描述和链接对象创建变量。
•这些变量被设置为各自流程对象的路径名称和连接描述。链接对象不需要为行对象预设。
•调用同步函数 "PviCreate"。
•全局变量 "hLine "作为句柄被转移,对象类型为 "POBJ_LINE"。
•通过用 "AddressOf PviCallback"指定回调函数来建立一个临时进程对象。如果这些参数被传输为 "NULL",就会建立一个静态对象。
•通过指定没有数据 "SET_PVICALLBACK"的回调,回调函数中的数据必须用 "PviReadResponse"读取。
•"0 "作为对象编号被转移,因为响应数据在这个对象上是不必要的。这首先被评估并从CPU对象开始传输。
注意。
在回调函数也被设置好之前,程序不能启动。这一项 "评估响应数据 "现在是预期的,一个函数被创建,来自每个PVI对象的响应数据被评估。
回调函数在"myPviFunc"模块中没有数据。
通过调用 "PviReadResponse"函数对PVI管理器发送的信息进行确认。
请注意
所有来自PVI管理器的消息都必须在回调中被确认,即使没有评估PVI对象数据或错误。
任务:启动程序并设置通信线路对象。 启动后,应在PVI监视器或PVI SnapShot浏览器中测试结果。 在PVI监视器中显示两个过程对象(PVI对象+直线对象)。一个链接对象也与通信线路对象同时被设置。 |
如果现在关闭应用程序,包括链接对象在内的进程对象也被删除。
下面的程序代码被添加到 "cmdCreateSync"按钮的函数中--甚至点击
正如你在这里看到的,路径名称(ObjName)为每个对象展开。句柄的变量和对象的类型也为每个进程对象而改变。
在程序代码中进一步说明。
响应数据应在创建CPU对象时进行评估。为了做到这一点,在链接描述(变量LinkDescription)中为"e=Error"和 "d=Data"设置了事件掩码 "EV"。这意味着,如果与控制器的连接丢失,错误将被登记在用户或对象编号为 "1"的回调中。
任务:展开回调并评估一个链接错误。 用户数字被转移到 "LPARAM"参数中的回调。 |
一个CPU对象的错误在回调函数中被评估 ,LPARAM =1,然后被写入表格的标题。标题还显示与控制器的连接何时建立
任务:添加任务和变量对象,在回调函数中评估数据变化和错误。 "pvitest"用户任务的任务对象和 "Lifesign"变量已经设置好。 |
读写访问的属性 "AT=rw"以及刷新时间 "RF=250"(单位为[ms])也在变量对象的连接描述(CD=)中指定。
在链接对象的描述中为 "e=错误 " 和 "d=数据"设置了事件掩码 "EV"。使用参数 "VT=f64"进行向 "Double "数据类型的转换。
当改变类型时,一个控制器的数据类型被转换为VB.NET中使用的数据类型。
这使得在Visual Basic中也可以显示和处理一个UDINT数据类型的控制变量的整个值范围。
Data type |
Value range |
Automation Runtime – UDINT |
0 - 4294967295 |
Visual Basic – LONG |
-247483648 - 247483647 |
请注意。
在VB中使用的数据类型的值范围在写入时不会被自动监控。因此,必须使用数据函数=缩放,参数为 "FS"。
该变量的数据被写入回调中的"txtLifesign"文本框的文本属性。当响应函数的返回值为0时,错误号码将输出到文本框中。
当项目启动并按下创建过程对象的按钮时,与控制器的连接被建立,变量的值被输出到文本框中。
Fig. 9: Starting the application – Displaying the value
任务:测试与控制器失去连接的情况 取消与控制器的连接。如果正在使用,必须首先退出AR000,并在运行的VB程序上测试其效果。对于其他类型的通信,必须将连接电缆与控制器断开。 一旦再次进行连接或AR000被重新启动,连接将自动重新建立。 结果: 当使用事件掩码 "EV=ed"时,变量对象被PVI管理器(活动进程对象)自动读取。 每次发生数值变化和发生错误时,只对活动进程对象自动调用回调。 因此,没有必要从应用程序中循环读取。 错误评估不需要特别编程。相反,应用程序通过与控制器的连接以及通过项目设置中的错误自动通知。 在结束PVI客户端应用程序时,PVI管理器上的进程对象也被删除。 |
一个静态过程对象只设置(创建)一次,并在PVI管理器的整个运行过程中保持活动。可以根据需要将许多链接对象链接到这个静态过程对象,然后再解除链接。
练习:用异步的PVI函数创建静态过程对象。 所有过程对象都被设置成一个变量对象,"Lifesign"变量的响应数据被显示在一个文本框中。 |
当设置静态进程对象时,使用PviCreate(在这种情况下是异步调用 "PviCreateRequest()")而不指定回调。
在设置链接对象时,用 "PviLink()"指定。
创建进程对象的步骤。
•对象引用(句柄)使用的全局变量与临时进程对象使用的全局变量相同
•在表单上设置一个按钮,名称为 "cmdCreateStatAsync"。
•在表单上设置一个按钮,名称为 "cmdLinkStatObj"。
•为事件数据和响应数据创建一个单独的回调。
静态过程对象在 "cmdCreateStatAsync"按钮的 "Click"事件中没有设置异步PVI函数。
PviCreateRequest函数需要两个回调函数。一个用于来自Create的响应,一个用于评估来自进程对象的响应数据和错误。
如果只为 "Create"指定回调,那么就会创建一个静态进程对象。
同步函数PviCreate不需要回调,因为对 "Create "的响应包含在该函数调用中。
在下一步,我们将在 "myPviFunc"模块中创建回调函数,用于评估Create函数。
PviCreateRequest与PviCreateResponse在函数调用响应的回调中被确认。
注意:
本例中没有涉及错误评估。用户可以单独实现这一点。
任务:启动程序并检查PVI监视器中的进程对象 设置了两个进程对象,即PVI和Line对象。与临时进程对象不同,仍然没有链接对象。 |
进一步在程序代码中创建所有进程对象。
CreateResponse函数的回调也被扩展。
任务:启动程序并检查PVI监视器中的进程对象 启动程序后,所有的进程对象都显示在PVI监视器中。
|
结果: 进程对象仍然保留在PVI管理器上,即使应用程序被结束。 没有为任何进程对象创建一个链接对象。 |
如果程序再次启动, 那么 在PviCreateResponse中会返回错误1200 。
这意味着 对象名称已经存在。在这种情况下,可以立即在现有的进程对象上建立一个链接对象。
注意。
如果两个不同的应用程序以相同的路径名称(@/Pvi/LnIna2...)设置了一个静态或临时进程对象,但有不同的连接描述,那么将使用现有进程对象的连接描述。
这意味着,如果第二个应用程序有相同的路径名称,并且必须与例如另一个设备进行通信,那是不可能的。
当用静态对象设置应用程序时,你还应该注意,由于程序或配置错误而对连接描述的改变,在终止PVI管理器后才会生效。
必须为一个静态进程对象创建一个具有 "PviLink()"或 "PviLinkRequest()"功能的链接对象。可以根据需要将多个链接对象连接到同一个进程对象。
注意。
建议使用异步的 "PviLinkRequest()"函数,因为它们也可以被循环调用。这也大大加快了同时链接和解除链接多个链接对象的函数的处理速度。
每个链接对象都可以有不同的参数,例如,数据类型或缩放。这使得在应用程序中同时处理一个控制变量的原始值(即控制器的物理值)以及经过缩放和转换的过程值成为可能。
练习:创建到任务对象的链接对象 链接对象在 "cmdLinkStatObj"按钮 的点击中被设置。 与临时对象的回调函数 "PviCallback"相同。 |
与临时进程对象一样,事件掩码在CPU对象的错误和数据的LinkDescriptor中被激活 "EV=ed"。
如果现在启动程序,并连续按下按钮 "cmdCreateStatAsync"和 "cmdLinkStatObj",那么将建立与任务对象的连接。所有进程对象(PVI-至变量对象)和链接对象(PVI-至任务对象)都显示在PVI监视器中。
练习:创建到变量的过程对象的链接对象 通过链接到变量对象(LinkDescriptor中的事件掩码 "EV=ed"),过程对象被激活。从此时起,变量被管理器读取并显示在 "txtLifesign"文本框中。 应该创建一个新的 "cmdLinkVar"按钮,并在点击事件中建立一个到变量对象的PviLink()。 |
在重新启动程序后,可以通过按 "cmdLinkVar"按钮创建变量的链接对象,而不需要创建静态进程对象,因为直到任务对象的进程对象已经存在。
该变量由PVI管理器读取并显示在表格的文本框中。
Fig. 10: Link to variable object
练习: 为同一个变量对象创建多个链接对象 如果现在多次按下"cmdLinkVar"按钮,那么就会在变量的过程对象上创建多个链接对象。 |
结果: 静态进程对象是一次性设置的,在PVI管理器运行时保持不变,即使应用程序被结束。 当一个或多个链接对象被创建后,进程对象被激活。 |
通过使用 "PviUnlink()"或 "PviUnlinkRequest()""删除"链接对象来解除对进程对象的链接。
如果在同一个进程对象上有多个链接对象,那么在最后一个链接对象被删除之前,它不会 "不活动"。
练习:删除变量对象的链接对象 使用函数 "PviUnlink()"删除链接对象。 应该创建一个名为 "cmdUnlinkVar"的新按钮,并在点击事件中调用该函数。手柄(即变量对象的引用)应该被转移到函数 "hPV_Lifesign"。 |
启动程序后,可以通过按 "cmdLinkVar"按钮创建一个或多个链接对象。Lifesign"变量的值显示在文本框中并循环刷新。
按 "cmdUnlinkVar"按钮可以删除该链接对象。一旦最后一个链接对象被删除,该变量不再被读取。
如果在没有更多的链接对象时调用"PviLink()"函数,则通过评估该函数的返回值输出一个错误。
在Visual Basic中可以使用两种不同类型的回调函数。
▪没有数据的回调
▪有数据的回调
对于支持Window Messages的编程环境,用户信息用 "Post Messages"发出信号。
"异步回调"是评估响应数据的另一种可能性。这种方法用于没有窗口的Visual C++应用程序(DLL驱动)。
一般来说,你应该确保响应数据或事件数据在各自的回调/窗口消息中不被求值(例如访问数据库)。
请注意:
在一个回调函数中,可以使用不受限制的异步PVICOM函数,但同步PVICOM函数不能。
在前面的练习中,回调函数是在没有数据的情况下使用的。
对于这种类型的回调,必须用相应的 Pvi...Response()函数读取数据 --"PviCreateResponse() "函数必须在 "PviCreateRequest() "或 "PviCreate() "函数的回调中调用。
在函数中转移的"WPARAM"和"LPARAM"参数需要用来安排分配给请求函数的响应函数。
Public Sub PviCallback(ByVal WPARAM As Long, ByVal LPARAM As Long)
Dim returnval As Long Dim DataPV As Double
Select Case LPARAM
Case 1: ' CPU object
returnval = PviReadResponse(WPARAM, 0, 0)
Case 10: ' variable object
returnval = PviReadResponse(WPARAM, DataPV, 8)
Case Else:
PviReadResponse WPARAM, 0, 0
End Select End Sub
LPARAM"参数表示分别被调用的函数(如PviCreate)中指定的用户号。
returnval = PviLink(hPV_Lifesign, ByVal ObjName, AddressOf PviCallback, _ SET_PVICALLBACK, 10, LinkDescription)
请注意:
如果在响应函数中传输的返回值是<>0,那么就发生了错误,函数中包含的数据是无效的。
因此,建议始终对返回值进行计算求值!
在这种类型的回调函数中,响应数据和事件数据在回调函数中被一起传输。调用相应的响应函数不再有必要或可能。
回调数据与函数调用一起传输,而不是正常的回调函数。
ReturnVal = PviLink(hPV_Lifesign, ByVal ObjName, AddressOf PviCallbackData, SET_PVICALLBACK_DATA, 10, LinkDescription)
Public Sub PviCallbackData(ByVal WPARAM As Long, ByVal LPARAM As Long, ByVal pData As Long, ByVal dataLen As Long, _ByRef pResInfo As T_RESPONSE_INFO) End Sub
练习:使用带数据的回调来评估 "Lifesign "变量的事件数据 带数据的回调被用于 "cmdLinkVar"按钮的点击事件,而不是普通的回调。 回调函数 "PviCallbackData"在 "myPviFunc"模块中被创建。 |
在有数据的回调函数中,在 "T_RESPONSE_INFO" PVI结构中进行查询,询问这是否是数据或是否发生了错误。然后,该数据是有效的,可以被计算求值。
在评估用户参数 "LPARAM"时,会再次分配相应的进程对象。
T_RESPONSE_INFO"结构中的"nMode"成员计算得出它是否是一个数据事件(POBJ_MODE_EVENT)。
ErrCode"成员决定是否发生了错误,或者转移到 "pData"的内容是否有效。
数据的指向和数据的长度在自制函数 "GetDataInformation"中传输。
在Visual Basic中使用API "CopyMemory"来复制数据到一个变量。这个API在模块 "myPviFunc"的声明部分被声明。
在 "GetDataInformation"函数中,数据现在被复制到Visual Basic "DataPV"变量和 "txtLifesign"文本框中。
注意。
在这个例子中,"VT=f64 "在变量对象的LinkDescriptor中被指定。这导致PVI管理器中的类型转换为 "double"。
在带数据的回调中,每个数据类型都包括相应的长度--在本例中,数据类型 "double "为 "8"。
在这个例子中,函数 "GetDataInformaton"是针对简单数据类型实现的。
为了实现所有数据类型的函数,也可以评估"Format Event"。这个事件在第一个数据事件之前被发送。
关于创建和评估格式事件的更多信息可以在PVI用户文档中找到。
结果: 启动程序并按下 "cmdLinkVar"按钮后,变量对象的值被输出到文本框中,就像练习中的无数据回调函数一样。 |
被 "EV=ed "事件掩码切换为 "活动 "的过程对象被PVI管理器自动监测数据变化--不管这些过程对象是否被PVI线轮询或被 "AT=re "属性设置为事件变量。
这意味着,这些过程对象不再需要由应用程序额外读取。
PVI为访问PVI对象层次结构中的各个进程对象提供了读和写的访问功能。
这些访问功能在PVI用户文档<PVI Base System> / <PVICOM interface> / <Access types>中有所描述。
Fig. 11: Access functions
本培训模块使用各种练习来描述对进程对象进行读和写访问的三种访问函数。
函数 "PviWriteRequest() "和访问函数 "POBJ_ACC_DATA"被用来对一个变量对象进行带数据的异步写访问。
在相应的回调中,应用程序被通知成功的写入任务。任何发生的错误都会在响应函数的返回值中报告。
练习: 向 "lifesign "变量写入数值 "0" 该函数在一个新按钮 "cmdWriteLifesign"的点击事件中实现。应在 "myPviFunc"模块中创建一个用于写入的回调函数。 |
对变量对象的数据访问是通过定义变量对象的LinkID(句柄)和访问类型 "POBJ_ACC_DATA"来指定。
在回调函数中,返回值通知应用程序写入访问是否成功(ReturnVal = 0)或是否发生错误(ReturnVal <> 0)。
结果: 在启动程序和设置过程对象后(不管这些对象是作为静态还是临时创建的),当按下 "cmdWriteLifesign"按钮时,变量的值被设置为 "0"。 |
对于静态过程对象,通过指定事件掩码 "EV=ed" 对过程对象进行 "活动 "切换是由 link / unlink 过程控制的。
对于临时进程对象,这是通过用访问类型 "POBJ_ACC_EVMASK"写入进程对象的事件掩码来实现的。
这个访问类型可以用来在运行期间为进程对象(包括静态和临时)启用或锁定不同类型的事件。
练习: 启用和禁用事件类型 "错误 "和 "数据"。 事件掩码在索引[0]处被 "禁用",在索引[1]处被 "重新启用",使用表单上名称为 "optEventMask"的OptionButton域。 这些访问可以使用同步写任务进行,因为这种改变是在PVI管理器上直接进行的,不必等待控制器的确认。 |
结果: 当程序启动时,在设置过程对象后,变量的每个数值变化都会显示在文本框中。 在按下索引[0]的OptionButton后,数值变化不再被刷新(即变量不再被读取)。 在用 "EV=ed""启用"事件掩码后,变量将再次被读取。 |
在这最后一个练习中,控制器的时间将被读取并输出。
注意:
除了读取控制器的时间外,这个函数还可以用来读取模块或用户任务的时间和数据,用于服务应用。
CPU和模块对象之间的区别是通过在对象层次结构中指定各自的句柄来实现的。
CPU对象上的访问函数 "POBJ_ACC_DATE_TIME"被用来从控制器中读取时间。
练习:从控制器中读取时间 通过按下一个新的按钮 "cmdReadTime"开始读时间。读取任务的响应显示在一个Visual Basic标签控件上,名称为 "lblTime"。 |
时间被保存在Visual Basic的一个结构变量中。这个结构的成员变量被用来执行显示的评估和格式化。
必要的时间结构是在 "myPviFunc"模块中创建的。
时间的读取任务在"cmdReadTime"按钮的点击事件中启动。
一个单独的名为 "RespService"的回调函数被创建,然后在其中评估被读取的时间。也可以使用一个现有的回调函数。
这里没有考虑到显示的正确格式化。
结果: 启动程序并按下 "cmdReadTime "按钮后,控制器的时间会显示在表格上。 要在控制器上设置时间,必须用PC的时间结构,并用 "PviWriteRequest() "函数写到控制器上。 |
PVI功能使实现任何Windows客户端应用程序成为可能,从需要数据显示和操作的可视化到创建服务工具--如PviTransfer工具。
本培训模块涵盖了PVI的一小部分功能。PVI的用户文档以及PVI样本和PVI服务器和运行时间/开发安装中所包含的支持的程序语言的PVI教程可以用来巩固基础知识。
Pvi Tutorial使用几个步骤来解释PVI功能的应用,从创建一个进程对象到使用大多数的访问功能。
Fig. 12: PVI DLL programming