123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include <ctype.h>
- #include <string.h>
- #include "fins.h"
- /*
- * int finslib_cpu_unit_data_read( fins_sys_tp *sys, fins_cpudata_tp *cpudata );
- *
- *从远程PLC请求CPU单元数据。
- *该函数返回FINS_RETVAL _...列表中的成功或错误代码。
- */
- int finslib_cpu_unit_data_read(struct fins_sys_tp *sys, struct fins_cpudata_tp *cpudata) {
- int a;
- int retval;
- size_t bodylen;
- struct fins_command_tp fins_cmnd;
- if (sys == NULL) return FINS_RETVAL_NOT_INITIALIZED;
- if (cpudata == NULL) return FINS_RETVAL_NO_DATA_BLOCK;
- if (sys->sockfd == INVALID_SOCKET) return FINS_RETVAL_NOT_CONNECTED;
- XX_finslib_init_command(sys, &fins_cmnd, 0x05, 0x01);
- bodylen = 0;
- if ((retval = XX_finslib_communicate(sys, &fins_cmnd, &bodylen)) != FINS_RETVAL_SUCCESS) return retval;
- if (bodylen != 160) return FINS_RETVAL_BODY_TOO_SHORT;
- memcpy(cpudata->model, &fins_cmnd.body[2], 20);
- cpudata->model[20] = 0;
- a = 20;
- while (a > 0 && isspace(cpudata->model[a - 1])) a--;
- cpudata->model[a] = 0;
- memcpy(cpudata->version, &fins_cmnd.body[22], 20);
- cpudata->version[20] = 0;
- a = 20;
- while (a > 0 && isspace(cpudata->version[a - 1])) a--;
- cpudata->version[a] = 0;
- memcpy(sys->model, cpudata->model, 21);
- memcpy(sys->version, cpudata->version, 21);
- if (cpudata->model[0] == 'C' && cpudata->model[1] == 'P') sys->plc_mode = FINS_MODE_CS;
- else if (cpudata->model[0] == 'C' && cpudata->model[1] == 'S') sys->plc_mode = FINS_MODE_CS;
- else if (cpudata->model[0] == 'C' && cpudata->model[1] == 'J') sys->plc_mode = FINS_MODE_CS;
- else if (cpudata->model[0] == 'C' && cpudata->model[1] == 'V') sys->plc_mode = FINS_MODE_CV;
- else sys->plc_mode = FINS_MODE_UNKNOWN;
- memcpy(cpudata->system_block, &fins_cmnd.body[42], 40);
- cpudata->dip_switch[0] = fins_cmnd.body[42] & 0x01;
- cpudata->dip_switch[1] = fins_cmnd.body[42] & 0x02;
- cpudata->dip_switch[2] = fins_cmnd.body[42] & 0x04;
- cpudata->dip_switch[3] = fins_cmnd.body[42] & 0x08;
- cpudata->dip_switch[4] = fins_cmnd.body[42] & 0x10;
- cpudata->dip_switch[5] = fins_cmnd.body[42] & 0x20;
- cpudata->dip_switch[6] = fins_cmnd.body[42] & 0x40;
- cpudata->dip_switch[7] = fins_cmnd.body[42] & 0x80;
- cpudata->largest_em_bank = fins_cmnd.body[43];
- cpudata->program_area_size = fins_cmnd.body[82];
- cpudata->program_area_size <<= 8;
- cpudata->program_area_size += fins_cmnd.body[83];
- cpudata->iom_size = fins_cmnd.body[84];
- cpudata->number_of_dm_words = fins_cmnd.body[85];
- cpudata->number_of_dm_words <<= 8;
- cpudata->number_of_dm_words += fins_cmnd.body[86];
- cpudata->timer_counter_size = fins_cmnd.body[87];
- cpudata->em_non_file_memory_size = fins_cmnd.body[88];
- cpudata->memory_card_type = fins_cmnd.body[91];
- cpudata->memory_card_size = fins_cmnd.body[92];
- cpudata->memory_card_size <<= 8;
- cpudata->memory_card_size += fins_cmnd.body[93];
- cpudata->num_sysmac_bus_masters = fins_cmnd.body[158];
- cpudata->num_racks = fins_cmnd.body[159] & 0x0f;
- for (a = 0; a<16; a++) {
- cpudata->bus_unit_id[a] = fins_cmnd.body[94 + 2 * a] & 0x7f;
- cpudata->bus_unit_id[a] <<= 8;
- cpudata->bus_unit_id[a] += fins_cmnd.body[95 + 2 * a];
- cpudata->bus_unit_present[a] = fins_cmnd.body[94 + 2 * a] & 0x80;
- }
- return FINS_RETVAL_SUCCESS;
- } /* finslib_cpu_unit_data_read */
|