Ngày nay, sự phát triển mạnh mẽ của công nghệ truyền thông và công nghệ phần mềm đã mở ra các kiến trúc ứng dụng phân tán với các ưu điểm vượt trội. Những tiến bộ công nghệ mới trong các hệ thống điều khiển và giám sát cũng không nằm ngoài xu hướng đó.
TS. Hoàng Minh Sơn
Hệ phân tán và ứng dụng phân tán
Ngày nay, phần lớn các hệ thống thông tin xung quanh chúng ta đều dựa trên kiến trúc phân tán. Các ứng dụng Internet như Email, Web, Chat là những ví dụ tiêu biểu. Sự phát triển mạnh mẽ của công nghệ truyền thông và công nghệ phần mềm đã mở ra các kiến trúc ứng dụng phân tán với các ưu điểm vượt trội. Những tiến bộ công nghệ mới trong các hệ thống điều khiển và giám sát cũng không nằm ngoài xu hướng đó.
Trước hết ta cần làm rõ thế nào là một “hệ thống phân tán” cũng như thế nào là một “ứng dụng phân tán”. Một hệ thống phân tán là một hệ thống gồm các thành phần xử lý phân tán, giao tiếp với nhau qua một cơ sở hạ tầng truyền thông chung. Một hệ thống phân tán có thể mang ý nghĩa của một hệ phần cứng, một hệ phần mềm hoặc kết hợp cả hai. Mạng điện thoại, Internet, WWW (World Wide Web) hoặc một hệ DCS (Distributed Control System) đều là các hệ thống phân tán. Còn ứng dụng phân tán được hiểu là một ứng dụng phần mềm trên một hệ phân tán. Chúng ta chỉ có một Internet cũng như chỉ có một WWW, song có rất nhiều ứng dụng Internet cũng như vô vàn ứng dụng Web. Một hệ DCS khi được đưa vào sử dụng ta có các ứng dụng điều khiển và giám sát (phân tán). Như vậy, khi ta nói tới ứng dụng phân tán luôn tức là ta nói về các ứng dụng phần mềm có kiến trúc phân tán.
Vậy một ứng dụng phân tán có khác gì với các ứng dụng khác? Liệu có phải cứ sử dụng mạng truyền thông thì các ứng dụng phần mềm trong hệ thống đó được gọi là “phân tán”?. Có hai loại ứng dụng phần mềm mà ta không gọi là phân tán. Loại thứ nhất - được gọi là ứng dụng đơn độc (stand-alone application) — hoàn toàn dựa trên các chương trình chạy trên một máy tính. Không quan trọng là máy tính có được nối mạng hay không, các ứng dụng không có nhu cầu sử dụng tài nguyên của mạng và cũng không có khả năng trao đổi dữ liệu với một chương trình chạy trên một máy tính khác. Ví dụ, trong một ứng dụng soạn thảo văn bản, ta có thể sử dụng các chương trình khác nhau như Word, Excel và Visio, song các chương trình đều chạy trên một máy tính. Dù sau khi xong một bản thảo, ta có thể trao đổi văn bản qua mạng cục bộ, nhưng trong khi soạn thảo thì chương trình Word chạy trên một máy tính không có khả năng nhập trực tuyến một bảng trong chương trình Excel chạy trên một máy khác.
Loại ứng dụng thứ hai được gọi là ứng dụng nối mạng (networked application). Một ứng dụng nối mạng không khác nhiều so với một ứng dụng đơn độc, chỉ có điều nó có khả năng và có nhu cầu trao đổi dữ liệu với các ứng dụng khác trong mạng. Ví dụ, một ứng dụng SCADA sử dụng một chương trình phần mềm HMI đa năng ghép nối với chương trình chạy trên một hoặc nhiều thiết bị khả trình (PLC) là một ứng dụng nối mạng. Ở đây có thể thấy rõ sự khác nhau cơ bản giữa một ứng dụng nối mạng và một ứng dụng phân tán. Trong một ứng dụng nối mạng, các chương trình không được thiết kế trên cơ sở một kiến trúc phân tán và một kiến trúc giao tiếp chung, mà được phát triển hoàn toàn độc lập, đơn lẻ với các mục đích khác nhau. Thông thường, mỗi chương trình độc lập, đơn lẻ này có một thế mạnh riêng, một phạm vi chức năng riêng, việc “nối mạng” chúng với nhau mang lại lợi thế sử dụng chung tài nguyên và các chức năng thực hiện. Trái lại, các chương trình của một ứng dụng phân tán được thiết kế ngay từ đầu trên một kiến trúc chung, với các chức năng được phân chia rõ ràng để cùng thực hiện một mục đích chung. Các chương trình của một ứng dụng phân tán có khả năng giao tiếp một cách tự nhiên để chia sẻ và phối hợp trong công việc, không cần một phần mềm giao diện bổ sung nào khác. Vì thế, việc xây một ứng dụng phân tán đơn giản hơn nhiều so với một ứng dụng nối mạng. Ta cứ so sánh cách xây dựng các ứng dụng điều khiển và giám sát quá trình trên nền một hệ DCS với giải pháp sử dụng các PLC đơn lẻ kết hợp một phần mềm SCADA/HMI sẽ thấy ngay sự khác nhau cơ bản giữa một ứng dụng phân tán với một ứng dụng nối mạng. Cơ chế giao tiếp giữa các chương trình trong một ứng dụng phân tán là giao tiếp ngầm (implicit communication), được tích hợp sẵn chứ người xây dựng ứng dụng không cần phải lập trình, không cần biết tới giao thức mạng cụ thể phía dưới. Trong một hệ DCS, thậm chí ta không bao giờ biết giao thức sử dụng cho bus hệ thống là loại gì. Ngược lại, cơ chế giao tiếp trong một ứng dụng nối mạng là giao tiếp hiện (explicit communication), có nghĩa là các quan hệ giao tiếp phải do người xây dựng ứng dụng cấu hình hoặc lập trình. Khi phải ghép nối một phần mềm SCADA như iFIX của Intellution với PLC S7-300 của Siemens, ta không thể không biết cụ thể về mạng và giao thức truyền thông phía dưới.
Vấn đề của sự giao tiếp
Có nhiều công nghệ khác nhau để xây dựng một ứng dụng phân tán, tùy theo lĩnh vực cụ thể cũng như tùy theo nền phần cứng/phần mềm hỗ trợ. Một trong những công nghệ hiện đại có tên là đối tượng phân tán. Vậy, công nghệ đối tượng phân tán có vai trò gì ở đây? Để hiểu rõ vấn đề chính là cơ chế giao tiếp, ta hãy cùng xem các đoạn mã chương trình C++ đơn giản dưới đây.

Trong đoạn mã trên, ta định nghĩa một lớp đối tượng với hai hàm thành viên truy nhập dữ liệu, sau đó viết một chương trình đơn giản sử dụng lớp đối tượng đó. Lưu ý đặc biệt các đoạn mã viết trong mã chương trình chính. Ở đây một đối tượng obj thuộc lớp A được định nghĩa và sử dụng trong cùng một chương trình. Đoạn mã trên được biên dịch và liên kết thành chương trình chạy có tên Prog.exe, rõ ràng không có vấn đề gì phải bàn cho lắm. Tuy nhiên, nếu ta muốn “phân tán” đoạn mã trên thành hai chương trình riêng biệt, tạm gọi là Prog1 và Prog2, trong đó một chương trình khai báo và gọi hàm đặt giá trị, chương trình kia gọi hàm đọc giá trị của obj, mã hai chương trình đó sẽ phải viết lại như thế nào? Thử xem hai đoạn mã dưới đây.

Đoạn mã vòng lặp được bổ sung ở chương trình 1 với mục đích để người sử dụng có thể điều khiển nó “chờ” chương trình 2 chạy và đọc dữ liệu từ chương trình 1. Tuy nhiên, người mới học lập trình với C++ cũng biết là đoạn mã chương trình thứ hai không biên dịch được bởi compiler không hề biết tới biến obj được khai báo ở đâu. Ý tưởng đầu tiên ở đây là liệu có thể khắc phục lỗi bằng cách bổ sung dòng
#include "Prog1.cpp"
trong mã nguồn của chương trình thứ hai ("Prog2.cpp")? Đương nhiên là cũng không thể được rồi, một chương trình không thể có hai hàm main(). A hà! Thế thì đưa khai báo đối tượng vào một file khác và để cả hai chương trình cùng sử dụng chung biến như đoạn mã dưới đây liệu có được không?

Bây giờ thì cả hai chương trình đều cho biên dịch và chạy, để kiểm nghiệm kết quả ta có thể chạy các chương trình ở chế độ gỡ rối hoặc bổ sung một vài dòng in dữ liệu ra màn hình. Chương trình 1 được chạy trước và chờ, sau đó ta mới chạy chương trình 2. Nhưng trái với mong đợi, chương trình 2 vẫn cho ra giá trị của biến i bằng 5 chứ không phải 6 như chương trình 1 đã đặt!
Thực tế là, để hai chương trình riêng biệt “nói chuyện” với nhau ta không thể sử dụng kỹ thuật lập trình đơn giản như vậy, dù có là “hướng đối tượng” hay không. Vấn đề nằm ở chỗ là ta đã sai lầm và ngộ nhận một cách không thể tha thứ được trong đoạn mã viết trên đây. À, làm gì có chuyện cái tên obj ở trong hai chương trình riêng biệt lại chỉ cùng một biến! Mỗi chương trình có một không gian địa chỉ riêng biệt, dù có tên giống nhau hay thậm chí địa chỉ (tất nhiên là logic) giống nhau đi chăng nữa ta cũng không thể chỉ dùng tên hay địa chỉ mà hy vọng có sự dùng chung biến một cách “tự nhiên” như thế.
Trên đây ta mới đề cập tới hai chương trình viết trên cùng một ngôn ngữ, chạy trên cùng hệ điều hành, trên cùng một máy tính. Vấn đề còn phức tạp hơn nhiều là khi hai chương trình được viết trên hai ngôn ngữ khác nhau, chạy trên hai máy tính và thậm chí là với hai hệ điều hành khác nhau. Một ví dụ rất thực tế là làm thế nào một khối đồ thị trên trạm vận hành chạy Windows 2000 có thể lấy dữ liệu từ một đối tượng là bộ PID trong thiết bị điều khiển chạy trên nền một hệ điều hành thời gian thực như VxWorks? Một đối tượng cổ điển chỉ có ý nghĩa trong một chương trình, không có khả năng sử dụng từ một chương trình khác (trên cùng một máy hoặc trên một máy khác). Trái lại, một đối tượng phân tán cho phép ta tạo ra từ xa, gọi các phép toán của nó từ xa tương tự như một đối tượng cùng trong một chương trình.
Đối tượng phân tán
Đối tượng phân tán (distributed object) cũng là một hướng phát triển tự nhiên từ phương pháp luận hướng đối tượng, bên cạnh phần mềm thành phần. Trong khi phần mềm thành phần quan tâm tới việc đóng gói các đối tượng để có thể sử dụng lại một cách thuận tiện, thì đối tượng phân tán tập trung vào vấn đề kiến trúc các đối tượng có khả năng giao tiếp một cách trong suốt trên các nền và hệ thống mạng khác nhau (giao tiếp ngầm). Cũng giống như phần mềm thành phần, một đối tượng phân tán có thể thực hiện ở một ngôn ngữ bất kỳ, nhưng nó phải có các giao diện theo một chuẩn nào đó để có thể hợp tác với nhau liên quá trình và xuyên mạng một cách đơn giản như hai đối tượng trong một chương trình.
Nói như vậy, một đối tượng phân tán cũng được sử dụng khi đã biên dịch, đóng gói hoàn chỉnh dưới dạng một server. Có thể nêu ra một số ví dụ về đối tượng phân tán ở đây như Web-Server, OPC-Server, XML-Services. Tuy nhiên, việc sử dụng chúng có thể vẫn đòi hỏi phải lập trình phía client, có thể là một đối tượng phân tán hoặc một chương trình ứng dụng thông thường, ví dụ một trình duyệt Web, một chương trình giao diện người-máy. Ngày nay, đối tượng phân tán và phần mềm thành phần đã gặp nhau ở nhiều điểm, ví dụ trong công nghệ COM/DCOM/ActiveX.
Nói tóm lại, một đối tượng phân tán là một đối tượng phần mềm trong một hệ thống phân tán, có thể được sử dụng bởi các chương trình ứng dụng hoặc các đối tượng khác thuộc cùng một quá trình tính toán, thuộc một quá trình tính toán khác hoặc thuộc một trạm khác trong mạng theo một phương thức thống nhất thông qua giao tiếp ngầm (không để ý tới giao thức truyền thông cụ thể, trong suốt với hệ điều hành, kiến trúc phần cứng và hệ thống mạng). Một đối tượng phân tán có các thuộc tính có thể truy cập được từ xa, có các phép toán có thể gọi được từ xa.
Mỗi đối tượng phân tán - bất kể dạng thực hiện, nền triển khai và vị trí cài đặt - đều có căn cước phân biệt và có thể được sử dụng như các đối tượng trong một chương trình. Lợi thế quyết định ở đây là việc tạo dựng một ứng dụng phân tán được thực hiện ở mức trừu tượng cao hơn so với kiểu lập trình mạng cổ điển, nhờ vậy trên nguyên tắc không khác biệt so với tạo dựng một ứng dụng đơn độc. Để đạt được điều đó, ta cần sự hỗ trợ hữu hiệu của một phần mềm khung (framework). Hiện nay có hai mô hình chuẩn cho những công trình khung đó là COM/DCOM (Component Object Model/Distributed Component Object Model, gọi chung là COM) và CORBA (Common Object Request Broker Architecture). CORBA cho phép sử dụng một cách rộng rãi và linh hoạt hơn, trong khi COM hiện nay hầu như chỉ sử dụng được trên các hệ Microsoft Windows (95, 98, NT, 2000, XP).
Trên H. 1 minh họa cơ chế giao tiếp giữa hai đối tượng COM nằm trên các máy tính khác nhau. COM sẽ thiết lập một đối tượng đại diện (proxy) bên phía client và một đối tượng gốc (stub) bên phía server. Proxy và stub sẽ kết nối với nhau qua kênh giao tiếp với giao thức DCOM. Khi đó, client sẽ thực hiện lời gọi dịch vụ trong không gian địa chỉ của nó tức là giao tiếp trực tiếp với proxy. Proxy sẽ thu thập các thông số, gửi chúng đến stub qua kênh giao tiếp. Stub thực hiện lời gọi đến đối tượng dịch vụ, đóng gói kết quả và đưa về cho proxy. Toàn bộ cơ chế truyền dữ liệu trung gian do COM Engine đảm nhiệm, các đối tượng không cần biết giao thức mạng truyền thông cụ thể phía dưới.

Hình 1: Mô hình giao tiếp COM/DCOM
Công nghệ đối tượng phân tán cũng đi rất sâu vào lĩnh vực tự động hóa hơn là chúng ta cảm thấy, lý do đơn giản là vì bao giờ chúng cũng đứng đằng sau. Các chuẩn OPC, IEC 61499, ProfiNet là một vài ví dụ cũng đã được giới thiệu trong số báo tháng 5/2004 (Xung quanh xu hướng tự động hóa phân tán).
OPC (OLE for Process Control) là một chuẩn giao diện được hiệp hội OPC Foundation xây dựng và phát triển. Dựa trên mô hình đối tượng thành phần phân tán (D)COM của hãng Microsoft, OPC định nghĩa thêm một số giao diện cho khai thác dữ liệu từ các quá trình kỹ thuật, tạo cơ sở cho việc xây dựng các ứng dụng điều khiển phân tán mà không bị phụ thuộc vào mạng công nghiệp cụ thể. Trong thời điểm hiện nay, OPC cũng như COM tuy mới được thực hiện trên nền Windows, song đã có nhiều cố gắng để phổ biến sang các hệ điều hành thông dụng khác. Có thể nói, mỗi công cụ phần mềm điều khiển giám sát hiện nay đều hỗ trợ chuẩn OPC.
PROFInet là một chuẩn do PROFIBUS International xây dựng dựa trên nền Ethernet nhằm thu hút giới sử dụng PROFIBUS. PROFInet đưa ra một mô hình ứng dụng với các đối tượng phân tán dựa trên cơ sở công nghệ COM/DCOM và XML. Chuẩn IEC 61499 cũng đưa ra một mô hình khối chức năng hoàn toàn mới, dựa trên phương pháp luận về xử lý phân tán và hệ sự kiện rời rạc. Vai trò của chuẩn IEC 61499 thể hiện rất rõ trong những công cụ phát triển phần mềm điều khiển dựa trên ngôn ngữ sơ đồ khối chức năng hiện nay.
Tài liệu tham khảo
1. OMG: CORBA — Specification. www.omg.org
2. Microsoft: “DCOM - Technical Overview. White Paper. MSDN-Library, msdn.microsoft.com.
HIENDAIHOA.COM(theo: Tạp chí TĐHNN)































