Страница 402 из 1044 ПерваяПервая ... 302352392400401402403404412452502902 ... ПоследняяПоследняя
Показано с 4,011 по 4,020 из 10436

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

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

    По умолчанию

    Цитата Сообщение от adamst Посмотреть сообщение
    задача перегнать bit в word и обратно, подскажите пожалуйста все ли я правильно делаю

    Код:
    PROGRAM PLC_PRG
    VAR
        Var_Word: WORD;
        Byte_low: BYTE;
        Byte_hi: BYTE;
        Byte_low2: BYTE;
        Byte_hi2: BYTE;
        Bit1: BOOL;
        Bit2: BOOL;
        Bit3: BOOL;
        Bit4: BOOL;
        Bit5: BOOL;
        Bit7: BOOL;
        Bit8: BOOL;
        Bit9: BOOL;
        Bit10: BOOL;
        Bit6: BOOL;
        Bit11: BOOL;
        Bit12: BOOL;
        Bit13: BOOL;
        Bit14: BOOL;
        Bit15: BOOL;
        Bit16: BOOL;
    
        Bits: ARRAY [1..16] OF BOOL;
    
        UNPACK1: UNPACK;
        UNPACK2: UNPACK;
        PACK1: UNPACK;
        PACK2: UNPACK;
    END_VAR
    
    
    (*заполняем биты (библиотека UTIL)*)
    Bit1:=1;
    Bit2:=0;
    Bit3:=0;
    Bit4:=0;
    Bit5:=0;
    Bit6:=0;
    Bit7:=0;
    Bit8:=0;
    Bit9:=1;
    Bit10:=0;
    Bit11:=0;
    Bit12:=0;
    Bit13:=0;
    Bit14:=0;
    Bit15:=0;
    Bit16:=0;
    
    (*упаковываем биты в байты*)
    Byte_low2:=PACK(Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7,Bit8);
    Byte_hi2:=PACK(Bit9,Bit10,Bit11,Bit12,Bit13,Bit14,Bit15,Bit16);
    (*ну и байты в слово объединям*)
    Var_Word:=SHL(BYTE_TO_WORD(Byte_hi2),8) OR BYTE_TO_WORD(Byte_low2);
    
    
    (*ОБРАТНАЯ ПРОЦЕДУРА Переменная Var_Word разбивается на два байта*)
    Byte_low:=WORD_TO_BYTE(Var_word);
    Byte_hi:=WORD_TO_BYTE(Var_word/256);
    
    (*байты раскладываются на биты с помощью ФБ Unpack (библиотека UTIL)*)
    
    UNPACK1(
        B:=Byte_low ,
        B0=>Bits[1],
        B1=>Bits[2] ,
        B2=>Bits[3] ,
        B3=>Bits[4] ,
        B4=>Bits[5] ,
        B5=>Bits[6] ,
        B6=>Bits[7] ,
        B7=>Bits[8] );
    UNPACK2(
        B:=Byte_hi ,
        B0=>Bits[9] ,
        B1=>Bits[10] ,
        B2=>Bits[11] ,
        B3=>Bits[12],
        B4=>Bits[13] ,
        B5=>Bits[14],
        B6=>Bits[15],
        B7=>Bits[16]);
    
    (*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)
    Без всяких массивов, просто и сердито
    Код:
    FUNCTION PACK_W : WORD
    VAR_INPUT
        B0: BOOL;
        B1: BOOL;
        B2: BOOL;
        B3: BOOL;
        B4: BOOL;
        B5: BOOL;
        B6: BOOL;
        B7: BOOL;
        B8: BOOL;
        B9: BOOL;
        B10: BOOL;
        B11: BOOL;
        B12: BOOL;
        B13: BOOL;
        B14: BOOL;
        B15: BOOL;
    END_VAR
    VAR
    END_VAR
    (*Тело функции*)
    PACK_W.0:=B0;
    PACK_W.1:=B1;
    PACK_W.2:=B2;
    PACK_W.3:=B3;
    PACK_W.4:=B4;
    PACK_W.5:=B5;
    PACK_W.6:=B6;
    PACK_W.7:=B7;
    PACK_W.8:=B8;
    PACK_W.9:=B9;
    PACK_W.10:=B10;
    PACK_W.11:=B11;
    PACK_W.12:=B12;
    PACK_W.13:=B13;
    PACK_W.14:=B14;
    PACK_W.15:=B15;
    В обратную сторону аналогично, используем Bxx:=W.xx, где хх=0,1,2,...15
    Или еще вариант
    Код:
    FUNCTION PACK_W2 : WORD
    VAR_INPUT
        B0: BOOL;
        B1: BOOL;
        B2: BOOL;
        B3: BOOL;
        B4: BOOL;
        B5: BOOL;
        B6: BOOL;
        B7: BOOL;
        B8: BOOL;
        B9: BOOL;
        B10: BOOL;
        B11: BOOL;
        B12: BOOL;
        B13: BOOL;
        B14: BOOL;
        B15: BOOL;
    END_VAR
    VAR
        BYTE_0: BYTE;
        BYTE_1: BYTE;
    END_VAR
    (*Тело функции*)
    BYTE_0:=SHL(SHL(SHL(SHL(SHL(SHL(SHL(BOOL_TO_BYTE(B7),1) OR BOOL_TO_BYTE(B6),1) OR BOOL_TO_BYTE(B5),1) OR BOOL_TO_BYTE(B4),1)
        OR BOOL_TO_BYTE(B3),1) OR BOOL_TO_BYTE(B2),1) OR BOOL_TO_BYTE(B1),1) OR BOOL_TO_BYTE(B0);
    BYTE_1:=SHL(SHL(SHL(SHL(SHL(SHL(SHL(BOOL_TO_BYTE(B15),1) OR BOOL_TO_BYTE(B14),1) OR BOOL_TO_BYTE(B13),1) OR BOOL_TO_BYTE(B12),1)
        OR BOOL_TO_BYTE(B11),1) OR BOOL_TO_BYTE(B10),1) OR BOOL_TO_BYTE(B9),1) OR BOOL_TO_BYTE(B8);
    PACK_W2:=SHL(BYTE_TO_WORD(BYTE_1),8) OR BYTE_TO_WORD(BYTE_0);
    А зачем их вообще упаковывать/распаковывать? Не проще ли просто использовать обращение к отдельным битам WORD?
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #4012

    По умолчанию

    а мой пример можете адаптировать к Вашему методу, а то появляется много вопросов
    т.е. пример загнать 16 бит в слово и потом это слово снова разложить на 16 бит
    вот мое предположение как это должно выглядеть:
    Код:
    
    (*заполняем биты (библиотека UTIL)*)
    Bit1:=1;
    Bit2:=0;
    Bit3:=0;
    Bit4:=0;
    Bit5:=0;
    Bit6:=0;
    Bit7:=0;
    Bit8:=0;
    Bit9:=1;
    Bit10:=0;
    Bit11:=0;
    Bit12:=0;
    Bit13:=0;
    Bit14:=0;
    Bit15:=0;
    Bit16:=0;
    
    (*упаковываем биты в байты*)
    IF Bit1 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit2 HEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit3 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit4 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit5 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit6 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit7 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit8 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit9 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit10 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit11 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit12 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit13 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit14 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit15 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit16 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    
    (*ОБРАТНАЯ ПРОЦЕДУРА*)
    (*байты раскладываются на биты*)
    
    IF (Var_Word AND 1024)<>0 THEN Bits[1]:=TRUE; ELSE Bits[1]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[2]:=TRUE; ELSE Bits[2]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[3]:=TRUE; ELSE Bits[3]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[4]:=TRUE; ELSE Bits[4]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[5]:=TRUE; ELSE Bits[5]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[6]:=TRUE; ELSE Bits[6]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[7]:=TRUE; ELSE Bits[7]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[8]:=TRUE; ELSE Bits[8]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[9]:=TRUE; ELSE Bits[9]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[10]:=TRUE; ELSE Bits[10]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[11]:=TRUE; ELSE Bits[11]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[12]:=TRUE; ELSE Bits[12]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[13]:=TRUE; ELSE Bits[13]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[14]:=TRUE; ELSE Bits[14]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[15]:=TRUE; ELSE Bits[15]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[16]:=TRUE; ELSE Bits[16]:=FALSE; END_IF;
    (*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)

  3. #4013
    Пользователь
    Регистрация
    24.07.2012
    Адрес
    Россия
    Сообщений
    1,492

    По умолчанию

    Цитата Сообщение от adamst Посмотреть сообщение
    а мой пример можете адаптировать к Вашему методу, а то появляется много вопросов
    т.е. пример загнать 16 бит в слово и потом это слово снова разложить на 16 бит
    вот мое предположение как это должно выглядеть:
    Код:
    
    
    (*заполняем биты (библиотека UTIL)*)
    Bit1:=1;
    Bit2:=0;
    Bit3:=0;
    Bit4:=0;
    Bit5:=0;
    Bit6:=0;
    Bit7:=0;
    Bit8:=0;
    Bit9:=1;
    Bit10:=0;
    Bit11:=0;
    Bit12:=0;
    Bit13:=0;
    Bit14:=0;
    Bit15:=0;
    Bit16:=0;
    
    (*упаковываем биты в байты*)
    IF Bit1 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit2 HEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit3 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit4 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit5 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit6 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit7 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit8 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit9 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit10 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit11 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit12 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit13 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit14 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit15 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit16 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    
    (*ОБРАТНАЯ ПРОЦЕДУРА*)
    (*байты раскладываются на биты*)
    
    IF (Var_Word AND 1024)<>0 THEN Bits[1]:=TRUE; ELSE Bits[1]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[2]:=TRUE; ELSE Bits[2]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[3]:=TRUE; ELSE Bits[3]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[4]:=TRUE; ELSE Bits[4]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[5]:=TRUE; ELSE Bits[5]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[6]:=TRUE; ELSE Bits[6]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[7]:=TRUE; ELSE Bits[7]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[8]:=TRUE; ELSE Bits[8]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[9]:=TRUE; ELSE Bits[9]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[10]:=TRUE; ELSE Bits[10]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[11]:=TRUE; ELSE Bits[11]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[12]:=TRUE; ELSE Bits[12]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[13]:=TRUE; ELSE Bits[13]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[14]:=TRUE; ELSE Bits[14]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[15]:=TRUE; ELSE Bits[15]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[16]:=TRUE; ELSE Bits[16]:=FALSE; END_IF;
    (*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)
    да что это за порно!
    на мой пост глянь. писать word.0 := true читать if word.0 then ...
    http://www.owen.ru/forum/showthread....l=1#post172569

  4. #4014

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Без всяких массивов, просто и сердито
    ...
    А зачем их вообще упаковывать/распаковывать? Не проще ли просто использовать обращение к отдельным битам WORD?
    в панель передать чтобы, Bool значения нужно загнать в WORD, и соответсвенно когда их принимаем, тоже считываем их word блоками, вот для этих целей эти манипуляции и нужны,
    Ваш метод с обращением намного проще, я и не знал что можно обращаться по битно к word, а dword тоже так можно?

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

    По умолчанию

    Цитата Сообщение от adamst Посмотреть сообщение
    а мой пример можете адаптировать к Вашему методу, а то появляется много вопросов
    т.е. пример загнать 16 бит в слово и потом это слово снова разложить на 16 бит
    вот мое предположение как это должно выглядеть:
    Код:
    
    (*заполняем биты (библиотека UTIL)*)
    Bit1:=1;
    Bit2:=0;
    Bit3:=0;
    Bit4:=0;
    Bit5:=0;
    Bit6:=0;
    Bit7:=0;
    Bit8:=0;
    Bit9:=1;
    Bit10:=0;
    Bit11:=0;
    Bit12:=0;
    Bit13:=0;
    Bit14:=0;
    Bit15:=0;
    Bit16:=0;
    
    (*упаковываем биты в байты*)
    IF Bit1 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit2 HEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit3 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit4 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit5 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit6 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit7 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit8 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit9 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit10 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit11 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit12 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit13 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit14 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit15 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    IF Bit16 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
    
    (*ОБРАТНАЯ ПРОЦЕДУРА*)
    (*байты раскладываются на биты*)
    
    IF (Var_Word AND 1024)<>0 THEN Bits[1]:=TRUE; ELSE Bits[1]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[2]:=TRUE; ELSE Bits[2]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[3]:=TRUE; ELSE Bits[3]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[4]:=TRUE; ELSE Bits[4]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[5]:=TRUE; ELSE Bits[5]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[6]:=TRUE; ELSE Bits[6]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[7]:=TRUE; ELSE Bits[7]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[8]:=TRUE; ELSE Bits[8]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[9]:=TRUE; ELSE Bits[9]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[10]:=TRUE; ELSE Bits[10]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[11]:=TRUE; ELSE Bits[11]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[12]:=TRUE; ELSE Bits[12]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[13]:=TRUE; ELSE Bits[13]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[14]:=TRUE; ELSE Bits[14]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[15]:=TRUE; ELSE Bits[15]:=FALSE; END_IF;
    IF (Var_Word AND 1024)<>0 THEN Bits[16]:=TRUE; ELSE Bits[16]:=FALSE; END_IF;
    (*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)
    Я уже показал, как загнать 16 бит в WORD
    Код:
    FUNCTION PACK_W : WORD
    VAR_INPUT
        B0: BOOL;
        B1: BOOL;
        B2: BOOL;
        B3: BOOL;
        B4: BOOL;
        B5: BOOL;
        B6: BOOL;
        B7: BOOL;
        B8: BOOL;
        B9: BOOL;
        B10: BOOL;
        B11: BOOL;
        B12: BOOL;
        B13: BOOL;
        B14: BOOL;
        B15: BOOL;
    END_VAR
    VAR
    END_VAR
    (*Тело функции*)
    PACK_W.0:=B0;
    PACK_W.1:=B1;
    PACK_W.2:=B2;
    PACK_W.3:=B3;
    PACK_W.4:=B4;
    PACK_W.5:=B5;
    PACK_W.6:=B6;
    PACK_W.7:=B7;
    PACK_W.8:=B8;
    PACK_W.9:=B9;
    PACK_W.10:=B10;
    PACK_W.11:=B11;
    PACK_W.12:=B12;
    PACK_W.13:=B13;
    PACK_W.14:=B14;
    PACK_W.15:=B15;
    Обратная процедура
    Код:
    FUNCTION_BLOCK UNPACK_W
    VAR_INPUT
        In_W: WORD;
    END_VAR
    VAR_OUTPUT
        B0: BOOL;
        B1: BOOL;
        B2: BOOL;
        B3: BOOL;
        B4: BOOL;
        B5: BOOL;
        B6: BOOL;
        B7: BOOL;
        B8: BOOL;
        B9: BOOL;
        B10: BOOL;
        B11: BOOL;
        B12: BOOL;
        B13: BOOL;
        B14: BOOL;
        B15: BOOL;
    END_VAR
    VAR
    END_VAR
    B0:=In_W.0;
    B1:=In_W.1;
    B2:=In_W.2;
    B3:=In_W.3;
    B4:=In_W.4;
    B5:=In_W.5;
    B6:=In_W.6;
    B7:=In_W.7;
    B8:=In_W.8;
    B9:=In_W.9;
    B10:=In_W.10;
    B11:=In_W.11;
    B12:=In_W.12;
    B13:=In_W.13;
    B14:=In_W.14;
    B14:=In_W.15;
    Цитата Сообщение от adamst Посмотреть сообщение
    в панель передать чтобы, Bool значения нужно загнать в WORD, и соответсвенно когда их принимаем, тоже считываем их word блоками, вот для этих целей эти манипуляции и нужны
    Да не нужны эти манипуляции с "загнать в WORD", "разогнать из WORD". Все прекрасно передается на панели и из нее.
    Просто в программе вместо переменных BOOL манипулируйте сразу отдельными битами переменной WORD, которая определена в конфигурации для связи с панелью.
    Неудобно обращаться по номерам разрядов? Тогда обращайтесь к ним по именам.
    -определить в глобальных переменных константы INT для отдельных разрядов
    Вложение 18502
    Теперь для переменной WORD, через которую идет обмен с панелью
    Вложение 18503
    можно в программе, вместо номера разряда в переменной можно обращаться по имени этого разряда
    Вложение 18504
    т.е. например, вместо CMD_Panel.0 использовать CMD_Panel.cmdUrov_man.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

    По умолчанию

    Можно было еще проще сделать.
    В том месте конфигурации ПЛК, где у меня была переменная CMD_Panel, вместо модуля 2 byte вставить два модуля 8bits
    Вложение 18505
    И тогда можно эти BOOL переменные использовать в программе, а в панели будет обращаться к двум модулям 8bits как к одному регистру.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  7. #4017

    По умолчанию

    да, интересный подход, с константами замечательно придумано!

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

    По умолчанию

    День добрый!
    Подскажите, возможно ли сформировать строку указателем прям с начала структуры?

    Например:
    STRUCT
    BYTE
    BYTE
    WORD
    WORD
    DWORD
    DWORD
    DT
    DT
    end_struct

    Занимает она 20 байт. Храню я её на Flash.
    Сейчас я вычитываю её в массив Read (тип STRUCT), переделываю в строки и отправляю дальше.
    Но я хочу отправить одну строку c содержимым всего файла.
    Т.е. вычитали из файла, встали в начало файла и отправили строку байт.
    По идее берем p:=ADR(Read);
    Где pointer to string;
    Определяем длину нашего массива (20 байт * кол-во данных + 1)
    И загоняем в SysSockSend.

    Сейчас пробую без отправки, просто вычитываю массив и пытаюсь сформировать из него строку - а в переменной вижу лишь это:
    Вложение 18536
    В данном примере testData - array [0..20] of byte;
    Если использовать testDate - STRUCT - значения такие же.

    Может просто строка не отображается правильно, а на деле будет работать?

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

    По умолчанию

    Можно. Но начнем с того, что
    Цитата Сообщение от приборист Посмотреть сообщение
    Например:
    STRUCT
    BYTE
    BYTE
    WORD
    WORD
    DWORD
    DWORD
    DT
    DT
    end_struct

    Занимает она 20 байт. ?
    24 байта. В онлайне

    Это может и работать правильно. И отображатся правильно. И при этом быть как Вас. Курим про asciiZ

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

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Можно. Но начнем с того, что

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

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

Страница 402 из 1044 ПерваяПервая ... 302352392400401402403404412452502902 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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