PDA

Просмотр полной версии : Код 23 Modbus на СПК207 или чтение/запись в ПЛК110



Спорягин Кирилл
26.05.2016, 18:51
Добрый день, уважаемые форумчане.

Собрана следующая система:
1. ПЛК110 управляет процессом;
2. СПК207 - отображение и ввод информации;
3. АРМ оператора (MasterSCADA + Universal Modbus OPC Server) - отображение и ввод информации.

В ПЛК110 есть некая переменная (назовем ее Var1). Эта переменная может быть изменена, как с СПК207, так и с АРМа.
Естественно, что она должна быть отображена и на СПК207 и на АРМе.

В Universal Modbus OPC Servere я могу сконфигурировать переменную с типом Read/Write. Такая переменная, если она изменена в сервере, записывается в контроллер.
Если она изменена в контроллере, то ее значение принимается сервером.

Можно сконфигурировать переменную типа Read/Write и в СПК207. Для этого в конфигураторе необходимо добавить канал с кодом функции 23 (Чтение/запись).
Проблема заключается в том, что контроллер ПЛК110 не поддерживает функцию 23 Модбас (видимо, OPC-сервер скрыто использует отдельно функции чтения 03 и записи 16).

Получается, что для чтения я должен сконфигурировать канал rVar1, а для записи wVar1. А затем программно обрабатывать эти две переменные сливая их в одну Var1, которую уже потом отображать в поле ввода.

Есть ли какой-то простой способ решения задачи с переменными, которые необходимо читать и писать в связке СПК207 - ПЛК110?

Спорягин Кирилл
01.06.2016, 15:50
Добрый день, уважаемые форумчане.

Я так понимаю, что никто из прочитавших вопрос не сталкивался с подобной задачей.

Поясню еще раз на примере.
Прикрепляю следующие файлы:
1. TestReadWrite.projectarchive - архив проекта панели СПК207.
2. TestReadWrite.pro - проект CoDeSys для контроллера ПЛК110-30 М02.
3. 2 рисунка.

Проекты для СПК 207 и ПЛК110 соответсвуют друг другу. В проекте контроллера настроена область Modbus(slave) с одним 0-м регистром.
В проекте СПК207 создан ФБ fbValue, код которого очень прост:


FUNCTION_BLOCK PUBLIC fbValue
VAR_INPUT
InValue : INT;
END_VAR

VAR_OUTPUT
OutValue : INT;
END_VAR

VAR
Value : INT;
InValueOld : INT;
ValueOld : INT;
END_VAR

IF InValue <> InValueOld THEN
Value := InValue;
END_IF

IF Value <> ValueOld THEN
OutValue := Value;
END_IF

InValueOld := InValue;
ValueOld := Value;


Данный код позволяет отследить изменение входной переменной и записать ее в поле Value, если же измениться поле Value, то мы его передаем на выход для записи в ПЛК.
Использовать данный механизм необходимо следующим образом (см. проект СПК):
1. Создаем в области Modbus(Master) переменную чтения. Например, rdValue.
2. Создаем в области Modbus(Master) переменную записи. Например, wrValue.
3. Создаем экземпляр ФБ fbValue. Например, если у нас имеется настройка максимальной температуры, то мы можем дать имя dbMaxTemperature.
4. Вызываем в PLC_PRG блок dbMaxTemperature, передавая на вход и выход переменные rdValue и wrValue.
5. Теперь поле dbMaxTemperature.Value содержит актуальное значение температуры. К данному полу привязываем текстовое поле на экране СПК207.

Теперь при изменении значения в контроллере с АРМа оператора (в нашем случае мы моделируем такое изменение с помощью CoDeSys), на экране СПК207 мы увидим изменение нашей переменной (см. прикрепленные рисунки). Если мы введем новое значение с СПК207, оно также будет передано в ПЛК, а затем и в АРМ.

Данный механизм работает. Вопрос в том, что для описания всего одной переменной нужно проделать много действий. Нет ли какого-либо стандартного механизма?