Разобрался. Спасибо.
Разобрался. Спасибо.
Пользуюсь СПК 107 необходима вывести на регулятор мощности(TRM-1M) заданное значение ,через дерево проекта все выходит , но когда пытаюсь сделать тоже самое через библиотеку Modbus регулятор мощности не опрашивается , хотя все сетевые параметры указаны верно. [CODE][/// [1]
Settings_COM2.sPort:=2;
Settings_COM2.byStopBits:=1;
Settings_COM2.byParity:=1;
Settings_COM2.ulBaudrate:=9600;
Settings_COM2.ulTimeout:=0;
Settings_COM2.ulBufferSize:=0;
SettingsEX_COM2.byByteSize:=8;
// [2] открываем COM-порт
COM_Service_COM2
(
Enable:=TRUE,
Settings:=Settings_COM2,
Sets_Ex:=SettingsEX_COM2,
Task:=OPEN_TSK,
);
CASE iModule OF
0:
// [3] запускаем ФБ опроса модуля МВ110-8А
MV110_8A
(
Enable:=COM_Service_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=1,
FirstAddr:=2,
Quantity:=4,
ComHandle:=COM_Service_COM2.handle,
TimeOut:=T#150MS,
Buffer:=abyBuffer,
);
// [4] если ФБ опроса модуля завершил работу...
IF MV110_8A.Complete THEN
// ...и ошибки отсутствуют, то забираем буфер модуля
IF MV110_8A.Exception=0 THEN
abyMV110_8A_data:=abyBuffer;
// байты 0 и 1 содержат статус измерения входа 1
// склеиваем их в WORD и декодируем в текстовое сообщение
wMV110_8A_input1_status:=BYTE_TO_WORD(abyMV110_8A_ data[1]) OR SHL(BYTE_TO_WORD(abyMV110_8A_data[0]),8);
wsMV110_8A_input1_status:=Mx110Assistant.MvStatusT oWstring(wMV110_8A_input1_status);
//
// переставляем байты местами и преобразуем в REAL
_2WORD_TO_REAL.abyBytes[3]:=abyMV110_8A_data[4];
_2WORD_TO_REAL.abyBytes[2]:=abyMV110_8A_data[5];
_2WORD_TO_REAL.abyBytes[1]:=abyMV110_8A_data[6];
_2WORD_TO_REAL.abyBytes[0]:=abyMV110_8A_data[7];
rMV110_8A_input1:=_2WORD_TO_REAL.rReal;
END_IF
iModule:=1;
// завершаем опрос модуля МВ110-8А
MV110_8A(Enable:=FALSE, Buffer:=abyBuffer);
END_IF
1:
// [3.0.1] запускаем ФБ опроса модуля МВ110-16Д
MV110_16D
(
Enable:=COM_Service_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=26,
FirstAddr:=6,
Quantity:=5,
ComHandle:=COM_Service_COM2.handle,
TimeOut:=T#150MS,
Buffer:=abyMV110_16D_buffer,
);
// [3.0.2] если ФБ опроса модуля завершил работу...
IF MV110_16D.Complete THEN
// ...и ошибки отсутствуют, то забираем значения модуля
IF MV110_16D.Exception=0 THEN
abyMV110_16D_data:=abyMV110_16D_buffer;
xMV110_16D_input1:=abyMV110_16D_data[1].0;
xMV110_16D_input2:=abyMV110_16D_data[2].0;
xMV110_16D_input6:=abyMV110_16D_data[6].0;
xMV110_16D_input7:=abyMV110_16D_data[7].0;
xMV110_16D_input16:=abyMV110_16D_data[16].0;
END_IF
// завершаем опрос модуля МВ110-16Д
MV110_16D(Enable:=FALSE, Buffer:=abyMV110_16D_buffer);
// переходим к опросу модуля МУ110-8Р
iModule:=2;
// очищаем буфер модуля МУ110-8Р
abyMY110_8R_buffer:=abyEmptyBuffer;
END_IF
2:
// [3.1.1] копируем записываемое значение в буфер ФБ
abyMY110_8R_buffer[1].0:=xMY110_8R_output1;
abyMY110_8R_buffer[2].0:=xMY110_8R_output2;
abyMY110_8R_buffer[3].0:=xMY110_8R_output3;
abyMY110_8R_buffer[4].0:=xMY110_8R_output4;
abyMY110_8R_buffer[5].0:=xMY110_8R_output5;
abyMY110_8R_buffer[7].0:=xMY110_8R_output7;
// [3.1.2] запускаем ФБ опроса модуля МУ110-8Р
MY110_8R
(
Enable:=COM_SERVICE_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=9,
FirstAddr:=50,
Quantity:=6,
ComHandle:=COM_SERVICE_COM2.handle,
TimeOut:=T#150MS,
Buffer:=abyMY110_8R_buffer,
);
// [3.1.3] если ФБ опроса модуля завершил работу...
IF MY110_8R.Complete THEN
// ...то завершаем опрос модуля МУ110-8Р...
MY110_8R(Enable:=FALSE, Buffer:=abyMY110_8R_buffer);
iModule:=3;
END_IF
3:
TRM
(
Enable:=COM_Service_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=43,
RegAddr:=60,
Value:=50,
ComHandle:=COM_Service_COM2.handle,
TimeOut:=T#300MS,
);
IF TRM.Complete THEN
// ...то завершаем опрос
TRM(Enable:=FALSE );
// ...и начинаем новый цикл опроса
iModule:=0;
END_IF
xTRM:=100; //////GVL.AnalogTRM2;
;
END_CASE
]
Напишите настройки сети, которые забиты в модулях. Для 8N1 должны быть такие настройки, 2.3 Вложение 78716 Для 3.5 Вложение 78714
Лучше выложите свой проект, в расширенных настройках, Добавить файл.
У вас похоже 2.3, тогда вы пишите не в тот раздел, тут раздел Codesys 3.5
версия 3.5
У меня ваш пример сильно тормозит, скачайте пример с сайта и используйте его.
Не надо пытаться одновременно работать через биб-ку и СОМ порт одновременно, делайте разные проекты.
Не надо мутить с настройками сети, делайте всё стандартным 8N1, только скорость лучше увеличить.
Настройки сети и в шаблоне и в биб-ке не соответствуют стандартным для Овена 9600, 8N1. Скорость лучше поставить 115200.
Если работаете с биб-кой лучше полностью удалить СОМ1 в дереве.
Добрый день!
Столкнулся с непонятной для меня проблемой.
У меня на СПК107 на одном порту RS-485 поочередно опрашиваются два прибора газоанализатор СТМ-30м(опрос по Modbus) и электросчетчик Меркурий 230(опрос по библиотеке Овен).
Опрос запускается, но через некоторое время отваливается газоанализатор и востановить его возможно только сбросом питания, а если я отключаю отпрос электросчетчика, то он не виснит.
Пробовал увеличивать паузу между опросами не помогает.
Подскажите, как опрос другого прибора может влиять на состояние газоанализатора
На одном порту, один протокол с одинаковыми настройками сети. У вас разные протоколы поэтому и отваливается.
Если очень надо, то с одинаковыми настройками сети можно работать с разными протоколами, но по очереди. Например 300-500 мс один протокол, потом другой.
У меня работало, Модбас и Овен через 300 мс, по очереди.
настройки сети одинаковые 9600,8,N,1
опрос последовательный, сначала ГА, пауза, ЭС, пауза и так далее...
вопрос в том, что сначала все идет, а через минут 5, алес.., а если один ГА, ТО РАБОТАЕТ
хотелось бы причину понять, почему опрос ЭС приводит к зависанию ГА, ему должно быть все равно, что по сети чужие сигналы бегают, он их должен просто отбросить
Меркурий прекрасно работает на одной линии с Modbus. Отвалы скорее всего, что пока вы читаете Меркурий, у вас уже начинается опрос Modbus. Как вариант.
Ну и Адрес Меркурий не должен совпадать с адресами Modbus устройств.
У меня читается Меркурий + ПР200, и Меркурий + 2 датчика топлива с Modbus (но из Scada)
проверю еще раз, если бы так было, то опрос бы и не начался, а то он идет, а потом зависает прибор
У Меркурий много запросов/ответов, чтобы получить все. Плюс если читаются фиксированные данные, там идет команда фиксации, которая может быть отправлена как широковещательная, что и для Modbus окажется командой.
Тут я не подскажу, не смотрел реализацию библиотеки. Нет у меня устройств Овен с 3.5 CodeSys
Спасибо, поставлю флаг на одновременную работу блоков опросов, посмотрю, пересекаются ли они
Нет опросы не пересекаются, проверил, отработали всесте 5 минут без ошибок, и завис
может быть индивидуальная особенность прибора, что он не хочет видеть в сети чужие запросы и при их обработке зависает?
Ну вроде решилось. Допустил, что не справляется процессор с обработкой запросов, увеличил время между запросами до 400ms у ГА и ЭС, то есть дал ему больше времени на обработку и своих и чужих запросов, минут 20 отработал уже
нет, они программно разведены, один ждет окончания работы второго, там флажки стоят и таймеры задержки
и, похоже, проблема оказалась в том, что один запрос ГА это 2 байта (без служебных байт), а ответ максимум 8 байт, у ЭС объем передаваемых данных заметно больше, и по видимому он читая чужые запросы-ответы не справлялся с объемом данных
вроде работает, понаблюдаю
Да Modbus устройство вообще должен игнорировать запросы не к своему адресу, то есть абсолютно, ему не надо даже CRC проверять, первый байт чужой, я отдыхаю :)
kondor3000 да лениво мне его ставить. Как бы нафик не нужен без задач.
Но сначала нужно вычленить пакет. А вот тут, если норм пауз нет и наличии кривой работы с буфером в ПО слейва (а оно бывает*) можно и получить такие эффекты.Цитата:
Да Modbus устройство вообще должен игнорировать запросы не к своему адресу,
*Например такое было (сейчас не знаю) у местных ПЧ. А когда-то и у МВ..-6У
ну да, если паузы тишины нет, прибор может глючить.
Например у меня два датчика топлива на линии, одно сыпало ошибками. Просто поменял их опрос местами, ошибки пропали. ХЗ че это такое было ? :)
Если что, терминаторов нет. Ну или я их не включал, не помню уже.
з.ы. сейчас глянул, из 9 тысяч запросов, 28 ошибок, и опять на последнем по опросу устройству.
здравствуйте коллеги.
в проектах чаще всего пользуюсь стандартными средствами при описании части программы Modbus обмена.
Но вот попалась задача, где на вскидку лучше воспользоваться OwenCommunication.
Посмотрел видео по реализации, написал опрос в виде своего (!) функционального блока на CFC с использованием
FB из библиотеки OCL: OCL.COM_Control, OCL.MB_SerialRequest и т.д.
Но при добавлении экземпляра своего функционального блока в основную программу (на CFC)
в момент ввода имени экземпляра функционального блока выходит ошибка
Вложение 79752
Если жму "продолжить" после в процессе компиляции выходит ошибка:
КОД:
Экспериментальным путем установил, что если я оставляю в объявлении своего блока OCL.COM_Control то ошибка не выходит и все компилируется.
Стоит только добавить хоть один OCL.MB_SerialRequest даже только в область объявления получаю ошибки вышеописанные.
Попробовал создать ФБ на ST, поведение тоже самое.
Программа ранее использовала стандартные средства обращения к модбас, которые я потер, чтобы не конфликтовали.
Вопрос: может быть библиотека не предоставляет возможность создать свои ФБ на их основе?
Как выйти из этой ситуации? в документации к OwenCommunication и здесь на форуме ответов не нашел.
Добрый день.
Предоставляет.Цитата:
Вопрос: может быть библиотека не предоставляет возможность создать свои ФБ на их основе?
Насколько помню - это какой-то специфический баг редактора CFC.
Попробуйте повторить то же самое на ST - будет ли ошибка в этом случае?
Я написал в предыдущем сообщении, что на ST тоже пробовал. Поведение в точности такое же.
Сейчас создал новый проект. добавил туда OCL библиотеку и только мой новый ФБ.
хоть в PLC_PRG.CFC хоть в PLC_PRG.ST (объявлял экземпляр(и определял) своего ФБ) варианте реализации - не компилируется.
Ок. завтра подключитесь, вероятно подскажете, что я не так делаю.
Очень надеюсь на вас.
Проверил на CFC и на ST .
В ФБ и в действиях блоки OCL.COM_Control и OCL.MB_SerialRequest добавляются и работают без ошибок. Вложение 79758
Ошибка компиляции была связана с некорректной инициализацией переменной типа WORD.
В проекте использовался следующий синтаксис:
Но это некорректно.Код:wVar: WORD := b#0000_0001;
Нужно делать так:
Код:wVar: WORD := 2#0000_0001;
вопрос:
оказалось это две разных ошибки. точнее одна ошибка и один баг среды.
неверное объявление двоичной переменной приводило к ошибке при компиляции, не указывающей, как обычно бывает в таких случаях, что именно не так написано.
Баг среды разработки заключался в том, что при добавлении экземпляра своего самописного функционального блока в поле программы на CFC, сразу после этого должен появится диалог ввода имени экземлпяра. но вместо этого появлялось окно ошибки (не происходило автоматическое объявления). чтобы этого избежать, сначала вручную добавляем в область объявления, а потом выделить имя экземпляра и драгНдроп в текст программы. тогда ошибка не возникает.
Я думал что это по сути одна ошибка, но оказалось это две разные.
Спасибо большое за поддержку.
Привет форумчани.
Не пинайте ток ногами....
Проведя не один день на просторах инета да форумах, мне так и не удалось решить проблему с Modbus TCP Slave. Просмотрел видео уроки на данную тематику, но увы.... Понимаю, что в эмуляции данная ошибка: - Шина не запущена. Данные значения, возможно, неактуальны" допустима. Но вот при опросе не важно каким "Мастером", получить данные или записать не получается. И еще, в данной версии ПЛК 210-04, то ли я с ума выжил, то ли я не правильно опрашиваю данное устройство. Одним словом, хожу вокруг сосны! Вложение 79859 Вложение 79860
Дополнительный вопрос: есть ли разница в дереве переменных "Слейва" кто будет первым "BOOL" или "REAL"?
Изернет 1-2 WAN с адресом 192.168.2.150
Изернет 3 LAN с адресом 192.168.3.150 - опрос модулей
Изернет 4 LAN с адресом 192.168.3.30 - панель(мастер)
Проброшен порт 502 с WAN в LAN
Чем опрашиваете слейв? И какими функциями? Судя по треугольнику в дереве, опроса слейва нет. Скрин Вложение 79865
Видео для вас https://www.youtube.com/watch?v=Zq1G...KheVx&index=12
"BOOL" переменные, а точнее Маски бит (биты с 0 по 15 передаются в одном регистре) лучше ставить в начале, потом целочисленные, потом "REAL".
Но для тренировки всё равно.
Панель Weintek в качестве Мастера. Да и в принципе нет разницы чем опрашивать..... Главное получить результат.
За топологию построения переменных, спасибо Вам.
Данную проблему решил функциональным блоком MB_TcpSlave. Так проще при опросе и передачи как мне кажется.
Спасибо за помощь.
Добрый день! подскажите пожалуйста. Не отправляет данные регистра "TRUE" дискретного входа среды CODESYS на сторону MASTERSCADA 4D
Вообщем такая ситуация. Работаю в среде Codesys v3.5 SP17 в связке с MASTERSCADA 4D.
На стороне CODESYS привязал дискретный выход к глобальной переменой
Протокол Modbus TCP/IP.
Контроллер вертуальный CODESYS Control Win V3.
Ethernet->
ModbusTCP_Slave_Device
Помогите пожалуйста разобраться!
Вложение 79964
А где скрин мастерскады? Это область 0х или 1х должна там быть.
Сейчас пытаюсь сбросить скрин
1 еденичка должна быть. Как то не понятно
Тоесть, а где надо было мне связывать переменую. Там где Дискретные входы %QB16