一. IF. 如果。下面是一個起保停
IF #I_start AND NOT #I_stop THEN //如果I_start接通 和 I_stop沒有接通#Q_run := 1; //輸出Q_run 接通
ELSIF #I_stop THEN //如果I_stop接通#Q_run := 0; //。。。。。。
END_IF;
二. CASE
CASE #NUM OF1: // 如果NUM=1#Q_run_1 := 1;2..4: // 如果NUM = 2 到 4#Q_run_2 := 1;ELSE // 否則...#Q_run_1 := 0;#Q_run_2 := 0;
END_CASE;
三. for
1. 首次循環時,循環變量被賦起始值,然后執行代碼。結束后,循環變量的值與步值相
加,然后判斷是否超出結束值,如果沒有超出,則執行代碼;如果超出,則跳出FOR循環,繼續執行END_FOR后面的代碼。
注意以下幾點:
① 起始值與結束值在循環過程中不能更改;
② 步值可以是正數,也可以是負數,不能為0;
③ 如果步值是正數,則結束值要大于等于起始值;
④ 如果步值是負數,則結束值要小于等于起始值;
⑤ 如果沒有使用BY關鍵字指明步值,則默認為1
2. 如下圖所示,num一直到了6(1,2....6)。 但是內部的程序只執行了5次。
#sta_sum := 0;FOR #num := 1 TO 5 DO#sta_sum := #sta_sum + 2;END_FOR;// 0-2
// 2-4
// 4-6
// 6-8
// 8-10
四. 上升沿檢測 和 下降沿
1. 舉個例子:假設使用I0.0(變量名:start)連接的按鈕的上升沿來啟動某個電機。啟動
按鈕連接常開觸點,正常情況下I0.0的值為0,當按下按鈕時,I0.0的值為1;繼電器線圈連
接輸出地址Q0.0(變量名:motor),中間變量M0.0(變量名:interFlag)用來保存上升沿
的狀態。SCL程序代碼如圖8-3所示
"R_TRIG_DB_1"(CLK:=#start, // start----I0.0Q=>#P_Start); // P_Start--脈沖IF #P_Start THEN // 監控#P_Start 來控制輸出#Q_RUN := 1;
END_IF;
五. 定時器
以延時接通定時器為例
#T.T1(IN:=#start, // IN 啟動信號PT:=#TimeSET, // PT 設定值Q=>#Q_RUN, // Q 輸出ET=>#Q_ET); // ET 定時器當前值
六. 計數器(ctu加計數器為例)
七. 移動指令
1.?MOVE_BLK指令。?
(1). 該指令可以從一個存儲區地址拷貝一定數量的數據到另一個存儲區,拷貝的數據必須是
相同的數據類型.
(2).?MOVE_BLK指令移動的數據必須存放在數組中。
MOVE_BLK(IN:="數據塊_1".ARR_1[0], // 源數據中的第一個元素COUNT:=3, // 要拷貝的數據的個數OUT=>"數據塊_1".ARR_2[0]); // 目標數據中的第一個元素
2.?UMOVE_BLK: 指令與MOVE_BLK指令的參數及用法都相同。唯一不同的地方是:
UMOVE_BLK指令的執行過程不會被中斷,這使它很適合用于一些重要的、不希望被中斷的數據拷貝。
3.?FILL_BLK指令
該指令用指定的數據來填充存儲區中的某段區域,操作的目標是數組。
該指令有3個參數:
① IN:用來填充的數據,可以是整數、實數、字符、日期時間等數據類型。
② COUNT:要填充的數據個數,可以是USINT、UINT或者UDINT類型。
③ OUT:要填充的目標地址(數組)。
FILL_BLK(IN:=16#ff,COUNT:=10,OUT=>"數據塊_1".ARR_2[0]);
八. 轉換指令
1.?ROUND: 取整
// ROUND指令. 將[實數]四舍五入,變成[DINT]
"Tag_22" := ROUND(real#1.8); // 返回2
2.?CEIL : 向上取整
// CELL 向上取整 返回值:2
"Tag_22" := CEIL(real#1.1);