А зачем её менять из программы? Определитесь сразу что вы хотите видеть при разрыве соединения... Кстати в настройках модбас есть у Овена в кодесисе биты наличия/отсутствия связи, я им пользуюсь. А про этот момент не знаю.
Вопрос по OCL. Как реализовать запись по триггеру? Я нажимаю на кнопку, xTrigger принимает значение 1, после исполнения ФБ xTrigger обнуляется. Может, это как-то по-другому делается?
Какие подводные камни в использование одного и того же функционального блока несколько раз в пределах одного клиента? Я имею в виду, на одном шаге машины реквест выше пишет регистр, на следующем шаге читает регистры, дальше читает катушки и тд.Цитата:
2:
fbTcpRequest(xExecute := (fbTcpClient.xActive AND xTrigger), tTimeout := T#1S, usiRetry := 3, hConnection := fbTcpClient.hConnection,
xIsRtuOverTcpMode := FALSE, usiUnitId := 1, eFuncCode := ocl.mb_fc.WRITE_SINGLE_REGISTER, uiDataAddr := 0,
uiDataCount := 1, pData := ADR(wWord), szSize := SIZEOF(wWord));
IF fbTcpRequest.xDone OR fbTcpRequest.xError THEN
xTrigger := FALSE;
fbTcpRequest(xExecute := FALSE);
comState := 3;
END_IF
Ваш код выглядит корректно.
Если не забывать сбрасывать экземпляр (xExecute := FALSE) после вызова - то никаких.Цитата:
Какие подводные камни в использование одного и того же функционального блока несколько раз в пределах одного клиента? Я имею в виду, на одном шаге машины реквест выше пишет регистр, на следующем шаге читает регистры, дальше читает катушки и тд.
Вложение 71047
Подскажите, что я делаю не так? Пытался опросить ПР200 через ПЛК210.
Вынес ПР с адресом 10 в отдельный файл POU, но при компиляции CD ругается ошибкой "имя переменной" не является компонентом 'ModbusSlaveComPort_Diag'.
У вас программа и экземпляр слэйва называются одинаково (PR10) - так делать нельзя.
Переименуйте что-то из них.
Спасибо, да помогло.
Ещё вопрос. В символьной конфигурации указан ряд регистров, которые доступны только для записи.
Но они появляются в общем списке параметров в ОК, значения у них совсем некорректные, по факту там значения в десятки раз меньше(скрины из КС и ОК прилагаю).
Как это вылечить? При записи из ОК в эти регистры значения ложатся корректные, но в ОК продолжают оставаться нереальные значения.
Вложение 71108Вложение 71109
п.с. Ещё вопрос, не касающийся этой темы, но раз всё равно вопрос задаю, может сможете ответить.
Можно ли с пр200 забрать температуру процессора или температуру внутри ПР? Т.е. есть ли в ПР датчик температуры, если есть, то как его забрать по модбас?
Доброго дня! Нет опроса от программы частотного преобразователя (iP5A_1) в группе slave устройств на RS485 (горит треугольник без восклицательного знака). Если ставлю его на первое место, то опрос есть(восклицательный знак появляется), но на другом (iP5A) опрос теряется.
Под опросом программы я подразумеваю наличие красного или оранжевого треугольника с восклицательным знаком! В программе при запуске, всегда нету восклицательного знака либо на iP5A_1, либо на iP5A, но при этом если я отклучю оба устройства PChV3_M01 и PChV3_M01_1, то на обоих iP5A_1, на iP5A треугольник с восклицательным знаком появится.
пробовал подключать визически частотник к на iP5A_1, либо на iP5A и тот который без восклицательного знака по прежнему нет опроса, а тот который с восклицательным знаком, там сразу происходит подключение горит зеленый индикатор и все работает! В чем может быть причина?Вложение 71300Вложение 71301Вложение 71302Вложение 71303
Какие из устройств у вас физически подключены по RS-485?
Вложение 71318 адреса с 1 по 4 таймаут везде 1000
iP5A физически подключен имеет адрес 2 связь ЕСТЬ! Остальные не подключены!
iP5A_1 имеет адрес 3 - его то CoDeSys не пытается опросить и нету восклицательного знака! Если я ему ставлю адрес 2,( а iP5A адрес 3) и пытаюсь связаться с подключенным частотником то связи нету! Тогда удаляю iP5A и частотник связывается с iP5A_1
у них как буд-то бы есть какая-то связь и они мешают друг другу:confused:
Евгений, спасибо! Проблема ушла! Посадил эти два частотника на второй порт RS485 и они стали опрашиваться нормально!Вложение 71321
Доброго времени суток, коллеги.
Ковыряюсь с Codesys и у меня появилась вот такая проблема:
------ Компиляция : Приложение: Device.Application -------
типизировать код...
[ERROR] NH3 ST 6.11 3 part: Main [Device: Plc Logic: Application](Строка 125, Столбец 1 (Реализ.)): Выход соотнесен с существующей переменной Application.Main.b[0]. %QW6 больше не может быть использована.
[INFORMATION] NH3 ST 6.11 3 part: HMI_Modbus_TCP_Slave [Device: Ethernet: Modbus_TCP_Master]: Связанная позиция
[ERROR] NH3 ST 6.11 3 part: Main [Device: Plc Logic: Application](Строка 125, Столбец 1 (Реализ.)): Выход соотнесен с существующей переменной Application.Main.b[1]. %QW7 больше не может быть использована.
[INFORMATION] NH3 ST 6.11 3 part: HMI_Modbus_TCP_Slave [Device: Ethernet: Modbus_TCP_Master]: Связанная позиция
Компиляция завершена -- 2 ошибок, 80 предупреждений : загрузка невозможна
Причём в программе я QW6 и QW7 нигде не использую. О чём на скрине видно через поисковик он выдаёт только MODBUS:
(см. вложение 2)
Выполнено всё в эмуляции.
Цель - хочу передать значения из контроллера в панель HMI.
см. приложение 3 = убрал все данные, что бы посмотреть какие у меня word используются в программе - оказалось что имеются такие например QW18, QW19 (допустим это 1 REAL) и ниже тоже QW22.
Самое забавное, что вначале с 1 каналом Write Multiple Registers (Код функции 16) всё работало и на эмулятор панельки передавало значения REAL, но когда добавил 2 к***** то пошла ошибка. Далее, вообще перестало работать даже с 1 каналом. И начал выдавать ошибку см. выше.
Потом нашёл ролик CodesysOnelove с подключением. Сделал всё как Евгений прописал = > 0 на массу.(такая же ошибка с использованием этих значений где=то в проекте.)
В общем - если кто сталкивался или знает где ошибка буду признателен в помощи.
Добрый день.
Выложите проект, в котором воспроизводится данная ошибка.
Вложил.
Там код и библиотеки к нему.
По моему это связано с тем, что вы внутри переменной присвоили свои наименования main.b[0] и 1... Поэтому в программе вроде нельзя больше упоминать %qw6 совсем, так как это как бы массив... Тут уже было, что объявляли как сам массив, так и биты внутри и программа вываливалась в такую же ошибку.
Дак я и обычный REAL делал, всё одно = ругается.
Так конечно не ругается.
Я хотел в программе сделать симуляцию цифр, что бы передать на панель у себя дома, что б не мотаться на объект.
Поэтому и ввёл обычную локальную переменную, которую, в свою очередь, привязал к МОДБАС переменной. С MAIN локальной переменной буду просто задавать значение, что бы "состряпать" HMI панель и что бы они совпадали с программным кодом. Короче, для теста делаю. На объекте пару недель назад такой фин ушами работал норм. Сейчас, дописав код, уже так не работает с эмуляцией. Вот и пытаюсь понять чего оно ругается. Может, конечно, уже и глаз замылился...
Если соотнесли переменные, то qw6 вообще не должно быть в программе, даже если эта штука у вас во входах.выходах над соотнесенными переменными есть. Вроде это из-за этого. Уберите упоминание qw6 из текста программы.
Вы пишите, что не используете, и приводите 2 скрин, где чёрным по белому фигурирует 1я строчка поиска, с qw7 такая же история.
Вот, пожалуйста, убрал QW6, оставил а := REAl на МОДБАСовском канале.
Только ошибок теперь не 2 а 1. qw7 тоже в утиль надо...
Стоп, а почему вы массив из 2 вордов сделали реалом?
Real не проходит по modbus, надо делать структуру или как там:
DataR: real;
DataM: array (0.. 1) of word; поищите на форуме, есть ссылка на документ по работе с вордами в modbus
Modbus это 1 или 2 word. Так как вы сделали, не делается.
Конечно, не делается. Это можно оставить, оно сейчас никакой рояли не играет, даже если я сделаю как вы предлагаете разбиванием при помощи ARRAY на 2 WORD - будет так же песня.
Вопрос мой так и не получил ответа: как мне в программе сделать симуляцию REAL значения, что бы я на панельке увидел её. Я использую глобальные переменные вот их и хочу туда/сюда пересылать.
Расскажу как делал я.
Имеется контроллер, сенсорная панель с modbus tcp master, кнопочная панель с modbus rtu master.
Составил таблицу регистров в экселе, и определил их количество. Для реалов соответственно зарезервировал 2 регистра. В контроллере сделал массив на данное количество регистров и соотнес каждый элемент массива своему регистру. А реал выжимал структурой, или как там она называется, нет под рукой кодекса, только телефон.
Ну и ещё галочку в кодесисе поставил, чтение и запись!
TYPE DUT_MODBUS_Real_Word:
UNION
U_RealInModbus: ARRAY [0..1] OF WORD;
U_RealInProgramm: REAL;
END_UNION
END_TYPE
Использовать объединение.
В программе задаете реал, а ворды соотносите с регистрами. Панель сама поймёт где что, если правильно настроить.
Вот примерно этим же и занимаюсь.
Только хочу понять с какого регистра ползти, как биты и регистры проименовать, а для этого делаю эдакий полевой стенд, что бы понять чего куда крутить. Но раньше работало, а сейчас почему-то отказалось. Причём даже сегодня с 1 регистром удалось побаловаться, с другими уже нет, а потом и 1 отвалился.
https://owen.ru/product/codesys_v3/documentation
Там есть документ, называется протокол модбас.
Изучайте. А то вы другой контроллер программируете и пытаетесь получить ответы, которые тут уже описаны.
И ещё, соотносить можно что-то одно, либо целиком регистры, либо их биты по отдельности. Вместе и то и то нельзя, выдаст такую же ошибку.
Я не делал как вы, а просто соотносил регистры, типа reg[1] и т.д. что бы в программе использовать циклы.
Иначе вам каждый этот бит регистра в программе присваивать какой-то переменной, если у вас 40 механизмов и на каждый 50 аварий и состояний, то вам описывать 2000 строк, вы на этом неделю потеряете и запутаетесь в коде.
Ексель сам пишет по скрипту эти строки, я только их заполняю. В этом вся соль. Поэтому ошибки быть не может.
У меня имеется контроллер на борту которого MODBUS TCP/IP, в котором уже есть входы и выходы, которые автоматические создаются производителем в своём ПО. Я эти входы присваиваю к глобальным переменным, что бы их же и отсылать в HMI. А для этого я создаю ещё устройство HMI делаю его мастером и ему пытаюсь всё это конвертировать. Ну и конечно же добавлять свои переменные, как вы уже и упомянули аварии, состояния и т.д. В ручке делать это всё = безумие, поэтому и пытаюсь этот процесс автоматизировать, что бы уйти от ошибок.
Вот, достал старую версию программы от 1.11.23 и там как видно на скринах привязанное значение A:=real; успешно прицепилось к адресу регистра RW10 со сдвигом 10 009 в CDS без всяких ошибок.
Но уже B:=REAL во второй канал с адресом RW4 и сдвигом 10 003 выползает в ошибку. Где-то есть перехлёст по адресам. Конечно счас полетят помиодры мол там нет плавающей запятой и это верно, мне главное узнать именно адреса глобальных переменных регистров и их даже привязывать не нужно будет, я просто напишу глобальная переменная a AT %QW 8 и т.д. По факту (в полях на оборудовании) у меня эти значения передавались с плавающей запятой. На скринах уже есть эмулятор панельки справа.