Эмулятор устройства Modbus | ПЛК и АСУТП

Что делать, если разрабатываешь программу оператора на СКАДА а под рукой нет устройства (ПЛК, ПР, датчика) с которым программа должна обмениваться данным по протоколу Modbus? Или если разрабатываешь программу для ПЛК а нет модулей ввода/вывода, обмен данными с которыми, опять же, идет по Modbus?

Именно такая проблема недавно возникла у меня при разработке программы на СКАДА Trace Mode 6- нужно было обеспечить вывод на ПК оператора данных по протоколу Модбас от 30 ПИД-регуляторов МИК-21-05, но у меня под рукой не было ни одного.

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

И, действительно, в интернете есть много программ-эмуляторов устройств Модбас.

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

И все-таки я нашел хороший бесплатный эмулятор, который оправдал все мои надежды. Программа называется «DevEmu программный эмулятор Modbus-slave».

DevEmu-about

Автору удалось создать гениальную в своей простоте и функциональности программу.

Программа не инсталлируется и состоит из папки, в которой находится exe-файл программы, хэлп-файл и папка с тестовым проектом. Все вместе весит менее 1 Мб.

Возможности DevEmu

  • Эмулирование работы устройств Modbus-slave по последовательному интерфейсу RS-232.
  • Количество устройств не ограничено (в разумных пределах, наверное). Т.е. программа может эмулировать работу множества устройств, каждое из которых будет иметь свой адрес в сети Модбас.
  • Данные эмулируемых устройств можно изменять вручную или автоматически с помощью скриптов.

У DevEmu простой интерфейс, разобраться в нем легко. Хэлп-файл имеется, но автор его не доделал. В оглавлении хэлпа множество глав, но ни одна из них не написана. Тем не менее, в хэлпе есть главное: поверхностно описан скриптовый язык и указано, что скрипты и конфигурации устройств(например, для ПИД-регулятора МИК-21-05, как в моем случае) нужно создавать не через интерфейс программы, а ручками в текстовом файле.

Порядок создания проекта для эмуляции устройств Modbus-slave в программе DevEmu

  • Создать текстовый файл с расширением *.emud (EMUlator Device, надо полагать).  В этом файле будет описаны параметры эмулируемого устройства. Файл нужно делать по образцу файла «Danfoss FC200new.emud», который находится в папке с тестовым проектом «danfos fc200».
  • Если нужно автоматическое заполнение эмулироемого устройства данными (синусоида, пила и т.д.) то создать текстовый файл с расширением *.emus (EMUlator Script) и написать в нем соответствующий скрипт. Краткое описание скриптового языка- в хэлпе.
  • Запустить программу devemu.exe, создать новый проект; настроить COM-порт, через который будет работать программа; добавить в проект устройства(*.emud) и скрипты (*.emus).
  • Включить симуляцию в DevEmu через меню или кнопкой F5. Программа будет отвечать по указанному в настройках COM-порту на запросы по протоколу Модбас.

Пример создания проекта для DevEmu

1. Создадим файл эмуляции устройства  ПИД-регулятора МИК-21-05. Сделаем эмуляцию не всех регистров МИК-21-05, а только двух: данных аналогового входа 1 и аналогового входа 2.

Согласно РЭ, регистры устройства таковы:

МИК-21-05, Modbus
Параметр Адрес регистра Функция чтения Длинна регистра, бит
Аналоговый вход 1 3 03 16
Аналоговый вход 2 4 03 16

Cоздадим текстовый файл «MIK-21-05.emud» и впишем в него, по аналогии  с файлом «Danfoss FC200new.emud» такой текст:

// Файл устройства эмулятора MODBUS-slave DevEmu версии 1.0.1.3
// ————————————————————————————————————
// Разделителями в файле является знак такуляции <Tab> ACSII(9)
// В начале файла должен быть идентификатор и адрес устройства:
// <ID_устройства> <tab> <адрес_485>
// Далее допустимые строки в файле:
// <тип> <tab> <описание> <tab> <ID> <tab> <адрес> <tab> <RW> <tab> <границы> <tab> <значение> <tab>
// где:
// <тип> — ключевое слово: COIL, DINP, IREG, HREG.
// <описание> — строка расшифровки значения, например ‘давление масла’.
// <адрес> — адрес ячейки в терминах MODBUS (здесь и далее все числа десятичные).
// <ID> — идентификатор устройства, по нему идёт обращение из скриптов.
// <RW> — ключевое слово R, W или RW. Указывает возможность обращения к ячейке.
// <границы> — допустимые пределы изменения (проверяется при записи), пример: 0-101
// <значение> — начальное знечение ячейке при загрузке.
// Внимаение! При заполнении файла пропуск значений не допускается!
// ————————————————————————————————————

MIK-21-05-01          0x10
HREG          Аналог_вход_1           ID_AI1-1                0x3            R            0-4000          0
HREG          Аналог_вход_2           ID_AI2-1               0x4            R             0-4000          0

 

Из комментариев(все, что после «//» это комментарии) перед значащим текстом все и так понятно, но уточним ряд моментов:

DevEmu_01

Как указано выше, функция чтения регистров равна 03, что соответствует ключевому слову «HREG».

2. Создадим файл симулятора. При симуляции значение параметра «Аналоговый вход 1»  будет изменяться в виде синусоиды в диапазоне 0…200, значение параметра «Аналоговый вход 2»  будет изменяться в виде пилы в диапазоне 0…100.

Создадим текстовый файл «MIK-21-05.emus» и добавим в него соответствующие скрипты:

//Скрипт для эмулятора MODBUS-slave DevEmu

x=0.0;
i=0;

ai1=0;
ai2=0;

pi = 3.1415;

add_ai2=1;

 

while (1)
{
//синусоида аналог. вход 1
i++;
if(i>=1000)
i=0;

ss=2*pi/200;

x=sin(ss*i);
ai1=100+(x*100);

SetHREG(«MIK-21-05-01″,»ID_AI1-1»,ai1);

//Пила аналог. вход 2
ai2=ai2+add_ai2;

if (ai2>99)
add_ai2=-1;

if (ai2<1)
add_ai2=1;
SetHREG(«MIK-21-05-01″,»ID_AI2-1»,ai2);

Sleep(200);
}

Как видно, скрипты программы DevEmu являются всего-лишь вариацией старого доброго Си++ с некоторыми дополнительными функциями, краткое описание которых есть в хэлпе.

3. Создадим проект DevEmu, добавим в него файл устройства и симулятор МИК-21-05. Вывод данных настроим на порт COM1, скорость 57600:

Видеоурок, 0:00-1:05

Теперь на COM1 будет висеть программа-эмулятор МИК-21-05. При обращении на этот порт, эмулятор будет передавать по Модбас данные о регистрах «аналоговый вход 1»  и «аналоговый вход 2», как будто это и не программа вовсе, а реальное устройство.

4. Что бы проверить, как идет обмен данными с DevEmu, подключим COM1 к другому последовательному порту компьютера, в моем случае это будет порт COM8:

pc_cable_com_com_640x480

Здесь для компьютера «COM8» это преобразователь usb/rs-232. Такой преобразователь стоит где-то 5$. Я его использую потому что в современных компьютерах бывает только 1 последовательный порт.

Кабель для связи двух последовательных портов:

RS-232cable

5. Для обмена данными с эмулятором, подключим к COM8 программу OPC-сервер MasterOPC:

conn_com_com

Настроем OPC-сервер на прием 2-х тегов:

Видеоурок, 1:10-2:20

Как видно, OPC-сервер принимает какие-то данные, которые постоянно меняются. Это значит, DevEmu работает и выполняется симуляция, запрограммированная в «MIK-21-05.emus».

6. DevEmu что-то передает по Модбас… Но передает ли он пилу с синусоидой, как запрограммировали в симуляции? Создадим проект в бесплатной СКАДА KVisionOPC и посмотрим(2:25-7:00):

Синусоида есть, пила есть, всё ок.

Файлы проектов DevEmu, MasterOPC, KVisionOPC

Недостатки

DevEmu программа классная, но имеет свои недостатки:

  • Работает только по RS-232, по TCP не работает.
  • Если в проекте эмулируется несколько устройств, то нельзя во время работы эмулятора отключить одно из них. Это очень неудобно. Например, у меня 30 МИКов, я хочу увидеть реакцию программы на пропадание связи с 3-мя из них. Как это сделать? У программы такой функции нет. Я придумал такой кривой выход: останавливал программу- удалял из нее один из 30 девайсов- запускал программу.
  • Хэлп не доделан до конца и, уверен, никогда уже не будет доделан. Впрочем, программа такая простая и понятная, что это и не особо важно.

Впечатления

DevEmu реально очень помогла мне в работе. Очень полезный инструмент для программирования АСУ ТП. Дай бог автору здоровья!

 

5 комментариев: Эмулятор устройства Modbus

  • RZH говорит:

    Отличный подход для программиста АСУТП. Вы сделали большое дело. Но не хватает интерфейса RS-485.

      • RZH говорит:

        там же написано недостатки. я например хотел проверить работу панель оператора в режиме мастера симулировать 25 устройств.

        • Алексей говорит:

          Когда я писал «Работает только по RS-232» я имел в в виду, что программа работает только по последовательному интерфейсу, которым является и RS-232 и RS-485. Программной разницы между ними нет, разница только аппаратная.

Добавить комментарий

Ваш e-mail не будет опубликован.

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой:
Confirm that you are not a bot - select a man with raised hand:

Подпишитесь на нашу рассылку


Copyright © 2016. Перцух Алексей

Индекс цитирования