Уважаемые коллеги, мы рады предложить вам, разрабатываемый нами учебный курс по программированию ПЛК фирмы Beckhoff с применением среды автоматизации TwinCAT. Курс предназначен исключительно для самостоятельного изучения в ознакомительных целях. Перед любым применением изложенного материала в коммерческих целях просим связаться с нами. Текст из предложенных вам статей скопированный и размещенный в других источниках, должен содержать ссылку на наш сайт heaviside.ru. Вы можете связаться с нами по любым вопросам, в том числе создания для вас систем мониторинга и АСУ ТП.


Системы счисления

Уважаемые коллеги, эта статья будет полностью состоять из теории, мы рассмотрим системы счисления. При чтении этой статьи вы познакомитесь с двоичной и шестнадцатеричной системами счисления. Возможно, кому-то из читателей материал по системам счисления и переводу чисел из одной системы в другую может показаться сложным или скучным. Однако автор настоятельно рекомендует понять хотя бы их базовые принципы, так как в области программирования ПЛК, как и во многих других сферах программирования, они все еще достаточно актуальны и часто требуются на практике.

Бит, байт и размер данных

В прошлых статьях, когда мы рисовали схемы на языке LD, мы использовали тип данных BOOL. BOOL — это простейший тип данных, который может принимать всего два значения: 0 и 1, они же FALSE и TRUE и содержит в себе количество информации, соответствующее одному биту. Бит — это наименьшее количество информации. Один бит равен количеству информации, получаемой в результате осуществления одного из двух равновероятных событий. Например, выпадение орла или решки при бросании монетки. Помимо бита для обозначения количества информации применяют понятие байта. В современных системах обычно имеют в виду, что байт состоит из восьми бит. При записи в качестве единицы измерения биты записываются как «бит», а байты как «Б», например, 8 бит, 16 Б. Как и для других единиц измерения, для записи количества информации перед единицей измерения используются десятичные приставки СИ. Кроме того, для битов и байтов используют двоичные приставки.

Десятичные приставки

Название ОбозначениеСтепень
килоК10^3
мегаМ10^6
гигаГ10^{9}
терраТ10^{12}
петаП10^{15}

Например, 8 Кбит = 8000 бит = 1 КБ = 1000 Б.

Двоичные приставки

Название ОбозначениеСтепеньМножитель
кибибайтКи (Ki)2^{10}1\,024
мебибайтМи (Mi)2^{20} 1\, 048 \, 576
гибибайтГи (Gi)2^{30} 1\, 073\, 741\, 824
тебибайтТи (Ti)2^{40} 1\, 099\,511\,627\,776
пебибайтПи (Pi)2^{50} 1\,024\,899\,906\,842\,624

Например, 8 Кибит = 8\,192 бит = 1 КиБ = 1\,024 Б.

Иногда при написании десятичных приставок имеются в виду двоичные, то есть при записи 1 КБ имеется в виду 1\,024 Б. Такое использование приставок формально хоть и не является корректным, но очень часто встречается на практике.

Также стоит отметить, что иногда под словом байт подразумевается размер регистров процессора, то есть количество бит, которое процессор может обрабатывать за раз. Размер регистров процессора называется разрядность (или битность) процессора. Из контекста всегда можно понять, что имеется в виду: 8 бит или один разряд процессора. Современные процессоры, работающие под управлением Windows, имеют разрядность в 32 или 64 бита.

Системы счисления

Наверное, всем известно, что компьютеры оперируют данными в виде единиц и нолей. Такая система счисления называется двоичной позиционной. Система счисления — это способ записи цифр. Двоичная система наиболее удобна для применения в электронных схемах. Нулю соответствует отсутствие напряжения, единице — его наличие, или наоборот, в электронике достаточно часто единице соответствует отсутствие напряжение, нулю его наличие.

История знает попытки создания компьютеров на основе других систем счисления. Например, советский компьютер Сетунь, который использовал троичную систему счисления, или американский Mark I с десятичной системой. Но какого-либо серьезного распространения компьютеры, основанные на системах счисления, отличных от двоичной, не получили.

ЭВМ Сетунь

Системы счисления делятся на позиционные, непозиционные и смешанные:

  • Позиционные системы счисления — системы счисления, в которых значение каждого числового знака (цифры) в записи числа зависит от его позиции (разряда). Например, рассмотрим число 321, 3 — означает количество сотен, 2 — количество десятков, 1 — количество единиц. Так, арабская система счисления, которой все мы пользуемся в повседневной жизни, является десятичной позиционной системой. Обратим внимание на слово «десятичная». В данном примере оно связано с основанием системы счисления, а именно количеством знаков, используемых для записи числа в той или иной системе. В десятичной системе для записи используются цифры 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Основанием является число 10.
  • Смешанные системы счисления, — системы счисления, в которых числа, заданные в некоторой системе счисления с основанием P, изображаются с помощью цифр другой системы счисления с основанием Q, где Q<P. Наиболее известным примером смешанной системы счисления является представление времени в виде количества суток, часов, минут и секунд.
  • Непозиционные системы счисления — системы счисления, в которых величина, обозначаемая цифрой, не зависит от положения в числе. При этом система может накладывать ограничения на положение цифр, например, чтобы они были расположены в порядке убывания. Примерами непозиционных счисления являются римская, египетская и система остаточных классов.

Далее в этой статье речь пойдет только о позиционных системах счисления. Как говорилось выше, в компьютерах применяют двоичную позиционную систему счисления. Для начала давайте разберемся, что такое число и чем оно отличается от цифры. Число используется для счета и выражает количество. Цифры — это набор знаков для записи чисел. В арабской системе счисления цифрами являются знаки 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, в двоичной — 0 и 1. Каждая цифра в записи числа, называется разрядом. В информатике разряд числа считается справа налево, начиная с нуля. При записи в десятичной системе числа 435 цифра 5 является нулевым разрядом, цифра 3 — первым, цифра 4 — вторым разрядом.

Двоичная система счисления имеет основание 2, то есть в ней используется всего две цифры: 0 и 1. Числа ноль и один в десятичной и в двоичной системах выглядят абсолютно одинаково и записываются как 0 и 1 соответственно. А вот цифры 2 в двоичной системе нет, поэтому приходится добавить еще один разряд, число два в двоичной системе будет записываться как 10. Что бы записать число три, надо добавить к двойке единицу, выглядит это так 11. Для записи числа четыре снова надо добавить еще один разряд, в результате получаем 100. Пять записывается как 101 и так далее.

ДесятичнаяДвоичная
11
210
311
4100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
161\,0000
Шестнадцатеричная система счисления

Двоичная система весьма неудобна для восприятия человеком. Например, число 131, записанное в двоичной системе, будет выглядеть как 1000\,0011, а число 14\,732 соответствует записи 1\,1100\,11000\,1100. Для более удобного восприятия человеком числа часто представляют в шестнадцатеричной системе счисления. Переводить числа из одной системы счисления в другую мы научимся позже в этой статье.

Как и в других позиционных системах счисления, принцип записи чисел в шестнадцатеричной системе схож с рассмотренной выше двоичной системой и всем знакомой с детства десятичной. Разница лишь в том, что следующей после цифры 9 идет A (десятичная 10), а новый разряд добавляется после цифры F (десятичная 15). В шестнадцатеричной системе счисления для записи используются следующие цифры:

Десятичная цифраШестнадцатеричная цифра
00
1 1
22
33
44
55
66
77
88
99
10A
11B
12C
13D
14E
15F

Применение именно шестнадцатеричной системы обусловлено легкостью перевода данных в нее из двоичной и обратно, а также наглядностью записи, которая обусловлена тем, что один разряд шестнадцатеричного числа эквивалентен четырем разрядам двоичного числа. То есть байт двоичного кода записывается ровно двумя цифрами шестнадцатеричного числа. Число 131, в двоичной системе выглядит как 1000\,0011, а в шестнадцатеричной 83. Причем четыре старших разряда двоичного числа 1000 записываются шестнадцатиричной 8, а четыре младших разряда двоичного числа 0011 записываются шестнадцатеричным числом 3.

В этой статье мы используем сразу три системы счисления. Не всегда можно понять, какая система счисления применяется для записи числа, если это не указанно явно. Например, цифры 11 могут означать три в двоичной системе, одиннадцать в десятичной и семнадцать в шестнадцатеричной. Во избежание путаницы, в математике принято указывать основание применяемой системы счисления в виде индекса после записанного числа. К примеру, запись 11_2 означает, что применена двоичная система. Если индекс не указан предполагается что применена десятичная система.

При написании программ достаточно часто возникает необходимость указать в какой системе счисления записано число. В языках МЭК это делается с помощью префиксов добавляемых к числу.

ПрефиксСистема счисления
2#двоичная
8# восьмеричная
отсутствуетдесятичная
16# шестнадцатеричная

То есть двоичное число 11_2 в TwinCAT записывается как 2#11.

Восьмеричная система хоть и поддерживается в TwinCAT, но в настоящее время почти не используется. Изложенного выше материала должно быть достаточно для ее понимания.

Перевод чисел из двоичной системы в десятичную и обратно

В сети материала со строгим изложением теоретических выкладок по переводу чисел из одной системы счисления в другую достаточно много. Здесь мы рассмотрим лишь один из удобных на практике способов перевода чисел между различными системами, несильно вдаваясь в теорию этого процесса.

В позиционных системах счисления любое число можно представить в виде x=\displaystyle\sum_{k=0}^{n-1} a_k*b^k где: b — основание системы счисления. a_k — числа, равные цифре, стоящей в разряде k.

Выглядит сложно, но на практике довольно просто, число 483 можно представить в виде:

483= (4*100)+(8*10)+(3*1)= (4*10^2)+(8*10^1)+(3*10^0)

Кстати, именно из-за такой формы записи разряды чисел считают, начиная с нуля, а не с единицы.

Число ​11\,0011_2 (десятичное 51)​ можно представить в виде:

11\,0011_2= 10\,0000_2+1\,0000_2+10_2+1_2= (1*2^5)+(1*2^4)+(1*2^1)+(1*2^0)

Вспомнив, что 1*2^5=32; 1*2^4=16; 1*2^1=2; 1*2^0=1 можно продолжить выражение.

11\,0011_2= (1*2^5)+(1*2^4)+(1*2^1)+(1*2^0)= 32+16+2+1=51

Можно заметить, что достаточно запомнить, какое десятичное значение соответствует каждому двоичному разряду и просуммировать их при переводе.

Номер
разряда
Двоичное
значение
Десятичное
значение
01_21
110_22
2100_24
31000_28
41\,0000_216
510\,0000_232
6100\,0000_264
71000\,0000_2128
81\,0000\,0000_2256

Для перевода из двоичной системы в десятичную и обратно приведенную выше таблицу следует выучить наизусть.

Давайте решим несколько примеров для закрепления:

1001\,0011_2= 1000\,0000_2 + 1\,0000_2 + 10_2 + 1_2 = 128+16+2+1=147

1111\,1000_2 = 1000\,0000_2 + 100\,0000_2 + 10\,0000_2 + 1\,0000_2 + 1000_2 = 128 + 64 + 32 + 16 + 8 = 248

100\,0001_2 = 100\,0000_2 + 1_2 = 64 + 1 = 65

1100\,0000 = 1000\,0000_2 + 100\,0000_2 = 128 + 64 = 192

Перевод из десятичной системы в двоичную производится следующим образом: из десятичного числа вычитается ближайшее меньшее число, из только что выученной нами наизусть таблицы, и записывается соответствующие ему двоичное, после чего действие повторяется с остатком. Когда остатка не осталось, суммируем все записанные двоичные числа.

Приведем пример с числом 147:

  1. Ближайшее меньшее к 147 число из таблицы 128. Записываем 1000\,0000_2. Остатком будет 147 - 128 = 19.
  2. Повторяем действие. Ближайшее к 19 число из таблицы — 16. Пишем 1\,0000_2. Остаток 19 - 16 = 3.
  3. Ближайшее к 3 число 2. Записываем 10_2. Остаток 3 - 2 = 1.
  4. Числу 1 соответствует число 1_2, его и записываем.
  5. В результате предыдущих действий мы получили числа 1000\,0000_2, 1\,0000_2, 10_2, 1_2. После сложения получится 1001\,0011_2.

Как видите, перевод из двоичной системы счисления в десятичную и обратно не составляет большой сложности.

Перевод чисел из двоичной системы в шестнадцатеричную и обратно

В целом порядок перевода в десятичную и в шестнадцатиричную систему схожи. Главное отличие в том, таблица перевода будет повторяться каждые четыре строчки, так как 16=24. Таким образом, выучив всего четыре строчки, вы сможете переводить числа любого размера.

Номер
разряда
Двоичное
значение
Шестнадцатеричное
значение
01_21_{16}
110_22_{16}
2100_24_{16}
31000_28_{16}
41\,0000_210_{16}
510\,0000_220_{16}
6100\,0000_240_{16}
71000\,0000_280_{16}
81\,0000\,0000_2100_{16}

В таблице намеренно показано больше чем четыре строчки, что бы читатели могли увидеть как именно повторяются значения.

Повторим некоторые примеры, которые мы приводили для десятичной системы:

1001\,0011_2= 1000\,0000_2 + 1\,0000_2 + 10_2 + 1_2 = 80_{16}+10_{16}+2_{16}+1_{16}=93_{16}

1111\,1000_2 = 1000\,0000_2 + 100\,0000_2 + 10\,0000_2 + 1\,0000_2 + 1000_2 = 80_{16} + 40_{16} + 20_{16} + 10_{16} + 8_{16} = F8_{16}

Перевод из шестнадцатеричной системы в двоичную производится аналогично переводу из десятичной в двоичную, но проще, так как производится группами по 4 бита. Напомним, из шестнадцатеричного числа вычитается ближайшее меньшее число из таблицы перевода между двоичными и шестнадцатеричными числами, после чего действие повторяется с остатком. После того, как остатка не будет, суммируем все записанные двоичные числа.

Приведем пример с числом 93_{16} (десятичное 147):

  1. Ближайшее меньшее к 93_{16} число из таблицы 80_{16}, записываем 1000\,0000_2. Остатком будет 93_{16}-80_{16} = 13_{16}.
  2. Повторяем действие, ближайшее к 13_{16} число из таблицы — 10_{16}, записываем 1 0000_2. Остаток 13_{16}-10_{16} = 3_{16}.
  3. Ближайшее к 3_{16} число — 2_{16}, записываем 10_2. Остаток 3_{16}-2_{16} = 1_{16}.
  4. Числу 1_{16} соответствует число 1_2, его и записываем.
  5. В результате предыдущих действий мы получили числа 1000\,0000_2, 1\,0000_2, 10_2, 1_2. После сложения получится 1001\,0011_2.

Еще один простой способ перевода чисел между системами счисления – это использование стандартного калькулятора в Windows (предварительно необходимо переключить в режим «Программист»).

Переключение калькулятора в режим «Программист»

Хотя такой способ может показаться соблазнительным, но стоит научиться переводить в уме числа хотя бы до одного байта (как читатель теперь уже может убедиться самостоятельно, в один байт можно записать числа в диапазоне от 0 до 255). С приобретением практики это станет не сложнее умножения двузначных чисел.