<< 点击显示目录 >> 主页 PVI通信 > PVI帮助信息 > PVI base system > PVICOM interface > Process data > Type conversion |
为了能够处理过程数据,PVICOM应用程序必须知道 过程数据的数据格式 。
尽管PVICOM应用和PLC应用可以 "同意 "使用某种数据格式,但对数据格式的任何改变都必须在两个应用中进行。在实践中,这经常导致隐藏的错误。然而,应用程序有可能读取一个 变量对象的数据格式 (POBJ_EVENT_DATAFORM 事件或 POBJ_ACC_TYPE 或 POBJ_ACC_TYPE_INTERN 访问类型)。应用程序可以检查数据格式并在格式不允许的情况下输出错误信息,也可以动态地管理进程数据。类型转换是另一个解决方案。
在类型转换过程中(cast函数),数据格式是由PVICOM应用程序预先确定的。然后在读和写时,变量对象中的过程数据被转换为给定的数据格式,反之亦然。为了能够使用类型转换,一个应用程序必须在设置 链接对象时定义一个数据格式 。然后,无论变量对象的数据格式如何,进程数据将总是以这种格式写入和读取。
该图片显示了从PLC到PVICOM应用程序的过程数据的格式。
在转换类型时,Integer(有符号或无符号)、Float、Boolean和String变量类型可以作为数组变量或单一变量进行组合。所有其他的变量类型不能合并。当试图组合上述未提及的变量类型时,报告错误12036。
如果在链接对象中定义了一个带有结构元素的结构,那么结构元素的数量必须与过程变量的数量相同。各个结构元素中的数据会根据其数据格式进行转换。这里适用的规则与单一变量相同。此外,结构数据是根据指定的结构排列方式进行定向的。
类型转换结构和指定结构元素的例子。
Data format of the variable object:
"VT=struct AL=2 {. VT=i8 } {. VT=i32 }"
Definition of structure in C for the PLC (SG3):
struct
{
SINT a;
DINT b;
}
Specification for the link object data format:
"VT=struct {. VT=string VL=16 } {. VT=string VL=16 }"
Definition of the structure in C for the application:
struct
{
char strA[16];
char strB[16];
}
在这个例子中,类型将被转换为字符串。当然,也可以使用字符串整数或浮点格式。
如果只需要设置结构对齐方式(AL 参数),但要应用结构元素的格式,那么需要定义一个没有结构元素和变量长度为0(0)的结构作为链接对象的数据格式(数据格式 "VT=struct VL=0")。这个特殊的规范应用了变量对象的数据格式中的结构元素。与链接对象中的结构排列(AL参数)的定义一起,任何结构都可以根据指定的结构排列被定向。
在不指定结构元素的情况下进行结构类型转换的例子。
Data format of the variable object:
"VT=struct AL=2 {. VT=i8 } {. VT=i32 }"
Definition of structure in C for the PLC (SG3):
struct
{
SINT a;
DINT b;
}
Specification for the link object data format:
"VT=struct VL=0 AL=4"
Definition of the structure in C for the application:
struct
{
char A;
long B;
}
各个结构元素的格式与PLC的格式相对应。然而,应用程序的工作方式是结构排列4。因此,结构的大小在应用程序中是8字节,在PLC中是6字节(SG3)。
在数组中,所有元素都被单独转换(类型转换)。这里适用的规则与单个变量的规则相同。如果数组变量拥有不同数量的元素,那么类型转换将在较小数组的末端终止。如果目标数组比较大,那么剩下的部分就用二进制的零来填充。
类型转换数组的例子。
Data format of the variable object:
"VT=u16 VN=10"
Definition of the variable in C for the PLC:
INT Array[10];
Specification for the link object data format:
"VT=i32 VN=10"
Definition of the variable in C for the application:
long Array[10];
所有不等于0(零)的值在类型转换为布尔类型的变量时都会得到TRUE的值。如果一个字符串("VT=string "或 "VT=wstring")被类型转换为布尔类型,那么在数值被检查为不等于0之前,它将首先被转换为一个整数。
根据IEEE的规定,浮点变量(f32,f64)中的数据可以包含无效的值(无穷大,不是一个数字)。有效值是在类型转换时形成的(最大或最小的可显示值或0)。
当类型从2字节("VT=wstring")变为1字节("VT=string")字符串时,所有字符<256都被应用,没有任何变化。>=256的字符用"~"字符表示。
一般来说,注意在类型转换过程中可能会丢失数值信息。例如,i16变量(2字节整数)中的数据应该被类型转换为i8(1字节整数)。i8变量可以表示从-128到+127的值。i16变量中的值 "130 "超出了i8的数值范围,因此不能用i8变量表示。这就造成了数值范围的违反。可以通过 CM 参数的第2位来激活值范围监控 。
在类型转换过程中,当值范围监控被停用时会发生什么。
•变量类型Integer到具有较小数值范围的变量类型Integer。
数字被截断为二进制形式。
•浮点变量类型到一个具有较小数值范围的变量类型。
如果数字不能在数值范围内表示,那么结果是未定义的。
•字符串变量类型到整数变量类型的浮点。
如果数字不能在数值范围内表示,那么结果是未定义的。
•浮点或整数变量类型转换为字符串变量类型。
如果转换后的字符串长于字符串变量的长度("VL "参数),那么该字符串将被截断。
在类型转换过程中激活了值范围监控("CM=4")会发生什么。
•如果在写入过程数据(访问类型 POBJ_ACC_DATA)时违反了数值范围 ,那么写入指令不会被执行。响应数据报告错误12014。RESP_STATUS_CAST_OVERFLOW或RESP_STATUS_CAST_UNDERFLOW标志被设置在响应数据的状态(RESPONSE_INFO结构) 中。此外,响应数据包含链接对象数据格式中的超限值。这个极限值可以用PVICOM函数 PviWriteResultResponse 或PviXWriteResultResponse读取 。
•如果在读取方向上违反了数值范围(访问类型POBJ_ACC_DATA或事件 POBJ_EVENT_DATA),那么极限值将与响应或事件数据一起提供。极限值是可以表示的最大或最小的值。RESP_STATUS_CAST_OVERFLOW或RESP_STATUS_CAST_UNDERFLOW标志被设置在响应或事件数据的状态(RESPONSE_INFO结构)中。
•对字符串变量类型("VT=string "或 "VT=wstring")也进行了限制监测。当字符串数据的长度超过字符串变量的缓冲区大小时,就会发生违反限制的情况。例如,一个字符串 "abcdefg "+结尾的null不能完全放入数据格式为 "VT=string VL=4 "的变量。
类型转换的操作模式可以受到 CM 参数 的影响 。该参数可以在 过程对象和链接对象的对象描述 中定义 。对于类型转换,两个对象的设置总是被评估(OR函数)。过程对象中的设置定义了所有连接的操作模式,而链路对象中的规范只适用于那一个连接。默认情况下,CM被分配为0(零)。
CM参数的结构是一个位列表。可调节的转换模式由比特列表中的几个比特表示。如果一个位被设置,那么相应的功能被激活。
Bit |
Value |
说明 |
#0 |
1 |
PG2000或AS1.3--字符串变量。 如果变量对象数据格式定义了一个i8或u8数组(1字节数组),那么在类型转换过程中,过程数据被视为一个单一的String类型的变量(VT=string)。在读取数据格式(访问类型POBJ_ACC_TYPE或事件POBJ_EVENT_DATAFORM)时,"String "将作为变量类型返回(例如实际数据格式="VT=i8 VL=1 VN=24" ->返回数据格式 "VT=string VL=24 VN=1")。设置CM=1应该在进程对象中进行。如果只在链接对象中指定CM=1,则会进行相应的类型转换,但在读取数据格式时,会返回实际数据格式。 这种转换模式适用于 "老 "PG2000或AS 1.3应用程序。新的应用程序不应使用这种模式。相反,在PLC中还应将字符串变量定义为字符串变量。 |
#1 |
2 |
十进制模式。 定义了从字符串变量类型("VT=string")转换到变量类型Integer时,如何解释字符串内容。 如果没有十进制模式,字符串内容会被这样解释。 带有前导0的字符串被解释为八进制数字(例如:-077,0012)。 如果字符串以 "0x "或 "0X "开头,那么下面的位置就解释为十六进制(例如:0x1f, -0x56a9, 0xA3)。 在所有其他情况下,字符串内容被解释为十进制。 如果十进制模式被激活(CM=2),那么字符串的内容总是被解释为十进制。 |
#2 |
4 |
值范围监测。 如果值范围监控被激活(CM=4),在类型转换过程中,将检查过程数据是否可以被表示。对违反数值范围的情况进行监控。如果发生,写入时报告错误12014,读取时返回可以表示的最大或最小的值。 |
#3 |
8 |
4/5舍入模式。 决定一个浮点变量类型应该如何转换为整数变量类型。 如果没有四舍五入模式,小数点右边的位置会被简单截断。(例如:1.3 -> 1, -15.5 -> -15, 0.9999 -> 0) 如果四舍五入模式被打开(CM=8),那么小数点右边的位置将被四舍五入。(例如:1.3 -> 1, -15.5 -> -16, 0.9999 -> 1) |
#4 |
16 |
总是用二进制的0(零)来结束字符串变量。 一个数据格式为 "VT=string VL=4 "的字符串变量最多可以包含4个字符。如果分配了字符串数据 "abcd",那么就不再有零终止的空间了。如果启用了 "零终止 "模式,那么在类型转换过程中,字符串变量将始终以二进制0终止。在上面的例子中,字符串变量将包含 "abc",一个二进制0将保持第四个位置。 |
CM参数的各个转换模式可以合并。例如。值范围监测+四舍五入模式的结果是CM=12(4+8=12)。