从通道中读取数据。
CREAD从加载的LD_EXT_OBJ类型的外部模块读取数据。
无法从LD_EXT_FCT类型的外部模块或命令通道读取。
应用的例子: 在KRC1和外围数据(PC, 智能传感器...) 数据交换(读语句)。
INT类型的数据必须是Little Endian格式,并且前面必须有一个符号。
REAL类型的数据必须是IEEE 754标准格式的32位表示形式。
CREAD (Handle, State, Mode, TIMEOUT, OFFSET, Format, Var1 < ,
…, Var10 >)
“CREAD”语句用于从打开的通道中读取数据。在这有两个区别::
主动读入
程序请求通过通道进行输入。通道驱动器提出输入请求并将接受到的数据作为结果返回到CREAD语句 。
被动读入
预先确定的变量(INT$DATA_SER1orINT$DATA_SER2), 未被请求的数据到达后通过增加通道驱动器,每个通道都是这样的。当执行热启动或当打开/关闭通道时变量初始化为0。在系统等待读入请求的反馈信号方面也是有差别的:绝对的或有条件的。绝对的意思是系统等待直到通道给出请求的数据。在有条件的情况下,系统检查数据是否有效。
Handle
|
INT
|
由“COPEN”转移变量。注意:变量“$CMD ”将被拒绝
|
State
|
STATE_T
|
类型:STATE_T
自动返回CREAD的状态
|
Mode
|
MODUS_T
|
“MODUS_T”是列举类型,它有与下列“CREAD”有关的值:
ABS 激活读入通道。函数等待到通道产生一个可用的数据块或等待到“Timeout”失败。
COND 未被请求的通道读入。
SEQ 从以前被请求使用“ABS ”或“COND ”或作为 结果返回“CWRITE”的字节补偿读入完成了的数据块
|
Timeout
|
REAL
|
参数“TIMOUT”可被用于指定时间,在等待数据块失败之后。
Timeout的值0.0允许无止境的等待。.
一个值大于60 或是为负值,则数值是无效的。与系统有关的错误在等待时间内是是固有的。
|
Offset
|
INT
|
变量“Offset”用于指定被承认的数据中的字节数,在系统开始读入之前。
如果开始就读入,偏移量t必须设为0 (原点)。
“CREAD”语句不能分配所有被程序承认的数据变量,偏移量指定已经分配的字符数。
|
Format
|
CHAR[ ]
|
变量“Format”的类型“CHAR[ ] ”( 文字讯息) 包含产生了的文本格式。
变量结构主要符合“C ”语言 “FPRINTF”功能的格式。
|
Var
|
|
变量符合“Format”。
|
如果操作不是来于“COPEN”语句程序是被传送的 “CREAD” 语句或通道已经又再关闭,承认信息“INVALIDHANDLE” 被显示。
其它方式的规定或非初始化的变量导致一个被变量“STATUS ”发现错误 。如果读“ABS ”“COND ”成功,那么数据块的数据是先前被承认的,就像他们完全的读出。
文本是按照格式规定的程序段返回的。值决定被分配的适当的变量,系统检查值之否在任何区域有效。“变量FOMAT”转换支持由“Kernighan/Ritchie”指定的格式规定(C 语言1978),O,P,N,U和【list 】出外。
字符长度规范“H”和“L”不能使用。
只有9个格式参数可用于指定“CREAD”语句。如果几个变量是格式化可用到的,则必须在“# SEQ ”模式下读入。
系统不能区别大小写字符。在发生一个错误后读入失败( 不符合格式或无效的值) 。
转换字符“R”,当读入任何一个字节指定的字符长度次序 ( 与写入类似,例如“%2.5r”)或这所有字节在结束信息之前,他也同样传入。
不像其它格式,单独字节的读入必须被“%1r”明确规定。.
没有用“%c格式”指定宽度,这样的格式是不合格的。字节能被分配到INT ,REAL ,CHAR ,BOOL ,ENUM数据类型的变量或这种类型的一维数组。
假定整数数据类型出现在“little endian ”格式中,而且是有正负之分的。
Real 的数据类型在IEEE754 标准格式中用32位表示。
任何不等于0(zero) 的值可以被TURN 转换。
系统控制值是否被ENUM值允许。如果不是,读失败。ENUM开始为1 。
如果没有足够的格式数据,(例如%2.5r,但只有7位), 没有数据从格式读出,CREAD语句失败。被忽略的数据依然被READ 读取。.
变量的读就像变量装入一些字节一样。直到读准备好后重新启动。如果数组足够大但是数字用到的字节不是要素排列的倍数,那么多余的字节列在格式后或在下一个CREAD语句的左面读取。
通过“CREAD”调用下列更多的读取。字节数“%s” 或“%r 的格式指定首先读取实际上被状态变量返回的格式行。
所有其他的字长度不是确定的。因此用“%s”或“%r”格式只是一次“CREAD”调用格式行和重复。
如果“%s”或“%r”格式不在已经成功读取的格式之中( 看“HITS”的变量状态) ,“LENGTH” 的值在语句中不变。
使用中断读取
监控系统变量以确定数据是否可用于
读数:
$外部模块LD_EXT_OBJx的DATA_LD_EXT_OBJx
当接收到数据时,通道驱动器会增加系统变量。然后可以使用中断程序读取数据。
当执行热重启或打开或关闭通道时,变量将用0初始化。如果“保留数据”选项被激活,则变量不会重置。
带中断的示例
带有中断声明的主程序:
INTERRUPT DECL 10 WHEN $DATA_LD_EXT_OBJ2<>0 DO OBJ_INT ()
INTERRUPT ON 10
...
中断程序:
DEF OBJ_INT ()
DECL MODUS_T MODE
...
INTERRUPT OFF 10
WHILE ($DATA_LD_EXT_OBJ2<>0)
...
MODE=#COND
OFFSET=0
CREAD (HANDLE,..., MODE,...)
...
ENDWHILE
INTERRUPT ON 10
END
|