PDA

Просмотр полной версии : Получение значений от влагомера по TCP



oif
12.02.2021, 13:55
Добрый день.
Помогите пожалуйста разобраться, третий день не могу собрать все в рабочий вариант,уже кучу всего перепробовал. (Готов отблагодарить,наверное это самый правильный путь, так как знаний не хватает, пишите в личку)
Есть СПК и влагомер который по протоколу TCP/IP при подключении к порту 4002 отправляет данные с интервалом 500мс :
[0…3] – значение влажности в формате float ( [0] - младший байт, [3] - старший байт )
[4] – номер текущего рецепта расчета значения влажности от 0 до 20,
[5] – максимально возможное количество рецептов 20.
До чего дошел:
С помощью библиотеки CAA Net Base Services, устанавливаю соединение, значения удается получить.
Но вот как их правильно обработать не знаю:
1)Если получаю значения в переменную типа String(6),потом разбираю ее на массив байт [1..6], то значения [4] и [5] спокойно можно обработать из этого массива, а вот как свернуть первые 4 байта из массива в float не могу понять никак.
Пример
fbTcpRead
(
xEnable := TRUE,
hConnection := fbTcpClient.hConnection,
pData := ADR(VlString),
szSize := SIZEOF(VLString),
);

2) Если делаю передаю указатель на Real, то периодически получаю нужное мне значение в переменной VLREAL, но как получить другие [4..5] не представляю.

fbTcpRead
(
xEnable := TRUE,
hConnection := fbTcpClient.hConnection,
pData := ADR(VLREAL),
szSize := SIZEOF(VLREAL),
);
Понимаю логически,что мне необходимо работать с буфером целиком и часть байт с 0...3 отправлять в переменную REAL,a 4 и 5 байт записывать в целочисленное, но как это сделать не понимаю.
Возможно есть примеры?


Также при необходимости обратно нужно отправлять команды в формате:
[0] = 1 - код команды выбора рецепта
[1]- номер требуемого рецепта (0-20), вот с этим тоже вопрос, в какой тип данных необходимо отправить,я понимаю, что размер команды 2 байта, но в какой тип переменной их нужно записать?

fbTcpWrite
(
xExecute := TRUE,
hConnection := fbTcpClient.hConnection,
pData := ADR(sClientString),
szSize := SIZEOF(sClientString)
);

Евгений Кислов
12.02.2021, 14:27
Добрый день.
1. Для Read - под указатель поместите ARRAY [0..5] OF BYTE, покажите, какие значения будут записаны в массив и каким реальным данным они соответствуют.
2. Для Write - тип переменной зависит от типа, который нужен прибору - возможно, это просто ARRAY [0..1] OF BYTE - должно быть указано в документации на протокол прибора.

oif
12.02.2021, 14:46
1)VLString[0];=128
VLString[1];=50
VLString[2];=71
VLString[3];=64
VLString[4];=15
VLString[5];=20
С 0...3 это реально приблизительно float= 3.1
4= реально 16 рецепт(Все нормально,так как отсчет с 0)
5= реально 20 (тоже все отлично)
2)Указан протокол TCP/IP по IEEE 802.3

oif
12.02.2021, 14:46
не пробовали подключить оскат библиотеку и поиграться функциями DWORD_OF_BYTE а затем DW_TO_REAL ?

Сейчас попробую,нашел ее описание. Спасибо большое!

oif
12.02.2021, 15:28
Сейчас попробую,нашел ее описание. Спасибо большое!

Все супер. Этот вопрос снялся. Все данные получены. Все удалось преобразовать с помощью oscat.

oif
12.02.2021, 15:46
Добрый день.
1. Для Read - под указатель поместите ARRAY [0..5] OF BYTE, покажите, какие значения будут записаны в массив и каким реальным данным они соответствуют.
2. Для Write - тип переменной зависит от типа, который нужен прибору - возможно, это просто ARRAY [0..1] OF BYTE - должно быть указано в документации на протокол прибора.

По второму вопросу вы правы,так и есть.
Спасибо огромное!!!!