Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › как правильно достать текст
Помечено: #DecodeAscii, #ToAscii
- В этой теме 32 ответа, 3 участника, последнее обновление 5 месяцев, 1 неделя назад сделано
petuhovdmitry.
-
АвторСообщения
-
24.05.2025 в 20:54 #38478
manjey73Участник// Converts the specified value to an ASCII string up to 8 characters long.
// Преобразует заданное значение в строку ASCII длиной до 8 символов.
public string ToAscii(double val)
{
long ll = Convert.ToInt64(val);
byte[] buf = BitConverter.GetBytes(ll);
return Encoding.ASCII.GetString(buf).TrimEnd((char)0);
}немного другая формула для этого — ToAscii при необходимости переставьте байты драйвером
24.05.2025 в 20:58 #38480
manjey73УчастникПросто у вас НЕТ шестнадцатеричной строки, вот в чем фокус. Обычное число по байтам выглядит иначе, чем такое же целое число в формате double.
А ядро Scada конвертирует все числа в формат double, тем самым изменяя байты внутри.
По этому сперва надо преобразовать обратно в обычное число, чтобы байты «вернулись» к тому же виду, как в регистре, и только потом делать декодирование в Ascii24.05.2025 в 21:00 #38481petuhovdmitry
Участник>> немного другая формула для этого — ToAscii
а что передать в нее? ToAscii(Cnl) роняет скаду24.05.2025 в 21:07 #38482petuhovdmitry
Участникили нужно сначала закинуть это в кастомный скрипт?
24.05.2025 в 21:09 #38483
manjey73УчастникКонечно в скрипт. Формула отличается от DecodeAscii в разделе String тем, что сперва преобразует значение в Int64 а уже потом в строку.
24.05.2025 в 21:16 #38484petuhovdmitry
Участникhttps://ncloud.interra.company/s/3o28CM2TzqLwBte
Отлично, то что нужно, спасибо!
Уверен, что этот опыт будет и другим полезен.25.05.2025 в 09:08 #38507
manjey73Участникulong ll = Convert.ToUInt64(val);возможно правильнее будет к ulong приводить.25.05.2025 в 09:38 #38509petuhovdmitry
Участниквозможно правильнее будет к ulong приводить.
Предлагаете поправить в скрипте?
25.05.2025 в 10:39 #38510
manjey73УчастникДа по идее разницы не будет, даже если там отрицательное число окажется, байт будет тем же самым.
26.05.2025 в 14:48 #38549
MikhailМодераторВ таблице Скрипты найдите код формул EncodeAscii и DecodeAscii, чтобы было понятнее.
Сделайте вывод исходных каналов в табличное представление в 16-ричном виде.26.05.2025 в 14:49 #38550
MikhailМодераторРекомендую каналы входного типа оставить как есть, без формул. Это позволит чётко понимать, что получено от контроллера. Далее в расчётном канале уже применить формулу.
26.05.2025 в 14:52 #38551petuhovdmitry
УчастникРекомендую каналы входного типа оставить как есть, без формул. Это позволит чётко понимать, что получено от контроллера. Далее в расчётном канале уже применить формулу.
Так и поступаю, спасибо!
26.05.2025 в 15:15 #38553
manjey73Участникну в данном случае так и придется поступать, потому что там цифры, там символы ASCII, а еще надо прилепить точки 🙂
26.05.2025 в 16:51 #38554petuhovdmitry
Участникну, ToAscii(Cnl) во входном канеле оставлять жеж?
26.05.2025 в 17:03 #38555
manjey73УчастникНЕТ. Вам нужно полностью сделать другой скрипт.
У вас получается 4 канала
1.0.114.NSсделать скрипт, например с указанием первого канала, типа
public string GetVersion(int firstNum)
{
Тут обработка, начиная с первого номера канала
int x = (ushort)Val(firstNum);
int y = (ushort)Val(firstNum+1);
——
string ns = а тут обработка как раз, чтобы получить нужную строку из firstNum+3
Склеиваете вашу строку…
return Ваша строка;
}В общем что-то типа того.
То есть каналы принимаете как есть, и пусть они там где-то в БД будут, вы их можете скрыть из таблицы потом вообще.-
Ответ изменён 5 месяцев, 2 недели назад пользователем
manjey73.
-
Ответ изменён 5 месяцев, 2 недели назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.