Thông báo

Collapse
No announcement yet.

Kết nối PLC với vi điều khiển AVR theo chuẩn RS-485

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Kết nối PLC với vi điều khiển AVR theo chuẩn RS-485

    Không biết trên diễn đàn đã có ai kết nối PLC với vi điều khiển chưa? Tôi thấy chủ đề này cũng khá hay nên đưa lên đây cho các thành viên cùng thảo luận.
    Mục đích:
    - Tìm hiểu về cổng truyền thông Free port của PLC S7-200
    - Tìm hiểu về UART của AVR.
    - Chuyển đổi UART - 485
    Ứng dụng
    - Tạo thêm các I/O cho PLC, kể cả digjtal và analog.
    - Tạo các màn hình hiển thị (Led 7 thanh, LCD, GLCD....) kiểu như TD200
    Mời các thành viên cùng tham gia thảo luận.

  • #2
    Tôi cũng muốn nghiên cứu phần này từ lâu.Mục đích cũng là muốn mở rộng I/O cho PLC.Nhưng do không nắm về VDK nên đành bó tay
    Đào tạo PLC 200,HMI,WinccFlexible
    Bán PLC,HMI,Biến tần,Encoder....hàng xài rồi
    UnPass PLC 200(ver 1. và 2.),FX,....
    LH:0906603372-

    Comment


    • #3
      Tôi đã kết nối PLC S7-200 với con ATMEGA 16. chạy OK

      Comment


      • #4
        1 KIT kết nối+VDK giá tổng bạn tính thử xem khoảng bao nhiêu.Chỉ tính chân digital ko cần analog

        Bạn thử test trên PIC chưa
        add nick yahoo tôi:kidsolo1412
        tôi rất quan tâm vấn đề này
        Đào tạo PLC 200,HMI,WinccFlexible
        Bán PLC,HMI,Biến tần,Encoder....hàng xài rồi
        UnPass PLC 200(ver 1. và 2.),FX,....
        LH:0906603372-

        Comment


        • #5
          Sơ đồ cáp kết nối.
          Click image for larger version

Name:	A.jpg
Views:	2
Size:	30.4 KB
ID:	1350302

          Comment


          • #6
            Trích:
            1 KIT kết nối+VDK giá tổng bạn tính thử xem khoảng bao nhiêu.Chỉ tính chân digital ko cần analog

            Bạn thử test trên PIC chưa
            add nick yahoo tôi:kidsolo1412
            tôi rất quan tâm vấn đề này


            Tôi chỉ mới test trên con ATMEGA 16
            Bạn là giáo viên trong trường ah.
            Bạn cứ làm đi có gì lên diễn đàn trao đổi, cũng không khó đâu. Mạch đơn giản vấn đề chủ yếu là viết chương trình thôi.
            Last edited by jackychan; 19-08-2011, 12:15.

            Comment


            • #7
              Nguyên văn bởi jackychan Xem bài viết
              Trích:
              1 KIT kết nối+VDK giá tổng bạn tính thử xem khoảng bao nhiêu.Chỉ tính chân digital ko cần analog

              Bạn thử test trên PIC chưa
              add nick yahoo tôi:kidsolo1412
              tôi rất quan tâm vấn đề này


              Tôi chỉ mới test trên con ATMEGA 16
              Bạn là giáo viên trong trường ah.
              Bạn cứ làm đi có gì lên diễn đàn trao đổi, cũng không khó đâu. Mạch đơn giản vấn đề chủ yếu là viết chương trình thôi.
              Nêu như truyền thông như vậy VDK phải có cấu hình tốc độ truyền và địa chỉ đúng không
              Đào tạo PLC 200,HMI,WinccFlexible
              Bán PLC,HMI,Biến tần,Encoder....hàng xài rồi
              UnPass PLC 200(ver 1. và 2.),FX,....
              LH:0906603372-

              Comment


              • #8
                Trích:
                Nêu như truyền thông như vậy VDK phải có cấu hình tốc độ truyền và địa chỉ đúng không

                Đúng nếu chỉ có 1 VDK và 1 PLC thì không cần địa chỉ, nếu dùng 1 PLC làm MASTER và nhiều VDK làm nhiều SLAVE thì phải cấu hình thêm địa chỉ. Và VDK phải cài đặt chế độ truyền Mutli Processor.
                Đây là sơ đồ tổng thể.
                Click image for larger version

Name:	A.jpg
Views:	1
Size:	89.8 KB
ID:	1350305
                Attached Files

                Comment


                • #9
                  Bạn có thể hướng dẫn cụ thể cho mọi người không jackychan ?
                  Mình thật sự rất quan tâm đến vấn đề này.
                  Định dạng địa chỉ cho các module VDK như thế nào ?
                  Bạn có thể làm 1 ví dụ cho mọi người hiểu thì tốt quá.

                  Comment


                  • #10
                    em đang làm đồ án về tháng máy sử dụng plc. em đang mắc ở khối hiển thị tầng, không biết kết nối với plc kiểu gì. Em dùng 8051 liệu có thể kết nối được không? các anh có thể gợi ý cho em chút ý tưởng được không?

                    Comment


                    • #11
                      Sơ đồ kết nối thì như trên, cáp kết nối thì mua loại cáp nối dài cổng COM máy tính là được. Dưới đây là chương trình đơn giản, giao tiếp giữa 1 con ATMEGA và con CPU224.
                      Đây là chương trình trên con ATMEGA16
                      #include <mega16.h>
                      #define RXB8 1
                      #define TXB8 0
                      #define UPE 2
                      #define OVR 3
                      #define FE 4
                      #define UDRE 5
                      #define RXC 7

                      #define FRAMING_ERROR (1<<FE)
                      #define PARITY_ERROR (1<<UPE)
                      #define DATA_OVERRUN (1<<OVR)
                      #define DATA_REGISTER_EMPTY (1<<UDRE)
                      #define RX_COMPLETE (1<<RXC)


                      #define RX_BUFFER_SIZE 8 // Khai bao kich thuoc bo dem nhan
                      char rx_buffer[RX_BUFFER_SIZE];
                      #if RX_BUFFER_SIZE<256
                      unsigned char rx_wr_index,rx_rd_index,rx_counter;
                      #else
                      unsigned int rx_wr_index,rx_rd_index,rx_counter;
                      #endif
                      bit rx_buffer_overflow; //co bao tran bo dem
                      interrupt [USART_RXC] void usart_rx_isr(void){ // chuong trinh ngat nhan
                      char status,data;
                      status=UCSRA;
                      data=UDR;
                      temp=data; //doc du lieu nhan duoc ra bien trung gian

                      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0){
                      rx_buffer[rx_wr_index]=data;
                      if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
                      if (++rx_counter == RX_BUFFER_SIZE){
                      rx_counter=0;
                      rx_buffer_overflow=1;
                      };
                      };
                      }
                      #ifndef _DEBUG_TERMINAL_IO_
                      // Get a character from the USART Receiver buffer
                      #define _ALTERNATE_GETCHAR_
                      #pragma used+
                      char getchar(void){
                      char data;
                      while (rx_counter==0);
                      data=rx_buffer[rx_rd_index];
                      if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
                      #asm("cli")
                      --rx_counter;
                      #asm("sei")
                      return data;
                      }
                      #pragma used-
                      #endif
                      // USART Transmitter buffer
                      #define TX_BUFFER_SIZE 8
                      char tx_buffer[TX_BUFFER_SIZE];

                      #if TX_BUFFER_SIZE<256
                      unsigned char tx_wr_index,tx_rd_index,tx_counter;
                      #else
                      unsigned int tx_wr_index,tx_rd_index,tx_counter;
                      #endif

                      // USART Transmitter interrupt service routine
                      interrupt [USART_TXC] void usart_tx_isr(void){
                      if (tx_counter){
                      --tx_counter;
                      UDR=tx_buffer[tx_rd_index];
                      if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
                      };
                      }
                      #ifndef _DEBUG_TERMINAL_IO_
                      // Write a character to the USART Transmitter buffer
                      #define _ALTERNATE_PUTCHAR_
                      #pragma used+
                      void putchar(char c){
                      while (tx_counter == TX_BUFFER_SIZE);
                      #asm("cli")
                      if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)){
                      tx_buffer[tx_wr_index]=c;
                      if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
                      ++tx_counter;
                      }
                      else
                      UDR=c;
                      #asm("sei")
                      }
                      #pragma used-
                      #endif
                      // Standard Input/Output functions
                      #include <stdio.h>
                      #include <delay.h>
                      #define ADC_VREF_TYPE 0x20
                      // Read the 8 most significant bits
                      // of the AD conversion result
                      unsigned char read_adc(unsigned char adc_input){
                      ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                      // Delay needed for the stabilization of the ADC input voltage
                      delay_us(10);
                      // Start the AD conversion
                      ADCSRA|=0x40;
                      // Wait for the AD conversion to complete
                      while ((ADCSRA & 0x10)==0);
                      ADCSRA|=0x10;
                      return ADCH;
                      }

                      void main(void){
                      PORTB=0xFF;
                      DDRB=0xFF; //dat cac PORTB la cong vao.
                      // USART initialization
                      // Communication Parameters: 8 Data, 1 Stop, No Parity
                      // USART Receiver: On
                      // USART Transmitter: On
                      // USART Mode: Asynchronous
                      // USART Baud Rate: 9600
                      UCSRA=0x00;
                      UCSRB=0xD8;
                      UCSRC=0x86;
                      UBRRH=0x00;
                      UBRRL=0x4D;
                      // Analog Comparator initialization
                      // Analog Comparator: Off
                      // Analog Comparator Input Capture by Timer/Counter 1: Off
                      ACSR=0x80;
                      // ADC initialization
                      // ADC Clock frequency: 750.000 kHz
                      // ADC Voltage Reference: AREF pin
                      // ADC Auto Trigger Source: None
                      // Only the 8 most significant bits of
                      // the AD conversion result are used
                      ADMUX=ADC_VREF_TYPE & 0xff;
                      ADCSRA=0x84;
                      // Global enable interrupts
                      #asm("sei")

                      while (1){
                      if(PINB.0==0){ //neu chan PB0 duoc nhan
                      temp=read_adc(0); //doc tin hieu analog 0
                      putchar(temp); //gui len duong truyen
                      delay_ms(10);
                      }
                      }
                      }

                      Không gửi được file lên tôi đành đưa tạm lên đây
                      Last edited by jackychan; 20-08-2011, 12:11.

                      Comment


                      • #12
                        // Communication Parameters: 8 Data, 1 Stop, No Parity
                        // USART Receiver: On
                        // USART Transmitter: On
                        // USART Mode: Asynchronous
                        // USART Baud Rate: 9600


                        - Đặt các thông số truyền: 8bit dữ liệu, 1 bit Sop, không kiểm tra chẵn lẽ, chế độ truyền đồng bộ, tốc độ truyền 9600.
                        - Trong chương trình trên sử dụng ngắt nhận interrupt [USART_RXC] void usart_rx_isr(void).
                        - Khi có tín hiệu gửi đến thì chương trình ngắt sẽ đọc dữ liệu nhận được và lưu vào biến trung gian.
                        - Khi nút PB0 được nhấn thì ct đọc tín hiệu analog và gửi lên được truyền.

                        Comment


                        • #13
                          Đây là chương trình trên PLC
                          - Đoạn chương trình chính:
                          Click image for larger version

Name:	A.jpg
Views:	1
Size:	12.8 KB
ID:	1350315
                          - Đoạn chương trình ngắt
                          Click image for larger version

Name:	A.jpg
Views:	1
Size:	10.0 KB
ID:	1350316

                          Comment


                          • #14
                            Chương trình chính thiết lập các thông số cho cổng truyền Port 0. Thanh ghi SMB30 thực hiện nhiệm vụ này.
                            - Chương trình ngắt INT0 được liên kết với sự kiện ngắt số 8 (ngắt nhận dữ liệu từ Freeport).
                            - Dữ liệu gửi đế được tự động lưu vào SMB2, chương trình ngắt sẽ chuyển giá trị ra QB0.
                            Attached Files
                            Last edited by jackychan; 20-08-2011, 14:56.

                            Comment


                            • #15
                              Khi PLC gửi dữ liệu xuống VĐK thì sử dụng hàm truyền XMT
                              Click image for larger version

Name:	A.jpg
Views:	1
Size:	5.8 KB
ID:	1350318

                              - TLB chứa 2 thông số: thứ nhất là số byte được truyền, thứ 2 là gốc cho vị trí byte được truyền.
                              VD TLB là VB200: VB200 chứa giá trị 1, như vậy số byte được truyền là 1 và địa chỉ byte truyền là TLB+1 (tức là byte VB201 đươck truyền đi)

                              Comment

                              Về tác giả

                              Collapse

                              jackychan Nuber phone: 0989336877 : email: buigiapvtt@gmail.com Tìm hiểu thêm về jackychan

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X