/*! \file v_data_log.h \brief 4-õ êàíàëüíûé ëîããåð äëß îñöèëëîãðàôèðîâàíèß â ðåàëüíîì âðåìåíè (ñì. TDataLog)  âåðñèè 2.0 ðåàëèçîâàí 32-áèòíûé ðåæèì ðàáîòû. Îñíîâíûå ïîëîæåíèÿ: Òèï äàííûõ äàòàëîããåðà îïðåäåëÿåòñÿ ñèìâîëüíîé êîíñòàíòîé â çàãîëîâî÷íîì ôàéëå 'V_data_log.h' (îäèí èç âàðèàíòîâ íóæíî ðàñêîììåíòèðîâàòü): //#define DLOG_DATA_SIZE 16 #define DLOG_DATA_SIZE 32 Äëÿ 16-áèòíîãî ðåæèìà äàòàëîããåð ðàáîòàåò "êëàññè÷åñêèì" ìåòîäîì. Ñòàðûé Þíèêîí ðàáîòàåò êàê áûëî. Íîâûé Þíèêîí ïðè ýòîì íå ïîëó÷àåò ôëàã 32-áèòíîãî ðåæèìà (ñì. íèæå) è ðàáîòàåò ïî "êëàññè÷åñêîìó" àëãîðèòìó (ïðàâäà, áóôåð ïðèíèìàåìûõ äàííûõ ó íåãî òåïåðü 32-áèòíûé, íî ýòî òîíêîñòè). Ïðè áóôåðíîé ïåðåäà÷å êàæäûé êàíàë ïåðåäà¸òñÿ, êàê è ðàíüøå, îäíèì çàïðîñîì. 32-áèòíûé ðåæèì:  ïåðåìåííóþ 'dlog.control' äîáàâëåí ôëàã '32-áèòíûå äàííûå', ïî êîòîðîìó íîâûé Þíèêîí óçíà¸ò òèï äàòàëîããåðà. Ïðè SDO-÷òåíèè îñöèëëîãðàìì äàííûå, êàê è ðàíüøå, âûäâèãàþòñÿ ÷åðåç 32-áèòíóþ ïåðåìåííóþ 'dlog.next_value_var' (òàì, êðîìå 16-áèòíîãî çíà÷åíèÿ, åñòü âñÿêèå ïîëÿ).  íå¸ äîáàâëåíû äâà ôëàãà: - ôëàã, ÷òî â ïîëå "çíà÷åíèå" - ñòàðøèå 16 áèò òî÷êè - ôëàã, ÷òî ïåðåìåííàÿ 16-ðàçðÿäíàÿ Þíèêîí ñíà÷àëà çàïðàøèâàåò ìëàäøóþ ÷àñòü çíà÷åíèÿ, ïîòîì - ñòàðøóþ è ò.ä. ïî âñåì òî÷êàì. Åñëè ïåðåìåííàÿ 16-ðàçðÿäíàÿ, òî ñòàðøàÿ ÷àñòü íå çàïðàøèâàåòñÿ. Ïðè áóôåðíîé ïåðåäà÷å: Ò.ê. îäèí áóôåðíûé çàïðîñ îãðàíè÷åí ó íàñ 256-òüþ 16-áèòíûìè ñëîâàìè, òî Þíèêîí ñíà÷àëà çàïðàøèâàåò ïåðâûå 256 ñëîâ (128 32-áèòíûõ òî÷åê), çàòåì - îñòàëüíûå 256 ñëîâ. Ò.å. èñïîëüçóåòñÿ äâà áóôåðíûõ çàïðîñà. \author Êîëëåêòèâ ÎÎÎ ÍÏÔ Âåêòîð \version v 2.0 10/04/2017 \defgroup v_data_log Öèôðîâîé îñöèëëîãðàô (ñì. TDataLog) @{ */ #ifndef V_DATA_LOG_H #define V_DATA_LOG_H #include "CANOpen_drv.h" #ifdef __cplusplus extern "C" { #endif // Ðàçìåð çíà÷åíèé, ïåðåäàâàåìûõ ÷åðåç ëîããåð (áèò) //#define DLOG_DATA_SIZE 16 #define DLOG_DATA_SIZE 32 #if DLOG_DATA_SIZE == 16 typedef int16 type_data; #elif DLOG_DATA_SIZE == 32 typedef int32 type_data; #endif //! Ðàçìåð ìàññèâîâ äëß îñöèëëîãðàôèðîâàíèß. //!Åñëè íóæíî ìåíßòü, òî ýòî äåëàòü íàäî íå òîëüêî òóò - ñëèøêîì ìíîãî çàâßçàíî íà ýòî ÷èñëî //!Ïåðåäåëàòü ñëîæíî, òàê êàê íà ýòî ÷èñëî çàâßçêà êîñâåííàß: íàïðèìåð, äëß óñêîðåíèß ðàáîòû //!ïðèìåíßþòñß òàêèå êîíñòðóêöèè: p->Wcounter&=0xFF; Ãäå FF - ìàñêà (ñèìâîëèçèðóåò 256 òî÷åê) #define NUMBER_SAMPLES 256 /*! \class TDataLog \brief 4-õ êàíàëüíûé ëîããåð äëß îñöèëëîãðàôèðîâàíèß â ðåàëüíîì âðåìåíè Êëàññ \a TDataLog, îñíîâàííûé íà ñòðóêòóðå SDataLog, ïîçâîëßåò çàïèñûâàòü âûáðàííûå 4 ïåðåìåííûõ â ìàññèâû èç 255 òî÷åê ñ çàäàííîé äèñêðåòèçàöèåé ïî âðåìåíè. Êðîìå òîãî, èìååò ñâßçü ñ äðàéâåðîì CANOpen äëß àâòîìàòèçàöèè óêàçàíèß ýòèõ ïåðåìåííûõ: ìîæíî "çàðßäèòü" â äàòàëîããåð ëþáîé ñóùåñòâóþùèé ýëåìåíò ñëîâàðß.*/ //! ñì. TDataLog struct SDataLog { type_data buff[(NUMBER_SAMPLES*4)]; //4 ìàññèâà äëÿ îòñíÿòûõ îñöèëëîãðàìì, ñëåïëåííûå â îäèí áîëüøîé #if DLOG_DATA_SIZE == 16 type_data *dlog_iptr1; //!< óêàçàòåëè íà ïåðåìåííûå äëÿ çàïèñè (íàïðèìåð. òîê ôàçû A, ñêîðîñòü è ò.ä.) type_data *dlog_iptr2; //!< Input: Second input pointer (Q15) type_data *dlog_iptr3; type_data *dlog_iptr4; #endif int dlog_cntr_max; //!< Parameter: Maximum number of samples Uint16 Wcounter; //!< Ñ÷åò÷èê ïî ìàññèâó äëß çàïèñè Uint16 Rcounter; //!< Ñ÷åò÷èê ïî ìàññèâó äëß ÷òåíèß type_data* dl_buffer1_adr; //!< Óêàçàòåëè íà ìàññèâû, ãäå ëåæàò îòñíÿòûå îñöèëëîãðàììû type_data* dl_buffer2_adr; //!< Parameter: Buffer starting address 2 type_data* dl_buffer3_adr; type_data* dl_buffer4_adr; type_data upload_buff[NUMBER_SAMPLES]; //ìàññèâ äëÿ îòïðàâêè îñöèëëîãðàììû â þíèêîí. Ñþäà êîïèðóåòñÿ îñöèëëîãðàììà èç îäíîãî èç ÷åòûðåõ ìàññèâîâ buff ñî ñìåùåíèåì, ÷òîáû íà÷àëî îñöèëëîãðàììû áûëî â íà÷àëå ìàññèâà. type_data* dl_upload_buffer_adr; //óêàçàòåëü íà ìàññèâ äëÿ îòïðàâêè. Uint32 trig_shift; //ñäâèã ïåðâîé òî÷êè ïîñëå ñðàáàòûâàíèÿ òðèããåðà. Èñïîëüçóåòñÿ, ÷òîáû çàäàòü, ñêîëüêî òî÷åê ïðåäûñòîðèè ñîõðàíÿòü. Uint16 trig_shift_int; //òî æå, ïåðåâåäåííîå â òî÷êè Uint16 first_point_written; //ïåðâàÿ òî÷êà, îòíîñÿùàÿñÿ ê çàïèñûâàåìîé îñöèëëîãðàììå ñ ó÷åòîì äëèíû ïðåäûñòîðèè è òî÷êè ñðàáàòûâàíèÿ òðèããåðà Uint16 prehistory_length; //äëèíà çàïèñàííîé ïðåäûñòîðèè (åñëè äàòàëîããåð ïåðåèíèöèàëèçèðîâàëñÿ êíîïêîé "îáíîâèòü", îíà îáíóëÿåòñÿ) Uint16 valid_points_num; //ñ÷åò÷èê âàëèäíûõ òî÷åê ïðåäûñòîðèè, çàïèñàííûõ ïîñëå ïåðåèíèöèàëèçàöèè êíîïêîé "îáíîâèòü" â þíèêîíå /*! Ðåæèìîâ ðàáîòû ÷åòûðå:\n 0 - ñòîï\n 1 - îäíîêðàòíàß çàïèñü\n 2 - çàïèñü ïî êðóãó áåç îñòàíîâêè\n 3 - îäíîêðàòíàß çàïèñü îäíîé ïåðåìåííîé âî âñå 4 ìàññèâà ïîñëåäîâàòåëüíî, äëß ïîëó÷åíèß äëèííîé îñöèëëîãðàììû.\n Óñòàíàâëèâàòü ïåðåìåííóþ íàäî òîëüêî âûçîâîì ôóíêöèè set_mode! */ Uint16 mode_reset; //!< çàäàåòñß ðåæèì ðàáîòû Uint16 mode_reset_prev; //!< ïðåäûäóùèé ðåæèì ðàáîòû int E; // ôëàã ýíòðè /*! "control" èìååò 32 ðàçðßäà. Ïåðâûå 16 áèò - ôëàãè, ïîñëåäíèå 16 áèò - óñòàíîâêà ðàçðåæèâàíèÿ.\n 9 8 7 6 5 4 3 2 1 0\n | x | x | x | x | x | x | x | x | x | x |\n | | | | | | ïåðâûå 4 áèòà - êàêèå èç 4õ ïåðåìåíûõ èíòåðåñóþò (êàêèå àäðåñà îáíîâëßòü, êàêèå äàííûå çàïèñûâàòü)\n | | | | 2 áèòà - æåëàåìûé ðåæèì äàòàëîããåðà: 0, 1, 2\n | | | áèò "äàííûå ãîòîâû" - óñòàíàâëèâàåòñß êîíòðîëëåðîì\n | | áèò "ïîääåðæèâàåòñÿ áëî÷íàÿ ïåðåäà÷à"\n | áèò "32-áèòíûå äàííûå"\n ðåçåðâ */ long control; //!< óïðàâëåíèå äàòàëîããåðîì ÷åðåç âíåøíèå ïðîãðàììû unsigned int WriteDelimiter; //!<äåëèòåëü äàííûõ ïðè çàïèñè unsigned int WriteDelimiterCounter; //!<Ñ÷åò÷èê äëß äåëèòåëß long ind_subind1; //!<çàïèñûâàåòñß èíäåêñ è ïîäûíäåêñ äëß ñëîâàðß long ind_subind2; long ind_subind3; long ind_subind4; unsigned long next_value_var; //!<÷åðåç ýòó ïåðåìåííóþ âûäâèãàþòñß çàïèñàííûå çíà÷åíèß ïðè ñ÷èòûâàíèè: //!<áèòû 0-15: çíà÷åíèå òî÷êè //!<áèòû 16-23: Rcounter (îòäàâàåìàÿ òî÷êà) //!<áèòû 24-25: buff_num //!<áèò 26: ôëàã, ÷òî â ïîëå "çíà÷åíèå" - ñòàðøèå 16 áèò òî÷êè (èñïîëüçóåòñÿ ïðè DLOG_DATA_SIZE = 32) //!<áèò 27: ôëàã, ÷òî ïåðåìåííàÿ 16-ðàçðÿäíàÿ (èñïîëüçóåòñÿ ïðè DLOG_DATA_SIZE = 32) Uint16 StartBits; int buff_num; //!<íîìåð ìàññèâà, èç êîòîðîãî èäåò âûäâèæåíèå çíà÷åíèé â next_value_var int ResetAfterStart; //!<ôëàã îáíóëåíèß ñ÷åò÷èêà çàïèñè ïðè çàïóñêå Uint16 OneShotOperation; //!<ôëàã ñèíõðîíèçàöèè îñöèëëîãðàôà òîëüêî ïî ïåðâîìó ñîáûòèþ (ïåðåõîä â 1 âîçìîæåí òîëüêî èç 2) TCo_OdVars *pco_vars; //!<àäðåñ ñòðóêòóðû äðàéâåðà CANopen #if DLOG_DATA_SIZE == 32 int highPartOfValue; //!<ôëàã âûäà÷è ñòàðøåé ÷àñòè TObjectInfo object1Info; //!<èíôîðìàöèÿ î çàïèñûâàåìîì îáúåêòå ¹1 TObjectInfo object2Info; //!<èíôîðìàöèÿ î çàïèñûâàåìîì îáúåêòå ¹2 TObjectInfo object3Info; //!<èíôîðìàöèÿ î çàïèñûâàåìîì îáúåêòå ¹3 TObjectInfo object4Info; //!<èíôîðìàöèÿ î çàïèñûâàåìîì îáúåêòå ¹4 #endif void (*update)(volatile struct SDataLog *); //!