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ả

MJPG Streamer vs Intel Galileo - Truyền hình ảnh từ webcam trong mạng LAN với Intel Galileo

Vấn đề truyền hình ảnh từ webcam trong mạng LAN không phải là một vấn đề mới trong việc lập trình nhúng. Ví dụ như trên Raspberry Pi, chúng ta hoàn toàn có thể sử dụng MJPG Streamer để làm được việc này. Tuy nhiên, khác với Raspberry Pi, Intel Galieo không đơn giản như vậy, bởi vì chưa có một bài viết hoàn chỉnh chỉ về vấn đề này trên cộng đồng Intel Galileo thế giới. Vì vậy, mình muốn đóng góp một phần nhỏ để các bạn có thể làm được điều này trên con Intel Galileo của mình (không phân biệt Intel Galileo Gen 1 hay Intel Galileo Gen 2 nhé).

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

Điều khiển 8 đèn LED sáng theo ý muốn của bạn, dễ hay khó ?

Hôm nay, chúng ta sẽ học cách điều khiển 8 đèn LED. Vấn đề này, vừa dễ lại vừa khó, vậy nó dễ chỗ nào, khó chỗ nào, chúng ta cùng nhau tìm hiểu nhé!

Qua bài học này, bạn sẽ hiểu được cách làm thế nào để điều khiển nhiều led bằng cách sử dụng các chân digital, hoặc sử dụng IC HC595!

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