Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Сцепить каналы в строку
- В этой теме 75 ответов, 6 участников, последнее обновление 4 месяца, 3 недели назад сделано
Mihail.D..
-
АвторСообщения
-
04.06.2025 в 18:04 #38708
MikhailМодераторВ итоге получилось просто 🙂
04.06.2025 в 18:05 #38709
MikhailМодераторВ качестве оптимизации для строк можно поставить флаг в свойствах строкового канала, чтобы он сохранялся только в архив текущих данных. Это имеет смысл, если таких каналов много.
05.06.2025 в 12:07 #38729Mihail.D.
УчастникЗдравствуйте!Я не давно начал изучать скаду. Не как не могу понять как собрать в расчетном канале строку из разных каналов с разделителем . которая будет длиннее 10 символов. Можно ли это собрать в табличном состоянии(и полностью увидеть всю строку) или только в представлении на схеме ?
05.06.2025 в 13:12 #38730
manjey73Участник@mihail-d вам необходимо задать длину данных с учетом
Количество символов / на 8 (для Ascii)
Количество символов / на 4 (для Unicode)
пример для asciiyear 2025 month june— с учетом пробелов 20 символов (20/8=2,5 то есть длина данных будет нужна 3)p.s. Все равно не понимаю
Data(XXX + ArrIdx)когда требуется еще и обработать байты массива, чтобы было читаемо потом.05.06.2025 в 13:55 #3873405.06.2025 в 14:04 #38735
manjey73Участникdouble это в принципе набор байт… Ну таки да, его наверное надо сперва преобразовать в ulong. Посмотрите по примеру
ulong ul = Convert.ToUInt64(Val(ftNum + i)); byte[] buf = BitConverter.GetBytes(ul); str = Encoding.ASCII.GetString(buf).TrimEnd((char)0);то есть надо конвертнуть в ulong, тогда вы получите байты в составе близкие к ASCII
05.06.2025 в 14:05 #38736
manjey73Участникесли проще, то чистый double это набор бит целой части и мантиссы.
В общем цифра 1 в дабл по байтам выглядит далеко не так, как цифра 1 в ulong…
По этому нужна промежуточная конвертация.05.06.2025 в 15:37 #38737Mihail.D.
УчастникСпасибо, попробую что то сваять)
05.06.2025 в 15:44 #38739
MikhailМодераторТабличные представления поддерживают отображения длинных строк.
11.06.2025 в 01:54 #38854Mihail.D.
УчастникСпасибо все помогло !
Возник новый вопрос.public string ConvertVersionStr(int ftNum){
string outStr = «»;// 954 канал типа аски
// не понимаю как получить текущее значение 954 в ascii
if (ftNum == 954){
return Data(954).ToString();
}// первые 4 канала в double конвертируются корректно кодом ниже
double chVal = Val(ftNum);
string currChValString = chVal.ToString();
outStr = currChValString + «.»;return outStr;
}Запускаю через ConvertVersionStr(950+ ArrIdx) с длинной 5. Последний канал типа ascii а первые 4 типа double. Получаю 1.0.5.114.Scada.Da а должно быть 1.0.5.114.NS
11.06.2025 в 12:05 #38873
MikhailМодераторМожет быть
Val(954).ToString()11.06.2025 в 13:09 #38878Mihail.D.
УчастникТогда вместо NS получаю длинное число с плавающей точкой. Что то типа 1.0.5.114.1.543745е
11.06.2025 в 13:19 #38879
manjey73Участникблин, я же выше писал — это из-за конвертирования в double Коммуникатором, там другие байты, не соответствующие ASCII кодам. То есть некое неизвестное число (коммуникатор ни сном ни духом, что это набор ascii символы) конвертируется в double.
Сперва его надо вернуть в uint64 и только потом применять к нему преобразование в ascii
11.06.2025 в 14:45 #38883Mihail.D.
УчастникСпасибо , пойду ковырять дальше )
12.06.2025 в 11:11 #38884
MikhailМодераторЧтобы получить более точные ответы на вопросы по строкам, пишите значения каналов в 16-ричном виде и строку, которую хотелось бы из них получить.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.