<< 点击显示目录 >> 主页 PVI通信 > PVI帮助信息 > PVI base system > PVICOM interface > Requests and responses > Access types |
每当为一个PVI对象指定读或写请求时,就会指定访问类型。这允许 选择进程数据、属性、 进程对象的状态 和各种服务。
读取请求是通过 PviReadRequest 或PviXReadRequest函数 实现的 。 PviReadResponse 或PviXReadResponse函数用于读取响应数据。写入请求用 PviWriteRequest 或PviXWriteRequest函数 实现 。PviWriteResponse 或PviXWriteResponse函数用于写入响应数据。
一些访问类型由PVI管理器直接执行。其他访问类型则被传递到线路上,在那里进行处理。因此,哪些访问类型可以使用 ,取决于 正在使用的PVI线路 。
所有标准化的访问类型都列在下表中。 对象描述的合适参数代码 显示在 "Par. "栏中。相应的处理对象类型在 "类型 "栏中列出。
Access types |
No. |
Par. |
Type |
说明 |
#1 |
|
All |
读取访问。 读取 进程对象 的对象类型 。对象类型以4字节的二进制格式(整数)返回。 |
|
#2 |
|
Pvi Line Device Station Cpu Module Task |
读取访问。 根据对象类型,读取PVI组件的版本或PLC对象的版本。该版本信息以字符串格式返回。每个版本条目都以LF("/n")结尾。 PVI组件版本的语法(对象类型:Pvi, Line, Device)。 <Title>(<FileName>) <FileVersion> [<Date>] \n PLC对象版本的语法(对象类型:站、Cpu、模块、任务)。 [<Title>] <Version> [<Date>] ñ |
|
#3 |
|
All |
读取访问。 读取最近一次错误的错误代码 |
|
#5 |
All |
"e":错误状态的改变 "d":数据变化 "f":对数据格式的改变 "c":对连接描述的改变 "p":关于活动请求的进度信息 "s":状态变化 "u":用户标签字符串的变化 'l' -> 特殊行事件。 这里的规格使用字符串格式发生。字母的顺序其实并不重要。如果不应启用任何事件,则指定一个空字符串。 读取访问。 读取当前设置 |
||
#6 |
|
Pvi Line Device Station Cpu Module Task |
读取访问。在 这个进程对象下,在PVI管理器中已经创建的 所有 进程对象的 列表 。这个列表会以字符串形式返回。该列表包括PVI名称和进程对象的类型。 进程对象列表的语法。 <ObjectName> OT=<ObjectType> /t 对象条目由 \t 字符(制表符)分隔。 |
|
#7 |
|
Pvi Line Device Station Cpu Module Task |
读取访问。 可以在该进程对象下的PVI管理器中创建的 所有 进程对象的 列表 。这个列表以字符串形式返回。该列表包括连接名称和进程对象的类型。 进程对象列表的语法。 <ConnectionName> OT=<ObjectType> /t 对象条目由 \t 字符(制表符)分隔。 与 POBJ_ACC_LIST 不同,所有可以被创建的进程对象都显示在这个列表中。这个列表是由 PVI 管理器为进程对象类型 "Pvi "和 "Line "创建的,包括所有用 PVI 设置安装的线路或设备。对于所有其他的过程对象类型,这个列表是由正在使用的线组成的。这个访问类型支持哪条线的过程对象类型,可以在相应的线的描述中找到。 |
|
#10 |
Line Device Station Cpu Module Task Pvar |
写入访问。 设置或修改 进程对象的 连接描述 属性。连接描述被指定为一个字符串。改变这个连接描述会触发 POBJ_EVENT_CONNECT 事件。如果一个空的字符串被指定为行对象的连接描述,那么它和所有下级进程对象被作为内部进程对象处理。 读取访问。 读取当前设置的连接描述(字符串格式)。当使用 唯一的对象名称 时,不列出对象的层次结构 。 |
||
#11 |
|
Pvar |
写访问/读访问。 访问一个变量对象的数据 |
|
#12 |
|
Cpu Module Task Pvar |
写访问/读访问。 访问一个PLC对象的状态 要删除一个PLC模块,请使用字符串 "LD=Delete "进行写入访问。 要删除PLC模块的有效载荷(仅适用于BR日志数据模块),必须使用字符串 "LD=Clear "进行写入访问。 |
|
#13 |
Pvar |
|||
#14 |
Pvar |
读取访问。 读取对象属性和 数据格式描述,以及 结构定义的名称和PLC变量的元素。 |
||
#15 |
Pvar |
刷新率 ,单位为ms。 = -1:循环数据刷新被禁用。 = 0:数据刷新只执行一次。 > 0:使用指定的刷新时间进行循环数据刷新。 写访问。 设置或修改过程对象的刷新率。刷新率被指定为一个4字节的二进制值(整数)。 读取访问。 读取当前设置的刷新时间(4字节的二进制值)。 |
||
#16 |
Pvar |
与HY参数一样, 事件迟滞 是由字符串格式的迟滞值定义的。但与对象描述不同的是,这里省去了 "HY="参数。 写入权限。 设置或修改变量对象的事件迟滞值(字符串格式)。 读取访问。 读取当前设置的事件迟滞值(字符串格式)。 |
||
#17 |
Pvar |
读取访问。 读取变量对象的设定默认值(DV参数)。该值以字符串格式返回。 |
||
#18 |
Pvar |
与FS参数一样, 数据功能 由字符串格式的功能描述定义。然而,与对象描述不同的是,"FS="参数在这里被遗漏了。 写入访问。 设置或修改变量对象的数据功能(字符串格式)。 读取访问。 读取当前设置的数据函数(字符串格式)。 |
||
#19 |
Pvar |
|||
#20 |
|
Modules |
读取访问。 从PLC中读取BR模块,并将其保存到文件中。这种访问类型必须使用PVICOM函数PviReadArgumentRequest或PviXReadArgumentRequest。 |
|
#21 |
|
CPU |
写入访问。 从文件中读取BR模块,并将其传输给PLC |
|
#22 |
|
Pvi Cpu Module |
读取和写入日期和时间。数据以二进制形式传输,格式为 "tm "结构。日期和时间被定义为当地时间。 C/C++中 "tm "结构的定义(32位整数)。 结构 tm { int tm_sec; // 分钟后的秒数 - [0,59] int tm_min; // 小时后的几分钟 - [0,59] int tm_hour; // 从午夜开始的几个小时 - [0,23] 。 int tm_mday; // 本月的一天 - [1,31] int tm_mon; // 从一月开始的几个月 - [0,11] 。 int tm_year; // 1900年以来的年份 int tm_wday; // 自周日以来的天数 - [0,6] 。 int tm_yday; // 1月1日以来的天数 - [0,365] int tm_isdst; //日光节约时间标志 }; 写入权限。 只能用于CPU类型的进程对象。这设置了PLC的数据和时间。后面的三个结构元素不被评估。 读取访问。 访问的操作模式取决于正在使用的过程对象类型。通过过程对象类型Pvi或Cpu,从PC或PLC中读取关于日期和时间(本地时区)的当前信息。通过模块类型的过程对象访问时,将读取创建日期和时间或最后设定的日期和时间。 |
|
#23 |
|
CPU |
写入访问。 删除PLC上的指定数据存储器。内存类型由描述字符串中的LD参数定义。 描述字符串的语法。 LD=<MemoryType>。 <MemoryType>。Ram, SysRom, Rom, MemCard, FixRam, PerMem, RemMem, Trsf 或内存类型的数值。 |
|
#24 |
|
CPU |
读取访问。 读取所有现有PLC数据存储器的字符串格式的信息。 描述字符串的语法。 { < Entry1> }{ <Entry2>}...{<EntryN>} ......{<EntryN> } 每个<Entry>表达式都包含某种内存类型的信息。 <Entry>。LD=<MemoryType> SL=<Length> SF=<LengthFree> SB=<Block_2771↩ <MemoryType>。内存类型(RAM、MemCard等)。 <Length>:内存的大小(总数,字节)。 <LengthFree>:空闲内存的大小(以字节为单位) <Block>:最大的空闲内存区域的大小(以字节为单位) 例子。 "{ LD=Ram SL=65535 SF=16384 SB=4096 }{ LD=FixRam ...}" |
|
#25 |
|
Modules |
读取访问。 以字符串格式读取一个模块的信息。 描述字符串的语法。 MT=<ModuleType> ML=<ModuleLength> [DL=<DataLength>] [VI=<Version> ] <ModuleType>。模块类型是一个数字表达式 <ModuleLength>:模块的长度,以字节为单位 <DataLength>:有效载荷的长度,以字节为单位。 <Version>:有效载荷格式的版本。 参数DL和VI只针对BR日志数据模块列出。 |
|
#26 |
|
Modules |
读取访问。 从PLC中读取一个BR模块,并以二进制数据的形式传输给应用程序。这种访问类型必须使用PVICOM函数PviReadArgumentRequest或PviXReadArgumentRequest。 |
|
#27 |
|
CPU |
写入访问。 将BR模块从二进制用户数据传输到PLC。 |
|
#28 |
|
Modules |
读访问。 从模块中读取有效载荷数据。 写访问。 从一个模块中写出有效载荷数据。 这种访问类型只能与BR日志数据模块一起使用。 |
|
#29 |
|
CPU |
写访问。 删除AR上的BR模块。 描述字符串的语法。 MN=<ModuleName>。 <ModuleName>。BR模块的名称。 访问类型 POBJ_ACC_MOD_DELETE 只被 PVI Manager 3.50 版(PviMan.exe 文件版本)或更高版本,以及 INA2000 3.44 版(LnIna2.dll 文件版本)支持。 |
|
#30 |
|
Pvi |
读取访问。 可以在PVI基础对象下在PVI管理器中创建的所有列表对象的列表。该列表由PVI管理器创建,包括所有以字符串格式安装的PVI设置的行。 行对象列表的语法。 <LineName1>\ t <LineName2>... 所有的对象条目都用字符\t(制表符)分开。 <LineName>。 线路对象的连接名称。 |
|
#31 |
|
Line |
读取权限。 在线路对象下可以在PVI管理器中创建的所有设备对象的列表。这个列表是由PVI管理器创建的,包括该线路用PVI设置安装的所有设备,格式为字符串。 设备对象列表的语法。 <DeviceName 1>\ t <DeviceName 2>... 所有的对象条目都用字符\t(制表符)分开。 <DeviceName>。 设备对象的连接名称。 |
|
#32 |
|
Line Device |
读取权限。 在相应的进程对象下可以在PVI管理器中创建的所有台站对象的列表。这个列表是由正在使用的线路创建的。该访问类型支持哪条线的进程对象类型,可在相应的线描述中找到。 带有台站名称规格的台站对象列表的语法。 <StationName1> <StationName2> ... 所有对象条目都用字符\t(制表符)分开。 <StationName>。 车站对象的连接名称。 带有站号规格的台站对象列表的语法。 <MinNumber> <MaxNumber> |
|
#33 |
|
Line Device Station |
读取权限。 所有可以在PVI管理器中在相应进程对象下创建的CPU对象的列表。这个列表是由正在使用的线路创建的。该访问类型支持哪条线的进程对象类型,可以在相应的线描述中找到。 CPU对象列表的语法。 <CPUName1> \t <CPUName2> ... 所有对象条目都用字符\t(制表符)分开。 <CPUName>。 CPU对象的连接名称。 |
|
#34 |
|
Line Device Station Cpu |
读取权限。 在相应的进程对象下可以在PVI管理器中创建的所有模块对象的列表。这个列表是由正在使用的行创建的。该访问类型支持哪条线的进程对象类型,可以在相应的线描述中找到。 模块对象列表的语法。 <ModuleName1>\t <ModuleName2> ... 所有的对象条目都用字符\t(制表符)分开。 <ModuleName>。 模块对象的连接名称。 |
|
#35 |
|
Line Device Station Cpu Module |
读取权限。 在相应的进程对象下可以在PVI管理器中创建的所有任务对象的列表。这个列表是由正在使用的行创建的。该访问类型支持哪条线的进程对象类型,可以在相应的线描述中找到。 任务对象列表的语法。 <TaskName1> \t <TaskName2> ... 所有的对象条目都用字符\t(制表符)分开。 <TaskName>。 任务对象的连接名称。 |
|
#36 |
|
Line Device Station Cpu Module Task |
读取权限。 在相应的进程对象下可以在PVI管理器中创建的所有变量对象的列表。这个列表是由正在使用的行创建的。这个访问类型支持哪条线,可以在相应的线描述中找到。 变量对象列表的语法。 <VariableName1> [<Info>] /t <VariableName2> [<Info> ] ... 所有的对象条目都由 \t 字符(tab)分隔。 <VariableName>: 任务对象的连接名称。 <Info>:附加信息的描述字符串 附加信息的语法。 [SC=<Scope>] [VT=<VariableType> ... ]。 <Scope>:变量在PLC上的范围。 g': 全局, 'l': 本地, 'd': 动态对象 (也总是本地) <VariableType>:PLC上变量的数据格式规范。也请参见 POBJ_ACC_TYPE_EXTERN 访问类型。 |
|
#50 |
|
CPU |
读取访问。 读取字符串格式的CPU信息。 描述字符串的语法。 [CN=<CPUName>] [CT=<CPUType>] [AW=<ASWType>]。 <CPUName>。CPU的逻辑名称 <CPUType>:PLC的类型 <APMType>:应用内存类型 |
|
POBJ_ACC_CANCEL |
#128 |
|
All |
写入访问。 取消已发送的PVI请求。请求数据是由一个4字节的整数值组成。根据这个整数值,可以取消某个请求或所有请求。 =0: 取消所有请求 >0: 只取消指定访问类型的请求。
POBJ_ACC_CANCEL写访问和要取消的请求必须通过同一个链接对象引导。 也 请参见请求和响应 部分。 |
#129 |
Module Task Pvar |
通过用户标签,PVI 应用程序可以以字符串(以 0 结尾的字符串)的形式向进程对象(模块、任务或变量对象)分配一个私人用户代码或特定的用户数据(另见事件类型POBJ_EVENT_USERTAG)。用户标签只由PVI管理,不进行评估。 写访问/读访问。 对用户标签字符串的访问 |
||
#200 |
|
Pvi |
读取访问。 读取PVI管理器的许可证信息。许可证信息以T_PVI_INFO_LICENCE结构的格式读取。 |
|
#210 |
|
Pvi |
读取访问。 登录到PVI管理器的所有客户的列表(PVICOM应用程序的模块名称)。 客户端列表的语法。 <ClientModule1> \t <ClientModule2> ... 所有客户条目都用字符\t(制表符)分开。 |
|
#211 |
|
Pvi |
读取访问。 读取PVI版本。读取保存在PVI管理器中的PVI产品版本字符串。 |
|
#240 |
|
All |
写访问。 执行 快照功能。调用时,需要将快照文件的名称指定为一个字符串。也可以指定一个路径。 只有激活了快照功能的进程对象和所有下级进程对象(对象层次)被写入快照文件中。例如,如果为一个任务对象触发了快照功能,那么只有这个任务对象和在它下面创建的变量对象被写入快照文件。如果要写入PVI管理器中所有建立的对象的信息,那么必须使用全局PVI对象(基础对象"/Pvi")进行激活。 在执行快照功能时,PVI管理器中的所有其他功能都被阻止。这保证了快照数据的一致性,但当PVI管理器处理大量数据时,也可能导致巨大的时间变化。因此,快照功能只应尽量少用。 读取访问。 最后指定的快照文件的路径名称(字符串格式)。 |
|
#243 |
|
Pvi |
写访问。 关闭PVI管理器。请记住,对于这种类型的访问,没有定义响应数据。 |
|
Access type > 255 |
|
|
|
特殊线路服务的线路访问类型 |
*) |
POBJ_ACC_TYPE, POBJ_ACC_HYSTERESE 和 POBJ_ACC_FUNCTION 只能用于访问进程对象的属性。它们不能被用来访问链接对象的相应属性。 |
行访问类型是所有数字大于255的访问类型。这些访问类型只在被使用的线路中执行。请求和响应数据只由PVI管理器传递。
行访问类型主要用于Automation Studio和Automation Runtime之间的内部通信。然而,其中一些行访问类型也可以被PVI客户应用程序使用。
下表列出了所有允许在PVI客户应用程序中使用的行访问类型。相应的过程对象类型被列在 "类型 "栏中。
Access types |
No. |
Type |
Description |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#291 |
CPU |
Read access: 读取通信参数作为参数字符串 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#296 |
CPU |
Read access: 读取链接节点的列表 可选参数的语法。 [QU=<Type>] [QP=<Name>] 用 "QU=All"(默认)读取所有链接节点。"QU=Pv "只读取分配给进程变量的链接节点。 分配给一个进程变量的链接节点。变量名称由QP参数定义。 以下语法适用于 <Name> 。 Global process variable: [<ApplicationModuleName>::]<PVName> Local process variable: [<ApplicationModuleName>::]<TaskName>:<PVName> 链接节点列表的语法。 <LinkNode1> \t <LinkNode2> \t ... 链接节点条目由\t字符(tab)分隔。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#351 |
CPU |
Read access: 以 XML 字符串的形式读取PLC的许可证状态 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#400 |
CPU |
Read access: 读取CPU信息为一个 XML 字符串。这个XML字符串比 POBJ_ACC_CPU_INFO 访问类型的 字符串包含更多信息 。 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?>
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#401 |
Module Task |
Read access: 读取PLC模块信息,作为一个 XML 字符串。 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?>
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#402 |
Task |
读取访问: 读取PLC任务信息,作为一个 XML 字符串 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?>
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#403 |
CPU |
Read access: 以 XML 字符串的形式读取PLC模块列表 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?>
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#404 |
CPU |
Read access: 读取CPU内存信息为 XML 字符串 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?>
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#405 |
CPU |
Read access: 以 XML 字符串的形式读取PLC硬件信息 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?>
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#406 |
CPU |
Read access: 读取PLC冗余信息,作为一个 XML 字符串 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?>
这种访问类型只能在冗余的PLC系统上使用。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#408 |
CPU |
Read access: 读取PLC任务类信息,作为一个 XML 字符串 响应数据的结构。 <?xml version="1.0" encoding="utf-8" ?> |
XML(可扩展标记语言)是一种标准化的标记语言,用于以文本形式描述分层结构的数据。一些PVI访问类型将响应数据作为XML格式的字符串返回。参数组(如列表中的一个条目)然后被结构化为XML元素。这些元素中的各个参数通常被指定为XML属性。
在PVI应用中评估XML响应数据时,必须考虑到以下几点。
•必须使用合适的分析器进行评估。
•来自较新的 AR 版本的 XML 数据可能包含新的 XML 元素或属性。
为了确保兼容性,PVI应用程序必须始终忽略未知的XML元素和属性。
•现有的XML元素和属性也可能被淘汰,如果它们在较新的AR版本中不再具有相关性。
PVI应用程序必须通过实施适当的措施(例如,分配默认值)来考虑这些情况。
•XML属性中的数值可以用十进制(Param="123")或十六进制格式(Param="0x7b")指定。
Write access: 写入过程数据。数据首先被写入PVI过程图像中。当使用外部变量时,再转移到PLC中。写入程序的终止与响应数据一起被报告。这也保证了数据已经转移到了PLC中。 然而, 如果 指定了 "h " 对象属性 ,那么响应数据就会在写入PVI过程图像后立即发送给应用程序。因此,应用程序会收到一个更快的写入响应。然而,当收到响应数据时,不能保证数据确实已被写入PLC。
Read access: 激活一个过程数据的读取请求。数据从PLC中读取,并与响应数据一起发送给应用程序。如果过程数据发生变化, 则 与响应数据一起触发一个 POBJ_EVENT_DATA 事件。
这种访问类型用于读取或设置一个进程对象的状态。这个状态是用一个字符串格式的状态描述来定义的。对这个状态描述的处理是在被使用的行中进行的。这个访问类型支持哪一行,可以在各自的行描述中找到。
Write access:
Object type |
Syntax |
CPU |
ST=<Status> <Status>: WarmStart, ColdStart, Reset, Diagnose |
Modules |
LD=Delete Deletes module object on the PLC |
Task |
ST=<Status> <Status>: Start, Stop, Resume, Cycle, Cycle(<Number>). |
Read access:
Object type |
Syntax |
CPU |
ST=<Status> <Status>: WarmStart, ColdStart, Reset, Reconfiguration, NMI, Diagnose, Error |
Modules |
ST=<Status> [LD=<LoadType>] [ID=<Identification>] <Status>: NonExisting, Exists, Loading, Incomplete, Complete, Ready, InUse. <LoadType>: SysRam, Ram, SysRom, Rom, MemCard, FixRam, DRam, PerMem, RemMem, Trsf. <Identification>: BR日志数据模块的最新日志条目的标识号 |
Task |
ST=<Status> <Status>: NonExisting, Unrunnable, Idle, Running, Stopped, Starting, Stopping, Resuming, Resetting |
Pvar |
ST=<Status> [FC=<Force>] [IO=<Attribute>] [SC=<Scope>] <Force>: Force state 1 or 0 <Attribute>: "r" .. input, "w" .. output <Status>: "Const" for constants, "Var" for variables, or "Lkn" for link node <Scope>: PLC上的变量的范围。 'g': .. global, 'l': .. local, 'd': .. dynamic object (also always local). |
这种访问类型用于读取或设置过程对象 的属性、 数据格式 和 类型转换 的模式 。这种访问类型与字符串格式的描述一起工作。与 对象描述一样 ,各个参数在字符串中用参数代码进行区分。
该描述可以包括以下参数:
为了确保与旧版本的PVI(早于V3.0.0)兼容,对于 "简单 "的数组变量(有一个以上数组元素的一维数组,数组索引从0开始,不是派生数据类型)不指定参数VS。为了将一个变量识别为数组变量,除了附加规范'a'外,还必须评估参数VN。以下条件适用。如果VS=...a...或VN > 1,则为数组变量。
Write access: 根据描述字符串中的规格,为过程对象设置对象属性、数据格式和/或类型铸造模式的属性。这些属性既可以单独设置,也可以相互配合。例如,"AT=r "字符串只设置对象属性。其他属性保持不变。
当数据格式发生变化时,会触发一个 POBJ_EVENT_DATAFORM 事件。
如果流程对象的数据格式是由行指定的,那么应用程序不能改变它。任何尝试都会被拒绝,错误12039。
Read access: 读取过程对象中设置的对象属性、数据格式和类型铸造模式的属性。
POBJ_ACC_TYPE_INTERN 访问类型读取 一个 PVI 变量的 对象属性和 数据格式的属性 。 与访问类型 POBJ_ACC_TYPE_EXTERN不同,该变量的属性是从 PVI 过程映像中读取的。
该描述可以包括以下参数。
at, vt, vl, ***vn, vs, al, cm, vo。
在读取方向上,访问类型POBJ_ACC_TYPE_INTERN是访问类型 POBJ_ACC_TYPE的扩展 。访问类型POBJ_ACC_TYPE_INTERN可以用来读取以下信息。
Par. |
Description |
VO |
结构元素的相对偏移。这里指定的偏移量指的是过程变量对象中的PVI过程图像。如果没有定义cast函数,过程图像的数据格式与来自PVI的数据相同。 |
对于结构变量,在指定结构元素的数据格式时,可以指定结构元素的名称。
{.<ElementName1>[.<ElementName2>] ... }
Read access: 读取过程对象中设置的对象属性、数据格式和类型铸造模式的属性。
POBJ_ACC_TYPE_EXTERN访问类型读取 PLC变量的 对象属性和 数据格式的属性 。与访问类型 POBJ_ACC_TYPE 和 POBJ_ACC_TYPE_INTERN 不同,该变量的属性是从 PLC 中读取的。这些属性可能与PVI图像中的变量属性不同。读取请求的处理在 正在使用的PVI行中 进行 。这种访问类型支持哪条线,可以在相应的线描述中找到。
该描述可以包括以下参数。
at, sc, vt, vl, vn, vs, al, sn, tn, vo, ve.
数据格式参数VT、VL、VN、VS和AL是 对象描述中的参数 。所有其他参数是可选的,并且可以与对象描述不同。
与变量对象的对象属性不同,AT的定义如下。
AT |
说明 |
r |
允许对变量中的数据进行读取访问。 |
w |
允许对变量中的数据进行写操作 |
e |
可以对该变量进行PLC事件控制 |
SC参数(范围)用于显示PLC上一个变量的范围。
SC |
说明 |
g |
全局PLC变量。 |
l |
本地PLC变量(任务变量)。 |
d |
动态PLC变量。 |
还可以用变量的数据格式指定更多的信息。
Par. |
说明 |
VS |
数据类型的附加规格。 |
SN |
枚举变量或结构变量的高级类型的名称。 |
TN |
派生数据类型的名称。如果一个数据类型是多次派生的,那么每个数据类型的名称都会列出。各个名称之间用","(逗号)分开。 |
VO |
变量偏移量或相对结构元素偏移量 这里指定的偏移量是指PLC变量,而不是指PVI中的过程图像。 |
VE |
行内部使用的元素信息。 |
参数SN、TN、VO和VE是对数据格式的可选补充。其条目取决于线路和接入类型。
VS参数只有在存在附加规格的情况下才会给出。一个附加规格由一个规格ID和可选的规格参数组成。VS参数也可以包含几个附加规格(<Spec>)。这些规格总是由';'(分号)字符分开。规格参数之间以及规格ID之间用","(逗号)分开。
一般语法:
VS=<Spec1>[,<Para1>[,<Para2>[, ... ]]][;<Spec2>[, ... ]]
可以指定以下附加规格:
VS |
描述 |
a[,<Inx1>,<Inx2>] |
识别一个一维数组变量或多维变量的一个数组维度。规格参数<Inx1>和<Inx2>定义了允许的数组索引(下索引、上索引)。阵列元素的数量(阵列维度)可以由<Inx2> - <Inx1> + 1确定。阵列索引也可以取负值。 |
v[,<Val1>,<Val2>] |
标识一个派生数据类型。<Val1>和<Val2>可以用来指定整数格式变量数据的有效范围(下限、上限)。 |
e[,<Val>,<Name>] |
标明一个枚举类型或一个枚举器。每个枚举器由一个值<Val>和一个名称<Name>组成。 |
b |
识别一个比特字符串(比特列表)。数据类型(VT参数)可以是u8、u16、u32或u64。 |
附加规格 "a","v "和 "e "可以被多次输入。附加规格 "a "的每个条目都描述了一个数组维度。第一个条目描述最外层的数组维度;最后一个条目描述最内层的数组维度(例如:var[0.9][0.4]或var[10][5],二维变量有50个元素=>"VS=a,0,9;a,0,4")。附加规格 "v "的每个条目都描述了一个派生数据类型。派生数据类型的名称也以同样的顺序列在参数TN中。这个顺序也可以用来将派生数据类型分配给数组维度(例如。Typ1[0...9], Typ2[0...4], 变量由Typ2派生,Typ2由Typ1派生 => "TN=Typ1,Typ2 VS=a,0,9;v;a,0,4;v" )。
为了确保与旧版本的PVI(早于V3.0.0)兼容,对于 "简单 "的数组变量(有一个以上数组元素的一维数组,数组索引从0开始,不是派生数据类型)不指定参数VS。为了将一个变量识别为数组变量,除了附加规范'a'之外,还必须评估参数VN。以下条件适用。如果VS=...a...或VN > 1,则为数组变量。
通过结构变量,结构元素的名称可以与它们的数据格式描述一起被指定。
{.<ElementName1>[.<ElementName2>] ... }
Read access: 可以读取对象的属性,如对象属性、数据格式、派生数据类型的名称、结构定义的名称以及结构的所有元素。
访问类型POBJ_ACC_TYPE_INTERN(或POBJ_ACC_TYPE)和POBJ_ACC_TYPE_EXTERN也可以返回不同的数据格式。请注意,只有 POBJ_ACC_TYPE_INTERN 访问类型(或 POBJ_ACC_TYPE 或 POBJ_EVENT_DATAFORM 事件)可以描述 PVI 过程映像中过程数据的格式。
这些访问类型用于从PLC中读取BR模块。 必须使用PVICOM函数 PviReadArgumentRequest 或PviXReadArgumentRequest,因为应用程序还必须在读取请求中定义文件名和模块参数。应用程序会收到上传的确认信息或响应数据的错误信息(PviReadResponse 或PviXReadResponse)。上传总是通过一个PVI模块对象进行调节。PLC上的模块名称是通过过程对象的连接描述来定义的。
模块数据以 POBJ_ACC_UPLOAD 访问类型存储在指定文件中。请注意,当函数被调用时,路径名称中指定的所有目录必须已经存在。路径总是以 PVI 管理器的工作目录为基础。为了通过 PVI 远程连接传输模块数据,必须使用访问类型 POBJ_ACC_UPLOAD_STM。
模块数据以 POBJ_ACC_UPLOAD_STM 的二进制数据形式与响应数据一起传输给应用程序。在这种情况下,模块数据的长度与响应数据的长度相对应。
如果调用字符串中没有定义模块类型(未指定MT参数),那么正在读取的模块数据与PLC上已完成的BR模块相对应。如果调用字符串中定义了模块类型(指定了MT参数),那么有效载荷将从指定的BR模块中提取。然后,正在读取的模块数据只包括BR模块的有效载荷。
POBJ_ACC_UPLOAD的调用字符串的语法:
["]<Filename>["] [MT=<ModuleType> ...]
或
FN=["]<Filename>["] [MT=<ModuleType> ...]
带有FN参数项的变体不能与INA2000生产线一起使用。
POBJ_ACC_UPLOAD_STM的调用字符串的语法:
[MT=<ModuleType> ...]
在调用字符串中上传参数:
Example of access type POBJ_ACC_UPLOAD in C:
#include <PviCom.h>
static void WINAPI PviUploadResp (WPARAM wParam, LPARAM lParam)
{
int ErrCode;
ErrCode = PviReadResponse (wParam, NULL, 0);
if (ErrCode != 0)
printf ("Problem uploading module (PVI Error %d)", ErrCode);
}
void UploadRequ (DWORD hModule, char* szFileName)
{
int ErrCode;
// start PVI upload service:
ErrCode = PviReadArgumentRequest (hModule, POBJ_ACC_UPLOAD,
szFileName, strlen (szFileName) + 1,
PviUploadResp, SET_PVICALLBACK, 0);
if (ErrCode != 0)
printf ("Can't start upload service (PVI Error %d)", ErrCode);
}
Example of access type POBJ_ACC_UPLOAD_STM in C:
#include <PviCom.h>
static void WINAPI PviUploadResp (WPARAM wParam, LPARAM lParam)
{
DWORD DataLen = 0;
void* pData = NULL;
int ErrCode;
char szFilename[256];
FILE* stream;
PviGetResponseInfo (wParam, NULL, &DataLen, NULL, 0);
if (DataLen != 0)
{
// create data buffer:
pData = malloc (DataLen);
if (pData == NULL)
{
printf ("Can't allocate memory");
DataLen = 0;
}
}
// read module data:
ErrCode = PviReadResponse (wParam, pData, DataLen);
if (ErrCode != 0)
printf ("Problem uploading module (PVI Error %d)", ErrCode);
else
{
// write module data to file:
sprintf (szFilename, "C:\\List\\Module%u.bin", lParam);
if ((stream = fopen (szFilename, "wb")) != NULL)
{
fwrite (pData, 1, DataLen, stream);
fclose (stream);
}
else
printf ("Can't create file %s", szFilename);
}
if (pData != NULL)
free (pData);
}
void UploadRequ (DWORD hModule, DWORD ModuleNum)
{
char* szParam;
int ErrCode;
szParam = "";
ErrCode = PviReadArgumentRequest (hModule, POBJ_ACC_UPLOAD_STM,
szParam, strlen (szParam) + 1,
PviUploadResp, SET_PVICALLBACK, ModuleNum);
if (ErrCode != 0)
printf ("Can't start upload service (PVI Error %d)", ErrCode);
}
这些访问类型用于向PLC写入BR模块。为了执行下载程序, 必须使用PVICOM函数 PviWriteRequest 或PviXWriteRequest。应用程序要么收到下载的确认,要么收到响应数据的错误(PviWriteResponse 或PviXWriteResponse)。下载总是通过一个PVI CPU对象进行调节。
模块数据以 POBJ_ACC_DOWNLOAD 访问类型从指定文件读取。路径总是以 PVI 管理器的工作目录为基础。为了通过PVI远程连接传输模块数据,必须使用访问类型POBJ_ACC_UPLOAD_STM。
应用程序必须使用 POBJ_ACC_DOWNLOAD_STM 来传输模块数据和请求数据。为此必须创建一个数据块。这个数据块需要包括调用字符串和二进制模块数据,并且必须传输请求函数(PviWriteRequest 或 PviXWriteRequest)。数据块的大小以字节为单位,由调用字符串的长度+二进制模块数据的大小+1计算。ASCII格式的调用字符串(字符长度为1字节)必须始终位于数据块的开头,并以二进制0(空)结束。二进制模块数据必须在空字节之后开始。如果不需要调用字符串,那么应该在数据块中指定一个空字符串。
如果调用字符串中没有定义模块类型(未指定MT参数),那么模块数据需要包括一个完成的BR模块。如果调用字符串中定义了模块类型(指定了MT参数),那么模块数据将被视为来自BR模块的有效载荷。然后PVI从这个有效载荷和模块类型信息中生成一个完成的BR模块,并将其传送给PLC。
POBJ_ACC_DOWNLOAD的调用字符串的语法。
["]<Filename>["] [LD=<MemoryType>] [IM=<InstallationMode>] [MT=<ModuleType> MN=<ModuleName> ...]
or
FN=["]<Filename>["] [LD=<MemoryType>] [IM=<InstallationMode>] [MT=<ModuleType> MN=<ModuleName> ...]
带有FN参数项的变体不能与INA2000 line一起使用。
POBJ_ACC_DOWNLOAD_STM的调用字符串的语法。
[LD=<MemoryType>] [IM=<InstallationMode>] [MT=<ModuleType> MN=<ModuleName> ...]
在调用字符串中下载参数:
Par. |
描述 |
MT |
用于模块编译的模块类型。 |
MN |
PLC上BR模块的名称 该参数仅在模块编译时生效(参数MT)。在标准下载中,使用在BR模块中输入的模块名称。 |
LD |
负载类型(内存类型)。默认为 "LD=Ram"。 负载类型选择PLC上用于下载的目标存储器。 可以指定以下内存类型。SysRam, Ram, SysRom, Rom, MemCard, FixRam, DRam, Trsf或加载类型(内存类型)为数值。 |
IM |
安装模式 默认 "IM=Overload"。 安装模式决定了任务模块的传输方式。 过载。标准机制。 复制。交换是几个周期。 OneCycle。 在一个周期内交换。 |
C语言中访问类型POBJ_ACC_DOWNLOAD的例子:
#include <PviCom.h>
static void WINAPI PviDownloadResp (WPARAM wParam, LPARAM lParam)
{
int ErrCode;
ErrCode = PviWriteResponse (wParam);
if (ErrCode != 0)
printf ("Problem downloading module (PVI Error %d)", ErrCode);
}
void DownloadRequ (DWORD hCpu, char* szFileName)
{
char szParam[256];
int ErrCode;
// start PVI download service:
sprintf (szParam, "%s LD=Rom", szFileName);
ErrCode = PviWriteRequest (hCpu, POBJ_ACC_DOWNLOAD,
szParam, strlen (szParam) + 1,
PviDownloadResp , SET_PVICALLBACK, 0);
if (ErrCode != 0)
printf ("Can't start download service (PVI Error %d)", ErrCode);
}
C语言中访问类型POBJ_ACC_DOWNLOAD_STM的例子:
#include <PviCom.h>
static void WINAPI PviDownloadResp (WPARAM wParam, LPARAM lParam)
{
int ErrCode;
ErrCode = PviWriteResponse (wParam);
if (ErrCode != 0)
printf ("Problem downloading module (PVI Error %d)", ErrCode);
}
void DownloadRequ (DWORD hCpu, char* szModuleName)
{
char szFilename[256];
FILE* stream;
long FileLen;
char szParam[256];
long ParamLen;
void* pRequData;
int ErrCode;
// open file:
sprintf (szFilename, "C:\\List\\%s.bin", szModuleName);
if ((stream = fopen (szFilename, "rb")) != NULL)
{
// get file length:
fseek (stream, 0, SEEK_END);
FileLen = ftell (stream);
// PVI download parameter:
sprintf (szParam, "MT=BRT MN=%s LD=DRam", szModuleName);
ParamLen = strlen (szParam) + 1;
// create request data buffer:
pRequData = malloc (ParamLen + FileLen);
if (pRequData != NULL)
{
// prepare request data buffer:
memcpy (pRequData, szParam, ParamLen);
fseek (stream, 0, SEEK_SET);
FileLen = fread ((BYTE*) pRequData + ParamLen, 1, FileLen, stream);
// start PVI download service:
ErrCode = PviWriteRequest (hCpu, POBJ_ACC_DOWNLOAD_STM,
pRequData, ParamLen + FileLen,
PviDownloadResp , SET_PVICALLBACK, 0);
if (ErrCode != 0)
printf ("Can't start download service (PVI Error %d)", ErrCode);
free (pRequData);
}
else
printf ("Can't allocate memory");
fclose (stream);
}
else
printf ("Can't open file %s", szFilename);
}
这种访问类型可用于从BR日志数据模块中读取有效载荷数据,或向BR日志数据模块中写入一个条目。
Read access:
读取访问是通过PVICOM函数 PviReadArgumentRequest 或PviXReadArgumentRequest 启动的 。在调用字符串中指定的参数定义了要读取的日志数据。如果只能用默认参数进行读取访问, 也可以使用 PVICOM函数 PviReadRequest 。应用程序要么收到请求的日志数据,要么收到一个错误的响应数据(PviReadResponse 或PviXReadResponse)。
BR日志数据模块中的每个日志条目都有一个唯一的识别号(ID)。每一个新的日志条目,识别号都会增加一个。一旦数字计数器超限,识别号又从零开始。如果用识别号来找出差异,需要考虑到这个条件。
日志条目可以从某个识别号开始读取,也可以从最后一个(最新的)日志条目开始。也可以用 POBJ_ACC_STATUS 访问类型或 POBJ_EVENT_STATUS 事件类型来确定一个BR日志数据模块的最新日志条目的标识号 。
调用字符串的语法。
[DN=<Number>] [ID=<Identification>]
调用字符串中的参数。
Par. |
Description |
DN |
要读取的日志条目的数量。默认值。DN=1 |
ID |
第一个要读取的条目的标识号。如果没有指定参数ID,则从最后一个(最新的)条目开始读取。 |
响应字符串的语法。
响应数据由单个ASCII字符串组成。每个字符串都以一个空字符("\0 "字符)结束。下一个字符串在空字符之后直接开始。
<AccessInformation> \0 <LogEntry1> \0 <LogEntry2> \0 ... \0 <LogEntryN> \0
第一个字符串包含一般的访问信息。
Par. |
描述 |
DN |
读取的日志条目的数量。后续字符串的数量由DN*3计算。 |
每个读取的日志条目都有三个字符串(<LogEntry>)。(<Information>)字符串包含关于日志条目的一般信息。接下来是信息文本的字符串(<ASCIILogData>),然后是十六进制格式的二进制日志数据的字符串(<BinaryLogData>)。如果没有ASCII或二进制日志数据,那么就会列出一个空字符串(只有空字符)。
在响应数据中,第一个日志条目(<LogEntry1>)始终是读取的日志条目中最新的一个.
<Information> \0 <ASCIILogData> \0 <BinaryLogData>
信息字符串中的参数:
Par. |
描述 |
TLEN |
消息文本(ASCII日志数据)字符串中的字符数,不含空字符。 |
BLEN |
二进制日志数据字符串中的字符数,不含空字符。 |
TIME |
时间戳,以秒为单位,是一个有小数位的十进制数字。小数点后的位置数决定了时间戳的分辨率。 |
ID |
日志条目识别号。 |
E |
分配给日志条目的错误号码,以十进制数字表示。 |
INFO |
附加信息,以小数点后的数字表示。 |
LEV |
日志条目的级别,以十进制数字表示。 |
TN |
任务名称(用引号指定:TN="<Name>")。 |
Write access:
通过PVICOM函数 PviWriteRequest 或PviXWriteRequest启动写访问 。每次写入时,都有一个条目被写入PLC的BR日志数据模块。
调用字符串的语法。
TXT=["]<Text>["] [LEV=<Level>] [E=<ErrorCode>]
调用字符串中的参数。
不可能写入二进制数据。
C语言中访问类型为POBJ_ACC_MOD_DATA的读取示例。
#include <PviCom.h>
//////////////////////////
// Parse PVI Parameter: //
//////////////////////////
static bool GetNextParam (const char** pszDesc,
char* szKeywordBf, int KeywordBfLen,
char* szParamBf, int ParamBfLen)
{
const char* szDesc = *pszDesc;
char EndChr = ' ';
// skip space characters:
while (*szDesc == ' ')
szDesc++;
// copy keyword:
while (isalpha (*szDesc))
if (--KeywordBfLen > 0)
*(szKeywordBf++) = (char) toupper (*(szDesc++));
else
szDesc++;
*szKeywordBf = '\0';
if (*szDesc == PVICHR_ASSIGN)
{
// skip space characters:
while (*(++szDesc) == ' ');
// test parameter spezification:
if (*szDesc == PVICHR_PARAM)
{
szDesc++;
EndChr = PVICHR_PARAM;
}
// copy parameter:
while ((*szDesc != '\0') && (*szDesc != EndChr))
if (--ParamBfLen > 0)
*(szParamBf++) = *(szDesc++);
else
szDesc++;
*szParamBf = '\0';
if (*szDesc == PVICHR_PARAM)
szDesc++;
*pszDesc = szDesc;
return (TRUE);
}
*pszDesc = szDesc;
return (FALSE);
}
bool FindParam (const char* szDesc,
const char* szKeyword,
char* szParamBf, int ParamBfLen)
{
char szKeywordBf[16];
while (GetNextParam (&szDesc, szKeywordBf, 16, szParamBf, ParamBfLen))
if (strcmp (szKeywordBf, szKeyword) == 0)
return (TRUE);
return (FALSE);
}
////////////////////////////////
// Read logging informations: //
////////////////////////////////
typedef struct
{
bool bValid;
DWORD Level;
DWORD Error;
char Task[32+1];
char Text[80+1];
} T_LOGDATA;
static HANDLE hReadLogEvent;
// PVI callback function:
static void WINAPI ReadLogProc (WPARAM wParam, LPARAM lParam,
LPVOID pData, DWORD DataLen,
T_RESPONSE_INFO* pInfo)
{
const char* szDesc = (const char*) pData;
T_LOGDATA* pLogData = (T_LOGDATA*) lParam;
char szParamBf[256];
int Entries = 0;
if (DataLen > 0)
if (FindParam (szDesc, KWDESC_DATACNT, szParamBf, sizeof (szParamBf)))
Entries = strtol (szParamBf, NULL, 10);
while (Entries-- > 0)
{
// parse informations (string 1):
szDesc += (strlen (szDesc) + 1);
if (! FindParam (szDesc, "LEV", szParamBf, sizeof (szParamBf)))
pLogData->Level = 0;
else
pLogData->Level = strtoul (szParamBf, NULL, 10);
if (! FindParam (szDesc, "E", szParamBf, sizeof (szParamBf)))
pLogData->Error = 0;
else
pLogData->Error = strtoul (szParamBf, NULL, 10);
if (! FindParam (szDesc, "TN", pLogData->Task, sizeof (pLogData->Task)))
strcpy (pLogData->Task, "???");
// copy ASCII data (string 2):
szDesc += (strlen (szDesc) + 1);
strncpy (pLogData->Text, szDesc, (sizeof (pLogData->Text)-1));
pLogData->Text[sizeof (pLogData->Text)-1] = '\0';
// skip binary data (string 3):
szDesc += (strlen (szDesc) + 1);
pLogData->bValid = TRUE;
pLogData++;
}
SetEvent (hReadLogEvent);
}
// Read logging informations from module object:
void ReadLog (DWORD LinkId, // PVI module object handle
T_LOGDATA* pLogData, // pointer to data buffer
DWORD ReadCnt) // entries to read
{
char szArgParam[32];
int i;
// reset data buffer:
for (i = 0; (i < ReadCnt); i++)
pLogData[i].bValid = FALSE;
hReadLogEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
sprintf (szArgParam, "%s=%u", KWDESC_DATACNT, ReadCnt);
// request read service:
if (PviReadArgumentRequest (LinkId, POBJ_ACC_MOD_DATA,
szArgParam, strlen (szArgParam), ReadLogProc,
SET_PVICALLBACK_DATA, (LPARAM) pLogData) == 0)
WaitForSingleObject (hReadLogEvent, INFINITE);
CloseHandle (hReadLogEvent);
}