Hiện nay máy tính nhúng công nghiệp đang được dùng để làm các thiết bị đầu cuối trong các mạng cục bộ công nghiệp Tuy nhiên khi sử dụng máy tính trong mạng THCN cần có phần cứng ngoài các module card xử lý dữ liệu ngoài như Modbus Profibus…hoặc phần mềm từ đối tác thứ 3 đó là driver để điều khiển và các phần mềm mã nguồn để thực hiện các giao thức Đề tài này tìm hiểu mạng Modbus RTU và các ngăn xếp của nó được tìm hiểu từ đó xây dựng bằng ngôn ngữ Python trên nền tảng máy tính Banana Pro nhúng hệ điều hành Linux Dựa theo cách thức hoạt động tiêu chuẩn của mạng công nghiệp Modbus RTU đề tài này nghiên cứu thuật toán để xây dựng các lớp hướng đối tượng nhằm truyền nhận dữ liệu và xử lý dữ liệu truyền thông nối tiếp Theo đó các thuật toán giúp tạo khung truyền nhận khung truyền sinh ra giá trị kiểm thử CRC các mã ngoại lệ sẽ được xây dựng chính xác và viết bằng ngôn ngữ Python Đề tài này góp phần làm giảm giá thành khi tích hợp mạng Modbus trong hệ thống công nghiệp và nâng cao khả năng điều khiển ngoại vi của máy tính nhúng
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA PHẠM NGỌC CƯỜNG XÂY DỰNG MẠNG TRUYỀN THÔNG CÔNG NGHIỆP MODBUS RTU BẰNG NGƠN NGỮ PYTHON TRÊN MÁY TÍNH NHÚNG LINUX LUẬN VĂN THẠC SĨ KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Đà Nẵng – Năm 2017 ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA PHẠM NGỌC CƯỜNG XÂY DỰNG MẠNG TRUYỀN THÔNG CÔNG NGHIỆP MODBUS RTU BẰNG NGÔN NGỮ PYTHON TRÊN MÁY TÍNH NHÚNG LINUX Chuyên ngành: Kỹ thuật điều khiển tự động hóa Mã số: 60520216 LUẬN VĂN THẠC SĨ NGƯỜI HƯỚNG DẪN KHOA HỌC: TS Trần Đình Khơi Quốc Đà Nẵng – Năm 2017 i LỜI CAM ĐOAN Tơi cam đoan cơng trình nghiên cứu Các số liệu, kết nêu luận văn trung thực chưa cơng bố cơng trình khác Đà Nẵng, ngày 25 tháng 12 năm 2017 Tác giả luận án PHẠM NGỌC CƯỜNG ii TÓM TẮT LUẬN VĂN XÂY DỰNG MẠNG TRUYỀN THÔNG CÔNG NGHIỆP MODBUS RTU BẰNG NGƠN NGỮ PYTHON TRÊN MÁY TÍNH NHÚNG LINUX Học viên: Phạm Ngọc Cường Mã số: 60.52.50 Chuyên ngành: Kỹ thuật điều khiển tự động hóa Khóa: K33.TĐH(PFIEV) Trường Đại học Bách khoa - ĐHĐN Tóm tắt - Hiện nay, máy tính nhúng cơng nghiệp dùng để làm thiết bị đầu cuối mạng cục cơng nghiệp Tuy nhiên sử dụng máy tính mạng THCN cần có phần cứng ngồi: module/card xử lý liệu Modbus, Profibus…hoặc phần mềm từ đối tác thứ 3, driver để điều khiển phần mềm, mã nguồn để thực giao thức Đề tài tìm hiểu mạng Modbus RTU ngăn xếp tìm hiểu từ xây dựng ngơn ngữ Python tảng máy tính Banana Pro nhúng hệ điều hành Linux Dựa theo cách thức hoạt động tiêu chuẩn mạng công nghiệp Modbus RTU, đề tài nghiên cứu thuật toán để xây dựng lớp hướng đối tượng nhằm truyền nhận liệu xử lý liệu truyền thông nối tiếp Theo đó, thuật tốn giúp tạo khung truyền, nhận khung truyền, sinh giá trị kiểm thử CRC, mã ngoại lệ, xây dựng xác viết ngơn ngữ Python Đề tài góp phần làm giảm giá thành tích hợp mạng Modbus hệ thống công nghiệp nâng cao khả điều khiển ngoại vi máy tính nhúng Từ khóa – Modbus RTU, Python, máy tính nhúng,, CRC, Linux IMPLEMENTING MODBUS RTU INDUSTRIAL NETWORK BY USING PYTHON PROGRAMMING LANGUAGE ON LINUX EMBEDDED COMPUTER Abstract – Nowaday, industrial computers are used for terminal devices in industrial network However, when we integrate it into system, we need external modules as Modbus, Profibus or third party software which are drivers to control and implement protocols The thesis is to study Modbus RTU and its stacks to creating Modbus RTU industrial network by using Python programming language on embedded Linux computer- Banana Pro According to standard principle of this network, the thesis provides algorithm, objects oriented stack and serial communication processing After that, frame building, frame receiving, CRC, exception codes and so on will be built exactly by using Python The thesis brings the lower cost when integrating Modbus in industrial network and also enhance the peripheral control capability of embedded computer Keywords – Modbus RTU, Python, Embedded computer, CRC, Linux iii MỤC LỤC LỜI CAM ĐOAN i TÓM TẮT LUẬN VĂN .ii MỤC LỤC iii DANH MỤC CÁC BẢNG v DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ vi MỞ ĐẦU 1 Tính cấp thiết đề tài .1 Mục tiêu nghiên cứu Đối tượng Phạm vi nghiên cứu .2 Phương pháp nghiên cứu .2 Ý nghĩa khoa học thực tiễn .3 Cấu trúc luận văn CHƯƠNG 1: GIỚI THIỆU TỔNG QUAN VỀ GIAO THỨC MẠNG MODBUS RTU 1.1 GIỚI THIỆU MẠNG MODBUS 1.2 CẤU TRÚC ĐOẠN TIN GIAO THỨC MODBUS CHƯƠNG 2: GIỚI THIỆU TỔNG QUAN VỀ PYTHON VÀ MÁY TÍNH NHÚNG LINUX 19 2.1 NGÔN NGỮ PYTHON .19 2.2 MÁY TÍNH NHÚNG CƠNG NGHIỆP 24 CHƯƠNG 3: XÂY DỰNG CÁC LỚP DỮ LIỆU VÀ THUẬT TOÁN 32 3.1 SƠ ĐỒ CHUNG 32 3.1.1 Lớp liệu Slave 32 3.1.2 Lớp liệu Master 35 3.2 XÂY DỰNG THUẬT TOÁN 36 3.2.1 Lớp Utilities .37 3.2.2 Lớp physical 42 3.2.3 Lớp transaction 43 3.2.4 Lớp Factory 49 3.2.5 Lớp bit_read_message.py & bit_write_message.py & register_read_message.py & register_write_message.py 53 3.2.6 Lớp dành riêng cho kho liệu (Server mode) .62 iv CHƯƠNG 4: KẾT QUẢ MÔ PHỎNG 67 4.1 KHỞI TẠO HỆ THỐNG ẢO 67 4.2 KẾT QUẢ MÔ PHỎNG KHI KẾT NỐI MÁY ẢO 68 4.2.1 Kết kiểm tra mã chức Write Coil (FC=05) .68 4.2.2 Kết kiểm tra mã chức Write Coils (FC=15) .69 4.2.3 Kết kiểm tra mã chức Read Coils Status (FC=01) 70 4.2.4 Kết kiểm tra mã chức Read Coils Status (FC=01) 71 4.2.5 Kết kiểm tra mã chức Write Holding Registers (FC=16) 72 4.2.6 Kết kiểm tra mã chức Read Holding Registers (FC=3) 74 4.2.7 Kết kiểm tra mã chức Write Holding Registers (FC=16)(kiểm tra lần thứ cho ghi nhất) 75 4.2.8 Kết kiểm tra mã chức Read Holding Registers (FC=3) (kiểm tra lần thứ cho ghi nhất) 76 4.2.9 Kết kiểm tra mã chức Read Discrete Inputs (FC=02) .77 4.2.10 Kết kiểm tra mã chức Read Inputs Register (FC=04) .78 4.2.11 Kết kiểm tra Mã Ngoại lệ có vấn đề khung truyền kho liệu 79 4.3 KẾT QUẢ MƠ PHỎNG KHI KẾT NỐI MÁY TÍNH NHÚNG VÀ MÁY TÍNH NGỒI 82 4.3.1 Phương pháp thực 82 4.3.2 Mơ q trình ghi cuộn dây (FC=5 FC=15) 83 4.3.3 Mô trình ghi ghi (FC=16) 85 4.3.4 Mơ q trình đọc ghi (FC=3) 85 4.3.5 Mô trình đọc đầu vào số (FC=2) 86 4.3.6 Mơ q trình đọc ghi analog (FC=4) 87 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI 89 Các điểm làm 89 Các điểm hạn chế 89 Hướng phát triển đề tài 89 DANH MỤC ĐỀ TÀI THAM KHẢO 90 QUYẾT ĐỊNH GIAO ĐỀ TÀI LUẬN VĂN 91 v DANH MỤC CÁC BẢNG Số hiệu bảng Tên bảng Trang Bảng 1.1 Kiểu liệu cách tiếp cận Modbus 11 Bảng 1.2 Cấu trúc đoạn tin yêu cầu mã hàm 01 13 Bảng 1.3 Cấu trúc đoạn tin trả lời mã hàm 01 13 Bảng 1.4 Cấu trúc đoạn tin yêu cầu mã hàm 02 13 Bảng 1.5 Cấu trúc đoạn tin trả lời mã hàm 02 14 Bảng 1.6 Cấu trúc đoạn tin yêu cầu mã hàm 05 14 Bảng 1.7 Cấu trúc đoạn tin trả lời mã hàm 05 15 Bảng 1.8 Cấu trúc đoạn tin yêu cầu mã hàm 15 15 Bảng 1.9 Cấu trúc đoạn tin trả lời mã hàm 15 15 Bảng 1.10 Cấu trúc đoạn tin yêu cầu mã hàm 03 16 Bảng 1.11 Cấu trúc đoạn tin trả lời mã hàm 03 16 Bảng 1.12 Cấu trúc đoạn tin yêu cầu mã hàm 06 17 Bảng 1.13 Cấu trúc đoạn tin trả lời mã hàm 06 17 Bảng 1.14 Cấu trúc đoạn tin yêu cầu mã hàm 16 18 Bảng 1.15 Cấu trúc đoạn tin trả lời mã hàm 16 18 Bảng 2.1 Bảng so sánh ngôn ngữ Python ngôn ngữ C 22 Bảng 2.2 Bảng so sánh ngôn ngữ Python Java 23 Bảng 2.3 So sánh vi điều khiển máy tính nhúng 29 Bảng 2.4 Cấu hình máy tính nhúng banana Pro 30 Bảng 3.1 Mã hàm lớp liệu bit_read_message.py & 54 bit_write_message.py & register_read_message.py & register_write_message.py vi DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ Số hiệu hình vẽ Tên hình vẽ Trang Hình 1.1 Giao thức Modbus mơ hình OSI Hình 1.2 Cách kết nối cổng RS232 Hình 1.3 Tín hiệu dây RS485 Hình 1.4 Cấu trúc đoạn tin mạng Modbus 10 Hình 1.5 Mã hàm cung cấp giao thức Modbus 11 Hình 1.6 Cơ chế truyền nhận Modbus 12 Hình 2.1 Mặt máy tính nhúng Banana Pro 31 Hình 2.2 Mặt máy tính nhúng Banana Pro 31 Hình 3.1 Mơ hình lớp liệu Slave (Server) 33 Hình 3.2 Mơ hình lớp liệu Master (Client) 35 Hình 3.3 Thuật tốn cho hàm pack_bitstring 38 Hình 3.4 Thuật tốn cho hàm unpack_bitstring 39 Hình 3.5 Thuật tốn tạo bảng mã CRC 41 Hình 3.6 Thuật tốn tạo mã CRC từ liệu 42 Hình 3.7 Mơ hình lớp transaction 44 Hình 3.8 Các thành phần khung truyền modbus 44 Hình 3.9 Thuật tốn cho hàm processIncomingPacket 46 (1/2) Hình 3.10 Thuật tốn cho hàm processIncomingPacket 47 (2/2) Hình 3.11 Thuật tốn cho hàm execute 49 Hình 3.12 Sơ đồ liệu việc phân tích mã chức 50 lớp Factory Hình 3.13 Thuật tốn cho q trình nhận dạng chức (Client) 51 vii Hình 3.14 Thuật tốn cho q trình nhận dạng chức 52 (Server) Hình 3.15 Bố cục kho liệu (1/2) 62 Hình 3.16 Bố cục kho liệu (2/2) 63 Hình 4.1 Kết nối máy tính nhúng laptop thơng 83 qua PL2303 Hình 4.2 Giao diện phần mềm RSim 83 Hình 4.3 Kết giao diện RSim (FC=05 85 FC=15) Hình 4.4 Kết giao diện RSim (FC=16) 86 Hình 4.5 Cài đặt giá trị cho đầu vào số slave 87 Hình 4.6 Cài đặt giá trị cho đầu vào số slave 88 MỞ ĐẦU Tính cấp thiết đề tài Hiện nay, PLC máy tính nhúng cơng nghiệp dùng để làm thiết bị đầu cuối mạng cục công nghiệp Cả hai loại PLC máy tính nhúng cơng nghiệp có ưu điểm nhược điểm riêng Xét riêng máy tính nhúng cơng nghiệp, khả mở rộng ngoại vi, lưu trữ liệu rộng lớn Máy tính nhúng có khả chịu va đập, nhiệt độ môi trường, tốc độ xử lý cao Tuy nhiên sử dụng máy tính mạng THCN cần có yếu tố sau: Phần cứng ngoài: module/card xử lý liệu Modbus, Profibus…Các module/card có giá thành từ 200-1000$ tùy theo chức số cổng Phần mềm từ đối tác thứ 3: khơng dùng phần cứng ngồi dùng ngoại vi trực tiếp máy tính nhúng cần driver để điều khiển phần mềm, mã nguồn để thực giao thức Cần phải mua quyền để sử dụng Có phần mềm khơng hỗ trợ nguồn mở để phát triển ứng dụng riêng Thông qua đề tài "Xây dựng mạng truyền thông công nghiệp Modbus RTU ngôn ngữ Python máy tính nhúng Linux", mạng Modbus RTU ngăn xếp tìm hiểu xây dựng ngơn ngữ Python tảng máy tính Banana Pro nhúng hệ điều hành Linux Dựa theo cách thức hoạt động tiêu chuẩn mạng công nghiệp Modbus RTU, đề tài nghiên cứu thuật toán để xây dựng lớp hướng đối tượng nhằm truyền nhận liệu xử lý liệu truyền thơng nối tiếp Theo đó, thuật toán giúp tạo khung truyền, nhận khung truyền, sinh giá trị kiểm thử, mã ngoại lệ, xây dựng xác viết ngơn ngữ Python Thơng qua máy tính nhúng Linux, người lập trình ngồi việc sử dụng mã nguồn Modbus xây dựng để truyền nhận liệu lập nhiều chức điều khiển cho module đóng cắt thiết bị, đọc giá trị cảm biến, giao tiếp người – 77 DEBUG:pymodbus.server.sync:************* finish response process **************** Từ kết thấy server nhận 0x7 0x2 0x0 0x1 0x0 0x8 0x28 0x6a hoàn toàn theo chuẩn khung truyền Modbus bao gồm: Địa - mã chức - địa ghi bắt đầu - số ghi - mã CRC Kết trả lại server 070201aa217f Kết với chuẩn khung truyền Modbus bao gồm Địa - mã chức - địa ghi bắt đầu - số ghi – liệu - mã CRC 4.2.9 Kết kiểm tra mã chức Read Discrete Inputs (FC=02) Master: thực đọc giá trị đầu vào từ đến DEBUG:root:Command read input DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[2] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is ON DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is ON DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is ON DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is ON DEBUG:root:Done command DEBUG:root:**************************** Slave: DEBUG:pymodbus.server.sync:************* start receive request **************** DEBUG:pymodbus.server.sync:0x7 0x2 0x0 0x1 0x0 0x8 0x28 0x6a DEBUG:pymodbus.factory:Factory Request[2] 78 DEBUG:pymodbus.datastore.context:validate[2] 2:8 DEBUG:pymodbus.datastore.context:The pointer is chosen at Store Discrete Inputs DEBUG:pymodbus.datastore.context:getValues[2] 2:8 DEBUG:pymodbus.server.sync:send_to_client_by_cuongpham: 070201aa217f DEBUG:pymodbus.server.sync:************* finish response process **************** Từ kết thấy server nhận 0x7 0x2 0x0 0x1 0x0 0x8 0x28 0x6a hoàn toàn theo chuẩn khung truyền Modbus bao gồm: Địa - mã chức - địa đầu vào bắt đầu - số đầu vào - mã CRC Kết trả lại server 070201aa217f Kết với chuẩn khung truyền Modbus bao gồm Địa - mã chức - địa đầu vào bắt đầu - số đầu vào – liệu - mã CRC Master đọc giá trị đầu vào cài sẵn phần 4.1 4.2.10 Kết kiểm tra mã chức Read Inputs Register (FC=04) Master: thực đọc giá trị Thanh ghi Analog vào từ đến DEBUG:root:Read Input register from to DEBUG:pymodbus.transaction:Running transaction 10 DEBUG:pymodbus.factory:Factory Response[4] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction 10 DEBUG:root:Receive Expected Response DEBUG:root:Input Register value is 100 DEBUG:root:Input Register value is 200 DEBUG:root:Input Register value is 300 DEBUG:root:Input Register value is 400 DEBUG:root:Input Register value is 500 DEBUG:root:Input Register value is 600 DEBUG:root:Input Register value is 700 DEBUG:root:Input Register value is 800 DEBUG:root:Done command 79 DEBUG:root:**************************** Slave: DEBUG:pymodbus.server.sync:************* start receive request **************** DEBUG:pymodbus.server.sync:0x7 0x4 0x0 0x1 0x0 0x8 0xa0 0x6a DEBUG:pymodbus.factory:Factory Request[4] DEBUG:pymodbus.datastore.context:validate[4] 2:8 DEBUG:pymodbus.datastore.context:The pointer is chosen at Store Input Registers DEBUG:pymodbus.datastore.context:getValues[4] 2:8 DEBUG:pymodbus.server.sync:send_to_client_by_cuongpham: 070410006400c8012c019001f4025802bc0320a60e DEBUG:pymodbus.server.sync:************* finish response process **************** Từ kết thấy server nhận 0x7 0x4 0x0 0x1 0x0 0x8 0xa0 0x6a hoàn toàn theo chuẩn khung truyền Modbus bao gồm: Địa - mã chức - địa ghi bắt đầu - số ghi - mã CRC Kết trả lại server 070410006400c8012c019001f4025802bc0320a60e Kết với chuẩn khung truyền Modbus bao gồm Địa - mã chức - địa ghi bắt đầu - số ghi – liệu - mã CRC Master đọc giá trị ghi analog cài sẵn phần 4.1 4.2.11 Kết kiểm tra Mã Ngoại lệ có vấn đề khung truyền kho liệu a Ghi địa giới hạn vùng nhớ kho: địa 1000 Đoạn mã lệnh để bật cuộn dây thứ 1000 : log.debug('Command write coil 1000 to ON') rr = client.write_coil(1000, True,unit=0x07) if rr.function_code < 0x80 : log.debug('Receive Expected Response') else: log.debug("Error: Exception Code : %d" % rr.exception_code) log.debug('Done command') 80 Master: Trả Exception Code =2 sau: DEBUG:root:Command write coil to ON DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[133] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Error: Exception Code : DEBUG:root:Done command DEBUG:root:**************************** Slave: Kiểm tra kho gởi Master: DEBUG:pymodbus.server.sync:************* start receive request **************** DEBUG:pymodbus.server.sync:0x7 0x5 0x3 0xe8 0xff 0x0 0xc 0x2c DEBUG:pymodbus.factory:Factory Request[5] DEBUG:pymodbus.datastore.context:validate[5] 1001:1 DEBUG:pymodbus.datastore.context:The pointer is chosen at Store Discrete Output Coils ERROR:pymodbus.pdu:Exception Response F(5) E(2) DEBUG:pymodbus.server.sync:send_to_client_by_cuongpham: 0785022350 DEBUG:pymodbus.server.sync:************* finish response process **************** b Thực đọc vùng nhớ (8000 ghi analog) Đoạn mã lệnh ghi vào vùng nhớ thứ 8000 sau : log.debug('Read Input register from to 8') rr = client.read_input_registers(1,8000,unit=0x07) if rr.function_code < 0x80 : log.debug('Receive Expected Response') log.debug("Input Register value is %d" % rr.registers[0]) log.debug("Input Register value is %d" % rr.registers[1]) log.debug("Input Register value is %d" % rr.registers[2]) log.debug("Input Register value is %d" % rr.registers[3]) log.debug("Input Register value is %d" % rr.registers[4]) log.debug("Input Register value is %d" % rr.registers[5]) log.debug("Input Register value is %d" % rr.registers[6]) 81 log.debug("Input Register value is %d" % rr.registers[7]) # note: rr.register[0:7] ~ register[1:8] else: log.debug("Error: Exception Code : %d" % rr.exception_code) log.debug('Done command') log.debug('****************************\n\n') Master: Trả Exception Code = sau : DEBUG:root:Read Input register from to DEBUG:pymodbus.transaction:Running transaction 10 DEBUG:pymodbus.factory:Factory Response[132] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction 10 DEBUG:root:Error: Exception Code : DEBUG:root:Done command DEBUG:root:**************************** Slave: DEBUG:pymodbus.server.sync:************* start receive request **************** DEBUG:pymodbus.server.sync:0x7 0x4 0x0 0x1 0x40 0xa8 0x6c DEBUG:pymodbus.factory:Factory Request[4] ERROR:pymodbus.pdu:Exception Response F(4) E(3) DEBUG:pymodbus.server.sync:send_to_client_by_cuongpham: 078403e300 DEBUG:pymodbus.server.sync:************* finish response process **************** c Master gởi nhầm địa ID Master: gởi địa 0x05 thay 0x07 Mã lệnh thực chức : log.debug('Command write coil to ON') rr = client.write_coil(1, True,unit=0x05) if rr.function_code < 0x80 : log.debug('Receive Expected Response') else: log.debug("Error: Exception Code : %d" % rr.exception_code) log.debug('Done command') log.debug('****************************\n\n') 82 Slave: không trả lời- No response to Client DEBUG:pymodbus.server.sync:************* start receive request **************** DEBUG:pymodbus.server.sync:0x7 0x5 0x0 0x1 0xff 0x0 0xdd 0x9c DEBUG:pymodbus.factory:Factory Request[5] DEBUG:pymodbus.datastore.context:validate[5] 2:1 DEBUG:pymodbus.datastore.context:The pointer is chosen at Store Discrete Output Coils DEBUG:pymodbus.datastore.context:setValues[5] 2:1 DEBUG:pymodbus.datastore.context:getValues[5] 2:1 DEBUG:pymodbus.server.sync:Wrong address No response to client DEBUG:pymodbus.server.sync:************* finish response process **************** 4.3 KẾT QUẢ MÔ PHỎNG KHI KẾT NỐI MÁY TÍNH NHÚNG VÀ MÁY TÍNH NGỒI 4.3.1 Phương pháp thực Dùng máy tính thực đóng vai trị thiết bị Modbus slave Dùng chương trình RSim để mơ Kết nối máy tính nhúng máy tính thực thơng qua module PL2303 hình 4.30 83 Hình 4.1: Kết nối máy tính nhúng laptop thông qua PL2303 Giao diện hình RSIM hình 4.31 Hình 4.2: Giao diện phần mềm RSim Trong giao diện RSim chọn cổng kết nối, tốc độ Baud thông số khác dành riêng cho Modbus cuộn dây, ghi, đầu vào số, ghi analog… Ngồi cịn dùng RSim để đặt địa thiết bị (phần giao diện) Chương trình máy tính nhúng đóng vai trị master gởi đoạn tin u cầu qua laptop chờ nhận lại kết 4.3.2 Mơ q trình ghi cuộn dây (FC=5 FC=15) Master: thực bật cuộn dây 0, 6-9, tắt cuộn dây từ 2-5 DEBUG:root:Command write coil to ON DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[5] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Done command 84 DEBUG:root:**************************** DEBUG:root:Command write coils from to to OFF & to to ON DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[15] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Done command DEBUG:root:Command read coil to DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[1] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Coil is OFF DEBUG:root:Coil is OFF DEBUG:root:Coil is OFF DEBUG:root:Coil is OFF DEBUG:root:Coil is ON DEBUG:root:Coil is ON DEBUG:root:Coil is ON DEBUG:root:Coil is ON DEBUG:root:Done command DEBUG:root:**************************** Slaver nhận diện đáp trả liệu hình 4.32 Hình 4.3: Kết giao diện RSim (FC=05 FC=15) Các đầu bật yêu cầu 85 4.3.3 Mô trình ghi ghi (FC=16) Master: Thực ghi giá trị 1000 1000 800 800 600 600 400 400 cho ghi từ đến DEBUG:root:Write Holding register from to 8,values 1000 1000 800 800 600 600 400 400 DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[16] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Done command DEBUG:root:**************************** Slaver sau nhận liệu ghi giá trị lên ghi hình 4.33 Hình 4.4: Kết giao diện RSim (FC=16) Như ghi ghi liệu mong muốn 1000, 1000, 800, 800, 600, 600, 400, 400 4.3.4 Mơ q trình đọc ghi (FC=3) Master thực đọc lại ghi ghi từ đến kết sau: DEBUG:root:Read Holding register from to DEBUG:pymodbus.transaction:Running transaction 86 DEBUG:pymodbus.factory:Factory Response[3] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Register value is 1000 DEBUG:root:Register value is 1000 DEBUG:root:Register value is 800 DEBUG:root:Register value is 800 DEBUG:root:Register value is 600 DEBUG:root:Register value is 600 DEBUG:root:Register value is 400 DEBUG:root:Register value is 400 DEBUG:root:Done command DEBUG:root:**************************** 4.3.5 Mơ q trình đọc đầu vào số (FC=2) Slave: Cài đặt giá trị cho đầu vào số slave hình 4.34 Bật đầu vào 1, 12 Hình 4.5: Cài đặt giá trị cho đầu vào số slave Master thực đọc giá trị đầu vào từ đến cho kết sau: DEBUG:root:Command read input DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[2] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Discrete Input is ON DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is OFF DEBUG:root:Discrete Input is ON DEBUG:root:Discrete Input is OFF 87 DEBUG:root:Discrete Input is OFF DEBUG:root:Done command DEBUG:root:**************************** Như master thực xong việc động giá trị đầu vào kết trả 4.3.6 Mô trình đọc ghi analog (FC=4) Slave: Cài đặt giá trị cho ghi analog slave hình 4.35 Các giá trị từ ghi đến từ đến 80 theo cấp số cộng 10 Hình 4.6: Cài đặt giá trị cho đầu vào số slave Master thực trình đọc ghi analog cho kết sau DEBUG:root:Read Input register from to DEBUG:pymodbus.transaction:Running transaction DEBUG:pymodbus.factory:Factory Response[4] DEBUG:pymodbus.transaction:adding transaction DEBUG:pymodbus.transaction:getting transaction DEBUG:root:Receive Expected Response DEBUG:root:Input Register value is 10 DEBUG:root:Input Register value is 20 DEBUG:root:Input Register value is 30 DEBUG:root:Input Register value is 40 DEBUG:root:Input Register value is 50 DEBUG:root:Input Register value is 60 DEBUG:root:Input Register value is 70 DEBUG:root:Input Register value is 80 DEBUG:root:Done command DEBUG:root:**************************** Như vậy, với lớp thuật tốn đưa máy tính cho máy ảo hoạt động độc lập Master Slave thực tế, đồng thời cho kết với tiêu chuẩn mạng Modbus 88 Đối với kết nối máy tính nhúng máy tính ngồi, kết có khác với mơ máy ảo Sự khác nằm vị trí cuộn dây bật tắt bị ngược so với mơ máy tính ảo Ví dụ master muốn tác động cuộn slaver ghi nhận cuộn 15 Sự sai khác nằm việc quy định ghi 16 bit hai chương trình (chương trình RSIM chương trình python luận văn) nằm hai hướng ngược Bit đầu chương trình bit cuối chương trình Đối với ghi (holding register input register), phương pháp cho kết giống Trong thực tế cần phải kiểm tra lại vị trí cuộn dây, ghi để thống với trước lập trình lớp ứng dụng 89 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI Các điểm làm Luận văn đưa thuật tốn giúp máy tính nhúng Linux truyền nhận khung truyền Modbus, xử lý khung truyền Bên cạnh cịn nhận biết lỗi Luận văn đưa cách xây dựng lớp thuật tốn ngơn ngữ python để thực mô mạng truyền thông công nghiệp Modbus RTU Xây dựng khung truyền gởi xử lý khung truyền cách hiệu Các mã chức xác định Cách xếp liệu vào kho đưa giúp slave kiểm sốt liệu vào cách xác Bằng lớp thuật tốn nêu, người lập trình thực để viết ứng dụng riêng Các điểm hạn chế Do hoàn thành thời gian ngắn nên luận văn chưa bao quát hết tất mặt Modbus RTU chưa đưa chẩn đoán lỗi khung truyền cách đầy đủ Bên cạnh đó, mã nguồn chưa tính đến vấn đề tối ưu thời gian Mã nguồn có chức truyền thơng tin nút mạng theo chuẩn modbus Ngoài khơng có chức xử lý khác PID, mạng neuron… Việc thêm chức khác người phát triển lớp Modbus Hướng phát triển đề tài Thêm vấn đề tối ưu thời gian cho ứng dụng thời gian thực Bên cạnh cần kiếm chứng với thiết bị sử dụng mạng truyền thông công nghiệp thực tế để đảm bảo tính đắn thuật tốn ngơn ngữ lập trình Ngồi luận văn cịn sử dụng lớp nêu để phát triển thành Modbus Ascii thêm lớp khác để thành Modbus TCPIP Máy tính nhúng có cổng Ethernet phục vụ cho Modbus TCPIP cần phải thay đổi hình thức truyền liệu tảng truyền liệu lớp vật lý thực nhờ RS232/RS485 không dùng cổng Ethernet RJ45 90 DANH MỤC ĐỀ TÀI THAM KHẢO [1] MODICON Inc, “Modicon Modbus Protocol Reference Guide,” Modbus.org, 1996 [Trực truyến] Xem modbus.org/docs/PI_MBUS_300.pdf [Ngày truy cập: tháng 12, 2016] [2] Modbus Organization, “MODBUS over serial line specification and implementation guide V1.02,” Modbus.org, 2006 [Trực tuyến] Xem http://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf [ Ngày truy cập: tháng 11, 2016] [3] Hoàng Minh Sơn, Mạng truyền thông công nghiệp, tái lần thứ Nhà xuất khoa học kĩ thuật, Hà Nội, 2006 [4] Spehro Pefhany, “Modbus Protocol,” Interlog, 2006 [Trực tuyến] Xem tạị www.interlog.com/~speff/usefulinfo/modbus_protocol.pdf [ Ngày truy cập: tháng 11, 2016] [5] Jonas Berg, “MinimalModbus,” Github, 2015 [Trực truyến] Xem https://github.com/pyhys/minimalmodbus [Ngày truy cập: tháng 3, 2017] [6] Galen Collins, “Pymodbus Documentation,” Readthedocs, 2017 [Trực tuyến] Xem https://media.readthedocs.org/pdf/pymodbus/latest /pymodbus.pdf [Ngày truy cập: tháng 3, 2017] [7] Wikipedia, “Modbus,” Wikipedia, 2017 [Trực tuyến] Xem https://en.wikipedia.org/wiki/Modbus [Ngày truy cập: tháng 3, 2017] ... dụng riêng Thông qua đề tài "Xây dựng mạng truyền thông công nghiệp Modbus RTU ngôn ngữ Python máy tính nhúng Linux" , mạng Modbus RTU ngăn xếp tìm hiểu xây dựng ngơn ngữ Python tảng máy tính Banana... HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA PHẠM NGỌC CƯỜNG XÂY DỰNG MẠNG TRUYỀN THÔNG CÔNG NGHIỆP MODBUS RTU BẰNG NGƠN NGỮ PYTHON TRÊN MÁY TÍNH NHÚNG LINUX Chuyên ngành: Kỹ thuật điều khiển tự động hóa... tìm hiểu mạng Modbus RTU ngăn xếp tìm hiểu từ xây dựng ngơn ngữ Python tảng máy tính Banana Pro nhúng hệ điều hành Linux Dựa theo cách thức hoạt động tiêu chuẩn mạng công nghiệp Modbus RTU, đề