Advertisement
Guest User

Untitled

a guest
Nov 1st, 2022
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <chrono>
  3. #include <thread>
  4. #include <functional>
  5. #include <modbus.h>
  6.  
  7. #define NUM_SLAVES 10
  8. #define NUM_REGISTERS 240
  9.  
  10. modbus_mapping_t* mapping[NUM_SLAVES];
  11. modbus_t* rtusrv;
  12. uint8_t req[MODBUS_RTU_MAX_ADU_LENGTH];// request buffer
  13. int len;// length of the request/response
  14.  
  15.  
  16. void close_connections()
  17. {
  18.     for (int i = 0; i < NUM_SLAVES; i++)
  19.     {
  20.         modbus_mapping_free(mapping[i]);
  21.     }
  22.    
  23.     modbus_close(rtusrv);
  24.     modbus_free(rtusrv);    
  25. }
  26.  
  27. int setup_connections()
  28. {
  29.     for (int i = 0; i < NUM_SLAVES; i++)
  30.     {    
  31.         mapping[i] = modbus_mapping_new(0, 0, NUM_REGISTERS, 0);
  32.         if (!mapping[i]) {
  33.             fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno));
  34.             return -1;
  35.         }
  36.     }
  37.  
  38.     rtusrv = modbus_new_rtu("\COM8", 115200, 'N', 8, 1);
  39.     if (!rtusrv) {
  40.         fprintf(stderr, "Failed to create the context: %s\n", modbus_strerror(errno));
  41.         return -1;
  42.     }
  43.    
  44.     if (modbus_connect(rtusrv) == -1) {
  45.         fprintf(stderr, "Unable to connect: %s\n", modbus_strerror(errno));
  46.         modbus_free(rtusrv);
  47.         return -1;
  48.     }
  49.  
  50.     //set registers of server
  51.     for (int i = 0; i < NUM_SLAVES; i++)
  52.     {
  53.         for (int j = 0; j < NUM_REGISTERS; j++)
  54.         {
  55.             mapping[i]->tab_registers[j] = (i+1)*1000 + (j+1);
  56.         }
  57.     }
  58.     modbus_set_slave(rtusrv, 1);    
  59.     modbus_set_debug(rtusrv,TRUE);
  60.     return 0;
  61. }
  62.  
  63. int main()
  64. {
  65.     //int slaveid = 1;
  66.     printf("Modbus RTU Server\n");  
  67.  
  68.     if (setup_connections()) return -1;  
  69.    
  70.     while (1)
  71.     {  
  72.         len = modbus_receive(rtusrv, req);            
  73.         if (len == -1) break;
  74.         else
  75.         {
  76.             printf("len %d req[0]=%d\n", len, req[0]);
  77.             if (len == 0)
  78.             {  
  79.                 slaveid = req[0];
  80.                 modbus_set_slave(rtusrv, slaveid);
  81.                 len = 8;                
  82.             }
  83.  
  84.             len = modbus_reply(rtusrv, req, len, mapping[slaveid-1]);
  85.             if (len == -1) break;
  86.         }
  87.     }
  88.     printf("Exit the loop: %s\n", modbus_strerror(errno));
  89.  
  90.     close_connections();
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement