ksp gửi vào
- 15380 lượt xem
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!