官术网_书友最值得收藏!

4.2 運(yùn)行策略

運(yùn)行策略類似于窗口中的構(gòu)件,區(qū)別在于構(gòu)件看得見(jiàn),有視覺(jué)效果,而策略在執(zhí)行過(guò)程中是看不到的,相當(dāng)于人的靈魂一樣,在后臺(tái)指揮程序運(yùn)行。策略一般是通過(guò)點(diǎn)擊按鈕觸發(fā)或者通過(guò)條件觸發(fā),例如,每隔一定時(shí)間定時(shí)觸發(fā)、某個(gè)變量或表達(dá)式達(dá)到某個(gè)值觸發(fā)。策略的命名與變量類似,包括三個(gè)部分,即名字、類型和注釋,如圖4-4所示。啟動(dòng)策略、退出策略與循環(huán)策略都是系統(tǒng)固有的,用戶僅能進(jìn)行簡(jiǎn)單的修改,如改變循環(huán)執(zhí)行的時(shí)間周期。用戶策略由用戶根據(jù)需要通過(guò)點(diǎn)擊按鈕或菜單來(lái)完成,用戶策略的名字、執(zhí)行條件和功能注釋都可以自行開發(fā)和拓展,非常方便。可參考二維碼視頻講解。

圖4-4 程序中各運(yùn)行策略設(shè)計(jì)圖

本例中設(shè)置了“定時(shí)接收數(shù)據(jù)”“發(fā)送命令策略”和“設(shè)置串口參數(shù)策略”。

“定時(shí)接收數(shù)據(jù)”策略相當(dāng)于在一個(gè)定時(shí)器的作用下不斷觸發(fā),定時(shí)器會(huì)自動(dòng)復(fù)原,每隔一定時(shí)間觸發(fā)一次,程序便可執(zhí)行一次。

“發(fā)送命令策略”和“設(shè)置串口參數(shù)策略”為用戶自行定義的策略,雙擊圖4-3中的“設(shè)置串口參數(shù)”按鈕,彈出圖4-5所示“標(biāo)準(zhǔn)按鈕構(gòu)件屬性設(shè)置”界面,在“執(zhí)行運(yùn)行策略塊”前面打“√”,說(shuō)明點(diǎn)擊按鈕后執(zhí)行后面的策略,用戶可以在下拉列表中從已經(jīng)設(shè)置的所有策略中選擇需要的策略。

圖4-5 按鈕動(dòng)作與策略關(guān)聯(lián)窗口

4.2.1 設(shè)置串口參數(shù)策略

雙擊圖4-4中的“設(shè)置串口參數(shù)策略”,彈出如圖4-6所示的界面組態(tài)窗口,策略組態(tài)包括如下三個(gè)步驟。

圖4-6 設(shè)置串口參數(shù)策略

第一步,策略定義,點(diǎn)擊圖標(biāo),出現(xiàn)如圖4-7所示界面,這個(gè)界面可以定義策略的名字,如本例中為“設(shè)置串口參數(shù)策略”,后面可以通過(guò)引用這個(gè)名字實(shí)現(xiàn)對(duì)策略的執(zhí)行,窗口下方可以加入策略的注釋,完成對(duì)策略的基本描述。

圖4-7 策略執(zhí)行條件窗口

第二步,策略條件,點(diǎn)擊圖標(biāo),出現(xiàn)如圖4-8所示界面,該界面用于輸入條件表達(dá)式,表達(dá)式由變量及函數(shù)構(gòu)成,條件表達(dá)式的結(jié)果為真(非0)或假(0),根據(jù)條件表達(dá)式的值進(jìn)行邏輯判斷,例如,當(dāng)條件為真時(shí)執(zhí)行或當(dāng)條件為假時(shí)執(zhí)行,前面是表達(dá)式的計(jì)算,后面是表達(dá)式的邏輯。

圖4-8 策略執(zhí)行條件窗口

第三步,腳本編寫,點(diǎn)擊圖標(biāo),出現(xiàn)如圖4-9所示界面,此處可以輸入腳本語(yǔ)句,類似于VB的腳本語(yǔ)言,語(yǔ)法簡(jiǎn)單,而且可以通過(guò)快捷按鈕輸入,具有糾錯(cuò)功能,當(dāng)出現(xiàn)語(yǔ)法或變量未定義時(shí),系統(tǒng)提示錯(cuò)誤,并可以彈出自動(dòng)增加變量對(duì)話框,減輕了用戶的編程負(fù)擔(dān)。

圖4-9 策略執(zhí)行腳本窗口

腳本為用戶提供了很大的靈活性,一些無(wú)法用變量及動(dòng)作鏈接完成的任務(wù),可以通過(guò)編寫腳本指令實(shí)現(xiàn),本例中運(yùn)用系統(tǒng)提供的串口操作函數(shù),完成了串口的設(shè)置、打開、發(fā)送和接收,不需要任何硬件驅(qū)動(dòng)即可解決對(duì)串口的操作。

“設(shè)置串口參數(shù)策略”這段代碼中,關(guān)鍵是了解串口操作函數(shù)的使用,這里,可以看到有4個(gè)對(duì)串口參數(shù)進(jìn)行設(shè)置的基本函數(shù),即:

①!SetSerialBaud(CommNo,BaudRate)  設(shè)置串口波特率;

②!SetSerialDataBit(CommNo,DataBit)          設(shè)置串口數(shù)據(jù)位;

③!SetSerialStopBit(CommNo,StopBit)          設(shè)置串口停止位;

④!SetSerialParityBit(CommNo,ParityBit)         設(shè)置串口奇偶校驗(yàn)位。

由于BaudRate、DataBit、StopBit、ParityBit這4個(gè)變量與組態(tài)窗口的標(biāo)簽構(gòu)件相關(guān)聯(lián),用戶在界面中輸入相應(yīng)的值時(shí),根據(jù)串口實(shí)際通信參數(shù)進(jìn)行設(shè)置。

程序初始化時(shí),需要先將已經(jīng)設(shè)置好的參數(shù)保存,每次設(shè)定一個(gè)參數(shù),都要執(zhí)行相應(yīng)函數(shù),函數(shù)執(zhí)行結(jié)果會(huì)出現(xiàn)成功與失敗兩種情況,此處為了監(jiān)測(cè)設(shè)置是否成功,定義了跟蹤變量CommError1、CommError2、CommError3和CommError4。如果成功,對(duì)應(yīng)變量值為真;如果失敗,變量值為假。這4條設(shè)置參數(shù)指令只要有一條為假,則退出串口參數(shù)設(shè)置過(guò)程,說(shuō)明操作失敗。在MCGSE中對(duì)串口的操作不同于其他高級(jí)語(yǔ)言(VB、VC++等),其功能簡(jiǎn)單,可以使用的操作函數(shù)非常少,例如,只有設(shè)置串口參數(shù)函數(shù),卻沒(méi)有串口打開與關(guān)閉函數(shù),用戶只有利用現(xiàn)有的幾個(gè)函數(shù)實(shí)現(xiàn)串口的自由通信。下面是對(duì)應(yīng)“設(shè)置串口參數(shù)策略”的執(zhí)行腳本程序。可參考二維碼視頻講解。

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

  '保存串口參數(shù)
  CommNo.SaveDataInitValue( )
  BaudRate.SaveDataInitValue( )
  DataBit.SaveDataInitValue( )
  StopBit.SaveDataInitValue( )
  ParityBit.SaveDataInitValue( )
  '刷新到磁盤上
  !FlushDataInitValueToDisk( )
 
  '設(shè)定波特率
  CommError1=!SetSerialBaud(CommNo,BaudRate)
  IF CommError1<>0 THEN
   EXIT
  ENDIF
 
  '設(shè)定數(shù)據(jù)位
  CommError2=!SetSerialDataBit(CommNo,DataBit)
  IF CommError2<>0 THEN
   EXIT
  ENDIF
 
  '設(shè)定停止位
  CommError3=!SetSerialStopBit(CommNo,StopBit)
  IF CommError3<>0 THEN
   EXIT
  ENDIF
 
  '設(shè)定校驗(yàn)位
  CommError4=!SetSerialParityBit(CommNo,ParityBit)
  IF CommError4<>0 THEN
   EXIT
    ENDIF

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

4.2.2 發(fā)送命令策略

“發(fā)送命令策略”是直接向串口輸出一字符串,采用的命令是:

!WriteSerialStr(參數(shù)1,參數(shù)2)

函數(shù)意義:向串口寫一個(gè)字符串。

返 回 值:開關(guān)型。返回值=0:調(diào)用正常;返回值<>0:調(diào)用不正常。

參 數(shù) 1:開關(guān)型,串口號(hào),從1開始,串口1對(duì)應(yīng)1;

參 數(shù) 2:字符型,寫入的字符串。

實(shí)  例:!WriteSerialStr(1, "ABCDEFG")。

實(shí)例說(shuō)明:向串口1寫入字符串"ABCDEFG",括號(hào)必須為英文括號(hào)。

與這個(gè)函數(shù)功能相似的函數(shù)為:

!WriteSerial(參數(shù)1,參數(shù)2)

函數(shù)意義:向串口寫入一個(gè)字節(jié)。

返 回 值:開關(guān)型。返回值=0:調(diào)用正常;返回值<>0:調(diào)用不正常。

參 數(shù) 1:開關(guān)型,串口號(hào),從1開始,串口1對(duì)應(yīng)1;

參 數(shù) 2:開關(guān)型,寫入的字節(jié)。

實(shí)  例:!WriteSerial(1,255)。

實(shí)例說(shuō)明:向串口1寫入255。

!WriteSerialStr(參數(shù)1,參數(shù)2)與!WriteSerial(參數(shù)1,參數(shù)2)的不同之處在于參數(shù)2,前者為字符串型,后者為開關(guān)型。因此,向串口寫字符串時(shí)必須采用!WriteSerialStr(參數(shù)1,參數(shù)2)函數(shù),腳本程序如下所示。

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

  '發(fā)送一串字符串
    SendError=!WriteSerialStr(CommNo,!StrFormat("%s%s%s",SendStr,!I2Ascii(13),!I2Ascii(10)))
    IF SendError<>0 THEN
     EXIT
    ENDIF
    !beep()

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

4.2.3 定時(shí)接收數(shù)據(jù)

定時(shí)接收數(shù)據(jù)就是每隔一定時(shí)間便從串口讀入數(shù)據(jù),實(shí)際上是從串口輸入緩沖區(qū)取出數(shù)據(jù)放在MCGSE定義的變量中,由于計(jì)算機(jī)通信時(shí)間快,這里的時(shí)間間隔可以設(shè)為500ms或200ms等,本案例將其設(shè)為100ms,時(shí)間設(shè)得過(guò)短,串口會(huì)在沒(méi)有收到數(shù)據(jù)之前就進(jìn)入下一次循環(huán),浪費(fèi)CPU的工作效率,所以時(shí)間間隔的設(shè)置尤為重要。

從串口接收數(shù)據(jù)采用循環(huán)策略,如圖4-10~圖4-12所示,每隔100ms腳本程序執(zhí)行一次。首先判斷串口緩沖區(qū)內(nèi)是否有字符,如果有則繼續(xù)從串口讀;如果沒(méi)有,則退出本次循環(huán)。此處用到一個(gè)技巧,將每次讀上來(lái)的字符串進(jìn)行累加,讀串口函數(shù)采用的是!ReadSerialStr(串口號(hào)),讀上來(lái)的數(shù)據(jù)存在ReceiveStr中,可以理解為寄存,就是暫時(shí)存儲(chǔ)的意思,后面讀上來(lái)的數(shù)據(jù)會(huì)覆蓋以前的字符串。因此,需要另外一個(gè)變量AllRecStr保存舊的數(shù)據(jù),然后與新的數(shù)據(jù)進(jìn)行累加,這樣,新舊兩種字符串就會(huì)實(shí)時(shí)地顯示在標(biāo)簽構(gòu)件中,使用戶體會(huì)到數(shù)據(jù)在不斷地從串口讀進(jìn)來(lái),下面是完整的從串口接收數(shù)據(jù)的腳本代碼。

圖4-10 定時(shí)接收數(shù)據(jù)策略

圖4-11 定時(shí)接收數(shù)據(jù)策略時(shí)間設(shè)定窗口

圖4-12 定時(shí)接收數(shù)據(jù)策略表達(dá)式條件設(shè)定窗口

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

  '串口未正確打開則退出
  IF CommError1<>0 OR CommError2<>0 OR CommError3<>0 OR CommError4<>0 THEN
   EXIT
  ENDIF
 
  '串口中無(wú)可讀數(shù)據(jù)則退出
  IF !GetSerialReadBufferSize(CommNo)<=0 THEN
   EXIT
  ENDIF
 
  '從串口讀數(shù)據(jù)
  ReceiveStr=!ReadSerialStr(CommNo)
 
  '將讀入的數(shù)據(jù)加入到總字符串中
  AllRecStr=!StrFormat("%s%s",AllRecStr,ReceiveStr)
 
  EXIT

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

主站蜘蛛池模板: 太白县| 阿鲁科尔沁旗| 庐江县| 杭锦后旗| 区。| 望城县| 屏南县| 榆林市| 湘潭市| 河西区| 上虞市| 鹤庆县| 鄂伦春自治旗| 尼木县| 杭州市| 伊吾县| 桐城市| 米易县| 修水县| 六枝特区| 巢湖市| 长垣县| 儋州市| 道真| 饶平县| 西吉县| 江阴市| 大埔县| 南汇区| 交城县| 临潭县| 永年县| 金坛市| 乡城县| 泰来县| 翁牛特旗| 资中县| 济宁市| 乾安县| 白沙| 南召县|