Нельзя :( ,ни как не получится ,да и зачем ,если она делается в течении часа с нуля.Только тема -области применения ПР;)
Вид для печати
прошу прощения за очередной тупой вопрос, но ответа на форуме найти не смог. Нужно отправить ответ на запрос модбас мастера. Длина данных в ответе 120 байт. Уперся в то, что не могу понять как преобразовать различные типы данных переменных в HEX'ы(и наоборот) для последующей упаковки их в массив ответа.
что-то у меня крыша уже едет. Я перемешал яблоки с картошкой. Нужно же ведь всего лишь перевести из десятичной в шестнадцатиричную)))) А я мозг парю как перевести из float в шестнадцатиричную систему))))) Ну анекдот)) извините за беспокойство
Как стандартными средствами перевести число из одной СС в другую? Неужели нет никакой функции соответствующей? Вручную писать переводы из одной СС в другую вообще не серьезно(((((
1. Что значит "подгонка ПЛК под Модбас устройство-мастер?
2. Что значит "Нужно отправить ответ на запрос модбас мастера. Длина данных в ответе 120 байт. Уперся в то, что не могу понять как преобразовать различные типы данных переменных в HEX'ы(и наоборот) для последующей упаковки их в массив ответа"?
Если Вы пишете свой собственный Модбас-слейв модуль, то преобразовать REAL можно так
В четыре байта
в DINT такКод:(* FLOAT2BYTES *)
(* Converts a REAL Value into the corresponding *)
(* digital representation. [Inverse Operation of *)
(* "BYTES2FLOAT"] *)
FUNCTION float2bytes : ARRAY [0..3] OF BYTE
VAR_INPUT
IN: REAL;
END_VAR
VAR
ptv: POINTER TO ARRAY [0..3] OF BYTE;
END_VAR
ptv:=ADR(IN);
float2bytes:=ptv^;
Это функции из бесплатной библиотеки HBMutilities.lib http://www.users-conference.com/se_d...es/HBMutil.zipКод:(* FLOAT2DINT *)
(* Converts a REAL Value into the corresponding *)
(* digital representation. [Inverse Operation of *)
(* "DINT2FLOAT"] *)
FUNCTION float2dint : DINT
VAR_INPUT
IN: REAL;
END_VAR
VAR
ptv: POINTER TO DINT;
END_VAR
ptv:=ADR(IN);
float2dint:=ptv^;
А если используете конфигуратор, то не понятно над чем Вы бьетесь.:)
Проверить преобразования в различные форматы можно здесь http://www.binaryconvert.com/index.html
да, я пишу свой модбас слейв, потому что в конфигурации ПЛК нет деления на холд и инпут регистры. Плк опрашивается устройством мастером которое групповым запросом опрашивает регистры modbus по 120 байт за раз. Поменять это устройство никак невозможно, поэтому нужно подстроить ответы ПЛК под эти запросы. В вашем варианте получается тип byte. вроде все верно, но все равно не будет в шестнадцатиричной системе, а ведь посылки MB должны быть в шестнадцатиричной или нет?
Стандартная ситуация.
Есть некоторая система. Одно устройство умерло, отремонтировать или заменить на аналогичное или совместимое - не возможно (по любой причине). Программа в ведущем контроллере - не доступна.
Приходится - вот так, лепить эмуляцию.
Но ответа - пересекаются пространства input и holding регистров я так и не услышал. Если не пересекаются (а чаще всего - так) - то и ладно, не все ли равно, какой функцией считывать.
Если все таки собственный модуль Модбас-слейв, то подсчитать CRC можно Функцией CRC_GEN от OSCATA описание http://www.owen.ru/forum/showpost.ph...84&postcount=4
Вы получите массив из четырех байтов. В них будут нолики и единички - двоичная система счисления!
А HEX это тоже самое, только для удобства восприятия человеком.
0000b=0h
0001b=1h
0010b=2h
0011b=3h
............
1110b=Eh
1111b=Fh
и соответственно представление одного и того же числа
десятичное 23=(0001 0111)b=17h
десятичное 203=(1100 1011)b=CBh
Так что Вы точно зациклились на пустом месте:)
Как и с
совершенно на ровном месте:)Цитата:
нет деления на холд и инпут регистры