Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Прикладной уровень



Прикладной уровень Modbus основан на запросах с помощью кодов функций. Код функции указывает ведомому устройству, какую операцию оно должно выполнить. При использовании протокола прикладного уровня с различными протоколами транспортного и канального уровня сохраняется неизменным основной блок Modbus- сообщения, включающий код функции и данные (этот блок называется PDU – protocol data unit – элемент данных протокола). К блоку PDU могут добавляться дополнительные поля при использовании его в различных промышленных сетях, и тогда он называется ADU – application data unit – элемент данных приложения.

Стандартом Modbus предусмотрены три категории кодов функций: установленные стандартом, задаваемые пользователем и зарезервированные.

Коды функций являются числами в диапазоне от 1 до 127, причём коды в диапазоне от 65 до 72 и от 100 до 110 относятся к задаваемым пользователем функциям. Коды в диапазоне от 128 до 255 зарезервированы для пересылки кодов ошибок в ответном сообщении. Код 0 не используется.

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

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

Если ведомое устройство нормально выполнило принятую от ведущего функцию, то в ответе поле «Код функции» содержит ту же информацию, что и в запросе. В противном случае ведомый выдаёт код ошибки. В случае ошибки код функции в ответе равен коду функции в запросе, увеличенному на 128.

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

Перечень используемых функций протокола ModBus/RTU приведены в таблице 2. Весь перечень функций приведен в MODBUS Application Protocol Specification V1.1b3.

Таблица 2 – Перечень используемых функций протокола ModBus/RTU

Тип адресации Описание функции Код функции (hex)
Битовая адресация Чтение дискретных входов 0x2
Чтение состояния релейных выходов 0x1
Запись состояния одного релейного выхода 0x5
Запись состояния нескольких релейных выходов 0xF
16-битная адресация Чтение регистров данных 0x4
Чтение регистров параметров 0x3
Запись одного регистра параметров 0x6
Запись одного нескольких регистров параметров 0x10
Работа с файловыми записями Чтение данных файла 0x14
Запись данных файла 0x15
Диагностические данные Чтение ID (серийного номера) 0x11

Коды ошибок:

0x1 – ошибка функции

0x2 – ошибка адреса данных

0x3 – ошибка значения данных

0x4 – ошибка обработки данных устройством

0x8 – ошибка четности данных файла (для функций 0x14, 0x15)


Работа с последовательным портом в среде Visual Studio C#

В среде.Net 2.0 (и в более поздних версиях.NET) компания Microsoft добавила поддержку последовательного порта включением класса SerialPort как части пространства имен System.IO.Ports. Пространство имен System.IO.Ports содержит классы для управления последовательными портами. Наиболее важный класс SerialPort предоставляет средства для синхронного и управляемого событиями ввода-вывода, доступа к состоянию подключения-отключения устройства, а также для доступа к свойствам драйвера последовательного порта.

Чтобы создать экземпляр класса SerialPort class, необходимо передать опции SerialPort конструктору класса:

// Все опции для последовательного устройства

// ---- могут быть отправлены через конструктор класса SerialPort

// ---- PortName = "COM4", Baud Rate = 9600, Parity = None,

// ---- Data Bits = 8, Stop Bits = One, Handshake = None

SerialPort _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);

_serialPort.Handshake = Handshake.None;

// Открытие последовательного порта

_serialPort.Open();

//Считываение из входного буфера SerialPort определенного число байтов и их запись в //байтовый массив, начиная с указанной позиции.

_serialPort.Read(_messageReceived, 0, 8);

//Запись указанного числа байтов в последовательный порт, используя данные из буфера.

_serialPort.Write(messageToSend, 0, messageToSend.Length);

Формирование ответного сообщения Мастеру происходит в функции createRespondMessage, эта функция имеет вид:

private byte[] createRespondMessage()

{

int numberOfPoints = 0;

int bytesToSend = 0;

int startAddress = 0;

numberOfPoints = (_messageReceived[4] << 8) | _messageReceived[5];

bytesToSend = 5 * numberOfPoints + 2;

byte[] respondMessage = new byte[bytesToSend];

respondMessage[0] = _slaveAddress;

respondMessage[1] = 3;

respondMessage[2] = Convert.ToByte(2 * numberOfPoints);

startAddress = (_messageReceived[2] << 8) | _messageReceived[3];

int j = 0;

for (int i = 0; i < numberOfPoints; i++)

{

respondMessage[i + j + 3] = Convert.ToByte((_registerData[startAddress + i] >> 8)& 0xff);

respondMessage[i + j + 4] = Convert.ToByte(_registerData[startAddress + i] & 0xff);

j++;

}

byte[] crcCalculation = CRCStuff.calculateCRC(ref respondMessage, bytesToSend - 2);

respondMessage[bytesToSend - 2] = crcCalculation[0];

respondMessage[bytesToSend - 1] = crcCalculation[1];

return respondMessage;

}





Дата публикования: 2015-07-22; Прочитано: 939 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...