#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "package.h" #include "RS485.h" #include "crc16.h" #include "cntrl_adr.h" #include "bios_dsp.h" #include "message.h" #include "filter_bat2.h" #include "measure.h" #include "ADC.h" #include "peripher.h" #include "ecan.h" #include "pulto.h" #include "spise2p.h" #include "caliber.h" #include "log_to_mem.h" #include "../../../../templates/c/set-protocol/ports/tms320f28335/ump_tms28335.h" int modbus[ANSWER_LEN+1]; unsigned int param[ANSWER_LEN+1]; void Default_params() { unsigned int i,def; int shkf_lo_edge[] = {300, // 380 300, // 38O 0, // 0 0, // 0 15, // 31 22, // 27 20, // 24 10, // 15 60}; // AD int bright[] = {10,8,6,8,6,8}; for(i=0;iadr_PULT) def--; #else def = Mode-3; if(Mode==adr_SHKF) def=4; #endif for(i=0;i<8;i++) Caliber[i] = def_cal[def][i]; } if(Desk == dsk_COMM) { for(i=0;ibuffer[0] = CNTRL_ADDR; rs_arr->buffer[1] = function | 0x80; rs_arr->buffer[2] = error; crc = get_crc_16(0xFFFF, rs_arr->buffer, 3); rs_arr->buffer[3] = LOBYTE(crc); rs_arr->buffer[4] = HIBYTE(crc); rs_arr->flag_TIMEOUT_to_Send = true; RS_Send(rs_arr, rs_arr->buffer, 5); } /* UART parser has already validated CRC and accepted the device address. */ static int receive_ump(RS_DATA *rs_arr) { unsigned int address, value, saved, length, count, error; uint16_t words[UMP_MAX_WORDS]; address = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; if (address < UMP_BASE) return 0; value = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; saved = __disable_interrupts(); count = ump_tms28335_capture(rs_arr->RS_Header[1], address, value, words, &error); __restore_interrupts(saved); length = ump_rtu_encode(CNTRL_ADDR, rs_arr->RS_Header[1], error, words, count, rs_arr->buffer, MAX_SEND_LENGTH); if (length) { rs_arr->flag_TIMEOUT_to_Send = true; RS_Send(rs_arr, rs_arr->buffer, length); } return 1; } void ReceiveCommandModbus3(RS_DATA *rs_arr) { unsigned int crc, Address_MB, Length_MB, i, value; if (receive_ump(rs_arr)) return; // получили начальный адрес чтениа Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; // получили количество слов данных Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; if (!Length_MB || Length_MB > 125 || !(Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB)) { modbus_exception(rs_arr, CMD_MODBUS_3, 2); return; } ///////////////////////////////////////////////// // Отсылка /* Посчитали контрольную сумму перед самой посылкой */ rs_arr->buffer[0] = CNTRL_ADDR; rs_arr->buffer[1] = CMD_MODBUS_3; rs_arr->buffer[2] = Length_MB*2; /* Защищаем целостность одного снимка/блока; передача UART идёт уже * с разрешёнными прерываниями и не задерживает измерение/управление. */ for (i=0;ibuffer[3+i*2] = (value >> 8) & 0xFF; rs_arr->buffer[3+i*2+1] = value & 0xFF; } crc = 0xffff; crc = get_crc_16(crc, rs_arr->buffer, Length_MB*2+3); rs_arr->buffer[Length_MB*2+3] = LOBYTE(crc); rs_arr->buffer[Length_MB*2+4] = HIBYTE(crc); rs_arr->buffer[Length_MB*2+5] = 0; rs_arr->buffer[Length_MB*2+6] = 0; rs_arr->buffer[Length_MB*2+7] = 0; rs_arr->buffer[Length_MB*2+8] = 0; rs_arr->flag_TIMEOUT_to_Send=true; /* Расширение логгера отвечает точным кадром Modbus без хвостовых * нулей: они иначе попали бы в начало ответа следующего блока GUI. * Исторический формат технологических регистров оставлен прежним. */ RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+8); return; } void ReceiveCommandModbus6(RS_DATA *rs_arr) { unsigned int Address_MB, Data_MB, i; if (receive_ump(rs_arr)) return; ///////////////////////////////////////////////// // Отсылка /* Отправлаем назад то же самое */ for (i=0;i<8;i++) rs_arr->buffer[i] = rs_arr->RS_Header[i]; // получили начальный адрес записи Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; // получили слово данных Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; if (Address_MB < ANSWER_LEN) { Modbus[Address_MB].all = Data_MB; if (Address_MB == 127) ump_log_rs(); } else { modbus_exception(rs_arr, CMD_MODBUS_6, 2); return; } rs_arr->flag_TIMEOUT_to_Send=true; RS_Send(rs_arr, rs_arr->buffer, 10); } void SendCommandModbus4(RS_DATA *rs_arr) { unsigned int crc; ///////////////////////////////////////////////// // Отсылка rs_arr->buffer[0] = 16; rs_arr->buffer[1] = 4; rs_arr->buffer[2] = 0; rs_arr->buffer[3] = 0; rs_arr->buffer[4] = 0; rs_arr->buffer[5] = 48; crc = 0xffff; crc = get_crc_16(crc, rs_arr->buffer, 6); rs_arr->buffer[6] = LOBYTE(crc); rs_arr->buffer[7] = HIBYTE(crc); //rs_arr->buffer[8] = 0; //rs_arr->buffer[9] = 0; //rs_arr->buffer[10] = 0; rs_arr->flag_TIMEOUT_to_Send=true; RS_Send(rs_arr, rs_arr->buffer, 8); } void ReceiveAnswerModbus4(RS_DATA *rs_arr) { unsigned int i; ///////////////////////////////////////////////// // Отсылка for (i=0;i<8;i++) { ext_temp[i] = ( rs_arr->RS_Header[5+i*12] << 8) + rs_arr->RS_Header[6+i*12]; ext_diag[i] = ( rs_arr->RS_Header[7+i*12] | rs_arr->RS_Header[8+i*12] ) != 0; } }