Добавлен регистратор запуска и отключения УМП для стендовой проверки
Реализованы кольцевая запись CAN-команд, дискретных сигналов, уставок и состояния ЦАП, а также отдельный архив отключения с секундой постинтервала. Добавлено расширение Modbus для онлайн-графиков и чтения архива через SetGUI. Сохранены управляющая логика и существующая область технологических регистров. Добавлены русские комментарии, описание протокола и тест регистратора. Проверка алгоритма и синтаксиса C пройдена; сборка TI/CCS и испытания на плате ещё требуются.
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include "spise2p.h"
|
||||
|
||||
#include "caliber.h"
|
||||
#include "log_to_mem.h"
|
||||
|
||||
int modbus[ANSWER_LEN+1];
|
||||
unsigned int param[ANSWER_LEN+1];
|
||||
@@ -182,15 +183,36 @@ void Save_params()
|
||||
/***************************************************************/
|
||||
/***************************************************************/
|
||||
|
||||
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;
|
||||
unsigned int crc, Address_MB, Length_MB, i, value, saved = 0;
|
||||
|
||||
// ïîëó÷èëè íà÷àëüíûé àäðåñ ÷òåíèà
|
||||
Address_MB =/*(rs_arr->RS_Header[2] << 8) |*/ rs_arr->RS_Header[3];
|
||||
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;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Îòñûëêà
|
||||
@@ -200,12 +222,17 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
|
||||
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++)
|
||||
{
|
||||
rs_arr->buffer[3+i*2 ]=(Modbus[Address_MB+i].byt.byte_hi);
|
||||
rs_arr->buffer[3+i*2+1]=(Modbus[Address_MB+i].byt.byte_lo);
|
||||
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);
|
||||
|
||||
@@ -218,7 +245,10 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
|
||||
rs_arr->buffer[Length_MB*2+8] = 0;
|
||||
|
||||
rs_arr->flag_TIMEOUT_to_Send=true;
|
||||
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+8);
|
||||
/* Ðàñøèðåíèå ëîããåðà îòâå÷àåò òî÷íûì êàäðîì Modbus áåç õâîñòîâûõ
|
||||
* íóëåé: îíè èíà÷å ïîïàëè áû â íà÷àëî îòâåòà ñëåäóþùåãî áëîêà GUI.
|
||||
* Èñòîðè÷åñêèé ôîðìàò òåõíîëîãè÷åñêèõ ðåãèñòðîâ îñòàâëåí ïðåæíèì. */
|
||||
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+(Address_MB >= UMP_LOG_BASE ? 5 : 8));
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -236,15 +266,22 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
|
||||
|
||||
|
||||
// ïîëó÷èëè íà÷àëüíûé àäðåñ çàïèñè
|
||||
Address_MB = (/*(rs_arr->RS_Header[2] << 8) | */rs_arr->RS_Header[3]);
|
||||
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];
|
||||
|
||||
Modbus[Address_MB].all = Data_MB;
|
||||
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, 10);
|
||||
RS_Send(rs_arr, rs_arr->buffer, Address_MB >= UMP_LOG_BASE ? 8 : 10);
|
||||
}
|
||||
|
||||
void SendCommandModbus4(RS_DATA *rs_arr)
|
||||
|
||||
Reference in New Issue
Block a user