CWRITE
“CWRITE”語(yǔ)句能夠使文字寫(xiě)入打開(kāi)的通道,或者命令被寫(xiě)入命令通道。?應(yīng)用實(shí)例:? 數(shù)據(jù) ( 寫(xiě)語(yǔ)句) 在KRC1 和裝置間( PC, 智能傳感器...). ?轉(zhuǎn)換。?
CWRITE 將數(shù)據(jù)寫(xiě)入打開(kāi)的串行接口或加載的 LD_EXT_OBJ 類型的外部模塊。在加載的 LD_EXT_FCT 類型的外部模塊中,CWRITE 調(diào)用一個(gè)函數(shù)。
CWRITE 將命令寫(xiě)入命令通道。
CWRITE 觸發(fā)提前運(yùn)行停止。
CWRITE ( Handle or? $CMD,? State, Mode, Format, Var1 <, ..., Var10>)
Handle/$CMD
類型:INT
句柄:由 COPEN 傳輸?shù)?WRITE 的變量,用于標(biāo)識(shí)通道
$CMD:用于寫(xiě)入命令通道的預(yù)定義變量
State STATE_T
自動(dòng)返回到 WRITE 的狀態(tài)
Mode : Type: INT
類型:MODUS_T
寫(xiě)入模式, 必須初始化模式。
Format: Type: CHAR[]
在將 Var 變量寫(xiě)入字符串之前轉(zhuǎn)換它們。必須為每個(gè) Var 變量指定格式.
Var:
其數(shù)據(jù)寫(xiě)入字符串的變量。每個(gè)語(yǔ)句最多可以有 10 個(gè)變量。
寫(xiě)模式?Mode
寫(xiě)入模式由 MODUS_T 類型的變量確定。MODUS_T 是一個(gè)預(yù)定義的枚舉類型:
ENUM MODUS_T SYNC, ASYNC, ABS, COND, SEQ 對(duì)于 CWRITE,只有 SYNC 和 ASYNC 相關(guān):
SYNC同步
一旦伙伴控制器從接收緩沖區(qū)中取出傳輸?shù)臄?shù)據(jù),則認(rèn)為該語(yǔ)句已執(zhí)行。
ASYNC異步
寫(xiě)入 LD_EXT_FCT 類型的外部模塊時(shí),不允許 ASYNC 模式!
以下適用于所有其他通道:一旦數(shù)據(jù)到達(dá)伙伴控制器的接收緩沖區(qū),則認(rèn)為該語(yǔ)句已執(zhí)行。
優(yōu)于 SYNC:程序執(zhí)行速度更快。
與 SYNC 相比的缺點(diǎn):可能會(huì)丟失數(shù)據(jù)。
其他價(jià)值
如果模式具有 SYNC 或 ASYNC 以外的值,則默認(rèn)在 SYNC 模式下執(zhí)行寫(xiě)入。
State.RET1=#DATA_OK:函數(shù)成功執(zhí)行
State.RET1=#CMD_ABORT:功能已取消,但出現(xiàn)錯(cuò)誤
例如:
CWRITE($CMD,STAT,MODE,"RUN /R1/CELL ()")程序執(zhí)行CELL程序
$CMD
通過(guò)命令通道$ CMD進(jìn)行通信
CWRITE可以通過(guò)命令通道將語(yǔ)句傳輸?shù)匠绦蚪忉屍鳌J纠和ㄟ^(guò)RUN啟動(dòng)程序并使用STOP將其停止。
與命令通道$ CMD通信
命令通道:?jiǎn)?dòng)、停止和取消選擇程序
程序 A6.SRC 將通過(guò)命令通道啟動(dòng)、停止和取消選擇。這是通過(guò) SUB 文件中的以下程序行來(lái)完成的。
DECL STATE_T STAT?
DECL MODUS_T MODE?
MODE=#SYNC?
...?
;選擇程序A6()
;要啟動(dòng)程序,請(qǐng)單擊“開(kāi)始”按鈕或
;需要外部啟動(dòng)信號(hào)
IF $FLAG[1]==TRUE THEN?
CWRITE($CMD,STAT,MODE,"RUN/R1/A6()")??運(yùn)行程序
$FLAG[1]=FALSE?
ENDIF?
;stop program A6()
IF $FLAG[2]==TRUE THEN?
CWRITE($CMD,STAT,MODE,"STOP 1")??程序停止
$FLAG[2]=FALSE?
ENDIF?
;cancel program A6()?
IF $FLAG[3]==TRUE THEN?
CWRITE($CMD,STAT,MODE,"CANCEL 1") 退出程序
$FLAG[3]=FALSE?
ENDIF
哪個(gè)變量的格式?
一方面,CREAD和SREAD以及CWRITE和SWRITE的格式使用相同。
對(duì)于大多數(shù)數(shù)據(jù)類型,有幾種允許的格式,例如CHAR數(shù)組的“%s”和“%1.
對(duì)于數(shù)組,規(guī)范“Z”可用于定義要考慮的數(shù)組元素的數(shù)量。如果沒(méi)有為“Z”指定值,則考慮所有數(shù)組元素。進(jìn)程在第一個(gè)未初始化的值處被中止。格式r是一個(gè)例外。在這種情況下,進(jìn)程不會(huì)中止。相反,為尚未初始化的變量或數(shù)組元素輸出隨機(jī)值。
CREAD或SREAD的格式規(guī)范具有以下結(jié)構(gòu):“%
數(shù)組的格式規(guī)范具有以下結(jié)構(gòu):“%
W要讀取的最大字符數(shù)。可選擇的
Z要寫(xiě)入的數(shù)組元素?cái)?shù)。可選擇的
U轉(zhuǎn)換字符
CWRITE/SWRITE的“格式”變量
CWRITE或SWRITE的格式規(guī)范具有以下結(jié)構(gòu):“%
數(shù)據(jù)類型BOOL
每個(gè)不等于零的值都轉(zhuǎn)換為T(mén)RUE
數(shù)據(jù)類型ENUM
系統(tǒng)檢查該值是否為允許的ENUM值。如果不是,讀取將中止。第一個(gè)ENUM常量的值為1。
陣列的格式規(guī)范
如果沒(méi)有足夠的數(shù)據(jù)可用于滿足格式規(guī)范(例如“%2.5r”,但只有7個(gè)字節(jié)),則此格式不讀取任何內(nèi)容,CREAD語(yǔ)句將中止。忽略的數(shù)據(jù)仍然可以讀取。
Format %r
只能讀取變量所能容納的字節(jié)數(shù)。其余的仍然可以閱讀。如果數(shù)組足夠大,但字節(jié)數(shù)不是數(shù)組元素大小的倍數(shù),則冗余字節(jié)仍可用于讀取(對(duì)于以下格式或下一個(gè)CREAD語(yǔ)句)。
語(yǔ)句“CWRITE”使文本能夠?qū)懭氪蜷_(kāi)的通道或命令能夠?qū)懭朊钔ǖ馈?
“ Mode”的值寫(xiě)入命令通道的無(wú)關(guān)。如果“Mode”是非初始化的變量,那么語(yǔ)句失敗而且在變量“Status ”中放置錯(cuò)誤標(biāo)記。?
如果“Mode”有一個(gè)除SYNC 或ASYNC以外的值,那么數(shù)據(jù)在SYNC 模式下寫(xiě)入通道。?
變量格式的轉(zhuǎn)換規(guī)定有以下構(gòu)造:?
%FWGU?
下面定義的應(yīng)用:?
? F ??格式字符+,-,# ,etc,( 可選) 。?
? W? ?寬度,指定輸出的最小字符數(shù)(可選)?
? G? ? 精度,它的意義是由字符轉(zhuǎn)化決定’ . ’ 或’ *’ 或’ 整數(shù)’ 可以被使用( 可選).?
? U ??允許轉(zhuǎn)換的字符:c,d ,e,f ,g ,I,s,x 和%。系統(tǒng)不能區(qū)別大小寫(xiě)。?
給上面增加轉(zhuǎn)換字符( 相應(yīng)于”“C” 中的“FPRINTF) ,字符“r”是也可能用到的。?
格式變量“%r”使它的變量值不使用ASCII但使用二進(jìn)制符號(hào)。由于“%r”,系統(tǒng)不能檢查變量或排列元素是否經(jīng)過(guò)初始化。?
依靠輸入的寬度(“%2r”),你可以指定多少字節(jié)的值會(huì)被延長(zhǎng)或壓縮。REAL的值出外。?
當(dāng)數(shù)值被壓縮,高位字節(jié)被忽略;值通過(guò)在結(jié)尾增加原點(diǎn)位來(lái)延長(zhǎng)? (little endian format)? 。?
如果寬度沒(méi)有指定,固有的顯示輸出:? INTEGER ,REAL 和ENUM 4 個(gè)字節(jié),BOOL 和CHAR ?1 個(gè)字節(jié)。?
精度僅僅能被數(shù)組指定和循環(huán)數(shù)解釋。與數(shù)組元素的相應(yīng)的數(shù)能在開(kāi)始時(shí)就被輸出。如果循環(huán)的數(shù)字比數(shù)組排列的更多,那么沒(méi)有數(shù)組元素寫(xiě)入而且輸出失敗。?
“* ”不能指定精度。如果值的精度被省略,數(shù)組全部寫(xiě)入。?
“ Var1”,...,“VarN ” 可能不是結(jié)構(gòu)類型或數(shù)組的結(jié)構(gòu)類型的變量( 包括像 “ POS ” 的結(jié)構(gòu)) 。類型在下表的運(yùn)行時(shí)間內(nèi)檢查一致性。?
如果類型是不兼容的或者系統(tǒng)遇到的第一個(gè)值是未初始化的,那么轉(zhuǎn)換失敗(除了“%r”的場(chǎng)合)。不輸出錯(cuò)誤信息。?
“CWRITE”語(yǔ)句被用程序控制或機(jī)器人移動(dòng)控制觸發(fā)先前停止的運(yùn)行。
首先寫(xiě)入數(shù)組名R[ ]的5 個(gè)值?
首先寫(xiě)入數(shù)組名為R[ ]”的5 個(gè)值,因?yàn)閿?shù)組還沒(méi)有被初始化的值而產(chǎn)生任意的值。?
REAL R[10]?
%.5R,R[ ] ;發(fā)送20位二進(jìn)制的數(shù)據(jù)?
輸出所有數(shù)組元素的值?
下面的語(yǔ)句用于輸出所有數(shù)組元素的值:?
REAL R[10]?
%R,R[ ]?
輸出特定的數(shù)組元素?
輸出數(shù)組元素“S”,結(jié)尾用第一個(gè)為初始化的元素::?
CHAR S[100]?
%S,S[ ]?
首先寫(xiě)入50個(gè)數(shù)組元素S??
首先寫(xiě)入數(shù)組“S ”的50個(gè)數(shù),忽視初始化信息。?
CHAR S[100]?
%.50R,S[ ]?
寫(xiě)入兩個(gè)真實(shí)值的名字( 定義字符長(zhǎng)度)?
REAL W1,W2? ?
W1=3.97??
W2=-27.3?
CWRITE(..,..,..,”Value1=%+#07.3F Value2=+#06.2F”,W1.W2)? ?
;發(fā)送數(shù)據(jù): Value1=+03.970 Value2=-27.30?
轉(zhuǎn)換示例:
例子1
整數(shù)變量 VI 的值以十進(jìn)制和十六進(jìn)制 ASCII 表示法傳輸。第一個(gè) CWRITE 語(yǔ)句傳輸字符 123。第二個(gè) CWRITE 語(yǔ)句傳輸字符 7B。
INT VI
VI=123
CWRITE(HANDLE,SW_T,MW_T,"%d",VI)
CWRITE(HANDLE,SW_T,MW_T,"%x",VI)
例子2
整數(shù)變量 VI 的值以二進(jìn)制表示法傳輸:
INT VI
VI=123
CWRITE(HANDLE,SW_T,MW_T,"%r",VI)
例子3
傳輸數(shù)組的所有數(shù)組元素:
REAL VR[10]
CWRITE(HANDLE,SW_T,MW_T,"%r",VR[])
使用“%r”格式時(shí),系統(tǒng)不會(huì)檢查變量或數(shù)組元素是否已初始化。為尚未初始化的數(shù)組元素傳輸隨機(jī)值。
例子4
數(shù)組的前五個(gè)數(shù)組元素以二進(jìn)制表示法傳輸:
REAL VR[10]
CWRITE(HANDLE,SW_T,MW_T,"%.5r",VR[])
20 個(gè)字節(jié)以二進(jìn)制表示法傳輸。
例子5
傳輸直到第一個(gè)未初始化元素的所有數(shù)組元素:
CHAR VS[100]
CWRITE(HANDLE,SW_T,MW_T,"%s",VS[])
例子6
傳輸前 50 個(gè)數(shù)組元素:
CHAR VS[100]
CWRITE(HANDLE,SW_T,MW_T,"%s",VS[])
例子7
ENUM 常量的內(nèi)部值以 ASCII 符號(hào)傳輸。對(duì)應(yīng)號(hào)碼轉(zhuǎn):
DECL ENUM_TYP E
CWRITE(HANDLE,SW_T,MW_T,"%d",E)
例子8
兩個(gè) REAL 值與附加文本一起傳輸:
REAL V1,V2
V1=3.97
V2=-27.3
CWRITE(...,...,...,"value1=%+#07.3f value2=+#06.2f",V1,V2)
傳輸以下數(shù)據(jù):
value1=+03.970
value2=-27.30
CWRITE和命令界面
CELL.SRC可通過(guò)CWRITE語(yǔ)句和RUN從SPS.SUB程序中選擇。呼叫僅在冷啟動(dòng)時(shí)生效。
CWRITE可以通過(guò)命令通道$CMD將語(yǔ)句傳輸?shù)浇忉屍鳌3藱C(jī)器人口譯員和系統(tǒng)提交外,擴(kuò)展提交也可在多提交模式下用于此目的。
與單一提交模式相比,以下命令的含義發(fā)生了變化:
RUN[口譯員ID]
STOP[口譯員ID]
重置[口譯員ID]
取消[口譯員ID]
口譯員ID:
0:所有提交口譯員
1:機(jī)器人翻譯
2:系統(tǒng)提交解釋器
3:擴(kuò)展提交解釋器1
4:擴(kuò)展提交解釋器2
…
9:擴(kuò)展提交解釋器7
此外,RUN還擴(kuò)展了可選元素[>口譯員ID]。
CWRITE ($CMD, STAT, MODE, "RUN/R1/CELL()")
單次提交模式下的行為:
啟動(dòng)程序CELL()。由于CELL()是一個(gè)SRC程序,因此它在機(jī)器人解釋器中啟動(dòng)。
多提交模式下的行為:
與單次提交模式相同。該程序行可用于系統(tǒng)提交或擴(kuò)展提交。
CWRITE ($CMD, STAT, MODE, "RUN/R1/SPS()")
單次提交模式下的行為:
啟動(dòng)程序SPS()。由于SPS()是一個(gè)SUB程序,它在系統(tǒng)提交解釋器中啟動(dòng)(=僅在單次提交模式下提交解釋器)。
多提交模式下的行為:
啟動(dòng)程序SPS()。由于SPS()是SUB程序,它在系統(tǒng)提交解釋器中啟動(dòng)。
CWRITE ($CMD, STAT, MODE, "STOP 0")
這個(gè)程序行只在機(jī)器人程序中有意義。
單次提交模式下的行為:
停止系統(tǒng)提交解釋器。
多提交模式下的行為:
停止所有正在運(yùn)行的提交解釋器。
CWRITE ($CMD, STAT, MODE, "CANCEL 0")
單次提交模式下的行為:
取消選擇系統(tǒng)提交解釋器。
多提交模式下的行為:
取消選擇所有提交的口譯員。
CWRITE ($CMD, STAT, MODE, "RUN/R1/MySubProg() > 5")
在單次提交模式下不允許使用此語(yǔ)句。
多提交模式下的行為:
如果MySubProg()是SUB程序,它將從擴(kuò)展的submit 3開(kāi)始。
該程序行可用于其他提交解釋器或機(jī)器人程序。
編輯:黃飛
?
評(píng)論
查看更多