Lấy từng bit trong một thanh ghi của iNut PLC - Lấy từng bit trong một luồng cảm biến của iNut cảm biến

Mô tả dự án: 

Làm thế nào để lấy từng bit của một thanh ghi? Bạn lưu trạng thái của INPUT/OUTPUT hoặc cảm biến digital vào một bit của thanh ghi và bạn muốn đọc nó để thiết kế giao diện? Đừng lo lắng. Giải pháp cực kỳ đơn giản, nó chỉ là một khối lệnh kéo thả thôi mà! Nào, cùng khám phá!

Bài toán

Trong thực tế, chúng ta sẽ gặp nhiều bài toán quản lý đến vài chục IO đến vài trăm IO. Nhưng iNut Cảm biến hoặc iNut PLC chỉ có tối đa 8 luồn (cho phiên bản đầu tiên). Vậy mạch iNut PLC có phù hợp trong trường hợp này ko?

Câu trả lời là được! iNut Cảm biến / iNut PLC hỗ trợ đọc được 128 IO. Và nếu kĩ thuật lạp trình của bạn tốt, để vận dụng các trick về số nguyên thì có thể lên đến 160 IO.

Nào, chúng ta cùng thử giải bài toán này nhé. Mình sẽ chọn iNut PLC để giải thích cho các phần bên dưới, các iNut cảm biến khác tương tự.

Bài toán về IO

Ví dụ như dòng FX3U-48 MR. Chúng ta có đến 48 IO. Vậy làm thế nào để đưa 48 IO này lên Internet?

Mỗi IO chỉ có 2 trạng thái 0 và 1. Vì vậy, ta sẽ đưa vào từng bit.

Ví dụ X0-X7 => đưa vào thanh ghi D101. (dùng 1 byte trong khả năng chứa được 1 word = 2 byte của PLC). Y0-Y15 => đưa vào thanh ghi D108.

Cùng thử nghiệm nhé.

 

 

 

iNut PLC là gì?

Mỗi bo iNut PLC sẽ giúp bạn đồng bộ 8 thanh ghi D lên Internet thông qua cổng RS485 chuẩn modbus rtu. Các đặc tính kĩ thuật của module này như sau:

  • Thông số RS-485 Modbus RTU Master của iNut PLC: 
  • Các thanh ghi được đồng bộ: D101, D102, D103, D104, D105, D106, D107, D108. Thay đổi được. Đọc được 1 word hoặc 2 word hoặc floating point.
  • 8 thanh ghi từ PLC đồng bộ lên Internet / không giới hạn số lần gửi thay đổi giá trị thanh ghi từ Internet xuống PLC.
    • ​Baudrate: 19200
    • Databits: 8 
    • Stopbits: 1
    • No parity
    • Modbus RTU protocol
    • Modbus Maser (nghĩa là thiết bị PLC của các bạn sẽ phải làm Modbus Slave với Slave Address là1 - chỉnh được qua phần mềm)
    • Thời gian đồng bộ modbus rtu 50ms - chỉnh được.
  • Hỗ trợ lập trình bằng giao diện kéo thả.
  • Hỗ trợ webHMI
  • Hỗ trợ hosting miễn phí chạy webHMI
  • 1400+ module cho webHMI Node-red miễn phí. 3300+ module có phí. Giúp bạn giải quyết mọi bài toán kỹ thuật từ dễ đến khó và cực khó. 
    • Như bài toán lưu trữ CSDL để xem lại data.
    • Bài toán giám sát gửi email / gửi tin nhắn.
    • Bài toán phân tích dữ liệu thu thập (AI - Trí tuệ nhân tạo).
    • Bài toán điều khiển từ xa qua máy tính và điện thoại di động.
    • Bài toán cảnh báo.
    • ...
  • Tài liệu mở
  • Hướng dẫn sử dụng tiếng Việt / tiếng Anh
  • Cộng đồng hơn 1 triệu người sử dụng webHMI, dễ dàng tìm kiếm tài liệu tại stack overflow với từ khóa bạn cần tìm + "node-red" hoặc + "arduino.vn".
  • Không cần NAT PORT.
  • Có dịch vụ cho thuê server với độ bảo mật cao HTTPS, username / password.

iNut PLC ngoài tài liệu tại đây thì đều có thể sử dụng tài liệu của iNut Platform. Vì iNut PLC là một thiết bị thuộc hệ thống iNut Platform.

Nếu bạn cư có project mẫu về iNut PLC, vui lòng đọc bài này trước [iNut PLC]Hệ thống giám sát nước sinh hoạt bằng - Hướng dẫn giám sát PLC trên Internet

Block đọc 8 bit và block đọc 16 bit

Với giá trị D101 = 13 tương đương với 0b00001101 đã được bóc tách ra.

Với giá trị D108 = 60000, tương đương với 0b11101010 01100000

Vậy block nào ở node-red giúp chúng ta làm được điều trên?

Chính việc sử dụng hai khối lệnh màu đỏ với đầu vào là dữ liệu thanh ghi, chúng ta đã bóc tách được.

Các bạn có thể Import đoạn mã sau vào node-red để có thể có khả năng đọc 8 bit và đọc 16 bit từ thanh ghi.

[{"id": "792dad88.5b0384","type": "subflow","name": "Thanh ghi => 8 bit","info": "","in": [{"x": 50,"y": 30,"wires": [{"id": "fedd3b2.a95aec8"}]}],"out": [{"x": 607.0000019073486,"y": 94,"wires": [{"id": "fedd3b2.a95aec8","port": 0}]},{"x": 604.0000038146973,"y": 142,"wires": [{"id": "fedd3b2.a95aec8","port": 1}]},{"x": 609.0000038146973,"y": 190,"wires": [{"id": "fedd3b2.a95aec8","port": 2}]},{"x": 618.0000038146973,"y": 238,"wires": [{"id": "fedd3b2.a95aec8","port": 3}]},{"x": 635.0000038146973,"y": 290,"wires": [{"id": "fedd3b2.a95aec8","port": 4}]},{"x": 654.0000038146973,"y": 364,"wires": [{"id": "fedd3b2.a95aec8","port": 5}]},{"x": 587.0000057220459,"y": 390.00000381469727,"wires": [{"id": "fedd3b2.a95aec8","port": 6}]},{"x": 612.0000057220459,"y": 435.00000381469727,"wires": [{"id": "fedd3b2.a95aec8","port": 7}]}]},{"id": "fedd3b2.a95aec8","type": "function","z": "792dad88.5b0384","name": "Chuyển thành 8 bits","func": "const REGISTER_COUNT = 8\nvar msgs = []\nvar value = parseInt(msg.payload, 10)\nfor (var i = 0; i < REGISTER_COUNT; i++) {\nmsgs.push({\npayload: (value >> i) & 1\n});\n}\nreturn msgs;","outputs": 8,"noerr": 0,"x": 312.3888854980469,"y": 299.55555725097656,"wires": [[],[],[],[],[],[],[],[]],"inputLabels": ["Dữ liệu từ iNut nhé"],"outputLabels": [".0",".1",".2",".3",".4",".5",".6",".7"]},{"id": "21113f47.814fa","type": "subflow","name": "Thanh ghi => 16 bit","info": "","in": [{"x": 50,"y": 30,"wires": [{"id": "d748b130.c4b2d"}]}],"out": [{"x": 564.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 0}]},{"x": 619.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 1}]},{"x": 674.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 2}]},{"x": 729.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 3}]},{"x": 784.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 4}]},{"x": 839.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 5}]},{"x": 894.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 6}]},{"x": 949.0000009536743,"y": 50,"wires": [{"id": "d748b130.c4b2d","port": 7}]},{"x": 839.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 8}]},{"x": 891.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 9}]},{"x": 946.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 10}]},{"x": 1001.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 11}]},{"x": 1056.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 12}]},{"x": 1111.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 13}]},{"x": 1166.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 14}]},{"x": 1221.0000076293945,"y": 231,"wires": [{"id": "d748b130.c4b2d","port": 15}]}],"outputLabels": [".0",".1",".2",".3",".4",".5",".6",".7",".8",".9",".10",".11",".12",".13",".14",".15"]},{"id": "d748b130.c4b2d","type": "function","z": "21113f47.814fa","name": "Chuyển thành 16 bits","func": "const REGISTER_COUNT = 16\nvar msgs = []\nvar value = parseInt(msg.payload, 10)\nfor (var i = 0; i < REGISTER_COUNT; i++) {\nmsgs.push({\npayload: (value >> i) & 1\n});\n}\nreturn msgs;","outputs": 16,"noerr": 0,"x": 349,"y": 230,"wires": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]],"inputLabels": ["Dữ liệu từ iNut nhé"],"outputLabels": [".0",".1",".2",".3",".4",".5",".6",".7",null,null,null,null,null,null,null,null]},{"id": "b4d90abf.aa8b18","type": "subflow:21113f47.814fa","z": "6c281c8f.cbebc4","x": 971.3888931274414,"y": 1026.7777862548828,"wires": [["5e5dbe0c.1fa7f"],["5c309d2a.c21894"],["22434536.3aecaa"],["ca9395ea.8ee738"],["7190ba4b.003234"],["a544de52.b9e2"],["2f30360f.63efba"],["d1e1cebb.8314d"],["5ca57c9c.e435f4"],["32b114ff.75314c"],["239d926e.421bae"],["b10f9e86.37c1f"],["533da6ba.56e9f8"],["8b5cc7cd.6c0bf8"],["ec94ca91.c27068"],["9b3dd18e.80937"]]},{"id": "e44b9894.26eb98","type": "subflow:792dad88.5b0384","z": "6c281c8f.cbebc4","x": 967.3888969421387,"y": 480.8888854980469,"wires": [["d399617d.e9842"],["4ac2685d.0ab698"],["f2773088.1c11e"],["8ebf47c1.6c2b18"],["86510fae.825dd"],["43d5b365.f0c3fc"],["bb8b7604.798f68"],["fed53ef3.893f5"]]}]

Nếu bạn chưa biết cách import? Xin vui lòng theo hướng dẫn ở [iNut PLC]Hệ thống giám sát nước sinh hoạt bằng - Hướng dẫn giám sát PLC trên Internet

Nếu bạn muốn chạy lại ví dụ này trên máy tính của bạn, vui lòng chạy đoạn lệnh sau ở Windows Commands Prompt

git clone -b inut-plc-example4 https://github.com/ngohuynhngockhanh/iNut-Node-RED-Kickstarter inut-plc-example4

cd inut-plc-example4

npm install

npm start

Chúc các bạn thành công!

lên
4 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Làm máy đo nhiệt độ cầm tay như thế nào, có khó không?

Đúng như tiêu đề mình đã trình bày, hôm nay chúng ta sẽ đi tìm lời giải cho bài toán trên. Qua bài viết này ngoài việc tự trả lời câu hỏi vừa được nêu ra, mình còn mong muốn hướng các bạn đến khái niệm "Học để ứng dụng và đọc để sáng tạo"! Từ đó, bạn sẽ học thêm một kĩ năng mềm đó là "bóc tách" vấn đề của một "bài toán thực tế".

lên
11 thành viên đã đánh giá bài viết này hữu ích.

analogReference()

Hàm analogReference() có nhiệm vụ đặt lại mức (điện áp) tối đa khi đọc tín hiệu analogRead. Ứng dụng như sau, giả sử bạn đọc một tín hiệu dạng analog có hiệu điện thế từ 0-1,1V. Nhưng mà nếu dùng mức điện áp tối đa mặc định của hệ thống (5V) thì khoảng giá trị sẽ ngắn hơn => độ chính xác kém hơn => hàm này ra đời để giải quyết việc đó!

lên
12 thành viên đã đánh giá bài viết này hữu ích.