InTouch, Kepserver, hex и костыли

Связь между InTouch и программируемыми логическими контроллерами, компьютерами
и другими устройствами.

InTouch, Kepserver, hex и костыли

Сообщение b4900113 » Ср янв 25, 2012 6:46 pm

Здравствуйте, так получилось что некоторые данные хранятся на приборе в hex, kepserver же интерпретирует их как word - в десятичном виде. Так же известно, что по одному адрессу лежат разные данные, т.е. в старшем байте год, в младшем часы. Собственно задача считать, разделить, показать в понятном виде. Пробовал в InTouch
Код: Выделить всё
currentyear_inv = StringFromIntg(currenthour, 16);
currentyear_inv = StringMid(currentyear_inv,1,2);
считали в хекс, убрали лишнее, а как обратно в десятичное представление перевести не сооброжу. Спасибро.
b4900113
 
Сообщения: 15
Зарегистрирован: Ср янв 25, 2012 6:33 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Генератор зла » Ср янв 25, 2012 7:12 pm

Вычленить младший байт:
Tag1=Tag&255; (255 dec = 0000000011111111 bin)

Вычленить старший байт:
Tag1=Tag&65280; (65280 dec = 1111111100000000 bin)
Vita est dolor.
Генератор зла
 
Сообщения: 2860
Зарегистрирован: Вс янв 23, 2011 5:08 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Генератор зла » Чт янв 26, 2012 10:46 am

Поспешишь - людей насмешишь :)
Итак.

Вычленить младший байт:
Tag1=Tag&255; (255 dec = 0000000011111111 bin)
Альтернативный способ:
Tag1=Tag SHL 8;
Tag1=Tag1 SHR 8;

Вычленить старший байт:
Tag1=Tag1 SHR 8;
Vita est dolor.
Генератор зла
 
Сообщения: 2860
Зарегистрирован: Вс янв 23, 2011 5:08 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение b4900113 » Чт янв 26, 2012 11:16 am

Идея замечательная, но не совсем подходящая. Данные изначально приходят в десятичном виде, и вычленением байтов ничего не добиться. Если не прав поправьте. Необходимо из десятичного в hex, отбросить лишнее и обратно в десятичное, как реализовать не представляю пока.
b4900113
 
Сообщения: 15
Зарегистрирован: Ср янв 25, 2012 6:33 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Генератор зла » Чт янв 26, 2012 11:21 am

У вычислительных устройств нет понятия (разницы между понятиями) Hex, Bin, Oct, Dec. Всё это одно и то же, только вид с боку. Типы данных: Boolean, Int, DInt, Float, Char, String,...... - вот это разные разницы.
b4900113 писал(а):Необходимо из десятичного в hex, отбросить лишнее и обратно в десятичное

Аналогия: из рубли в копейки, отбросить сотни и обратно в рубли. А можно и попроще ;)
Vita est dolor.
Генератор зла
 
Сообщения: 2860
Зарегистрирован: Вс янв 23, 2011 5:08 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение b4900113 » Чт янв 26, 2012 12:33 pm

Благодарю, все получилось :)
Только
Вычленить младший байт:
Tag1=Tag&255; (255 dec = 0000000011111111 bin)
Альтернативный способ:
Tag1=Tag SHL 8;

альтернативный способ почему то слева добавляет нули, можете сказать почему? Сдвиг влево так реализован?
b4900113
 
Сообщения: 15
Зарегистрирован: Ср янв 25, 2012 6:33 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Генератор зла » Чт янв 26, 2012 10:33 pm

Альтернативный способ:
Tag1=Tag SHL 8; (добавляет нули справа, слева остаётся младший байт, т.е. затираем старший)
Tag1=Tag1 SHR 8; (сдвиг обратно, в результате остаётся младший байт из слова, т.е. 00000000младший байт)
Всё правильно.
Vita est dolor.
Генератор зла
 
Сообщения: 2860
Зарегистрирован: Вс янв 23, 2011 5:08 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Konstantin88 » Чт окт 16, 2014 12:44 am

Коллеги. У меня вот ничего не получилось по данному методу.
Из устройства (БМРЗ Механотроники) получаем данные времени. Начальные условия таковы.
Начальные условия -
DD - Старший байт - Час;
HH - Младший байт - День;
Когда час и день имеют вид двухзначных чисел, то проблем нет.
Пример 15 число, 20часов = 2015;
Проблема с выводом состоит в следующем.
Если использовать скрипт:
DD = StringRight(StringFromIntg(Test_time_BMRZ.Test_time,10),2);
HH = StringLeft(StringFromIntg(Test_time_BMRZ.Test_time,10),2);
DateTime = HH + "." + DD;
Иногда может возникать, когда Час или День будет одним числом. И тут, используя вышеуказанный метод не распознать, что именно однозначное день или час?!
Проблема в том, что данные в DEC приходят. Пытаюсь разложить по байтам, не получается. Берём простой пример - 20 число 20 часов = 2020;
Раскладываем в bin, получаем 0000 0111 1110 0100. НО
0000 0111 при обратном переходе - это 7, а
1110 0100 при обратном переходе - это 228, но никак не 20 и 20.
Подскажите пожалуйста, что я делаю не так?!
Konstantin88
 
Сообщения: 38
Зарегистрирован: Чт май 16, 2013 12:36 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Генератор зла » Чт окт 16, 2014 2:37 am

Konstantin88 писал(а):Подскажите пожалуйста, что я делаю не так?!

Дополняйте вычисления условиями
IF Test_time_BMRZ.Test_time < 1000 {либо день, либо час однозначные}
IF Test_time_BMRZ.Test_time < 100 {и день, и час однозначные}
Но!!!
Как Вы будете интерпретировать число 111 :?: :twisted:
Vita est dolor.
Генератор зла
 
Сообщения: 2860
Зарегистрирован: Вс янв 23, 2011 5:08 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Konstantin88 » Чт окт 16, 2014 10:47 am

Вот видите. Все не так просто. Хотя идея с if<100 - отличная, а вот с if<1000 не подходит, т.к. никак не понять день или час в данный момент однозначные.
Konstantin88
 
Сообщения: 38
Зарегистрирован: Чт май 16, 2013 12:36 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Генератор зла » Чт окт 16, 2014 12:00 pm

Konstantin88 писал(а):Вот видите. Все не так просто.

Тяжело в лечении, легко в гробу.
Konstantin88 писал(а):а вот с if<1000 не подходит, т.к. никак не понять день или час в данный момент однозначные.

Просто надо включать моск и добавлять условия. Ведь при 9XX, 8XX, 7XX, 6XX, 5XX, 4XX, 3XX вопросов вообще не возникает, правда? Но что-то мне не очень охота включать моск :(
Но, в общем случае, всегда может прийти число, которое нельзя будет правильно интерпретировать.
Вывод: необходимо менять начальные условия. Передавать день/час разными переменными, читать другие переменные (кол-во тиков/миллисекунд),...
Vita est dolor.
Генератор зла
 
Сообщения: 2860
Зарегистрирован: Вс янв 23, 2011 5:08 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Konstantin88 » Чт окт 16, 2014 12:29 pm

С данного устройства, к сожалению, время можно считать только таким способом.
Вложения
Снимок.JPG
(62.73 КБ) Скачиваний: 0
Konstantin88
 
Сообщения: 38
Зарегистрирован: Чт май 16, 2013 12:36 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Генератор зла » Чт окт 16, 2014 1:41 pm

Меня терзают смутные сомнения, что Вы усиленно вводите меня в заблуждение. Но у Вас ничего не получится, т.к. я заблудился и погряз в ереси лет 10 назад. И переходить на Светлую сторону Силы не собираюсь.
В рисунке чёрным по-русски написано High/Low Байт. Это значит, что с адреса 30022 Вы должны получить Word, т.е. 16 бит.
А уж из него (Word-а) с помощью SHL, SHR, &, | можно сделать многое.
Vita est dolor.
Генератор зла
 
Сообщения: 2860
Зарегистрирован: Вс янв 23, 2011 5:08 pm

Re: InTouch, Kepserver, hex и костыли

Сообщение Starley » Чт окт 16, 2014 7:11 pm

Для SysPlatform использую след. скрипт для выделения младшей и старшей части слова:

me.Hour = me.Tag SHL 16 SHR 24; 'выделение старшего байта из слова
me.Day = me.Tag SHL 24 SHR 24; 'выделение младшего байта из слова
Starley
 
Сообщения: 40
Зарегистрирован: Вт май 20, 2014 10:17 pm
Откуда: Самара


Вернуться в Связь InTouch с ПЛК

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13