Стартовая страница › Форумы › Взаимодействие с устройствами › Modbus › Modbus RTU — BCD Format
Помечено: Modbus
- В этой теме 29 ответов, 3 участника, последнее обновление 9 лет, 3 месяца назад сделано
manjey73.
-
АвторЗаписи
-
13.04.2017 в 08:08 #5240
baurУчастник13.04.2017 в 08:21 #5243
baurУчастникстаршим разрядом вперед
ошибся,
там две галочки старшим байтом вперед и старшим регистром вперед-
Ответ изменён 9 лет, 4 месяца назад пользователем
baur.
13.04.2017 в 08:49 #5245
manjey73Участникдля BCD надо писать формулу, скажите какое значение должно быть ?
А так же значения double, скопированные из базы в Сервере (непосредственно в Web приложении они будут не точными, поэтому необходимо смотреть значение канала через Сервер и просмотр базы) при различных вариантах перестановки байт, чтобы определить точную последовательность.13.04.2017 в 09:11 #5246
baurУчастникесли не указать порядок байт то ничего не получаю
если указать порядок байт = 01234567 то получаю результат 206592 вместо реального 32700 который показывает счетчик13.04.2017 в 09:25 #5247
baurУчастник13.04.2017 в 09:50 #5251
manjey73УчастникПривяжите значение к входному каналу, дайте значению записаться
Посмотрите значение вот здесь — запустите Сервер
На Файлах выберите Минутные срезы, выберите минутный срез m170413.dat и посмотрите точные значения данных из базы при разной перестановке байт.значение должно быть 32700 или оно у вас меняется ?
Потому что судя по этому оно у вас другое
63 03 04 00 03 27 00 52 05
Либо у вас их тут два значения 30400 и 3270013.04.2017 в 09:53 #5254
manjey73Участника, все, разобрался через парсер. 00 03 27 00 это ваше число в ответе…
И все таки, привяжите к каналу и посмотрите точное значение в базе среза, мне будет проще подогнать формулу-
Ответ изменён 9 лет, 4 месяца назад пользователем
manjey73.
13.04.2017 в 10:21 #5256
baurУчастникпока у меня значение не меняется, все время 32 700
m170413.dat показывает то же что в коммуникаторе 206 592

по сути парсер же показывает 32 700, в чем проблема? почему меняется на 206592?
00 03 27 00 = 32700
-
Ответ изменён 9 лет, 4 месяца назад пользователем
baur.
13.04.2017 в 10:45 #5259
manjey73УчастникПотому что Сервер в базу данных всегда пишет double, а байты для double не 32700 а совершенно другое значение…
13.04.2017 в 10:52 #5260
manjey73Участникpublic double BcdToDec(double val)
{
byte[] bcdNumber = BitConverter.GetBytes(val);
double result = 0;
foreach (byte b in bcdNumber)
{
int digit1 = b >> 4;
int digit2 = b & 0x0f;
result = (result * 100) + digit1 * 10 + digit2;
}
return result;
}Добавьте в Администраторы в формулы, название BcdToDec, Описание — Преобразование BCD в десятичное
Во входном канале установите галочку Использовать формулу и прописать BcdToDec(Cnl)
Сама формула не вызывает ошибки сервера, но проверить я не могу нормально…
13.04.2017 в 12:19 #5261
baurУчастникФормула на выходе дает: 380941
13.04.2017 в 12:24 #5263
manjey73УчастникПерестановка байт в запросе меняет ситуацию и как ?
Вы в канале уже смотрите значение ? Если уже в канале, то как писал выше скопируйте сюда значение канала из базы данных Сервером без применения формулы
Я в VS сделал следующее
byte[] teste = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x27, 0x00 }; //Создал массив для double, где последние 4 байта как раз нужные
double tet = BitConverter.ToDouble(teste, 0); // конвертнул в double
byte[] tet1 = BitConverter.GetBytes(tet); // еще раз туда
double tet2 = BitConverter.ToDouble(tet1, 0); // и обратнои вызвал функцию
double dec = BcdToDec(tet2); // на выходе получил 3270013.04.2017 в 12:44 #5267
manjey73УчастникПопробуйте его прочитать как int 4 байта
uint test = 206592 — если это число конвертнуть в double и прогнать через функцию, то я получаю на выходе 380941
тьфу…
13.04.2017 в 12:45 #5268
baurУчастникЗначение канала без формулы

После применения формулы
13.04.2017 в 12:49 #5272
manjey73УчастникПопробуйте просто int считать для начала с формулой.
-
Ответ изменён 9 лет, 4 месяца назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.




