matlab_23550/Inu/Src/N12_Xilinx/RS_modbus_svu.c
Razvalyaev 7e0063eee0 #3 Скомпилилось, но пока ничего не вызывается
Все основные файлы подтянуты без изменений

Изменены (только папка main_matlab):
- заглушки для ненужных функций (main_matlab.c)
- iq библиотека (IQmathLib_matlab.c)
- библиотеки DSP281x
2025-01-13 11:09:58 +03:00

329 lines
9.3 KiB
C

#include "RS_modbus_svu.h"
#include <message2.h>
#include <message2test.h>
#include "modbus_table_v2.h"
#include "options_table.h"
#include "DSP281x_Device.h"
#include "CRC_Functions.h"
#include "MemoryFunctions.h"
#include "RS_Functions.h"
int err_modbus3 = 1;
int err_modbus16 = 1;
int cmd_3_or_16 = 0;
int err_send_log_16 = 0; //Switch between command 3 and 16
unsigned int flag_send_answer_rs = 0; //This flag enables fast answer to SVU when values changed
unsigned int adr_read_from_modbus3 = 0;
unsigned int flag_received_first_mess_from_MPU = 0;
void ReceiveCommandModbus3(RS_DATA_STRUCT *RS232_Arr)
{
// Êîíòðîëüíày ñóììà
unsigned int crc, Address_MB, Length_MB, i/*, Data*/;
// int buf_out[200];
/* ïîëó÷èëè íà÷àëüíûé àäðåñ ÷òåíèy. */
Address_MB =(RS232_Arr->RS_Header[2] << 8) | RS232_Arr->RS_Header[3];
/* ïîëó÷èëè êîëè÷åñòâî ñëîâ äàííûõ */
Length_MB = (RS232_Arr->RS_Header[4] << 8 ) | RS232_Arr->RS_Header[5];
/////////////////////////////////////////////////
// Îòñûëêà
/* Ïîñ÷èòàëè êîíòðîëüíóþ ñóììó ïåðåä ñàìîé ïîñûëêîé */
// f.RScount = SECOND*3;
RS232_Arr->buffer[0] = RS232_Arr->addr_recive; //CNTRL_ADDR;
RS232_Arr->buffer[1] = CMD_RS232_MODBUS_3;
RS232_Arr->buffer[2] = Length_MB*2;
for (i=0;i<Length_MB;i++)
{
if (Address_MB>=ADR_MODBUS_TABLE && Address_MB<0xe00)
{
RS232_Arr->buffer[3+i*2 ]=modbus_table_rs_out[Address_MB-ADR_MODBUS_TABLE+i].byte.HB;
RS232_Arr->buffer[3+i*2+1]=modbus_table_rs_out[Address_MB-ADR_MODBUS_TABLE+i].byte.LB;
}
if (Address_MB>=0xe00 && Address_MB<0xf00)
{
RS232_Arr->buffer[3+i*2 ]=options_controller[Address_MB-0xe00+i].byte.HB;
RS232_Arr->buffer[3+i*2+1]=options_controller[Address_MB-0xe00+i].byte.LB;
}
}
crc = 0xffff;
crc = GetCRC16_IBM(crc, RS232_Arr->buffer, Length_MB*2+3);
RS232_Arr->buffer[Length_MB*2+3] = LOBYTE(crc);
RS232_Arr->buffer[Length_MB*2+4] = HIBYTE(crc);
RS232_Arr->buffer[Length_MB*2+5] = 0;
RS232_Arr->buffer[Length_MB*2+6] = 0;
RS_Send(RS232_Arr,RS232_Arr->buffer, Length_MB*2+7);
return;
}
/***************************************************************/
/***************************************************************/
/* Çàïðîñ äàííûõ ïî ïðîòîêîëó ModBus - êîìàíäà 3
×òåíèå ß÷ååê äàííûõ */
/***************************************************************/
/***************************************************************/
void SendCommandModbus3(RS_DATA_STRUCT *rs_arr, int adr_contr, unsigned int adr_start,unsigned int count_word)
{
// Êîíòðîëüíàß ñóììà
unsigned int crc; //, Address_MB, Length_MB, i, Data;
// int buf_out[200];
// int buf_in[200];
// rs_arr->buffer[0]=
rs_arr->buffer[0] = LOBYTE(adr_contr);
rs_arr->buffer[1] = CMD_RS232_MODBUS_3;
rs_arr->buffer[2] = HIBYTE(adr_start);
rs_arr->buffer[3] = LOBYTE(adr_start);
rs_arr->buffer[4] = 0;
rs_arr->buffer[5] = LOBYTE(count_word);
crc = 0xffff;
crc = GetCRC16_IBM( crc, rs_arr->buffer, 6);
// crc = get_crc_ccitt( 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_Send(rs_arr,rs_arr->buffer, 11);
/* æäåì îòâåòà */
if (adr_contr>0 && adr_contr<0xff)
{
RS_Len[CMD_RS232_MODBUS_3]=5+count_word*2;
adr_read_from_modbus3=adr_start;
RS_SetControllerLeading(rs_arr,true);
RS_SetAdrAnswerController(rs_arr,adr_contr);
}
return;
}
void ReceiveCommandModbus16(RS_DATA_STRUCT *RS232_Arr)
{
// Êîíòðîëüíày ñóììà
unsigned int crc, Address_MB, Length_MB, Bytecnt_MB, i/*, Data1,Data2,Quantity*/;
int /*Data,*/i1,i2;
/* ïîëó÷èëè íà÷àëüíûé àäðåñ ÷òåíèy. */
Address_MB = RS232_Arr->RS_Header[3] | ( RS232_Arr->RS_Header[2] << 8);
/* ïîëó÷èëè quantity. */
//Quantity = RS232_Arr->RS_Header[5] | ( RS232_Arr->RS_Header[4] << 8);
/* ïîëó÷èëè êîëè÷åñòâî áàéò äàííûõ */
// Length_MB = (RS232_Arr->RS_Header[4] << 8 ) | RS232_Arr->RS_Header[5];
Bytecnt_MB = RS232_Arr->RS_Header[6];
Length_MB = Bytecnt_MB>>1;
for (i=0;i<Length_MB;i++)
{
if (Address_MB>=ADR_MODBUS_TABLE && Address_MB<0xe00)
{
RS232_Arr->buffer[3+i*2 ]=modbus_table_rs_out[Address_MB-ADR_MODBUS_TABLE+i].byte.HB;
RS232_Arr->buffer[3+i*2+1]=modbus_table_rs_out[Address_MB-ADR_MODBUS_TABLE+i].byte.LB;
}
if (Address_MB>=0xe00 && Address_MB<0xf00)
{
options_controller[Address_MB-0xe00+i].byte.HB=RS232_Arr->RS_Header[7+i*2 ];
options_controller[Address_MB-0xe00+i].byte.LB=RS232_Arr->RS_Header[7+i*2+1];
}
}
if (Address_MB>=0xe00 && Address_MB<0xf00)
{
i1 = options_controller[0].all;
i2 = options_controller[1].all;
store_data_flash(options_controller,sizeof(options_controller));
SetCntrlAddr(i1, i2); /* Óñòàíîâêà àäðåñà êîíòðîëëåðà */
}
/////////////////////////////////////////////////
// Îòñûëêà
// Ïîñ÷èòàëè êîíòðîëüíóþ ñóììó ïåðåä ñàìîé ïîñûëêîé
RS232_Arr->buffer[0] = RS232_Arr->addr_recive;
RS232_Arr->buffer[1] = CMD_RS232_MODBUS_16;
RS232_Arr->buffer[2] = HIBYTE(Address_MB);
RS232_Arr->buffer[3] = LOBYTE(Address_MB);
RS232_Arr->buffer[4] = 0;
RS232_Arr->buffer[5] = 2;
crc = 0xffff;
crc = GetCRC16_IBM( crc, RS232_Arr->buffer, 6);
RS232_Arr->buffer[6] = LOBYTE(crc);
RS232_Arr->buffer[7] = HIBYTE(crc);
RS232_Arr->buffer[8] = 0;
RS232_Arr->buffer[9] = 0;
RS_Send(RS232_Arr,RS232_Arr->buffer, 10);
return;
}
/***************************************************************/
/***************************************************************/
/***************************************************************/
/* Ïåðåäà÷à äàííûõ ïî ïðîòîêîëó ModBus - êîìàíäà 16
Ïåðåäà÷à äàííûõ */
/***************************************************************/
/***************************************************************/
/***************************************************************/
void SendCommandModbus16(RS_DATA_STRUCT *rs_arr,int adr_contr, unsigned int adr_start,unsigned int count_word)
{
// Êîíòðîëüíàß ñóììà
unsigned int crc, Address_MB, i; //, Length_MB; //, Bytecnt_MB, Data1,Data2;
// int Data, digital, ust_I, ust_Time;
//Length_MB = count_word;
Address_MB = adr_start;
// Îòñûëêà
// Ïîñ÷èòàëè êîíòðîëüíóþ ñóììó ïåðåä ñàìîé ïîñûëêîé
rs_arr->buffer[0] = adr_contr;
rs_arr->buffer[1] = CMD_RS232_MODBUS_16;
rs_arr->buffer[2] = HIBYTE(adr_start);
rs_arr->buffer[3] = LOBYTE(adr_start);
rs_arr->buffer[4] = HIBYTE(count_word);
rs_arr->buffer[5] = LOBYTE(count_word);
rs_arr->buffer[6] = LOBYTE(count_word*2);
for (i=0;i<count_word;i++)
{
rs_arr->buffer[7+i*2 ]=modbus_table_rs_out[Address_MB-ADR_MODBUS_TABLE+i].byte.HB;
rs_arr->buffer[7+i*2+1]=modbus_table_rs_out[Address_MB-ADR_MODBUS_TABLE+i].byte.LB;//LOBYTE(buffer_out_data[Address_MB+i]);
}
crc = 0xffff;
// crc = get_crc_ccitt(crc, rs_arr->buffer, Length_MB*2+7);
crc = GetCRC16_IBM(crc, rs_arr->buffer, (unsigned long)(count_word*2+7));
rs_arr->buffer[count_word*2+7] = LOBYTE(crc);
rs_arr->buffer[count_word*2+8] = HIBYTE(crc);
rs_arr->buffer[count_word*2+9] = 0;
rs_arr->buffer[count_word*2+10] = 0;
RS_Send(rs_arr,rs_arr->buffer,( count_word*2+10+2));
// æäåì îòâåòà
if (adr_contr>0 && adr_contr<0xff)
{
RS_Len[CMD_RS232_MODBUS_16]=8;
RS_SetControllerLeading(rs_arr,true);
RS_SetAdrAnswerController(rs_arr,adr_contr);
}
}
void ReceiveAnswerCommandModbus3(RS_DATA_STRUCT *RS232_Arr)
{
unsigned int Address_MB, Length_MB, i;
MODBUS_REG_STRUCT elementData;
/* ïîëó÷èëè íà÷àëüíûé àäðåñ ÷òåíèß. */
Address_MB = adr_read_from_modbus3;
/* ïîëó÷èëè êîëè÷åñòâî ñëîâ äàííûõ */
Length_MB = RS232_Arr->RS_Header[2] >> 1;
/////////////////////////////////////////////////
// Îòñûëêà
/* Ïîñ÷èòàëè êîíòðîëüíóþ ñóììó ïåðåä ñàìîé ïîñûëêîé */
for (i=0;i<Length_MB;i++)
{
elementData.byte.HB = RS232_Arr->RS_Header[3+i*2];
elementData.byte.LB = RS232_Arr->RS_Header[3+i*2+1];
if (elementData.all != modbus_table_rs_in[Address_MB-ADR_MODBUS_TABLE+i].all) {
flag_send_answer_rs = 1;
}
modbus_table_rs_in[Address_MB-ADR_MODBUS_TABLE+i].all = elementData.all;
// modbus_table_rs_in[Address_MB-ADR_MODBUS_TABLE+i].byte.HB=RS232_Arr->RS_Header[3+i*2];
// modbus_table_rs_in[Address_MB-ADR_MODBUS_TABLE+i].byte.LB=RS232_Arr->RS_Header[3+i*2+1];
//Commented, because of out table can be rewrited before new value had been sent to SVO
modbus_table_rs_out[Address_MB-ADR_MODBUS_TABLE+i].all = modbus_table_rs_in[Address_MB-ADR_MODBUS_TABLE+i].all;
}
RS_SetControllerLeading(RS232_Arr,false);
RS_SetAdrAnswerController(RS232_Arr, 0);
err_modbus3=0;
cmd_3_or_16=1;
flag_received_first_mess_from_MPU=1;
return;
}
void ReceiveAnswerCommandModbus16(RS_DATA_STRUCT *RS232_Arr)
{
// Êîíòðîëüíàß ñóììà
//unsigned int crc, Address_MB, Length_MB, Bytecnt_MB/*, i, Data1,Data2*/;
//int Data, digital, ust_I, ust_Time;
/* ïîëó÷èëè íà÷àëüíûé àäðåñ ÷òåíèß. */
//Address_MB = RS232_Arr->RS_Header[3] | ( RS232_Arr->RS_Header[2] << 8);
/* ïîëó÷èëè êîëè÷åñòâî ñëîâ äàííûõ */
//Length_MB = (RS232_Arr->RS_Header[4] << 8 ) | RS232_Arr->RS_Header[5];
//Bytecnt_MB = RS232_Arr->RS_Header[6];
RS_SetAdrAnswerController(RS232_Arr,0);
RS_SetControllerLeading(RS232_Arr,false);
err_modbus16 = 0;
cmd_3_or_16 = 0;
flag_received_first_mess_from_MPU=1;
return;
}