Дело в том, что PLC Configuration не умеет делать групповые запросы. Используйте ModBus.lib. Или можно панель мастером сделать, что по мне удобнее.
Вид для печати
Дело в том, что PLC Configuration не умеет делать групповые запросы. Используйте ModBus.lib. Или можно панель мастером сделать, что по мне удобнее.
ModBus.lib - это был мой следующий шаг. Есть примеры как читать несколько регистров со slave устройства одним запросом. Жизнь удалась!!!
Логика у меня была следующая:
1. Создаем POU (программа) Read10s_PRG.
2. В конфигурации задач настраиваем Тип - циклический, Интервал - 10000ms
3. В программе Read10s_PRG настраиваем параметры порта -> открываем порт -> читаем -> обрабатываем данные -> закрываем порт.
4. Получаем считывание нескольких регистров slave устройства и их обработку 1 раз в 10 сек.
На мой взгляд все логично=) А вот не тут-то было!!!!!
конструкция COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK ); должна открыть порт и выставить COM_SERVICE1.ready в TRUE, и на это ей нужно 299!!! циклов (запусков Read10s_PRG). 299 КАРЛ :confused:
т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.
Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.
Но и тут казалось можно было выкрутиться:
Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:
Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)Код:IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
cmpl будет TRUE когда get1_modbus получит данные.Код:get1_modbus: MB_RD_HOLD_REGS
get1_modbus(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=300 ,
Quantity:=14,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
НО
получит она их через 13 циклов (запусков Read10s_PRG ) 13!!!
т.е. если Read10s_PRG запускается 1 раз в 10000мс то мы получим данные через 13*10000мс
Все данные получены экспериментально.
Ну и напоследокКод:PLCInfo
PLC model MODEL PLC 110-32 Версия ПО метр: 2.0
Binary VERSION 2.15.8
Need Target version 2.10
Compiled: 11:51:53 Dec 26 2015
MAC 6A:77:00:81:4F:67
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited
Если кто-то захочет на одном интерфейсе по ModBus опрашивать часть устройств через конфигуратор а часть в программе через modbus.lib ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
Вот такая интересная ночка выдалась =)
1) А заглянуть во внутренности COM_SERVICE и поправить нужное или написать свое ПОУ открытия порта внимательно читая доки на syslibcom было не досуг?
2) Ну ради экспериментов можно конечно ознакомиться с плкашной многозадачностью, но чувствуется не до конца Вы разобрались
3) про напоследок, Вы серьезно считаете что открыли Америку?
Если читали первое сообщение то видели что это мой первый опыт с ПЛК, потому и просил помощи, и вопрос задал в теме для новичков! До заглядывания во внутренности библиотек и исправления их под свои нужды я еще не дорос. Тем более задача на первый взгляд была элементарной: читать несколько регистров 1 запросом очень редко. Не думал что для этого нужны танцы с бубном.
А вы если такой гуру то лучше бы помогли советом или делом для решения изначального вопроса. Зачем тыкать сопляка который итак ничего не знает "во внутренности COM_SERVICE" ???
а смысл помогать, Вам сказали что панель лучше мастером, Вы уже поменяли подход, завтра например Валенок скажет, что лучше нету когда панель слейв, опять станете переходить?
И мой совет это не тыканье носом,а рекомендация изучить как пишется код, проанализировать в каком месте возникает задержка открытия порта
Здравствуйте. Подскажите как скачать программу из ПЛК 110
Никак не скачать
Здравствуйте. Подскажите как при отключении ПЛК100 обнулялись переменные?
Всмысле, как подождать 10 минут?
Нет, вариант с ожиданием 10 минут мне не подходит.
Ситуация вот какая: если я отключаю ПЛК от питания в момент когда реле замкнуты, то при включении ПЛК обратно, у меня эти реле возвращаются в замкнутое состояние.
Как нужно: При включении ПЛК реле были разомкнуты
А зачем так дергать питание на ПЛК?
Приветствую всех! Есть контроллер ПЛК73, базовая конфигурация, т.е. на интнрфейсной плате отсутствуют RS485 и RS232. Мне необходимо соединить ПЛК с панелью ИП320. Скажите, правильно ли я понял, что это можно сделать через интерфейс RS232 Debug? И второй вопрос. В Codesys 2.3 в меню конфигурации ПЛК у меня неактивна строчка "добавить подменю" (см. вложение). Должна ли быть активна эта строчка? Почему она неактивна? target-файл для ПЛК73 версии 2.01
Нельзя
Чтобы добавить подменю, кликать надо на меню, а не на ПЛК. И добавить его можно в свое меню, а не в системноеЦитата:
В Codesys 2.3 в меню конфигурации ПЛК у меня неактивна строчка "добавить подменю" (см. вложение). Должна ли быть активна эта строчка? Почему она неактивна? target-файл для ПЛК73 версии 2.01
Уважаемый RV9WFJ, во-первых, вопрос о подключении через RS232 Debug я задал не просто так, а потому что прочел об этом в FAQе (см. вложение). Из этого я подумал, что нужен другой кабель, не тот, который идет в комплекте с ПЛК73, но можно этот кабель распаять самостоятельно, без перемычки, упоминаемой в FAQе. Во-вторых, извиняюсь, я неправильно обозвал пункт для добавления Modbus. Правильно он называется "Добавить подэлемент". Прикладываю второе вложение, называемое "Настройка и подключение ИП320 к ПЛК". Это часть статьи Гайнутдинова Кирилла, расположенной по адресу: http://ftp.owen.ru/index.html/AiP/32/aip0108s7-9.pdf. В ней показано, как добавить подэлемент. Во вложении я выделил этот абзац. Вот этот пункт ("добавить подэлемент") у меня и неактивен.
Приведенное Вами относится к ПЛК1** и подобным, но не относится к ПЛК63 и особенно ПЛК73.
Добавлять параметры в них можно только в 3 слота, RS-232 Debug в ПЛК73 для работы по протоколу MODBUS использовать не возможно.
Понял. Значит, нужно устанавливать интерфейсную плату для связи с ИП320. Спасибо!
здравствуйте , в чём достоинства и недостатки плк 110 и 150 если их сравнить ?
Доброго времени суток!!!
Подскажите как сделать или где прочитать!!!
Необходимо сделать 32bit-ную переменную из разных булевых переменных(это и входы выходы плк и программные переменные) для передачи их в мастерскаду(экономия количества переменных. Их в демо версии 32 а у меня реалов 25 и булевых куча) из плк. Вопрос в том что в плк в модбас слейве есть только 4 байта а в модбас мастере 32 bits output\input module (оба дворд) как собрать из булевых в один 32 битный (дворд)?
Попробуйте через точку.
var_dword: dword;
var_bool1: bool;
var_bool2: bool;
...
var_bool31: bool;
_______________
var_dword.0:=var_bool0;
var_dword.1:=var_bool1;
var_dword.2:=var_bool2;
...
var_dword.31:=var_bool31;
Здравствуйте, как в Codesys задать массив, пределы которого определяются переменными, что то вроде такого:
massiv : array [A..B] of int; где A и B можно было бы задавать самому?
Пардон, а что за зверь оскат?
Нашёл про оскат, буду читать.
Большое спасибо за подсказку, в ресурсах в глобальных переменных создал объект Constants, в этом объекте создал параметр массива и все заработало.
Еще один вопрос возник касаемо возможностей Codesys 2: Возможно ли скопировать целиком одну строку массива в другую без использования конструкции For i := 0 до A...?
У Вас одномерный массив строк? Тогда просто присваивайте mas[1]:=mas[2]. Можно присваивать элементам массива любые значения того же типа.
Буду пробовать присваиванием. Есть еще вопрос: Еесли выход/вход ПЛК типа dword, возможно ли эти входы/выходы интерпритировать в виде массива типа bool без конструкции вида my_var.x:=y ? а сразу перевести dword в массив?
Вы ничего не путаете?Цитата:
Еесли выход/вход ПЛК типа dword