#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" 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); } void ReceiveCommandModbus3(RS_DATA *rs_arr) { unsigned int crc, Address_MB, Length_MB, i, value, saved = 0; // получили начальный адрес чтениа 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) || (Address_MB >= UMP_LOG_BASE && Address_MB <= UMP_LOG_BASE+15 && Length_MB <= UMP_LOG_BASE+16-Address_MB) || (Address_MB >= UMP_LOG_DATA && Address_MB < UMP_LOG_DATA+120 && Length_MB <= UMP_LOG_DATA+120-Address_MB) || (Address_MB == UMP_LOG_LIVE && Length_MB == 124))) { 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 идёт уже * с разрешёнными прерываниями и не задерживает измерение/управление. */ if (Address_MB >= UMP_LOG_BASE) saved = __disable_interrupts(); for (i=0;i= UMP_LOG_BASE ? ump_log_read(Address_MB+i) : modbus[Address_MB+i]; rs_arr->buffer[3+i*2] = (value >> 8) & 0xFF; rs_arr->buffer[3+i*2+1] = value & 0xFF; } if (Address_MB >= UMP_LOG_BASE) __restore_interrupts(saved); 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+(Address_MB >= UMP_LOG_BASE ? 5 : 8)); return; } void ReceiveCommandModbus6(RS_DATA *rs_arr) { unsigned int Address_MB, Data_MB, i; ///////////////////////////////////////////////// // Отсылка /* Отправлаем назад то же самое */ 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 >= UMP_LOG_BASE) { if (!ump_log_write(Address_MB, Data_MB)) { modbus_exception(rs_arr, CMD_MODBUS_6, 3); return; } } else 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, Address_MB >= UMP_LOG_BASE ? 8 : 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; } }