Фронты START/STOP обрабатываются при принятии командного слова CAN/RS, а окончание импульса обслуживается таймером. STOP имеет приоритет, перекрытие выходов исключено, сохранена защита от самопуска при включении. Загрузка параметров больше не подменяет живые команды нагрузки. Добавлены подробные русские комментарии во все собственные C-модули и основные заголовки, описание поведения и host-тест автомата. Обновлены файлы прошивки. Полная сборка TI 22.6.1.LTS и тесты пройдены; проверка на физической плате не выполнялась.
304 lines
7.8 KiB
C
304 lines
7.8 KiB
C
/* Ïàðàìåòðû è îáðàáîò÷èêè Modbus ïîñëå ïðîâåðêè CRC. Ìàññèâ modbus
|
|
* ñîäåðæèò îáû÷íûå àäðåñà 0..127, îáëàñòü 0x1000 îáñëóæèâàåò ëîããåð.
|
|
* EEPROM õðàíèò ïàðàìåòðû, íî íå ÿâëÿåòñÿ èñòî÷íèêîì START/STOP:
|
|
* ïðè çàãðóçêå ñîõðàíÿåòñÿ ïîñëåäíÿÿ æèâàÿ êîìàíäà íàãðóçêè.
|
|
* Ôóíêöèè âûçûâàþòñÿ èç main; EEPROM áëîêèðóåò ýòîò êîíòåêñò.
|
|
*/
|
|
#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 "DAC.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;i<ANSWER_LEN;i++)
|
|
{
|
|
/* Êîìàíäà íàãðóçêè íå ÿâëÿåòñÿ ïàðàìåòðîì ïî óìîë÷àíèþ. */
|
|
if (Desk != dsk_LOAD || i != 127) Modbus[i].all = 0;
|
|
}
|
|
|
|
UMP_reset_parameter_commands();
|
|
LastMode = Mode;
|
|
|
|
if(Desk == dsk_EPLT)
|
|
{
|
|
Cancount[m_FAST] = 2; // ïàóçà ìåæäó ïîñûëêàìè CAN
|
|
|
|
for(i=0;i<6;i++) Bright[i] = bright[i];
|
|
}
|
|
else
|
|
{
|
|
Cancount[m_FAST] = 10; // ïàóçà ìåæäó ïîñûëêàìè CAN
|
|
Brightness = 8;
|
|
}
|
|
|
|
Cancount[m_SLOW] = 101; // ïàóçà ìåæäó ïîñûëêàìè CAN
|
|
|
|
if(Kalibro)
|
|
{
|
|
def = Mode-3;
|
|
if(Mode==adr_SHKF) def=4;
|
|
|
|
for(i=0;i<8;i++) Caliber[i] = def_cal[def][i];
|
|
}
|
|
|
|
if(Desk == dsk_COMM)
|
|
{
|
|
for(i=0;i<TPL_POW*2;i++)
|
|
{
|
|
sens_hi_edge[i] = 70;
|
|
sens_lo_edge[i] = 60;
|
|
} }
|
|
|
|
if(Desk==dsk_BKSD)
|
|
{
|
|
for(i=0;i<6;i++)
|
|
{
|
|
sens_hi_edge[i] = 170;
|
|
sens_lo_edge[i] = 150;
|
|
}
|
|
for(i=6;i<8;i++)
|
|
{
|
|
sens_hi_edge[i] = 115;
|
|
sens_lo_edge[i] = 105;
|
|
} }
|
|
|
|
if(Desk==dsk_BKST)
|
|
for(i=0;i<TPL_TRN*2;i++)
|
|
{
|
|
sens_hi_edge[i] = 70;
|
|
sens_lo_edge[i] = 60;
|
|
}
|
|
|
|
if(Mode==adr_SHKF)
|
|
{
|
|
for(i=0;i<15;i++) sens_lo_edge[i] = shkf_lo_edge[sens_type[i]];
|
|
|
|
sens_hi_edge[13] = 70;
|
|
sens_hi_edge[14] = 70;
|
|
}
|
|
|
|
if(Desk==dsk_LOAD)
|
|
{
|
|
sens_hi_edge[0] = 420;
|
|
sens_hi_edge[1] = 420;
|
|
sens_hi_edge[2] = 900;
|
|
sens_hi_edge[3] = 900;
|
|
sens_lo_edge[0] = 300;
|
|
sens_lo_edge[1] = 300;
|
|
sens_lo_edge[2] = 800;
|
|
sens_lo_edge[3] = 800;
|
|
|
|
DAC_20 = Caliber[6];
|
|
DAC_04 = Caliber[7];
|
|
|
|
/* Íå âðåìà!
|
|
DAC_go = 6; // íà÷àëî çàðàäà
|
|
DAC_stop= 15; // êîíåö çàðàäà
|
|
*/
|
|
}
|
|
|
|
if(Kurrent)
|
|
for(i=0;i<4;i++)
|
|
Zero_lev[i] = 0x800;
|
|
|
|
Init_sensors_more();
|
|
}
|
|
|
|
/* CRC è Mode ïðîâåðÿþòñÿ äî ïðèìåíåíèÿ EEPROM. Ñëîâî 127
|
|
* íàãðóçêè íå êîïèðóåòñÿ äàæå âðåìåííî: ISR íå äîëæåí óâèäåòü
|
|
* ñòàðûé START èç EEPROM ëèáî ïîòåðÿòü òåêóùóþ CAN-êîìàíäó.
|
|
*/
|
|
void Load_params()
|
|
{
|
|
unsigned int i,crc;
|
|
|
|
Seeprom_read(0x3FFF-(ANSWER_LEN+1), param, (ANSWER_LEN+1)*2);
|
|
crc = get_crc16(param,ANSWER_LEN);
|
|
if( (crc==param[ANSWER_LEN]) &&
|
|
(crc !=0xFFFF) &&
|
|
(Mode == param[126]))
|
|
{
|
|
/* Íå âîññòàíàâëèâàòü START/STOP èç EEPROM äàæå íà îäèí òèê ISR. */
|
|
for(i=0;i<ANSWER_LEN;i++)
|
|
if (Desk != dsk_LOAD || i != 127) modbus[i] = param[i];
|
|
UMP_reset_parameter_commands();
|
|
}
|
|
else
|
|
{
|
|
Default_params();
|
|
UMP_reset_parameter_commands();
|
|
Save_params();
|
|
if(Desk == dsk_COMM)
|
|
{
|
|
cTermoCal = 1;
|
|
Caliber_time = 0xFFFF;
|
|
} } }
|
|
|
|
/* ISR ïðîäîëæàåò ìåíÿòü èçìåðåíèÿ âî âðåìÿ ñáîðà param. CRC
|
|
* îòíîñèòñÿ ê ñîáðàííîìó ìàññèâó, à íå àòîìàðíîìó ñíèìêó âñåé ïëàòû.
|
|
* Íå âûçûâàòü ñîõðàíåíèå èç êðèòè÷åñêîãî ïóòè äèñêðåòîâ.
|
|
*/
|
|
void Save_params()
|
|
{
|
|
unsigned int i,dif=0;
|
|
|
|
for(i=0;i<ANSWER_LEN;i++)
|
|
if(param[i] != modbus[i])
|
|
{
|
|
param[i] = modbus[i];
|
|
dif=1;
|
|
}
|
|
if(dif)
|
|
{
|
|
param[ANSWER_LEN] = get_crc16(param,ANSWER_LEN);
|
|
Seeprom_write(0x3FFF-(ANSWER_LEN+1),param,(ANSWER_LEN+1)*2);
|
|
} }
|
|
|
|
/***************************************************************/
|
|
/***************************************************************/
|
|
/* Ïåðåäà÷à äàííûõ ïî ïðîòîêîëó ModBus - êîìàíäà 3
|
|
×òåíèå à÷ååê äàííûõ */
|
|
/***************************************************************/
|
|
/***************************************************************/
|
|
|
|
static void modbus_exception(RS_DATA *rs_arr, unsigned int function, unsigned int error)
|
|
{
|
|
unsigned int crc;
|
|
rs_arr->buffer[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<Length_MB;i++)
|
|
{
|
|
value = Address_MB >= 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) {
|
|
/* RS è CAN èñïîëüçóþò îäíó èñòîðèþ ôðîíòîâ. ×åðåäîâàíèå êàíàëîâ
|
|
* íå ñîçäà¸ò äâóõ íåçàâèñèìûõ ïîâòîðíûõ çàïóñêîâ. */
|
|
if (Address_MB == 127) {
|
|
UMP_commands_write(Data_MB);
|
|
ump_log_rs();
|
|
} else Modbus[Address_MB].all = Data_MB;
|
|
} 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);
|
|
}
|
|
|