Для записи в контроллер 4-х байтового значения необходима функция 16(10 Hex) Preset Multiple Regs, протокола Modbus RTU. В TM6 для работы с 4-х байтовыми значениями имеется W_Float(16), которая передаёт значение с плавающей точкой типа out,и естественно с использованием этой функции передается совсем другое число. Может кто нибудь сталкивался с подобной проблемой, подскажите пожалуйста как быть.
Posted by Dmitry.niimm (Участник № / Member № 3380) on :
А в чем, собственно, проблема?
По стандарту Modbus отсутствует такое понятие как 4-байтовое целое (впрочем как и вещественное любой длины) - есть только 16-битные регистры и битовые поля. То, что некоторые девайсы получают такие данные - это нестандартизованное расширение стандарта и реализуется как использование двух последовательных 16-битных регистров, причем какой из них используется в качестве старшей половины, а какой - младшей, это уже остается на совести производителей.
Поэтому выход только один: 1) создать источник/приемник Modbus/hex16 out, указывающий на _первый_ из регистров; 2) к источнику привязать канал ChGroupReq с двумя аргументами UINT; 3) в аргументы канала из п.2 вручную (т.е. отдельным каналом call.program) ложить две половинки значения hex32 _в_нужном_порядке_.
Короче говоря, rtfm: "Канал CALL.ChGroupReq... ...Привязка источника MODBUS чтения или записи. Выполняется соответственно групповое чтение или групповая запись (WORD, FLOAT) при обмене с заданным устройством по MODBUS (в том числе по MODBUS TCP/IP). Устройство и начальный адрес задаются в источнике, количество считываемых/устанавливаемых параметров определяется числом аргументов канала."
Posted by drooha (Участник № / Member № 3306) on :
Спасибо, я решил задачу немного подругому
Posted by Сергей_Регион_Автоматика (Участник № / Member № 4003) on :
Простите пожалуйста, а каким образом еще можно решить эту задачу с чтением/передачей 3 или 4 байтового числа?