finslib_cpu.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <ctype.h>
  2. #include <string.h>
  3. #include "fins.h"
  4. /*
  5. * int finslib_cpu_unit_data_read( fins_sys_tp *sys, fins_cpudata_tp *cpudata );
  6. *
  7. *从远程PLC请求CPU单元数据。
  8. *该函数返回FINS_RETVAL _...列表中的成功或错误代码。
  9. */
  10. int finslib_cpu_unit_data_read(struct fins_sys_tp *sys, struct fins_cpudata_tp *cpudata) {
  11. int a;
  12. int retval;
  13. size_t bodylen;
  14. struct fins_command_tp fins_cmnd;
  15. if (sys == NULL) return FINS_RETVAL_NOT_INITIALIZED;
  16. if (cpudata == NULL) return FINS_RETVAL_NO_DATA_BLOCK;
  17. if (sys->sockfd == INVALID_SOCKET) return FINS_RETVAL_NOT_CONNECTED;
  18. XX_finslib_init_command(sys, &fins_cmnd, 0x05, 0x01);
  19. bodylen = 0;
  20. if ((retval = XX_finslib_communicate(sys, &fins_cmnd, &bodylen)) != FINS_RETVAL_SUCCESS) return retval;
  21. if (bodylen != 160) return FINS_RETVAL_BODY_TOO_SHORT;
  22. memcpy(cpudata->model, &fins_cmnd.body[2], 20);
  23. cpudata->model[20] = 0;
  24. a = 20;
  25. while (a > 0 && isspace(cpudata->model[a - 1])) a--;
  26. cpudata->model[a] = 0;
  27. memcpy(cpudata->version, &fins_cmnd.body[22], 20);
  28. cpudata->version[20] = 0;
  29. a = 20;
  30. while (a > 0 && isspace(cpudata->version[a - 1])) a--;
  31. cpudata->version[a] = 0;
  32. memcpy(sys->model, cpudata->model, 21);
  33. memcpy(sys->version, cpudata->version, 21);
  34. if (cpudata->model[0] == 'C' && cpudata->model[1] == 'P') sys->plc_mode = FINS_MODE_CS;
  35. else if (cpudata->model[0] == 'C' && cpudata->model[1] == 'S') sys->plc_mode = FINS_MODE_CS;
  36. else if (cpudata->model[0] == 'C' && cpudata->model[1] == 'J') sys->plc_mode = FINS_MODE_CS;
  37. else if (cpudata->model[0] == 'C' && cpudata->model[1] == 'V') sys->plc_mode = FINS_MODE_CV;
  38. else sys->plc_mode = FINS_MODE_UNKNOWN;
  39. memcpy(cpudata->system_block, &fins_cmnd.body[42], 40);
  40. cpudata->dip_switch[0] = fins_cmnd.body[42] & 0x01;
  41. cpudata->dip_switch[1] = fins_cmnd.body[42] & 0x02;
  42. cpudata->dip_switch[2] = fins_cmnd.body[42] & 0x04;
  43. cpudata->dip_switch[3] = fins_cmnd.body[42] & 0x08;
  44. cpudata->dip_switch[4] = fins_cmnd.body[42] & 0x10;
  45. cpudata->dip_switch[5] = fins_cmnd.body[42] & 0x20;
  46. cpudata->dip_switch[6] = fins_cmnd.body[42] & 0x40;
  47. cpudata->dip_switch[7] = fins_cmnd.body[42] & 0x80;
  48. cpudata->largest_em_bank = fins_cmnd.body[43];
  49. cpudata->program_area_size = fins_cmnd.body[82];
  50. cpudata->program_area_size <<= 8;
  51. cpudata->program_area_size += fins_cmnd.body[83];
  52. cpudata->iom_size = fins_cmnd.body[84];
  53. cpudata->number_of_dm_words = fins_cmnd.body[85];
  54. cpudata->number_of_dm_words <<= 8;
  55. cpudata->number_of_dm_words += fins_cmnd.body[86];
  56. cpudata->timer_counter_size = fins_cmnd.body[87];
  57. cpudata->em_non_file_memory_size = fins_cmnd.body[88];
  58. cpudata->memory_card_type = fins_cmnd.body[91];
  59. cpudata->memory_card_size = fins_cmnd.body[92];
  60. cpudata->memory_card_size <<= 8;
  61. cpudata->memory_card_size += fins_cmnd.body[93];
  62. cpudata->num_sysmac_bus_masters = fins_cmnd.body[158];
  63. cpudata->num_racks = fins_cmnd.body[159] & 0x0f;
  64. for (a = 0; a<16; a++) {
  65. cpudata->bus_unit_id[a] = fins_cmnd.body[94 + 2 * a] & 0x7f;
  66. cpudata->bus_unit_id[a] <<= 8;
  67. cpudata->bus_unit_id[a] += fins_cmnd.body[95 + 2 * a];
  68. cpudata->bus_unit_present[a] = fins_cmnd.body[94 + 2 * a] & 0x80;
  69. }
  70. return FINS_RETVAL_SUCCESS;
  71. } /* finslib_cpu_unit_data_read */