ShIoTiny: các nút, kết nối và sự kiện hoặc tính năng của chương trình vẽ

ShIoTiny: các nút, kết nối và sự kiện hoặc tính năng của chương trình vẽ

Những điểm chính hoặc nội dung bài viết này nói về

Chủ đề của bài viết là lập trình PLC trực quan ShIoTiny cho ngôi nhà thông minh được mô tả ở đây: ShIoTiny: tự động hóa nhỏ, Internet vạn vật hoặc “sáu tháng trước kỳ nghỉ”.

Rất ngắn gọn các khái niệm như thắt nút, quan hệ, phát triển, cũng như các tính năng tải và thực thi chương trình trực quan trên Đặc biệt, đó là cơ sở của PLC ShIoTiny.

Giới thiệu hoặc một vài câu hỏi về tổ chức

Trong bài viết trước về quá trình phát triển của mình, tôi đã giới thiệu tổng quan ngắn gọn về khả năng của bộ điều khiển ShIoTiny.

Điều kỳ lạ là công chúng tỏ ra khá quan tâm và hỏi tôi khá nhiều câu hỏi. Một số người bạn thậm chí còn đề nghị mua ngay bộ điều khiển của tôi. Không, tôi không phản đối việc kiếm một ít tiền, nhưng lương tâm của tôi không cho phép tôi bán một thứ vẫn còn rất thô sơ về mặt phần mềm.

Vì vậy, tôi đã đăng các tệp nhị phân phần sụn và sơ đồ thiết bị trên GitHub: chương trình cơ sở + hướng dẫn ngắn nhất + sơ đồ + ví dụ.

Bây giờ mọi người đều có thể flash ESP-07 và tự mình sử dụng phần sụn. Nếu ai đó thực sự muốn bảng giống hệt như trong ảnh thì tôi có một vài cái. Viết qua email [email được bảo vệ]. Nhưng, như Ogurtsov khó quên đã từng nói: “Tôi không chịu trách nhiệm về bất cứ điều gì!”

Vì vậy, hãy đi vào vấn đề: " là gì "nút thắt" (nút) và "biến cố"? Chương trình được thực hiện như thế nào?

Như thường lệ, hãy bắt đầu theo thứ tự: bằng cách tải xuống chương trình.

Chương trình được tải như thế nào

Hãy bắt đầu với điều gì xảy ra khi chúng ta nhấn một nút Tải lên trong trình soạn thảo ElDraw và chương trình mạch của chúng tôi, bao gồm các hình vuông đẹp mắt, bay vào thiết bị.

Đầu tiên, dựa trên sơ đồ chúng ta đã vẽ, mô tả của nó ở dạng văn bản được xây dựng.
Thứ hai, nó kiểm tra xem tất cả đầu vào của nút có được kết nối với đầu ra hay không. Không nên có lối vào “treo”. Nếu phát hiện thấy đầu vào như vậy, mạch sẽ không được tải vào ShIoTiny và trình chỉnh sửa sẽ hiển thị cảnh báo tương ứng.

Nếu mọi việc suôn sẻ, người chỉnh sửa sẽ gửi mô tả văn bản về từng nút một của mạch đến ShIoTiny. Tất nhiên, mạch hiện có từ ShIoTiny trước tiên sẽ bị xóa. Mô tả văn bản kết quả được lưu trữ trong bộ nhớ FLASH.

Nhân tiện, nếu bạn muốn loại bỏ một mạch khỏi một thiết bị thì bạn chỉ cần tải một mạch trống vào thiết bị đó (không chứa một phần tử nút nào).

Sau khi toàn bộ chương trình mạch được tải vào PLC ShIoTiny, nó sẽ bắt đầu “thực thi”. Nó có nghĩa là gì?

Lưu ý rằng các quy trình tải mạch từ bộ nhớ FLASH khi bật nguồn và khi nhận mạch từ trình chỉnh sửa là giống hệt nhau.

Đầu tiên, các đối tượng nút được tạo dựa trên mô tả của chúng.
Sau đó, các kết nối được thực hiện giữa các nút. Nghĩa là, các liên kết giữa đầu ra với đầu vào và đầu vào với đầu ra được tạo ra.

Và chỉ sau tất cả những điều này, chu trình thực hiện chương trình chính mới bắt đầu.

Tôi đã viết trong một thời gian dài, nhưng toàn bộ quá trình - từ "tải" mạch từ bộ nhớ FLASH đến bắt đầu chu kỳ chính - chỉ mất một phần giây cho mạch 60-80 nút.

Vòng lặp chính hoạt động như thế nào? Rất đơn giản. Đầu tiên anh ấy chờ đợi sự xuất hiện phát triển tại một nút nào đó, sau đó xử lý sự kiện đó. Và cứ thế vô tận. Chà, hoặc cho đến khi họ tải một sơ đồ mới lên ShIoTiny.

Đã nhiều lần tôi đã đề cập đến những điều như phát triển, thắt nút и quan hệ. Nhưng đây là gì từ quan điểm phần mềm? Chúng ta sẽ nói về điều này ngày hôm nay.

Nút, kết nối và sự kiện

Chỉ cần nhìn vào các ví dụ về các chương trình mạch cho ShIoTinyđể hiểu rằng sơ đồ chỉ bao gồm hai thực thể - các nút (hoặc phần tử) và các kết nối giữa chúng.

Nút, nhưng có hoặc phần tử mạch là một đại diện ảo của một số hoạt động trên dữ liệu. Đây có thể là một phép toán số học, một phép toán logic hoặc bất kỳ phép toán nào xuất hiện trong đầu chúng ta. Điều chính là nút có lối vào và lối ra.

Вход - đây là nơi nút nhận dữ liệu. Hình ảnh đầu vào là các điểm luôn ở phía bên trái của nút.

Đầu ra - đây là nơi lấy kết quả hoạt động của nút. Hình ảnh đầu ra là các điểm luôn nằm ở phía bên phải của nút.

Một số nút không có đầu vào. Các nút như vậy tạo ra kết quả nội bộ. Ví dụ: nút cố định hoặc nút cảm biến: chúng không cần dữ liệu từ các nút khác để báo cáo kết quả.

Ngược lại, các nút khác không có đầu ra. Đây là các nút hiển thị, chẳng hạn như bộ truyền động (rơle hoặc thứ gì đó tương tự). Chúng chấp nhận dữ liệu nhưng không tạo ra kết quả tính toán có sẵn cho các nút khác.

Ngoài ra, còn có một nút bình luận duy nhất. Nó không làm gì cả, không có đầu vào hoặc đầu ra. Mục đích của nó là giải thích trên sơ đồ.

Chuyện gì đã xảy ra"biến cố» Sự kiện là sự xuất hiện của dữ liệu mới trong bất kỳ nút nào. Ví dụ: các sự kiện bao gồm: thay đổi trạng thái đầu vào (nút Đầu vào), nhận dữ liệu từ một thiết bị khác (các nút MQTT и UDP), hết một khoảng thời gian xác định (các nút Hẹn giờ и chậm trễ) và như thế.

Sự kiện nhằm mục đích gì? Có, để xác định nút nào dữ liệu mới đã phát sinh và trạng thái của nút nào cần được thay đổi liên quan đến việc nhận dữ liệu mới. Sự kiện này dường như “đi qua” dọc theo chuỗi các nút cho đến khi nó bỏ qua tất cả các nút có trạng thái cần được kiểm tra và thay đổi.

Tất cả các nút có thể được chia thành hai loại.
Hãy gọi các nút có thể tạo ra sự kiện "các nút hoạt động'.
Chúng tôi sẽ gọi các nút không thể tạo sự kiện “nút thụ động'.

Khi một nút tạo ra một sự kiện (nghĩa là dữ liệu mới xuất hiện ở đầu ra của nó), thì trong trường hợp chung, trạng thái của toàn bộ chuỗi nút được kết nối với đầu ra của nút tạo sự kiện sẽ thay đổi.

Để làm rõ, hãy xem xét ví dụ trong hình.

ShIoTiny: các nút, kết nối và sự kiện hoặc tính năng của chương trình vẽ

Các nút hoạt động ở đây là Đầu vào1, Đầu vào2 và Đầu vào3. Các nút còn lại là thụ động. Hãy xem điều gì sẽ xảy ra khi đóng một hoặc một đầu vào khác. Để thuận tiện, kết quả được tóm tắt trong bảng.

ShIoTiny: các nút, kết nối và sự kiện hoặc tính năng của chương trình vẽ

Như bạn có thể thấy, khi một sự kiện xảy ra, một chuỗi được xây dựng từ nút nguồn của sự kiện đến nút cuối. Trạng thái của các nút không rơi vào chuỗi sẽ không thay đổi.

Một câu hỏi chính đáng được đặt ra: điều gì sẽ xảy ra nếu hai hoặc thậm chí nhiều sự kiện xảy ra đồng thời?

Là một người yêu thích tác phẩm của Gleb Anfilov, tôi muốn gửi một câu hỏi tò mò đến cuốn sách “Thoát khỏi sự ngạc nhiên” của anh ấy. Đây là “thuyết tương đối dành cho trẻ nhỏ”, giải thích rõ ràng “đồng thời” nghĩa là gì và làm thế nào để sống chung với nó.

Nhưng thực tế mọi thứ đơn giản hơn nhiều: khi hai hoặc thậm chí một số sự kiện xảy ra, tất cả các chuỗi từ mỗi nguồn sự kiện lần lượt được xây dựng và xử lý tuần tự, và không có điều kỳ diệu nào xảy ra.

Câu hỏi hoàn toàn chính đáng tiếp theo từ một độc giả tò mò là điều gì sẽ xảy ra nếu các nút được kết nối thành một vòng? Hoặc, như họ nói giữa những người thông minh này của bạn, hãy đưa ra phản hồi. Nghĩa là kết nối đầu ra của một trong các nút với đầu vào của nút trước đó để trạng thái đầu ra của nút này ảnh hưởng đến trạng thái đầu vào của nó. Trình chỉnh sửa sẽ không cho phép bạn kết nối trực tiếp đầu ra của nút với đầu vào của nút đó. ElDraw. Nhưng một cách gián tiếp, như trong hình bên dưới, điều này có thể được thực hiện.

Vậy điều gì sẽ xảy ra trong trường hợp này? Câu trả lời sẽ rất “chắc chắn”: tùy thuộc vào nút nào. Chúng ta hãy xem ví dụ trong hình.

ShIoTiny: các nút, kết nối và sự kiện hoặc tính năng của chương trình vẽ

Khi các tiếp điểm đầu vào của Đầu vào1 mở, đầu vào phía trên của nút A là 0. Đầu ra của nút A cũng bằng 0. Đầu ra của nút B là 1. Và cuối cùng, đầu vào phía dưới của nút A là 1. Mọi thứ đều ổn thông thoáng. Và đối với những người chưa hiểu rõ, hãy xem phần mô tả bên dưới về cách hoạt động của các nút “VÀ” và “KHÔNG”.

Bây giờ chúng ta đóng các tiếp điểm của đầu vào input1, nghĩa là chúng ta áp dụng một tiếp điểm cho đầu vào phía trên của nút A. Những ai quen thuộc với thiết bị điện tử đều biết rằng trên thực tế chúng ta sẽ có được một mạch máy phát điện cổ điển sử dụng các phần tử logic. Và về lý thuyết, mạch như vậy sẽ không ngừng tạo ra chuỗi 1-0-1-0-1-0… ở đầu ra của phần tử A và B. và 0-1-0-1-0-1-…. Suy cho cùng, sự kiện phải liên tục thay đổi trạng thái của nút A và B, chạy theo vòng tròn 2-3-2-3-...!

Nhưng thực tế điều này không xảy ra. Mạch sẽ rơi vào trạng thái ngẫu nhiên - hoặc rơle sẽ vẫn bật hoặc tắt, hoặc có thể bật và tắt nhẹ vài lần liên tiếp. Tất cả phụ thuộc vào thời tiết ở cực nam của sao Hỏa. Và đó là lý do tại sao điều này xảy ra.

Một sự kiện từ nút Đầu vào1 sẽ thay đổi trạng thái của nút A, sau đó là nút B, v.v. theo vòng tròn nhiều lần. Chương trình phát hiện sự “vòng lặp” của sự kiện và buộc dừng lễ hội này. Sau đó, những thay đổi về trạng thái của nút A và B sẽ bị chặn cho đến khi một sự kiện mới xảy ra. Thời điểm chương trình quyết định “dừng quay vòng tròn!” - nói chung là phụ thuộc vào nhiều yếu tố và có thể coi là ngẫu nhiên.

Hãy cẩn thận khi nối các nút thắt vào vòng - hiệu ứng không phải lúc nào cũng rõ ràng! Hãy hình dung rõ ràng về những gì và lý do bạn đang làm!

Vẫn có thể xây dựng một trình tạo trên các nút có sẵn cho chúng tôi chứ? Vâng, bạn có thể! Nhưng điều này đòi hỏi một nút có thể tự tạo ra các sự kiện. Và có một nút như vậy - đây là “đường trễ”. Chúng ta hãy xem một máy phát điện có chu kỳ 6 giây hoạt động như thế nào trong hình bên dưới.

ShIoTiny: các nút, kết nối và sự kiện hoặc tính năng của chương trình vẽ

Thành phần chính của trình tạo là nút A - đường trễ. Nếu bạn thay đổi trạng thái đầu vào của dòng trễ từ 0 thành 1 thì 1 sẽ không xuất hiện ở đầu ra ngay lập tức mà chỉ sau một thời gian xác định. Trong trường hợp của chúng tôi là 3 giây. Tương tự như vậy, nếu bạn thay đổi trạng thái đầu vào của dòng trễ từ 1 thành 0 thì 0 ở đầu ra sẽ xuất hiện sau 3 giây tương tự. Thời gian trễ được đặt bằng phần mười giây. Nghĩa là, giá trị 30 có nghĩa là 3 giây.

Điểm đặc biệt của đường trễ là nó tạo ra một sự kiện sau khi hết thời gian trễ.

Giả sử rằng ban đầu đầu ra của đường trễ là 0. Sau khi truyền nút B - bộ biến tần - 0 này biến thành 1 và đi đến đầu vào của đường trễ. Không có gì xảy ra ngay lập tức. Ở đầu ra của dòng trễ, nó sẽ vẫn là 0, nhưng việc đếm ngược thời gian trễ sẽ bắt đầu. 3 giây trôi qua. Và sau đó đường trễ tạo ra một sự kiện. Ở đầu ra của nó, nó xuất hiện 1. Đơn vị này, sau khi đi qua nút B - bộ biến tần - biến thành 0 và đi đến đầu vào của đường trễ. 3 giây nữa trôi qua... và quá trình này lặp lại. Nghĩa là, cứ sau 3 giây, trạng thái đầu ra của dòng trễ thay đổi từ 0 thành 1 và sau đó từ 1 thành 0. Rơle kêu click. Máy phát điện đang hoạt động. Chu kỳ xung là 6 giây (3 giây ở đầu ra số 3 và XNUMX giây ở đầu ra).

Tuy nhiên, trong các mạch thực tế, thường không cần sử dụng ví dụ này. Có các nút hẹn giờ đặc biệt có thể tạo ra một chuỗi xung với một khoảng thời gian nhất định một cách hoàn hảo và không cần sự trợ giúp từ bên ngoài. Khoảng thời gian của “không” và “một” trong các xung này bằng một nửa chu kỳ.

Để đặt các hành động định kỳ, hãy sử dụng các nút hẹn giờ.

Tôi lưu ý rằng các tín hiệu số như vậy, trong đó thời lượng của “không” và “một” bằng nhau, được gọi là “uốn khúc”.

Tôi hy vọng tôi đã làm rõ câu hỏi một chút về cách các sự kiện được truyền giữa các nút và những gì không nên làm?

Kết luận và tài liệu tham khảo

Bài viết hóa ra ngắn nhưng bài viết này là câu trả lời cho các câu hỏi nảy sinh liên quan đến các nút và sự kiện.

Khi phần sụn phát triển và các ví dụ mới xuất hiện, tôi sẽ viết về cách lập trình ShIoTiny những bài viết nhỏ miễn là nó sẽ gây hứng thú cho mọi người.

Như trước đây, sơ đồ, phần sụn, ví dụ, mô tả các thành phần và mọi thứ phần còn lại ở đây.

Câu hỏi, gợi ý, phê bình - vào đây: [email được bảo vệ]

Nguồn: www.habr.com

Thêm một lời nhận xét