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
7 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ả

kMiniRouter - Kết nối Wifi từ cổng LAN cho máy tính nhúng Orange Pi, Raspberry Pi,...

Nhận thấy có rất nhiều bạn khó khăn khi mới bắt đầu với Orange Pi hay Raspberry Pi. Trong đó, vấn đề kết nối vào mạng wifi là vấn đề thường xuyên gặp phải. Nhất là trong các dự án yêu cầu phải thay đổi wifi thường xuyên. Nhận thấy vấn đề này, mình đã viết nên open source kMiniRouter để giúp các bạn kết nối mạng dễ dàng qua Wifi từ chính cổng LAN của máy tính nhúng.

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

Tự làm game Snake - Rắn ăn mồi với Arduino - Ví dụ về việc sử dụng thư viện XỬ LÝ BẤT ĐỒNG BỘ

Nếu là một người theo dõi cộng đồng Arduino Việt Nam trong thời gian dài, bạn sẽ để ý rằng, mảng Game là một mảng nhận đươc khá ít sự quan tâm vì độ khó của nó. Điển hình là chỉ có bài viết hướng dẫn làm game Flappy bird và Cá ăn mồi của bạn nguoimegame. Tuy nhiên, hôm nay, khi mình cảm thấy đã đủ lượng kiến thức và lượng thư viện nền tảng mình đã viết trước đó, mình sẽ hướng dẫn các bạn cách viết một game đơn giản với Arduino.

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