# Làm giao diện Scada giám sát cho bất cứ dòng PLC nào

Để làm giao diện Scada, chúng ta cần có một "**bản vẽ**" và phần mềm "**thiết kế vector"**. Có thể dùng phần mềm thiết kế có sẵn của Node-RED hoặc có thể dùng phần mềm thiết kế "**Inkscape**" miễn phí. Link bạn vui lòng tìm trên google.

## "Bản vẽ"

Bất cứ gì có thể số hoá được, chúng ta có thể dễ dàng đưa lên và làm thành iNut Scada. Dưới đây là một ví dụ điển hình: Nền một ngôi nhà được sử dụng để làm "**bản vẽ**". Sau đó sử dụng phần mềm thiết kế có sẵn trong Node-red Scada để chèn một icon/hình vector làm ô nhận dữ liệu (bằng cách sét ID).&#x20;

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2Fe6P17AjoZlJr5goThBFQ%2F66722326-17edf600-ee0c-11e9-94b9-225edcc12250.gif?alt=media&#x26;token=e0730c10-b7bf-476d-90f3-1d8ea0effea0" alt=""><figcaption></figcaption></figure>

Vì vậy, bất cứ hình ảnh jpg, png nào đều có thể làm nền - background. Tuy nhiên, nếu bạn đã có một bản vẽ ở các phần mềm thiết kế Scada khác, bạn hãy xuất bản vẽ đó thành dạng ảnh vector ".svg". Sau đó import trực tiếp vào tab "**SVG**" như hình dưới.

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FNlwNvCv4blUaiFvBzlZz%2FScreen%20Shot%202023-01-27%20at%2000.35.01.png?alt=media&#x26;token=6e1880bd-3d11-47d5-869a-841c111ea461" alt=""><figcaption></figcaption></figure>

Ô lệnh để sửa có hình dáng trông như thế này.&#x20;

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FKaLHiCMiCCAyHxO3X1pP%2FScreen%20Shot%202023-01-27%20at%2000.36.00.png?alt=media&#x26;token=2a6994ed-ef15-42bd-a9d8-4e9291dc5422" alt=""><figcaption></figcaption></figure>

Nếu hiện ô này, vui lòng chọn close để tiếp tục dùng phần mềm

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FMhrjgmCgRi2yi78CtpdC%2FScreen%20Shot%202023-01-27%20at%2000.51.08.png?alt=media&#x26;token=c965093c-5963-44d9-aeff-67c3bb42fac0" alt=""><figcaption></figcaption></figure>

## Một ví dụ về Scada iNut PLC

Để dễ dàng cho việc tiếp cận, chúng ta sẽ lấy ví dụ sau:

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2F3Bp9srUj59cZodBKXHhf%2Fui-web-2.png?alt=media&#x26;token=018e4e5d-5890-4b03-99a7-ccd0a536db07" alt=""><figcaption><p>Ví dụ này được tặng kèm theo mọi iNut PLC để bạn dễ dàng hiểu được. </p></figcaption></figure>

Bạn có thể hiểu rằng, việc thiết kế một giao diện SCADA là việc thiết kế một giao diễn gồm 2 phần:

* **Tĩnh (Static)**: Bao gồm đường ống, bể (tank), các khung giao diện hay các hình nền (background) khác.
* **Động (Dynamic)**:
  * Đơn giản: text, giá trị thanh ghi word (float), bit
  * Phức tạp: animation (hiệu ứng, ví dụ như dòng chảy nước, mức để tank)

iNut PLC Scada kế thừa nền tảng ảnh SVG và Node-RED, vì thế có thể làm mọi hiệu ứng từ đơn giản hay phức tạp. Bạn có thể tìm kiếm trên mạng về các từ khoá "svg animation" để có thể phát triển các giao diện Scada phức tạp. Có thể liên hệ với đội ngũ iNut PLC thiết kế giao diện Scada (có phí) để nhanh chóng hơn, từ đó học hỏi nhanh hơn.

Trong phạm vi bài viết, chúng ta sẽ tiếp cận việc sửa 3 giá trị đơn giản:

* text: chữ
* thanh ghi word
* bit&#x20;

Quay lại hình ảnh trên, chúng ta có 8 vị trí giám sát bit, 6 vị trí thanh ghi word, và 13 thanh ghi text (vì có một thanh ghi word không có gán text).

### Sửa ô text&#x20;

Bạn mở phần mềm, chọn ô text cần sửa hoặc tạo mới một ô text, bằng trường "Element > text".&#x20;

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FNdREv883zkXCCEpSgdOI%2FScreen%20Shot%202023-01-27%20at%2001.00.25.png?alt=media&#x26;token=600fa234-fab0-4a5d-af13-ac685927f579" alt=""><figcaption></figcaption></figure>

Sau đó, lựa chọn ô thuộc tính **Properties** để xem ID của ô text đó. Chính ô ID này là ô quan trọng nhất giúp bạn quản lý mọi thứ dễ dàng. Hãy đặt ô ID này theo ghi chú thanh ghi để dễ dàng đặt tên ngoài phần mềm Node-RED.

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2Fyj2xRoXrnSVIpsdSQKz7%2FScreen%20Shot%202023-01-27%20at%2001.01.14.png?alt=media&#x26;token=b4bb4150-2108-4e50-ac93-cebba978ce00" alt=""><figcaption></figcaption></figure>

{% embed url="<https://youtu.be/v38u_4njl5E>" %}
Xem thêm video để rõ hơn
{% endembed %}

Tiếp theo đó, ta sẽ ghi chú id này tại tab **Binding**. Tab này dùng để "kết nối" giá trị từ Node-RED vào giao diện scada. Bước này rất quan trọng và các nhà phát triển mới hay quên.&#x20;

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FecWVfmTF07NO6FH6lxYf%2FScreen%20Shot%202023-01-27%20at%2001.04.18.png?alt=media&#x26;token=2fb8518f-5857-4a21-9f97-6e7ed4722d46" alt=""><figcaption></figcaption></figure>

Tại tab Binding này, chúng ta sẽ cần quan tâm đến 2 trường chính đó là "**Selector**" và "**Binding Source**".

* Selector: ID của ô text, bạn cần có dấu "**#**" ở trước để đại diện cho ID.&#x20;
  * Đối với nhà phát triển chuyên nghiệp thì có thể dùng câu lệnh CSS Selector.
  * Đối với nhà phát triển mới thì chúng ta cần ghi chú dấu "#" ở đâu, để tránh sai sót, khi nó hiện ra bản chọn "gợi ý" hãy chọn kết quả từ bảng chọn.
* Binding source: chính là tên trường dữ liệu trong Node-RED. Lưu ý, đây là trường dữ liệu (field) không phải là giá trị sẽ hiển thị trên Node-RED.

Để dễ dàng cho nhà phát triển mới, chúng tôi có làm sẵn ô "**Đặt tiêu đề**". Đây là nơi bạn "Định danh" hay nói cách khác là đặt giá trị cho trường dữ liệu được ghi chú tại **Binding source** cho **Selector** tưng ứng.

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FUXog2sT9c1jLoylU1Ces%2FScreen%20Shot%202023-01-27%20at%2001.10.59.png?alt=media&#x26;token=00d0ce10-c542-48b6-96b1-126b8371be10" alt=""><figcaption><p>Ô màu vàng "<strong>Đặt tiêu đề</strong>"</p></figcaption></figure>

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FwAVcjrvs3WX6JjyE7Uv9%2FScreen%20Shot%202023-01-27%20at%2001.12.46.png?alt=media&#x26;token=41639405-0bdc-4bf0-b73b-27bd165d8fd8" alt=""><figcaption><p>Đặt giá trị cho đúng Binding Source.</p></figcaption></figure>

## Sửa / Đồng bộ thanh ghi

Trong quá trình sửa ô text, bạn sẽ thấy rằng, có những **Binding source** có định danh là **payload.x** (trong đó x là một số nguyên). Đây chính là giá trị (số nguyên - 1 word) được lấy từ thanh ghi của iNut. x bắt đầu từ số 0.

Ví dụ, bạn đang đọc 100 thanh ghi từ D450 - 549, thì **payload.0** có nghĩa là giá trị của thanh ghi **D450**, tương tự với **payload.2** là đại diện cho thanh ghi **D452**.

{% embed url="<https://youtu.be/R4pFJIsi_lE>" %}

### Sửa / Đồng bộ 1 bit thanh ghi

Khác với thanh ghi word, thanh ghi bit thông thường sẽ được biểu diễn dưới dạng đồ hoạ <mark style="color:green;">**xanh**</mark> / <mark style="color:red;">**đỏ**</mark>. Trong đó màu <mark style="color:green;">**xanh**</mark> thường đại diện cho tín hiệu bật, và màu <mark style="color:red;">**đỏ**</mark> thường đại diện cho tín hiệu tắt.

Tất nhiên, cũng tương tự như 2 loại giá trị tên, chúng ta cũng sẽ cần lây được ID của hình hoạ (đại diện cho bit). Bên cạnh đó, tại tab Binding, chúng ta sẽ quan tâm đến "**Binding Destination**", chọn **Style** và **fill** để đổi màu. Ngoài **fill**, bạn có thể chọn các giá trị khác, có thể tìm hiểu thêm về style svg để mở rộng.

<figure><img src="https://533120070-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVQEsvMHPWmaAjZ47aPa0%2Fuploads%2FXXxNr12v6CKuUUZhmaVa%2FScreen%20Shot%202023-01-27%20at%2001.29.38.png?alt=media&#x26;token=dd74d74b-4ee8-4d47-b7e3-e092c14a711d" alt=""><figcaption></figcaption></figure>

{% embed url="<https://youtu.be/v8tEgYexgb8>" %}

Bạn sẽ cần đặt giá trị tại ô Đặt tiêu đề ở dạng Expression với giá trị **msg.getBitFill(\<vị trí thanh ghi word>, \<vị trí bit trong thanh ghi word>)**. Ví dụ như trong video.

Ta đa, như vậy là bạn đã thành công rồi đó.
