MODBUS - CCS C Kütüphanesi - Exception 0C

Başlatan delilcodes, 11 Mayıs 2021, 23:07:50

delilcodes

Merhabalar 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
 


Döküman;

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



delilcodes


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=0; i<(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();
      c = 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.