You are on page 1of 37

Lập trình S7-300

NGÔN NGỮ SCL

Châu Vĩnh Lợi Diễn đàn PLC Việt Nam


SIEMENS Automation plcvietnam.com.vn

STEP 7 in SCL (Structure Language Control)


1. Sơ lược về SCL
SCL (Ngôn ngữ điều khiển có cấu trúc) là ngôn ngữ lập trình cấp cao
dành cho SIMATIC S7 dựa trên Pascal. SCL thuận tiện cho việc lập trình các
thuật toán phức tạp và các tác vụ liên quan đến việc quản lí dữ liệu vùng nhớ.
Là ngôn ngữ cấp cao nên SCL gần gũi với tư duy của người lập trình, hỗ trợ bảo
mật tốt. Bên cạnh đó SCL cũng hỗ trợ việc lập trình cấu trúc theo dạng khối nên
dễ dàng kết hợp các ngôn ngữ khác khi viết chương trình (LAD, STL, FBD). Bạn
cần cài đặt gói phần mềm S7-SCL để có thể lập trình và đọc các chương trình
dạng SCL.
2. Trình biên dịch SCL
Một chương trình viết bằng SCL có thể có cấu trúc như sau:
Tất cả các khối được viết trong
Source file SCL, sau khi viết xong
chương trình bạn sẽ complie và
check lỗi. Nếu không có lỗi xảy
ra, trình dịch sẽ tự động tạo ra
các khối tương ứng đã viết trong
Source file đó.
Các khối chương trình có thể viết
trong Source file bao gồm
Function (FC), Function Block
(FB), Data Block (DB) và
Organization Block (OB). Thông
thường SCL không dùng để viết
cho OB mà chỉ dùng viết cho FC, FB và DB. Organization Block đóng vai trò như
là giao diện giữa người lập trình và các khối đã viết sẵn, người lập trình chỉ việc
gọi các khối có sẵn chèn vào OB.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 1


SIEMENS Automation plcvietnam.com.vn

3. Tạo và biên dịch Source file SCL


Sau khi tạo project và cấu hình phần cứng cho PLC, thực hiện theo các
bước sau để tạo một Source file SCL.

2
3

Chèn Source File SCL

Sau khi chèn xong bạn sẽ thấy SCL Source(1), bạn có thể click phải chọn
rename để đổi tên hoặc D-Click để mở nó lên.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 2


SIEMENS Automation plcvietnam.com.vn

Đây là cửa sổ chương trình S7-SCL, toàn bộ vùng trống phía dưới dùng để viết
chương trình.

Bạn hãy gõ lại đoạn chương trình sau vào cửa sổ S7-SCL.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 3


SIEMENS Automation plcvietnam.com.vn

Sau khi gõ xong đoạn chương trình trên, click compile để quá trình biên
dịch và kiểm tra lỗi được thực hiện. Kết quả biên dịch sẽ được hiển thị ở khung
bên dưới vùng viết chương trình.

Nếu kết quả là 0 Errors, và 0 Warning (s) thì nghĩa là bạn đã biên dịch thành
công. Kiểm tra lại các khối có trong project, giờ bạn sẽ thấy có thêm khối FC5
vừa được tạo ra.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 4


SIEMENS Automation plcvietnam.com.vn

4. Mô phỏng chương trình


Ở phần trước, bạn đã biết cách tạo và biên dịch chương trình SCL. Phần này
sẽ giúp các bạn kiểm tra chương trình có chạy đúng như ý muốn hay không.
Trước hết, hãy xem xét đoạn chương trình vừa viết. Đây là hàm FC5 (tên do
người dùng đặt) với các ngõ vào MAXI, MINI và IN; ngõ ra Delimiter. Hãy chú ý
đoạn:
IF IN > MAXI THEN Delimiter := MAXI;
ELSIF IN < MINI THEN Delimiter := MINI;
ELSE Delimiter := IN;
END_IF;

Giá trị đưa vào ngõ IN sẽ bị giới hạn trong khoảng từ MINI đến MAXI, ngõ
ra Delimiter sẽ là giá trị đưa vào IN sau khi bị giới hạn. Ví dụ nếu bạn có
MAXI=241 và MINI=50, với ngõ vào IN=25 bạn sẽ có ngõ ra là 50, với ngõ vào
IN=250 bạn sẽ có ngõ ra là 241, còn với ngõ vào IN=100 bạn sẽ có ngõ ra vẫn là
100.

Thực hiện các bước sau để tiến hành mô phỏng:

1
2

Click menu Option > Customize hoặc tổ hợp phím Ctrl+Alt+E để mở cửa sổ
tùy chỉnh. Sau đó chuyển sang tab Compiler và chắc chắn rằng bạn đã check
vào ô Create debug info. Click OK để chấp nhận thay đổi.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 5


SIEMENS Automation plcvietnam.com.vn

Click Compile để
biên dịch lại chương
1
trình. Mở khối OB1
chọn ngôn ngữ là LAD
để viết chương trình.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 6


SIEMENS Automation plcvietnam.com.vn

Kéo khối FC5 vừa complie vào OB1.

Đặt các giá trị MAXI, MINI và địa chỉ in out vào khối hàm.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 7


SIEMENS Automation plcvietnam.com.vn

Save chương trình lại và bật chế độ mô phỏng trong cửa sổ SIMATIC
Manager.

Tại cửa sổ chương trình PLCSIM, chúng ta sẽ đặt giá trị ngõ vào và quan sát
giá trị ngõ ra.

2
3
Enter

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 8


SIEMENS Automation plcvietnam.com.vn

Thực hiện các bước trên lần nữa để quan sát giá trị ngõ ra tại MW4 sau đó
trở lại cửa sổ SIMATIC Manager để download tất cả các khối xuống PLC.

Check vào ô RUN-P tại PLCSIM để chạy PLC.

Trở lại OB1, click Monitor On để quan sát khối hàm. Bạn sẽ thấy giá trị ngõ
ra hiện tại là 50 (bằng với mức MINI) do ngõ vào đang là 0. Bạn cũng có thể
xem các giá trị này tại cửa sổ PLCSIM.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 9


SIEMENS Automation plcvietnam.com.vn

Bây giờ hãy thay đổi giá trị của MW2 và quan sát giá trị ngõ ra tại MW4 để
chắc chắn rằng chương trình đã chạy đúng như yêu cầu. Tiếp theo ta sẽ quan
sát giá trị trực tiếp trên Source file, hãy mở cửa sổ S7-SCL và thực hiện tiếp như
hướng dẫn.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 10


SIEMENS Automation plcvietnam.com.vn

Click vào một vị trí bất kì ở trước câu lệnh “IF…..END_IF” để quan sát các
biến ở bên dưới.

Để kết thúc quan sát, hãy chọn Debug > Finish Debugging.

Như vậy, bạn đã hình dung được những công việc chính trong việc viết
chương trình bằng ngôn ngữ SCL từ các bước chèn Source file, viết chương

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 11


SIEMENS Automation plcvietnam.com.vn

trình và mô phỏng. Tiếp theo chúng ta sẽ nhắc lại một vài điểm cơ bản về phần
cứng của PLC như vòng quét chương trình và cách thức sắp xếp vùng nhớ bởi
vì đây sẽ là nền tảng lí thuyết quan trọng giúp bạn hiểu kĩ các phần sau.

5. Phần cứng PLC – Kiến thức cơ bản


5.1 Các thành phần cơ bản của PLC
CPU, Operating System: Đây là khối vi xử lý trung tâm và hệ điều
hành quản lý, điều khiển mọi hoạt động của PLC.
Program Memory là nơi lưu trữ chương trình của PLC bao gồm OB,
FB, FC.
IO Buffer (I/Q) là bộ nhớ ánh
xạ giá trị của các ngõ vào ra. IO
BUFFER
Storage: là vùng nhớ lưu trữ
bao gồm Timer, Counter,
Flag, DB…
Connection Manager là khối OTHERS STORAGE

quản lý kết nối của PLC (MPI, CPU


DP, PN…). OPERATING
SYSTEM
Others: Các ngoại vi khác
hoặc các module chức năng
đặc biệt (nếu có tích hợp).
CONNECTION PROGRAM
5.2 Vòng quét chương trình MANAGER MEMORY
PLC thực hiện chương trình
theo vòng quét liên tục, mỗi
vòng quét bao gồm các bước sau được thực hiện từ trên xuống:
 Chuyển giá trị từ các ngõ vào số sang vùng nhớ I.
 Chạy chương trình chính (OB1) từ dòng lệnh đầu tiên đến
hết dòng lệnh cuối cùng. Trong quá trình thực hiện, OB1 sẽ
gọi các khối có liên quan và cũng thực hiện các khối này từ
đầu đến cuối.
 Chuyển giá trị từ vùng nhớ Q sang các ngõ ra số.
 Truyền thông và kiểm tra lỗi.

Thời gian thực hiện một vòng quét không cố định mà phụ thuộc
vào số dòng lệnh và dữ liệu truyền thông bên trong vòng quét đó.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 12


SIEMENS Automation plcvietnam.com.vn

5.3 Sắp xếp vùng nhớ trong PLC


Dữ liệu kiểu Bool (Bit) sẽ gồm 2 trạng thái 0 và 1, 1 Byte có độ dài
8 bit, 1 Word có độ dài 2 Byte, 1 DWord có độ dài 2 Word.
0 ... 7 0 ... 7 0 ... 7 0 ... 7 0 ... 7 0 ... 7 0 ... 7 0 ... 7
MB0 MB1 MB2 MB3 MB4 MB5 MB6 MB7
MW0 MW2 MW4 MW6
MW1 MW3 MW5
MD0 MD4
MD1 MD5 Part
MD2 MD6 Part
MD3 MD7 Part

Ở cấp độ Bit, trong một Byte vùng nhớ, Bit cao của dữ liệu sẽ lưu
vào Bit cao của vùng nhớ, Bit thấp của dữ liệu sẽ lưu vào Bit thấp của
vùng nhớ.
Từ cấp độ Byte trở đi, trong một Word/DWord,
Byte/Word/DWord cao của dữ liệu sẽ lưu vào Byte/Word/DWord
thấp của vùng nhớ, Byte/Word/DWord thấp của dữ liệu sẽ lưu vào
Byte/Word/DWord cao của vùng nhớ. Bạn hãy xem ví dụ sau đây.
Một chuỗi Bit “1001 0100 1110 1001” được lưu vào MW2, đây là
vị trí các bit được lưu trong MW2:

M2.7 M2.0 M3.7 M3.0


1001 0100 1110 1001
MB2 MB3

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 13


SIEMENS Automation plcvietnam.com.vn

6. Kiểu dữ liệu trong SCL


Kiểu Tầm Độ dài
Bit Word
Bool true, false 1 -
Byte 0 -- 255 giá trị 8 -
Word 0 -- 65,535 giá trị 16 1
DWord 0 -- 4,294,967,295 giá trị 32 2
Char Biểu diễn được 255 kí tự 8 -
INT -32,768 -- 32,767 16 1
DINT -2,147,483,648 -- 2,147,483,647 32 2
Real Normalize: -3.402823x10+38 -- 32 2
-1.175494x10-38 ±0 +1.175494x10-38 --
+3.402823x10+38
Denormalize: -1.175494x10-38 --
-1.401298x10-45 and +1.401298x10-45 --
+1.175494x10-38
S5Time Đơn vị Giá trị 16 1
0 2 1
10 10 10 100
String 0 -- 254 kí tự 2032 127
Array Có thể lên đến 6 chiều, mỗi chiều tối đa
65536 phần tử

Trên đây là các kiểu dữ liệu thường dùng trong SCL. Ngoài ra S7-SCL
cũng cung cấp các hàm chuyển đổi giữa các kiểu dữ liệu giúp bạn thuận
tiện hơn trong việc lập trình. Ví dụ:
WORD_TO_INT(); INT_TO_WORD();
INT_TO_REAL(); REAL_TO_INT();
Bạn có thể tham khảo thêm tại bảng tóm tắt lệnh SCL ở cuối sách.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 14


SIEMENS Automation plcvietnam.com.vn

7. Cấu trúc chương trình


Khối OB FB FC
Kiểu ORGANIZATION_BLOCK FUNCTION_BLOCK Tên FUNCTION Tên: Kiểu giá dữ
liệu trả về (Nếu không khai
báo Output)
Tiêu đề TITLE=Tiêu đề TITLE=Tiêu đề TITLE=Tiêu đề
//Mô tả //Mô tả //Mô tả
NAME: Tùy chọn NAME: Tùy chọn NAME: Tùy chọn
FAMILY: Tùy chọn FAMILY: Tùy chọn FAMILY: Tùy chọn
AUTHOR: Tùy chọn AUTHOR: Tùy chọn AUTHOR: Tùy chọn
VERSION: Tùy chọn VERSION: Tùy chọn VERSION: Tùy chọn
KNOW_HOW_PROTECT KNOW_HOW_PROTECT KNOW_HOW_PROTECT
Khai báo VAR_INPUT VAR_INPUT
biến Tham số đầu vào: Kiểu; Tham số đầu vào: Kiểu;
END_VAR END_VAR
VAR_OUTPUT VAR_OUTPUT
Ngõ ra: Kiểu; Ngõ ra: Kiểu;
END_VAR END_VAR
VAR_IN_OUT VAR_IN_OUT
Tham số In-Out: Kiểu; Tham số In-Out: Kiểu
END_VAR END_VAR
VAR VAR
Biến Static: Kiểu; Biến tạm: Kiểu;
END_VAR END_VAR
VAR_TEMP VAR_TEMP VAR_TEMP
Biến tạm: Kiểu; Biến tạm: Kiểu; Biến tạm: Kiểu;
END_VAR END_VAR END_VAR
CONST CONST CONST
Hằng số: Giá trị; Hằng số: Giá trị; Hằng số: Giá trị;
END_CONST END_CONST END_CONST
Chương BEGIN BEGIN BEGIN
trình …Code; //Chú thích …Code; //Chú thích …Code; //Chú thích
… … …
Kết thúc END_ORGANIZATION_BLOCK END_FUNCTION_BLOCK END_FUNCTION

7.1 Kiểu khối:


Lưu ý đối với FC, khai báo như bảng mô tả, giá trị ngõ ra của hàm sẽ
được trả về qua Output của hàm đó. Nếu bạn trả về trực tiếp, bạn
cần khai báo kiểu dữ liệu trả về ngay sau khi khai báo tên hàm. Nếu
bạn trả về thông qua tham số ngõ ra, bạn khai báo kiểu dữ liệu trả về
của hàm là VOID.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 15


SIEMENS Automation plcvietnam.com.vn

Ví dụ:

Trả giá trị thông qua tham số ngõ ra

Trả giá trị trực tiếp qua ngõ ra của hàm

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 16


SIEMENS Automation plcvietnam.com.vn

7.2 Tiêu đề
Cho phép bạn thêm các dòng mô tả, chú thích cho khối hàm hoặc
thông tin của người viết…
Dòng KNOW_HOW_PROTECT cho phép bạn ẩn nội dụng của khối
hàm sau khi complie. Tất cả các nội dung từ dòng này trở về sau đề
sẽ bị ẩn sau khi complie.
7.3 Khai báo biến
Các loại biến trong SCL:
 Biến input: dùng để truyền tham số đầu vào
 Biến output: dùng để truyền tham số đầu ra
 Biến inout: có thể dùng với cả hai chức năng in và out
 Biến Static: Không bị mất giá trị sau khi khối hàm ngừng hoạt
động.
 Biến tạm: Bị mất giá trị khi khối hàm ngừng hoạt động
 Hằng số: dùng để khai báo hằng (ví dụ số pi: 3.14)

Khối FB được sử dụng cùng với khối DB đi kèm để lưu trữ giữ liệu
trong khi FC lại không có DB, chính vì vậy biến Static chỉ được dùng
trong FB. Mọi tham số vào ra, các biến Static của FB đều được lưu lại
trong DB tương ứng và có thể được truy cập từ ngoài khối hàm
thông qua DB này.

7.4 Chương trình


Chương trình được bắt đầu bằng dòng BEGIN và kết thúc bằng dòng
END tương ứng với khối đang viết. Các chú thích, mô tả được viết
sau dấu ‘//’. Mọi dòng lệnh bên phải dấu ‘//’ đều sẽ không được biên
dịch thành chương trình.
8. Các phép toán trong SCL
Cũng như Pascal và các ngôn ngữ lập trình khác, SCL hỗ trợ các phép
toán giúp bạn giải quyết các vấn đề lien quan đến việc xử lí dữ liệu, tính
toán, so sánh…. Sau đây là các phép toán và mức độ ưu tiên trong SCL:
Phép toán Tên Kí hiệu Ưu tiên
Số học Ngoặc () 1
Mũ ** 2
Cộng/trừ nhị +- 3
phân

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 17


SIEMENS Automation plcvietnam.com.vn

Nhân/chia, MOD, */ 4
DIV
Cộng/trừ +- 5
So sánh Nhỏ hơn, nhỏ <, <=, >=, > 6
hơn hoặc bằng,
lớn hơn hoặc
bằng, lớn hơn
Bằng, không bằng =, <> 7
Logic Đảo NOT 3
AND AND 8
XOR XOR 9
OR OR 10
Gán Gán := 11

9. Các lệnh cấu trúc trong SCL


9.1 Cấu trúc rẽ nhánh - IF
IF điều kiện THEN
Lệnh 1;
ELSE
Lệnh 2;
END_IF;
Nếu <điều kiện> được thỏa (hoặc bằng 1), <Lệnh 1> sẽ được thực hiện.
Nếu <điều kiện> không thỏa, <Lệnh 2> sẽ được thực hiện.

Bạn cũng có thể xét nhiều điều kiện, các trường hợp khác nhau một cách
tuần tự trong mệnh đề IF:
IF điều kiện 1 THEN
Lệnh 1;
ELSIF điều kiện 2 THEN
Lệnh 2;
ELSE
Lệnh 3;
END_IF;
Nếu <điều kiện 1> thỏa, <Lệnh 1> sẽ được thực hiện. Nếu <điều kiện 1>
không thỏa, xét tiếp điều kiện 2, <điều kiện 2> thỏa, <Lệnh 2> sẽ được
thực hiện. Nếu cả hai điều kiện trên đều không thỏa, <Lệnh 3> sẽ được
thực hiện.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 18


SIEMENS Automation plcvietnam.com.vn

Bạn cũng có thể chèn một mệnh đề IF khác bên trong mệnh đề IF (IF
lồng IF):
IF điều kiện 1 THEN
Lệnh 1;
IF điều kiện 2 THEN
Lệnh 2;
END_IF;
END_IF;
Nếu <điều kiện 1> thỏa, <Lệnh 1> sẽ được thực hiện. Nếu cả hai điều
kiện đều thỏa, <Lệnh 2> sẽ được thực hiện. Số lần END_IF phải bằng với
số câu lệnh IF đã sử dụng.

9.2 Cấu trúc rẽ nhánh - CASE


CASE biến OF
Giá trị 1: Lệnh 1;
Giá trị 2: Lệnh 2;
Giá trị n: Lệnh n;
ELSE Lệnh 0;
END_CASE;
Giá trị của <biến> sẽ được xét, với mỗi giá trị của <biến>, câu lệnh tương
ứng sẽ được thực hiện. Trường hợp không thỏa giá trị nào, <Lệnh 0> sẽ
được thực hiện.

Cấu trúc vòng lặp - FOR


FOR biến đếm:=giá trị bắt đầu
TO giá trị kết thúc
BY khoảng cách giữa hai giá trị kế tiếp
DO
Lệnh 1;
Lệnh 2;
Lệnh n;

END_FOR;
Các lệnh bên trong vòng lặp sẽ được thực hiện, số lần thực hiện được
xác định bởi <giá trị bắt đầu> và <giá trị kết thúc>. Sau mỗi vòng, <biến
đếm> sẽ được cộng thêm một lượng bằng với <khoảng cách giữa hai giá
trị kế tiếp> (mặc định là 1 nếu không khai báo), cuối mỗi vòng, giá trị
<biến đếm> sẽ được xem xét. Vòng lặp sẽ kết thúc khi <biến đếm> bằng

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 19


SIEMENS Automation plcvietnam.com.vn

với <giá trị kết thúc>. Tương đương với việc thực hiện lệnh trước và xét
điều kiện sau.

Cấu trúc vòng lặp - WHILE

WHILE điều kiện DO


Lệnh 1;
Lệnh 2;
Lệnh n;
END_WHILE;
Khi <điều kiện> vẫn còn thỏa, tất cả các lệnh bên trong vòng lặp sẽ được
thực hiện. <điều kiện> sẽ được xét ở đầu mỗi vòng lặp, khi điều kiện
không thỏa, vòng lặp sẽ kết thúc.
Cấu trúc vòng lặp - REPEAT
REPEAT
Lệnh 1;
Lệnh 2;
Lệnh n;
UNTIL điều kiện
END_REPEAT;
Tất cả các lệnh trong vòng lặp sẽ được thực hiện cho đến khi <điều kiện>
thỏa. <điều kiện> sẽ đươc xét cuối mỗi vòng lặp, khi điện thỏa, vòng lặp
sẽ kết thúc.
Lệnh CONTINUE
Lệnh CONTINUE dùng để bỏ qua vòng lặp hiện tại trong các cấu trúc
FOR, WHILE, REPEAT. Xét ví dụ sau:
FOR i:=0 TO 5 DO
FOR j:=0 TO 5 DO
IF (i<2) AND (j=1) THEN CONTINUE; END_IF;
Matrix[i,j]:=TRUE;
END_FOR;
END_FOR;
Giải thích: Nếu i<2 và j=1, vòng lặp FOR bên trong sẽ bị bỏ qua, câu lệnh
bên dưới mệnh đề IF (Matrix[i,j]:=TRUE) sẽ không được thực hiện. Sau
đó j sẽ tăng lên 1 đơn vị, các lệnh thuộc vòng lặp FOR bên trong lại được
thực hiện từ trên xuống, điều kiện lại được xét. Như vậy, câu lệnh bên
dưới mệnh đề IF chỉ được thực hiện khi điều kiện trên không thỏa.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 20


SIEMENS Automation plcvietnam.com.vn

Lệnh EXIT
Lệnh EXIT dùng để thoát khỏi vòng lặp FOR, WHILE, REPEAT ngay lặp tức.
Khác với lệnh CONTINUE, lệnh EXIT có tác dụng mạnh hơn, vòng lặp sẽ
kết thúc ngay cho đến khi nó được kích hoạt trở lại. Xét ví dụ sau:
FOR i:=0 TO 5 DO

FOR j:=0 TO 5 DO
IF (i<2) AND (j=1) THEN CONTINUE; END_IF;
Matrix[i,j]:=TRUE;
END_FOR;
END_FOR;
Giải thích: Nếu i<2 và j=1, vòng lặp FOR bên trong sẽ kết thúc, tất cả các
lệnh bên trong vòng lặp này sẽ không được thực hiện cho đến khi vòng
lặp được kích hoạt trở lại.

Lệnh RETURN
Lệnh RETURN dùng để thoát khỏi khối hàm hiện tại.

LỆNH GOTO
Lệnh GOTO dùng để nhảy đến một vị trí bất kì bên trong khối hàm được
xác định bởi nhãn LABEL. Xét ví dụ sau:
LABEL
LAB1, LAB2, LAB3, END;
END_LABEL;
GOTO CASE Selection DO;
1: GOTO LAB1;
2: GOTO LAB2;
3: GOTO LAB3;
ELSE GOTO End;
END_CASE;
LAB1: Lệnh 1;
GOTO End;
LAB2: Lệnh 2;
GOTO End;
LAB3: Lệnh 3;
GOTO End;
End: ;
Giải thích: Các lệnh tương ứng với từng nhãn sẽ được thực hiện tùy theo
giá trị của Selection.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 21


SIEMENS Automation plcvietnam.com.vn

10. Các hàm cơ bản


10.1 TIMER
Timer dùng để định trước một khoảng thời gian ngắn cho hệ
thống chạy, hoặc dừng, hoặc chuyển trạng thái này sang trạng thái
kia, tạo thời gian trể - delay cho hệ thống trước khi bắt đầu chu kỳ
mới....
10.1.1 Chuẩn SIMATIC
Step 7 cung cấp cho bạn 5 loại Timer theo chuẩn SIMATIC:
S_PULSE, S_PEXT, S_ODT, S_ODTS, S_OFFDT. Cả 5 loại Timer đều có
các cổng vào ra giống nhau:
(T_NO := , //Timer Number (Timer) INPUT
S := , //Set Timer (BOOL) INPUT
TV := , //Duration (S5TIME) INPUT
R := , //Reset Timer (BOOL) INPUT
BI := , //Current Time (WORD) OUTPUT
Q := ); //Status (BOOL) OUTPUT
T_NO: Chỉ số của Timer mà bạn đang sử dụng, ví dụ T0, T1…
S: Tín hiệu kích hoạt Timer.
TV: Thời gian cài đặt, ví dụ T#500ms.
R: Tín hiệu Reset Timer.
BI: Thời gian hiện tại.
Q: Ngõ ra Timer.
Giá trị trả về của Timer là giá trị thời gian hiện tại ở dạng BCD.
S_PULSE - Timer xung không nhớ.
Timer tạo xung không nhớ bắt đầu hoạt động khi có tín hiệu vào
cho phép Timer hoạt động. Nếu ngõ vào cho phép có thời gian duy
trì nhỏ hơn thời gian đặt trước cho timer (TEnable < TPV) thì ngõ ra của
Timer sẽ tạo ra một xung có thời gian bằng thời gian duy trì ngõ vào
(TEnable), nếu ngõ vào cho phép có thời gian duy trì lớn hơn hoặc bằng
thời gian đặt trước cho timer (TEnable > = TPV) thì timer sẽ tạo ra một
xung bằng thời gian được trước (TPV).

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 22


SIEMENS Automation plcvietnam.com.vn

//Starting a timer function as a pulse


BCD[1] := S_PULSE(
T_NO := "Timer1",
S := Start[1],
TV := TV[1],
R := Reset[1],
BI := Bin[1],
Q := Status[1]);

S_PEXT - Timer xung có nhớ.


Timer tạo xung có hoạt động tương tự như Timer tạo xung không
nhớ, cả hai timer đều tạo ra một xung khi có tín hiệu cho phép ngõ
vào hoạt động. Tuy nhiên, timer tạo xung có nhớ tạo ra xung có thời
gian bằng thời gian đặt cho dù ngõ vào cho phép có thời gian duy trì
nhỏ hơn thời gian đặt.

//Starting a timer function as an extended pulse


BCD[2] := S_PEXT(
T_NO := "Timer2",

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 23


SIEMENS Automation plcvietnam.com.vn

S := Start[2],
TV := TV[2],
R := Reset[2],
BI := Bin[2],
Q := Status[2]);

S_ODT - On Delay Timer.


On Delay Timer được sử dụng khi muốn cài đặt một khoảng thời
gian trễ khi ngõ vào được tác động và duy trì trạng thái cho phép thì
sau một khoảng thời gian đặt trước thì tiếp điểm của bộ định thì sẽ
chuyển trạng thái: tiếp điểm thường đóng sẽ mở ( mất điện) và tiếp
điểm thường mở sẽ đóng ( có điện). Nếu trạng thái ngõ vào kết thúc
cho phép thì tiếp điểm của bộ định thì sẽ trở về trạng thái ban đầu.

//Starting a timer function as an on delay


BCD[3] := S_ODT(
T_NO := "Timer3",
S := Start[3],
TV := TV[3],
R := Reset[3],
BI := Bin[3],
Q := Status[3]);

S_ODTS - On Delay Timer có nhớ.


On Delay Timer có nhớ bắt đầu hoạt động khi có tín hiệu ngõ vào
cho phép chuyển từ trạng thái 0 lên 1. Nếu giá trị đặt trước trả hết
giá trị thì tiếp điểm của timer sẽ chuyển trạng thái: thường đóng sẽ
mở ( mức 0) và thường mở sẽ đóng lại ( mức 1). Nếu ngõ vào cho
phép chuyển trạng thái từ 1 về 0 thì Timer vẫn tiếp tục trạng thái cho

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 24


SIEMENS Automation plcvietnam.com.vn

tới khi có tín hiệu reset Timer hoạt động. Nói cách khác, timer trễ
sườn lên có nhớ chỉ bị tác động đầu vào khi tín hiệu cho phép chuyển
trạng thái từ 0 lên 1, không ảnh hưởng của tín hiệu khi chuyển trạng
thái từ 1 xuống 0 do đó cần reset timer bằng lệnh reset.

//Starting a timer function as a latching on delay


BCD[4] := S_ODTS(
T_NO := "Timer4",
S := Start[4],
TV := TV[4],
R := Reset[4],
BI := Bin[4],
Q := Status[4]);

S_OFFDT - Off Delay Timer.


Off Delay Timer bắt đầu hoạt động khi ngõ vào cho phép chuyển
trạng thái từ 0 lên 1, đồng thời tiếp điểm của timer chuyển trạng
thái: tiếp điểm thường mở đóng lại (mức 1) và tiếp điểm thường
đóng mở ra (mức 0). Khi ngõ vào cho phép timer hoạt động chuyển
trạng thái từ 1 về 0 thì sau đó một khoảng thời gian ∆𝑡 đặt trước thì
trạng thái tiếp điểm của timer trở về trạng thái ban đầu: tiếp điểm
thường mở mở (mức 0) và tiếp điểm thường đóng đóng lại (mức 1).

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 25


SIEMENS Automation plcvietnam.com.vn

//Starting a timer function as an off delay


BCD[5] := S_OFFDT(
T_NO := "Timer5",
S := Start[5],
TV := TV[5],
R := Reset[5],
BI := Bin[5],
Q := Status[5]);
10.1.2 Chuẩn IEC
SCL hỗ trợ 3 Timer theo chuẩn IEC: TP, TON, TOF. Tất cả các loại
Timer chuẩn IEC đều có các cổng vào ra giống nhau:
Name( //Timer Type
IN:= , //Enable (BOOL) INPUT
PT:= ); //Duration (TIME) INPUT
Status:=Name.Q; //Status (BOOL) OUTPUT
Tvalue:=Name.ET; //Current Time (TIME) OUTPUT
Timer chuẩn IEC không trả về giá trị trực tiếp.

Timer tạo xung TP


Khi ngõ vào IN cho phép timer TP hoạt động, thì ngõ ra Q sẽ tạo ra
một xung bằng giá trị đặt trước PT cho timer. Khi giá trị hiện hành ET
bằng thời gian đặt PT thì kết thúc quá trình phát xung.

Lưu ý: trong thời gian timer hoạt động ngõ vào IN tác động không
ảnh hưởng tới timer TP.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 26


SIEMENS Automation plcvietnam.com.vn

Pulse ( //Start pulse timer


IN := Start1,
PT := Duration1);
Status1 := Pulse.Q;
Tvalue1 := Pulse.ET;

Timer tạo xung trễ sườn lên TON


Khi ngõ vào IN tác động và duy trì trạng thái cho phép timer TON
hoạt động, khi giá trị ET > PT thì ngõ ra Q sẽ đổi trạng thái lên mức 1.
Khi ngõ vào IN chuyển trạng thái từ 1 về 0 thì Timer TON kết thúc
hoạt động.

On ( //Start on delay
IN := Start2,
PT := Duration2);
Status2 := On.Q;
Tvalue2 := On.ET;

Timer tạo xung trễ sườn xuống TOF


Timer trễ sườn xuống bắt đầu hoạt động khi ngõ vào cho phép
chuyển trạng thái từ 0 lên 1, đồng thời tiếp điểm ngõ ra Q của timer
chuyển trạng thái: tiếp điểm thường mở đóng lại (mức 1) và tiếp

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 27


SIEMENS Automation plcvietnam.com.vn

điểm thường đóng mở ra (mức 0). Khi ngõ vào cho phép timer hoạt
động chuyển trạng thái từ 1 về 0 thì sau đó một khoảng thời gian ∆𝑡
đặt trước thì trạng thái tiếp điểm của timer trở về trạng thái ban
đầu: tiếp điểm thường mở mở (mức 0) và tiếp điểm thường đóng
đóng lại (mức 1)

Off ( //Start off delay


IN := Start3,
PT := Duration3);
Status3 := Off.Q;
Tvalue3 := Off.ET;

10.2 COUNTER
Counter là bộ đếm thực hiện chức năng đếm sườn xung các tín
hiệu đầu vào. Trong PLC S7 – 300 có tối đa 256 Counter theo chuẩn
SIMATIC (phụ thuộc CPU), được ký hiệu là Cx, trong đó x là số
nguyên trong khoảng 0 – 255, giá trị của bộ đếm nằm trong khoảng 0
÷ 999.
Những bộ đếm của PLC S7 – 300 có thể đồng thời đếm tăng lên
theo sườn lên của một tín hiệu, được ký hiệu là CU (Count Up) và
đếm giảm xuống theo sườn lên của tín hiệu, ký hiệu là CD (Count
Down).
Số sườn xung đếm được, được ghi vào thanh ghi 2 byte của bộ
đếm goi là thanh ghi C – word. Nội dung của thanh ghi C – word
được gọi là giá trị đếm tức thời của bộ đếm và ký hiệu là CV (Current
Value) và CV luôn không âm. Nếu CV ≠ 0 thì ngõ ra trạng thái Q có
giá trị 1. Ngược lại khi CV = 0, Q nhận giá trị 0. Bộ đếm không được
đếm xuống khi CV = 0.

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 28


SIEMENS Automation plcvietnam.com.vn

Khác với Timer, giá trị đặt trước PV của bộ đếm chỉ được chuyển
vào CV tại thời điểm xuất hiện sườn lên của tín hiệu set (S). Bộ đếm
có thể được xóa chủ động bằng tín hiệu reset (R). Khi bộ đếm được
xóa, cả CV và Q đều nhận giá trị 0.

10.2.1 Chuẩn SIMATIC


Tất cả các loại Counter chuẩn SIMATIC đều có các cổng vào ra
giống nhau:

(C_NO := , //Counter Number (COUNTER) INPUT


Cx := , //Clock Input (BOOL) INPUT
S := , //Set Counter (BOOL) INPUT
PV := , //Preset Value (WORD) INPUT
R := , //Reset Counter (BOOL) INPUT
CV := , //Current Value (WORD) OUTPUT
Q :=); //Status (BOOL) OUTPUT
Giá trị trả về của Counter là giá trị thời gian hiện tại ở BCD.

Counter đếm lên


Counter đếm lên được sử dụng khi muốn đếm giá trị tăng dần trong
một ứng dụng: số xung, sản phẩm,… Khi ngõ vào CU được tác động
chuyển trạng thái từ 0 lên 1 thì giá trị bộ đếm của Counter sẽ tăng
lên 1 và giá trị này sẽ được lưu trong CV dưới dạng interger (0 ≤ CV ≤
999), hoặc dưới dạng số BCD (CV_BCD). Khi ngõ vào S (SET) được tác
động (chuyển trạng thái từ 0 lên 1) thì giá trị của bộ đếm CV sẽ bằng
giá trị đặt trước PV, hay nói cách khác giá trị đặt trước PV (Preset
Value) sẽ được nạp vào CV và bộ đếm sẽ bắt đầu đếm từ giá trị đặt
trước đó. Giá trị của bộ đếm được đếm lại từ đầu (bắt đầu bằng 0)
khi ngõ vào R (Reset) được tác động. Trạng thái ngõ ra Q là 1 khi giá
trị của bộ đếm CV > 0, ngược lại CV = 0 thì ngõ ra Q sẽ bằng 0.

//Up counter
BCD1 := S_CU(
C_NO := "Counter1",
CU := Up1,
S := Set1,
PV := PV1,
R := Reset1,
CV := bin1,

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 29


SIEMENS Automation plcvietnam.com.vn

Q := Status1);

Counter đếm xuống


Counter đếm xuống được sử dụng khi muốn giảm giá trị của một số
đặt trước, đó có thể là: số xung, số sản phẩm,… Khi ngõ vào S (SET)
được tác động (chuyển trạng thái từ 0 lên 1) thì giá trị của bộ đếm
CV sẽ bằng giá trị đặt trước PV. Khi ngõ vào CD được tác động
chuyển trạng thái từ 0 lên 1 thì giá trị bộ đếm của Counter sẽ giảm
xuống 1. Giá trị của bộ đếm được đếm lại từ 0 khi ngõ vào R (Reset)
được tác động. Trạng thái ngõ ra Q là 1 khi giá trị của bộ đếm CV > 0,
ngược lại CV = 0 thì ngõ ra Q sẽ bằng 0.

//Down counter
BCD2 := S_CD(
C_NO := "Counter2",
CD := Up2,
S := Set2,
PV := PV2,
R := Reset2,
CV := bin2,
Q := Status2);

Counter đếm lên/xuống


Counter đếm lên/xuống là sự kết hợp giữa counter đếm lên và
counter đếm xuống. Nguyên lý hoạt động và cách sử dụng tương tự
hai loại counter trên.

//Up-down counter
BCD3 := S_CUD(
C_NO := "Counter3",
CU := Up3,
CD := Down3,
S := Set3,
PV := PV3,
R := Reset3,
CV := bin3,
Q := Status3);

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 30


SIEMENS Automation plcvietnam.com.vn

10.2.2 Chuẩn IEC


SCL hỗ trợ 3 Timer chuẩn IEC: CU, CD, CUD. Tất cả các loại Counter
chuẩn IEC đều có các cổng vào ra giống nhau:

Name ( //Counter Type


Cx :=, //Clock Input (BOOL) INPUT
R :=, //Reset Counter (BOOL) INPUT
PV :=); //Preset Value (INT) INPUT
Status:= Name.Q; //Status (BOOL) OUTPUT
Value:= Name.CV; //Current Value (INT) OUTPUT

Counter đếm lên


Khi có sự chuyển trạng thái từ mức 0 lên mức 1 tại chân CU thì giá trị
bộ đếm CV tăng lên 1. Trạng thái ngõ vào R bằng 1 thì giá trị bộ đếm
CV bằng 0 và ngõ ra Q bằng 0. Khi giá trị đếm được bằng hoặc lớn
hơn giá trị đặt trước (CV ≥ PV) thì ngõ ra Q bằng 1. Khối dữ liệu DB
được sử dụng để lưu trữ thông số cho các hàm đếm theo chuẩn IEC,
có thể khai báo và nạp giá trị cho CTU từ khối DB.
Up ( //Up counter
CU := Up4,
R := Reset4,
PV := Svalue4);
Status4 := Up.Q;
Value4 := Up.CV;

Counter đếm xuống


Khi có sự chuyển trạng thái từ mức 0 lên mức 1 tại chân CD thì giá trị
bộ đếm CV giảm xuống 1. Trạng thái ngõ vào R bằng 1 thì giá trị bộ
đếm CV bằng 0 và ngõ ra Q bằng 0. Khi giá trị đếm được nhỏ hơn
hoặc bằng 0 (CV ≤ 0) thì ngõ ra Q bằng 1. Khối dữ liệu DB được sử
dụng để lưu trữ thông số cho các hàm đếm theo chuẩn IEC, có thể
khai báo và nạp giá trị cho CTD từ khối DB.
Down ( //Down counter
CD := Down5,
R := Reset5,
PV := Svalue5);
Status5 := Down.Q;
Value5 := Down.CV;

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 31


SIEMENS Automation plcvietnam.com.vn

Counter đếm lên xuống


Counter đếm lên/xuống là sự kết hợp giữa counter đếm lên và
counter đếm xuống. Nguyên lý hoạt động và cách sử dụng tương tự
hai loại counter trên.
UpDown ( //Up-down counter
CU := Up6,
CD := Down6,
R := Reset6,
LOAD := Set6,
PV := Svalue6);
VStatus6 := UpDown.QU;
Status6 := UpDown.QD;
Value6 := UpDown.CV;

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 32


SIEMENS Automation plcvietnam.com.vn

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 33


SIEMENS Automation plcvietnam.com.vn

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 34


SIEMENS Automation plcvietnam.com.vn

Tài liệu tham khảo:


Automating with STEP7 in STL and SCL - Hans Berger
Lập trình PLC S7-300 - Trần Văn Hiếu (Trường TCN KTCN Hùng Vương)

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 35


SIEMENS Automation plcvietnam.com.vn

Châu Vĩnh Lợi – chauvinhloi@gmail.com Page 36

You might also like