Modbus RTU - CCS C - Exception 0C

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    banneduser
    banneduser's avatar
    Kayıt Tarihi: 15/Nisan/2013
    Erkek

    Hocalar merhaba, öncelikle iyi bayramlar

    MODBUS kullanımında yeniyim. Örnek projeleri inceliyorum. Fakat çalıştırdığım projelerde (biri örnek proje diğeri örnek projeden yazıdğım kendi projem) proteus üzerinde simüle ederken exception 0C alıyorum. Sorunun ne olduğuna baktım fakat slave haberleşmiyor gibi birşey anladım. Bunun hakkında bilgisi olan var mı?
    Örnek kullandığım proje (kodları compile etmek gerekiyor. hex dosyalarını paylaşmamış.)

    https://github.com/worrajak/PICmodbus

    https://preview.redd.it/fkk632qk7jy61.png?width=902&format=png&auto=webp&s=d61d8f1336f578424de9bea0f7a12182361f0068

    Döküman;

    https://modbus.org/docs/PI_MBUS_300.pdf

    Kodları basit hale getirdim ancak sonuç aynı;
    exception 0C hatası veriyor. Bunu incelediğimde fonksiyon 12, 0C, haberleşme hatası olarak karşıma çıktı fakat problemi anlayamadım.

    Yaptığım çalışmada; (Sadece led yakma fonksiyonları var.)
    master;

    #include <master_led_yak.h>
    #fuses HS, NOWDT
    #use delay(clock=4M)
    #define MODBUS_TYPE MODBUS_TYPE_MASTER
    #define MODBUS_SERIAL_TYPE MODBUS_RTU     //use MODBUS_ASCII for ASCII mode
    #define MODBUS_SERIAL_RX_BUFFER_SIZE 64
    #define MODBUS_SERIAL_BAUD 2400
    #use rs232(baud=9600, UART1, stream=PC, errors)
    #define MODBUS_SERIAL_INT_SOURCE MODBUS_INT_EXT
    #define MODBUS_SERIAL_TX_PIN PIN_B1   // Data transmit pin
    #define MODBUS_SERIAL_RX_PIN PIN_B0   // Data receive pin
    #define DEBUG_MSG(msg) fprintf(PC, msg)
    #define DEBUG_DATA(msg,data) fprintf(PC, msg, data)



    #include <modbus.c>
    #define MODBUS_SLAVE_ADDRESS 0x80

    int i;
    int8 swap_bits(int8 c)
    {
       return ((
    c&1)?128:0)|((c&2)?64:0)|((c&4)?32:0)|((c&8)?16:0)|((c&16)?8:0)
              |((
    c&32)?4:0)|((c&64)?2:0)|((c&128)?1:0);
    }
    void print_menu()
    {
       
    DEBUG_MSG("\r\n1. ledi yak\r\n");
    }
    void turnOnLED(){
       
    DEBUG_MSG("LED YAKILACAK\r\n");
       if(!(
    modbus_write_single_coil(MODBUS_SLAVE_ADDRESS,1,TRUE))){
          
    DEBUG_MSG("data: ");
          for(
    i=0i<(modbus_rx.len); ++i)
             
    DEBUG_DATA("%X",modbus_rx.data[i]);
          
    DEBUG_MSG("\r\n\r\n");
       }else{
          
    DEBUG_DATA("<-**Exception %X**->\r\n\r\n"modbus_rx.error);
       }
    }
    void display(char c){
       switch(
    c){
          case 
    '1':
             
    turnOnLED();
             break;
       }
    }
    void main(){
       
    char c;
       
    DEBUG_MSG("\r\nInitializing...");
       
    modbus_init();
       
    DEBUG_MSG("...ready\r\n");
       
          do{
          
    print_menu();
          
    getc(PC);
          
    fprintf(PC,"\r\n");
          
    display(c);
       } while(
    TRUE);
       
    }

    slave

    #include <slave_led_yak.h>
    #fuses HS,NOWDT
    #use delay(clock=4M)
    #use fast_io(d)
    #define MODBUS_TYPE MODBUS_TYPE_SLAVE
    #define MODBUS_SERIAL_TYPE MODBUS_RTU     //use MODBUS_ASCII for ASCII mode
    #define MODBUS_SERIAL_RX_BUFFER_SIZE 64
    #define MODBUS_SERIAL_BAUD 2400
    #define MODBUS_SERIAL_TX_PIN PIN_B1   // Data transmit pin
    #define MODBUS_SERIAL_RX_PIN PIN_B0   // Data receive pin
    #include <modbus.c>
    #define MODBUS_ADDRESS 0x80
    /*This function may come in handy for you since MODBUS uses MSB first.*/
    int8 swap_bits(int8 c)
    {
       return ((
    c&1)?128:0)|((c&2)?64:0)|((c&4)?32:0)|((c&8)?16:0)|((c&16)?8:0)
              |((
    c&32)?4:0)|((c&64)?2:0)|((c&128)?1:0);
    }
    void main()
    {
    //!   char c;
       
       
    set_tris_d(0x00);
       
       
    int8 coils 0x00;
       
    int16 event_count 0;
       
       
    modbus_init();
       
       while(
    TRUE){
          
    output_d(coils);
          while(!
    modbus_kbhit());
          
    delay_us(50);
          
          if((
    modbus_rx.address == MODBUS_ADDRESS) || modbus_rx.address == 0){
             switch(
    modbus_rx.func){
                case 
    FUNC_WRITE_SINGLE_COIL:      //write coil
                       
    if(modbus_rx.data[0] || modbus_rx.data[3] || modbus_rx.data[1] > 8)
                            
    modbus_exception_rsp(MODBUS_ADDRESS,modbus_rx.func,ILLEGAL_DATA_ADDRESS);
                       else if(
    modbus_rx.data[2] != 0xFF && modbus_rx.data[2] != 0x00)
                            
    modbus_exception_rsp(MODBUS_ADDRESS,modbus_rx.func,ILLEGAL_DATA_VALUE);
                       else
                       {
                            
    //coils are stored msb->lsb so we must use 7-address
                            
    if(modbus_rx.data[2] == 0xFF)
                                
    bit_set(coils,modbus_rx.data[1]);
                            else
                                
    bit_clear(coils,modbus_rx.data[1]);
                            
    modbus_write_single_coil_rsp(MODBUS_ADDRESS,modbus_rx.data[1],((int16)(modbus_rx.data[2]))<<8);
                            
    event_count++;
                       }
                       break;
             }
          }
       }
    }

    https://i.hizliresim.com/6f7tzsz.png

    https://i.hizliresim.com/d920p52.png


    Soldaki virtual terminal slavein modbus Tx pinine bağlı. alttaki modbus Rx pinine bağlı. Veri geliyor ama geri dönmüyor ve led de değiştirilmiyor.

     


    ride or die..
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    banneduser
    banneduser's avatar
    Kayıt Tarihi: 15/Nisan/2013
    Erkek

    Olayi çözdüm gibi. RS485 i kaldırınca sorun çözülüyor ama RS485 kullanmam gerekiyor :(


    ride or die..
Toplam Hit: 692 Toplam Mesaj: 2
pic modbus ccs c