[西门子] 也许使用它会对KUKA编程有一个突破性的认识---$FCT_CALL。

[复制链接]
查看122 | 回复0 | 2024-8-7 14:52:28 | 显示全部楼层 |阅读模式
>

CWRITE 或 SWRITE 的格式规范具有以下结构:“%<FW.G>U”
F:格式化字符。可选的。
W:要输出的最小位置数。可选的。
G:精度规格
U:转换字符
例1:
整数变量 VI 的值以十进制和十六进制 ASCII 表示法传输。第一个 CWRITE 语句传送字符 123。第二个 CWRITE 语句传送字符 7B。
INT VI
VI=123
CWRITE(HANDLE,SW_T,MW_T,"%d",VI)
CWRITE(HANDLE,SW_T,MW_T,"%x",VI)
例2:

整数变量 VI 的值以二进制表示法传输:
INT VI
VI=123
CWRITE(HANDLE,SW_T,MW_T,"%r",VI)
例3:

使用“%r”格式,系统不检查变量或数组元素是否被初始化。为尚未初始化的数组元素传输随机值。
REAL VR[10]
CWRITE(HANDLE,SW_T,MW_T,"%r",VR[])
使用“%r”格式,系统不检查变量或数组元素是否被初始化。为尚未初始化的数组元素传输随机值。
例4:

数组的前五个数组元素以二进制表示法传输:
REAL VR[10]
CWRITE(HANDLE,SW_T,MW_T,"%.5r",VR[])
20 个字节以二进制表示。
例5:

传输直到第一个未初始化元素的所有数组元素:
CHAR VS[100]
CWRITE(HANDLE,SW_T,MW_T,"%s",VS[])
例6:

传输前 50 个数组元素:
CHAR VS[100]
CWRITE(HANDLE,SW_T,MW_T,"%s",VS[])
例7:

枚举常数的内部值以ASCII符号传输。相应的数字已转移:
DECL ENUM_TYP E
CWRITE(HANDLE,SW_T,MW_T,"%d",E)
例8:

两个 REAL 值与附加文本一起传输:
REAL V1,V2
V1=3.97
V2=-27.3
CWRITE(...,...,...,"value1=%+#07.3f value2=+#06.2f",V1,V2)
传输以下数据:
value1=+03.970
value2=-27.30


命令通道 $FCT_CALL 的功能
使用 CWRITE 调用命令通道 $FCT_CALL 的文件系统函数。调用时,函数参数必须作为 Var1 … Var10 传送到 CWRITE。此外,CWRITE 传输的写入模式必须是#SYNC。
默认情况下,函数访问的文件存储在本地目录C:\KRC\ROBOTER\UserFiles。存储在那里的文件的最大总大小限制为 10 MB,即存储在那里的所有文件的总大小不得超过此限制。也可以通过函数 krl_mount() 使用启用的网络驱动器。
可以从机器人解释程序或提交解释程序调用文件系统函数。不允许从一个解释器打开文件,然后从另一个解释器访问它,例如 写入或再次关闭文件。
错误处理
每个文件系统函数通过 CWRITE 提供一个返回值,可以在 KRL 程序中查询和评估。返回值指示函数是成功执行还是因错误而中止。
调用 CWRITE 时传递的变量 State.RET1 用于监控是否发生错误:
State.RET1= #DATA_OK:函数执行成功
State.RET1= #CMD_ABORT: 函数因错误而取消
在发生错误的情况下,返回的错误号可用于定位原因。使用变量 State.MSG_NO 轮询错误号。描述了每个功能的可能错误编号。




$FCT_CALL: 将字符写入文件



命令通道 $FCT_CALL 的管理号(句柄)
CWRITE() 函数可用于通过 $FCT_CALL 命令通道调用函数。变量本身是写保护的。
$FCT_CALL=Number
字符“a”将通过命令通道 $FCT_CALL 写入文件MyTest.TXT。如果文件已经存在,则在打开文件时删除文件的内容。
对于使用 CWRITE 的每个函数调用,都要进行检查以查看函数是成功执行还是因错误而中止。如果发生错误,可以根据错误原因编程相应的错误处理。如果没有发生错误,将写入字符并再次关闭文件.


krl_fopen()

打开一个文件
根据选择的模式,文件以文本文件或二进制文件的形式打开以进行读访问和/或写访问。可用模式对应于头文件 stdio.h 的 fopen() 函数。
在 KRL 程序中使用此功能最多可以同时打开 11 个文件。

krl_fopen(CHAR[] Name, CHAR[] Mode, INT  Handle <, BUFF_MODE_T Buffering> )
Mode
“r”
作为文本文件打开以进行读取访问
在这种模式下,一个文件可以连续打开多次(包括由机器人和提交解释器同时打开)而无需先关闭。在每种情况下都会返回一个不同的句柄。这些句柄中的每一个都必须在某个时候关闭,因为否则无法以不同的模式打开文件。
“w”
作为文本文件打开以进行写访问
在这种模式下,文件的内容在打开时被删除。如果他的文件不存在,则创建它。
“a”
作为文本文件打开以进行写访问
在这种模式下,文件的内容在打开时不会被删除;相反,写入的值被添加到文件的末尾。如果文件不存在,则创建它。
“rb”
作为二进制文件打开以进行读取访问
“wb”
作为二进制文件打开以进行写访问
“r+”
作为文本文件打开以进行读写访问
注意:打开文件后,文件指针指向文件的开头。为确保在将数据写入文件时不会覆盖任何内容,必须通过函数 krl_fseek() 将文件指针放在文件末尾。
例:

文件 ROBOTER\UserFiles\MyFile.txt 作为文本文件打开以进行读取访问:
CWRITE($FCT_CALL, State, Mode, "krl_fopen", "MyFile.txt", "r", FileHandle)
文件 ROBOTER\UserFiles\test\MyFile.txt 作为二进制文件打开,用于读写访问。如果该文件已存在,则删除该文件的内容。
如果文件不存在,则创建它:
CWRITE($FCT_CALL, State, Mode, "krl_fopen", "Test/MyFile.txt", "wb+", FileHandle)
MyFile.txt 文件作为文本文件打开,用于读取访问,无需在启用的网络驱动器上进行缓冲。名称为 Net1 的网络驱动器的挂载点必须首先通过 krl_mount() 创建:
CWRITE($FCT_CALL, State, Mode, "krl_fopen", "/Net1/MyFile.txt", "r",
FileHandle, #NO_BUFF)


krl_fclose()
关闭文件
该文件由传输的句柄明确确定。一旦文件被关闭,句柄就无效并且不能用于进一步的文件系统操作。
当文件关闭时,写入缓冲区的内容将写入文件。
krl_fclose(INT Handle)
文件通过文件句柄关闭:CWRITE($FCT_CALL, State, Mode, "krl_fclose", FileHandle)


krl_fputc()
将字符写入文件
文件中写入字符的点取决于打开文件的模式和文件指针的位置。
krl_fputc(INT Handle, CHAR Character)
字符“x”被写入句柄传输的文件中:CWRITE($FCT_CALL, State, Mode, "krl_fputc", FileHandle, "x")


krl_fputs()
将字符串写入文件
该函数可用于将常量字符串或可变字符串写入文件。如果使用变量,则 CHAR 数组的每个元素都必须初始化并包含一个有效值。
文件中写入字符串的点取决于打开文件的模式和文件指针的位置。
krl_fputs(INT Handle, CHAR[] String)
例:
一个常量字符串被写入到句柄传送的文件中:
CWRITE($FCT_CALL, State, Mode, "krl_fputs", FileHandle, "write this!")
将变量“StringVar[]”中包含的字符串写入句柄传送的文件中:
CWRITE($FCT_CALL, State, Mode, "krl_fputs", FileHandle, StringVar[])


krl_fwriteln()
将字符串逐行写入文件
该函数可用于将常量字符串或可变字符串写入文件。将行尾字符附加到要写入的字符串。如果使用变量,则 CHAR 数组的每个元素都必须初始化并包含一个有效值。
文件中写入字符串的行取决于打开文件的模式和文件指针的位置。
krl_fwriteln(INT Handle, CHAR[] String)
将一个空行写入句柄传输的文件中:
CWRITE($FCT_CALL, State, Mode, "krl_fwriteln", FileHandle, " ")


krl_fprintf()
将字符串格式化写入文件
要写入的格式作为字符串传送给函数。要写入的值也会被传送。
可用格式在头文件 stdio.h 的 fprintf() 函数的文档中列出。除了“%o”、“%p”、“%n”和列表“[List]”之外,所有格式都是允许的。
krl_fprintf(INT  Handle, CHAR[] Format, Par1,  …  , Par8)
由字符“;”分隔的 3 个值 被写入由句柄传输的文件并格式化:
CWRITE($FCT_CALL, State, Mode, "krl_fprintf", FileHandle, "%s;%x;%c", "Item1", 'HA0', CharVar)


krl_fsizeget()
确定文件大小,文件大小以字节为单位。此函数只能用于确定首先使用 krl_fopen() 打开的文件的大小。

krl_fsizeget(INT Handle, INT  Size )
由句柄传输的文件的大小被确定并写入变量“IntVar”:
CWRITE($FCT_CALL, State, Mode, "krl_fsizeget", FileHandle, IntVar)




例:
DECL INTHANDLE DECL STATE_T STAT DECL MODUS_T MODE
...
CHAR MYCHAR
...
MODE =#SYNC HANDLE = 0 MYCHAR = "a"
...
; 在 C:\KRC\ROBOTER\UserFiles 下创建一个文件
CWRITE($FCT_CALL, STAT, MODE,"krl_fopen", "MyTest.TXT", "w", HANDLE)
; 检查是否发生错误
IF (STAT.RET1 == #CMD_ABORT)THEN
IF (STAT.MSG_NO == -5) THEN
; 如果有很多文件已经打开,则错误处理...
ELSE
; 如果需要,检查其他错误代码
... ENDIF
ELSE
; 没有发生错误
; 将字符写入文件
CWrite($FCT_CALL, STAT, MODE, "krl_fputc",HANDLE, MYCHAR) IF (STAT.RET1 == #CMD_ABORT) THEN
; 错误处理
... ENDIF
; 关闭文件
CWRITE($FCT_CALL, STAT, MODE,"krl_fclose", HANDLE) IF (STAT.RET1 == #CMD_ABORT) THEN
错误处理
... ENDIF
ENDIF


------------------------------
KUKAVASS标准的电伺服应用。

FileWriter(FileName[]:IN,Filenumber:IN,firstEntry:IN,Par1:IN,Par2:IN,Par3:IN,Par4:IN,Par5:IN,Par6:IN,Par7:IN,Par8:IN,Par9:IN)
DECLSTATE_T state_te
DECLINT Offset , filenumber
DECLCHAR FileName[], targetFileName[67]
DECLREAL Par1,Par2
DECLREAL Par3,Par4,Par5,Par6,Par7,Par8,Par9
DECLBOOL firstEntry
DECLCHAR value[128]
DECLSTATE_T state
DECLMODUS_T mode
DECLINT FileHandle
value[] =" "
filehandle = 0
IF(VarState("Par1")<> #INITIALIZED)THEN
Par1 =-1
ENDIF
IF(VarState("Par2")<> #INITIALIZED)THEN
Par2 =-1
ENDIF
IF(VarState("Par3")<> #INITIALIZED)THEN
Par3 =-1
ENDIF
IF(VarState("Par4")<> #INITIALIZED)THEN
Par4 =-1
ENDIF
IF(VarState("Par5")<> #INITIALIZED)THEN
Par5 =-1
ENDIF
IF(VarState("Par6")<> #INITIALIZED)THEN
Par6 =-1
ENDIF
IF(VarState("Par7")<> #INITIALIZED)THEN
Par7 =-1
ENDIF
IF(VarState("Par8")<> #INITIALIZED)THEN
Par8 =-1
ENDIF
IF(VarState("Par9")<> #INITIALIZED)THEN
Par9 =-1
ENDIF
Offset=0
SWRITE(targetFileName[],STATE_TE,Offset,"%s_%d%s", FileName[],filenumber,".csv")
CWRITE($FCT_CALL, State, Mode,"krl_fopen", targetFileName[],"a",FileHandle)
Offset=0
IF(firstEntry == TRUE )THEN  
Offset=0
WAITFOR StrClear(value[])
SWRITE(value[],STATE_TE,Offset,"%s%d-%d-%d;%d:%d:%d","; ; ; ; ; ;; ; ; ; ", $DATE.YEAR,$DATE.MONTH,$DATE.DAY,$DATE.HOUR,$DATE.MIN,$DATE.SEC)
CWRITE($FCT_CALL, State, Mode,"krl_fwriteln", FileHandle, value[])
ENDIF
Offset=0
WAITFOR StrClear(value[])
WAITSEC 0.012
SWRITE(value[],STATE_TE,Offset,"%s;%4.4f;%4.4f;%4.4f;%4.4f;%4.4f;%4.4f;%4.4f;%4.4f;%4.4f","Value",par1,par2,par3,par4,par5,par6,par7,par8,par9)
WAITSEC 0.012
CWRITE($FCT_CALL, State, Mode,"krl_fwriteln", FileHandle, value[])
WAITSEC 0.1
CWRITE($FCT_CALL, State, Mode,"krl_fclose", FileHandle)
WAITSEC 0.1
END




大家有空可以试试吧!



-------------------END-----------------


每天进步一点点
Make small but daily progres


淘汰一个干部比干掉100个员工管用!任正非曾说:华为以前是末位淘汰制,后来发现末位淘汰的全是员工,把员工每个月干掉10%,发现没有用。后来改成每年淘汰10%的干部,不淘汰员工。这么做以后,他发现整个组织就变了,有一个好店长就会有一家好店,你光把那个电员弄得要死要活的,没有任何意义。所以董明珠说了一句话,淘汰一个干部比干掉100个员工管用,你认同吗?











免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则