Показано с 1 по 10 из 10

Тема: Макрос для СП307-Р, сравнение введенных данных с заданным значением

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Вообще еще не совсем понимаю, что правильнее помещать в глобальный макрос и в пользовательский

  2. #2
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,108

    По умолчанию

    Цитата Сообщение от RabochiyAkk Посмотреть сообщение
    Вообще еще не совсем понимаю, что правильнее помещать в глобальный макрос и в пользовательский
    В глобальный - свои функции
    Захват-11.png
    Скрытый текст:
    Код:
    #define DEBUG_ENB 1
    
    #if DEBUG_ENB
    #include <stdarg.h>
    #define DEBUG(...) realdprintf(__FILE__, __LINE__, __func__, __VA_ARGS__)
    #else
    #define DEBUG(...)
    #endif
    void realdprintf (char const *file, int line, char const *func, unsigned delay, char const *format, ...);
    /*
       There may be global variables and user-defined functions, for example
    int a, b, c;
    
    void Test(void) {
        PSW[256] = PSW[256] + 1;
        return;
    }
    etc...   
    */   
    
    /*  DEBUG Print */
    void realdprintf (char const *file, int line, char const *func, unsigned delay, char const *format, ...)
    {
    #define winNo       5004       //Debug window number
    #define LTOTAL      6          //Number of lines in the debug window
    #define CTOTAL      56         //Number of characters in one line of the debug window
    #define INPUT       PSW[136]   //Window control buttons
    #define SCRADDR     PSW[139]   //Initial address of the screen buffer
    #define TIC         (*(DWORD*) (PSW + 38))  //System timer
    #define TABS        8
    #define OK          0       
    #define LEFT        1       
    #define RIGHT       2       
    #define KbdStatus(bitno)   ((INPUT) & (1 << (bitno)))
    #define FORWARD     1  
    #define BACKWARD   -1
    
    char *pBuffScr;
    char *pBuffPrint = Malloc((LTOTAL -1) * CTOTAL);
    BYTE *saveREGS = Malloc(LTOTAL * CTOTAL);
    WORD saveREG1, saveREG2;
    static int Xpos = 0, Ypos = 0;
    register int t, len2;
    int len1, len3, dir;
    unsigned long tm;
    va_list arg;
    
    /* Save working registers */
    saveREG1 = INPUT;
    saveREG2 = SCRADDR;
    /* Calculate the initial address of the screen buffer */
    SCRADDR = PSW[10] - LTOTAL * CTOTAL/2;
    pBuffScr = (char*) &PSW[SCRADDR];
    /* Save the registers of the screen buffer area  */
    memcpy(saveREGS, pBuffScr, LTOTAL * CTOTAL);
    /* Clear screen buffer  */
    memset(pBuffScr, ' ', LTOTAL * CTOTAL);
    
    /* Print to screen line #1 */
    len1 = sprintf(pBuffScr, "> %s line %d in %s ", func, line, file);
    len2 = CTOTAL + Max(0, len1-CTOTAL);
    
    /* remaining print lines in the buffer */
    va_start(arg, format);
    len3 = vsnprintf (pBuffPrint, LTOTAL * CTOTAL - len2 - 1, format, arg);
    va_end(arg);
    pBuffPrint[len3] = '\0';
    
    /* Display buffer on screen */
    t= 0;
    do {
        switch(pBuffPrint[t]) {
            case '\a':		//Bell
                Beep();
                break;
            case '\t':		//Tab    
                len2 = len2 - len2 % TABS + TABS;
                break;
            case '\n':		//LF    
                len2 = len2 - len2 % CTOTAL + CTOTAL;
                break;            
            default:
                pBuffScr[len2] = pBuffPrint[t];
                len2++;
        }
        t++;
    } while (pBuffPrint[t] !=0 && len2 < (LTOTAL * CTOTAL));
    
    /* Call the debug window and control its position */
    dir = FORWARD;
    tm = TIC;
    while(!(KbdStatus(OK) || (delay !=0 && (TIC-tm) >= delay*10)) ) {
        if (KbdStatus(RIGHT)) {
            tm = TIC;
            CloseWindow(winNo);
            Xpos = Xpos + 100;     
        }
        if (KbdStatus(LEFT)) {
            tm = TIC;
            CloseWindow(winNo);
            Xpos = Xpos - 100;
            if (Xpos < 0) {
                Xpos = 0;
                Ypos = Ypos + dir * 100;
            }
            if (Ypos == 400) dir = BACKWARD;
            if (Ypos == 0) dir = FORWARD;
        }
        OpenWindow(winNo, Xpos, Ypos);
        INPUT = 0;
        Delay(10);
    }
    CloseWindow(winNo);
    
    /* Restore working registers */
    memcpy(pBuffScr, saveREGS, LTOTAL * CTOTAL);
    INPUT = saveREG1;
    SCRADDR = saveREG2;
    /* Deallocate memory blocks */
    Free(pBuffPrint);
    Free(saveREGS);
    }

    В пользовательском - используем эти функции
    Захват-22.png

    Скрытый текст:
    Код:
    int a, b, c;
    a= 2;
    b = PSW[250];
    c = a + b;
    DEBUG(20, " This is my test\n a= %d b= %d c= %d", a, b, c);
    PSW[300] = 100;
    PSW[400] = PSW[256] + PSW[300];
    DEBUG(30, "PSW[256]= %d PSW[300]= %d PSW[400]= %d", PSW[256], PSW[300], PSW[400]);


    Файл с примером - здесь https://owen.ru/forum/showthread.php...l=1#post251022
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  3. #3

    По умолчанию

    Спасибо всем. Разобралась. Все работает.

Похожие темы

  1. Не работает макрос в панеле СП307
    от marat6421 в разделе В помощь специалистам
    Ответов: 2
    Последнее сообщение: 20.11.2023, 16:49
  2. СП307+Mх2XX макрос
    от Владимир Технос М в разделе Мх210
    Ответов: 5
    Последнее сообщение: 15.11.2019, 11:47
  3. Сравнение переменной DWORD со значением
    от Metamorphogenesis в разделе Панели оператора (HMI)
    Ответов: 11
    Последнее сообщение: 01.07.2019, 09:59
  4. Загрузка данных в СП307-Р из csv
    от Sergey87 в разделе Панели оператора (HMI)
    Ответов: 5
    Последнее сообщение: 18.03.2018, 18:29
  5. Обнуление введенных параметров
    от Viktor40 в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 01.12.2011, 07:19

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •