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)
);
Помогите пожалуйста разобраться, третий день не могу собрать все в рабочий вариант,уже кучу всего перепробовал. (Готов отблагодарить,наверное это самый правильный путь, так как знаний не хватает, пишите в личку)
Есть СПК и влагомер который по протоколу 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)
);