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

Тема: Получить в скрипте бит 10 из word

  1. #1

    Question Получить в скрипте бит 10 из word

    Кусок скрипта который не отрабатывает как мне хочется
    Задача: с переменной word по адресу 1200 получить десятый бит и скопировать его в регистр битов 707

    if ((PSW[1200]&(1<<10))!=0)
    {
    SetPSB(707);
    }
    else
    {
    ResetPSB(707);
    }


    С 0 по 7 бит всё четко работает. Но за пределами восьми бит не корректно отрабатывает.
    Хелп
    Последний раз редактировалось vik™; 14.12.2023 в 05:16.

  2. #2

    По умолчанию

    Может из-за того, что требуется 16ричное число, а не десятичное?

    Согласно справки: PSW[400] & 0x01

    Или вообще 8ричное...

    А зачем добавлено: !=0
    Код:
    Код макроса: if (PSW[400] & 0x01)    // побитовое И
    { 
    SetPSB(300);
    }
    else
    { 
    ResetPSB(300);
    }
    Может это лишнее? Сам в макросах не понимаю, но тут возможно не полноценный язык...
    Последний раз редактировалось МихаилГл; 14.12.2023 в 05:28.

  3. #3

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Может из-за того, что требуется 16ричное число, а не десятичное?

    Согласно справки: PSW[400] & 0x01

    Или вообще 8ричное...

    А зачем добавлено: !=0
    Код:
    Код макроса: if (PSW[400] & 0x01)    // побитовое И
    { 
    SetPSB(300);
    }
    else
    { 
    ResetPSB(300);
    }
    Может это лишнее? Сам в макросах не понимаю, но тут возможно не полноценный язык...
    !=0 это сравнивание бита . Если бит не равен нулю, то присвоить биту 707 истину, в противном случае присвоить ложь.
    Вопрос не в HEX, DEC или BIN. Это всего лишь представление информации.
    Если с 0 по 7 бит код работает, то почему не хочет работать дальше седьмого бита.
    WORD это два байта, 16 бит. Не вижу логики почему не работает.

  4. #4

    По умолчанию

    Цитата Сообщение от vik™ Посмотреть сообщение
    !=0 это сравнивание бита . Если бит не равен нулю, то присвоить биту 707 истину, в противном случае присвоить ложь.
    Вопрос не в HEX, DEC или BIN. Это всего лишь представление информации.
    Если с 0 по 7 бит код работает, то почему не хочет работать дальше седьмого бита.
    WORD это два байта, 16 бит. Не вижу логики почему не работает.
    Я спрашивал зачем добавлено... В справке к СП этого нет. Может это лишнее.. Или вы не в СП макрос пишите, а на чистом С? (Но я в нем тоже не понимаю))
    Ну или в справке ошибка. Тогда должно работать.

  5. #5

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Я спрашивал зачем добавлено... В справке к СП этого нет. Может это лишнее.. Или вы не в СП макрос пишите, а на чистом С? (Но я в нем тоже не понимаю))
    Ну или в справке ошибка. Тогда должно работать.
    Это С подобное чтото. Единственное я не совсем понимаю как компилятор обрабатывает код на ошибки. Как работает с внутренними переменными PSB, PSW. Есть вариант взять переменную и силой сказать что это UINT и попробовать так. Но решил спросить тут, т.к. постоянно скрипт грузить в панель и тестить, извращение полнейшее.
    Справка есть еще тут https://owen.ru/uploads/388/sp3xx_rp_2.2.pdf страница 181
    Этот код отсюда. он более понятный
    Пробовал разные варианты.
    С битами мне проще в деках работать, чем с маской. Удобнее читать код спустя некоторое время. Сразу видишь бит нужный. С маской для меня сложнее читать.

  6. #6

    По умолчанию

    Вчера пол дня мучался, теперь когда написал, понял, сам дурак.
    Забыл сранные скобки. Сначала нужно получить бит, потом его сравнить.
    if ((PSW[1200]&(1<<10))!=0)
    {SetPSB(707);}
    else
    {ResetPSB(707);}
    Когда писал, забыл с 8 бита и дальше сделать это
    Проверил. Работает!

  7. #7

    По умолчанию

    Цитата Сообщение от vik™ Посмотреть сообщение
    Это С подобное чтото. Единственное я не совсем понимаю как компилятор обрабатывает код на ошибки. Как работает с внутренними переменными PSB, PSW. Есть вариант взять переменную и силой сказать что это UINT и попробовать так. Но решил спросить тут, т.к. постоянно скрипт грузить в панель и тестить, извращение полнейшее.
    Справка есть еще тут https://owen.ru/uploads/388/sp3xx_rp_2.2.pdf страница 181
    Этот код отсюда. он более понятный
    Пробовал разные варианты.
    С битами мне проще в деках работать, чем с маской. Удобнее читать код спустя некоторое время. Сразу видишь бит нужный. С маской для меня сложнее читать.
    А я смотрел справку в самой среде, там ошибка... Вот и верь после этого документации.
    вввввв.png
    Последний раз редактировалось МихаилГл; 14.12.2023 в 06:06.

  8. #8

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    А я смотрел справку в самой среде, там ошибка... Вот и верь после этого документации.
    вввввв.png
    Это рабочий вариант. Просто метод битовой маски
    С интернета
    Маскирование. Компьютер воспринимает информацию иначе. Ему нельзя сказать: «Посмотри на первый бит и выдай его значение» — нужно использовать маску. Например, чтобы узнать, какой ответ был дан на второй вопрос, потребуется маска 010 — единица стоит в том бите, значение которого мы хотим получить.
    Последний раз редактировалось vik™; 14.12.2023 в 07:01.

  9. #9

    По умолчанию

    Цитата Сообщение от vik™ Посмотреть сообщение
    Это рабочий вариант. Просто метод битовой маски
    С интернета
    Маскирование. Компьютер воспринимает информацию иначе. Ему нельзя сказать: «Посмотри на первый бит и выдай его значение» — нужно использовать маску. Например, чтобы узнать, какой ответ был дан на второй вопрос, потребуется маска 010 — единица стоит в том бите, значение которого мы хотим получить.
    Я это все понимаю, но разве это будет работать без условия !=0 или !=1 и т.п.?
    Мы же не бит на выходе получим, а число, но только 01000, 00100, 00010 и т.п.

    Ладно, кажется я затупил конкретно...
    Последний раз редактировалось МихаилГл; 14.12.2023 в 08:44.

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 29.06.2021, 22:01
  2. Ответов: 1
    Последнее сообщение: 16.05.2019, 23:01
  3. Имя оператора в скрипте?
    от redi в разделе Master SCADA 3
    Ответов: 2
    Последнее сообщение: 22.05.2013, 13:33
  4. неявные связи в скрипте
    от Kostic77 в разделе Master SCADA 3
    Ответов: 7
    Последнее сообщение: 26.04.2013, 07:24
  5. Ответов: 13
    Последнее сообщение: 13.10.2008, 13:13

Ваши права

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