Lời tựa Như các bạn đã biết, hiện nay trong công nghiệp có rất nhiều hệ thống bus được sử dụng như: Profibus, Can, Interbus, DeviceNet,… Tuy nhiên, Modbus lại là giao thức phổ biến nhất,
Trang 1M c l c ụ ụ
Trang 2Lời tựa
Như các bạn đã biết, hiện nay trong công nghiệp có rất nhiều hệ thống bus được sử dụng như: Profibus, Can, Interbus, DeviceNet,… Tuy nhiên, Modbus lại là giao thức phổ biến nhất, được các nhà cung cấp lựa chọn cho cả thiết bị thế hệ cũ
và mới Modbus có thể chạy trên hầu hết các phương tiện truyền thông trong đó có các cổng kết nối dây xoắn, không dây, sợi quang, Ethernet, modem điện thoại, điện thoại di động và vi sóng Có nghĩa là kết nối này có thể được thiết lập trong các nhà máy thế hệ cũ hay mới khá dễ dàng
Chương I : Tổng quan về Modbus
1.1 Khái niệm về Modbus
Modbus là một giao thức do hang Modicon phát triển Theo mô hình ISO/OSI thì nó thực chất là một chuẩn giao thức và dịch vụ thuộc lớp ứng dụng.
Modbus là một cấu trúc mạng truyền thông kiểu nối tiếp Nó hỗ trợ hai chuẩn truyền dẫn là RS232 và RS485 Việc truyền dữ liệu được thực hiện theo cơ chế Master/Slave
1.2 Các đặc điểm của Modbus
1.2.1 Phân loại
Căn cứ vào cách thức truyền dữ liệu ta chia Modbus làm 3 dạng:
• Modbus RTU : Dữ liệu được truyền trên bus nối tiếp và được truyền theo định dạng mã hexadecimal Nó được sử dụng trong truyền thông thông thường.
• Modbus ASCII : Dự liệu được truyền trên bus nối tiếp và truyền dưới dạng mã ascii Nó có ưu điểm là có thể dễ dàng để người dùng hiểu được
dữ liệu đang truyền Được sử dụng trong việc kiểm tra và giới thiệu cho giao thức mạng Modbus
• Modbus TCP/IP : Dữ liệu có thể được truyền trên mạng Lan hoặc mạng ở trên một khu vực rộng Dữ liệu được định nghĩa dạng hexadecimal.
1.2.2 Cấu trúc đoạn tin trong Modbus
Đây là cấu trúc một đoạn tin trong giao thức Modbus:
Address field Function field Data field Error check field
1.2.2.1 Address field : 1 byte
Trang 3Có độ dài 1 byte : đây là nơi cung cấp địa chỉ của slave mà master tác động tới Mỗi một slave sẽ có một địa chier Modbus riêng ( từ 0 đến 247).
1.2.2.2 Function field : 2 bytes
Mã này cho biết nhiệm vụ mà slave cần làm Đặc biệt, Modbus cung cấp một bảng mã chung cho tất cả các thiết bị
Hình 1.1 Mã hàm cung cấp bởi modbus
1.2.2.3 Data field : Variable
Khối này thường chứa địa chỉ của các vùng trên thiết bị slava mà master muốn tác động tới
Trong giao thức mạng Modbus, thì có một tiêu chuẩn địa chỉ chung cho tất
cả các thiết bị có hỗ trợ Modbus
Bảng dưới đây trình bày địa chỉ chuẩn Modbus của các thanh ghi trong các thiết bị hỗ trợ Modbus.
Trang 4Hình 1.2 Địa chỉ chuẩn modbus của các thanh ghi
1.2.2.4 Error check field : 2 bytes
Chức năng : Giúp slave kiểm tra được lỗi có xuất hiện khi master truyền dữ liệu hay không
1.3 Ứng dụng của Modbus trong công nghiệp
• Là một phương pháp truyền thông mở, là giải pháp được sử dụng phổ biến để kết nối các thiết bị điện tử
• Chúng hay được dùng để truyền tín hiệu từ các thiết bị đo, thiết bị điều khiển trở về bộ điều khiển chính hay hệ thống thu nhập dữ liệu
• Kết nối các máy tính giám sát với một thiết bị điều khiển ( RTU : remote terminal unit) trong hệ thống Scada
Trang 5Chương 2 : Giao tiếp giữa PLC và Vi điều khiển.
2.1 Đặt vấn đề
MODBUS
Hình 2.0 Sơ đồ cầu trúc tổng quát của mạch
Ở đồ án I, chúng em sử dụng PLC S7-300 giao tiếp với vi điều khiển qua chuẩn truyền thông công nghiệp Modbus để thực hiện việc đo nhiệt độ và tắt bật đèn sáng
2.2 Giải quyết vấn đề
2.2.1 Hướng giải quyết tổng quát.
Để giải quyết vấn đề trên Chúng em sử dụng một mạch điện có chứa:
• Lm 35: cảm biến đo nhiệt độ.
Microcontroller
PLC
S7-300
Trang 6• Rơ le đóng cắt điện 220V :
• Max 485 : chuyển đổi tín hiệu của chuẩn giao tiếp RS 232 sang RS 485,
sử dụng cặp đôi dây xoắn và phương pháp chặn song song (lắp trở 120 ôm)
Trang 7
Hình 2.1 Mạch in của mạch Slave
Trang 8Hình 2.2 Ảnh 3D của mạch Slave.
Sử dụng phương pháp truy nhập bus kiểu Master/ Slave cho PLC và vdk atmega 8 Hai phần tử sẽ này sẽ giao tiếp qua giao thức Modbus với chuẩn truyền dẫn RS 485 ( phương thức chênh lệch đối xứng).
Với nhiệm vụ đo nhiệt độ, LM35 đo nhiệt độ truyền thông tin về atmega 8
Vi điều khiển này gửi dữ liệu về nhiệt độ khi Master- PLC yêu cầu.
Với nhiệm vụ bật và tắt bóng đèn, khi Master yêu cầu đóng cắt Nó sẽ gửi lệnh tới Slave- vi điều khiển Rồi vi điều khiển này lại tín hiệu điều khiển tới relay giúp đóng cắt tiếp điểm, giúp bóng đèn bật tắt.
2.2.2 Hướng giải quyết cụ thể.
2.2.2.1 Lập trình phần mềm
Sơ đồ thuật toán:
Trang 9Dữ liệu lỗi?
Xử lý dữ liệu nhận được và gửi
phản hồi
Trang 10Bộ truyền uart được thiết lập với các cài đặt: Baudrate: 19200 bps
1 Start bit
8 data bit
No parity
2 stop bit Cài đặt bộ ADC: 10 bit, điện áp tham chiếu 5V.
Cài đặt ngắt timer: chu kì ngắt: 1s.
Chương trình phục vụ ngắt timer có chức năng đọc giá trị nhiệt độ từ cảm biến lm35 theo chu kì 1s.
Chương trình được lập trình bằng phần mềm CodevisionAVR:
/******************************************************
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
#define relay_on PORTB.0=1
#define relay_off PORTB.0=0
#define TRcontrol DDRD.2=1
#define Tx_enable PORTD.2=1
#define Rx_enable PORTD.2=0
// Declare your global variables here
//nhiet do
unsigned int nhiet_do;
bit relay;
bit frameIsBroadcast =0;
unsigned char modbus_frame[16];
unsigned char response_frame[16];
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
Trang 11// USART Receiver buffer
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
Trang 12// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
Trang 13// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR)) // Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
if ((crc&0x0001) != 0) { // If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
Trang 14crc ^= 0xA001;
}
else // Else LSB is not set
crc >>= 1; // Just shift right
Trang 15checksum=crc_checksum(response_frame,2); response_frame[3]=checksum>>8;
Trang 16// Declare your local variables here
unsigned int mas_check, slv_check;
unsigned char len, function_code;
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
Trang 17// Timer Period: 1 s
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10);
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);
// External Interrupt(s) initialization
// USART Mode: Asynchronous
// USART Baud Rate: 19200
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(1<<RXCIE) | (1<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
Trang 18UBRRL=0x23;
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
// ADC initialization
// ADC Clock frequency: 691.200 kHz
// ADC Voltage Reference: AVCC pin
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
// Global enable interrupts
Trang 19else if(function_code==read_coil&&frameIsBroadcast==0) Funct_readcoil_response(); else if(function_code==write_coil)
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
unsigned int buff;
// Reinitialize Timer1 value
Trang 202.2.2.2 Mô phỏng & sửa lỗi phần mềm:
Sử dụng phần mềm COM PORT toolkit để mô phỏng và kiểm tra dữ liệu truyền / nhận tới vi điều khiển:
Hình 2.3 Giao diện của phần mềm COM PORT
Trang 21Hình 2.4 Cửa sổ gửi lệnh của COM PORT
Thông số kỹ thuật của slave: địa chỉ: 0xCD
Các hàm chức năng cung cấp: 04 – đọc giá trị từ một thanh ghi (giá trị nhiệt độ)
05 – thay đổi trạng thái của một cuộn hút ( relay)
01 – đọc trạng thái của một cuộn hút (relay)
Trang 22Hình 2.5 Khung truyền mà Slave ( vdk Atmega 8) trả về
Trang 23Chương 3: Kết quả thực nghiệm 3.1: Chức năng đọc giá trị nhiệt độ:
- Frame truyền đi: CD 04 00 00 49 7F
Trang 243.3: Chức năng đọc trạng thái relay:
Frame truyền đi: CD 01 E0 94
Frame nhận về:
- Nếu relay đang đóng: CD 01 01 6F 20
- Nếu relay đang ngắt: CD 01 00 AF E1
3.4: Trả lời báo lỗi:
Nếu Frame truyền đi chứa hàm chức năng mạch không hỗ trợ:
VD: CD 09 26 95
Trả lời báo lỗi: CD 89 01 86 94
*Tài liệu tham khảo :
• Mang công nghiệp – Hoàng Minh Sơn.
• Bài giảng Hệ thống đo & ĐKCN- Thầy Đào Đức Thọ.
• https://ctlsys.com/support/how_to_compute_the_modbus_rtu_message_crc/
• modbus-rtu-pc-master-2plc-slave-26628/