Một trong những ngôn ngữ lập trình PLC chính thức và được sử dụng rộng rãi là: Sơ đồ khối chức năng (FBD:Function Block Diagram ). Đây là một ngôn ngữ đơn giản và trực quan để lập trình nhiều chương trình con cùng lúc trong một chương trình PLC. Ngôn ngữ FBD rất dễ học và cung cấp rất nhiều tính năng.
Là một trong những ngôn ngữ lập trình PLC chính thức được mô tả trong IEC 61131-3. FBD là ngôn ngữ cơ bản cho tất cả các lập trình viên PLC. Đó là một ngôn ngữ tuyệt vời để triển khai mọi thứ từ logic đến bộ định thời (timer), bộ điều khiển PID và thậm chí cả hệ thống SCADA trong giải pháp của bạn, v.v.
Hầu hết các kỹ sư đều yêu thích ngôn ngữ FBD vì nó là một cách rất phổ biến và trực quan để mô tả một hệ thống. Các kỹ sư thích xếp mọi thứ vào hộp (block). Và đó chính xác là khái niệm về ngôn ngữ FBD. Ngôn ngữ FBD rất hữu ích khi các khái niệm điều khiển hàng loạt từ ISA-88 được áp dụng.
Trong bài hướng dẫn này, chúng tôi sẽ giới thiệu cho các bạn một số nguyên tắc cơ bản của lập trình FBD và các khối chức năng.
Nội Dung Bài Viết
Từ phổ thông, các bạn cũng có thể đã biết một thứ còn được gọi là sơ đồ khối, thường được dùng để tạo nên sơ đồ giải thuật trong tin học . Sơ đồ khối chức năng của PLC không có gì khác biệt so với nó. Những gì ngôn ngữ FBD cung cấp là một cách để đặt các hàm được viết bằng nhiều dòng mã vào chung trong các hộp (block).
Qua đó chúng ta có thể dễ dàng kết nối chúng, để tạo ra một chương trình PLC lớn hơn.
Cũng như ngôn ngữ logic bậc thang (LAD) và câu lệnh có cấu trúc (ST: Structure Text), sơ đồ khối chức năng hay FBD được PLCOpen mô tả trong tiêu chuẩn IEC 61131-3. Hầu hết các chương trình PLC được viết với một số lượng FBD. Bởi vì, mặc dù các bạn có thể viết các hàm của mình trong câu lệnh có cấu trúc (ST). Bạn vẫn thường phải kết nối các chức năng đó.
Trong FBD tất cả các chức năng được đưa vào các khối chức năng. Tất cả chúng đều có một hoặc nhiều đầu vào và đầu ra. Chức năng của khối là mối quan hệ giữa trạng thái của các đầu vào và đầu ra của nó.
Dưới đây là cách một khối chức năng đơn giản có thể trông như thế nào:
Mô tả khối chức năng trong FBD
Khối chức năng được minh họa bằng một hộp (box). Ở giữa hộp thường là một biểu tượng hoặc một câu lệnh. Biểu tượng này thể hiện chức năng thực tế của khối chức năng.
Tùy thuộc vào hàm chức năng, có thể có nhiều hay ít số lượng đầu vào và đầu ra nào trên khối chức năng. Bạn có thể kết nối đầu ra của một khối chức năng với đầu vào của khối chức năng khác. Từ đó tạo ra Sơ đồ khối chức năng (FBD: Function Block Diagram )
Kết hợp các khối chức năng để tạo một sơ đồ khối chức năng cơ bản
Có rất nhiều khối chức năng tiêu chuẩn được cung cấp trong FBD, nhưng bạn cũng có thể tạo các khối chức năng của riêng mình. Thông thường, bạn sẽ phải sử dụng cùng một câu lệnh trong chương trình PLC của mình nhiều lần. Nó có thể là một chức năng để điều khiển một van, một động cơ,… Với các khối chức năng, bạn có thể tạo một khối chức năng cụ thể cho một động cơ và sử dụng nó nhiều lần.
Hãy bắt đầu bằng cách xem xét một số khối chức năng tiêu chuẩn như được mô tả trong tiêu chuẩn IEC dành cho ngôn ngữ lập trình PLC. Chúng cung cấp một loạt các chức năng từ cơ bản đến nâng cao.
Trong tiêu chuẩn của IEC, hiên có rất nhiều khối chức năng được mô tả. Dưới đây là tổng quan về các khối quan trọng nhất trong mô tả FBD chính thức:
Chức năng cơ bản nhất của chương trình PLC là logic. Kết hợp gọi là logic tổ hợp. Logic là dạng thuật toán đơn giản nhất mà thông qua các trạng thái của đầu vào của nó có thể thiết lập một số đầu ra. Về cơ bản, có hai hàm bit logic khác nhau trong FBD. Chỉ với hai hàm này, bạn có thể lấy ra một loạt các hàm logic khác.
Đầu tiên chúng tôi muốn giới thiệu với bạn về khối hàm OR. Nó có 2 đầu vào, 1 đầu ra và hoạt động giống như một cổng OR. Nếu một trong các đầu vào là đúng thì đầu ra cũng sẽ trở thành đúng.
Trong ngôn ngữ FBD, khối logic OR thường sẽ giống như sau:
Khối chức năng đại diện cho toán tử logic OR trong FBD
Có thể bạn đã thấy biểu tượng cho toán tử logic OR là>= 1. Về cơ bản nó là điều kiện cho đầu ra. Nếu tổng của hai đầu vào lớn hơn hoặc bằng 1, đầu ra trở thành true.
Cũng giống như tất cả các phép toán logic bit khác, false được biểu diễn bằng 0 và true bằng 1. Điều này có thể được minh họa bằng bảng chân trị cho toán tử logic OR:
Chức năng của khối OR tương đương với kết nối song song của hai tiếp điểm trong logic bậc thang. Nếu một trong hai tiếp điểm bị đóng, đầu ra sẽ được đặt. Khi tôi nói đầu ra ở đây tôi có nghĩa là đầu ra của khối chức năng. Chúng tôi chỉ có thể kết nối chân đầu ra với một khối chức năng khác. Nhưng nếu chúng ta muốn đặt một đầu ra thực tế hoặc một bit với đầu ra khối thì sao? Điều này dẫn chúng ta đến khối chức năng tiếp theo.
Trong nhiều trường hợp, khi bạn cần liên kết đầu ra của một khối chức năng đến đầu vào của một khối khác. Nhưng thỉnh thoảng bạn muốn dùng đầu ra đó để điều khiển một hay nhiều bit hơn. Để làm được điều đó bạn gán 1 đầu ra hay 1 giá trị cho 1 biến .
Và để gán thì dĩ nhiên bạn cần dùng khối chức năng gán. Các khối gán hoạt động bằng cách gán đầu vào của nó vào một vị trí trong bộ nhớ PLC.
Khối chức năng cũng có một đầu ra mà bạn có thể sử dụng để kết nối với các khối chức năng khác. Điều này rất hữu ích vì bạn có thể gán giá trị ở bất kỳ đâu trong sơ đồ khối chức năng của mình. Không chỉ ở đầu ra của khối cuối cùng.
Hàm gán có chức năng tương tự như một cuộn dây trong logic bậc thang.
Khối chức năng của một hoạt động gán trong FBD
Khối chức năng tiếp theo chúng tôi muốn giới thiệu với các bạn đó là khối chức năng AND. Cũng giống như khối OR, đây là một trong những khối chức năng cơ bản nhất trong lập trình PLC.
Nó có 2 đầu vào và một đầu ra. Nó rất giống với hàm OR nhưng hoạt động hơi khác một chút. Thay vì một trong hai đầu vào, khối này yêu cầu cả hai đầu vào phải là một bộ đúng với đầu ra.
Nếu cả hai đầu vào đều đúng thì đầu ra cũng sẽ trở thành đúng.
Khối chức năng đại diện cho hoạt động logic AND trong FBD
Đây là bảng chân trị của khối AND:
Nếu bạn biết một chút về logic bậc thang, khối chức năng AND tương đương với kết nối nối tiếp của 2 tiếp điểm trong logic bậc thang. Cả hai đều phải đúng trước khi khối đánh giá đầu ra của nó là đúng.
Đôi khi bạn sẽ muốn đảo ngược đầu vào hoặc đầu ra của một khối. Để làm điều đó, bạn phải sử dụng phủ định. Nó có nhiều dạng khác nhau, tùy thuộc vào phần mềm bạn sử dụng.
Trong một số trường hợp, bản thân nó là một khối hoàn chỉnh. Và đôi khi nó chỉ là những vòng tròn nhỏ mà bạn có thể đặt trên bất kỳ chân nào của các khối chức năng.
Hàm “NOT”, hàm “Invert RLO“ (result of logic operation) hoặc hàm gán phủ định trên thực tế hoạt động bằng cách thay đổi tín hiệu thành ngược lại.
Khối chức năng phủ định
Khi một tín hiệu bị đảo ngược hoặc bị phủ định, điều đó có nghĩa là, nếu nó là đúng, nó sẽ trở thành sai và ngược lại. Vòng tròn nhỏ ở chốt của khối biểu thị chính xác chức năng đó.
Không chỉ là đầu ra có thể được đảo ngược. Các đầu vào cũng có thể được đảo ngược. Đơn giản bằng cách đặt vòng tròn trên chân đầu vào. Sau này, bạn sẽ thấy rằng việc đảo ngược tất cả các đầu vào hoặc đầu ra đều có tác dụng như nhau đối với chức năng của một khối.
Khối này là một trường hợp đặc biệt của khối OR. Các giá trị đầu vào trên khối OR phải lớn hơn hoặc bằng 1. Nhưng như bạn có thể thấy bên dưới, khối XOR yêu cầu hai đầu vào phải bằng 1.
Ví dụ, nếu cả hai đầu vào là đúng, thì đầu ra của XOR sẽ là sai, vì tổng các đầu vào lớn hơn 1.
Khối XOR trong FBD
Mặc dù nó có thể được xây dựng với 2 khối chức năng AND và một khối OR, khối XOR vẫn được coi như một khối chức năng riêng trong Siemens TIA Portal, Codesys và nhiều hãng khác.
Nó được sử dụng rộng rãi để kiểm tra xem một và chỉ một trong hai đầu vào là đúng.
Hai khối chức năng tiếp theo cũng được xây dựng bằng cách sử dụng các khối cơ bản. Chúng là các khối phủ định. Nó thực sự chỉ có nghĩa là đầu ra của khối bị phủ định.
Lấy ví dụ về khối NAND như minh họa bên dưới. Như bạn có thể thấy, khối chức năng NAND thực sự chỉ là khối AND với đầu ra phủ định. NAND là viết tắt của NOT AND hoặc Negated (phủ định) AND.
Khối NAND từ khối AND phủ định trong FBD
Bảng chân trị cho khối này hoàn toàn ngược lại với bảng chân trị cho khối AND.
Như đã đề cập trước đây, chức năng của khối chức năng NAND cũng có thể nhận được bằng cách phủ định các đầu vào. Giảm nhẹ đầu vào có tác dụng tương tự như phủ định đầu ra. Do đó, một khối NAND cũng có thể trông như thế này:
Khối NAND được tạo ra từ 2 đầu vào NOT trên khối AND
Các loại khối chức năng tiếp theo mà tôi sẽ giới thiệu cho bạn cũng là bistable. Tôi thích nghĩ về chúng như một dạng bộ nhớ đơn giản nhất. Bạn có thể set hoặc reset đầu ra. Đầu ra (Q) ghi nhớ trạng thái cuối cùng của đầu vào đã đặt (S1).
Cung cấp cho S1 một xung, và Q1 sẽ được thiết lập. Ngay cả khi S1 sau đó thay đổi trạng thái thành false, kết quả đầu ra vẫn là true. Bạn có thể nói rằng Q1 ghi nhớ nếu có bất kỳ điều gì xảy ra tại S1. Đó là lý do tại sao tôi thích coi các hàm bistable hoặc flip-flops như là bộ nhớ.
Khối chức năng được gọi là SR hoặc set / reset và đây là cách nó trông giống như sau:
Khối chức năng Set/Reset (thiết lập ưu tiên)
Để hiểu rõ hơn về cách hoạt động của chức năng này, chúng ta hãy xem xét bên trong khối chức năng. Phần bên trong khối chức năng của khối SR cho thấy rằng nó được tạo thành từ các khối logic 2 bit. Một hàm AND và một hàm OR.
Đầu ra của hàm AND được kết nối với đầu vào của hàm OR. Vì một trong những đầu vào trên hàm AND là Q1, hàm này cũng đóng vai trò là đầu ra cho toàn bộ khối.
Nhiều người gọi đây là một chức năng lật. Q1 sẽ nhớ rằng tại một số thời điểm S1 là “true”. Điều này kéo dài cho đến khi chân R hay “reset” được “set” thành “true”. Sau đó Q1 sẽ được thiết lập lại. Đầu ra (Q1) ghi nhớ và do đó tôi thích coi khối này như một khối bộ nhớ đơn giản.
Bên trong khối chức năng Set/Reset
Loại khối này luôn có mức độ ưu tiên. Nếu cả hai đầu vào đều đúng thì điều gì sẽ xảy ra?
Khối SR đã “set” mức độ ưu tiên. Vì vậy, trong trường hợp cả hai đầu vào đều đúng, đầu ra sẽ được “set”.
Nhưng đó không phải lúc nào cũng là điều bạn muốn. Và điều đó sẽ dẫn chúng ta đến khối tiếp theo.
Trong một số trường hợp, bạn có thể muốn đặt lại đầu ra khi cả hai đầu vào (S1 và R) đều đúng. Đó là lý do tại sao chúng ta phải chặn RS. Về cơ bản, nó hoạt động theo cùng một cách với khối SR, nhưng với “reset” là ưu tiên thay vì “set”.
Khối chức năng Reset / Set (thiết lập ưu tiên)
Một lần nữa, khối này được cấu thành từ hai khối logic cơ bản. Nhưng vì flip flops – SR / RS là nền tảng trong lập trình PLC nên chúng cũng có khối chức năng riêng của chính mình.
Bên trong khối chức năng Reset /Set
Tất nhiên có một số cách để ghi nhớ mọi thứ. Và mặc dù flip flops là một cách rất đơn giản để ghi nhớ, các loại khối tiếp theo có thể là một dạng bộ nhớ thậm chí còn đơn giản hơn
Việc phát hiện các cạnh rất hữu ích trong cả lập trình PLC và điện tử. Tất nhiên, chúng ta không nói về cạnh bàn bếp của bạn, mà là rìa của các tín hiệu.
Thông thường, bạn sẽ chỉ kết nối đầu vào với một khối chức năng “đếm” (sẽ tìm hiểu thêm về những khối này sau). Nhưng nếu bạn còn nhớ nguyên lí hoạt động cơ bản của PLC, bạn sẽ biết rằng PLC có thời gian quét hoặc thời gian chu kỳ.
Thời gian này thường rất ngắn (20 – 50 ms). Khi bạn nhấn một nút nhấn (ngay cả khi bạn nhấn và thả nhanh), đầu vào sẽ bật trong thời gian lâu hơn (thường là 100-200 mili giây). Đầu vào sẽ được bật trong vài chu kỳ quét.
Mỗi khi PLC quét đến khối đếm, nó sẽ đếm một khi đầu vào là true. Đối với mỗi lần nhấn nút, bộ đếm sẽ đếm không chỉ 1 mà là 2, 3, 5 hoặc thậm chí nhiều hơn.
Để tránh điều này, chúng ta sẽ sử dụng các khối phát hiện cạnh.
(RISING TRIGGER:R_TRIG)
Cạnh mà chúng ta đang nói đến, trong tín hiệu kỹ thuật số đươc là cạnh lên. Đôi khi cũng được gọi là cạnh dương.
Nó xảy ra khi tín hiệu đi từ false (0) sang true (1). Trong điện tử kỹ thuật số là khi điện áp đi từ 0 đến 5V. Cạnh lên là những gì xảy ra ngay khi chúng ta nhấn nút.
Khối chức năng R_TRIG để phát hiện xung cạnh lên
Khi đầu vào (CLK) phát hiện ra một cạnh lên, đầu ra sẽ được thiết lập. Nhưng chỉ trong một khoảnh khắc ngắn, vì cạnh lên diễn ra quá nhanh. Mặc dù đầu vào có thể đúng cho các chu kỳ quét tiếp theo, đầu ra sẽ không được “set” nhiều hơn một lần. Đầu ra tạo ra một xung khi phát hiện ra cạnh dương hoặc cạnh lên.
Dưới đây là sơ đồ khối chức năng để dễ hiểu hơn:
Sơ đồ chức năng cho khối R_TRIG
Cần một cạnh lên mới để tạo ra một xung khác ở đầu ra. Có thể nói, khối chức năng sẽ ghi nhớ, nếu có một cạnh lên ở đầu vào. Vì vậy, để thiết lập lại đầu ra, đầu vào cần chuyển thành “false” rồi lại “true”. Hoặc như trong ví dụ về nút nhấn của chúng tôi; bạn cần phải thả nút ra và nhấn lại.
Cũng giống như các cạnh lên, tất nhiên bạn cũng có thể phát hiện các cạnh xuống. Khi tín hiệu đi từ true (1) đến false (0) là cạnh xuống.
Khối chức năng F_TRIG để phát hiện tín hiệu cạnh xuống
Đôi khi cạnh xuống còn được gọi là cạnh âm. Nó cũng hoạt động bằng cách tạo ra một xung ở đầu ra nhưng với một cạnh xuống ở đầu vào.
Sơ đồ chức năng cho khối F_TRIG
Một cách sử dụng điển hình cho khối này là tạo ra một thứ gì đó xảy ra khi một thứ khác dừng lại.
Giả sử bạn muốn bật đèn vàng khi động cơ dừng. Nhưng bạn chỉ muốn điều này xảy ra khi động cơ đã được khởi động. Sao cho đèn vàng chỉ được bật vào thời điểm động cơ dừng.
Giải pháp: Sử dụng khối F_TRIG để phát hiện cạnh xuống tại đầu ra động cơ. Từ đó tạo ra một xung để “set” đầu ra của đèn vàng.
Với các khối trước, chúng tôi muốn đảm bảo một tín hiệu không dài hơn thời gian quét. Nhưng đôi khi bạn sẽ muốn kiểm soát độ dài của tín hiệu hoặc thời điểm nó xảy ra.
Đây là nơi các khối chức năng định thời xuất hiện trong hình. Bộ định thời là một số chức năng được sử dụng nhiều nhất trong lập trình PLC. Chúng được chia thành ba loại bộ định thời khác nhau.
Nếu bạn muốn biết thêm về bộ định thời và xem chúng hoạt động như thế nào trong mô phỏng PLC, bạn có thể đọc bài viết về bộ định thời PLC. Bạn sẽ tìm thấy các video hướng dẫn về cả bộ định thời bật trễ, bộ định thời tắt trễ và bộ định thời xung.
Một số người cho rằng bạn sẽ chỉ cần sử dụng một trong số chúng, bởi vì với điều đó, bạn có thể lấy được tất cả các chức năng định thời. Nhưng vì cả ba đều được mô tả trong IEC 61131-3 và có trong hầu hết các phần mềm nên chúng tôi muốn giới thiệu với bạn tất cả bộ định thời đó .
Bộ định thời đầu tiên được gọi là bộ định thời xung, vì nó được sử dụng để tạo ra một xung có độ dài cụ thể.
Nó có 2 đầu vào và hai đầu ra. Cho đến nay, chúng ta chỉ thấy các khối chức năng mà đầu vào và đầu ra đều là kiểu dữ liệu boolean. Điều này vẫn đúng với IN và Q của khối TP. Nhưng nó có một chút khác biệt với PT và ET. Cả hai đều nhận các biến của kiểu dữ liệu TIME.
PT là viết tắt của Preset Time và là một đầu vào cho khối. Đây là nơi bạn đặt thời gian bạn muốn xung tại Q. Ngay sau khi đầu vào IN là true, đầu ra Q sẽ được đặt cho thời gian PT.
Khối chức năng định thời xung (TP)
ET là viết tắt của Elapsed Time. Đây là lúc Q đã hoạt động.
Giả sử bạn muốn quạt thông gió bật trong 10 phút. Sau đó, bạn sẽ phải nhập vào 10 phút tại PT và đặt quạt thông gió ở đầu ra Q. Trong nhiều trường hợp, việc này rất hữu ích khi có thể xem quạt đã chạy trong bao lâu . Đó là công dụng của ET.
Biểu đồ của bộ định thời xung
Bạn có thể xem chức năng của bộ định thời xung chi tiết hơn một chút trong biểu đồ thời gian ở trên.
Loại bộ định thời tiếp theo là bộ định thời mở trễ hay còn được gọi tắt là TON. Nhưng thay vì định thời cho xung, nó được sử dụng để định thời mở trễ cho xung. Khi đầu vào được mở, bộ định thời mở trễ sẽ bắt đầu đếm. Sau thời gian PT trôi qua, đầu ra Q sẽ được “set”. Đây cũng là lý do cho cái tên của nó.
Ngõ ra của tín hiệu sẽ được mở sau một độ trễ nhất định.
Khối chức năng định thời mở trễ (TON)
Bộ định thời mở trễ có cùng chân đầu vào và đầu ra như bộ định thời xung. Và một lần nữa, nó vẫn có ET để xem bao nhiêu thời gian đã trôi qua.
Trong biểu đồ cho bộ đếm thời gian mở trễ bật bên dưới, chức năng được minh họa:
Biểu đồ khối định thời mở trễ
Một số người khẳng định bộ định thời mở trễ là bộ định thời duy nhất bạn cần. Nhưng trước khi giải thích lý do tại sao, hãy để tôi giới thiệu với bạn một loại bộ định thời thứ ba và cuối cùng.
Chức năng của bộ hẹn giờ trễ tắt (TOF) rất giống với TON. Nhưng với một sự khác biệt lớn
| Nó sẽ tắt đầu ra sau một thời gian trễ
Trong thời điểm đầu vào được đặt thành true, đầu ra sẽ được “set”. Miễn là đầu vào vẫn ‘true”, đầu ra sẽ giữ nguyên cho đến khi hết thời gian PT. Sau thời gian đó, đầu ra sẽ bị tắt.
Khối chức năng định thời tắt trễ (TOF)
Thoạt nhìn, bộ định thời tắt trễ này có vẻ rất giống với bộ định thời xung (PT). Nhưng chúng cũng có một điểm khác biệt quan trọng.
Đầu ra của bộ định thời xung sẽ được bật trong thời gian PT ngay cả khi đầu vào chuyển thành “false” ở giữa thời gian. Điều này là do bộ định thời tìm kiếm một cạnh lên ở đầu vào. Tuy nhiên đối với bộ định thời tắt trễ , thời gian sẽ ngừng đếm nếu đầu vào là “true” .
Biểu đồ của bộ định thời tắt trễ
Ba bộ định thời này là bộ định thời chính thức được mô tả trong IEC 61131-3. Về mặt kỹ thuật, bạn có thể xây dựng tất cả chúng bằng cách chỉ sử dụng bộ định thời mở trễ .Điều đó hoàn toàn khả thi khi bạn dùng thêm các khối bit logic.
Loại khối chức năng tiếp theo không chỉ có đầu vào và đầu ra nữa. Chúng còn có một kiểu dữ liệu khác. Đã đến lúc chúng ta tìm hiểu đến những khối chức năng đếm PLC.
Đếm là rất hành động cơ bản trong lập trình PLC. Máy đã sản xuất bao nhiêu sản phẩm? Công cụ ở bước nào của trình tự? Có nhiều lý do để sử dụng bộ đếm trong chương trình PLC.
IEC cung cấp ba khối đếm tiêu chuẩn khác nhau. Một là để đếm xuôi, một để đếm ngược và một để đếm ngược hoặc xuôi.
Hãy xem bắt đầu với khối đếm đầu tiên !
Khối đếm này có 3 đầu vào và hai đầu ra. Mặc dù số đầu vào và đầu ra có vẻ như rất nhiều, nhưng chúng đều cần thiết để có thể đếm được. Nhưng trước khi xem xét chi tiết từng đầu vào và đầu ra, hãy để tôi giải thích ngắn gọn cách hoạt động của khối đếm xuôi.
| Mỗi xung trên CU sẽ đếm CV tăng lên 1. Khi CV> = PV thì Q được “set”.
Đầu vào CU tìm kiếm một cạnh lên. Khi điều đó xảy ra, CV đầu ra sẽ tăng lên 1. Để có thể làm điều đó, CV đầu ra cần nhận một kiểu dữ liệu khác là số nguyên (integer).
Vì số nguyên là hệ số 16 bit (với số đầu tiên được sử dụng cho dấu) nên bạn có thể đếm tới 32767. Cả PV đầu vào và CV đầu ra đều thuộc kiểu dữ liệu số nguyên. PV là giới hạn khi đầu ra “boolean” Q được “set”.
Khối chức năng đếm xuôi (CTU)
Đầu vào reset (R) được sử dụng để đặt giá trị CV thành 0. Chúng ta thường bắt đầu đếm ngược từ 0 vì theo cách đó, đầu ra CV sẽ luôn đại diện cho số lượng xung đã đếm được trên CU.
Đối với bạn thích ngôn ngữ mã hóa văn bản, đây là phần thân khối chức năng trong ngôn ngữ structured text :
IF R THEN
CV := 0;
ELSIF CU AND (CV < PVmax) THEN
CV := CV + 1;
END_IF;
Q := (CV >= PV);
Đôi khi bạn cũng sẽ cần phải đếm ngược. Thường thì bạn sẽ muốn chương trình PLC của mình thực hiện một hoạt động trong một khoảng thời gian nhất định. Đối với trường hợp này thì khối đếm ngược rất tiện dụng.
| Mỗi xung trên CD được đếm thì CV giảm xuống 1. Khi CV <= 0 thì Q được “set”.
Nó hoạt động giống hệt như bộ đếm xuôi, nhưng thay vì đếm lên 1 , nó đếm xuống 1.Điều này đưa đến một sự khác biệt khác giữa bộ đếm xuôi và ngược. Khi đếm ta bắt đầu từ đâu?
Khi đếm xuôi chúng ta thường chỉ đếm từ 0. Nhưng khi đếm ngược chúng ta cần đặt một giá trị nhất định để chúng ta có thể đếm ngược từ đó. Đó là lý do tại sao chúng ta phải nhập LD. Khi LD được đặt thành true, đầu ra CV được đặt thành PV.
Khối chức năng đếm ngược (CTD)
Phần thân khối chức năng trông giống như thế này trong ngôn ngữ structured text :
IF LD THEN
CV := PV;
ELSIF CD AND (CV > PVmin) THEN
CV := CV – 1;
END_IF;
Q := (CV <= 0);
Bây giờ bạn đã học được cả cách đếm xuôi và đếm ngược, đã đến lúc chúng ta tìm hiểu đến khối đếm cuối cùng.
Đôi khi có thể thực tế để có thể đếm cả xuôi và ngược . Đó là lý do tại sao IEC cũng cung cấp một khối chức năng dùng để đếm cả xuôi và ngược.
Khối đếm có 5 đầu vào và 3 đầu ra. Tất cả chúng đều có cùng tên với các đầu vào và đầu ra trên các khối đếm mà ta đã tìm hiểu trước đó. Khối này là sự kết hợp của hai khối trước đó. Tất cả các đầu vào và đầu ra đều có chức năng giống nhau.
Khối chức năng đếm ngược xuôi (CTUD)
Để thực sự biết cách khối chức năng này hoạt động, hãy để tôi chỉ cho các bạn phần “thân” của khối chức năng:
IF R THEN
CV := 0;
ELSIF LD THEN
CV := PV;
ELSE
IF NOT (CU AND CD) THEN
IF CU AND (CV < PVmax) THEN
CV := CV + 1;
ELSIF CD AND (CV > PVmin) THEN
CV := CV – 1;
END_IF;
END_IF;
END_IF;
QU := (CV >= PV);
QD := (CV <= 0);
Đoạn code này thoạt nhìn có thể hơi phức tạp. Nhưng nó thực sự chỉ là sự kết hợp của bộ đếm xuôi và ngược.Khi CU đếm xung thì CV tăng lên 1 và khi CD đếm xung thì CV giảm 1. Mỗi đầu ra QU và QD đều được thiết lập với các điều kiện tương tự như với hai khối đếm trước đó.
Tôi thích nghĩ về loại khối chức năng tiếp theo giống như việc đặt câu hỏi. A có bằng B không? CV có lớn hơn PV không? Đã đến lúc để so sánh các con con số !
So sánh thực sự là một cái gì đó đã xảy ra trong nhiều khối mà chúng tôi đã giới thiệu. Lấy ví dụ khối OR so sánh hai đầu vào kiểu “boolean”. Nếu tổng của chúng bằng 1, đầu ra sẽ được “set”.
Giờ đây, chúng ta không chỉ có thể so sánh các kiểu dữ liệu boolean trong FBD. Trên thực tế, chúng ta có thể so sánh tất cả các số thực và hầu hết các kiểu dữ liệu. Các khối này không chỉ tiện dụng, tôi cũng sẽ hứa với bạn rằng chúng là thứ mà bạn sẽ sử dụng rất nhiều.
Về cơ bản , tất cả các khối so sánh đều có hai hoặc nhiều đầu vào và một đầu ra. Các đầu vào có thể sử dụng bất kỳ kiểu dữ liệu cơ bản nào và đầu ra là kiểu dữ liệu boolean. Bạn phải cẩn thận khi so sánh các kiểu dữ liệu, vì nó có thể hơi phức tạp.
Hãy bắt đầu với khối so sánh cơ bản đầu tiên:
Khối hàm bình đẳng được sử dụng để xem liệu hai biến có bằng nhau hay không. Nếu vậy, đầu ra sẽ được thiết lập. Tôi thích nghĩ về khối khi đặt câu hỏi này:
IN1 có bằng IN2 không?
Mặc dù khối này có vẻ đơn giản, nhưng bạn phải cẩn thận một chút với loại dữ liệu bạn so sánh ở đây. So sánh số nguyên với khối này có lẽ là kiểu dữ liệu bạn sẽ sử dụng nhiều nhất. Giả sử bạn muốn đặt đầu ra khi máy ở bước 12. Khi đó IN1 sẽ là biến bước và IN2 sẽ là 12.
Có ba dấu chấm giữa hai đầu vào để minh họa rằng khối này có thể nhận nhiều hơn hai đầu vào. Để đầu ra được “set”, tất cả các đầu vào phải bằng nhau. Chức năng này được mô tả như thế này bằng cách sử dụng structured text :
OUT := IN1 = IN2 = … = INn
Khối chức năng bình đẳng
Tuy nhiên, việc so sánh các kiểu dữ liệu khác bằng nhau có thể gây ra một số vấn đề. Nếu bạn cố gắng sử dụng bình đẳng để so sánh một giá trị analog (kiểu dữ liệu thực) với một kiểu dữ liệu thực khác, bạn sẽ thấy rằng rất khó để chúng có thể bằng nhau.
Đối với khối này để thiết lập đầu ra thì cần phải yêu cầu hai đầu vào phải chính xác bằng nhau. Hãy nhớ rằng kiểu dữ liệu thực là số dấu phẩy động. Bạn có thể muốn điều gì đó xảy ra khi nhiệt độ lên tới 80 độ. Nhưng nếu bạn sử dụng số thực ở đây, nhiệt độ chính xác phải bằng 80,0 độ không được sai một li.
Đối với loại so sánh này, tốt hơn là sử dụng kết hợp các khối so sánh. Bằng cách đó, bạn có thể so sánh nó với một loạt các số chứ không chỉ một.
Nhưng nếu bạn muốn kiểm tra xem một số con số không bằng nhau thì sao? Tất nhiên bạn chỉ có thể phủ định đầu ra của khối bình đẳng. Nhưng điều đó sẽ khá khó hiểu. Và tại sao phải làm điều đó khi có một khối chức năng để thực hiện chính xác điều đó.
Khối hoạt động theo cách tương tự như trước nhưng kiểm tra sự bất bình đẳng thay vì bình đẳng. Câu hỏi để ghi nhớ chức năng của khối này là:
|IN1 KHÔNG bằng IN2?
Nếu vậy, đầu ra sẽ được “set”. Nhưng chỉ miễn là chúng không bằng nhau. Ngay sau khi các đầu vào bằng nhau, đầu ra sẽ bị tắt.
Khối chức năng bất bình đẳng
Đối với ai đã quen thuộc với ngôn ngữ structured text bạn sẽ biết biểu tượng cho bất đẳng thức. Nó tương tự như những gì trong nhiều ngôn ngữ lập trình được ghi chú như thế này: “! = “. Nhưng trong lập trình PLC bất đẳng thức được kí hiệu là “<>”.
Lưu ý rằng khối chức năng này chỉ nhận hai đầu vào.
Nếu bạn còn nhớ trước đây chúng ta gặp vấn đề với việc so sánh các kiểu dữ liệu thực với hàm bình đẳng. Khối này và khối tiếp theo có thể là giải pháp cho điều đó. Bởi vì với khối này, chúng ta có thể kiểm tra xem một biến có nằm trong một giới hạn số hay không.
Chính thức khối này được gọi là chuỗi tăng dần. Hãy nghĩ về nó như bằng câu hỏi:
| IN1 có nhỏ hơn IN2 không?
Về cơ bản, nó kiểm tra xem giá trị của đầu vào đầu tiên có ít hơn (nhỏ hơn) so với giá trị của đầu vào thứ hai hay không. Khối hoạt động rất tốt với các số thực vì bạn có thể dễ dàng kiểm tra nhiệt độ phòng có nhỏ hơn 80.5 độ hay không.
Khối chức năng Ít hơn
Có một lý do khiến tên chính thức của khối này chuỗi tăng theo trình tự. Cũng giống như khối bình đẳng, bạn có thể mở rộng khối này với nhiều hơn 2 đầu vào. Khi làm điều đó, cái tên chuỗi tăng theo trình tự sẽ có nhiều ý nghĩa hơn.
Bởi vì với nhiều đầu vào, giá trị của những đầu vào đó phải tạo nên một chuỗi giá trị ngày càng tăng. In1 phải nhỏ hơn IN2, tức là phải nhỏ hơn IN3, v.v. Hàm có thể được mô tả bằng structured text như sau:
OUT := (IN1 < IN2) AND (IN2 < IN3) AND … (INn-1 < INn)
Khi bạn có thể thực hiện một chuỗi tăng dần, tất nhiên bạn cũng có thể tạo một chuỗi giảm dần.Tóm lại , bạn cũng có thể kiểm tra xem một số giá trị có lớn hơn một giá trị khác hay không. Câu hỏi mà khối này đặt ra là:
|IN1 có lớn hơn IN2 không?
Nhưng cũng giống như khối trước, khối này cũng có thể nhận nhiều hơn hai đầu vào. Đó là lý do tại sao khối này cũng là một chuỗi số, lần này là một chuỗi giảm dần để thiết lập đầu ra.
Khối chức năng lớn hơn
Mỗi đầu vào sau phải nhỏ hơn đầu vào trước , do đó tạo ra một chuỗi giảm dần. Nếu khối này được viết bằng ngôn ngữ structured text thì chức năng của khối lệnh lớn hơn trông giống như sau:
OUT := (IN1 > IN2) AND (IN2 > IN3) AND … (INn-1 > INn)
Sự kết hợp của các khối lớn hơn và nhỏ hơn cũng có thể rất hữu ích. Khi nói các giá trị analog, bạn thường muốn kiểm tra xem chúng có nằm trong một phạm vi nhất định hay không.
Ví dụ: Nếu nhiệt độ từ 90 đến 100 độ. Ở đây bạn có thể kiểm tra xem nhiệt độ có lớn hơn 90 hay không và sau đó kiểm tra xem nó có nhỏ hơn 100 hay không.
Kết hợp các khối so sánh được sử dụng rộng rãi. Bạn thường sẽ thấy khối bình đẳng được kết hợp với nhỏ hơn hoặc lớn hơn. Mặc dù đây chỉ là sự kết hợp của các khối, chúng thường có các khối chức năng riêng:
So sánh hai hoặc nhiều giá trị là hữu ích. Nhưng đôi khi, thay vì so sánh, bạn sẽ phải lựa chọn giữa các giá trị. Các khối chức năng lựa chọn sẽ giúp bạn làm điều đó.
Điểm chung của chúng là chúng cung cấp cho bạn tùy chọn chọn giá trị. Có hoặc không có điều kiện. Bản chất của các khối này thực sự chỉ là một phép gán . Bạn sẽ chọn một trong các đầu vào và gán nó cho đầu ra của các khối này.
Khối lựa chọn đầu tiên và đơn giản nhất là khối chức năng di chuyển. Trên thực tế, bạn đã từng thấy khối này trước đây. Hoặc ít nhất là một khối có cùng chức năng. Khối chức năng gán.
Những gì khối này làm là nó gán giá trị đầu vào cho đầu ra của nó. Và đoán xem. Khối này thực hiện chính xác những điều tương tự. Bạn có thể thắc mắc tại sao FBD cung cấp hai khối có cùng chức năng. Chúng cũng tương tự nhau, nhưng có một điểm khác biệt quan trọng.
Trong khi khối này có thể được sử dụng với bất kỳ kiểu dữ liệu nào, khối gán chỉ có thể được sử dụng với kiểu dữ liệu boolean. Với khối di chuyển, bạn có thể di chuyển bất kì kiểu dữ liệu nào sang một kiểu dữ liệu bất kỳ khác .
Đối với bạn thích structured text , việc biểu diễn khối trông đơn giản như :
OUT := IN
Trong FBD, khối di chuyển trông như thế này:
Khối chức năng di chuyển
Như bạn có thể thấy khối này chỉ có một đầu vào và một đầu ra. Khái niệm lựa chọn không thực sự áp dụng cho khối này, vì bạn chỉ có một giá trị để chọn. Mặc dù vậy, nhiều khi bạn sẽ có thể thêm nhiều đầu ra hơn vào khối di chuyển. Do đó, một khối di chuyển có thể được sử dụng để di chuyển một giá trị đến những nơi khác nhau.
Khi tôi nói rằng khối này hoạt động với bất kỳ kiểu dữ liệu nào, tôi thực sự có ý đó. Bạn có thể di chuyển các giá trị từ bất kỳ kiểu dữ liệu nào sang một kiểu dữ liệu bất kỳ khác. Bạn thậm chí không cần phải đặt đầu ra có cùng một kiểu dữ liệu với đầu vào. Bạn có thể tự do di chuyển, ví dụ: một số nguyên thành thực v.v.
Điều này làm cho khối di chuyển hơi phức tạp. Bạn phải thực sự cẩn thận khi chuyển từ kiểu dữ liệu này sang kiểu dữ liệu khác. Đối với người mới bắt đầu, tôi thực sự khuyên bạn chỉ nên di chuyển các giá trị sang cùng kiểu dữ liệu với đầu vào. Trên thực tế, tôi hiếm khi khuyên bạn nên trộn các kiểu dữ liệu ngay cả đối với các chuyên gia. Nó chỉ làm cho chương trình PLC của bạn trở nên phức tạp.
Lựa chọn nhị phân kéo chúng ta đến gần hơn một chút với khái niệm lựa chọn. Nó cung cấp cho bạn cơ hội để chọn giữa 2 giá trị để sau đó gán cho một đầu ra.
Tên của khối cho biết rằng bạn có đầu vào nhị phân (boolean) có thể chọn 1 trong 2 giá trị đầu vào. Do đó khối này có 3 đầu vào. Một điều kiện (G) và hai giá trị (IN0, IN1). Điều kiện có kiểu dữ liệu boolean và được sử dụng để chọn giữa hai giá trị.
Khối chức năng lựa chọn nhị phân (SEL)
Bạn rất có thể sẽ nhận thấy rằng các tên đầu vào hơi khác so với các khối chức năng khác. Điều đó chỉ để làm cho khối dễ hiểu hơn. Vì điều kiện (G) có thể nhận hai giá trị khác nhau là 0 và 1, nên gọi các đầu vào IN0 và IN1 là hợp lý.
Nếu G là 0, đầu vào IN0 sẽ được chọn. Và nếu G là 1 thì đầu vào IN1 sẽ được chọn. Giá trị của đầu vào đã chọn sau đó sẽ được gán cho đầu ra (OUT).
Một lần nữa, chức năng này có thể được biểu diễn trong structured text:
IF G = 0 THEN
OUT := IN0
ELSIF G = 1 THEN
OUT := IN1
END_IF;
Trong một số trường hợp, bạn thậm chí có thể có nhiều hơn 2 giá trị mà bạn muốn chọn. Đây là lí do bộ ghép kênh mở rộng được sử dụng. Bạn thậm chí có thể thấy từ ghép kênh quen thuộc nếu bạn biết một vài thiết bị điện tử kỹ thuật số. Và khối này có cùng chức năng – để chọn một trong nhiều đầu vào.
Khối chức năng Bộ ghép kênh mở rộng (MUX)
Không giống như bộ chọn nhị phân, đầu vào điều kiện, có tên là K trong khối này, không chỉ có thể nhận một kiểu dữ liệu boolean. Trên thực tế, nó có thể nhận bất kỳ kiểu dữ liệu cơ bản nào. Mặc dù kiểu dữ liệu duy nhất thực sự có ý nghĩa để sử dụng ở đây là số nguyên.
Vì bạn phải chọn giữa các đầu vào từ IN0 đến Inn nó chỉ có ý nghĩa để đưa điều kiện K một con số tổng quát.Trên thực tế, nó chỉ hợp lệ để cho K một số từ 0 đến n. Khái niệm về hàm có thể giống như sau:
OUT := INK
Trong đó K phải nằm trong phạm vi 0 … n, với n là số lượng đầu vào.
Cho đến nay, bạn đã thấy cách chọn giá trị bằng cách sử dụng một đầu vào có điều kiện. Đầu vào đó có thể là nhị phân hoặc số nguyên tùy thuộc vào số lượng đầu vào mà bạn phải chọn. Nhưng đôi khi bạn sẽ muốn chọn một giá trị tùy thuộc vào chính các giá trị đó. Có thể là bạn muốn chọn giá trị cao nhất hoặc thấp nhất trong số các biến khác nhau. Với hai khối chức năng tiếp theo, bạn có thể thực hiện chính xác điều đó.
Khối chức năng tối thiểu có thể mở rộng (MIN)
Việc chọn biến có giá trị nhỏ nhất là điều mà tôi có thể đảm bảo rằng bạn sẽ sử dụng vào một lúc nào đó. Tên chính thức của khối chức năng này là tối thiểu có thể mở rộng, nhưng thường chỉ được gọi là tối thiểu hoặc MIN. Nó được gọi là có thể mở rộng vì bạn có thể thêm bất kỳ số lượng đầu vào nào trên khối. Tất cả các đầu vào có thể lấy bất kỳ kiểu dữ liệu cơ bản nào và chúng thậm chí có thể thuộc các kiểu dữ liệu khác nhau trên cùng một khối.
OUT := MIN (IN1, IN2)
Những gì sẽ được gán cho đầu ra của khối luôn là giá trị của đầu vào nhỏ nhất. Hay nói cách khác – đầu vào có giá trị nhỏ nhất sẽ được chọn.
Khi bạn có một khối để tìm giá trị nhỏ nhất, tất nhiên bạn cũng sẽ có một khối để tìm giá trị lớn nhất. FBD cũng cung cấp một khối chức năng tiêu chuẩn để làm điều đó. Nó hoạt động giống hệt như hàm cực tiểu, nhưng chọn biến có giá trị lớn nhất và gán giá trị đó cho đầu ra của nó. Ngoài ra, khối này nhận bất kỳ kiểu dữ liệu cơ bản nào làm đầu vào và đầu ra.
Khối chức năng tối đa có thể mở rộng (MAX)
Với cả 2 khối này, bạn nên biết bạn sử dụng kiểu dữ liệu nào ở đầu ra. Nếu bạn đang cố gắng tìm giá trị lớn nhất của hai kiểu dữ liệu thực, ví dụ: 80,46 và 206,95 và bạn sử dụng số nguyên làm đầu ra, đầu ra sẽ đơn giản là 206.
OUT := MAX (IN1, IN2)
Một tính năng thông minh với hai khối này là bạn cũng có thể so sánh các kiểu dữ liệu ngày và giờ. Giả sử bạn có rất nhiều dấu ngày tháng trong chương trình PLC của mình và bạn muốn tìm cái mới nhất. Với chức năng tối đa, bạn luôn có thể tìm thấy ngày gần đây nhất.
Bằng cách kết hợp hai khối chức năng trước đó, chúng ta có thể tạo ra một chức năng hoàn toàn mới. Chức năng này không liên quan nhiều đến lựa chọn, mà là về giới hạn. Đó là lý do tại sao khối chức năng này được gọi là hàm giới hạn. Thông thường, bạn sẽ muốn đặt giới hạn cho một phạm vi giá trị trong chương trình PLC.
Khối chức năng giới hạn (LIMIT)
Chức năng hàm giới hạn thực sự chỉ được tạo thành bởi các hàm cực tiểu và cực đại . Điều này có thể thấy nếu chúng ta nhìn vào phần thân của khối chức năng:
OUT := MIN ( MAX (IN, MN), MX)
Điều thực sự xảy ra ở đây là bạn đặt giới hạn cực tiểu và cực đại cho bất kỳ biến nào bạn đặt ở đầu vào (IN). Giá trị cực tiểu và cực đại được đặt ở đầu vào (MIN và MAX) và cả ba đầu vào có thể nhận bất kỳ kiểu dữ liệu cơ bản nào.
Tất cả các khối chức năng trên hầu hết là các khối được mô tả trong IEC 61131-3, tiêu chuẩn chính thức cho các ngôn ngữ lập trình PLC. Có nhiều khối chức năng khác được cung cấp trong FBD. Trên thực tế, hầu như có mọi khối chức năng cho mọi hoạt động mà bạn có thể thực hiện trong lập trình PLC. Trong số đó có:
Và nhiều thứ khác nữa…
Tôi thực sự khuyên bạn nên bắt đầu bằng cách vọc vạch các automation IDE như TIA Portal hoặc Codesys. Hãy thử tạo các chương trình PLC đơn giản bằng cách sử dụng FBD. Tôi thấy đó là cách tốt nhất để tìm hiểu về các khối chức năng mới.
Vấn đề ở đây là một khối chức năng đại diện cho một chức năng. Bên trong thân khối chức năng, bạn sẽ thấy rằng các chức năng được mô tả bằng structured text , ladder logic hoặc ngôn ngữ lập trình PLC khác. Có rất nhiều khối tiêu chuẩn cung cấp cho bạn rất nhiều chức năng khác nhau. Nhưng đôi khi không đủ.
Đây là lý do tại sao bạn sẽ cần phải xây dựng các khối chức năng của riêng mình. Trên thực tế, đây là một trong những nền tảng trong lập trình PLC có cấu trúc.
Trên đây là tổng quan về ngôn ngữ lập trình PLC FBD. Hy vọng những thông tin mà B2bmart.vn tổng hợp sẽ giúp bạn đọc hiểu rõ về ngôn ngữ lập trình PLC này