Trang chủ Liên hệ

Ngôn ngữ lập trình ST/STL/STX (Structured Text) cho PLC

CÔNG TY TNHH THIẾT BỊ ĐO LƯỜNG VÀ ĐIỀU KHIỂN 03/02/2023

Mặc dù ngôn ngữ lập trình LAD là một ngôn ngữ lập trình dễ dành cho người mới bắt đầu, nhưng nó có thể hơi khó đọc và hiểu. Đó là lý do vì sao có rất nhiều người coi ST là một ngôn ngữ lập trình PLC tốt hơn, và bạn có thể tìm hiểu tất cả về nó trong bài chia sẻ này.

Ngôn ngữ lập trình PLC LD/LAD, FBD, ST/STL, SFC, IL, C/C++

Hầu như chúng ta rất khó xác định phần mở đầu và phần kết thúc trong một chương trình PLC lớn, phức tạp được viết bằng LAD (đặc biệt là đối với những người chưa có hoặc ít kinh nghiệm lập trình). Vì vậy, những gì có vẻ dễ học (đặc biệt đối với kỹ thuật viên và kỹ sư điện) không phải lúc nào cũng là ngôn ngữ tốt nhất để lập trình. Với chương trình LAD mà bạn viết ra, thì đối với bạn nó tương đối dễ hiểu, tuy nhiên khi đưa nó cho một kỹ sư, lập trình viên khác thì nó có thể sẽ khá là khó hiểu.

Đó là lý do, mà một ngôn ngữ lập trình PLC khác tốt hơn được sinh ra và phát triển. Đó là ngôn ngữ “Structured Text” hay được gọi tắt là ST hay STX hoặc STL (Structured Text Logic), tạm dịch ra tiếng việt là “văn bản có cấu trúc”.

Ngôn ngữ lập trình ST là gì?

Ngôn ngữ lập trình PLC ST / STL

ST là ngôn ngữ lập trình PLC được PLCOpen định nghĩa trong IEC 61131-3. Ngôn ngữ lập trình ST dựa trên dạng văn bản, còn LAD hay FBD là dựa trên dạng đồ họa.

Khi mới bắt đầu học lập trình PLC, có vẻ sẽ tốt hơn nếu sử dụng ngôn ngữ lập trình đồ họa để lập trình PLC. Tuy nhiên, theo quan điểm cá nhân, điều đó chỉ đúng với các chương trình PLC vừa và nhỏ, không quá phức tạp. Bằng cách sử dụng ngôn ngữ lập trình PLC dựa trên văn bản, chương trình của bạn sẽ chiếm không gian nhỏ hơn nhiều và luồng/logic sẽ dễ đọc và dễ hiểu hơn. Ví dụ, bạn có thể chia tỷ lệ đầu vào hoặc đầu ra analog của PLC chỉ với một dòng mã để đặt các cảnh báo cho giải pháp SCADA của bạn.

Một ưu điểm của ngôn ngữ lập trình ST là có thể kết hợp các ngôn ngữ lập trình khác nhau. Thậm chí có thể sử dụng các khối chức năng chứa các chức năng được viết bằng ngôn ngữ ST. Tuy nhiên, ST là một ngôn ngữ lập trình được chuẩn hóa và hiện tại thì không phải hãng PLC nào cũng hỗ trợ. Nó thường được các hãng sản xuất PLC lớn, phổ biến hỗ trợ (đặc biệt là của các hãng châu Âu) có thể kể đến như: Siemens, Rockwell, Mitsubishi, Schneider, Omron, Beckhoff, ABB,..

ST là ngôn ngữ lập trình cấp cao

Nếu bạn đã từng làm việc với các ngôn ngữ lập trình cấp cao như PHP, Python hay C, thì nó sẽ giúp bạn học ngôn ngữ ST một cách nhanh chóng và dễ dàng. Cú pháp của ngôn ngữ lập trình ST được phát triển trông giống như các cú pháp của những ngôn ngữ lập trình cấp cao như: vòng lặp, biến, điều kiện và toán tử.

Tuy nhiên, nếu bạn chưa bao giờ làm việc với một ngôn ngữ lập trình cấp cao thì ST sẽ có thể là một điểm khởi đầu tuyệt vời dành cho bạn để có thể biết và sử dụng được các ngôn ngữ và cú pháp đó. Bạn cần phải cân nhắc thêm trước khi chọn một ngôn ngữ lập trình để bắt đầu một quá trình nghiên cứu và học tập của mình. Đôi khi, xuất phát từ những ngôn ngữ lập trình đơn giản hơn sẽ có thể là một ý tưởng hay để bạn có thể hiểu hơn về các logic và PLC hoạt động.

Trước khi bạn quyết định nghiên cứu và học ngôn ngữ lập trình ST, bạn nên xem qua ví dụ chương trình PLC được viết bằng ngôn ngữ ST này.

1

2

3

4

5

6

7

8

9

10

PROGRAM stexample

  VAR

    x : BOOL;

  END_VAR

  x := TRUE;

  REPEAT

    x := FALSE;

  UNTIL x := FALSE;

  END_REPEAT;

END_PROGRAM;

Bạn hãy thử xem, nó có quen thuộc với bạn hay không? Bạn có biết hay đoán được các chức năng của mỗi dòng lệnh hay không? Từ đó hãy đưa ra quyết định và nghiêm túc, kiên nhẫn nghiên cứu, tìm hiểu, học tập nếu bạn chọn đồng hành với ngôn ngữ ST nhé!

Cấu trúc một chương trình ST

Đầu tiên bạn cần tìm hiểu về cấu trúc và cú pháp của chương trình ST. Khi bạn hiểu cấu trúc và cú pháp, bạn sẽ hiểu cách thức mà các dòng chương trình hoạt động.

Từ ví dụ ở trên, ta cũng có thể thấy được rằng một chương trình được bắt đầu bằng PROGRAM và kết thúc bằng END_PROGRAM. Mọi thứ nằm ở giữa là chương trình PLC của bạn.

Cấu trúc chương trình ST/STX (Structured Text)

END_PROGRAM ở đây không có nghĩa là kết thúc hoàn toàn. Khi PLC đến END_PROGRAM thì chu kỳ quyét của PLC sẽ bắt đầu lại và chương trình của bạn sẽ tự lặp lại.

Điều này cũng giống như LAD hoặc bất kỳ ngôn ngữ lập trình PLC nào khác – nó sẽ chạy đi chạy lại, lặp đi lặp lại nhiều lần. Nếu bạn đã từng lập trình vi điều khiển Arduino UNO thì PROGRAM/END_PROGRAM sẽ tương tự vòng lặp vô hạn trong C.

Lưu ý:

Khi bạn đang lập trình bằng ngôn ngữ ST, bạn thường sẽ không cần phải viết cú pháp PROGRAM/END_PROGRAM. Nó sẽ được thực hiện bởi phần mềm lập trình PLC và bạn chỉ cần phải viết những gì bạn muốn bên trong cấu trúc đó.

Việc phân luồng lập trình các chương trình PLC bằng ngôn ngữ ST cũng giống như LAD: được thực hiện từng dòng một.

Cú pháp của ST

Các cú pháp của một ngôn ngữ lập trình là những mã lệnh đã được mã hóa và được định nghĩa theo tiêu chuẩn của ngôn ngữ đó.

Như bạn có thể thấy trong ví dụ, ST chứa các dấu hai chấm, dấu chấm phẩy và các ký hiệu khác. Tất cả các biểu tượng này có một ý nghĩa và được sử dụng để thể hiện cho một cái gì đó. Một số trong số chúng là toán tử, một số là hàm, câu lệnh hoặc biến.

Chi tiết của những cú pháp sẽ được chúng tôi giải thích trong từng cú pháp cụ thể bên dưới. Tuy nhiên, ST có một số quy tắc chung về cú pháp mà bạn nên biết. Bạn không cần phải ghi nhớ tất cả những quy tắc cú pháp này ngay lập tức, tuy nhiên nó sẽ giúp ích cho bạn sau này:

  1. Tất cả các câu lệnh được chia bằng dấu chấm phẩy: ST bao gồm các câu lệnh và dấu chấm phẩy được sử dụng để phân tách chúng.
  2. Ngôn ngữ ST không phân biệt chữ hoa chữ thường: mặc dù việc sử dụng chữ hoa và chữ thường để dễ đọc, tuy nhiên điều này là không cần thiết.
  3. Dấu cách “spaces” không có chức năng: dấu cách không có chức năng gì trong ngôn ngữ ST, tuy nhiên chúng ta nên sử dụng nó để giúp chương trình dễ đọc hơn.

Điều quan trọng nhất cần hiểu là khi chúng ta viết chương trình PLC với ngôn ngữ ST thì máy tính sẽ dịch chương trình này sang ngôn ngữ mà PLC có thể hiểu được.

Khi tải chương trình lên PLC, phần mềm lập trình sẽ biên dịch chương trình. Điều này có nghĩa là nó sẽ dịch mã này sang một loại mã máy mà PLC có thể thực thi. Trình biên dịch sử dụng các cú pháp của ngôn ngữ lập trình để có thể hiểu được chương trình chúng ta viết ra.

Ví dụ: mỗi khi trình biên dịch thấy dấu chấm phẩy, nó sẽ biết rằng đã đến phần cuối của câu lệnh hiện tại. Trình biên dịch sẽ đọc mọi thứ cho đến khi nó chạm đến dấu chấm phẩy và sau đó sẽ thực thi câu lệnh đó.

Cú pháp bình luận (comment) trong ST

Trong ngôn ngữ lập trình ST, bạn có thể viết các văn bản mà chương trình không thực thi (không đọc) chúng. Tính năng này được sử dụng để đưa ra bình luận (chú thích hay nhận xét) trong chương trình.

Bình luận trong chương trình thực sự rất hữu ích, nếu bạn là người mới bắt đầu, bạn nên luôn sử dụng bình luận cho mỗi câu lệnh hay mỗi đoạn mã của mình. Sau này, nó sẽ giúp bạn hiểu những đoạn mã của mình dễ dàng hơn.

Trong ngôn ngữ ST, bạn có thể đưa ra bình luận một dòng hoặc nhiều dòng.

Một dòng bình luận:

1

// comment

Bình luận sau khi kết thúc một dòng lệnh:

<expression>; /* comment */

hoặc

<statement>; (* comment *)

Nhiều dòng bình luận:

1

2

3

/* start comment

...

end comment */

hoặc

1

2

3

(* start comment

...

end comment *)

Có nên bình luận mọi chi tiết?

Khi bạn dần trở nên tốt hơn hay thành thạo ngôn ngữ ST, bạn nên sử dụng ít bình luận hơn. Bởi vì sao? Chúng ta cùng tìm hiểu đằng sau một câu chuyện:

Một người học trò hỏi thầy của mình rằng: “Hôm trước, em có tìm hiểu thông tin về những bậc kỳ tài là lập trình viên, em thấy thông tin về một lập trình viên người Việt Nam được đứng trong top 10 những người lập trình viên xuất sắc trong lịch sử. Em mới tò mò tìm kiếm các chương trình mà anh ấy từng viết. Có rất nhiều chương trình mà anh ấy đã viết, nhưng kỳ lạ thay, những thông tin đưa tin về anh ấy đều nói rằng: anh ấy gần như không bao giờ thiết kế chương trình, chú thích trong chương trình hay chạy thử nghiệm chương trình của mình. Tuy nhiên, tất cả những người biết anh ấy đều coi anh ấy là một trong những lập trình viên giỏi nhất thế giới. Tại sao lại vậy ạ?”

Thầy của cậu học trò đáp: “người lập trình đó đã sống ở trong chương trình. Anh ấy đã vượt ra khỏi nhu cầu cần thiết kế; anh ta không trở nên tức giận khi hệ thống gặp sự cố, anh ta coi nó là niềm vui và bơi ở trong đó mà không cần quan tâm những thứ khác. Anh ấy đã vượt ra ngoài nhu cầu về chú thích, anh ta không còn quan tâm xem có ai đó khác nhìn thấy chương trình của mình tốt hay không tốt. Anh ấy đã vượt ra khỏi sự cần thiết của việc chạy thử nghiệm, bởi mỗi chương trình của anh ấy đều hoàn hảo, thanh thoát và trang nhã, chúng đã thể hiện rõ ràng mục đích. Thực sự, anh ta đã và đang sống trong nó”.

Mặc dù điều này có thể bạn chưa cần quan tâm, tuy nhiên bạn nên cố gắng viết những đoạn mã của mình dễ hiểu nhất có thể, ngay cả khi không dùng bình luận. Cách bạn có thể thực hiện việc này một cách đơn giản là bằng cách sử dụng những khoảng trắng để làm cho các mã lệnh dễ đọc hơn.

Tuy nhiên, hiện tại bạn không nên lo lắng về việc viết các bình luận, chú thích trong chương trình. Bạn là người mới bắt đầu, vậy hãy viết bao nhiêu tùy thích, miễn làm sao điều đó là tốt nhất với bạn.

Câu lệnh trong ST

Ngôn ngữ lập trình ST bao gồm các câu lệnh, vậy câu lệnh là gì?

Bạn có thể hiểu đơn giản câu lệnh trong ST cũng giống như câu lệnh đến từ phía bạn, hay từ phía cá nhân nào đó hoặc tổ chức nào đó. Và trong lập trình PLC, các câu lệnh gần như giống nhau. Một “câu lệnh” là bạn yêu cầu PLC phải làm gì. Hãy lấy câu lệnh đầu tiên làm ví dụ:

1

X: BOOL;

Trình biên dịch sẽ đọc đây là một câu lệnh bởi vì khi nó đến dấu chấm phẩy, nó biết rằng đây là phần cuối của câu lệnh đó. Hãy nhớ rằng, các câu lệnh được phân tách bằng dấu chấm phẩy. Đó là quy tắc cú pháp của ngôn ngữ này.

Trong câu lệnh này, bạn yêu cầu PLC tạo một biến có tên là X và biến này phải là kiểu BOOL.

Biến trong ST

Trước khi chúng ta tìm hiểu sâu hơn về các câu lệnh, chúng ta cũng quay lại các từ khóa mà chúng tôi đã đề cập trước đó. Bạn có thể thấy, biến X được xác định ở giữa hai từ khóa khác là VAR và END_VAR.

PROGRAM/END_PROGRAM và VAR/END_VAR đều là cấu trúc. Có nghĩa là chúng phân định một khu vực nhất định trong chương trình cho một chức năng hay cái gì đó cụ thể. Cấu trúc PROGRAM/END_PROGRAM là nơi chứa tất cả chương trình PLC và cấu trúc VAR/END_VAR là nơi xác định các biến.

Tất cả bốn từ khóa (PROGRAM, END_PROGRAM, VAR và END_VAR) được gọi là từ khóa vì chúng là những từ dành riêng. Bạn không thể sử dụng những từ đó cho bất kỳ điều gì khác khi bạn đang lập trình trong ST. Tên chương trình của bạn không được là PROGRAM hoặc thậm chí là program (ST/STL không phân biệt chữ hoa chữ thường), vì từ đó chỉ có thể được sử dụng để tạo một cấu trúc để phân tách chương trình PLC.

Tùy thuộc vào loại dữ liệu bạn muốn lưu trữ, có một số loại dữ liệu có sẵn. Các loại dữ liệu khác nhau được gọi là kiểu dữ liệu. Ví dụ: nếu bạn có một biến mà bạn muốn lưu trữ TRUE hoặc FALSE , bạn có thể khai báo nó dưới dạng kiểu BOOL. Kiểu BOOL là kiểu dữ liệu boolean có nghĩa là nó có thể chứa giá trị boolean (TRUE hoặc FALSE).

Một biến thì sẽ có một kiểu dữ liệu nhất định và chúng chứa một giá trị của kiểu dữ liệu đó. Nhưng có một điều nữa bạn có thể kiểm soát trong các biến của mình, đó là tên của biến.

Để giúp bạn dễ dàng sử dụng các biến trong suốt chương trình PLC của mình, tất cả chúng đều được đặt tên. Khi bạn xác định một biến trong cấu trúc VAR, bạn bắt đầu bằng cách đặt tên cho biến đó:

1

X: BOOL;

Câu lệnh này sẽ tạo một biến có tên là X, với kiểu dữ liệu BOOL.

Lưu ý rằng: khi bạn đang lập trình với một số phần mềm lập trình PLC như của Siemens hay Rockwell, bạn sẽ không sử dụng cấu trúc VAR / END_VAR cho đến khi khai báo các biến. Thay vào đó, các biến thường được gọi là thẻ (tag) hoặc ký hiệu và ngay cả khi bạn đang lập trình bằng ST, bạn vẫn có thể khai báo chúng một cách dễ dàng (như trong hình bên dưới) hoặc trong một khối hàm.

Biến (Variable), thẻ (tag) hoặc ký hiệu (Symbol) trong ST

Các biến thường được gọi là thẻ trong lập trình PLC. Trong phần mềm lập trình PLC Studio 5000 Logix Designer dành cho PLC của Allen Bradley (Rockwell), các biến được gọi là thẻ. Nhưng nếu bạn đang lập trình trong các phiên bản cũ hơn của phần mềm Lập trình SIMATIC STEP 7 cho PLC Siemens, các biến được gọi là ký hiệu. Trong các phiên bản mới hơn của STEP 7 (từ TIA Portal phiên bản 11), các biến được gọi là thẻ.

SIMATIC STEP 7 TIA Portal: các biến “variable” được gọi là thẻ “tag”

Không có vấn đề gì với cách gọi các biến, chúng luôn có cùng một chức năng. Và với phần mềm lập trình IEC 61131-3 như STEP 7, Codesys hoặc Studio 5000, các kiểu dữ liệu tiêu chuẩn sẽ luôn có sẵn.

Các kiểu dữ liệu trong ST

Tùy thuộc vào thương hiệu hãng PLC bạn đang sử dụng, bạn sẽ có một số kiểu dữ liệu khác nhau. Tất cả các kiểu dữ liệu tiêu chuẩn được xác định bởi tổ chức PLCOpen và chúng là một phần của ngôn ngữ lập trình PLC. Mọi phần mềm lập trình PLC với hỗ trợ ngôn ngữ lập trình ST đều có các kiểu dữ liệu này. Trong tiêu chuẩn IEC, các kiểu dữ liệu được chia thành hai loại: kiểu dữ liệu cơ sở và kiểu dữ liệu dẫn xuất .

Các kiểu dữ liệu cơ sở:

Trong mỗi kiểu dữ liệu cơ sở, có sẵn một số kiểu dữ liệu IEC . Đây là các kiểu dữ liệu được định nghĩa trong IEC 61131-3:

IEC Data Type Format Range
SINT Short Integer -128  127
INT Integer -32768  32767
DINT Double Integer -2^31  2^31-1
LINT Long Integer -2^63  2^63-1
USINT Unsigned Short Integer  255
UINT Unsigned Integer  2^16-1
LDINT Long Double Integer  2^32-1
ULINT Unsigned Long Integer  2^64-1
IEC Data Type Format Range
REAL Real Numbers

±10^±38

LREAL Long Real Numbers ±10^±308
IEC Data Type Format Use
TIME Duration of time after an event T#10d4h38m57s12ms
TIME#10d4h38m
DATE Calendar date D#1989-05-22
DATE#1989-05-22
TIME_OF_DAY Time of day TOD#14:32:07
TIME_OF_DAY#14:32:07.77
DATE_AND_TIME Date and time of day DT#1989-06-15-13:56:14.77
DATE_AND_TIME#1989-06-15-13:56:14.77
IEC Data Type Format Range
STRING Character String ‘My string’
IEC Data Type Format Range
BOOL Boolean 1 bit
BYTE Byte 8 bits
WORD Word 16 bits
DWORD Double Word 32 bits
LWORD Long Word 64 bits

Các kiểu dữ liệu dẫn xuất:

Các kiểu dữ liệu dẫn xuất là kiểu dữ liệu tùy chỉnh của riêng bạn. Tất cả các kiểu dữ liệu dẫn xuất được tạo bằng cách sử dụng cấu trúc TYPE và END_TYPE. Ở giữa các cấu trúc là kiểu dữ liệu dẫn xuất mà bạn muốn khai báo

Tất cả các kiểu dữ liệu này có vẻ hơi phức tạp vào lúc này. Đặc biệt nếu bạn chưa sử dụng ngôn ngữ lập trình dạng văn bản trước đây. Nhưng không cần phải lo lắng. Hiện tại, bạn chỉ cần nhớ một vài kiểu dữ liệu trong số chúng để bắt đầu lập trình với ST. Khi bạn trở nên tốt hơn và các chương trình của bạn phức tạp hơn, bạn sẽ dần tìm hiểu về nhiều kiểu dữ liệu hơn khi sử dụng chúng. Điều quan trọng ở đây là bạn không cần phải tiến lên quá nhanh. Bạn muốn hiểu đúng những điều cơ bản nhất,

Như bạn có thể thấy, các kiểu dữ liệu khác nhau có thể chứa các định dạng dữ liệu khác nhau và do đó có các giá trị khác nhau. Nhưng làm thế nào để bạn đặt các giá trị trong các biến? Và làm thế nào để bạn sử dụng các biến? Đó là với các biểu thức và toán tử sẽ giúp bạn thực hiện điều này.

Biểu thức và toán tử trong ST

Các toán tử được sử dụng để thao tác dữ liệu và là một phần của hầu hết mọi ngôn ngữ lập trình. Cũng giống như toán tử, biểu thức là một phần quan trọng của ngôn ngữ lập trình.

Một biểu thức là một cấu trúc, khi được sử dụng sẽ mang lại một giá trị. Điều này có nghĩa là khi trình biên dịch biên dịch một biểu thức, nó sẽ tính biểu thức và thay thế câu lệnh bằng kết quả. Ví dụ với hai biến A và B: A chứa giá trị là 10 và B chứa giá trị là 8. Khi ta sử dụng biểu thức A+B như sau:

1

A + B

Kết quả của biểu thức này là 18, vì vậy khi trình biên dịch biên dịch biểu thức A+B sẽ cho ra kết quả và đặt giá trị là 18 vào.

Một biểu thức bao gồm các toán tử và toán hạng. Vậy toán tử và toán hạng là gì?

Theo ví dụ biểu thức trên “A+B”, ta thấy biểu thức này có hai toán hạng là A và B và một toán tử là “+”. Biểu thức này nó đang lấy giá trị của biến A và thêm nó vào giá trị của biến B. Dấu “+” còn được gọi là toán tử cộng vì đây là phép toán “cộng”.

Các toán tử trong ST

Có một số toán tử có sẵn trong ST và IEC 61131-3 mô tả tất cả các toán tử tiêu chuẩn trong ngôn ngữ ST:

Toán tử Biểu tượng (ký hiệu) Độ ưu tiên
Dấu ngoặc đơn (…) Cao nhất
Tìm giá trị lớn nhất MAX (A,B)  
Phủ định
NOT
 
Lũy thừa **  
Nhân
Chia
Modulo
*
/
MOD
 
Cộng
Trừ
+
 
So sánh <, >, <=, >=  
Bằng
Không bằng
=
<>
 
Boolean AND
Boolean AND
&
AND
 
Boolean Exclusive OR XOR  
Boolean OR OR Thấp nhất

Tất cả các toán tử trong bảng trên được sắp xếp theo thứ tự ưu tiên (từ cao xuống thấp lần lượt từ trên xuống dưới). Đây còn được gọi là thứ tự của các phép toán, và bạn có thể biết về nó từ toán học.

Thứ tự của các toán tử là thứ tự mà các hoạt động được thực hiện hoặc tính toán. Chỉ cần nhìn vào biểu thức này:

1

A + B * MAX (C, D)

Trình biên dịch sẽ tính biểu thức này như thế nào?

Chúng ta thấy trong bảng toán tử, toán tử được ưu tên cao nhất là dấu ngoặc đơn. Có nghĩa là, mọi thứ trong ngoặc đơn sẽ được tính toán trước (ở đây là: (C,D)). Tuy nhiên, vì MAX (C,D) là một hàm, chúng ta có thể xuống thêm một hàng trong bảng ưu tiên để tính toán hàm.

Vậy trong biểu thức trên, đầu tiên chúng ta cần tính toán là hàm MAX (C,D). Hàm này sẽ trả về kết quả, trong trường hợp này: giá trị nào cao nhất trong hai biến C và D thì sẽ được trả về (C>D thì sẽ trả về kết quả là C, còn C<D thì sẽ trả kết quả về là D).

Ở ví dụ này, chúng ta tạm coi là C chính là kết quả mà biểu thức trả về. Khi đó biểu thức sẽ được kết quả như sau:

1

A + B * C

Chúng ta thấy, còn lại hai phép toán là: nhân và cộng; ta xét bảng toán tử và thấy phép “nhân” có mức độ ưu tiên cao hơn, do đó chúng ta sẽ tính biểu thức B * C trước và sau đó lấy kết quả nhận được từ biểu thức và tiếp tục cộng với A.

Mỗi khi tính toán một biệt thức trong ST, trình biên dịch sẽ tuân theo thứ tự ưu tiên như trong bảng trên.

Các toán tử được sử dụng cho các biểu thức trong ST có thể được chia thành bốn nhóm. Mỗi nhóm toán tử sẽ có một chức năng cụ thể và sẽ mang lại một kiểu dữ liệu cụ thể.

  1. Toán tử số học
  2. Toán tử quan hệ
  3. Toán tử logic
  4. Toán tử Bitwise

Toán tử số học trong ST

Tất cả các toán tử số học thường chỉ được gọi là toán tử toán học vì chúng đại diện cho toán học. Kết quả sẽ luôn là kết quả toán học của biểu thức.

1

2

3

15 MOD 4

// Kết quả: 3

Toán tử quan hệ trong ST

Để so sánh hoặc tìm mối quan hệ giữa hai giá trị, bạn có thể sử dụng một trong các toán tử quan hệ . Chúng được sử dụng để so sánh và kết quả sẽ là giá trị boolean (kiểu BOOL), TRUE hoặc FALSE (Đúng hoặc Sai).

NhietDo := 93.9;

NhietDo >= 100.0

// Kết quả: FALSE

Toán tử logic trong ST

Nếu bạn muốn so sánh các giá trị boolean (BOOL) và thực hiện một số phép toán logic từ nó, bạn phải sử dụng các toán tử logic. Các toán tử này cũng mang lại giá trị boolean là TRUE hoặc FALSE do kết quả của biểu thức.

1

2

3

4

5

LIMIT_SWITCH1 := TRUE;

LIMIT_SWITCH2 := FALSE;

LIMIT_SWITCH1 OR LIMIT_SWITCH2

// Kết quả: TRUE

Toán tử Bitwise trong ST

Nhóm toán tử cuối cùng được gọi là toán tử Bitwise (toán tử theo chiều bit) vì các phép toán được thực hiện theo chiều bit. Nó chỉ đơn giản là một hoạt động logic được thực hiện cho mỗi bit của hai số. Kết quả là một số mới – tổng kết quả của các phép toán bit.

1

2

15 AND 8

// Kết quả: 15

Vì cách tính biểu thức này là theo từng bit nên việc tính toán sẽ theo từng bit. Vì vậy, để hiểu những gì đang xảy ra, bạn phải chuyển đổi các số thành giá trị nhị phân:

15 = 1111
8 = 1000

Bây giờ mỗi bit trong số 1111 (15) có thể được sử dụng trong một phép toán logic với số khác 1000 (8):

1

1111 AND 1000

Số bit 1111 (15) 1000 (8) Kết quả
0 1 1 1
1 1 0 0
2 1 0 0
3 1 0 0

Toán tử và cú pháp (câu lệnh)

Trong phần trước, bạn đã tìm hiểu về biểu thức đánh giá. Có nghĩa là tất cả các biểu thức sẽ mang lại kết quả và trình biên dịch sẽ thay thế biểu thức bằng kết quả. Tuy nhiên, nếu bạn muốn PLC (trình biên dịch) không đánh giá điều gì đó, mà để LÀM điều gì đó? thì chúng ta cần sử dụng các cú pháp (hay câu lệnh, mã lệnh).

Có một số câu lệnh có sẵn trong ST. Tất cả chúng đại diện cho một thuật toán hoặc một điều kiện. Bắt đầu với các thuật toán, câu lệnh cơ bản nhất trong ST là câu lệnh gán. Các câu lệnh cũng được mô tả trong tiêu chuẩn IEC do PLCOpen phát triển và tiêu chuẩn đầu tiên mà họ liệt kê là câu lệnh gán.

1

A := B;

Câu lệnh này này yêu cầu trình biên dịch lấy giá trị của biến B và đặt nó trong biến A.

Gán giá trị cho một biến:

1

A := 10;

Câu lệnh này sẽ gán một giá trị là 10 vào biến A, hay nói một cách khác A sẽ được gán giá trị là 10.

Với giá trị A = 10, chúng ta thực hiện thêm một biểu thức khác

1

B := A + 2;

Khi dòng mã này được biên dịch, biểu thức A + 2 sẽ được trả về giá trị là 12. Trình biên dịch sẽ thay thế biểu thức bằng kết quả 12. Bây giờ câu lệnh sẽ giống như thế này đối với trình biên dịch:

1

B := 12;

Bây giờ, trình biên dịch sẽ gán giá trị 12 cho biến B.

Chúng ta học được ở đây là ký hiệu “:=” được gọi là toán tử gán. Chúng ta rất dễ nhầm lẫn và sử dụng nhầm toán tử gán “:=” với toán tử bằng “=”. Thoạt nhìn, chúng trông giống nhau, tuy nhiên nó có sự khác biệt rất lớn. Chúng ta cùng xem hai ví dụ sau:

Ví dụ 1: về toán tử bằng “=”

1

A = B

Ví dụ 2: về toán tử gán “:=”

1

A := B;

Trong ví dụ 1, đây là một biểu thức, toán tử sẽ được sử dụng để đánh giá. Toán tử bằng đánh giá theo cách sau: nếu bên phải và bên trái bằng nhau, nó sẽ trả về kết quả là TRUE hoặc 1. Nếu không bằng nhau, nó sẽ trả về kết quả là FALSE hoặc 0.

Với một số toán tử khác, toán tử bằng là một toán tử quan hệ. Tất cả các toán tử quan hệ sẽ trả về kết quả là TRUE hoặc FALSE.

Trong ví dụ 2, đây là một câu lệnh. Toán tử sẽ được sử dụng để hành động (thực hiện mệnh lệnh) thay vì đánh giá. Phép gán là một hành động, và ở đây giá trị của A sẽ nhận giá trị của B.

Bạn luôn có thể xác định hay phân biệt được đâu là một câu lệnh bằng dấu chấm phẩy. Bởi dấu chấm phẩy là cách trình biên dịch biết khi nào kết thúc một câu lệnh.

Bạn có thể sử dụng tất cả các loại biểu thức trong câu lệnh gán của mình, từ các giá trị đơn giản như số đến các biến và hàm. Bởi vì tất cả các biểu thức sẽ được đánh giá trước và sau đó, kết quả của đánh giá đó sẽ được sử dụng trong câu lệnh gán.

Câu lệnh điều kiện trong ST

Các chương trình PLC sử dụng các thuật toán logic nhằm đưa ra một số quyết định. Đó là lý do, vì sao cần sử dụng PLC hay bộ điều khiển nào đó để đưa ra quyết định và hành động trên trạng thái hiện tại.

Hiểu theo một cách đơn giản: PLC sẽ xem xét trạng thái của tất cả các đầu vào và sử dụng chương trình PLC để đưa ra các quyết định đầu ra cần được thực hiện. Và trong các chương trình PLC, để đưa ra các quyết định, chúng ta thường sử dụng câu lệnh điều kiện. Vậy từ đây ta có thể rút ra kết luận rằng: “câu lệnh điều kiện được sử dụng chính xác là để đưa ra quyết định”.

Có hai loại câu lệnh điều kiện trong ST là: câu lệnh IF và câu lệnh CASE.

Câu lệnh IF trong ST

Câu lệnh IF là câu lệnh đưa ra quyết định khi thỏa mãn điều kiện. Mặc dù câu lệnh IF khá đơn giản để hiểu, tuy nhiên bạn vẫn cần phải biết cách sử dụng các câu lệnh điều kiện này trong ST.

Câu lệnh IF trong ST sử dụng cấu trúc theo cách của nó. Điều này có nghĩa là bạn phải viết nó theo một cách nhất định để trình biên dịch hiểu nó. Cũng giống như dấu chấm phẩy được sử dụng để kết thúc câu lệnh, có những từ khóa đặc biệt để tạo câu lệnh IF.

IF [boolean expression] THEN
<statement>;
ELSIF [boolean expression] THEN
<statement>;
ELSE
<statement>;
END_IF ;

Cú pháp cho câu lệnh IF trông rất giống với các từ tiếng Anh đơn giản. Dòng đầu tiên chứa hai từ khóa: IF và THEN. Giữa hai từ khóa đó là điều kiện, là một biểu thức. Nhưng không phải là bất kỳ biểu thức nào, nó cần phải là một biểu thức boolean.

Biểu thức Boolean & Numeric

Có thể chia biểu thức thành hai nhóm (Boolean & Numeric) theo chức năng của chúng.

Biểu thức Boolean cho giá trị kiểu BOOL, TRUE hoặc FALSE.

Đây là ví dụ về biểu thức boolean:

1

1 = 1

Biểu thức này sẽ đánh giá hoặc mang lại kết quả TRUE. Biểu thức boolean cũng có thể trông giống như sau:

1 > 2

Lần này biểu thức boolean sẽ đánh giá là FALSE, vì 1 không lớn hơn 2.

Biểu thức Numeric là biểu thức đánh giá một số nguyên hoặc một số dấu phẩy động.

Một biểu thức Numeric có thể trông đơn giản như sau:

1

13.2 + 19.8

Biểu thức này sẽ trả về giá trị kết quả là 33.0 => biểu thức Numeric (biểu thức số)

Biểu thức boolean được sử dụng trong câu lệnh IF làm điều kiện.

IF (nếu) biểu thức boolean đánh giá là TRUE, THEN (thì) các câu lệnh sau sẽ được thực thi.

PLC sẽ chỉ thực hiện các câu lệnh sau từ khóa THEN, nếu biểu thức cho kết quả là TRUE. Điều này được minh họa bằng các ví dụ sau đây:

1

2

3

4

A := 0;

IF A = 0 THEN

B := 0;

END_IF ;

Dòng số 3 sẽ chỉ được thực hiện nếu A bằng 0. Trong trường hợp này, nó đã gán giá trị A là 0 trong một câu lệnh ngay trước câu lệnh IF.

Trong ví dụ này, một quyết định được thực hiện tùy thuộc vào giá trị của một biến. Bây giờ, chúng ta thử áp dụng ví dụ này trong lập trình PLC.

Giả sử bạn muốn tạo một chương trình đặt đầu ra PLC tùy thuộc vào trạng thái của đầu vào. Với một câu lệnh IF đơn giản, bạn có thể làm điều đó trong ST:

1

2

3

IF INPUT1=TRUE THEN

OUTPUT1 := TRUE;

END_IF;

Mặc dù ví dụ này chỉ là một phần của chương trình (biến INPUT1 đại diện cho một đầu vào và OUTPUT1 là một đầu ra), nó minh họa cách thức đưa ra quyết định cho đầu ra PLC. Biến OUTPUT1 sẽ chỉ được đặt thành TRUE NẾU biến INPUT1 là TRUE.

Vì cả hai biến INPUT1 và OUTPUT1 đều thuộc loại BOOL, nên dòng đầu tiên trong câu lệnh cũng có thể trông giống như sau:

1

IF INPUT1 THEN

Chỉ cần viết biểu thức là “INPUT1” sẽ vẫn đánh giá là TRUE, khi biến là TRUE.

Câu lệnh ELSE IF trong ST

Bạn đã thấy một câu lệnh IF đơn giản trong ví dụ trên, trong đó các câu lệnh chỉ được thực thi nếu một biểu thức là TRUE. Nếu biểu thức đó đánh giá là FALSE, các câu lệnh sẽ không được thực thi. Nếu chương trình PLC của bạn yêu cầu nhiều điều kiện thì sao?

Tất nhiên, bạn có thể viết chương trình cho yêu cầu này dưới dạng nhiều câu lệnh IF riêng lẻ. Tuy nhiên, ST có nhiều tùy chọn phù hợp hơn cho các câu lệnh IF. Cũng giống như hầu hết các ngôn ngữ lập trình khác, bạn có thể sử dụng các lệnh ELSIF và ELSE cho nhiều điều kiện trong cùng một câu lệnh IF.

Cả ELSIF và ELSE đều là những lệnh tùy chọn bổ sung trong câu lệnh IF, đây là cú pháp của nó:

IF [boolean expression] THEN

<statement>;

ELSIF [boolean expression] THEN

<statement>;

ELSE

<statement>;

END_IF;

Nếu biểu thức boolean trên dòng 1 là FALSE, các câu lệnh bên dưới sẽ không được thực thi. Thay vào đó, trình biên dịch sẽ kiểm tra biểu thức boolean sau từ khóa ELSIF.

ELSIF hoạt động giống như lệnh IF: nếu biểu thức boolean sau lệnh ELSIF là true, các câu lệnh sau sẽ được thực thi.

Còn lệnh ELSE hoạt động như một tùy chọn bổ sung mặc định cho câu lệnh IF. Nếu tất cả các biểu thức boolean IF và ELSIF được đánh giá là FALSE, các câu lệnh sau từ khóa ELSE sẽ được thực thi.

Kết hợp các toán tử cho các điều kiện nâng cao

Bên cạnh việc tạo nhiều điều kiện, bạn cũng có thể mở rộng các điều kiện của mình bao gồm nhiều biến. Bạn có thể kết hợp nhiều biểu thức, thường được thực hiện với một toán tử logic, để có được một biểu thức lớn hơn.

Nếu bạn muốn không chỉ 1 mà 2 đầu vào là ĐÚNG trước khi đưa ra quyết định cho đầu ra được đặt. Biểu thức sẽ như thế này:

1

2

3

IF (INPUT1) AND (INPUT2) THEN

OUTPUT1 := TRUE;

END_IF;

Biểu thức sẽ cho giá trị là TRUE, chỉ khi INPUT1 và INPUT2 là TRUE.

Lệnh CASE trong ST

Cách thứ hai để đưa ra quyết định trong ST là sử dụng các câu lệnh CASE. Về cơ bản, câu lệnh CASE và câu lệnh IF giống nhau. Nhưng câu lệnh CASE sử dụng biểu thức số thay vì biểu thức boolean. Các câu lệnh CASE cũng có cú pháp hơi khác, nó phù hợp hơn cho các mục đích nhất định.

Đây là cách biểu hiện cú pháp cho các câu lệnh CASE trong ST:

CASE [numeric expression] OF

result1: <statement>;

resultN: <statemtent>;

ELSE

<statement>;

END_CASE;

Trong câu lệnh CASE chỉ có 1 biểu thức. Kết quả của biểu thức đó được sử dụng để quyết định câu lệnh nào được thực thi.

Là một tùy chọn mặc định, câu lệnh CASE cũng có từ khóa ELSE. Các câu lệnh sau từ khóa đó chỉ được thực thi nếu không có kết quả (hoặc không thuộc điều kiện của CASE nào) khớp với kết quả của biểu thức số.

Đây là một ví dụ rất đơn giản:

1

2

3

4

5

6

7

8

PROGRAM_STEP := 3;

CASE PROGRAM_STEP OF

1: PROGRAM_STEP := PROGRAM_STEP+1;

2: PROGRAM_STEP := PROGRAM_STEP+2;

3: PROGRAM_STEP := PROGRAM_STEP+3;

ELSE

PROGRAM_STEP := PROGRAM_STEP+10;

END_CASE;

Vòng lặp FOR trong ST

Vòng lặp FOR được sử dụng để lặp lại một số lần cụ thể. Vòng lặp FOR có một số từ khóa khác. TO, BY, DO và END_FOR.

Đây là cú pháp của vòng lặp FOR trong ST:

FOR count := initial_value TO final_value BY increment DO
<statement>;
END_FOR;

Dòng đầu tiên có vẻ hơi phức tạp, nhưng sẽ đơn giản hơn nếu bạn chia nó thành nhiều phần:

Vì vòng lặp FOR chỉ có thể có một khoảng giá trị đặt trước mà chúng sẽ lặp lại, đó là mục đích chúng được sử dụng. Trong lập trình PLC, một ví dụ áp dụng đơn giản như một vật dụng phải được sấy bốn lần. Vòng lặp FOR sẽ được sử dụng để đếm và lặp lại bốn lần rồi kết thúc.

Cuối cùng, bạn có thể sử dụng câu lệnh IF với từ khóa EXIT để dừng vòng lặp trước khi đếm. Bạn có thể thêm điều kiện boolean nếu TRUE sẽ dừng vòng lặp.

1

2

3

IF [boolean expression] THEN

EXIT;

END_IF;

Vòng lặp WHILE trong ST

Vòng lặp while hơi khác so với vòng lặp FOR, vì nó được sử dụng để lặp lại vòng lặp miễn là một số điều kiện là ĐÚNG. Vòng lặp WHILE sẽ được lặp đi lặp lại miễn là biểu thức boolean đánh giá là TRUE.

Đây là cú pháp của vòng lặp WHILE:

WHILE [boolean expression] DO
<statement>;
END_WHILE;

Giữa từ khóa WHILE và DO là biểu thức boolean. Nếu biểu thức boolean đó trả về giá trị là TRUE, tất cả các câu lệnh cho đến từ khóa END_WHILE sẽ được thực thi.

Khi đạt đến END_WHILE, biểu thức boolean sẽ được đánh giá lại. Điều này sẽ lặp đi lặp lại cho đến khi biểu thức không trả về giá trị là TRUE nữa (tức là trả về giá trị FALSE). Nhưng để làm cho vòng lặp dừng lại tại một điểm, bạn phải thay đổi một giá trị trong biểu thức boolean. Chỉ bằng cách đó, biểu thức boolean mới có thể chuyển từ TRUE đến FALSE.

Đây là một ví dụ về vòng lặp WHILE trong ST:

counter := 0;

WHILE counter < 10 DO

counter := counter + 1;

machine_status := counter * 10;

END_WHILE;

Nếu bạn nhìn vào dòng thứ ba, bạn sẽ thấy vòng lặp cuối cùng sẽ ngừng lặp lại như thế nào. Biểu thức boolean sử dụng biến bộ đếm và kiểm tra xem giá trị của nó có nhỏ hơn hoặc bằng 10. Nhưng vì giá trị của bộ đếm được đặt thành 0 ngay trước vòng lặp WHILE nên biểu thức boolean sẽ là TRUE trừ khi bộ đếm được thay đổi.

Đó là những gì đang xảy ra ở dòng 3. Đây là câu lệnh đầu tiên trong vòng lặp WHILE, và với các câu lệnh khác, được thực hiện mỗi khi vòng lặp lặp lại. Ở dòng thứ ba, giá trị của biến bộ đếm được tăng lên 1. Bạn có thể hiểu rằng giá trị gia tăng là 1.

Trong ví dụ trên, vòng lặp sẽ lặp lại 10 lần. Khi giá trị của số đếm bằng 10, biểu thức boolean sẽ trả về giá trị là FALSE (vì 10 không nhỏ hơn 10) và vòng lặp sẽ dừng lại.

Bạn cũng có thể sử dụng từ khóa EXIT trong vòng lặp WHILE để dừng lặp lại vòng lặp trước khi biểu thức boolean là FALSE. Cú pháp là một câu lệnh IF với từ khóa EXIT. Đặt nó ở bất kỳ đâu giữa từ khóa DO và END_WHILE.

1

2

3

IF [boolean expression] THEN

EXIT;

END_IF;

Lệnh REPEAT trong ST

Nó hoạt động theo cách ngược lại của vòng lặp WHILE. Vòng lặp này sẽ ngừng lặp lại khi biểu thức boolean là TRUE.

Trong ST, cú pháp cho các vòng lặp REPEAT trông giống như sau:

REPEAT
<statement>;
UNTIL [boolean expression]
END_REPEAT;

Lưu ý ở đây rằng vì biểu thức boolean trong loại vòng lặp này nằm sau các câu lệnh, các câu lệnh sẽ luôn được thực thi ít nhất một lần. Điều này rất hữu ích nếu bạn muốn một hành động xảy ra một lần và sau đó, với một điều kiện, hãy quyết định xem hành động đó có nên xảy ra nữa hay không.

Cũng giống như với vòng lặp WHILE, bạn phải thay đổi một giá trị trong biểu thức boolean trong quá trình thực hiện, để làm cho vòng lặp ngừng lặp lại. Điều này có thể được thực hiện bằng cách tăng giá trị của một biến (để đếm) hoặc nó có thể được thực hiện với một câu lệnh điều kiện như câu lệnh IF bên trong vòng lặp.

Phần mềm lập trình hỗ trợ ngôn ngữ ST

#1. Beckhoff TwinCat 3

Phần mềm lập trình của Beckhoff hoàn toàn tương thích với tất cả các ngôn ngữ lập trình PLC IEC 61131-3 bao gồm Sơ đồ bậc thang (LD) và Văn bản có cấu trúc (ST). Đối với người học, lợi thế lớn nhất của TwinCat 3 là nó có một trình mô phỏng đi kèm. Bạn không cần phải mua PLC, bạn chỉ cần sử dụng PLC mềm.

#2. Codesys

Nó là một môi trường phần mềm mã nguồn mở để lập trình PLC IEC 61131-3. Mã nguồn mở tức là nó cho tải xuống miễn phí, điều này rất phù hợp cho các sinh viên.

Một số ví dụ sử dụng ngôn ngữ lập trình ST

#1. Ví dụ 1:

Sử dụng ngôn ngữ lập trình ST tương ứng:

1

2

3

4

5

6

7

%Q2.3 := %I1.1 OR %M1;

%Q2.2 := %M2 OR (NOT %I1.2);

%Q2.4 := %I1.3 OR (RE %I1.4);

%Q2.5 := %M3 OR (FE %I1.5);

#2. Ví dụ 2:

Sử dụng ngôn ngữ lập trình ST tương ứng:

1

2

3

4

5

6

7

8

9

10

11

IF %M0 THEN

  %MW0 := %MW10 + 100;

END_IF;

IF %I3.2 THEN

  %MW0 := SQRT(%MW100);

END_IF;

IF RE(%I3.3) THEN

  INC(%MW100);

END_IF;

#3. Ví dụ 3:

Kết luận khi học ST

Học một ngôn ngữ lập trình mới có thể là một thách thức khá lớn. Tuy nhiên, đối với người mới bắt đầu, có một số điều rất cơ bản mà bạn nên ghi nhớ:

Chúng tôi cho rằng, phần cuối cùng là phần quan trọng nhất. Học hỏi kinh nghiệm từ những người khác có thể là cách hiệu quả nhất để học, không chỉ về ngôn ngữ lập trình mà còn về cách sử dụng nó. Tham gia cuộc thảo luận bên dưới: đặt câu hỏi đầu tiên của bạn về ST và kết nối với các lập trình viên PLC khác.

Trên đây, MC&T đã chia sẻ cho các bạn những kiến thức cơ bản nhất về ngôn ngữ lập trình ST (Structured Text – văn bản có cấu trúc). Chúng tôi hy vọng rằng, với những kiến thức phía trên sẽ giúp ích cho các bạn trong quá trình tìm hiểu, nghiên cứu, học tập và làm việc với ngôn ngữ lập trình ST. Xin cảm ơn!

Bài viết liên quan