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

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

  1. #1

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

    Здравствуйте. Хотела сделать следующий макрос: с панели с помощью цифрового ввода вбивается значение типа float, сравнивается с уставкой и если оно больше, то на цифровом дисплее появляется значение 1. Почему-то не работает как задумано, при вводе любого значения больше 0 на цифровом дисплее появляется 1. Ниже код пользовательского макроса, в глобальном ничего нет.
    float val = PSW[304];
    if (7 < val)
    {
    PSW[308] = 1;
    }
    else
    {
    PSW[308] = 0;
    }
    При этом такой макрос работает нормально:
    float val = PSW[304];
    float val1 = PSW[306];
    if (val1 < val)
    {
    PSW[308] = 1;
    }
    else
    {
    PSW[308] = 0;
    }
    Последний раз редактировалось RabochiyAkk; 09.12.2024 в 12:22.

  2. #2

    По умолчанию

    7 < val, у вас разные типы данных. Число 7 без точки это целочисленный тип, float пишется как 7.0
    Вот видео https://www.youtube.com/watch?v=MxEUeiGtKdo
    Последний раз редактировалось kondor3000; 19.11.2024 в 18:57.

  3. #3

    По умолчанию

    Пробовал так еще, тоже не работал
    float val = PSW[304];
    float val1 =7;
    if (7 < val)
    {
    PSW[308] = 1;
    }
    else
    {
    PSW[308] = 0;
    }

  4. #4

    По умолчанию

    Спасибо большое

  5. #5

    По умолчанию

    Добрый день! Вдруг есть возможность подсказать. Усложняю макрос и опять возникла проблема с типами данных. В цикле должен происходить прием и запись данных в регистр psw304, затем сравнение его с уставкой из регистра psw306. Если psw304>psw306, то в регистр psw308 записывается значение 1. psw306 и psw304 числа типа float. В прошлый раз сделано было все согласно видеоуроку, который вы скинули, сработало. Но вот хочу перенести это в цикл приема ответа с датчика, чтобы ответ от датчика сравнивался с уставкой. Ответ приходит, но сравнение происходит неправильно, хотя вроде бы сравниваю переменную с переменной, тип один
    void ProcessResponseAndAlarm(BYTE *response, float SetPoint, WORD BitNumber)
    {
    float val;
    char str[8];

    strncpy(str, (char*)&response[7], 7);
    str[7] = '\0';

    val = atof(str);
    *(float*)(PSW + 304) = val;

    if (val > SetPoint)
    {
    SetPSB(BitNumber);
    }
    else
    {
    ResetPSB(BitNumber);
    }
    }
    void SendPressureRequest(WORD Port, float SetPoint, WORD BitNumber)
    {
    BYTE DataSend[11];
    BYTE DataReceive[40];
    WORD ReceiveSize;

    DataSend[0] = 0x40;
    DataSend[1] = 0x32;
    DataSend[2] = 0x35;
    DataSend[3] = 0x33;
    DataSend[4] = 0x50;
    DataSend[5] = 0x52;
    DataSend[6] = 0x31;
    DataSend[7] = 0x3F;
    DataSend[8] = 0x3B;
    DataSend[9] = 0x46;
    DataSend[10] = 0x46;

    Enter(Port);
    Send(Port, DataSend, sizeof(DataSend));

    ReceiveSize = Receive(Port, DataReceive, sizeof(DataReceive), 5000, 6);
    Leave(Port);

    if (ReceiveSize > 0)
    {
    ProcessResponseAndAlarm(DataReceive, SetPoint, BitNumber);
    }
    }

  6. #6
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,048

    По умолчанию

    ну очевидно же что нужно на каждом шаге куда то выводить промежутчные результаты
    Здесь отладчик, мягко сказать не могу, поэтому промолчу.

  7. #7

    По умолчанию

    Спасибо, не могли бы вы уточнить, что выводить, не совсем понимаю

  8. #8

    По умолчанию

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

  9. #9
    Пользователь Аватар для 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

  10. #10

    По умолчанию

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

Похожие темы

  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

Ваши права

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