Professional Documents
Culture Documents
2
3
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.
Đâ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.
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.
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.
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.
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.
Đặt các giá trị MAXI, MINI và địa chỉ in out vào khối hàm.
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
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.
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.
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.
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
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.
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 đó.
Ở 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:
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.
Ví dụ:
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.
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
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.
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.
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
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.
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.
S := Start[2],
TV := TV[2],
R := Reset[2],
BI := Bin[2],
Q := Status[2]);
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.
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.
On ( //Start on delay
IN := Start2,
PT := Duration2);
Status2 := On.Q;
Tvalue2 := On.ET;
đ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)
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.
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.
//Up counter
BCD1 := S_CU(
C_NO := "Counter1",
CU := Up1,
S := Set1,
PV := PV1,
R := Reset1,
CV := bin1,
Q := Status1);
//Down counter
BCD2 := S_CD(
C_NO := "Counter2",
CD := Up2,
S := Set2,
PV := PV2,
R := Reset2,
CV := bin2,
Q := Status2);
//Up-down counter
BCD3 := S_CUD(
C_NO := "Counter3",
CU := Up3,
CD := Down3,
S := Set3,
PV := PV3,
R := Reset3,
CV := bin3,
Q := Status3);