0
Работа с битами
Здравствуйте.
1 - Смотрю ваш пример "Работа с битами", он не работает.
2 - в выборе переменных есть канал "Тест" и "Скрипт", а в редакторе каналов нет.
Что это за каналы и как работают?
3 - Не найду, как объявить глобальную переменную?
1 - Смотрю ваш пример "Работа с битами", он не работает.
2 - в выборе переменных есть канал "Тест" и "Скрипт", а в редакторе каналов нет.
Что это за каналы и как работают?
3 - Не найду, как объявить глобальную переменную?
Сервис поддержки клиентов работает на платформе UserEcho
1. Пришлите пож-ста на почту скриншоты редактора каналов.
2. Переменная объявляется и инциализируется через функцию
SetGlobalVar('variable1’,100)
Чтение: value:=GetGlobalVar(‘variable1’)
SimpL_bit.PNG
Обещанные ссылки по новой версии SIMP Light 4.3.2.
1. Версия SIMP Light free 4.3.2 - 13 Mb
2. Демо-проекты - 0,3 Mb
3. Видео презентации - 141 Mb
simp.png
День добрый.
Давайте будем разбираться с причиной. Уточним пару моментов.
1. На сколько я вижу из скриншота, то редактор мнемосхем открывает мнемосхему без проблем.
2. Ошибка возникает при попытке открыть мнемосхему в мониторе?
3. Если пересохранить мнемосхему в редакторе, и повторить попытку открыть мнемосхему в мониторе, ошибка остаётся?
2 - редактор каналов пишет о нарушении лицензии по количеству каналов, но открывается и в нем нет "Тест" и "Скрипт" канала.
3 - монитор пишет, что произошла ошибка при открытии мнемосхемы(на первом скрине её видно). Я её открываю вручную из меню мнемосхема, но она не работает.
4 - попробовал добавить кнопку на мнемосхему и пересохранить её. Результат тот-же. Ошибка остается и мнемосхема не работает.
5 - сохранил мнемосхему с другим именем, стала открываться без ошибки, но не работает.
test.png
Если есть возможность напишите к нам на почту, я Вам вышлю рабочий пример по работе с битами.
**********
А лучше выложите здесь. Информации мало с примерами скриптов.
Пример по работе с битами
http://www.simplight.ru/files/help/scripts/bit_example.slz
Дано:
Есть word равный 16
Раскладываем его на биты 00001000 00000000
скриптом
В мониторе выводим "текст" привязанный к каналу (тот самый битовый)
Клацаем по апплету текст и смотри график. он в виде гребенки.
Почему? При выполнении скрипта биты сбрасываются в нулевое значение и заново устанавливаются.
И получается гирлянда из битов. Как поправить?
Можно скрипт увидеть, или скрипт брали из примера?
var val: word; val2: word; bit: byte; begin val := ReadValue('k2.Status-busd'); val2:=val div 256; bit := GetBit(val, 0); WriteValue('k2.status-busd-bit00', bit); bit := GetBit(val, 1); WriteValue('k2.status-busd-bit01', bit); bit := GetBit(val, 2); WriteValue('k2.status-busd-bit02', bit); bit := GetBit(val, 3); WriteValue('k2.status-busd-bit03', bit); bit := GetBit(val, 4); WriteValue('k2.status-busd-bit04', bit); bit := GetBit(val, 5); WriteValue('k2.status-busd-bit05', bit); bit := GetBit(val, 6); WriteValue('k2.status-busd-bit06', bit); bit := GetBit(val, 7); WriteValue('k2.status-busd-bit07', bit); bit := GetBit(val2, 0); WriteValue('k2.status-busd-bit08', bit); bit := GetBit(val2, 1); WriteValue('k2.status-busd-bit09', bit); bit := GetBit(val2, 2); WriteValue('k2.status-busd-bit10', bit); bit := GetBit(val2, 3); WriteValue('k2.status-busd-bit11', bit); bit := GetBit(val2, 4); WriteValue('k2.status-busd-bit12', bit); bit := GetBit(val2, 5); WriteValue('k2.status-busd-bit13', bit); bit := GetBit(val2, 6); WriteValue('k2.status-busd-bit14', bit); bit := GetBit(val2, 7); WriteValue('k2.status-busd-bit15', bit); end.
[/spoiler]раскладываю два байта.
Может val2 брать не из первого а из оригинала разделив на 256?
k2.status-busd-bit00-15 виртуальный
Ок, понятно. Т.е. если я правильно понял то каналы k2.status-busd-bit00-15 при каждом цикле скрипта сначала сбрасываются в 0, а потом принимают уже нужное значение. Так?
GetBit(val, 0)…GetBit(val, 15)
было бы неплохо без скрипта в канале выбирать нужный бит.
Есть в планах, будем делать это.
Можно сделать разбивку в opc, но нагрузка большая будет.
ок. сейчас проверим. По результатам отпишусь.
Проверили все работает. Можете скинуть скриншот графика.
2.zip
По сути ваше решение одно и тоже с моим. Но! Ваш работает!
Делаю как у вас. Мучаясь с "перебиванием каналов". Работает. Мистика.
Делаю откат на старое. Не работает. И тут я "увидел" баг, мать его.
При малейшем изменении канала в конфигураторе каналов или даже просто иногда спонтанно происходит следующие.
В редакторе мнемосхем при привязке на прямоугольник на переменную типа bool? можно выбирать в состоянии не вкл откл, а уставки мин максимум и норма. От сюда и глюки мои.
После сотого переназначения (чтобы видно было свойства bool), заработало.
Вот так, пол дня на отлов бага и обход его :)
Ок. Понял. По свойствам канала будем смотреть. Т.е. сейчас все нормально работает?
Ребята может кто подкинуть примерчик работы с битами на Паскале?
Первая задача разложить WORD на биты, а вторая свернуть биты в Word.
Буду очень признателен за примеры.
Пример во вложении.
<a href="/s/attachments/19809/1/0/ed428b2f9f90c6b545559f3731b94d1b.zip" class="i_item_file"><i class="icon-file"></i> examplebit.zip</a>
examplebit.zip
либо биты паковать напрямую, либо сложить два ворда.
Вот код. Если можно проще, то выложите пожалуйста.
[spoiler]
bin01,bin02 и тд виртульные каналы (переключатели)
На выходе всё упаковано в Dword и отправленно на PLC
var varr :word; //промежуточное значение bit0r,bit1r,bit2r,bit3r,bit4r,bit5r,bit6r,bit7r,bit8r, bit9r,bit10r,bit11r,bit12r,bit13r,bit14r,bit15r,bit16r, bit17r,bit18r,bit19r,bit20r,bit21r,bit22r,bit23r,bit24r, bit25r,bit26r,bit27r,bit28r,bit29r,val2 :boolean; begin bit0r:= ReadValue('bin01'); bit1r:= ReadValue('bin02'); bit2r:= ReadValue('bin03'); bit3r:= ReadValue('bin04'); bit4r:= ReadValue('bin04a'); bit5r:= ReadValue('bin05'); bit6r:= ReadValue('bin06'); bit7r:= ReadValue('bin06e'); bit8r:= ReadValue('bin07'); bit9r:= ReadValue('bin08'); bit10r:= ReadValue('bin08d'); bit11r:= ReadValue('bin08n'); bit12r:= ReadValue('bin09'); bit13r:= ReadValue('bin10'); bit14r:= ReadValue('bin11'); bit15r:= ReadValue('bin12'); bit16r:= ReadValue('bin12a'); bit17r:= ReadValue('bin13'); bit18r:= ReadValue('bin14'); bit19r:= ReadValue('bin15'); bit20r:= ReadValue('bin16'); bit21r:= ReadValue('bin17'); bit22r:= ReadValue('bin18'); bit23r:= ReadValue('bin19'); bit24r:= ReadValue('bin20'); bit25r:= ReadValue('bin21'); bit26r:= ReadValue('bin22'); bit27r:= ReadValue('bin23'); bit28r:= ReadValue('bin24'); if bit0r=True then SetOnBit(varr,0) else SetOffBit(varr,0); if bit1r=True then SetOnBit(varr,1) else SetOffBit(varr,1); if bit2r=True then SetOnBit(varr,2) else SetOffBit(varr,2); if bit3r=True then SetOnBit(varr,3) else SetOffBit(varr,3); if bit4r=True then SetOnBit(varr,4) else SetOffBit(varr,4); if bit5r=True then SetOnBit(varr,5) else SetOffBit(varr,5); if bit6r=True then SetOnBit(varr,6) else SetOffBit(varr,6); if bit7r=True then SetOnBit(varr,7) else SetOffBit(varr,7); if bit8r=True then SetOnBit(varr,8) else SetOffBit(varr,8); if bit9r=True then SetOnBit(varr,9) else SetOffBit(varr,9); if bit10r=True then SetOnBit(varr,10) else SetOffBit(varr,10); if bit11r=True then SetOnBit(varr,11) else SetOffBit(varr,11); if bit12r=True then SetOnBit(varr,12) else SetOffBit(varr,12); if bit13r=True then SetOnBit(varr,13) else SetOffBit(varr,13); if bit14r=True then SetOnBit(varr,14) else SetOffBit(varr,14); if bit15r=True then SetOnBit(varr,15) else SetOffBit(varr,15); if bit16r=True then SetOnBit(varr,16) else SetOffBit(varr,16); if bit17r=True then SetOnBit(varr,17) else SetOffBit(varr,17); if bit18r=True then SetOnBit(varr,18) else SetOffBit(varr,18); if bit19r=True then SetOnBit(varr,19) else SetOffBit(varr,19); if bit20r=True then SetOnBit(varr,20) else SetOffBit(varr,20); if bit21r=True then SetOnBit(varr,21) else SetOffBit(varr,21); if bit22r=True then SetOnBit(varr,22) else SetOffBit(varr,22); if bit23r=True then SetOnBit(varr,23) else SetOffBit(varr,23); if bit24r=True then SetOnBit(varr,24) else SetOffBit(varr,24); if bit25r=True then SetOnBit(varr,25) else SetOffBit(varr,25); if bit26r=True then SetOnBit(varr,26) else SetOffBit(varr,26); if bit27r=True then SetOnBit(varr,27) else SetOffBit(varr,27); if bit28r=True then SetOnBit(varr,28) else SetOffBit(varr,28); WriteValue('odwTestMU',varr); //Записать готовы результат в DWORD end.
[/spoiler]RE:
Проверил в работе. Работает :)