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

Тема: Буфер записи по modbus

  1. #1

    По умолчанию Буфер записи по modbus

    Добрый день! Подскажите, пожалуйста, как сформировать буфер для записи значений WORD в МУ110-8И с помощью библиотеки modbus.lib. С записью битовой маски проблем нет, но записать 6 значений WORD возникли проблемы.

    Уважаемые разработчики могли бы и выложить РАБОЧИЕ примеры чтения/записи значений по modbus для Мх110
    PHP код:
    FUNCTION_BLOCK mbus_set
    VAR_INPUT
        In
    :BOOL:=FALSE;
        
    Dev_adr:BYTE;
        
    Start_reg:WORD;
        
    TimeOutTIME;    
        
    Polling_Time:TIME;        

        
    y1:WORD
        
    y2:WORD
        
    y3:WORD
        
    y4:WORD
        
    y5:WORD
        
    y6:WORD
    END_VAR
    VAR_OUTPUT
        Ready
    :BOOL:=FALSE;
        
    errWORD;
    END_VAR
    VAR
            
    com_numPORTS;                            
        
    SettingsCOMSETTINGS;                    
        
    COM_SERVICE1COM_SERVICE;            
        
    com_readyBOOL;                        
        
    buffer: ARRAY [0..255OF BYTE;
        
    set_modbus:MB_WR_REGS;
        
    stat :WORD;
        
    rt:R_TRIG;
        
    y:WORD;
        
    timer:TON;
        
    ptr_byte:POINTER TO BYTE;
        
    rt_in:R_TRIG;

        
    y1_old:WORD
        
    y2_old:WORD
        
    y3_old:WORD
        
    y4_old:WORD
        
    y5_old:WORD
        
    y6_old:WORD

    END_VAR 
    PHP код:
    rt_in(CLK:=IN);

    IF 
    rt_in.Q THEN
        stat
    :=0;
        
    Ready:=FALSE;
        
    err:=0;
        
    com_ready:=FALSE;
    END_IF
    IF  IN=TRUE THEN

        
        
    IF COM_SERVICE1.ready=FALSE THEN
        
            com_num
    :=0;
        
            
    Settings.Port:=com_num;
            
    Settings.dwBaudRate:=115200;
            
    Settings.byParity:=0;
            
    Settings.dwTimeout:=0;
            
    Settings.byStopBits:=0;
            
    Settings.dwBufferSize:=0;
            
    Settings.dwScan:=0;
        
            
    COM_SERVICE1(Enable:=TRUE Settings:=Settings Task:=OPEN_TSK  );
            
    com_ready:=FALSE;
        ELSE
            
    COM_SERVICE1.Enable:=FALSE;
            
    com_ready:=TRUE;
        
    END_IF


        
    IF com_ready=TRUE THEN

            
    CASE stat OF

    0
    :
    Ready:=FALSE;
    set_modbus(
        
    Enable:=TRUE ,
        
    Mode:=MB_RTU ,
        
    DevAddr:=Dev_adr,
        
    FirstAddr:=Start_reg,
        
    Quantity:=6,
        
    ComHandle:=Settings.Port ,
        
    TimeOut:=TimeOut ,
        
    Buffer:=buffer ,
        
    Complete=> ,
        
    Exception=> , 
        
    RegCnt=> );

    IF 
    set_modbus.Complete THEN

        ptr_byte
    :=ADR(y1_old);
           
    ptr_byte^:=buffer[0] ;
    buffer[1] :=WORD_TO_BYTE (y2_old);
    buffer[2] := WORD_TO_BYTE(y3_old);
    buffer[3] := WORD_TO_BYTE(y4_old);
    buffer[4] := WORD_TO_BYTE(y5_old);
    buffer[5] := WORD_TO_BYTE(y6_old);


    set_modbus(
        
    Enable:=FALSE ,
        
    Mode:=MB_RTU ,
        
    DevAddr:=Dev_adr,
        
    FirstAddr:=Start_reg,
        
    Quantity:=6,
        
    ComHandle:=Settings.Port ,
        
    TimeOut:=TimeOut ,
        
    Buffer:=buffer ,
        
    Complete=> ,
        
    Exception=> , 
        
    RegCnt=> );
    stat:=1;
    END_IF
        1
    :
                
    timer(IN:=TRUE PT:=Polling_Time );
                
    timer;
                
    stat:=2;
            
    2:
                
    timer;
                IF 
    timer.Q THEN
                    timer
    (IN:=FALSE PT:=Polling_Time );
                    
    timer;
                    
    stat:=0;
                    
    Ready:=TRUE;
                
    END_IF

            END_CASE
        
        END_IF


    END_IF
    ;
    y1_old:=y1;
    y2_old:=y2;
    y3_old:=y3;
    y4_old:=y4;
    y5_old:=y5;
    y6_old:=y6

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    Сделайте указатель на массив байт, далее этому указателю через ADR нужно присвоить первое слово, затем прибавит к указателю двойку и повторите присваивание уже второго слова и т. д.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Сделайте указатель на массив байт, далее этому указателю через ADR нужно присвоить первое слово, затем прибавит к указателю двойку и повторите присваивание уже второго слова и т. д.
    по вашему совету смастерил такое:

    ptr_byte:=ADR(y1_old);
    ptr_byte^:=buffer[0] ;

    ptr_byte:=ptr_byte+2;
    ptr_byte^:=buffer[1] ;

    ptr_byte:=ADR(y2_old);
    ptr_byte^:=buffer[2] ;

    ptr_byte:=ptr_byte+2;
    ptr_byte^:=buffer[3] ;

    но, видимо, не то. запись не идет. А преобразование WORD_TO_BYTE надо делать?

  4. #4

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Индусятины все меньше.
    Зачем в буфер класть старье если уже есть новье ?

    PS
    sysmemcopy(adr(buffer), adr(y1_old), sizeof(y1_old) * 6); // buffer[0].. <= y1..6_old
    //помним про сетевой порядок модбаса ...
    Где-то на просторах форума читал, что запись выполняется за несколько циклов программы, а я записываю на 3 выхода считанные значения с МВ1108АС.
    Структуры пока сложно...
    мне б на пальцах разобраться для начала

  5. #5
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    возмите пример http://www.owen.ru/forum/showthread.php?t=13584 по работе с модбас через библиотеку, марка прибора не принципиальна, отличие только в начальном регистре и количестве, а то что у Вас это вообще не рабочее
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  6. #6

    По умолчанию

    capzap, так по этим примерам и пытаюсь сделать, но там везде либо запись единичного регистра MB_WR_SNG_REG, либо запись одного значения Write Multiple registers, и буфер нигде не формируется.
    в РЭ МУ110-8И сказано использовать для записи команду 16, адресация регистров начинается с 0, при этом записывать значения WORD.
    Мне требуется записать 6 значений WORD, но как сформировать буфер не могу разобраться
    PHP код:
        ptr_byte:=ADR(y1)+2;
                
    buffer[0]:=ptr_byte^;
                
    ptr_byte:=ADR(y1);
                
    buffer[1]:=ptr_byte^;

                
    ptr_byte:=ADR(y2)+2;
                
    buffer[2]:=ptr_byte^;
                
    ptr_byte:=ADR(y2);
                
    buffer[3]:=ptr_byte^;

                
    ptr_byte:=ADR(y3)+2;
                
    buffer[4]:=ptr_byte^;
                
    ptr_byte:=ADR(y3);
                
    buffer[5]:=ptr_byte^;

                
    ptr_byte:=ADR(y4)+2;
                
    buffer[6]:=ptr_byte^;
                
    ptr_byte:=ADR(y4);
                
    buffer[7]:=ptr_byte^; 

  7. #7
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    ну как нет то, REAL(флоат) больше регистра в два раза
    Изображения Изображения
    • Тип файла: png owen.png (46.7 Кб, Просмотров: 40)
    Последний раз редактировалось capzap; 23.08.2018 в 17:34.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  8. #8
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    882

    По умолчанию

    С указателями и Sysmem интересно, но для начинающего мне кажется проще так:


    Buffer[1]:=WORD_TO_BYTE(y1);
    Buffer[0]:=WORD_TO_BYTE(SHR(y1,8));


    Buffer[3]:=WORD_TO_BYTE(y2);
    Buffer[2]:=WORD_TO_BYTE(SHR(y2,8));


    Buffer[5]:=WORD_TO_BYTE(y3);
    Buffer[4]:=WORD_TO_BYTE(SHR(y3,8));


    и т.д.
    Последний раз редактировалось приборист; 23.08.2018 в 21:59.

  9. #9
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    882

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну вот смотрите, Вы взяли и скопипастили и теперь в Вашем коде ошибка
    Пардон
    Вечер четверга слишком похож на вечер пятницы..

    Кстати, а функция SysMemSwap, она делает не тоже самое?
    Если сделать так:
    sysmemcopy(adr(buffer), adr(w), sizeof(w));
    sysmemswap(adr(buffer), 2, sizeof(w));


    PS
    Проверять лень
    Последний раз редактировалось приборист; 23.08.2018 в 22:05.

  10. #10

    По умолчанию

    Цитата Сообщение от приборист Посмотреть сообщение
    С указателями и Sysmem интересно, но для начинающего мне кажется проще так:
    Спасибо, Уважаемый!) именно это и нужно было

Похожие темы

  1. Широковещательная команда записи MODBUS RTU на СМИ2
    от Юрий_М в разделе Панели оператора (HMI)
    Ответов: 5
    Последнее сообщение: 20.01.2021, 11:45
  2. буфер визуализации
    от Иван2 в разделе СПК2хх
    Ответов: 0
    Последнее сообщение: 26.10.2014, 22:05
  3. ПЛК100 глюк при записи переменной modbus
    от PavelGO в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 22.06.2013, 11:09
  4. как организовать буфер (аккум)?
    от K580BB55A в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 23.11.2010, 00:58
  5. как использовать буфер
    от николай72 в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 18.04.2009, 22:25

Ваши права

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