Please wait 0 seconds...
Scroll Down and click on Go to Link for destination
Congrats! Link is Generated
(Cơ điện tử Việt Nam - PLC/SCADA) Tôi dự định tạo một hệ thống tự động cho ngôi nhà của mình với sự kết hợp của PLC SIEMENS và ARDUINO . Tôi nghĩ chúng ta có thể kết hợp những điểm mạnh của riêng họ để làm cho hệ thống tự động hóa hoạt động ổn định, tối ưu và giá cả chấp nhận được. Vì vậy, tôi đã dành thời gian tham khảo, nghiên cứu và thực hiện một số thí nghiệm dưới đây trước khi áp dụng cho nhà mình.
- Toogle một đèn 220 VAC từ nút cảm ứng của Arduino qua Profibus-DP.
- Hiển thị giá trị nhiệt độ PT100 trên ma trận led 64x64 qua Profibus-DP
Bước 1: Danh sách các thiết bị
Thành phần chính bao gồm:
A. Thử nghiệm 1: Toogle một đèn 220 VAC từ nút cảm ứng của Arduino:
- 01 cái x DFRduino UNO R3 - Tương thích Arduino
- 01 cái x DFRobot RS485 Shield cho Arduino
- 01pcs x DFRduino Ethernet Shield (Tùy chọn):
- 01 cái x PLC S7-300.
- 01 cái x Rơ le 24VDC.
- 01 cái x Cảm biến cảm ứng.
- 01 cái x Đèn 220VAC.
- 01 cái x Nút cảm ứng với đèn LED chỉ báo.
- 03 mét x cáp Profibus.
- 03 cái x đầu nối Profibus.
B. Thử nghiệm 2: Hiển thị giá trị nhiệt độ PT100 trên ma trận led RGB 64x64, chúng ta cần thêm một số linh kiện như sau:
- 01 cái x DFRobot Mega 2560
- 01 cái x P2.5 Ma trận LED 64x64 RGB.
- 01 cái x Pt100 RTD.
- 01 cái x Mô-đun giao diện IM 151-1 Tiêu chuẩn cho ET 200S - 6ES7151-1AA05-0AB0
- 01 mô-đun nguồn x PM-E cho ET 200S - 6ES7138-4CA01-0AA0
- 01pcs x 2AI RTD HF mô-đun tương tự - 6ES7134-4NB51-0AB0.
Bước 2: Phần mềm và hướng dẫn
I. Phần mềm
II. Hướng dẫn tham khảo
- Bộ hẹn giờ, UART của Arduino.
- PLC Siemens S7-300.
- Hướng dẫn sử dụng Profibus: https://www.felser.ch/profibus-manual/index.html
- Tìm hiểu về tệp * .GSD để cấu hình Arduino vào hệ thống phần cứng PLC Siemens.
Bước 3: Xem nhanh mạng PROFIBUS-DP
Mạng PROFIBUS DP dựa trên giao tiếp vật lý RS485 và nó phải tuân thủ nghiêm ngặt cấu trúc định dạng bức điện và trình tự bức điện được xác định bởi mạng PROFIBUS. Và các thiết kế RS485 sử dụng cùng một UART cơ bản nhưng nó chuyển đổi tín hiệu UART thành tín hiệu vi sai hai hướng.
Công nghệ truyền RS 485 sử dụng cáp hai lõi, với lõi đỏ dương B + và lõi xanh A- âm . Lợi ích của việc sử dụng tín hiệu vi sai để giảm thiểu tiếng ồn và cho phép chiều dài cáp dài hơn, lên đến 1,2 km. Nó cho phép truyền dữ liệu nhanh chóng lên đến tốc độ bit 12 Mbit / s.
Định dạng khung và giải mã UART
Các định dạng viễn thông PROFIBUS-DP
Mỗi byte trong một bức điện được chuyển dưới dạng 11 bit ( START = 0; DATA = 8 BIT; PARITY = EVEN; STOP = 1 ), xem hình FRAME FORMAT ở trên.
TBIT: THỜI HẠN CỦA MỘT BIT
Trên PROFIBUS-DP, các tỷ lệ thời gian nhất định phải được tôn trọng để đảm bảo rằng một chuỗi điện tín có thể hoạt động chính xác.
Thời lượng của một bit khác nhau tùy thuộc vào tốc độ bit: đối với 12 MBit / s tBit = 83 ns và đối với 1,5 MBit / s tBit = 0,67 µs.
Chúng ta nên tìm hiểu thêm thông tin về Profibus tại liên kết sau:
Bước 4: Kết nối
I. Kết nối PLC:
II. Kết nối Arduino:
III. Mô tả thử nghiệm:
Đèn 220VAC có thể được điều khiển ở chế độ toogle bằng đầu vào ảo và vật lý như sau:
- Nút cảm ứng được kết nối với lá chắn Arduino cộng với RS485 và gửi lệnh đến PLC S7-300 thông qua mạng Profibus-DP tại Đầu vào ảo I0.0
- Cảm biến cảm ứng được kết nối trực tiếp với PLC S7-300 tại Đầu vào Vật lý I124.0
- Cuộn dây rơle 24VDC được kết nối với Đầu ra Vật lý PLC Q124.0 và đèn 220VAC được kết nối với tiếp điểm NO (mở bình thường) của rơle này. Mặc dù đèn được điều khiển bằng Arduino hoặc PLC, Arduino nhận phản hồi trạng thái đèn từ PLC ở đầu ra ảo Q0.0 và hiển thị trạng thái đèn bằng đèn led đỏ (đèn 220VAC tắt) / đèn led xanh (đèn bật 220VAC) trên nút cảm ứng.
Chúng ta có thể xem chi tiết hơn ở bước " LẬP TRÌNH PLC ".
Bước 5: Cấu hình phần cứng PLC
Cấu hình phần cứng PLC như hình bên dưới và chúng ta cần thực hiện các bước sau:
Trong chương trình Simatic Step 7 (HW CONFIG), chúng tôi phải cài đặt tệp ARDUINO * .GSD và cập nhật Danh mục phần cứng của bạn bằng lệnh menu " Options --> Update catalog ". Bạn có thể kiểm tra chi tiết tại liên kết này để biết cách tích hợp tệp GSD vào Cấu hình STEP 7 HW cho PROFIBUS.
Tệp GSD là biểu dữ liệu thiết bị điện tử hoặc tệp cơ sở dữ liệu thiết bị xác định thiết bị Profibus. Tất cả các thiết bị Profibus (chính và nô lệ lớp 1) đều có tệp GSD của riêng chúng. GSD là viết tắt của " General Station Description ". Nó là một tệp văn bản ASCII chứa dữ liệu dành riêng cho thiết bị, chẳng hạn như, thông tin nhận dạng nhà cung cấp, tốc độ truyền được hỗ trợ, độ dài tin nhắn được hỗ trợ, số lượng dữ liệu đầu vào / đầu ra, ý nghĩa của thông báo chẩn đoán, thông tin thời gian, cộng với các tùy chọn và tính năng được hỗ trợ, dữ liệu định dạng và các tín hiệu I / O khả dụng.
Với Arduino - F_CPU = 16MHz, mạng Profibus hoạt động tốt ở tốc độ truyền 45,45 Kbps .
Chúng ta cần xác định số byte được truyền và nhận qua kết nối Profibus, chúng ta có thể thấy thiết lập này ở hình trên:
- Đầu vào 1 Byte: PLC nhận đầu vào 1 byte tại địa chỉ đầu vào ảo IB0.
- Đầu ra 1 Byte: PLC truyền đầu ra 1 byte tại địa chỉ đầu ra ảo QB0.
Bước 6: Lập trình PLC
Nó là chương trình PLC đơn giản với:
- OB1 - Chương trình chính.
- DB1 - Khối dữ liệu để lưu trữ trạng thái LAMP của Google (tại DB1.DBX0.0).
- FB1 - Khối chức năng để thực hiện chức năng bật tắt. Nó chuyển đổi trạng thái Q đầu ra với mọi cạnh tăng của xung nhịp (CLK).
- DB2 - Khối dữ liệu tức thì cho FB1.
Giải thích chương trình:
- I0.0 - Đầu vào ảo PLC được nhận từ Nút cảm ứng của Arduino qua Profibus-DP.
- I124.0 - Đầu vào Vật lý PLC được kết nối trực tiếp với Cảm biến Cảm ứng.
- Q124.0 - Đầu ra Vật lý PLC được kết nối với rơle cuộn dây 24VDC.
- PQB0 - Byte đầu ra ảo PLC (8bit) được truyền tới Arduino qua Profibus-DP.
Khối chức năng " TOOGLE " FB1 được viết bằng SCL (Ngôn ngữ điều khiển có cấu trúc) có thể được sao chép vào thư mục chương trình / Nguồn S7 và được biên dịch sang LAD / STL. Khối chức năng này chuyển đổi trạng thái đầu ra Q khi nó phát hiện mọi cạnh lên của xung nhịp (CLK). Chúng ta có thể thấy trong chương trình, khối chức năng "TOOGLE" sẽ chuyển sang Google Q124.0 khi nó phát hiện một xung cạnh lên ở đầu vào ảo I0.0 hoặc đầu vào vật lý I124.0
FUNCTION_BLOCK TOGGLETITLE = 'TOGGLE'VAR_INPUTCLK : BOOL;RST : BOOL;END_VARVAR_OUTPUTQ : BOOL;END_VARVAREDGE : BOOL;END_VARBEGINIF RST THENQ := 0;ELSIF CLK AND NOT EDGE THENQ := NOT Q;END_IF;EDGE := CLK;END_FUNCTION_BLOCK
Bước 7: Lập trình Arduino
Mã Arduino bao gồm tệp * .GSD cho Cấu hình phần cứng PLC có sẵn tại GitHub của tôi.
Chương trình của tôi được tham khảo từ trang web mikrocontroller của Đức bởi Jörg S., Marc H., Johannes F. và ban đầu nó được viết cho MSP430F2252. Nếu bạn là người Đức tôi tin rằng bạn sẽ thu thập được nhiều thông tin ở đây.
Đối với RS485 Shield do DFROBOT thiết kế sẽ rất hữu ích khi nó được trang bị thêm nút “ Operation and programming mode switch ” vì Arduino Uno chỉ có 1 cổng UART để lập trình và giao tiếp RS485.
- Chuyển sang TẮT: bạn có thể tải xuống chương trình cho bộ điều khiển Arduino.
- Chuyển sang BẬT: lá chắn sẽ chuyển đổi UART sang RS485.
Lưu ý Quan trọng:
- Profibus-DP dựa trên giao tiếp vật lý RS485 có hai đường độc lập được gọi là đường âm - A và đường dương - B, truyền các mức điện áp tương tự nhưng với các phân cực ngược nhau. Vì lý do này, điều quan trọng là mạng phải được kết nối với đúng cực. Khi thử nghiệm của tôi với một số mô-đun RS485, để sửa các cực của chúng, tôi phải hoán đổi 2 lõi A và B của cáp Profibus với nhau cho hầu hết các mô-đun RS485 ở phía Arduino.
- Để mạng hoạt động bình thường, GND của PLC và GND của Arduino phải được kết nối với nhau.
Bước 8: Hiển thị giá trị PT100 trên Led ma trận 64x64
I. Mô tả bài toán
- PT100 được kết nối với mô-đun tương tự 2AI RTD tại trạm I / O từ xa, địa chỉ Profibus - DP: 4.
- Module Led ma trận bao gồm: Led ma trận 64x64 + Arduino Mega 2560 + DIY Profibus Shield, được kết nối với mạng Profibus tại địa chỉ: 6.
- PLC đọc nhiệt độ từ trạm I / O từ xa Profibus Address 6 và sau đó gửi giá trị này đến mô-đun ma trận led (Profibus Address - 6).
II. Soldering a Profibus shield
- Tấm chắn này không chỉ xử lý giao tiếp Profibus-DP mà còn điều khiển ma trận led 64x64. Bạn có thể tham khảo GitHub này để biết Arduino Mega 2560 có thể điều khiển led ma trận 64x64 như thế nào. Tấm chắn này bao gồm các thành phần sau:
- 01 cái x MAX485 IC
- 01 cái x Tụ tách 0,1uF.
- 03 cái x Điện trở kéo lên 10K.
- 01pcs x led chỉ thị 5mm và điện trở hạn chế dòng điện của nó.
- 01 cái x DB9 cái cho kết nối Profibus.
- 01 cái x 2,45mm 2x8P tiêu đề nữ hàng đôi, kết nối với tiêu đề nam ma trận dẫn PO nam
- 01 cái x Cáp ruy-băng 16P với tiêu đề nữ hàng đôi 2x8P ở 2 bên. Nó được sử dụng để kết nối từ lá chắn này đến tiêu đề nam PI ma trận dẫn đầu.
- Tấm chắn Profibus - Góc nhìn từ trên xuống
- Lá chắn Profibus - Chế độ xem dưới cùng
- Cắm tấm chắn này vào Arduino Mega 2560 rồi kết nối với led ma trận 64x64.
III. Lập trình PLC Và Arduino
Mô-đun 2AI RTD đọc nhiệt độ từ PT100 và lưu trữ trong khối dữ liệu (ví dụ: DB1) ở định dạng thực (Số dấu phẩy động) với 32 bit. Sau đó số thực 4 byte này sẽ được truyền tới Arduino, ví dụ như ở đầu ra ảo PQB0 ~ PQB3.
Lưu ý rằng PLC SIEMENS S7 ™ sử dụng định dạng dữ liệu " Big-Endian " và ARDUINO ™ sử dụng định dạng dữ liệu " Little-Endian ". Thuật ngữ "Big-Endian" và "Little-Endian" để mô tả sự khác biệt trong việc đọc và ghi dữ liệu:
- Big –Endian : MSB (bit ngoài cùng bên trái) -> LSB (bit ngoài cùng bên phải), ví dụ, DWORD 0x4C21112F được lưu trữ trong PLC Siemens S7 ™ như sau:
- Little Endian : LSB (bit ngoài cùng bên trái) -> MSB (bit ngoài cùng bên phải), với cùng DWORD ở trên nhưng ARDUINO ™ sẽ lưu trữ theo cách ngược lại DWORD 0x2F11214C
Arduino nhận nhiệt độ 4 byte ở định dạng REAL, BIG-ENDIAN, ví dụ: nó được lưu trữ tại {Profibus_in_register [0] ~ Profibus_in_register [3]}. Nó cần được xử lý và chuyển đổi thành FLOAT, LITTE-ENDIAN trong Arduino theo mẹo sau:
byte Temperature[4];float Corrected_Value;Temperature[3] = Profibus_in_register[0]; // swap order, 32-bit Big-Endian floatTemperature[2] = Profibus_in_register[1];Temperature[1] = Profibus_in_register[2];Temperature[0] = Profibus_in_register[3];float *floatTemp= (float *)Temperature; // format the buffer as a floatCorrected_Value= *floatTemp; // value in 32-bit Little-Endian float
Hình ảnh cho kết quả thử nghiệm: