user/main.c
branchkernel-2.4
changeset 1762 fd8b9ad48f88
parent 1761 d7ef8607e06f
child 1766 9e4d4306b641
equal deleted inserted replaced
1761:d7ef8607e06f 1762:fd8b9ad48f88
     1 //---------------------------------------------------------------
       
     2 //
       
     3 //  m a i n . c
       
     4 //
       
     5 //  $LastChangedDate$
       
     6 //  $Author$
       
     7 //
       
     8 //---------------------------------------------------------------
       
     9 
       
    10 #include <stdio.h>
       
    11 #include <string.h> // memset()
       
    12 #include <unistd.h> // usleep()
       
    13 #include <signal.h>
       
    14 
       
    15 #include "ec_globals.h"
       
    16 #include "ec_master.h"
       
    17 
       
    18 //---------------------------------------------------------------
       
    19 
       
    20 void signal_handler(int);
       
    21 void write_data(unsigned char *);
       
    22 
       
    23 int continue_running;
       
    24 unsigned short int word;
       
    25 
       
    26 //---------------------------------------------------------------
       
    27 
       
    28 int main(int argc, char **argv)
       
    29 {
       
    30   EtherCAT_master_t master;
       
    31   EtherCAT_command_t *cmd, *cmd2;
       
    32   unsigned char data[256];
       
    33   unsigned int i, number;
       
    34   struct sigaction sa;
       
    35   
       
    36   sa.sa_handler = signal_handler;
       
    37   sigaction(SIGINT, &sa, NULL);
       
    38 
       
    39   printf("CatEther-Testprogramm.\n");
       
    40 
       
    41   EtherCAT_master_init(&master, "eth1");
       
    42 
       
    43   if (EtherCAT_check_slaves(&master, NULL, 0) != 0)
       
    44   {
       
    45     fprintf(stderr, "ERROR while searching for slaves!\n");
       
    46     return -1;
       
    47   }
       
    48 
       
    49   if (master.slave_count == 0)
       
    50   {
       
    51     fprintf(stderr, "ERROR: No slaves found!\n");
       
    52     return -1;
       
    53   }
       
    54 
       
    55   for (i = 0; i < master.slave_count; i++)
       
    56   {
       
    57     printf("Slave found: Type %02X, Revision %02X, Build %04X\n",
       
    58            master.slaves[i].type, master.slaves[i].revision, master.slaves[i].build);
       
    59   }
       
    60 
       
    61   printf("Writing Station addresses.\n");
       
    62 
       
    63   for (i = 0; i < master.slave_count; i++)
       
    64   {
       
    65     data[0] = i & 0x00FF;
       
    66     data[1] = (i & 0xFF00) >> 8;
       
    67 
       
    68     cmd = EtherCAT_position_write(&master, 0 - i, 0x0010, 2, data);
       
    69     
       
    70     EtherCAT_send_receive(&master);
       
    71     
       
    72     if (cmd->working_counter != 1)
       
    73     {
       
    74       fprintf(stderr, "ERROR: Slave did'n repond!\n");
       
    75       return -1;
       
    76     }
       
    77     
       
    78     EtherCAT_remove_command(&master, cmd);
       
    79   }
       
    80 
       
    81   //----------
       
    82 
       
    83   for (i = 0; i < master.slave_count; i++)
       
    84   {
       
    85     printf("\nKlemme %i:\n", i);
       
    86 
       
    87     EtherCAT_read_slave_information(&master, i, 0x0008, &number);
       
    88     printf("Vendor ID: 0x%04X (%i)\n", number, number);
       
    89 
       
    90     EtherCAT_read_slave_information(&master, i, 0x000A, &number);
       
    91     printf("Product Code: 0x%04X (%i)\n", number, number);
       
    92 
       
    93     EtherCAT_read_slave_information(&master, i, 0x000E, &number);
       
    94     printf("Revision Number: 0x%04X (%i)\n", number, number);
       
    95   }
       
    96 
       
    97   //----------
       
    98 
       
    99   printf("\nResetting FMMU's.\n");
       
   100 
       
   101   memset(data, 0x00, 256);
       
   102   cmd = EtherCAT_broadcast_write(&master, 0x0600, 256, data);
       
   103   EtherCAT_send_receive(&master);
       
   104 
       
   105   if (cmd->working_counter != master.slave_count)
       
   106   {
       
   107     fprintf(stderr, "ERROR: Not all slaves responded (%i of %i)!\n",
       
   108             cmd->working_counter, master.slave_count);
       
   109     return -1;
       
   110   }
       
   111 
       
   112   EtherCAT_remove_command(&master, cmd);
       
   113 
       
   114   //----------
       
   115 
       
   116   printf("Resetting Sync Manager channels.\n");
       
   117 
       
   118   memset(data, 0x00, 256);
       
   119   cmd = EtherCAT_broadcast_write(&master, 0x0800, 256, data);
       
   120   EtherCAT_send_receive(&master);
       
   121 
       
   122   if (cmd->working_counter != master.slave_count)
       
   123   {
       
   124     fprintf(stderr, "ERROR: Not all slaves responded (%i of %i)!\n",
       
   125             cmd->working_counter, master.slave_count);
       
   126     return -1;
       
   127   }
       
   128 
       
   129   EtherCAT_remove_command(&master, cmd);
       
   130 
       
   131   //----------
       
   132 
       
   133   printf("Setting INIT state for devices.\n");
       
   134 
       
   135   if (EtherCAT_broadcast_state_change(&master, EC_STATE_INIT) != 0)
       
   136   {
       
   137     fprintf(stderr, "ERROR: Could not set INIT state!\n");
       
   138     return -1;
       
   139   }
       
   140 
       
   141   //----------
       
   142 
       
   143   printf("Setting PREOP state for bus coupler.\n");
       
   144 
       
   145   if (EtherCAT_state_change(&master, &master.slaves[0], EC_STATE_PREOP) != 0)
       
   146   {
       
   147     fprintf(stderr, "ERROR: Could not set state!\n");
       
   148     return -1;
       
   149   }
       
   150 
       
   151   //----------
       
   152 
       
   153   printf("Setting Sync managers 0 and 1 of device 1.\n");
       
   154 
       
   155   data[0] = 0x00;
       
   156   data[1] = 0x18;
       
   157   data[2] = 0xF6;
       
   158   data[3] = 0x00;
       
   159   data[4] = 0x26;
       
   160   data[5] = 0x00;
       
   161   data[6] = 0x01;
       
   162   data[7] = 0x00;
       
   163   cmd = EtherCAT_write(&master, 0x0001, 0x0800, 8, data);
       
   164 
       
   165   data[0] = 0xF6;
       
   166   data[1] = 0x18;
       
   167   data[2] = 0xF6;
       
   168   data[3] = 0x00;
       
   169   data[4] = 0x22;
       
   170   data[5] = 0x00;
       
   171   data[6] = 0x01;
       
   172   data[7] = 0x00;
       
   173   cmd2 = EtherCAT_write(&master, 0x0001, 0x0808, 8, data);
       
   174 
       
   175   EtherCAT_send_receive(&master);
       
   176 
       
   177   if (cmd->working_counter != 1 || cmd2->working_counter != 1)
       
   178   {
       
   179     fprintf(stderr, "ERROR: Not all slaves responded!\n");
       
   180 
       
   181     return -1;
       
   182   }
       
   183 
       
   184   EtherCAT_remove_command(&master, cmd);
       
   185   EtherCAT_remove_command(&master, cmd2);
       
   186 
       
   187 
       
   188   //----------
       
   189 
       
   190   printf("Setting PREOP state for device 1.\n");
       
   191 
       
   192   if (EtherCAT_state_change(&master, &master.slaves[1], EC_STATE_PREOP))
       
   193   {
       
   194     fprintf(stderr, "ERROR: Could not set state!\n");
       
   195     return -1;
       
   196   }
       
   197 
       
   198   //----------
       
   199 
       
   200   printf("Setting PREOP state for device 4.\n");
       
   201 
       
   202   if (EtherCAT_state_change(&master, &master.slaves[4], EC_STATE_PREOP))
       
   203   {
       
   204     fprintf(stderr, "ERROR: Could not set state!\n");
       
   205     return -1;
       
   206   }
       
   207 
       
   208   //----------
       
   209 
       
   210 #if 1
       
   211   printf("Setting FMMU 0 of device 1.\n");
       
   212 
       
   213   data[0] = 0x00; // Logical start address [4]
       
   214   data[1] = 0x00;
       
   215   data[2] = 0x00;
       
   216   data[3] = 0x00;
       
   217   data[4] = 0x04; // Length [2]
       
   218   data[5] = 0x00;
       
   219   data[6] = 0x00; // Start bit
       
   220   data[7] = 0x07; // End bit
       
   221   data[8] = 0x00; // Physical start address [2]
       
   222   data[9] = 0x10;
       
   223   data[10] = 0x00; // Physical start bit
       
   224   data[11] = 0x02; // Read/write enable
       
   225   data[12] = 0x01; // channel enable [2]
       
   226   data[13] = 0x00;
       
   227   data[14] = 0x00; // Reserved [2]
       
   228   data[15] = 0x00;
       
   229   cmd = EtherCAT_write(&master, 0x0001, 0x0600, 16, data);
       
   230   EtherCAT_send_receive(&master);
       
   231 
       
   232   if (cmd->working_counter != 1)
       
   233   {
       
   234     fprintf(stderr, "ERROR: Not all slaves responded (%i of 1)!\n",
       
   235             cmd->working_counter);
       
   236     return -1;
       
   237   }
       
   238 
       
   239   EtherCAT_remove_command(&master, cmd);
       
   240 #endif
       
   241 
       
   242   //----------
       
   243 
       
   244 #if 1
       
   245   printf("Setting FMMU 0 of device 4.\n");
       
   246 
       
   247   data[0] = 0x04; // Logical start address [4]
       
   248   data[1] = 0x00;
       
   249   data[2] = 0x00;
       
   250   data[3] = 0x00;
       
   251   data[4] = 0x01; // Length [2]
       
   252   data[5] = 0x00;
       
   253   data[6] = 0x00; // Start bit
       
   254   data[7] = 0x07; // End bit
       
   255   data[8] = 0x00; // Physical start address [2]
       
   256   data[9] = 0x0F;
       
   257   data[10] = 0x00; // Physical start bit
       
   258   data[11] = 0x02; // Read/write enable
       
   259   data[12] = 0x01; // channel enable [2]
       
   260   data[13] = 0x00;
       
   261   data[14] = 0x00; // Reserved [2]
       
   262   data[15] = 0x00;
       
   263   cmd = EtherCAT_write(&master, 0x0004, 0x0600, 16, data);
       
   264   EtherCAT_send_receive(&master);
       
   265 
       
   266   if (cmd->working_counter != 1)
       
   267   {
       
   268     fprintf(stderr, "ERROR: Not all slaves responded (%i of 1)!\n",
       
   269             cmd->working_counter);
       
   270     return -1;
       
   271   }
       
   272 
       
   273   EtherCAT_remove_command(&master, cmd);
       
   274 #endif
       
   275 
       
   276   //----------
       
   277 
       
   278   printf("Setting Sync manager 2 of device 1.\n");
       
   279 
       
   280   data[0] = 0x00;
       
   281   data[1] = 0x10;
       
   282   data[2] = 0x04;
       
   283   data[3] = 0x00;
       
   284   data[4] = 0x24;
       
   285   data[5] = 0x00;
       
   286   data[6] = 0x01;
       
   287   data[7] = 0x00;
       
   288   cmd = EtherCAT_write(&master, 0x0001, 0x0810, 8, data);
       
   289   EtherCAT_send_receive(&master);
       
   290 
       
   291   if (cmd->working_counter != 1)
       
   292   {
       
   293     fprintf(stderr, "ERROR: Not all slaves responded (%i of 1)!\n", cmd->working_counter);
       
   294     return -1;
       
   295   }
       
   296 
       
   297   EtherCAT_remove_command(&master, cmd);
       
   298 
       
   299   //----------
       
   300 
       
   301   printf("Setting Sync manager 0 for device 4.\n");
       
   302 
       
   303   data[0] = 0x00;
       
   304   data[1] = 0x0F;
       
   305   data[2] = 0x01;
       
   306   data[3] = 0x00;
       
   307   data[4] = 0x46; // 46
       
   308   data[5] = 0x00;
       
   309   data[6] = 0x01;
       
   310   data[7] = 0x00;
       
   311   cmd = EtherCAT_write(&master, 0x0004, 0x0800, 8, data);
       
   312 
       
   313   EtherCAT_send_receive(&master);
       
   314 
       
   315   if (cmd->working_counter != 1)
       
   316   {
       
   317     fprintf(stderr, "ERROR: Not all slaves responded!\n");
       
   318 
       
   319     return -1;
       
   320   }
       
   321 
       
   322   EtherCAT_remove_command(&master, cmd);
       
   323 
       
   324   //----------
       
   325 
       
   326   printf("Setting SAVEOP state for bus coupler.\n");
       
   327 
       
   328   if (EtherCAT_state_change(&master, 0x0000, EC_STATE_SAVEOP) != 0)
       
   329   {
       
   330     fprintf(stderr, "ERROR: Could not set state!\n");
       
   331     return -1;
       
   332   }
       
   333 
       
   334   //----------
       
   335 
       
   336   printf("Setting SAVEOP state for device 1.\n");
       
   337 
       
   338   if (EtherCAT_state_change(&master, &master.slaves[1], EC_STATE_SAVEOP) != 0)
       
   339   {
       
   340     fprintf(stderr, "ERROR: Could not set state!\n");
       
   341     return -1;
       
   342   }
       
   343 
       
   344   //----------
       
   345 
       
   346   printf("Setting SAVEOP state for device 4.\n");
       
   347 
       
   348   if (EtherCAT_state_change(&master, &master.slaves[4], EC_STATE_SAVEOP) != 0)
       
   349   {
       
   350     fprintf(stderr, "ERROR: Could not set state!\n");
       
   351     return -1;
       
   352   }
       
   353 
       
   354   //----------
       
   355 
       
   356   printf("Setting OP state for bus coupler.\n");
       
   357 
       
   358   if (EtherCAT_state_change(&master, &master.slaves[0], EC_STATE_OP) != 0)
       
   359   {
       
   360     fprintf(stderr, "ERROR: Could not set state!\n");
       
   361     return -1;
       
   362   }
       
   363 
       
   364   //----------
       
   365 
       
   366   printf("Setting OP state for device 1.\n");
       
   367 
       
   368   if (EtherCAT_state_change(&master, &master.slaves[1], EC_STATE_OP) != 0)
       
   369   {
       
   370     fprintf(stderr, "ERROR: Could not set state!\n");
       
   371     return -1;
       
   372   }
       
   373 
       
   374   //----------
       
   375 
       
   376   printf("Setting OP state for device 4.\n");
       
   377 
       
   378   if (EtherCAT_state_change(&master, &master.slaves[4], EC_STATE_OP) != 0)
       
   379   {
       
   380     fprintf(stderr, "ERROR: Could not set state!\n");
       
   381     return -1;
       
   382   }
       
   383 
       
   384   //----------
       
   385 
       
   386   word = 0;
       
   387 
       
   388   printf("Starting thread...\n");
       
   389 
       
   390   if (EtherCAT_start(&master, 5, write_data, NULL, 10000) != 0)
       
   391   {
       
   392     return -1;
       
   393   }
       
   394 
       
   395   continue_running = 1;
       
   396 
       
   397   while (continue_running)
       
   398   {
       
   399     usleep(200000);
       
   400 
       
   401     word += 1000;
       
   402     word = word & 0x7FFF;
       
   403   }
       
   404 
       
   405   //----------
       
   406 
       
   407   printf("Stopping master thread...\n");
       
   408   EtherCAT_stop(&master);
       
   409 
       
   410   EtherCAT_master_clear(&master);
       
   411 
       
   412   printf("Finished.\n");
       
   413   
       
   414   return 0;
       
   415 }
       
   416 
       
   417 //---------------------------------------------------------------
       
   418 
       
   419 void write_data(unsigned char *data)
       
   420 {
       
   421   data[0] = word & 0xFF;
       
   422   data[1] = (word & 0xFF00) >> 8;
       
   423   data[2] = word & 0xFF;
       
   424   data[3] = (word & 0xFF00) >> 8;
       
   425 
       
   426   data[4] = 0x01;
       
   427 }
       
   428 
       
   429 //---------------------------------------------------------------
       
   430 
       
   431 void signal_handler(int signum)
       
   432 {
       
   433   if (signum == SIGINT || signum == SIGTERM)
       
   434   {
       
   435     continue_running = 0;
       
   436   }
       
   437 }
       
   438 
       
   439 //---------------------------------------------------------------