Клуб "Трёх инженеров"
 

Email:

Пароль:

Забыли пароль?

Вступить в клуб?

Микроконтроллеры AVR

MS Visual Studio & C#

MODBUS-RTU & RS485

SolidWorks & Cosmos

Компьютерная техника

Мехатроника & Авиация

Силовая электроника

Всего статей:

Категорий/рубрик:

Комментариев:

Пользователей:

33

7

239

2029

 
видео прикол из Городка
Шах и мат
Для корректного отображения этого элемента вам необходимо установить FlashPlayer и включить в браузере Java Script.

Программа для управления частотным преобразователем PM-S540 фирмы LG c компьютера

Автор: Рудаков Г. В.

Дата: 2010-01-05


На практике большинство частотных приводов оснащены коммуникационной платой ModBus-RTU (рисунок 1), которая позволяет посредством стандарта передачи данных по двухпроводному полудуплексному многоточечному последовательному каналу связи, RS485, с применением конвертора интерфейса USB/RS485, передавать на ПК большое количество данных.

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

Электроника ЧП LG PM-S540

Рисунок 1 – Электроника ЧП LG PM-S540. Плата связи MODBUS-RTU.

Для получения информации с частотного преобразователя, необходима коммутационная программа, которая умела обращаться к регистрам, считывая и записывая их состояние. На рисунке 2 представлен общий вид программы. За основу был взят код библиотеки с сайта http://www.codeproject.com/

Окно программы

Рисунок 2 – Окно программы "Modbus Poll for LG PM-S540".

Программа работает следующим образом:

  1. Производим настройки связи, выбираем адрес ведомого устройства и устанавливаем связь кнопкой "Соединиться".

  2. Выбираем требуемое действие: чтение или запись регистра, выбираем имя регистра из списка (его адрес автоматически появится в строке состояния) и нажимаем кнопку "Выполнить".

  3. Результат операции чтения регистра отобразится в ListBox.

Рассмотрим исходный код основных функций библиотеки modbus.cs.

Функция создания сообщения

  1. private void BuildMessage(byte address, byte type, ushort start, ushort registers, ref byte[] message)

  2. {

  3. //Array to receive CRC bytes:

  4. byte[] CRC = new byte[2];

  5. message[0] = address;

  6. message[1] = type;

  7. message[2] = (byte)(start >> 8);

  8. message[3] = (byte)start;

  9. message[4] = (byte)(registers >> 8);

  10. message[5] = (byte)registers;

  11. GetCRC(message, ref CRC);

  12. message[message.Length - 2] = CRC[0];

  13. message[message.Length - 1] = CRC[1];

  14. }

Функция чтения нескольких регистров

  1. public bool SendFc3(byte address, ushort start, ushort registers, ref short[] values)

  2. {

  3. if (sp.IsOpen)

  4. {

  5. //Очищаем входной и выходной буфера:

  6. sp.DiscardOutBuffer();

  7. sp.DiscardInBuffer();

  8. //Function 3 request is always 8 bytes:

  9. byte[] message = new byte[8];

  10. //Function 3 response buffer:

  11. byte[] response = new byte[5 + 2 * registers];

  12. //Build outgoing modbus message:

  13. BuildMessage(address, (byte)3, start, registers, ref message);

  14. //Send modbus message to Serial Port:

  15. try

  16. {

  17. sp.Write(message, 0, message.Length);

  18. GetResponse(ref response);

  19. }

  20. catch (Exception err)

  21. {

  22. modbusStatus = "Ошибка при чтении: " + err.Message;

  23. return false;

  24. }

  25. //Evaluate message:

  26. if (CheckResponse(response))

  27. {

  28. //Return requested register values:

  29. for (int i = 0; i < (response.Length - 5) / 2; i++)

  30. {

  31. values[i] = response[2 * i + 3];

  32. values[i] <<= 8;

  33. values[i] += response[2 * i + 4];

  34. }

  35. modbusStatus = "Чтение выполнено!";

  36. return true;

  37. }

  38. else

  39. {

  40. modbusStatus = "Ошибка CRC";

  41. return false;

  42. }

  43. }

  44. else

  45. {

  46. modbusStatus = "Порт связи закрыт!";

  47. return false;

  48. }

  49. }

  50. #endregion

Функция записи нескольких регистров

  1. public bool SendFc16(byte address, ushort start, ushort registers, short[] values)

  2. {

  3. if (sp.IsOpen)

  4. {

  5. //Clear in/out buffers:

  6. sp.DiscardOutBuffer();

  7. sp.DiscardInBuffer();

  8. //Message is 1 addr + 1 fcn + 2 start + 2 reg + 1 count + 2 * reg vals + 2 CRC

  9. byte[] message = new byte[9 + 2 * registers];

  10. //Function 16 response is fixed at 8 bytes

  11. byte[] response = new byte[8];

  12. //Add bytecount to message:

  13. message[6] = (byte)(registers * 2);

  14. //Put write values into message prior to sending:

  15. for (int i = 0; i < registers; i++)

  16. {

  17. message[7 + 2 * i] = (byte)(values[i] >> 8);

  18. message[8 + 2 * i] = (byte)(values[i]);

  19. }

  20. //Build outgoing message:

  21. BuildMessage(address, (byte)16, start, registers, ref message);

  22. //Send Modbus message to Serial Port:

  23. try

  24. {

  25. sp.Write(message, 0, message.Length);

  26. GetResponse(ref response);

  27. }

  28. catch (Exception err)

  29. {

  30. modbusStatus = "Ошибка при записи: " + err.Message;

  31. return false;

  32. }

  33. //Evaluate message:

  34. if (CheckResponse(response))

  35. {

  36. modbusStatus = "Запись выполнена!";

  37. return true;

  38. }

  39. else

  40. {

  41. modbusStatus = "Ошибка CRC";

  42. return false;

  43. }

  44. }

  45. else

  46. {

  47. modbusStatus = "Порт связи закрыт!";

  48. return false;

  49. }

  50. }

  51. #endregion

В ходе теста выяcилось, что имя регистра по даташиту, сооветсвенно и в программе, может быть со смешением относительно физического адреса. Величина этого смещения определялась опытным путем, и, похоже, зависит от версии программного обеспечения ЧП.

P.S. Полный код программы представлен в архиве..

Необходимо зарегистрироваться чтобы прочитать текст

Рейтинг:

Просмотров: 60765

Комментарии:

Автор: Гришаня Рудаков (2010-04-21, 21:55)

Программной тишины нет. Предположу, что ответственность за ней лежит на конверторе USB/RS-485.. [Ответить]

Автор: ArtIg (2010-04-19, 16:02)

Доброго времени суток. А как в программе отслеживается оговоренный в протоколе MODBUS RTU интервал тишины продолжительностью не менее 3.5 символов? Или такого контроля у Вас нет? Спасибо. [Ответить]

Гости не имеют права добавлять комментарии и проставлять рейтинг.