Access types

<< 点击显示目录 >>

主页  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

说明

POBJ_ACC_OBJECT

#1

 

All

读取访问。 读取 进程对象 的对象类型 。对象类型以4字节的二进制格式(整数)返回。

POBJ_ACC_VERSION

#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>] ñ

POBJ_ACC_ERROR

#3

 

All

读取访问。 读取最近一次错误的错误代码

POBJ_ACC_EVMASK

#5

EV

All

写访问。定义事件类型 启用掩码 用于启用 事件

"e":错误状态的改变

"d":数据变化

"f":对数据格式的改变

"c":对连接描述的改变

"p":关于活动请求的进度信息

"s":状态变化

"u":用户标签字符串的变化

'l' -> 特殊行事件。

这里的规格使用字符串格式发生。字母的顺序其实并不重要。如果不应启用任何事件,则指定一个空字符串。

读取访问。 读取当前设置

POBJ_ACC_LIST

#6

 

Pvi

Line

Device

Station

Cpu

Module

Task

读取访问。 这个进程对象下,在PVI管理器中已经创建的 所有 进程对象 列表 。这个列表会以字符串形式返回。该列表包括PVI名称和进程对象的类型。

进程对象列表的语法。

<ObjectName> OT=<ObjectType> /t

对象条目由 \t 字符(制表符)分隔。

POBJ_ACC_LIST_EXTERN

#7

 

Pvi

Line

Device

Station

Cpu

Module

Task

读取访问。 可以在该进程对象下的PVI管理器中创建的 所有 进程对象 列表 。这个列表以字符串形式返回。该列表包括连接名称和进程对象的类型。

进程对象列表的语法。

<ConnectionName> OT=<ObjectType> /t

对象条目由 \t 字符(制表符)分隔。

与 POBJ_ACC_LIST 不同,所有可以被创建的进程对象都显示在这个列表中。这个列表是由 PVI 管理器为进程对象类型 "Pvi "和 "Line "创建的,包括所有用 PVI 设置安装的线路或设备。对于所有其他的过程对象类型,这个列表是由正在使用的线组成的。这个访问类型支持哪条线的过程对象类型,可以在相应的线的描述中找到。

POBJ_ACC_CONNECT

#10

CD

Line

Device

Station

Cpu

Module

Task

Pvar

写入访问。 设置或修改 进程对象的 连接描述 属性。连接描述被指定为一个字符串。改变这个连接描述会触发 POBJ_EVENT_CONNECT 事件。如果一个空的字符串被指定为行对象的连接描述,那么它和所有下级进程对象被作为内部进程对象处理。

读取访问。 读取当前设置的连接描述(字符串格式)。当使用 唯一的对象名称 时,不列出对象的层次结构 。

POBJ_ACC_DATA

#11

 

Pvar

写访问/读访问。 访问一个变量对象的数据

POBJ_ACC_STATUS

#12

 

Cpu

Module

Task

Pvar

写访问/读访问。 访问一个PLC对象的状态

要删除一个PLC模块,请使用字符串 "LD=Delete "进行写入访问。

要删除PLC模块的有效载荷(仅适用于BR日志数据模块),必须使用字符串 "LD=Clear "进行写入访问。

POBJ_ACC_TYPE  *)

#13

AT

VT

CM

Pvar

写访问/读访问。 读取和写入 对象 属性, 类型转换 的模式  (转换模式)和/或  变量对象的数据格式

POBJ_ACC_TYPE_EXTERN

#14

AT

VT

Pvar

读取访问。 读取对象属性和 数据格式描述,以及 结构定义的名称和PLC变量的元素。

POBJ_ACC_REFRESH

#15

RF

Pvar

刷新率 ,单位为ms。

= -1:循环数据刷新被禁用。

= 0:数据刷新只执行一次。

> 0:使用指定的刷新时间进行循环数据刷新。

写访问。 设置或修改过程对象的刷新率。刷新率被指定为一个4字节的二进制值(整数)。

读取访问。 读取当前设置的刷新时间(4字节的二进制值)。

POBJ_ACC_HYSTERESE *)

#16

HY

Pvar

与HY参数一样, 事件迟滞 是由字符串格式的迟滞值定义的。但与对象描述不同的是,这里省去了 "HY="参数。

写入权限。 设置或修改变量对象的事件迟滞值(字符串格式)。

读取访问。 读取当前设置的事件迟滞值(字符串格式)。

POBJ_ACC_DEFAULT

#17

DV

Pvar

读取访问。 读取变量对象的设定默认值(DV参数)。该值以字符串格式返回。

POBJ_ACC_FUNCTION  *)

#18

FS

Pvar

与FS参数一样, 数据功能 由字符串格式的功能描述定义。然而,与对象描述不同的是,"FS="参数在这里被遗漏了。

写入访问。 设置或修改变量对象的数据功能(字符串格式)。

读取访问。 读取当前设置的数据函数(字符串格式)。

POBJ_ACC_TYPE_INTERN

#19

AT

VT

CM

Pvar

读取访问。 读取 PVI过程变量对象的 对象属性、 数据格式描述类型转换模式 (铸造模式)。

POBJ_ACC_UPLOAD

#20

 

Modules

读取访问。 从PLC中读取BR模块,并将其保存到文件中。这种访问类型必须使用PVICOM函数PviReadArgumentRequest或PviXReadArgumentRequest。

POBJ_ACC_DOWNLOAD

#21

 

CPU

写入访问。 从文件中读取BR模块,并将其传输给PLC

POBJ_ACC_DATE_TIME

#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中读取关于日期和时间(本地时区)的当前信息。通过模块类型的过程对象访问时,将读取创建日期和时间或最后设定的日期和时间。

POBJ_ACC_MEM_DELETE

#23

 

CPU

写入访问。 删除PLC上的指定数据存储器。内存类型由描述字符串中的LD参数定义。

描述字符串的语法。

LD=<MemoryType>

<MemoryType>。Ram, SysRom, Rom, MemCard, FixRam, PerMem, RemMem, Trsf 或内存类型的数值。

POBJ_ACC_MEM_INFO

#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 ...}"

POBJ_ACC_MOD_TYPE

#25

 

Modules

读取访问。 以字符串格式读取一个模块的信息。

描述字符串的语法。

MT=<ModuleType> ML=<ModuleLength> [DL=<DataLength>] [VI=<Version> ]

<ModuleType>。模块类型是一个数字表达式

<ModuleLength>:模块的长度,以字节为单位

<DataLength>:有效载荷的长度,以字节为单位。

<Version>:有效载荷格式的版本。

参数DL和VI只针对BR日志数据模块列出。

POBJ_ACC_UPLOAD_STM

#26

 

Modules

读取访问。 从PLC中读取一个BR模块,并以二进制数据的形式传输给应用程序。这种访问类型必须使用PVICOM函数PviReadArgumentRequest或PviXReadArgumentRequest。

POBJ_ACC_DOWNLOAD_STM

#27

 

CPU

写入访问。 将BR模块从二进制用户数据传输到PLC。

POBJ_ACC_MOD_DATA

#28

 

Modules

读访问。 从模块中读取有效载荷数据。

写访问。 从一个模块中写出有效载荷数据。

这种访问类型只能与BR日志数据模块一起使用。

POBJ_ACC_MOD_DELETE

#29

 

CPU

写访问。 删除AR上的BR模块。

描述字符串的语法。

MN=<ModuleName>

<ModuleName>。BR模块的名称。

访问类型 POBJ_ACC_MOD_DELETE 只被 PVI Manager 3.50 版(PviMan.exe 文件版本)或更高版本,以及 INA2000 3.44 版(LnIna2.dll 文件版本)支持。

POBJ_ACC_LIST_LINE

#30

 

Pvi

读取访问。 可以在PVI基础对象下在PVI管理器中创建的所有列表对象的列表。该列表由PVI管理器创建,包括所有以字符串格式安装的PVI设置的行。

行对象列表的语法。

<LineName1>\ t <LineName2>...

所有的对象条目都用字符\t(制表符)分开。

<LineName>。 线路对象的连接名称。

POBJ_ACC_LIST_DEVICE

#31

 

Line

读取权限。 在线路对象下可以在PVI管理器中创建的所有设备对象的列表。这个列表是由PVI管理器创建的,包括该线路用PVI设置安装的所有设备,格式为字符串。

设备对象列表的语法。

<DeviceName 1>\ t <DeviceName 2>...

所有的对象条目都用字符\t(制表符)分开。

<DeviceName>。 设备对象的连接名称。

POBJ_ACC_LIST_STATION

#32

 

Line

Device

读取权限。 在相应的进程对象下可以在PVI管理器中创建的所有台站对象的列表。这个列表是由正在使用的线路创建的。该访问类型支持哪条线的进程对象类型,可在相应的线描述中找到。

带有台站名称规格的台站对象列表的语法。

<StationName1> <StationName2> ...

所有对象条目都用字符\t(制表符)分开。

<StationName>。 车站对象的连接名称。

带有站号规格的台站对象列表的语法。

<MinNumber> <MaxNumber>

POBJ_ACC_LIST_CPU

#33

 

Line

Device

Station

读取权限。 所有可以在PVI管理器中在相应进程对象下创建的CPU对象的列表。这个列表是由正在使用的线路创建的。该访问类型支持哪条线的进程对象类型,可以在相应的线描述中找到。

CPU对象列表的语法。

<CPUName1> \t <CPUName2> ...

所有对象条目都用字符\t(制表符)分开。

<CPUName>。 CPU对象的连接名称。

POBJ_ACC_LIST_MODULE

#34

 

Line

Device

Station

Cpu

读取权限。 在相应的进程对象下可以在PVI管理器中创建的所有模块对象的列表。这个列表是由正在使用的行创建的。该访问类型支持哪条线的进程对象类型,可以在相应的线描述中找到。

模块对象列表的语法。

<ModuleName1>\t <ModuleName2> ...

所有的对象条目都用字符\t(制表符)分开。

<ModuleName>。 模块对象的连接名称。

POBJ_ACC_LIST_TASK

#35

 

Line

Device

Station

Cpu

Module

读取权限。 在相应的进程对象下可以在PVI管理器中创建的所有任务对象的列表。这个列表是由正在使用的行创建的。该访问类型支持哪条线的进程对象类型,可以在相应的线描述中找到。

任务对象列表的语法。

<TaskName1> \t <TaskName2> ...

所有的对象条目都用字符\t(制表符)分开。

<TaskName>。 任务对象的连接名称。

POBJ_ACC_LIST_PVAR

#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 访问类型。

POBJ_ACC_CPU_INFO

#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写访问和要取消的请求必须通过同一个链接对象引导。

请参见请求和响应 部分。

POBJ_ACC_USERTAG

#129

UT

Module

Task Pvar

通过用户标签,PVI 应用程序可以以字符串(以 0 结尾的字符串)的形式向进程对象(模块、任务或变量对象)分配一个私人用户代码或特定的用户数据(另见事件类型POBJ_EVENT_USERTAG)。用户标签只由PVI管理,不进行评估。

写访问/读访问。 对用户标签字符串的访问

POBJ_ACC_INFO_LICENCE

#200

 

Pvi

读取访问。 读取PVI管理器的许可证信息。许可证信息以T_PVI_INFO_LICENCE结构的格式读取。

POBJ_ACC_LIST_CLIENTS

#210

 

Pvi

读取访问。 登录到PVI管理器的所有客户的列表(PVICOM应用程序的模块名称)。

客户端列表的语法。

<ClientModule1> \t <ClientModule2> ...

所有客户条目都用字符\t(制表符)分开。

POBJ_ACC_PVI_VERSION

#211

 

Pvi

读取访问。 读取PVI版本。读取保存在PVI管理器中的PVI产品版本字符串。

POBJ_ACC_SNAPSHOT

#240

 

All

写访问。 执行 快照功能。调用时,需要将快照文件的名称指定为一个字符串。也可以指定一个路径。

只有激活了快照功能的进程对象和所有下级进程对象(对象层次)被写入快照文件中。例如,如果为一个任务对象触发了快照功能,那么只有这个任务对象和在它下面创建的变量对象被写入快照文件。如果要写入PVI管理器中所有建立的对象的信息,那么必须使用全局PVI对象(基础对象"/Pvi")进行激活。

在执行快照功能时,PVI管理器中的所有其他功能都被阻止。这保证了快照数据的一致性,但当PVI管理器处理大量数据时,也可能导致巨大的时间变化。因此,快照功能只应尽量少用。

读取访问。 最后指定的快照文件的路径名称(字符串格式)。

POBJ_ACC_PVIMAN_EXIT

#243

 

Pvi

写访问。 关闭PVI管理器。请记住,对于这种类型的访问,没有定义响应数据。

Access type > 255

 

 

 

特殊线路服务的线路访问类型

  *)

POBJ_ACC_TYPE, POBJ_ACC_HYSTERESE 和 POBJ_ACC_FUNCTION 只能用于访问进程对象的属性。它们不能被用来访问链接对象的相应属性。

Line access types行访问类型

行访问类型是所有数字大于255的访问类型。这些访问类型只在被使用的线路中执行。请求和响应数据只由PVI管理器传递。

行访问类型主要用于Automation Studio和Automation Runtime之间的内部通信。然而,其中一些行访问类型也可以被PVI客户应用程序使用。

下表列出了所有允许在PVI客户应用程序中使用的行访问类型。相应的过程对象类型被列在 "类型 "栏中。

Access types

No.

Type

Description

POBJ_ACC_LN_COMM_DST

#291

CPU

Read access: 读取通信参数作为参数字符串

POBJ_ACC_LN_LKN_LIST

#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)分隔。

POBJ_ACC_LN_XML_LIC_STATUS

#351

CPU

Read access:XML 字符串形式读取PLC的许可证状态

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<License>
  <Status Error="..." />
</License>

Error

...

PLC的许可状态

= 0

...

许可证状态是有效的。

>0

...

许可证状态是无效的。错误返回AR错误状态。

POBJ_ACC_LN_XML_CPU_INFO

#400

CPU

Read access: 读取CPU信息为一个 XML 字符串。这个XML字符串比 POBJ_ACC_CPU_INFO 访问类型 字符串包含更多信息  。

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<CpuInfo>
  <SoftwareVers AutomationRuntime="..." AnslRtrVers="..." AnslServVers="..." ... />
  <CpuConfiguration Type="..." ShortName="..." Node="..."/>
  <OperationalValues CurrentCpuMode="..." CurrentCpuState="..." CurrentCpuUsage="..."
                     CpuBootMode="..." BatteryStatus="..." BatteryStatusBackplane="..." ... />
  <NetworkDevices>
    <Host Host="..."/>
    <Interface IF="..." IP="..." ... />
    ...
  </NetworkDevices>
  ...
</CpuInfo>

AutomationRuntime

...

当前操作系统(Runtime)的版本

AnslRtrVers

...

ANSL基础系统的当前版本为十六进制值

AnslServVers

...

ANSL在线服务器的当前版本为十六进制值

Type

...

PLC的类型(例如:X20CP3568,APC910,等等)

ShortName

...

PLC的短名称

Node

...

PLC的当前节点号

CurrentCpuMode

...

PLC的当前状态为十进制值

= 1

...

Boot

= 2

...

Diagnose

= 3

...

Service

= 4

...

Run.

CurrentCpuState

...

以INA2000格式表示的PLC的当前状态

CurrentCpuUsage

...

当前的CPU负载,以%为单位的十进制值

CpuBootMode

...

PLC的最后一次启动原因是一个十进制值

= 1

...

Warm restart

= 2

...

Cold restart

= 4

...

Watchdog

= 32

...

Diagnose

= 64

...

Error

BatteryStatus

...

备用电池的状态(1 = OK)

BatteryStatusBackplane

...

背板电池的状态 (1 = OK)

Host

...

控制器的主机名

IF

...

网络接口的名称

IP

...

网络接口的IP地址

POBJ_ACC_LN_XML_MOD_INFO

#401

Module

Task

Read access: 读取PLC模块信息,作为一个 XML 字符串。

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<ModInfo Name="..." Size="..." MemType="..." Version="..." Revision="..."
         ModulType="..." Time="..." RawTimeErzT5="..." RawTimeAenT5="..." ... />

Name

...

模块的名称

Size

...

模块的大小,以字节为单位的十进制值

MemType

...

内存类型(十进制)。

Version

...

版本的十进制值

Revision

...

修订版的十进制值

ModulType

...

模块类型(十进制)。

Time

...

创建时的时间戳,格式为年-月-日-小时-分钟-秒。秒是用小数点指定的(例如:2013-12-28-17-34-53.000000)。

RawTimeErzT5

...

以T5格式创建的时间戳(例如:e3-31-70-ec-38)。

RawTimeAenT5

...

以T5格式修改时的时间戳(例如:e3-31-70-ed-2f)

POBJ_ACC_LN_XML_TASK_INFO

#402

Task

读取访问: 读取PLC任务信息,作为一个 XML 字符串

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<TaskInfo Name="..." Size="..." MemType="..." Version="..." Revision="..."
          ModulType="..." Time="..." RawTimeErzT5="..." RawTimeAenT5="..."
          TaskClass="..." InstallNo="..." ModulState="..." DiagIndex="..." ... />

模块信息的属性与 POBJ_ACC_LN_XML_MOD_INFO 访问类型属性相同  。

TaskClass

...

分配的任务类别(任务类别编号)为十进制值

InstallNo

...

任务安装号

ModulState

...

当前任务状态为十进制值

= 1

...

Not executable

= 2

...

Idle state

= 3

...

Run state

= 4

...

Stopped state

DiagIndex

...

作为十进制值的模块索引(仅当PLC处于诊断模式时)。

POBJ_ACC_LN_XML_MOD_LIST

#403

CPU

Read access:XML 字符串形式读取PLC模块列表

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<ModList>
  <TaskInfo Name="..." ... />
  <ModInfo Name="..." ... />
  ...
</ModList>

TaskInfo

...

这个元素被指定用于所有任务类型的模块。其属性与 POBJ_ACC_LN_XML_TASK_INFO 访问类型相同  。

ModInfo

...

这个元素被指定用于非任务类型的模块。它的属性与 POBJ_ACC_LN_XML_MOD_INFO访问类型相同

POBJ_ACC_LN_XML_MEM_INFO

#404

CPU

Read access: 读取CPU内存信息为 XML 字符串

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<StoreInfo>
  <Drive>
    <Drive0 ID="..." Name="..." Size="..." UsedSize="..." ... />
    ...
  </Drive>
  <Memory>>
    <xxx Type="..." Size="..." UsedSize="..." MaxBlockSize="..." ... />
    ...
  </Memory>
</StoreInfo>

xxx

...

存储器的类型应该用 "xxx "代替(例如:<SystemFlash>,<UserFlash>,<UserRam>,等等)。

ID

...

分区ID

Name

...

分区的名称

Type

...

内存类型为十进制值

Size

...

内存的总大小,以字节为单位,为十进制值

UsedSize

...

当前使用的内存大小,以字节为单位,为十进制值

MaxBlockSize

...

最大的可用内存块,以字节为单位的十进制值

POBJ_ACC_LN_XML_HW_INFO

#405

CPU

Read access:XML 字符串形式读取PLC硬件信息

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<<Hardware>
  <Node Name="..." Path="..." State="..." ... />
  ...
</<Hardware>

Name

...

硬件节点的名称

Path

...

硬件节点的路径

State

...

硬件节点的状态

POBJ_ACC_LN_XML_RED_INFO

#406

CPU

Read access: 读取PLC冗余信息,作为一个 XML 字符串

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<CpuRedInfo rIfModeSwitch="..." LongPushTimeStamp="..." ShortPushTimeStamp="..."
            CpuModeSwitch="..." ProcessCtrlState="..." SwitchState="..." LinkState="..."
            ProjectName="..." ... >
  <PriIpConfig>
    <Device0 Name="..." Addr="..." SubNetMask="..." Hostname="..." BaudRate="..." ... />
    <Device1 Name="..." ... />
    ...
  </PriIpConfig>
  <SecIpConfig>
    <Device0 Name="..." Addr="..." SubNetMask="..." Hostname="..." BaudRate="..." ... />
    <Device1 Name="..." ... />
    ...
  </SecIpConfig>
  <CluIpConfig Addr="..." SubNetMask="..." />
  <ActIpConfig Addr="..." Hostname="..." AnslPort="..." ... />
  <InactIpConfig Addr="..." Hostname="..." AnslPort="..." ... />
</CpuRedInfo>

rIfModeSwitch

...

rIF上模式开关的当前位置

= 0

...

Illegal

= 1

...

Primary

= 2

...

Secondary

LongPushTimeStamp

...

rIF上最后一次长按按钮的时间戳

ShortPushTimeStamp

...

在rIF上最后一次按短按钮的时间戳

CpuModeSwitch

...

rCPU的优先级(主/次)。

= 0

...

Illegal

= 1

...

Primary

= 2

...

Secondary

ProzessCtrlState

...

过程控制的状态

= 0

...

Error

= 1

...

Active

= 2

...

Passive

= 3

...

Standby

SwitchState

...

冗余模式(热/暖/冷/无法故障切换)。

= 0x00

...

Cannot failover

= 0x10

...

Cold

= 0x20

...

Warm

= 0xff

...

Hot

LinkState

...

冗余连接的状态

= 0

...

None

= 1

...

Synchronous

= 2

...

Asynchronous

ProjectName

...

冗余项目的名称

PriIpConfig

...

主CPU的IP配置部分

SecIpConfig

...

辅助CPU的IP配置部分

CluIpConfig

...

集群接口(虚拟地址)的IP配置部分

ActIpConfig

...

当前激活的CPU的IP配置部分

InactIpConfig

...

当前不活动的CPU的IP配置部分

Addr

...

网络接口的IP地址

SubNetMask

...

网络接口的子网掩码

HostName

...

网络接口的主机名

BaudRate

...

网络接口的波特率

AnslPort

...

ANSL在线通信的端口号

这种访问类型只能在冗余的PLC系统上使用。

POBJ_ACC_LN_XML_TC_INFO

#408

CPU

Read access: 读取PLC任务类信息,作为一个 XML 字符串

响应数据的结构。

<?xml version="1.0" encoding="utf-8" ?>
<TimingInfo>
  <TimerInfo>
    <System Tick="..." Device="..." ... />
    ...
  </TimerInfo>
  <TaskclassInfo>
    <Tc1 Name="..." Num="..." Cycle="..." Tolerance="..." State="..." ... />
    <Tc2 ... />
    ...
  </TaskclassInfo>
  ...
</TimingInfo>

TimerInfo

...

一般定时器信息部分

Tick

...

配置的系统滴答,以µs为单位的十进制值

Device

...

配置的设备

TaskclassInfo

...

任务类信息部分

Name

...

任务类别的名称

Num

...

任务类别的编号(十进制)。

Cycle

...

配置任务类的周期时间,以µs为单位的小数点后值

Tolerance

...

配置任务类的公差,以µs为单位,为小数点。

State

...

任务类的当前状态为十进制值

= 1

...

Run status

= 2

...

Suspended status

XML string

XML(可扩展标记语言)是一种标准化的标记语言,用于以文本形式描述分层结构的数据。一些PVI访问类型将响应数据作为XML格式的字符串返回。参数组(如列表中的一个条目)然后被结构化为XML元素。这些元素中的各个参数通常被指定为XML属性。

在PVI应用中评估XML响应数据时,必须考虑到以下几点。

必须使用合适的分析器进行评估。

来自较新的 AR 版本的 XML 数据可能包含新的 XML 元素或属性。

为了确保兼容性,PVI应用程序必须始终忽略未知的XML元素和属性。

现有的XML元素和属性也可能被淘汰,如果它们在较新的AR版本中不再具有相关性。

PVI应用程序必须通过实施适当的措施(例如,分配默认值)来考虑这些情况。

XML属性中的数值可以用十进制(Param="123")或十六进制格式(Param="0x7b")指定。

POBJ_ACC_DATA access type

Write access: 写入过程数据。数据首先被写入PVI过程图像中。当使用外部变量时,再转移到PLC中。写入程序的终止与响应数据一起被报告。这也保证了数据已经转移到了PLC中。  然而, 如果  指定了 "h " 对象属性 ,那么响应数据就会在写入PVI过程图像后立即发送给应用程序。因此,应用程序会收到一个更快的写入响应。然而,当收到响应数据时,不能保证数据确实已被写入PLC。

Read access: 激活一个过程数据的读取请求。数据从PLC中读取,并与响应数据一起发送给应用程序。如果过程数据发生变化, 与响应数据一起触发一个 POBJ_EVENT_DATA 事件。

POBJ_ACC_STATUS access type

这种访问类型用于读取或设置一个进程对象的状态。这个状态是用一个字符串格式的状态描述来定义的。对这个状态描述的处理是在被使用的行中进行的。这个访问类型支持哪一行,可以在各自的行描述中找到。

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).

POBJ_ACC_TYPE access type

这种访问类型用于读取或设置过程对象 属性数据格式类型转换 的模式 。这种访问类型与字符串格式的描述一起工作。与 对象描述一样 ,各个参数在字符串中用参数代码进行区分。

该描述可以包括以下参数:

AT, VT, VL, VN, VS, AL, CM.

为了确保与旧版本的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 access type

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 access type

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 过程映像中过程数据的格式。

POBJ_ACC_UPLOAD and POBJ_ACC_UPLOAD_STM access types

这些访问类型用于从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> ...]

在调用字符串中上传参数:

Par.

Description

MT

用于模块编译的模块类型。

根据所使用的编译库(INA2000ANSL可以在调用字符串中指定其他参数

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);
}

POBJ_ACC_DOWNLOAD and POBJ_ACC_DOWNLOAD_STM access types

这些访问类型用于向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

用于模块编译的模块类型。

根据所使用的编译库(INA2000ANSL可以在调用字符串中指定其他参数

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);
}

POBJ_ACC_MOD_DATA access type

这种访问类型可用于从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);
}