Gazmarket59.ru

Газ Маркет 59
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Младший байт счетчика команд

Ассемблер в 2k21: кто и зачем продолжает писать на машинно-ориентированном языке

Жизнь слишком коротка, чтобы кодить на ассемблере. И всё же в некоторых задачах он до сих пор незаменим.

В этом году ассемблер ворвался в топ-10 языков программирования по версии TIOBE, а значит, старичка ещё рано отправлять на пенсию. Мы пообщались с разработчиками, которые пишут код на ассемблере, а ещё изучили мнения зарубежных девелоперов на Quora и Stack Overflow.

Зачем нам нужен порядок байтов

Несмотря на сатирическую трактовку Коэном борьбы «big endians» (прямого порядка, от старшего к младшему) против «little endians» (обратного порядка, от младшего к старшему), вопрос о порядке байтов на самом деле очень важен для нашей работы с данными.

Блок цифровой информации – это последовательность единиц и нулей. Эти единицы и нули начинаются с наименьшего значащего бита (least significant bit, LSb – обратите на строчную букву «b») и заканчиваются на наибольшем значащем бите (most significant bit, MSb).

Это кажется достаточно простым; рассмотрим следующий гипотетический сценарий.

32-разрядный процессор готов к сохранению данных и, следовательно, передает 32 бита данных в соответствующие 32 блока памяти. Этим 32 блокам памяти совместно назначается адрес, скажем 0x01. Шина данных в системе спроектирована таким образом, что нет возможности смешивать LSb с MSb, и все операции используют 32-битные данные, даже если соответствующие числа могут быть легко представлены в 16 или даже 8 битами. Когда процессору требуется получить доступ к сохраненным данным, он просто считывает 32 бита с адреса памяти 0x01. Эта система является надежной, и нет необходимости вводить понятие порядка байтов.

Возможно, вы заметили, что слово «байт» в описании этого гипотетического процессора нигде не упоминалось. Всё основано на 32-битных данных – зачем нужно делить эти данные на 8-битные части, если всё оборудование предназначено для обработки 32-битных данных? Вот здесь-то теория и реальность расходятся. Реальные цифровые системы, даже те, которые могут напрямую обрабатывать 32-битные или 64-битные данные, широко использую 8-битный сегмент данных, известный как байт.

УСЛОВНЫЕ КОМАНДЫ

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

Команды JE, JNE, JA, JB, . (и т.д.) — условная передача управления (переход, если условие удовлетворяется).

Команды SETE, SETNE, SETA, SETB, . (и т.д.) — установка байта по условию.

Команды LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ — переход для повторения цикла.

Команды JCXZ, JECXZ — переход, если значение счетчика равно нулю.

Команды условной передачи управления

Если условие истинно (TRUE), то происходит переход по указанному адресу, иначе (FALSE) переход не происходит и выполняется следующая по порядку команда.

Для перехода задается относительный адрес, то есть, смещение относительно адреса команды, следующей после данной команды. Задаваемый на ассемблере адрес может иметь тип SHORT или тип NEAR. Адрес типа SHORT кодируется в команде всего одним байтом. Поэтому для адреса типа SHORT переход может быть только в пределах . Адрес типа NEAR кодируется двумя байтами в режиме 16 бит и четырьмя байтами в режиме 32 бита.

Всего есть 16 разных условий, им соответствует 16 разных кодов команд на уровне процессора. Но на уровне языка ассемблера эти условия превращаются в 30 разных команд. Таким образом, одна и та же команда процессора может иметь разные имена (синонимы) на языке ассемблера.

Кодирование


Команда (asm)Тип адресаКодФормат
J(cond)SHORT70 +cond—-cond addr(1)
J(cond)NEAR0F 80 +cond—-cond addr(2/4)

Примечание. Код условия (cond) может иметь значение от 0 до F (hex).

Условия при сравнении чисел без знака


Код
(cond)
Команда
(asm)
Флажки
Условие
(eng)
Условие
(рус)
0100JEZF=1if equalесли равно
0101JNEZF=0if not equalесли не равно
0010
JB
/JNAE
CF=1
if below
/not above or equal
если меньше
/не больше или равно
0011
JAE
/JNB
CF=0
if above or equal
/not below
если больше или равно
/не меньше
0110
JBE
/JNA
CF=1
or ZF=1
if below or equal
/not above
если меньше или равно
/не больше
0111
JA
/JNBE
CF=0
and ZF=0
if above
/not below or equal
если больше
/не меньше или равно
Читайте так же:
До какого числа надо поставить счетчики

Условия при сравнении чисел со знаком


Код
(cond)
Команда
(asm)
Флажки
Условие
(eng)
Условие
(рус)
0100JEZF=1if equalесли равно
0101JNEZF=0if not equalесли не равно
1100
JL
/JNGE
SF!=OF
if less
/not greater or equal
если меньше
/не больше или равно
1101
JGE
/JNL
SF=OF
if greater or equal
/not less
если больше или равно
/не меньше
1110
JLE
/JNG
ZF=1
or SF!=OF
if less or equal
/not greater
если меньше или равно
/не больше
1111
JG
/JNLE
ZF=0
or SF=OF
if greater
/not less or equal
если больше
/не меньше или равно

Условия по отдельным флажкам


Код
(cond)
Команда
(asm)
Флажки
Условие
(eng)
Условие
(рус)
0100JZZF=1if zeroесли есть флаг нуля
0101JNZZF=0if not zeroесли нет флага нуля
1000JSSF=1if signесли есть флаг знака
1001JNSSF=0if not signесли нет флага знака
0010JCCF=1if carryесли есть флаг переноса
0011JNCCF=0if not carryесли нет флага переноса
0000JOOF=1if overflowесли есть флаг переполнения
0001JNOOF=0if not overflowесли нет флага переполнения
1010
JP
/JPE
PF=1
if parity
/parity even
если есть флаг четности
/четный
1011
JNP
/JPO
PF=0
if not parity
/parity odd
если нет флага четности
/нечетный

Все условия, упорядоченные по кодам (cond)
и соответствующие коды операций

В этой таблице показаны также и соответствующие коды операций для команд с адресом типа SHORT и для команд с адресом типа NEAR.

Код для
SHORT
Код для
NEAR
Код
(cond)
Команда
(asm)
Флажки
700F 800000JOOF=1
710F 810001JNOOF=0
720F 820010JB/JNAE/JCCF=1
730F 830011JAE/JNB/JNCCF=0
740F 840100JE/JZZF=1
750F 850101JNE/JNZZF=0
760F 860110JBE/JNACF=1 or ZF=1
770F 870111JA/JNBECF=0 and ZF=0
780F 881000JSSF=1
790F 891001JNSSF=0
7A0F 8A1010JP/JPEPF=1
7B0F 8B1011JNP/JPOPF=0
7C0F 8C1100JL/JNGESF!=OF
7D0F 8D1101JGE/JNLSF=OF
7E0F 8E1110JLE/JNGZF=1 or SF!=OF
7F0F 8F1111JG/JNLEZF=0 or SF=OF

Команда на языке ассемблера


ФорматыПримеры
J(cond) label
JNBELab02
JZSHORT metka
JCNEAR met44

Команды установки байта по условию

SETE, SETNE, SETA, SETB, .

В команде установки байта SET(cond) используется тот же самый набор из 16 условий, что и в команде условной передачи управления J(cond) . И в мнемонике на языке ассемблера эти условия представляются такими же 30-ю способами.

На языке ассемблера команда имеет один операнд. Это может быть либо 8-битный регистр, либо адрес в памяти.

Команда заносит в байт, указанный в операнде, значение 1, если условие выполняется (TRUE), и значение 0 в противном случае (FALSE).

Кодирование


Команда (asm)КодФормат
SET(cond)0F 90 +cond /000—-cond NNN

Примечания.
1. Код условия (cond) может иметь значение от 0 до F (hex).
2. В байте (mod,reg,r/m) трехбитное поле reg должно быть равно 000.

Команда на языке ассемблера


ФорматыПримеры
SET(cond) reg8
SETZAL
SETNAEDH
SET(cond) mem8
SETNGEname
SETOBYTE PTR [BX]
SETCarray [EDI]

Команда перехода для повторения цикла

LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ

Эти команды используются для управления циклом со счетчиком в регистре CX (или в регистре ECX ).

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

Если атрибут размера адреса равен 16 битам, то счетчиком служит регистр CX , если этот атрибут равен 32 битам, то регистр ECX .

Читайте так же:
Можно ли менять счетчик по воде самому

Если условия (см. в таблице ниже) выполняются, то происходит переход по указанному адресу.

В условиях, кроме значения счетчика, учитывается еще и флажок нуля. Значение флажков вырабатываются командами, предшествующими команде LOOP.

Для перехода задается адрес типа SHORT, то есть, относительный адрес из одного байта. Поэтому переход может быть в пределах от (-128) до (+127) относительно адреса команды, следующей после команды LOOP.

Кодирование

См. в таблице ниже.

Команда перехода по счетчику

Переход по указанному адресу происходит в том случае, если значение счетчика равно нулю. Счетчиком служит регистр CX , если установлен режим 16 бит, или регистр ECX , если режим 32 бита.

Для перехода задается адрес типа SHORT, то есть, относительный адрес из одного байта. Поэтому переход может быть в пределах от (-128) до (+127) относительно адреса команды, следующей после команды JCXZ.

Данная команда не изменяет содержимое регистра CX (или ECX ) и не изменяет флажки.

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

Сложение с использованием флага переноса

Для вывода символа на экран мы использовали функцию 02h прерывания INT 21h. При этом, в регистре DL мы указывали ASCII код символа. Вывод на экран двоичного числа сводится к последовательной печати символов «0» и «1». Эти символы имеют коды: «0» — 30h, «1» — 31h

При циклическом сдвиге RCL все биты числа (от старшего до младшего) проходят через флаг переноса. Выполняя сложение CF + 30h мы получим код символа «0» или «1» (в зависимости от значения CF):

Инструкция ADC (Add with Carry) выполняет сложение двух чисел, и добавляет к сумме бит CF. Например, для суммы DL + 30h + CF, мнемокод инструкции выглядит так:

Результат сложения попадает в регистр DL. Если до выполнения инструкции регистр DL = 0, то после суммирования в DL появится код символа «0» или «1» (30h или 31h).

Обобщив все идеи, мы получаем алгоритм вывода на экран старшего бита числа:

  1. сдвигаем число влево на один бит;
  2. преобразуем флаг переноса в код символа;
  3. выводим символ на экран.

Если этот алгоритм повторить 8 раз (для байта) или 16 раз (для слова), то на экране появится цепочка нулей и единиц, соответствующая двоичному представлению заданного числа.

  1. pack() в Perl
  2. DAV’s Endian FAQ (недоступная ссылка — история)
  3. Danny Cohen.On Holy Wars and a Plea for Peace (англ.) (1 апреля 1980). Архивировано из первоисточника 15 февраля 2012.Проверено 24 января 2010.
  4. Таненбаум Э. Архитектура компьютера. — 5-е изд. — СПб. : Питер, 2007. — 844 с. — С. 89.
  • Сетевой порядок байтов, функции htons(), htonl(), ntohs(), ntohl()
  • Порядок байтов
  • Порядок байтов

Wikimedia Foundation . 2010 .

  • Метод максимального правдоподобия
  • Остров Норфолк

Полезное

Смотреть что такое «Порядок байтов» в других словарях:

обратный порядок байтов — Способ хранения и обмена данными в сети, при котором сначала передается самый младший байт, а затем остальные в порядке, обратном их размещению в блоке данных. [Л.М. Невдяев. Телекоммуникационные технологии. Англо русский толковый словарь… … Справочник технического переводчика

прямой порядок байтов — Способ хранения и обмена данными в сети, при котором сначала передается самый старший байт, а затем остальные в порядке их размещения в блоке данных. Ср. little . [Л.М. Невдяев. Телекоммуникационные технологии. Англо русский толковый словарь… … Справочник технического переводчика

Порядок байт — Порядок байтов в информатике метод записи байтов многобайтовых чисел. В общем случае, когда нужно компактно записать число, большее 255 (28 − 1 = 255 максимальное целое число, записываемое одним байтом (октетом)) необходимо использовать… … Википедия

порядок следования байтов — Под этим термином понимается порядок хранения байтов в машинном слове (или двойном слове). Порядок может быть «прямым» (т.е. 32 битовое число хранится так 0x12345678) и тогда говорят «big endianness» (на отечественном жаргоне… … Справочник технического переводчика

Читайте так же:
Первая поверка счетчика с даты выпуска или установки

прямой порядок (следования) байтов — Формат для хранения и передачи двоичных данных, при которой старший (наиболее значимый бит (или байт) передается сначала. Обратное преобразование называется little endian. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN … Справочник технического переводчика

UTF-16 — (англ. Unicode Transformation Format) в информатике один из способов кодирования символов из Unicode в виде последовательности 16 битных слов. Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и… … Википедия

UCS-4 — Юникод, или Уникод (англ. Unicode) стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков. Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium,… … Википедия

UNICODE — Юникод, или Уникод (англ. Unicode) стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков. Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium,… … Википедия

UTF-32LE — Юникод, или Уникод (англ. Unicode) стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков. Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium,… … Википедия

UTF-32 Little Endian — Юникод, или Уникод (англ. Unicode) стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков. Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium,… … Википедия

Протокол Modbus

  • 1 Основные понятия
  • 2 Структуры данных Modbus
  • 3 Модель данных Modbus
  • 4 Адреса и номера регистров
  • 5 Коды функций чтения и записи регистров
  • 6 Формат данных запросов и ответов Modbus
  • 7 Коды исключений (ошибки) Modbus
  • 8 Вычисление контрольной суммы Modbus

Основные понятия

Modbus — это протокол прикладного (седьмого) уровня модели OSI, он служит для обмена данными, чаще всего между устройствами автоматизации и реализован в виде «протокола ответов на запросы (request-reply protocol)».

В устройствах Wirenboard данные Modbus передаются по последовательным линиям связи RS-485. В последовательных линиях связи протокол RS-485 полудуплексный и работает по принципу «клиент-сервер». Каждое устройство в сети (кроме ведущего см. далее) имеет адрес от 1 до 247, адрес 0 используется для широковещательной передачи данных всем устройствам, а адреса 248–255 считаются зарезервированными согласно спецификации Modbus, их использование не рекомендуется.

Существует две спецификации протокола: Modbus RTU и Modbus ASCII. В Modbus RTU передается 11-битный символ, состоящий из 1 стартового бита, 8 бит данных (начиная с младшего бита), бит четности (необязателен) и 2 стоповых бита, если бит четности не передается, или 1 стоповый бит, если бит четности передается. Такой символ позволяет передать 1 байт данных. В устройствах Wiren Board бит контроля четности не передается и используется 2 стоповых бита. В Modbus ASCII каждый байт передается двумя символами, представляющими ASCII-коды младшей и старшей четырехбитной группы байта (пример). Modbus RTU позволяет передавать больше информации при той же скорости последовательной линии и в устройствах Wiren Board используется именно он. Все дальнейшее описание относится к Modbus RTU.

Ведущее устройство («мастер», или «клиент») периодически опрашивает «ведомое», или «сервер». Ведущее устройство не имеет адреса, передача сообщений от устройства-сервера ведущему без запроса ведущего в протоколе не предусмотрена.

Пакет данных Modbus выглядит, как это показано на рисунке. PDU (Protocol Data Unit) — общая часть пакета MODBUS, включающая код функции и данные пакета. ADU (Application Data Unit) — полный пакет MODBUS. Включает в себя специфичную для физического уровня часть пакета и PDU. Для последовательных линий в заголовке ADU передается адрес устройства, а в конце — контрольная сумма CRC16. Максимальный размер ADU в последовательных коммуникационных линиях составляет 253 байта (из максимальных, разрешенных спецификацией 256 байт вычитается 1 байт адреса и два байта контрольной суммы). Для справки — в Modbus TCP максимальная длина пакета составляет 260 байт.

Функция кодируется одним байтом и определяет, какое действие должно выполнить устройство-сервер. Значение кодов функций лежат в диапазоне от 1 до 255, причем коды от 128 до 255 зарезервированы для сообщений об ошибках со стороны устройства-сервера. Код 0 не используется. Размер блока данных может варьироваться от нуля до максимально допустимого. Если обработка запроса прошла без ошибок, то устройство-сервер возвращает пакет ADU, содержащий запрошенные данные.

Читайте так же:
Как подключит счетчик меркурий 200

При возникновении ошибки устройством возвращается код ошибки. В случае обычной транзакции код функции в ответе возвращается без изменений; в случае ошибки старший бит кода функции устанавливается в единицу (то есть код функции + 0x80)

Стоит определить таймаут ожидания ответа от ведомого устройства — бессмысленно долго ждать ответ, который, возможно, из-за какой-то ошибки никогда и не придет.

Структуры данных Modbus

В Modbus принято кодировать адреса и данные в формате big-endian, то есть в формате, когда байты следуют, начиная со старшего: например, при передаче шестнадцатеричного числа 0x1234 сначала устройством будет принят байт 0x12, а затем — 0x34. Для передачи данных другого типа, например, чисел с плавающей запятой (float), текстовых строк, даты и времени суток и т.п. производитель может выбрать свой собственный способ кодирования — для расшифровки получаемых данных важно ознакомится со спецификацией производителя устройства.

Модель данных Modbus

Обмен данными с Modbus-устройствами происходит через регистры. В протоколе Modbus определяется четыре типа регистров, показанных в таблице:

ТаблицаРазмерДоступ
Регистры флагов (Coils)1 битчтение и запись
Дискретные входы (Discrete Inputs)1 биттолько чтение
Регистры хранения (Holding Registers)16-битное словочтение и запись
Регистры ввода (Input Registers)16-битное словотолько чтение

Регистры флагов (Coils) хранят однобитные значения — то есть могут находится в состоянии 0 или 1. Такие регистры могут обозначать текущее состояние выхода (включено реле). Название «coil» буквально и означает обмотку-актюатор электромеханического реле. Регистры флагов допускают как чтение, так и запись.

Дискретные входы (Discrete Inputs) также являются однобитными регистрами, описывающими состояние входа устройства (например подано напряжение — 1). Эти регистры поддерживают только чтение.

Регистры хранения (Holding Registers) и регистры ввода (Input Registers) представлены двухбайтовым словом и могут хранить значения от 0 до 65535 (0x0000 — 0xFFFF). Регистры ввода допускают только чтение (например, текущее значение температуры). Регистры хранения поддерживают как чтение, так и запись (для хранения настроек). В настоящее время во многих устройствах, в частности в устройствах Wiren Board, эти регистры не разделяются. Команды на чтение регистра хранения N и регистра ввода N обратятся к одному и тому же значению в адресном пространстве устройства.

Адреса и номера регистров

В стандарте Modbus для каждого из четырех типов регистров используются разные таблицы с номерами 0,1,3,4. Таким образом, регистр определенного типа с определенным номером (иначе его называют физическим адресом) имеет свой адрес в соответствующей таблице.

ТаблицаНомер таблицыНачальный логический адресНомер регистра (физический адрес)Диапазон логических адресов
Регистры флагов (Coils)000001000001 — 065535
Дискретные входы (Discrete Inputs)1100001100001 — 165535
Регистры хранения (Holding Registers)3300001300001 — 365535
Регистры ввода (Input Registers)4400001400001 — 465535

Это вносит некоторую путаницу в понимание, по какому же адресу обратиться к регистру с нужным номером. Более того, понятия «адрес» и «регистр» могут применяться производителем произвольно. Чаще всего указываются номера регистров, как, например для устройств Wiren Board. В некоторых устройствах применяются более короткие логические адреса (.0001 — .9999), и для адреса используется 5, а не 6 цифр.

Иногда в описаниях устройства указываются только логические адреса. Например, coil-регистр 0 имеет адрес 000001, регистр ввода 4 — 400005 и т.д.

В готовых шаблонах устройств контроллера Wiren Board 5 есть шаблон для однофазного счетчика электроэнергии SDM220 (/usr/share/wb-mqtt-serial/templates/config-sdm220.json). В документации от производителя «Eastron SDM 220 Modbus Smart Meter Modbus Protocol Implementation V1.0» перечислены регистры и соответствующие им измеряемые параметры, например:

Address (Register)DescriptionUnitsModbus Protocol Start Address Hex (Hi Byte Lo Byte)
30001Line to neutral volts.Volts00 00
30007Current.Amps.00 06
30013Active powerWhatts00 0C
30019Apparent powerVoltAmps00 12
.... .

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

Коды функций чтения и записи регистров

В следующей таблице приведены наиболее распространенные коды функций Modbus:

Код функцииHEXНазваниеДействие
10x01Read CoilsЧтение значений нескольких регистров флагов
20x02Read Discrete InputsЧтение значений нескольких дискретных входов
30x03Read Holding RegistersЧтение значений нескольких регистров хранения
40x04Read Input RegistersЧтение значений нескольких регистров ввода
50x05Write Single CoilЗапись одного регистра флагов
60x06Write Single RegisterЗапись одного регистра (ввода или хранения)
150x0FWrite Multiple CoilsЗапись нескольких регистров флагов
160x10Write Multiple RegisterЗапись нескольких регистров (ввода или хранения)
Читайте так же:
Во все ли дома поставят общедомовые счетчики

Команды условно можно разделить по типам: чтение значений — запись значений; операция с одним значением — операция с несколькими значениями.

Формат данных запросов и ответов Modbus

Рассмотрим подробнее, как происходит обмен данными между устройством-клиентом, отправляющим запрос, и устройством-сервером, отвечающим ему. На следующем рисунке показан обмен данными контроллера с устройством с адресом 0x01. Мы хотим прочесть 8 coil-регистров, начиная с первого.

В качестве данных мы получили шестнадцатеричное число 0x2D, то есть состояние восьми coil-регистров в двоичном виде такое: 0b10110100.

В следующей таблице приведены структуры данных запросов и ответов для основных функций Modbus.

Коды исключений (ошибки) Modbus

В случае, если запрос не может по той или иной причине быть обработан устройством-сервером, то в ответ он отправляет сообщение об ошибке. Соообщение об ошибке содержит адрес Modbus-устройства, код функции, при выполнении которой произошла ошибка, увеличенный на 0x80, код ошибки и контрольную сумму:

В этом случае мы попытались обратиться к несуществующему адресу регистра 0xFFFF и попытались прочесть 8 регистров флагов. В результате мы получили код ошибки 0x03 — «В поле данных передано неверное значение».

Наиболее распространенные коды ошибок Modbus приведены в следующей таблице:

Код ошибкиНазвание ошибкиЧто означает
1Illegal FunctionВ запросе был передан недопустимый код функции
2Illegal Data AddressУказанный в запросе адрес не существует
3Illegal Data ValueВ поле данных передано неверное значение
4Slave Device FailureПроизошла невосстановимая ошибка на устройстве при выполнении запрошенной операции
5AcknowledgeЗапрос принят, выполняется, но выполнение потребует много времени; необходимо увеличить таймаут.
6Slave Device BusyУстройство занято обработкой предыдущего запроса.
7Negative AcknowledgeУстройство не может выполнить запрос, необходимо получить от устройства дополнительную диагностическую информацию. Возможно, требуется тех. обслуживание.
8Memory Parity ErrorОшибка четности при обращении к внутренней памяти устройства.

Вычисление контрольной суммы Modbus

Для протокола Modbus RTU 16-битная контрольная сумма (CRC) вычисляется по алгоритму, описанному в спецификации Modbus, в документе «Modbus Serial Line Protocol and Implementation Guide», раздел «CRC-generation». Передающее устройство формирует два байта контрольной суммы на основе данных сообщения, а принимающее устройство заново вычисляет контрольную сумму и сравнивает с полученной. Совпадение принятой и вычисленной контрольной суммы Modbud RTU считается индикатором успешного обмена данными.

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

Коды ошибок

Вместо корректного ответа, содержащего запрошенные данные, ведомое устройство может переслать ответ с ошибкой. При этом к коду функции в ответе добавляется код 0×80 в формате hex, то есть в данном случае к коду функции 03 добавляется 80 и признак ошибки будет иметь значение 83.

Кроме того отсылается код ошибки:

  • 01 — функция не поддерживается. Это значит, что, возможно, функция не стандартная или просто не реализована конкретно в этом устройстве.
  • 02 — запрошенная область памяти не доступна. Каждое устройство содержит определённое количество данных определённого типа. Например, в устройстве доступно 100 регистров общего назначения. Если при этом запросить чтение 101 регистров, то возникнет ошибка 02.
  • 03 — функция не поддерживает запрошенное количество данных. Например, функция Read Holding Registers позволяет считывать от 1 до 2000 регистров общего назначения. Поэтому, даже если в подчинённом устройстве доступно для чтения 10 000 регистров, при запросе более 2000 с помощью данной функции возникает эта ошибка.
  • 04 — функция выполнена с ошибкой. Этот код отсылается в случае, если ошибка не относится к трем предыдущим кодам.
голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector