Здравствуйте!
Столкнулся со следующей проблемой.
Надо получать значения температуры по RS 485 модбас рту в ПЛК 110.
Все настроил. Universal mb dev > real input modul/
Данные разнесены на 2 регистра.
Но вот незадача, при обрыве датчика температуры(в процессе работы это часто бывает) данные в регистре зависают.
Нет возможности выдать ошибку из ПЛК в скада.
Связался с разработчиками прибора, мне ответили, что обращаться надо к другим регистрам, но там структура.
структура Real(4),Err(2),Timer(2)
Спрашиваю у разработчика как отдельно обратиться к значению ошибки, он отвечает что никак, что надо сразу читать 8 байт.
Как мне прочитать из прибора сразу 8 байт?
Как потом вытащить из этой каши сообщение об ошибке?
В модбасе регистры двухбайтовые. Или вам чего-то недоговаривают, или вы чего-то недоговариваете. Что за девайс хоть? Как бы ни было, если прочитали одним запросом 8 байт, то судя по всему, 5 и 6 байты — код ошибки. Если эти 8 байт оказались в типе STRING, как вы объясняете в другой теме, то доставайте их оттуда указателями: error: WORD; str: STRING; p: POINTER TO WORD; ... p := ADR(str) + 4; error := p^;
Yegor, структура вот такая Real(4),Err(2),Timer(2), но разработчик ответил, что читать надо сразу 8 байт, что это специально так сделано для того, чтобы получить код ошибки на конкретное измерение а не положим на прошлое. Я не совсем понял зачем он так сделал. Я так понял, что если писать запрос "ручками" то все вроде разложить, но как прочитать из плк 110 - это вопрос. В настройках конфиг ПЛК в Universal mb dev нет возможности читать 8байт одновременно.
А устройство ТМ 5103 Элемер
// Register (команды 0x03, 0x06, 0x10)
кол-во параметров кол-во байтов (кол-во регистров) тип парам пределы
0x0500 16 Измеренное значение 4 (2) 4 0
0x0520 16 Измеренное значение, ошибка, время 8 (4) 10 0
0x0700 16 Уставка1 4 (2) 4 {-999.01,9999.01}
0x0720 16 Гистерезис Уставки1 4 (2) 5 { 0.0, 9999.01}
0x0740 16 Уставка2 4 (2) 4 {-999.01,9999.01}
0x0760 16 Гистерезис Уставки2 4 (2) 5 { 0.0, 9999.01}
0x0800 16 Минимум шкальной индикации 4 (2) 4 {-999.01,9999.01}
0x0820 16 Максимум шкальной индикации 4 (2) 4 {-999.01,9999.01}
0x0780 16 Тип Уставок 1 (1) 1 {0,2} // 0 - нижняя и верхняя, 1 - две нижних, 2 - две верхних
0x0840 16 Тип шкальной индикации 1 (1) 1 {0,1} // 0 - зайчик, 1 - стакан
0x0850 16 Цвет основного индикатора 1 (1) 1 {0,4} // 0 - Выкл, 1 - Auto, 2 - Зеленый, 3 - Желтый(Оранжевый), 4 - Красный
0x0860 16 Тип датчика (TipDat) 1 (1) 1 {0,27} // Cu85,Cu65,Cu81,Cu61,PtH5,PtH1,Ptb1,ni1,Gr21,Gr23,t c.H,tc.L,tc.S,tc.r,tc.b,tc.A1,tc.A2,tc.A3,tc.J,tc. t,tc.n,tc.E,i05,i020,i420,U100,U75,r320
0x0870 16 Тип вторичной обработки (TipDat2) 1 (1) 1 {0,2} // 0 - none; 1 - кус.-лин.; 2 - полином
0x0880 16 Математическая операция между двумя каналами (TipMath) 1 (1) 1 {0,5} // OFF; 1-2; (1+2)/2; 1+2; 1*2; 1.
0x0890 16 Первый канал для математической операции (NumChan1Math) 1 (1) 1 {1,16}
0x08A0 16 Второй канал для математической операции (NumChan2Math) 1 (1) 1 {1,16}
0x08B0 16 Смещение характеристики 4 (2) 4 {-999.01,9999.01}
0x08D0 16 Наклон характеристики 4 (2) 5 {0.7999,1.2001}
0x08F0 16 Кол-во знаков после запятой 1 (1) 1 {0,3}
0x0900 16 Кол-во усреднений 1 (1) 1 {1,250}
0x0910 16 Нижний предел обрыва датчика (AlLow) 4 (2) 4 {-999.01,9999.01}
0x0930 16 Верхний предел обрыва датчика (AlHigh) 4 (2) 4 {-999.01,9999.01}
0x0980 16 Граница линеаризации кв.корня 1 (1) 1 {0,4}
0x0990 16 Сопротивление ТС в 0С 4 (2) 5 {7.999,200.001}
0x09B0 16 Сопротивление линии связи ТС 4 (2) 5 {0,30.001}
0x09D0 16 Схема подключения ТС 1 (1) 1 {0,1} // 0 - 3-x проводная, 1 - 2-x проводная
0x09E0 16 Нижний предел диапазона преобразования 4 (2) 4 {-999.01,9999.01}
0x0A00 16 Верхний предел диапазона преобразования 4 (2) 4 {-999.01,9999.01}
0x0A20 16 Тип компенсатора 1 (1) 1 {0,9} // Cu85,Cu65,Cu81,Cu61,PtH5,PtH1,Ptb1,ni1,Gr21,Gr23
0x0408 1 Сетевой адрес 1 (1) 1 {1,254}
0x0409 1 Скорость обмена 1 (1) 1 {4,10}
0x040A 1 Конфигурация протокола 1 (1) 1 {0,2} // 0-no; 1-Odd; 2-Even
0x0C00 2 Пароли 2 (1) 2 0 // Доступ к уставкам, Доступ к конфигурации
0x040E 1 TEXT 16 (8) 12 0
0x041A 1 Reserv2 2 (1) 2 0
0x0A30 1 Кол-во точек линейной аппроксимации 1 (1) 1 {2,7}
0x0A31 14 Семь пар точек 4 (2) 4 0
0x0A50 1 Кол-во точек полиномиальной аппроксимации 1 (1) 1 {2,10}
0x0A51 11 Коэффициенты полиномиальной аппроксимации (B0, A0, A1, …) 4 (2) 4 0
0x0D30 128 Блок конфигурации реле /*128*/ 1 11 0
0x0D00 1 Выбор блока конфигурации реле 1 (1) 1 {0,3} // 0 - User, 1 - TM5102, 2 - TM5103, 3 - TM5104
0x0D10 8 Мажоритарная схема реле 1…8 1 (1) 1 {0,4}
0x0D20 8 Таймеры реле 1…8 1 (1) 1 {0,250}
0x00D2 1 Цифровое обозначение модели устройства 4 (2) 12 0
0x00D4 1 Вариант исполнения устройства 4 (2) 12 0
0x0400 1 Тип прибора 2 (1) 2 0
0x0403 1 Версия электрической схемы 2 (1) 2 0
0x0404 1 Версия ПО 2 (1) 2 0
0x0418 1 Reset 1 (1) 1 0
0x0416 1 Blink 1 (1) 1 0
0x07F0 16 Номер канала компенсации холодного спая 1 (1) 1 {0,16} // 0 - off, 1…16 - номер канала
0x0EE0 1 Текущие Дата, Время 4 (2)
// Coils (команды 0x01, 0x05, 0x0F)
0x04F0 1 Смещающее напряжение линии интерфейса RS-485 7 0
0x0950 16 Включение кв.кореня 7 0 // кв.корень
0x0960 16 Тестирование обрыва датчика 7 0 // обрыв датчика
0x0970 16 Обнуление кв.корня ниже нуля 7 0 // обнуление кв.корня ниже нуля
0x0AF0 16 Временное отключение каналов 7 0
типы параметров: // 1 - байт,
// 2 - слово,
// 3 - одна цифра(байт),
// 4 - float со знаком,
// 5 - float без знака,
// 6 - список,
// 7 - бит,
// 8 - float без знака c 3-я знаками после запятой
// 9 - float без знака c 2-я знаками после запятой
// 10 - структура Real(4),Err(2),Timer(2)
// 11 - 1байт блока конфигурации реле
// 12 - двойное слово,
Я не совсем понял зачем он так сделал.Дабы не вышло так, что показания и код ошибки вы считали в разное время и сделали неправильные выводы. Модбас это относительно топорный протокол — приходится изощряться. Если вам нужен только код ошибки, то попробуйте регистры 0x522 или 0x524 запросить. Их нет в таблице, но именно там должен оказаться двухбайтовый Err.
Дабы не вышло так, что показания и код ошибки вы считали в разное время и сделали неправильные выводы. Модбас это относительно топорный протокол — приходится изощряться. Если вам нужен только код ошибки, то попробуйте регистры 0x522 или 0x524 запросить. Их нет в таблице, но именно там должен оказаться двухбайтовый Err.
Может быть разработчик имел ввиду, что будет ответ в случае если запрос придет на восемь байт. В целом,так и не понятно в чем трудности, конфигуратор должен прочитать группой четыре регистра, единчтвенно если это аварийный случай, то надо делать не циклический опрос а по команде
Дабы не вышло так, что показания и код ошибки вы считали в разное время и сделали неправильные выводы
Именно так.
Если вам нужен только код ошибки, то попробуйте регистры 0x522 или 0x524 запросить. Их нет в таблице, но именно там должен оказаться двухбайтовый Err.
Не получается.
В целом,так и не понятно в чем трудности, конфигуратор должен прочитать группой четыре регистра, единчтвенно если это аварийный случай, то надо делать не циклический опрос а по команде
Мил человек, как это сделать?
http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf читаем руководство внимательно :)
Или через библиотеки
http://www.kipshop.ru/CoDeSys/steps/...figuration.pdf читаем руководство внимательно
Руководство я прочитал внимательно. Того что мне нужно в нем нет.
Смысл в том, что мне необходимо читать структуру сразу 8 байт. При обращении к частям этой структуры код ошибки 81.
Я так как в universal modbus dev нет 8ми байтного входного подмодуля (максимум real 4 байта) то я попробовал читать стринг.
В стринге какая то каша.
В общем вопрос остался открытым.
Или через библиотеки
Тыкните в нужную, пожалуйста.
Смысл в том, что мне необходимо читать структуру сразу 8 байт. При обращении к частям этой структуры код ошибки 81.
1. Передайте разработчику, что это не Modbus. В Modbuse можно читать любые регистры в любом порядке в любом количестве.
2. Какая Вам разница, к какому измерению относится ошибка, если при ошибке показания не меняются. Читайте своё слово и проверяйте байты, где находится информация об ошибке. Если они три раза подряд отличаются от байтов при исправном датчике, значит датчик вышел из строя. Или у Вас есть какие то тонкости, которые я не учёл? Например, датчик не один и там при неисправном датчике то ошибка есть, то нет?
Разработчик говорит, что нужно читать за 1 запрос, тогда все прочтется
Руководство я прочитал внимательно. Того что мне нужно в нем нет.
Смысл в том, что мне необходимо читать структуру сразу 8 байт. При обращении к частям этой структуры код ошибки 81.
Я так как в universal modbus dev нет 8ми байтного входного подмодуля (максимум real 4 байта) то я попробовал читать стринг.
В стринге какая то каша.
В общем вопрос остался открытым.
Тыкните в нужную, пожалуйста.
http://www.owen.ru/forum/showthread.php?t=6805&p=143448&viewfull=1#post143448 непример
Может быть разработчик имел ввиду, что будет ответ в случае если запрос придет на восемь байт. В целом,так и не понятно в чем трудности, конфигуратор должен прочитать группой четыре регистра, единчтвенно если это аварийный случай, то надо делать не циклический опрос а по команде
Как организовать запрос по команде?
Ну допустим выставил в настройках universal modbus dev запрос по команде.
Теперь надо в QB писать FF каждые 300 мс например?
пишу 16#FF MOVE QB такой-то
Как сделать так, чтобы блок MOVE пересылку делал каждые 300 мс?
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot