Одновременно, в ПР есть выбор читать 2 регистра, целое или Float. 4 регистра читать нельзя.
А вот можно ли прочитать 4 регистра, по 2 шт. за 2 раза, никто так и не написал, потому что в РЭ написано читать 4 регистра разом.
Вид для печати
В РЭ возможно имелось ввиду для достоверности данных, так как меняются. Если там Modbus такой, что не позволяет прочитать эти 4 регистра за два запроса, то это уже претензии к реализации Modbus конкретного прибора.
Считать со счетчика, отобразить на экране контроллера. Возможно сделать какие то расчеты, пока до конца не решил.
вот про это лучше забудьте. Там такая каша получится, вычислять все пополам, потом творчески отображать :)Цитата:
Возможно сделать какие то расчеты
Друзья, из всего того, что вы тут обсуждали я понял практически ничего.
Но хотелось бы закончить вопрос практического применения полученных знаний. Касательно этого прибора я для себя понял следущюее.
1. С переменными в формате u64 я прощаюсь. Получать, выводить и анализировать данные по накопленной энергии не получится ну и ладно.
2. Большинство переменных находятся в формате u16 или u32 big endian для считывания которых в настройках контроллера Мстера установил две галки "старшим байтом вперед" (она стояла по умолчанию) "старшим регистром вперед" ее я поставил для корректного считывания big endian. Все значения читаются корректно.
Но вот с некоторыми переменными возникли сложности. в частности с теми которые в формате s32 little endian. Они, при таких настройках читаются не корректно.
Можете ли вы подсказать, как их правильно считать, преобразовать и использовать. Может макрос уже какой есть.
Заранее спасибо.
Небольшое уточнение. Я задал вопрос производителям счетчиков, они сначала предложили читать регистры отдельно по одному, но потом сами же предложили этого не делать, опасаясь за то, что в период считывания регистры могут поменяться и значения будут не корректные.
Потом они предложили сделать следующее:
" Я бы предложила немного иначе. Чтобы не возникало вышеописанной проблемы при считывании двух регистров разными запросами.
Я бы считала число из двух регистров, а потом математически поменяла их местами."
Но моих знаний в этой области не достаточно для совершения подобных манипуляций.
32 битное целочисленное занимает 2 регистра, ПР позволяет их читать вместе за один раз.
Если я правильно перевёл, u32 big endian - обратный порядок байт
s32 little endian - прямой порядок байт, для этого как раз и нужны галки старшим байтом и старшим регистром вперёд, перестановка регистров и байт.
Так же регистры и байты можно переставить в программе. Но для начала надо проверить правильность предположений.
Если имеются ввиду 32 битные знаковые целочисленные, то ответ тут
Функции FLOAT_TO_DINT и DINT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php...821#post429821
Пробуйте читать так и так и смотрите результат. Скрины выложите тут.
ПР не понимает напрямую отрицательные числа s32. Если оно будет приходить с минусом, то вы по умолчанию будете получать непонятное значение.
Вроде были макросы, которые позволяли работать со знаковыми числами, но при переводе через float возможно будут возникать ошибки.
Я возможно делаю, что-то неправильно:
Можно ли считать, что если ValH(старшие 32 бита) и ValL(младшие 32 бита) считанные 2 раза подряд и давшие один и тот же результат,Код:Sign := s32.31; // Sign = false - число положительное, Sign = true - число отрицательное
if Sign then
u32 := 0 - s32; // Модуль числа s32, т.е. без знака
else
u32 := s32;
end_if
дали результат верный shl(ValH, 32) + ValL?