В руководстве на панель не описан регистр PFW36.
Пока мучить буду макрос, в примерах вроде всё разжевано, собрать бы это всё в единый макрос правильно, остальное вроде пока понятно. Спасибо.
Вид для печати
В руководстве на панель не описан регистр PFW36.
Пока мучить буду макрос, в примерах вроде всё разжевано, собрать бы это всё в единый макрос правильно, остальное вроде пока понятно. Спасибо.
Что-то не совсем понял - по TCP доступ к отдельным битам через 4х невозможен (при выборе у, допустим, "переключателя с индикацией" порта PLC опция выбора 4х появляется, выбираем сконфигурированное подключение TCP - исчезает)?
И как работать с битами? (просто наводку дайте, попробую сам разобраться).
И может обладаете инфой когда старшая версия выйдет?
Заранее спасибо.
Совсем забыл...
Если в качестве слейва используется ПЛК ОВЕН, то следует заметить, что в конфигурации слейва ПЛК биты(0х) и регистры(4х) находятся в одной и той же области памяти.
Скрытый текст:
т.е. например бит 01, регистра 4х01 тоже самое, что и бит 0х17.
Таким образом можно вместо разрядов регистров 4х использовать соответствующие биты 0х
Я так и делаю (правда в эмуляторе). Связь начинает рваться. Работает если только адреса 0, 16, 32 и т.д.
ПЛК 154 реальный...
Добрый день.
Макрос почти сделал с помощником, но много вопросов.
При прописывании функции 06 на запись в прибор компилятор панели ругается. В примерах везде использовано 4х. и 3х.
И ещё вопрос, чтение из прибора текущей температуры идет в шестнадцатеричном виде, мне нужно изменять это значение, добавляя 1 градус каждые 5 минут и записывать в прибор. Нужно ли переводить значение в десятичный вид? И в каком виде записывать значение в регистр уставки прибора, в DWORD, десятичном или как? Там два регистра , уставки и усредненное значение. Есть ли ограничения на количество раз записей в прибор?
Просто Вы не знакомы с элементарными понятиями из теории Modbus. Вы путаете функции с адресными ссылкамиЦитата:
При прописывании функции 06 на запись в прибор компилятор панели ругается. В примерах везде использовано 4х. и 3х.
Популярно можно ознакомится здесь https://sites.google.com/site/fieldb...odbuseducation
4x и 3х это не функции, а ссылки к областям памяти слева.
В общем случае существуют четыре области
0х - область дискретных выходов (доступны чтение и запись)
1х - область дискретных входов (доступно только чтение)
3х - область входных регистров (доступно только чтение)
4х - область выходных регистров (доступны чтение и запись)
Для каждой области существуют свои функции(команды) для записи или чтения. Так вот функция 06 это команда для записи одного значения в регистр из области 4х
Я сделал маленькую шпаргалку
http://www.owen.ru/forum/attachment....1&d=1397777586
Панель сама выберет нужную функцию, в зависимости от заданного в Write() или Read() 4х или 3х
Какие глупости. Из прибора читаются ПРОСТО значения и ни в каком не шестнадцатеричном виде.Цитата:
И ещё вопрос, чтение из прибора текущей температуры идет в шестнадцатеричном виде, мне нужно изменять это значение, добавляя 1 градус каждые 5 минут и записывать в прибор. Нужно ли переводить значение в десятичный вид? И в каком виде записывать значение в регистр уставки прибора, в DWORD, десятичном или как?
Ни какой разницы между десятичным и шестнадцатеричным представлением одного и того же значения нет. Hex или Oct придумано только для человека, в основном используется для вывода на экран или бумагу, а компьютеры оперируют наборами ноликов и единичек
123(Dec) = 7B(Hex) = 173(Oct) = 1111011(Bin) и это одно и тоже значение!
Вы же записываете в прибор число, а не символьную строку.
Если записываете значение переменной Ustavka, то вообще задумываться не о чем.
Просто Write(PLC, 1, MODBUS_RTU_REG_4X, 0, 0, TYPE_DWORD, Ustavka);
или если значение уставки в регистре PSW[256]
Write(PLC, 1, MODBUS_RTU_REG_4X, 0, 0, TYPE_DWORD, *(DWORD*)(PSW + 256));
Если константу, то как Вам больше нравится хотите
Write(PLC, 1, MODBUS_RTU_REG_4X, 0, 0, TYPE_DWORD, 123); десятичное представление
или
Write(PLC, 1, MODBUS_RTU_REG_4X, 0, 0, TYPE_DWORD, 0173); восьмеричное представление
или
Write(PLC, 1, MODBUS_RTU_REG_4X, 0, 0, TYPE_DWORD, 0х7В); шестнадцатеричное представление
Извиняйте что путаю, я же писал что совсем темный, с "С" и модбасом дел вообще не имел, программировал только в LD и FBD и с однофамильными комплектами, где прописывать ручками ничего не надо. Макрос и писал как вы строки набросали, но возникли сомнения в правильности понимания процесса, так как помощник ничего не понимает в оборудовании а я в "С" и его тонкостях. Допилю макрос и выложу. Спасибо за понимание.
Ничего страшного, научитесь!
Если Ваш макрос делает только
то и в панели можно обойтись без программирования на Си, штатными средствами, например одной только функциональной областью.Цитата:
чтение из прибора текущей температуры идет в шестнадцатеричном виде,мне нужно изменять это значение, добавляя 1 градус каждые 5 минут и записывать в прибор
На счет научитесь, это смело сказано, почитал первоисточники, чтобы освоить это нужно этим заниматься постоянно, а не раз в пятилетку.
По записи в панель я понял что можно обойтись без макросов с помощью цифровых панелей .
Прикрепил проект . Связка СП307-ТРМ138 один канал локальный макрос.
Возможны путаница и не стыковки.
Т.к. у Вас в макросе есть цикл do....while, то
- сделайте режим выполнения макроса -Параллельный
Вложение 33170
- и дайте панели возможность обслуживать элементы экрана (маленькая задержка в теле цикла)
Вложение 33171
иначе не сможете на экране нажимать кнопку и вводить какие-либо значения пока макрос не завершит свою работу.
Функция sleep() работать не будет, замените ее на Delay
Дополнение...
Вложение 33172
Ведь PSW256 это не тоже самое, что и 3х256
Вложение 33173
И почему 3х256?
Вложение 33174
И с чего Вы взяли, что уставка в формате DWORD?
Вложение 33175
Один регистр - 0х0011
А это значит формат - Word !
И адрес регистра в руководстве в шестнадцатеричном представлении приведен, по этому не
Write(PLC, 16, MODBUS_RTU_REG_4X, 11, 0, TYPE_DWORD, CurTemp);
а так
Write(PLC, 16, MODBUS_RTU_REG_4X, 17, 0, TYPE_WORD, CurTemp);
или так
Write(PLC, 16, MODBUS_RTU_REG_4X, 0х11, 0, TYPE_WORD, CurTemp);
Ошибки исправлю. Спасибо.
Опять же вопрос, считываю я два регистра и как получается что я делаю вычисления и записываю только один регистр?
И в принципе макрос работоспособен?
Ящик на объекте стоит в другом городе и управление пока в ручном режиме даже без контроля текущей температуры.
Датчики не знают как к ТРМу подключить.
Исправленный проект.
Сомневаюсь, я :(
Много путаницы.
Вот зачем это?
Вложение 33188
Убрать категорически!!!
Кроме того, значение температуры из ТРМ в регистре 3х0003 будет получено в виде числа с плавающей точкой(Float)
Вложение 33189
А у дисплея формат - целое без знаковое число(Unsigned)
Вложение 33190
Вопрос о том как текущая температура из ТРМ попадет в регистр PSW256 и соответственно в макрос остается не раскрытым:rolleyes:
Вложение 33191
Да и формат не тот. Не может CurTemp,если ее читать из регистра 0х0003, быть DWORD, только float
Кроме того Вы читаете из ТРМ значение температуры в формате Float, а максимальную температуру задаете в регистре PSW260 в формате UINT и соответственно в макросе сравниваете между собой не сравниваемые величины.
Либо читайте другой регистр - 0х0001 значение в формате INT.
Такая запись при объявлении переменных
По моему не прокатит. Боюсь, что компилятор при загрузке проекта в панель будет ругаться.Код:DWORD CurTemp=PSW[256];
WORD MaxTemp=PSW[260];
WORD SleepSec=PSW[258];
WORD StartTemp=PSW[256];
Уж лучше использовать директивы #define
например
Вложение 33193 Вложение 33194Код:#define SleepSec PSW[258]
#define MaxTemp *(float*)(PSW + 260) // При условии, что Вы все таки исправите на экране цифровой ввод для MaxTemp (тип данных DWord, формат Float)
Вот зачем это?
Нажмите на изображение для увеличения.
Название: Захват-1.png
Просмотров: 1
Размер: 37.2 Кб
ID: 33188
Убрать категорически!!!
Это было в примере чтение текущей температуры с ТРМ138.
Описание процесса.
При нажатии кнопки старт, вызывается макрос для первого канала регулировки температуры. Для этого записывается стартовая температура, ниже на один градус текущей или равна текущей. В ТРМ138 нет ПИДа, нельзя построить набор температуры по времени. Меня поставили перед фактом существования уже закупленного комплекта и его запуска в работу. Далее, идет набор температуры по времени до заданной, потом выдержка заданное время набранной температуры и всё, конец макроса и сброс уставки на стартовую.
В панели программа управления, а ТРМ контроль температуры и исполнительные клапана.
Я решил что такое можно сделать для данной связки, и вот мучаюсь осваивая для себя новую область.
Каналов будет восемь.
Уточните
Все таки равная или меньше на 1?Цитата:
Для этого записывается стартовая температура, ниже на один градус текущей или равна текущей
и в конце
на какую стартовую, ту что была в начале или в конце нужно уставке присвоить значение текущей температурыЦитата:
конец макроса и сброс уставки на стартовую
ЗЫ.
А может все таки в начале нужно уставку записывать на 1 больше текущего значения иначе если она будет меньше текущего значения, то и нагрев не пойдет?
Вариант
Вложение 33199
Для такого распределения регистров, макрос может быть таким
Вложение 33200
ЗЫ,Код:#define SleepMin PSW[258]
#define MaxTemp *(float*)(PSW + 260)
#define StartTemp *(float*)(PSW + 256)
float CurTemp;
unsigned int CurMinute;
Read(PLC, 16, MODBUS_RTU_REG_3X, 0x03, 0, TYPE_DWORD, &CurTemp);
StartTemp = CurTemp;
Write(PLC, 16, MODBUS_RTU_REG_4X, 0X11, 0, TYPE_WORD, (int)(StartTemp + 1));
do {
CurMinute = (PSW[34] / 16) * 10 + PSW[34] % 16;
if (CurMinute % 5 == 0) {
Read(PLC, 16, MODBUS_RTU_REG_3X, 0x03, 0, TYPE_DWORD, &CurTemp);
Write(PLC, 16, MODBUS_RTU_REG_4X, 0X11, 0, TYPE_WORD, (int)(CurTemp + 1));
}
Delay(10);
} while ( CurTemp < MaxTemp );
Delay(SleepMin * 60000U);
Read(PLC, 16, MODBUS_RTU_REG_3X, 0x03, 0, TYPE_DWORD, &CurTemp);
Write(PLC, 16, MODBUS_RTU_REG_4X, 0x11, 0, TYPE_WORD, (int)CurTemp);
ResetPSB(256);
Внимание, нашел и исправил "очепятку"
Было
do {
CurMinute = (PSW[34] / 16) * 10 + PSW[34] % 16;
if (CurMinute % 5 == 0) {
Read(PLC, 16, MODBUS_RTU_REG_3X, 0, 0х03, TYPE_DWORD, &CurTemp);
Write(PLC, 16, MODBUS_RTU_REG_4X, 0X11, 0, TYPE_WORD, (int)(CurTemp + 1));
}
Должно быть
do {
CurMinute = (PSW[34] / 16) * 10 + PSW[34] % 16;
if (CurMinute % 5 == 0) {
Read(PLC, 16, MODBUS_RTU_REG_3X, 0x03, 0, TYPE_DWORD, &CurTemp);
Write(PLC, 16, MODBUS_RTU_REG_4X, 0X11, 0, TYPE_WORD, (int)(CurTemp + 1));
}
Ну как бы понятно что стартовая температура - это температура, с которой начинается процесс нагрева. И соответственно она должна быть равна или ниже текущей температуры чтобы регулятор не включал ВУ пока она не будет задана выше. Как её вводить и что вводить, текущая температура может гулять от времени года, утро или день. камера не остыла от предыдущего процесса и она может быть разная. Вот я и думал вводить её с цифрового ввода в зависимости от состояния текущей температуры. И в конце процесса нагрева она снова должна переписываться в прибор чтобы регулятор встал и ВУ не включалось, а иначе как остановить регулятор. Как то так.
И думаю может все переменные привести к одному виду WORD int и читать 0х001. вроде как есть такая возможность, большой точности там не надо, сотые и десятые градуса не надо ловить.
И что цифровая панель чтения из прибора
Вот зачем это??
Убрать категорически!!!
не будет работать на запись в регистры?
Добрый день.
Есть связка 310+ПР220-24. Связь по modbus rtu. Панель 310 - мастер.
В связке всё работает нормально.
Ниже кусок экрана панели.
Вложение 33214
На панели есть выключатель 4х512.
Когда я его включаю в ПР-ку уходит время для таймера.
ПР-ка возвращает 1 в 4х513 пока таймер работает.
Как только время закончилось в 4х513 прилетает 0.
Я уже всю голову себе сломал как сделать так, чтобы как только в 4х513 прилетает 0, то выключатель 4х512 так же выключался и открывалось окно с ID=2? Собственно вторая часть с окном, это не столь важна.
Значит надо как только в 4х513 прилетает 0, т.е. по спаду бита 0 в 4х513 запускать ф.область с функциями 1. Выкл бит 0 в 4х512; 2 Вызвать окно с ID=2.
Только вот ф.область может запускаться только по фронту бита, а по спаду пока нет.
Однако можно воспользоваться ГМ "НЕ" из моей библиотеки http://www.owen.ru/forum/showthread....l=1#post232246
На вход(Операнд) подавать бит 0 в 4х513, а на выходе(Результат) использовать промежуточный PSB. И уже от этого PSB запускать ф.область с функциями Выкл бит 0 в 4х512; 2 Вызвать окно с ID=2.
https://www.youtube.com/watch?v=d2QhPySsOok
Эта галкаЦитата:
И что цифровая панель чтения из прибора
Вот зачем это??
Убрать категорически!!!
не будет работать на запись в регистры?
Вложение 33215
Совсем не запись в регистр PSW256, т.е не 3x0003 ---> PSW256.
А сия галка включает динамическую переадресацию.
Т.е. если галка включена, то на самом деле адрес регистра в ТРМ будет вычисляться по формуле
Адрес=БазовыйАдрес + Коеффициент х СодержимоеИндексногоРегистра.
В данном случае
3 + N x (Содержимое регистра PSW256)
где коэффициент N задается на этой вкладке
Вложение 33216
Таким образом панель будет читать из ТРМ именно 3x0003 регистр если только PSW256 = 0.
А если задать N=5, то меняя в процессе работы панели содержимое регистра PSW256 от 0 до 7 можно на этот один дисплей выводит температуру любого из восьми каналов.
По этому я и спрашивал неоднократно
Вложение 33217
Но от Вас никакого ответа не получил.
В моем макросе CurTemp читается непосредственно из ТРМ
Да, спасибо, разобрался, т.е. для цифровой индикации текущей температуры не надо использовать ту форму что я использую.
А в макросе прописать строку чтения из прибора и записи в регистр. Как туго то доходит...
Вот пробный проект, хочу завтра съездить посмотреть что получилось, там все равно монтаж надо ещё доделывать.
Ну вот опять двадцать пять:rolleyes:
Уж и не знаю, что с Вами делать. Зачем я текст макроса выкладывал?
Поймите, что нельзя так сделать
WORD CurTemp=PSW[256];
.......
Read(PLC, 16, MODBUS_RTU_REG_3X, 0x01, 0, TYPE_WORD, &CurTemp);
..............................................
Потому, что в ТРМ значения текущей температуры в формате float, а не WORD
С таким подходом Вы ничего похожего на текущую температуру не прочитаете.
ЗЫ.
Например, если в ТРМ температура 123.456 градусов, то в CurTemp получите
либо 17142 либо 59769, в зависимости от некоторых нюансов
По адресу 0x01 таки в WORD (точнее, в INT, не суть):
Вложение 33239
Мне логика paul-th понятна - ему же достаточно прибавать целое число (а не, например, 1.5).
Только прибавить, вероятно, надо 10, а не 1 (В ТРМ вроде для 25.5 в регистре 1 будет 255 и т.д.).
Спасибо огромное. Всё получилось. И даже лучше чем хотел.... Но возникла другая проблема - при включении панели каждый раз появляется окно ID=2 т.к. при включении в регистре 4х513 0, а после функции НЕ соответственно 1. И появляется окно 2. Что можно сделать?
И ещё вопрос по "дисплею для таймера" из ГМ можно ли его делать невидимым? Я хочу наложить два дисплея друг на друга и в зависимости от условий отображать один из двух.
Присвоение WORD CurTemp=PSW[256]; я убрал, только забыл исправить, оставил WORD CurTemp;
прибавлять буду по 10. и записывать в в конце процесса буду 100. Завтра по результату отпишусь.
СПАСИБО.
Приобрели СП310р.
Пропал красный цвет. Брак или мог при отладке интерфейса что-нибудь записать?
при отображении любой графики на панельке нету красной составляющей в цвете.
Вложение 33249 упарвляем через ПЛК клапанами и снимаем инфу с датчиков, строим графики.
Сегодня вылезла ошибка переполнение psw при работе с трендами, но я уменьшил кол-во срезов и она пропала.
ща на другой панельке попробую
При работе с трендами используйте область память PFW, а не PSW (чтобы не было "переполнения").
Попробуйте сделать принудительную загрузку проекта, если красный цвет не будет отображаться - отправьте панель в сервисный центр.
И, если не сложно, сделайте фото дисплея "без красной составляющей цвета", пожалуйста.