modbus tcp/ip which socket

Başlatan salamon, 11 Nisan 2017, 13:25:02

salamon

Arkadaşlar Merhabalar,

Modbus Tcp haberleşmesi ile ilgili takıldığım bir nokta var. Yardımlarınızı bekliyorum. Şöyleki:

CCS C programı ile derleme yaparken Mbap header bölümündeki whichsocket için hangi değeri vermem gerekiyor? 502 portundan haberleşen modbus için 1024den büyük bir soket değeri istiyor. ancak bir byte değer girilebiliyor.

typedef struct _MBAP_HEADER {
   unsigned int16 TransactionIdentifier;     //Transaction Identifier of message
   unsigned int16 ProtocolIdentifier;        //Protocol Identifer of message Modbus Protocol = 0
   unsigned int16 Length;                    //Number of bytes in message including Unit Identifier
   unsigned int8  UnitIdentifier;            //Unit Identifier of message
   unsigned int8  WhichSocket;               //Not part of MBAP Header, added to determine which socket the server is to send response to
} MBAP_HEADER;

coskunyildirim06

#1
Bende CCS C de bu konu ile  ilgileniyorum.Veri iletişimi için modbus slave deki gibi  modbus tcp server uygulamasını haberleştirmeye çalışıyorum.Ancak her şeyi denememe rağmen bir iletişim kuramadım.Proteus da virtual networku etkinleştirdim ve ENC28j60 kullanarak ping atabiliyorum.
Örnek kod aşağıda;

#include <modbus_tcp.h>
#define MODBUS_PROTOCOL MODBUS_PROTOCOL_TCPIP
#define MODBUS_TYPE MODBUS_TYPE_SERVER
#define MODBUS_SERVER_LISTEN_PORT 502
#define MODBUS_LISTEN_SOCKETS 5
#define MODBUS_BUFFER_SIZE 64
#define MODBUS_SERVER_TIMEOUT 5
 

//#define MODBUS_OUR_ADDRESS 1
#include "modbus.c"
#fuses nowdt,nolvp,nodebug,noprotect,hs

     

/* TODO: Web server enabled. Server files are added to the /pages
directory. You can modify the contents of the dynamic display fields
at the end of the index.htm file. By default, headings are in the left
column and the dynamic display elements are in the right. The text on
the input buttons can be set by changing the 'value' strings in the
form section. Dynamic display elements can be added or removed from
index.htm and index.xml */
/* TODO: Server files must be built into an MPFS image prior to
compiling and runing the web server. Running makempfsimg.bat in the
/mpfs directory will create an MPFS image of the files in /pages.
A new MPFS image has to be compiled and re-loaded if a file in
/pages needs to be changed. */

unsigned int8 http_format_char(char* file, char id, char *str, unsigned int8 max_ret)
{
   /* TODO: This is a callback function to the HTTP stack.
   'id' is the char for the dynamic element to be updated.
   For each dynamic element you create, you need to parse
   and save a result to 'str'. *str is where the callback
   function must save the formatting result, and it should
   not store more than max_ret characters to this pointer
   (buffer-overrun protection).
   Example:
   switch(id) {
      case 0x00:
         set_adc_channel(0);
         delay_us(100);
         i=read_adc();
         sprintf(new_str,"0x%X", i);
   .....
   strncpy(str, new_str, max_ret);
   */
   if (id == 0)
   {
         //TODO: Handle dyn0 field and save result to str
   }
   if (id == 1)
   {
         //TODO: Handle dyn1 field and save result to str
   }
   if (id == 2)
   {
         //TODO: Handle dyn2 field and save result to str
   }

}

void http_exec_cgi(char* file, char *key, char *val)
{
   /* TODO: This is a callback function to the HTTP stack.
   This function is called with each key/value pair read in
   the GET/POST request before any web data is sent to the
   web browser. 'key' matches the name of the field and
   'val' is the value it was changed to.
   Example:
   int8 v = atoi(val);
   if (stricmp(key,led1_key)==0)
      LedSet(0, v);
   */
   if (strcmp(key, "button00") == 0)
   {
         
   }
   if (strcmp(key, "button01") == 0)
   {
         //TODO: Handle button01
   }
   if (strcmp(key, "button02") == 0)
   {
         //TODO: Handle button02
   }

}

void IPAddressInit(void)
{
   //MAC address of this unit
   MY_MAC_BYTE1=MY_DEFAULT_MAC_BYTE1;
   MY_MAC_BYTE2=MY_DEFAULT_MAC_BYTE2;
   MY_MAC_BYTE3=MY_DEFAULT_MAC_BYTE3;
   MY_MAC_BYTE4=MY_DEFAULT_MAC_BYTE4;
   MY_MAC_BYTE5=MY_DEFAULT_MAC_BYTE5;
   MY_MAC_BYTE6=MY_DEFAULT_MAC_BYTE6;

   //IP address of this unit
   MY_IP_BYTE1=MY_DEFAULT_IP_ADDR_BYTE1;
   MY_IP_BYTE2=MY_DEFAULT_IP_ADDR_BYTE2;
   MY_IP_BYTE3=MY_DEFAULT_IP_ADDR_BYTE3;
   MY_IP_BYTE4=MY_DEFAULT_IP_ADDR_BYTE4;

   //network gateway
   MY_GATE_BYTE1=MY_DEFAULT_GATE_BYTE1;
   MY_GATE_BYTE2=MY_DEFAULT_GATE_BYTE2;
   MY_GATE_BYTE3=MY_DEFAULT_GATE_BYTE3;
   MY_GATE_BYTE4=MY_DEFAULT_GATE_BYTE4;

   //subnet mask
   MY_MASK_BYTE1=MY_DEFAULT_MASK_BYTE1;
   MY_MASK_BYTE2=MY_DEFAULT_MASK_BYTE2;
   MY_MASK_BYTE3=MY_DEFAULT_MASK_BYTE3;
   MY_MASK_BYTE4=MY_DEFAULT_MASK_BYTE4;
}


void modbus_ayarlari()
{
     MBAP_HEADER mbap2;
     mbap2.TransactionIdentifier=0X01;
     mbap2.ProtocolIdentifier=0X00;
     mbap2.Length=0X06;
     mbap2.UnitIdentifier=0X01;
     mbap2.WhichSocket=MODBUS_LISTEN_SOCKETS;
 

   if(modbus_kbhit())
   {
   
  if(modbus_rx[0].func==FUNC_READ_HOLDING_REGISTERS)
      {
        modbus_read_holding_registers_rsp(mbap2,(modbus_rx[0].data[3]*2),hold_regs + modbus_rx[0].data[1]);   
      }
   
     
   // modbus_read_holding_registers_rsp(mbap2,1,hold_regs);
   
         
       // modbus_write_single_register_rsp(mbap2,0,hold_regs[0]); //slave adres , register adres, register değişken

   }
   
}

     

void main()
{

   IPAddressInit();
   TickInit();
   enable_interrupts(GLOBAL);
   StackInit();
   modbus_init();
   
 


   while(TRUE)
   {
     
      StackTask();
      enable_interrupts(GLOBAL);
      StackApplications();
      ModbusTask();
      modbus_ayarlari();
   

      //TODO: User Code
   }

}

coskunyildirim06

Bu arada eksik yazdım Win Tr nin SCadası ile bağlantı kurmaya çalışıyorum sanal olarak ağ bağlantısı oluşturdum proteusda

Powered by EzPortal