Export translations
Перейти к:
навигация
,
поиск
Параметры
Группа
1-Wire
Allen Bradley DF1
API - Запись нового значения в регистр
API - Получение данных для графика
API - Получение данных для события
API - Получение данных о локальном времени
API - Получение лога регистров
API - Получение текущих значений регистров
API - Список блоков панелей
API - Список графиков
API - Список изображений
API - Список панелей
API - Список регистров
API - Список словарей
API - Список соединений
API - Список трендов
BACnet IP
Broadlink SP3S
Delta DVP
ModBus ASCII
ModBus RTU
Modbus RTU в виде custom protocol
ModBus TCP
Siemens PPI
Siemens S7 Communication
Test
Troubleshooting - Решение типовых проблем при работе в WebHMI
Аварии
Аннотация - функциональные возможности WebHMI
Битовые операции
Быстродействие при обмене данными
ВНИМАНИЕ! ДАННАЯ ВЕРСИЯ ВИКИ УСТАРЕЛА - см. docs.webhmi.com.ua
Внутренние регистры WebHMI
Демо-приложение для Android
Дополнительные СОМ порты
Доступ по ftp
Журнал регистров
Интеграция в другие системы
Использование MultiWan
Исторические графики
Как проверить уровень приема сигнала у 3G модема
Календарь
Назначение и применение
Настройка виртуального UART
Настройка связи с CDC-модемами на примере модема Huawei E3531
Настройка сетевых соединений
Обновление версии прошивки
Описание API
Описание внешних разъемов
Оптимизация производительности
Особенности работы с некоторыми модемами
Отладка сложных скриптов
Первое включение
Перевод на англ 2
Поддерживаемые протоколы
Подключение 3G модем ZTE K3806 Киевстар
Подключение WebHMI к Level2
Подключение внешних устройств
Подключение к Allen-Bradley MicroLogix 1200
Подключение к Kиевстар на примере модема ZTE MF100
Подключение к People.net
Подключение к S7-1200
Подключение к МТС Коннект
Подключение к ОВЕН160
Подключение к ПЛК с Codesys
Подключение к интернету через 3G модем
Полезные программы
Полезные советы
Пользовательские графики и тренды (Аналитика)
Пользовательские протоколы
Построение графиков в Level2
Пример доступа к данным из C/C++
Пример доступа к данным из Excel
Пример протокола ModBus ASCII
Пример протокола ModBus TCP
Примеры подключения к разным устройствам
Просмотр регистров по запросу
Работа с контроллером холодильного оборудования Danfoss AK-CC 550
Работа с регистрами
Рецепты
Сброс настроек
Синхронизация времени
Системные настройки и сервис
Скрипты
События
Соединения
Сравнение карт SD
Тренды
Удалённый сервисный доступ
Формирование отчетов
Функции управления соединениями
Функция Modbus/TCP сервер
Шаблоны дешбордов
Экраны
Язык
aa - Afar
ab - Abkhazian
ace - Achinese
ady - Adyghe
ady-cyrl - адыгабзэ
aeb - Tunisian Arabic
aeb-arab - تونسي
aeb-latn - Tûnsî
af - Afrikaans
ak - Akan
aln - Gheg Albanian
am - Amharic
an - Aragonese
ang - Old English
anp - Angika
ar - Arabic
arc - Aramaic
arn - Mapuche
arq - Algerian Arabic
ary - Moroccan Arabic
arz - Egyptian Arabic
as - Assamese
ase - American Sign Language
ast - Asturian
av - Avaric
avk - Kotava
awa - Awadhi
ay - Aymara
az - Azerbaijani
azb - تۆرکجه
ba - Bashkir
bar - Bavarian
bbc - Batak Toba
bbc-latn - Batak Toba
bcc - Southern Balochi
bcl - Bikol Central
be - Belarusian
be-tarask - Belarusian (Taraškievica orthography)
bg - Bulgarian
bgn - Western Balochi
bho - Bhojpuri
bi - Bislama
bjn - Banjar
bm - Bambara
bn - Bengali
bo - Tibetan
bpy - Bishnupriya
bqi - Bakhtiari
br - Breton
brh - Brahui
bs - Bosnian
bto - Iriga Bicolano
bug - Buginese
bxr - буряад
ca - Catalan
cbk-zam - Chavacano de Zamboanga
cdo - Min Dong Chinese
ce - Chechen
ceb - Cebuano
ch - Chamorro
cho - Choctaw
chr - Cherokee
chy - Cheyenne
ckb - Central Kurdish
co - Corsican
cps - Capiznon
cr - Cree
crh - Crimean Turkish
crh-cyrl - Crimean Turkish (Cyrillic script)
crh-latn - Crimean Turkish (Latin script)
cs - Czech
csb - Kashubian
cu - Church Slavic
cv - Chuvash
cy - Welsh
da - Danish
de - German
de-at - Austrian German
de-ch - Swiss High German
de-formal - German (formal address)
diq - Zazaki
dsb - Lower Sorbian
dtp - Central Dusun
dty - डोटेली
dv - Divehi
dz - Dzongkha
ee - Ewe
egl - Emilian
el - Greek
eml - Emiliano-Romagnolo
en - English
en-ca - Canadian English
en-gb - British English
eo - Esperanto
es - Spanish
et - Estonian
eu - Basque
ext - Extremaduran
fa - Persian
ff - Fulah
fi - Finnish
fit - Tornedalen Finnish
fj - Fijian
fo - Faroese
fr - French
frc - Cajun French
frp - Arpitan
frr - Northern Frisian
fur - Friulian
fy - Western Frisian
ga - Irish
gag - Gagauz
gan - Gan Chinese
gan-hans - Simplified Gan script
gan-hant - Traditional Gan script
gd - Scottish Gaelic
gl - Galician
glk - Gilaki
gn - Guarani
gom - Goan Konkani
gom-deva - Goan Konkani (Devanagari script)
gom-latn - Goan Konkani (Latin script)
got - Gothic
grc - Ancient Greek
gsw - Swiss German
gu - Gujarati
gv - Manx
ha - Hausa
hak - Hakka Chinese
haw - Hawaiian
he - Hebrew
hi - Hindi
hif - Fiji Hindi
hif-latn - Fiji Hindi (Latin script)
hil - Hiligaynon
ho - Hiri Motu
hr - Croatian
hrx - Hunsrik
hsb - Upper Sorbian
ht - Haitian Creole
hu - Hungarian
hy - Armenian
hz - Herero
ia - Interlingua
id - Indonesian
ie - Interlingue
ig - Igbo
ii - Sichuan Yi
ik - Inupiaq
ike-cans - Eastern Canadian (Aboriginal syllabics)
ike-latn - Eastern Canadian (Latin script)
ilo - Iloko
inh - Ingush
io - Ido
is - Icelandic
it - Italian
iu - Inuktitut
ja - Japanese
jam - Jamaican Creole English
jbo - Lojban
jut - Jutish
jv - Javanese
ka - Georgian
kaa - Kara-Kalpak
kab - Kabyle
kbd - Kabardian
kbd-cyrl - Адыгэбзэ
kg - Kongo
khw - Khowar
ki - Kikuyu
kiu - Kirmanjki
kj - Kuanyama
kk - Kazakh
kk-arab - Kazakh (Arabic script)
kk-cn - Kazakh (China)
kk-cyrl - Kazakh (Cyrillic script)
kk-kz - Kazakh (Kazakhstan)
kk-latn - Kazakh (Latin script)
kk-tr - Kazakh (Turkey)
kl - Kalaallisut
km - Khmer
kn - Kannada
ko - Korean
ko-kp - 한국어 (조선)
koi - Komi-Permyak
kr - Kanuri
krc - Karachay-Balkar
kri - Krio
krj - Kinaray-a
ks - Kashmiri
ks-arab - Kashmiri (Arabic script)
ks-deva - Kashmiri (Devanagari script)
ksh - Colognian
ku - Kurdish
ku-arab - كوردي (عەرەبی)
ku-latn - Kurdish (Latin script)
kv - Komi
kw - Cornish
ky - Kyrgyz
la - Latin
lad - Ladino
lb - Luxembourgish
lbe - лакку
lez - Lezghian
lfn - Lingua Franca Nova
lg - Ganda
li - Limburgish
lij - Ligurian
liv - Livonian
lmo - Lombard
ln - Lingala
lo - Lao
loz - Lozi
lrc - Northern Luri
lt - Lithuanian
ltg - Latgalian
lus - Mizo
luz - Southern Luri
lv - Latvian
lzh - Literary Chinese
lzz - Laz
mai - Maithili
map-bms - Basa Banyumasan
mdf - Moksha
mg - Malagasy
mh - Marshallese
mhr - Eastern Mari
mi - Maori
min - Minangkabau
mk - Macedonian
ml - Malayalam
mn - Mongolian
mo - молдовеняскэ
mr - Marathi
mrj - Western Mari
ms - Malay
mt - Maltese
mus - Creek
mwl - Mirandese
my - Burmese
myv - Erzya
mzn - Mazanderani
na - Nauru
nah - Nāhuatl
nan - Min Nan Chinese
nap - Neapolitan
nb - Norwegian Bokmål
nds - Low German
nds-nl - Low Saxon
ne - Nepali
new - Newari
ng - Ndonga
niu - Niuean
nl - Dutch
nl-informal - Nederlands (informeel)
nn - Norwegian Nynorsk
nov - Novial
nrm - Nouormand
nso - Northern Sotho
nv - Navajo
ny - Nyanja
oc - Occitan
olo - Livvi-Karelian
om - Oromo
or - Oriya
os - Ossetic
pa - Punjabi
pag - Pangasinan
pam - Pampanga
pap - Papiamento
pcd - Picard
pdc - Pennsylvania German
pdt - Plautdietsch
pfl - Palatine German
pi - Pali
pih - Norfuk / Pitkern
pl - Polish
pms - Piedmontese
pnb - Western Punjabi
pnt - Pontic
prg - Prussian
ps - Pashto
pt - Portuguese
pt-br - Brazilian Portuguese
qu - Quechua
qug - Chimborazo Highland Quichua
rgn - Romagnol
rif - Riffian
rm - Romansh
rmy - Romani
rn - Rundi
ro - Romanian
roa-tara - tarandíne
ru - Russian
rue - Rusyn
rup - Aromanian
ruq - Megleno-Romanian
ruq-cyrl - Megleno-Romanian (Cyrillic script)
ruq-latn - Megleno-Romanian (Latin script)
rw - Kinyarwanda
sa - Sanskrit
sah - Sakha
sat - Santali
sc - Sardinian
scn - Sicilian
sco - Scots
sd - Sindhi
sdc - Sassarese Sardinian
sdh - Southern Kurdish
se - Northern Sami
sei - Seri
ses - Koyraboro Senni
sg - Sango
sgs - Samogitian
sh - Serbo-Croatian
shi - Tachelhit
shi-latn - Tašlḥiyt
shi-tfng - ⵜⴰⵛⵍⵃⵉⵜ
si - Sinhala
sk - Slovak
sl - Slovenian
sli - Lower Silesian
sm - Samoan
sma - Southern Sami
sn - Shona
so - Somali
sq - Albanian
sr - Serbian
sr-ec - Serbian (Cyrillic script)
sr-el - Serbian (Latin script)
srn - Sranan Tongo
ss - Swati
st - Southern Sotho
stq - Saterland Frisian
su - Sundanese
sv - Swedish
sw - Swahili
szl - Silesian
ta - Tamil
tcy - Tulu
te - Telugu
tet - Tetum
tg - Tajik
tg-cyrl - Tajik (Cyrillic script)
tg-latn - Tajik (Latin script)
th - Thai
ti - Tigrinya
tk - Turkmen
tl - Tagalog
tly - Talysh
tn - Tswana
to - Tongan
tokipona - Toki Pona
tpi - Tok Pisin
tr - Turkish
tru - Turoyo
ts - Tsonga
tt - Tatar
tt-cyrl - Tatar (Cyrillic script)
tt-latn - Tatar (Latin script)
tum - Tumbuka
tw - Twi
ty - Tahitian
tyv - Tuvinian
tzm - Central Atlas Tamazight
udm - Udmurt
ug - Uyghur
ug-arab - Uyghur (Arabic script)
ug-latn - Uyghur (Latin script)
uk - Ukrainian
ur - Urdu
uz - Uzbek
uz-cyrl - ўзбекча
uz-latn - oʻzbekcha
ve - Venda
vec - Venetian
vep - Veps
vi - Vietnamese
vls - West Flemish
vmf - Main-Franconian
vo - Volapük
vot - Votic
vro - Võro
wa - Walloon
war - Waray
wo - Wolof
wuu - Wu Chinese
xal - Kalmyk
xh - Xhosa
xmf - Mingrelian
yi - Yiddish
yo - Yoruba
yue - Cantonese
za - Zhuang
zea - Zeelandic
zh - Chinese
zh-cn - Chinese (China)
zh-hans - Simplified Chinese
zh-hant - Traditional Chinese
zh-hk - Chinese (Hong Kong)
zh-mo - 中文(澳門)
zh-my - 中文(马来西亚)
zh-sg - Chinese (Singapore)
zh-tw - Chinese (Taiwan)
zu - Zulu
qqq - Message documentation
Format
Экспорт для оффлайнового перевод
Экспорт в родном формате
{{DISPLAYTITLE:Bit operations}}<languages/> === Bit operations === ==== Convenient bit operations ==== You can define several convenient bit operations, remembering that in lua bits are numbered from 1. The link was taken from [http://lua-users.org/wiki/BitwiseOperators here], there are many other useful functions. <syntaxhighlight lang = lua> function bit(n) return 2 ^ (n - 1) -- returns weight of the binary digit end function hasbit(x, p) return x % (p + p) >= p -- return on / off state as true/false if hasbit(value, bit(2)) then ... end function setbit(x, p) return hasbit(x, p) and x or x + p -- set bit # p in х examle х = setbit(х, bit(p)) end function clearbit(x, p) return hasbit(x, p) and x - p or x -- same as previous but clears bit end </syntaxhighlight> ==== Convert binary table to number ==== This function can be useful for non-standard conversions when the number is stored in a specific format and it must be processed in parts using the specified position of the 1st bit and the length of the value field. <syntaxhighlight lang = "lua"> function getNumberFromTab(tab,start,length) -- local result_str = ""; for i=start,(start+length-1) do result_str = result_str..tostring(tab[i]); end return tonumber(result_str,2); end -- getNumberFromTab </syntaxhighlight> ==== Convert number to binary table ==== In lua (in the version used in WebHMI) there is no built-in operation to get a string representation of a binary number. However, this feature is very useful in custom protocols and others when it is needed to redistribute or somehow treat the individual bits of the number. The text of the variant of such function: <syntaxhighlight lang = "lua"> function getBits(input_num,length) -- works with defined length local tab = {}; -- empty table for reply local max_i = length - 1; local remainder = input_num; -- remainder of successive approximation for i=max_i,0,-1 do if remainder - 2^i >= 0 then table.insert(tab, "1") ; remainder = remainder - 2^i; else table.insert(tab, "0") ; end end return tab; end -- getBits </syntaxhighlight> Then you can rearrange the necessary bits in places, etc. and get the right number. Below is an example of exchanging bits 31 and 23 (with bit numbering from 0) in the response of the flow meter of VLR 2301/2304 produced by Asvega-U. <syntaxhighlight lang = "lua"> function main (userId) local input_num = GetReg(3); -- local bitTable = getBits(input_num,32); -- table to process result local tmp_bit = ""; -- tmp_bit = bitTable[1]; -- exchange bitTable[1] = bitTable[9]; bitTable[9] = tmp_bit; WriteReg(1, tonumber(table.concat(bitTable),2)); end </syntaxhighlight> ==== Processing extended precision float numbers (double) ==== Some devices can store data in a format with increased accuracy double float. In the current version of WebHMI only 32 bit registers are supported, so to process a 64-bit number, you will need to use a script that will 'chain' the two registers into the original number, and then convert and write back into float. Registers must be of type double word uint. For the 'coupling' of numbers, you can use the function getBits described above to get 2 tables, and then add the first table with bits from the second using table.insert. In this example, a constant is used as the verification number for simplicity. <syntaxhighlight lang = "lua"> -------------------------------------- local test_var = 0xC1D312D000000000; local NaN = tonumber("11111111111111111111111111111111",2); -------------------------------------- function main (userId) -- getresult tab of 0 and 1 local result_tab = getBits(test_var,64); WriteReg(11,table.concat(result_tab)); -- debug print into a string register local result_num = 0.0; -- to store the result local sign,exp,mantissa = 0,0,0; local fraction_table = {}; -- table for fraction part -- get sign if result_tab[1] == "1" then sign = -1; else sign = 1; end -- get exponent exp = getNumberFromTab(result_tab,2,11); DEBUG("exp = "..tostring(exp)); -- debug printing -- mantissa for i=13,64 do table.insert(fraction_table,result_tab[i]); end -- get mantissa bit - by - bit for j=1,52 do if fraction_table[j]=="1" then mantissa = mantissa +(2^(-1*j)) end end mantissa = mantissa +1; DEBUG("m = "..tostring(mantissa)); -- debug printing result_num = sign*(2^(exp - 1023))*mantissa -- exception handling if exp == 0 then -- subnormals result_num = sign*(2^(-1022))*(mantissa-1); end if exp == 0x7ff then -- nan result_num = NaN; end -- output the result into a single float register WriteReg(10, result_num); end -- main </syntaxhighlight> ==== Grouping alerts into a single alert register ==== WebHMI has a alerts mechanism. I.e by the state of the bit in the alert register, you can automatically generate entries in the log about the time of occurrence, removal of the accident, acknowledgment by the operator. However, in some cases, using this mechanism directly, as it is, may not be entirely convenient. For example, a certain bit or a combination thereof, different error codes (and they must be distinguished from each other), a value greater than or less than a threshold, etc. are considered emergency. If the register has already configured states for the emergency used for display, then it must be simply duplicated by setting the bit in the common emergency register. It may also be necessary to introduce an alarm delay, since the value may have a 'bounce' which must be filtered before generating an accident in the log. In addition, it is more convenient when all accidents are described in one place, rather than scattered over hundreds of registers. I.e. it is more rational to use one or more several 32-bit registers to describe all possible accidents, and a script in which these accidents will be written to this register under different conditions. Below is an example of such a script: For example, there is a certain functional unit, for example, an air-handling unit, in which there is some common sign of an accident, there are several registers with codes for current errors from frequency converters and a situation where one of the registers exceeded alert limit (humidity, CO2, etc.) which is also an emergency situation. [[Файл:Alerts eng.png | 800px | left]] <br clear = all> Тогда скрипт, который обработает все эти ситуации и сформирует нужные флаги на своих местах может выглядеть так: <syntaxhighlight lang = lua> allAlerts = { -- регистр бит - код ошибки тип операции {srcAlias = "pv1Status", bits = {[1] = 1}, checktype = "bit9"}, {srcAlias = "vfdStatus_1", bits = {[2] = 10, [3] = 20, [4] = 30, [5] = 40}, checktype = "=="}, {srcAlias = "vfdStatus_2", bits = {[6] = 10, [7] = 20, [8] = 30, [9] = 40}, checktype = "=="}, {srcAlias = "pv1ZoneHumidity", bits = {[10] = 90}, checktype = ">="} } intAlertReg = "alertsReg" -- ОБЩИЙ РЕГИСТР АВАРИЙ function main (userId) DEBUG("Entered script") local alertInput, alertOut = 0,0 -- временные переменные для чтения аварий и формирования результата local digit = 0 -- номер бита в исходном регистре, указывающий на аварию.. --[[ Если назвать единообразно все параметры, из которых надо формировать аварии и сложить их в одну структуру, тогда можно использовать только один цикл for, например так: --]] for i,v in pairs(allAlerts) do alertInput = GetReg(v.srcAlias) -- читаем регистр DEBUG("Регистр для анализа = ".." "..v.srcAlias.." = "..alertInput) for j,k in pairs(v.bits) do -- выполнится по числу элементов в под-табличке bits -- проверяем тип операции - точное совпадение или другое условие if (v.checktype == "==") then DEBUG("Тип сравнения - точное совпадение") -- проверяем регистр на один из кодов ошибок if (alertInput == k) then alertOut = setbit(alertOut, bit(j)) else alertOut = clearbit(alertOut, bit(j)) end -- проверяем определенный бит elseif (string.find(v.checktype, "bit%d+") ~= nil) then -- %d+ паттерн любая последовательность цифр DEBUG("Тип сравнения - проверка бита") _, _, digit = string.find(v.checktype,"(%d+)") digit = tonumber(digit) DEBUG("digit = "..digit) if hasbit(alertInput, bit(digit)) then -- если заданный бит установлен во входном регистре alertOut = setbit(alertOut, bit(j)) else alertOut = clearbit(alertOut, bit(j)) end elseif (v.checktype == ">=") then -- параметр больше чем значение if (alertInput >= k) then alertOut = setbit(alertOut, bit(j)) else alertOut = clearbit(alertOut, bit(j)) end else --- другие операции end -- if checktype end -- for bits inside end -- for allAlerts -- теперь просто записать то что получилось в общий регистр аварий WriteReg(intAlertReg, alertOut) end -- main ----------------- ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ ---------------------------------- function bit(n) return 2 ^ (n - 1) -- возвращает число - вес разряда номер n end function hasbit(x, p) return x % (p + p) >= p -- возвращает состояние бита p как true/false; if hasbit(value, bit(2)) then ... end function setbit(x, p) return hasbit(x, p) and x or x + p -- установить бит № p в х Пример использования: х = setbit(х, bit(p)) end function clearbit(x, p) return hasbit(x, p) and x - p or x -- тоже только снять бит end </syntaxhighlight> Если различных операций над значениями много: не только сравнение, но и например проверка конкретного бита и т.п. то можно детали реализации спрятать в функцию, которая получит на вход табличку с типом операции (установлен ли конкретный бит, код ошибки, параметр в границах и т.п.) и входным значением и поставит или сбросит нужный бит. <syntaxhighlight lang = lua> for i,v in pairs(allAlerts) do alertInput = GetReg(v.srcAlias) -- alertOut = MyGetAlerts(alertInput, alertOut, v) -- calling the function which will look what to do end -- for </syntaxhighlight>
Навигация
Персональные инструменты
русский
127.0.0.1
Обсуждение для этого IP-адреса
Войти
Пространства имён
Служебная страница
Варианты
Просмотры
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная статья
Справка
Инструменты
Спецстраницы
Версия для печати