Доброго времени суток! Столкнулся с проблемой. Помогите пожалуйста разобраться. Имеется газовый корректор ЕК270 и Trace Mode 6.08 Нашел много документации на этот корректор (пруфы): Раз Два Три
Но из всего этого я так и не понял как осуществить считывание показаний. Их всего-то нужно 2, текущий расход газа и суммарный расход. Для считывания этих параметров же нужно знать modbus адрес, а как этот адрес получить тоже мне не совсем понятно.
Вроде нашел такую информацию. В руководстве, для того чтобы считать "Остаточный срок службы элементов питания", приведено следующее:
TX: 01 03 00 01 00 01 D5 CA RX: 01 03 02 B0 20 CC 5C
Смущает меня наличие второй пары 00 01 в запросе...
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Ваша ошибка состоит в неправильном задании адреса переменной. В приведенной Вами документации указано: "Сообщение запроса специфицирует начальный регистр и количество регистров для чтения. Регистры адресуются начина с 0: регистры 1-16 адресуются как 0-15." В приведенном примере параметр запрашивается по 0-му адресу, а в Вашем варианте - по 1-му. Задайте в "Источнике" настройку "Канал"=0.
2. В качестве "текущего расхода", видимо, Вам нужно выбрать "Рабочий расход" или "Стандартный расход". Для считывания надо использовать функции Rout_Float(3) (или Rin_Float(4) - в документации нет точных указаний) и каналы FLOAT. При чтении, возможно, надо будет использовать для настройки файл modbus.set (см. Справочную систему Trace Mode 6).
3. В качестве "суммарного расхода", видимо, Вам нужно выбрать "Рабочий объем" или "Стандартный объем". Считывать с помощью функции Rout_Word(3) (или Rin_Word(4)) придется раздельно десятичную часть (1 регистр) и целую часть (2 регистра). Для чтения десятичной части Вам потребуется 1 HEX16-канал. Чтение целой части лучше организовать в 2 UINT-аргумента канала CALL.ChGroupReq, привязанного к соответствующему Modbus-источнику (см. описание канала CALL.ChGroupReq). Затем в соответствии с предлагаемым в документации на прибор алгоритмом программно преобразовывать считанные данные в результирующую величину.
Posted by shagrat (Участник № / Member № 5888) on :
Вроде бы что-то начинает получаться.
1. Точно, не заметил Спасибо
2. Следующий вопрос. Я запрашиваю данные:
code:
[19:04:05.503] INIT: Read Holding Registers (code $03) [ID: 3] [19:04:05.515] TX: 01 03 01 50 00 02 C5 E6 [19:04:05.824] RX: 01 03 04 3F 7B AD 19 3B 64 [19:04:05.835] DONE: Read Holding Registers (code $03) [ID: 3] [19:04:05.845] SUCCESS: Normal response [19:04:05.856] 2 holding registers were processed. [19:04:05.867] Value of holding register 336 is 16251 [19:04:05.875] Value of holding register 337 is 44313
Нужное мне значение, это 3F 7B AD 19, имеется формула для пересчета: http://cs403220.userapi.com/v403220860/4313/KfNotb-HYc0.jpg Как мне из полученного числа получить знак, экспоненту и мантиссу для этой формулы? Или если использовать float система сама всё преобразует? PS Вопрос снят, использование Rout_Float(3) решает эту проблему
3. Сделал, значения приходят. Программно получилось отобразить необходимое число. Но! Число в счетчике занимает 2 регистра. Считываем целую часть:
code:
[12:09:50.669] INIT: Read Holding Registers (code $03) [ID: 10] [12:09:50.678] TX: 01 03 01 F7 00 02 74 05 [12:09:50.730] RX: 01 03 04 00 00 00 01 3B F3 [12:09:50.736] DONE: Read Holding Registers (code $03) [ID: 10] [12:09:50.746] SUCCESS: Normal response [12:09:50.757] 2 holding registers were processed. [12:09:50.768] Value of holding register 503 is 0 [12:09:50.779] Value of holding register 504 is 1
Соответственно в канале CALL.ChGroupReq это ARG_000 и ARG_001. ARG_000 это "RX: 01 03 04 00 00 00 01 3B F3" а ARG_001 это "RX: 01 03 04 00 00 00 01 3B F3" Создал программу такого содержания:
Переменная CALL_3_ARG_001 привязана к аргументу ARG_001 канала CALL.ChGroupReq. Но ведь целая часть это два аргумента. Как мне их объединить в одно число?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Если в CALL_3_ARG_001 содержится старший регистр целой част:
END_PROGRAM
Posted by shagrat (Участник № / Member № 5888) on :
Спасибо. Сейчас попробую. Поясните пожалуйста что означают эти арифметические действия? CALL_3_ARG_001*(2**16) + CALL_3_ARG_000
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Если число записывается 2 регистрами, то старший регистр имеет вес младшего разряда 2**16=65536. Поэтому для получения значения 4-байтового целого числа мы старший регистр умножаем на 65536.
Если старшая часть слова передается в регистре CALL_3_ARG_000, то формула должна выглядеть так: ARG_000 = Канал_2_R/10000 + CALL_3_ARG_000*(2**16) + CALL_3_ARG_001;
Posted by shagrat (Участник № / Member № 5888) on :
А, это степень двойки) Я к ^ привык... С этим всё понятно. Спасибо!